diff --git a/src/.gitignore b/src/.gitignore index cc8e33e2..413f8141 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -2,3 +2,4 @@ .echocheck TAGS* bin* +config-local.h diff --git a/src/Makefile.housekeeping b/src/Makefile.housekeeping index 216f29ec..bbea2a56 100644 --- a/src/Makefile.housekeeping +++ b/src/Makefile.housekeeping @@ -121,8 +121,8 @@ CFLAGS += $(SP_FLAGS) CFLAGS += -include compiler.h # config/%.h files are generated from config.h using mkconfig.pl -config/%.h : config.h - $(MKCONFIG) $< +config/%.h : config*.h + $(MKCONFIG) config.h CLEANUP += config/*.h # SRCDIRS lists all directories containing source files. diff --git a/src/config.h b/src/config.h index 2d8faa68..cec832c3 100644 --- a/src/config.h +++ b/src/config.h @@ -166,3 +166,5 @@ #undef NULL_TRAP /* Attempt to catch NULL function calls */ /* @END general.h */ + +/* @TRYSOURCE config-local.h */ diff --git a/src/util/mkconfig.pl b/src/util/mkconfig.pl index 6a9c2f14..e55c2ca8 100755 --- a/src/util/mkconfig.pl +++ b/src/util/mkconfig.pl @@ -7,6 +7,7 @@ use warnings; my $cfgdir = "config"; my $config_h = shift || "config.h"; +my @input_files; # Read in a whole file # @@ -110,15 +111,15 @@ sub postamble { return "\n#endif /* $guard */\n"; } -# Get the new configuration by splitting config.h file using the -# @BEGIN/@END tags +# Parse one config.h file into an existing configuration # -sub new_config { +sub parse_config { my $file = shift; - - my $cfg = {}; + my $cfg = shift; my $cursor = ""; + push ( @input_files, $file ); + open my $fh, "<$file" or die "Could not open $file: $!\n"; while ( <$fh> ) { if ( ( my $newcursor, my $suffix ) = /\@BEGIN\s+(\w+\.h)(.*)$/ ) { @@ -133,14 +134,28 @@ sub new_config { ." at $file line $.\n" unless $cursor eq $oldcursor; $cfg->{$cursor} .= $prefix."*/\n"; $cursor = ""; + } elsif ( ( my $newfile ) = /\@TRYSOURCE\s+([\w\-]+\.h)/ ) { + die "Missing \"\@END $cursor\" before \"\@TRYSOURCE $newfile\"" + ." at $file line $.\n" if $cursor; + parse_config ( $newfile, $cfg ) if -e $newfile; } else { $cfg->{$cursor} .= $_ if $cursor; } } close $fh; die "Missing \"\@END $cursor\" in $file\n" if $cursor; +} - foreach $cursor ( keys %$cfg ) { +# Get the new configuration by splitting config.h file using the +# @BEGIN/@END tags +# +sub new_config { + my $file = shift; + my $cfg = {}; + + parse_config ( $file, $cfg ); + + foreach my $cursor ( keys %$cfg ) { $cfg->{$cursor} .= postamble ( $cursor ); } @@ -180,9 +195,11 @@ foreach my $file ( keys %$new ) { } # If we now have fragments that are older than config.h, set the -# timestamp on config.h to match the oldest fragment, to prevent make -# from always attempting to rebuild the fragments. +# timestamp on each input file to match the oldest fragment, to +# prevent make from always attempting to rebuild the fragments. # -if ( $oldest < file_mtime ( $config_h ) ) { - utime time(), $oldest, $config_h or die "Could not touch $config_h: $!\n"; +foreach my $file ( @input_files ) { + if ( $oldest < file_mtime ( $file ) ) { + utime time(), $oldest, $file or die "Could not touch $file: $!\n"; + } }