Improved make_dlls script. Moved dll list out of
Make.rules.in. Removed a few no longer used rules.

diff --git a/dlls/make_dlls b/dlls/make_dlls
index 05dd5a2..5db5b3e 100755
--- a/dlls/make_dlls
+++ b/dlls/make_dlls
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/usr/bin/perl -w
 #
 # Update the dll dependencies in the dlls main Makefile.in.
 # Must be run in the dlls/ directory of the Wine tree.
@@ -12,6 +12,15 @@
 %directories = ();
 %altnames = ();
 
+# list of special dlls that can be switched on or off by configure
+%special_dlls =
+(
+  "ddraw"    => "XFILES",
+  "glu32"    => "GLU32FILES",
+  "opengl32" => "OPENGLFILES",
+  "x11drv"   => "XFILES"
+);
+
 foreach $i (split(/\s/,$makefiles))
 {
     open MAKE,$i;
@@ -55,91 +64,153 @@
     }
 }
 
-open OLDMAKE,"Makefile.in" or die "cannot open Makefile.in";
 open NEWMAKE,">Makefile.in.new" or die "cannot create Makefile.in.new";
 
-while (<OLDMAKE>)
-{
-    last if (/^EXTRADLLNAMES/);
-    print NEWMAKE $_;
-}
-close OLDMAKE;
+################################################################
+# makefile header
 
-printf NEWMAKE "EXTRADLLNAMES =";
-foreach $extra (values %altnames) { push @extra, @$extra; }
-foreach $extra (sort @extra)
-{
-    printf NEWMAKE " \\\n\t%s", $extra;
-}
+print NEWMAKE <<EOF;
+# Automatically generated by make_dlls; DO NOT EDIT!!
 
-printf NEWMAKE "\n\nSUBDIRS =";
+TOPSRCDIR = \@top_srcdir\@
+TOPOBJDIR = ..
+SRCDIR    = \@srcdir\@
+VPATH     = \@srcdir\@
+LIBEXT    = \@LIBEXT\@
+
+EOF
+
+################################################################
+# output special dlls configure definitions
+
+printf NEWMAKE "# special configure-dependent targets\n\n";
+my %specials = ();
+foreach $mod (sort keys %special_dlls)
+{
+    $specials{$special_dlls{$mod}} .= " " . $mod;
+}
+foreach $i (sort keys %specials)
+{
+    printf NEWMAKE "%s =%s\n", $i, $specials{$i};
+}
+printf NEWMAKE "EXTRADIRS =";
+foreach $i (sort keys %specials) { printf NEWMAKE " \@%s\@", $i; }
+printf NEWMAKE "\n\n";
+
+
+################################################################
+# output the subdirs list
+
+print NEWMAKE <<EOF;
+# Subdir list
+
+SUBDIRS = \\
+EOF
+printf NEWMAKE "\t\$(EXTRADIRS)";
 foreach $dir (sort values %directories)
 {
+    next if defined($special_dlls{$dir});  # skip special dlls
     printf NEWMAKE " \\\n\t%s", $dir;
 }
 printf NEWMAKE "\n";
 
+
+################################################################
+# output the all: target
+
+my %targets = ();  # use a hash to get rid of duplicate target names
+foreach $mod (sort keys %directories)
+{
+    next if defined($special_dlls{$mod});  # skip special dlls
+    $targets{sprintf("lib%s.\$(LIBEXT)",$mod)} = 1;
+    next unless defined $altnames{$mod};
+    foreach $i (sort @{$altnames{$mod}})
+    {
+        $targets{sprintf("lib%s.\$(LIBEXT)",$i)} = 1;
+    }
+}
+print NEWMAKE <<EOF;
+
+# Main target
+
+all: \\
+	\$(EXTRADIRS:%=lib%.\$(LIBEXT)) \\
+EOF
+printf NEWMAKE "\t%s\n", join( " \\\n\t", sort keys %targets );
+
+
+################################################################
+# output the lib name -> directory rules
+
 print NEWMAKE <<EOF;
 
 \@MAKE_RULES\@
 
-all: \$(DLLS:%=lib%.\@LIBEXT\@) \$(EXTRADLLNAMES:%=lib%.\@LIBEXT\@)
-
 # Map library name to directory
 
 EOF
 
 foreach $mod (sort keys %directories)
 {
-    my $count = 0;
-    printf NEWMAKE "lib%s.\@LIBEXT\@", $mod;
-    foreach $i (sort @{$altnames{$mod}})
+    printf NEWMAKE "lib%s.\$(LIBEXT)", $mod;
+    if (defined $altnames{$mod})
     {
-        if ($count++ >= 3)
+        my $count = 1;
+        foreach $i (sort @{$altnames{$mod}})
         {
-            $count = 0;
-            printf NEWMAKE " \\\n ";
+            if (!($count++ % 3)) { printf NEWMAKE " \\\n "; }
+            printf NEWMAKE " lib%s.\$(LIBEXT)", $i;
         }
-        printf NEWMAKE " lib%s.\@LIBEXT\@", $i;
     }
-    printf NEWMAKE ": %s/lib%s.\@LIBEXT\@\n", $directories{$mod}, $mod;
-    printf NEWMAKE "\t\$(RM) \$@ && \$(LN_S) %s/lib%s.\@LIBEXT\@ \$@\n\n", $directories{$mod}, $mod;
+    printf NEWMAKE ": %s/lib%s.\$(LIBEXT)\n", $directories{$mod}, $mod;
+    printf NEWMAKE "\t\$(RM) \$@ && \$(LN_S) %s/lib%s.\$(LIBEXT) \$@\n\n", $directories{$mod}, $mod;
 }
 
-print NEWMAKE "# Inter-dll dependencies (only necessary for dynamic libs)\n\n";
+
+################################################################
+# output the inter-dll dependencies and rules
+
+print NEWMAKE "# Inter-dll dependencies\n\n";
 
 my @depends = ();
 foreach $mod (sort keys %imports)
 {
-    next unless $#{$imports{$mod}} >= 0;
-    my $dep = sprintf("%s/lib%s.\@LIBEXT\@:", $directories{$mod}, $mod);
+    my $count = 1;
+    my $dep = sprintf("%s/lib%s.\$(LIBEXT): dummy", $directories{$mod}, $mod);
     foreach $i (@{$imports{$mod}})
     {
-        $dep .= sprintf(" lib%s.\@LIBEXT\@", $i);
+        if ($count++ >= 3)
+        {
+            $count = 0;
+            $dep .= " \\\n ";
+        }
+        $dep .= sprintf(" lib%s.\$(LIBEXT)", $i);
     }
-    push @depends, $dep . "\n";
+    $dep .= sprintf("\n\t\@cd %s && \$(MAKE) lib%s.\$(LIBEXT)\n\n",$directories{$mod}, $mod);
+    push @depends, $dep;
 }
 print NEWMAKE sort @depends;
 
+
+################################################################
+# makefile trailer
+
 print NEWMAKE <<EOF;
+# Misc rules
 
-\$(DLLFILES): dummy
-	\@cd `dirname \$\@` && \$(MAKE)
-
-\$(DLLFILES:%=%_install_): dummy
-	\@cd `dirname \$\@` && \$(MAKE) install
-
-\$(DLLFILES:%=%_uninstall_): dummy
-	\@cd `dirname \$\@` && \$(MAKE) uninstall
-
-\$(DLLFILES:%=%_checklink_): dummy
+\$(SUBDIRS:%=%/__checklink__): dummy
 	\@cd `dirname \$\@` && \$(MAKE) checklink
 
-install:: \$(DLLFILES:%=%_install_)
+\$(SUBDIRS:%=%/__debug_channels__): dummy
+	\@cd `dirname \$\@` && \$(MAKE) debug_channels
 
-uninstall:: \$(DLLFILES:%=%_uninstall_)
+install:: \$(SUBDIRS:%=%/__install__)
 
-checklink:: \$(DLLFILES:%=%_checklink_)
+uninstall:: \$(SUBDIRS:%=%/__uninstall__)
+
+checklink:: \$(SUBDIRS:%=%/__checklink__)
+
+debug_channels:: \$(SUBDIRS:%=%/__debug_channels__)
 EOF
 
 close NEWMAKE;