| #!/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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| # |
| |
| use strict; |
| |
| 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, |
| "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, |
| "winetest" => 1, |
| ); |
| |
| sub update_file($) |
| { |
| my $file = shift; |
| if (!system "cmp $file $file.new >/dev/null") |
| { |
| unlink "$file.new"; |
| print "$file is unchanged\n"; |
| } |
| else |
| { |
| rename "$file.new", "$file"; |
| print "$file updated\n"; |
| } |
| } |
| |
| # if we are inside the programs dir, go up one level |
| if (! -f "configure.ac" && -f "../configure.ac") { chdir(".."); } |
| |
| my @args = @ARGV; |
| if (!@args) { @args = map { s/^(.*)\.in/$1/; $_; } split(/\s/,`find programs -name Makefile.in -print`); } |
| |
| foreach my $i (@args) |
| { |
| my $module; |
| |
| open MAKE, "$i.in" or die "cannot open $i.in\n"; |
| |
| $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/^programs\/(.*)\/[^\/]+$/$1/; |
| die "invalid module $module in dir $directories{$module}\n" if "$directories{$module}.exe" ne $module; |
| 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,">programs/Makefile.in.new" or die "cannot create programs/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}; |
| } |
| |
| ################################################################ |
| # output the build and install targets |
| |
| print NEWMAKE <<EOF; |
| |
| |
| INSTALLDIRS = \$(DESTDIR)\$(bindir) |
| |
| \@MAKE_RULES\@ |
| |
| all: wineapploader winelauncher \$(SUBDIRS) |
| |
| 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 \$(INSTALLDIRS) dummy |
| \$(INSTALL_SCRIPT) wineapploader \$(DESTDIR)\$(bindir)/wineapploader |
| |
| \$(INSTALLPROGS:%=%/__installprog__): install-apploader |
| \$(RM) \$(DESTDIR)\$(bindir)/`dirname \$\@` && \$(LN) \$(DESTDIR)\$(bindir)/wineapploader \$(DESTDIR)\$(bindir)/`dirname \$\@` |
| |
| install-progs.so: \$(INSTALLPROGS:%=%/__installprog__) |
| \$(RM) \$(DESTDIR)\$(bindir)/wineapploader |
| |
| install-progs: # nothing to do here |
| |
| install:: winelauncher install-progs\$(DLLEXT) \$(INSTALLDIRS) |
| \$(INSTALL_SCRIPT) winelauncher \$(DESTDIR)\$(bindir)/winelauncher |
| |
| uninstall:: |
| -cd \$(DESTDIR)\$(bindir) && \$(RM) wineapploader winelauncher \$(INSTALLPROGS) |
| -rmdir \$(DESTDIR)\$(dlldir) |
| |
| clean:: |
| \$(RM) wineapploader winelauncher |
| |
| # Rules for testing |
| |
| check test:: \$(SUBDIRS:%=%/__test__) |
| EOF |
| |
| close NEWMAKE; |
| update_file("programs/Makefile.in"); |
| |
| ################################################################ |
| # .gitignore file |
| |
| open GITIGNORE, ">programs/.gitignore.new" or die "cannot create programs/.gitignore.new"; |
| print GITIGNORE "# Automatically generated by make_dlls; DO NOT EDIT!!\n"; |
| |
| my @ignores = |
| ( |
| "/Makeprog.rules", |
| "/wineapploader", |
| "/winelauncher", |
| ); |
| |
| foreach my $dir (sort keys %alldirs) |
| { |
| push @ignores, "$dir/$dir"; |
| } |
| |
| print GITIGNORE join("\n", sort @ignores) . "\n"; |
| |
| close GITIGNORE; |
| update_file("programs/.gitignore"); |