From 27534a09c65d86bcfa713395e4aa0c16748595f8 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 5 Nov 2013 19:30:20 +0100 Subject: [PATCH] makefiles: Automatically update source variables in the makefile based on the makedep pragmas. --- tools/make_makefiles | 72 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 64 insertions(+), 8 deletions(-) diff --git a/tools/make_makefiles b/tools/make_makefiles index 489f31b05e4..9478c468c56 100755 --- a/tools/make_makefiles +++ b/tools/make_makefiles @@ -245,11 +245,18 @@ sub replace_makefile_variable($$) my ($file, $var) = @_; my $make = $makefiles{$file}; my $replaced = 0; + my @values; - return unless defined ${$make}{"=$var"}; - - my @values = @{${$make}{"=$var"}}; - ${$make}{$var} = \@values; + if (defined ${$make}{"=$var"}) + { + @values = @{${$make}{"=$var"}}; + ${$make}{$var} = \@values; + } + else + { + return unless defined ${$make}{$var}; + undef ${$make}{$var}; + } open NEW_FILE, ">$file.in.new" or die "cannot create $file.in.new"; @@ -266,7 +273,11 @@ sub replace_makefile_variable($$) $_ = ; last unless $_; } - if ($multiline) + if (!@values) + { + # nothing + } + elsif ($multiline) { print NEW_FILE "$var = \\\n\t" . join(" \\\n\t", sort @values) . "\n"; } @@ -277,7 +288,7 @@ sub replace_makefile_variable($$) $replaced = 1; next; } - if (/^\@MAKE/ && !$replaced) + if (/^\@MAKE/ && !$replaced && @values) { print NEW_FILE "$var = \\\n\t" . join(" \\\n\t", sort @values) . "\n"; } @@ -325,7 +336,6 @@ sub parse_makefile($) my @list = split(/\s+/, $2); $make{$var} = \@list; ${$make{"=flags"}}{"mc"} = 1 if $var eq "MC_SRCS"; - ${$make{"=flags"}}{"po"} = 1 if $var eq "PO_SRCS"; ${$make{"=flags"}}{"staticimplib"} = 1 if $var eq "IMPLIB_SRCS"; ${$make{"=flags"}}{"clean"} = 1 if $var =~ /IDL_[CHIPRS]_SRCS|IDL_TLB_SRCS|PROGRAMS/; next; @@ -358,6 +368,26 @@ sub parse_makefile($) return %make; } +# read pragma makedep flags from a source file +sub get_makedep_flags($) +{ + my $file = shift; + my %flags; + + open FILE, $file or die "cannot open $file"; + while () + { + next unless /^#\s*pragma\s+makedep\s+(.*)/; + foreach my $flag (split /\s+/, $1) + { + last if $flag eq "depend"; + $flags{$flag} = 1; + } + } + close FILE; + return %flags; +} + # assign source files to their respective makefile sub assign_sources_to_makefiles(@) { @@ -410,9 +440,29 @@ sub assign_sources_to_makefiles(@) elsif ($name =~ /\.m$/) { push @{${$make}{"=OBJC_SRCS"}}, $name; } elsif ($name =~ /\.l$/) { push @{${$make}{"=LEX_SRCS"}}, $name; } elsif ($name =~ /\.y$/) { push @{${$make}{"=BISON_SRCS"}}, $name; } - elsif ($name =~ /\.rc$/) { push @{${$make}{"=RC_SRCS"}}, $name; } elsif ($name =~ /\.mc$/) { push @{${$make}{"=MC_SRCS"}}, $name; } elsif ($name =~ /\.svg$/) { push @{${$make}{"=SVG_SRCS"}}, $name; } + elsif ($name =~ /\.rc$/) + { + my %flags = get_makedep_flags( $file ); + if (defined $flags{"po"}) + { + push @{${$make}{"=PO_SRCS"}}, $name; + ${${$make}{"=flags"}}{"po"} = 1; + } + push @{${$make}{"=RC_SRCS"}}, $name; + } + elsif ($name =~ /\.idl$/) + { + my %flags = get_makedep_flags( $file ); + push @{${$make}{"=IDL_C_SRCS"}}, $name if defined $flags{"client"}; + push @{${$make}{"=IDL_H_SRCS"}}, $name if defined $flags{"header"}; + push @{${$make}{"=IDL_I_SRCS"}}, $name if defined $flags{"ident"}; + push @{${$make}{"=IDL_P_SRCS"}}, $name if defined $flags{"proxy"}; + push @{${$make}{"=IDL_R_SRCS"}}, $name if defined $flags{"register"}; + push @{${$make}{"=IDL_S_SRCS"}}, $name if defined $flags{"server"}; + push @{${$make}{"=IDL_TLB_SRCS"}}, $name if defined $flags{"typelib"}; + } } } foreach my $key (keys %subdirs) @@ -522,8 +572,14 @@ sub update_makefiles(@) replace_makefile_variable( $file, "C_SRCS" ); replace_makefile_variable( $file, "OBJC_SRCS" ); replace_makefile_variable( $file, "RC_SRCS" ); + replace_makefile_variable( $file, "PO_SRCS" ); replace_makefile_variable( $file, "PRIVATE_IDL_H_SRCS" ); replace_makefile_variable( $file, "PUBLIC_IDL_H_SRCS" ); + replace_makefile_variable( $file, "IDL_C_SRCS" ); + replace_makefile_variable( $file, "IDL_I_SRCS" ); + replace_makefile_variable( $file, "IDL_P_SRCS" ); + replace_makefile_variable( $file, "IDL_R_SRCS" ); + replace_makefile_variable( $file, "IDL_S_SRCS" ); replace_makefile_variable( $file, "IDL_TLB_SRCS" ); replace_makefile_variable( $file, "XTEMPLATE_SRCS" ); replace_makefile_variable( $file, "SRCDIR_INCLUDES" ); -- 2.11.4.GIT