| #!/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 = | |
| ( | |
| "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"; |