Alexandre Julliard : make_makefiles: Automatically update the source lists in the individual makefiles.
Alexandre Julliard
julliard at winehq.org
Fri Jul 3 09:31:11 CDT 2009
Module: wine
Branch: master
Commit: 88b74519ae86081af38a1e2dd5e0b8417e1f5039
URL: http://source.winehq.org/git/wine.git/?a=commit;h=88b74519ae86081af38a1e2dd5e0b8417e1f5039
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Jul 3 13:26:01 2009 +0200
make_makefiles: Automatically update the source lists in the individual makefiles.
---
tools/make_makefiles | 119 ++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 106 insertions(+), 13 deletions(-)
diff --git a/tools/make_makefiles b/tools/make_makefiles
index 91f7d39..99a120c 100755
--- a/tools/make_makefiles
+++ b/tools/make_makefiles
@@ -118,7 +118,21 @@ my %private_idl_headers = (
"wine/winedxgi.idl" => 1,
);
-my (@makefiles, %makefiles);
+my %ignored_source_files = (
+ "dlls/wineps.drv/afm2c.c" => 1,
+ "dlls/wineps.drv/mkagl.c" => 1,
+ "programs/winetest/dist.rc" => 1,
+);
+
+my (@all_files, @makefiles, %makefiles);
+
+sub dirname($)
+{
+ my $ret = shift;
+ return "" unless $ret =~ /\//;
+ $ret =~ s!/[^/]*$!!;
+ return $ret;
+}
# update a file if changed
sub update_file($)
@@ -178,6 +192,49 @@ sub replace_in_file($$$@)
return update_file($file);
}
+# replace a variable in a makefile
+sub replace_makefile_variable($$)
+{
+ my ($file, $var) = @_;
+ my $make = $makefiles{$file};
+
+ return unless defined ${$make}{"=$var"};
+
+ my @values = @{${$make}{"=$var"}};
+ ${$make}{$var} = \@values;
+
+ open NEW_FILE, ">$file.in.new" or die "cannot create $file.in.new";
+
+ open OLD_FILE, "$file.in" or die "cannot open $file.in";
+ while (<OLD_FILE>)
+ {
+ if (/^\s*($var\s+)=/)
+ {
+ # try to preserve formatting
+ my $prefix = $1;
+ my $multiline = /\\$/ || (@values > 1);
+ while (/\\$/)
+ {
+ $_ = <OLD_FILE>;
+ last unless $_;
+ }
+ if ($multiline)
+ {
+ print NEW_FILE "$var = \\\n\t" . join(" \\\n\t", sort @values) . "\n";
+ }
+ else
+ {
+ print NEW_FILE "$prefix= @values\n";
+ }
+ next;
+ }
+ print NEW_FILE $_;
+ }
+ close OLD_FILE;
+ close NEW_FILE;
+ return update_file("$file.in");
+}
+
# parse the specified makefile to identify the rules file
sub parse_makefile($)
{
@@ -191,7 +248,9 @@ sub parse_makefile($)
while (<MAKE>)
{
chomp;
+ next if (/^\s*#/);
while (/\\$/) { chop; $_ .= <MAKE>; chomp; } # merge continued lines
+ next if (/^\s*$/);
if (/^\@(MAKE.*RULES)\@/)
{
@@ -199,12 +258,12 @@ sub parse_makefile($)
$make{"=rules"} = $makerules{$var};
next;
}
- if (/^(MODULE|IMPORTLIB|TESTDLL)\s*=\s*(.*)/)
+ if (/^\s*(MODULE|IMPORTLIB|TESTDLL)\s*=\s*(.*)/)
{
$make{$1} = $2;
next;
}
- if (/^(BISON_SRCS|LEX_SRCS|IDL_[CHIPS]_SRCS|IDL_TLB_SRCS|IMPLIB_SRCS|MC_SRCS|RC_SRCS|RC_SRCS16|RC_BINARIES|SPEC_SRCS16|EXTRA_OBJS16|MANPAGES|PROGRAMS)\s*=\s*(.*)/)
+ if (/^\s*(BISON_SRCS|LEX_SRCS|IDL_[CHIPS]_SRCS|IDL_TLB_SRCS|IMPLIB_SRCS|C_SRCS|MC_SRCS|RC_SRCS|SVG_SRCS|C_SRCS16|RC_SRCS16|SPEC_SRCS16|EXTRA_OBJS16|MANPAGES|PROGRAMS)\s*=\s*(.*)/)
{
my @list = split(/\s+/, $2);
$make{$1} = \@list;
@@ -214,6 +273,30 @@ sub parse_makefile($)
return %make;
}
+# assign source files to their respective makefile
+sub assign_sources_to_makefiles()
+{
+ foreach my $file (@all_files)
+ {
+ next if defined $ignored_source_files{$file};
+ my $dir = dirname( $file );
+
+ while ($dir && !defined $makefiles{"$dir/Makefile"}) { $dir = dirname( $dir ); }
+ next unless $dir;
+
+ die "no makefile found for $file\n" unless defined $makefiles{"$dir/Makefile"};
+
+ my $make = $makefiles{"$dir/Makefile"};
+ my $basename = substr( $file, length($dir) + 1 );
+
+ if ($basename =~ /\.c$/) { push @{${$make}{"=C_SRCS"}}, $basename; }
+ elsif ($basename =~ /\.l$/) { push @{${$make}{"=LEX_SRCS"}}, $basename; }
+ elsif ($basename =~ /\.y$/) { push @{${$make}{"=BISON_SRCS"}}, $basename; }
+ elsif ($basename =~ /\.rc$/) { push @{${$make}{"=RC_SRCS"}}, $basename; }
+ elsif ($basename =~ /\.rc$/) { push @{${$make}{"=RC_SRCS"}}, $basename; }
+ elsif ($basename =~ /\.svg$/) { push @{${$make}{"=SVG_SRCS"}}, $basename; }
+ }
+}
################################################################
# update the makefile list in configure.ac
@@ -256,6 +339,20 @@ sub update_makefiles(@)
push @lines, "WINE_CONFIG_MAKEFILE([$file],[$rules]$args)\n";
}
+ # update the source variables in all the makefiles
+
+ foreach my $file (sort @_)
+ {
+ my %make = %{$makefiles{$file}};
+
+ replace_makefile_variable( $file, "LEX_SRCS" );
+ replace_makefile_variable( $file, "BISON_SRCS" );
+ replace_makefile_variable( $file, "MC_SRCS" );
+ replace_makefile_variable( $file, "SVG_SRCS" );
+ replace_makefile_variable( $file, "C_SRCS" ) unless defined $make{"C_SRCS16"};
+ replace_makefile_variable( $file, "RC_SRCS" ) unless defined $make{"RC_SRCS16"};
+ }
+
push @lines, "\ndnl Build dependencies for test files compiled into winetest\n";
replace_in_file( "configure.ac", '^WINE_CONFIG_MAKERULES', '^dnl Build dependencies for test files compiled into winetest$', @lines);
}
@@ -491,9 +588,8 @@ sub update_dlls(@)
sub update_includes()
{
- return unless -d ".git";
my (@h_srcs, @private_idl_srcs, @public_idl_srcs, @tlb_srcs, %subdirs);
- my @includes = map { s/^include\///; $_; } split /\0/, `git ls-files -c -z include`;
+ my @includes = map { (my $ret = $_) =~ s/^include\///; $ret; } grep /^include\//, @all_files;
foreach my $incl (@includes)
{
if ($incl =~ /(.*)\//) { $subdirs{$1} = 1; }
@@ -561,14 +657,10 @@ sub update_gitignore(@)
}
-if (-d ".git")
-{
- @makefiles = map { s/\.in$//; $_; } split /\0/, `git ls-files -c -z Makefile.in \\*/Makefile.in`;
-}
-else
-{
- @makefiles = map { s/^\.\/(.*)\.in/$1/; $_; } split(/\s/,`find . -name Makefile.in -print`);
-}
+die "needs to be run from a git checkout" unless -d ".git";
+
+ at all_files = split /\0/, `git ls-files -c -z`;
+ at makefiles = map { my $ret = $_; $ret =~ s/\.in$//; $ret; } grep /Makefile.in$/, @all_files;
foreach my $file (sort values %makerules, @makefiles)
{
@@ -576,6 +668,7 @@ foreach my $file (sort values %makerules, @makefiles)
$makefiles{$file} = \%make;
}
+assign_sources_to_makefiles();
update_makefiles( @makefiles );
push @ignores, update_includes();
push @ignores, update_ignores( @makefiles );
More information about the wine-cvs
mailing list