| #!/usr/bin/perl -w | 
 | # | 
 | # Update the dependencies in the programs main Makefile.in. | 
 | # Must be run in the programs/ directory of the Wine tree. | 
 | # | 
 | # Copyright 2003 Alexandre Julliard | 
 | # | 
 | # This library is free software; you can redistribute it and/or | 
 | # modify it under the terms of the GNU Lesser General Public | 
 | # License as published by the Free Software Foundation; either | 
 | # version 2.1 of the License, or (at your option) any later version. | 
 | # | 
 | # This library is distributed in the hope that it will be useful, | 
 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 | # Lesser General Public License for more details. | 
 | # | 
 | # You should have received a copy of the GNU Lesser General Public | 
 | # License along with this library; if not, write to the Free Software | 
 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
 | # | 
 |  | 
 | use strict; | 
 |  | 
 | my $makefiles = `find . -name Makefile.in -print`; | 
 |  | 
 | my %directories = (); | 
 |  | 
 | # Programs that we want to install in the bin directory too | 
 | my %bin_install = | 
 | ( | 
 |   "msiexec" => 1, | 
 |   "notepad" => 1, | 
 |   "progman" => 1, | 
 |   "regedit" => 1, | 
 |   "regsvr32" => 1, | 
 |   "uninstaller" => 1, | 
 |   "wcmd" => 1, | 
 |   "wineboot" => 1, | 
 |   "winebrowser" => 1, | 
 |   "winecfg" => 1, | 
 |   "wineconsole" => 1, | 
 |   "winedbg" => 1, | 
 |   "winefile" => 1, | 
 |   "winemine" => 1, | 
 |   "winepath" => 1, | 
 |   "winhelp" => 1, | 
 | ); | 
 |  | 
 | # Programs that we don't want to install at all | 
 | my %dont_install = | 
 | ( | 
 |   "cmdlgtst" => 1, | 
 |   "view" => 1, | 
 | ); | 
 |  | 
 | foreach my $i (split(/\s/,$makefiles)) | 
 | { | 
 |     my $module; | 
 |  | 
 |     next if $i =~ /\/tests\/Makefile.in/; | 
 |  | 
 |     open MAKE,$i; | 
 |  | 
 |     $module = undef; | 
 |     while (<MAKE>) | 
 |     { | 
 |         chop; | 
 |         # hack to disable this program... the MKPROG_SKIP comment must appear | 
 |         # at the very top of the Makefile.in | 
 |         last if (/^\#\s*MKPROG_SKIP/); | 
 |  | 
 |         if (/^MODULE\s*=\s*([a-zA-Z0-9_.]+)/) | 
 |         { | 
 |             $module = $1; | 
 |             next if ($module eq "none"); | 
 |             ($directories{$module} = $i) =~ s/^\.\/(.*)\/[^\/]+$/$1/; | 
 |             last; | 
 |         } | 
 |         if (/^PROGRAMS\s*=((\s*[a-zA-Z0-9_.]+)+)/) | 
 |         { | 
 |             my @programs = split / /, $1; | 
 |             foreach my $prog (@programs) | 
 |             { | 
 |                 next unless $prog =~ /\.exe$/; | 
 |                 ($directories{$prog} = $i) =~ s/^\.\/(.*)\/[^\/]+$/$1/; | 
 |             } | 
 |             last; | 
 |         } | 
 |     } | 
 |     close MAKE; | 
 | } | 
 |  | 
 | open NEWMAKE,">Makefile.in.new" or die "cannot create Makefile.in.new"; | 
 |  | 
 | ################################################################ | 
 | # makefile header | 
 |  | 
 | print NEWMAKE <<EOF; | 
 | # Automatically generated by make_progs; DO NOT EDIT!! | 
 |  | 
 | TOPSRCDIR = \@top_srcdir\@ | 
 | TOPOBJDIR = .. | 
 | SRCDIR    = \@srcdir\@ | 
 | VPATH     = \@srcdir\@ | 
 |  | 
 | EOF | 
 |  | 
 | ################################################################ | 
 | # output the subdirs list | 
 |  | 
 | # get rid of duplicates | 
 | my %alldirs = (); | 
 | foreach my $dir (sort values %directories) { $alldirs{$dir} = 1; } | 
 |  | 
 | print NEWMAKE "SUBDIRS ="; | 
 | foreach my $dir (sort keys %alldirs) | 
 | { | 
 |     printf NEWMAKE " \\\n\t%s", $dir; | 
 | } | 
 |  | 
 | print NEWMAKE "\n\n# Sub-directories to run make install into\nINSTALLSUBDIRS ="; | 
 | foreach my $dir (sort keys %alldirs) | 
 | { | 
 |     next if $dont_install{$dir}; | 
 |     printf NEWMAKE " \\\n\t%s", $dir; | 
 | } | 
 |  | 
 | print NEWMAKE "\n\n# Programs to install in bin directory\nINSTALLPROGS ="; | 
 | foreach my $dir (sort keys %alldirs) | 
 | { | 
 |     printf NEWMAKE " \\\n\t%s", $dir if $bin_install{$dir}; | 
 | } | 
 |  | 
 | print NEWMAKE "\n\n# Symlinks to apps that we want to run from inside the source tree\nSYMLINKS ="; | 
 | foreach my $mod (sort keys %directories) | 
 | { | 
 |     printf NEWMAKE " \\\n\t%s\$(DLLEXT)", $mod; | 
 | } | 
 |  | 
 | ################################################################ | 
 | # output the build and install targets | 
 |  | 
 | print NEWMAKE <<EOF; | 
 |  | 
 |  | 
 | \@MAKE_RULES\@ | 
 |  | 
 | all: wineapploader winelauncher \$(SUBDIRS) \$(SYMLINKS) | 
 |  | 
 | wineapploader: wineapploader.in | 
 | 	sed -e 's,\@bindir\\\@,\$(bindir),g' \$(SRCDIR)/wineapploader.in >\$\@ || (\$(RM) \$\@ && false) | 
 |  | 
 | winelauncher: winelauncher.in | 
 | 	sed -e 's,\@bindir\\\@,\$(bindir),g' -e 's,\@libdir\\\@,\$(libdir),g' -e 's,\@dlldir\\\@,\$(dlldir),g' \$(SRCDIR)/winelauncher.in >\$\@ || (\$(RM) \$\@ && false) | 
 |  | 
 | # Rules for installation | 
 |  | 
 | .PHONY: install-apploader install-progs install-progs.so \$(INSTALLPROGS:%=%/__installprog__) | 
 |  | 
 | install-apploader: wineapploader dummy | 
 | 	\$(MKINSTALLDIRS) \$(bindir) | 
 | 	\$(INSTALL_SCRIPT) wineapploader \$(bindir)/wineapploader | 
 |  | 
 | \$(INSTALLPROGS:%=%/__installprog__): install-apploader | 
 | 	\$(RM) \$(bindir)/`dirname \$\@` && \$(LN) \$(bindir)/wineapploader \$(bindir)/`dirname \$\@` | 
 |  | 
 | install-progs.so: \$(INSTALLPROGS:%=%/__installprog__) | 
 | 	\$(RM) \$(bindir)/wineapploader | 
 |  | 
 | install-progs: # nothing to do here | 
 |  | 
 | install:: winelauncher install-progs\$(DLLEXT) | 
 | 	\$(MKINSTALLDIRS) \$(bindir) | 
 | 	\$(INSTALL_SCRIPT) winelauncher \$(bindir)/winelauncher | 
 |  | 
 | uninstall:: | 
 | 	-cd \$(bindir) && \$(RM) wineapploader winelauncher \$(INSTALLPROGS) | 
 | 	-rmdir \$(dlldir) | 
 |  | 
 | clean:: | 
 | 	\$(RM) wineapploader winelauncher \$(SYMLINKS) | 
 |  | 
 | # Rules for testing | 
 |  | 
 | check test:: \$(SUBDIRS:%=%/__test__) | 
 |  | 
 | EOF | 
 |  | 
 | ################################################################ | 
 | # output the symlinks rules | 
 |  | 
 | print NEWMAKE "# Rules for symlinks\n\n"; | 
 |  | 
 | foreach my $mod (sort keys %directories) | 
 | { | 
 |     printf NEWMAKE "%s\$(DLLEXT)", $mod; | 
 |     printf NEWMAKE ": %s/%s\$(DLLEXT)\n", $directories{$mod}, $mod; | 
 |     printf NEWMAKE "\t\$(RM) \$@ && \$(LN_S) %s/%s\$(DLLEXT) \$@\n\n", $directories{$mod}, $mod; | 
 | } | 
 |  | 
 | foreach my $mod (sort keys %directories) | 
 | { | 
 |     printf NEWMAKE "%s/%s\$(DLLEXT): %s\n", $directories{$mod}, $mod, $directories{$mod}; | 
 | } | 
 |  | 
 | ################################################################ | 
 | # makefile trailer | 
 |  | 
 | print NEWMAKE "\n### Dependencies:\n"; | 
 |  | 
 | close NEWMAKE; | 
 | rename "Makefile.in.new", "Makefile.in"; | 
 | printf "Successfully updated Makefile.in\n"; |