diff --git a/Configurations/README b/Configurations/README index 9fd4922fd0..1c67f75a7b 100644 --- a/Configurations/README +++ b/Configurations/README @@ -467,6 +467,10 @@ include paths the build of their source files should use: INCLUDE[foo]=include +It's also possible to specify C macros that should be defined: + + DEFINE[foo]=FOO BAR=1 + In some cases, one might want to generate some source files from others, that's done as follows: diff --git a/Configurations/README.design b/Configurations/README.design index 8c50a92b20..c0b05bd5b2 100644 --- a/Configurations/README.design +++ b/Configurations/README.design @@ -41,9 +41,10 @@ end products. There are variants for them with '_NO_INST' as suffix (PROGRAM_NO_INST etc) to specify end products that shouldn't get installed. -The variables SOURCE, DEPEND and INCLUDE are indexed by a produced -file, and their values are the source used to produce that particular -produced file, extra dependencies, and include directories needed. +The variables SOURCE, DEPEND, INCLUDE and DEFINE are indexed by a +produced file, and their values are the source used to produce that +particular produced file, extra dependencies, include directories +needed, or C macros to be defined. All their values in all the build.info throughout the source tree are collected together and form a set of programs, libraries, engines and diff --git a/Configurations/common.tmpl b/Configurations/common.tmpl index 4a086559c1..b7d2a0777e 100644 --- a/Configurations/common.tmpl +++ b/Configurations/common.tmpl @@ -85,6 +85,7 @@ deps => $unified_info{depends}->{$src}, incs => [ @{$unified_info{includes}->{$obj}}, @{$unified_info{includes}->{$bin}} ], + defs => $unified_info{defines}->{$obj}, %opts); foreach (@{$unified_info{depends}->{$src}}) { dogenerate($_, $obj, $bin, %opts); @@ -107,6 +108,7 @@ deps => $unified_info{depends}->{$obj}, incs => [ @{$unified_info{includes}->{$obj}}, @{$unified_info{includes}->{$bin}} ], + defs => $unified_info{defines}->{$obj}, %opts); foreach ((@{$unified_info{sources}->{$obj}}, @{$unified_info{depends}->{$obj}})) { diff --git a/Configure b/Configure index 53d5549eaf..094898cc56 100755 --- a/Configure +++ b/Configure @@ -1722,6 +1722,7 @@ if ($builder eq "unified") { my %sources = (); my %shared_sources = (); my %includes = (); + my %defines = (); my %depends = (); my %renames = (); my %sharednames = (); @@ -1837,6 +1838,9 @@ if ($builder eq "unified") { qr/^\s*INCLUDE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ => sub { push @{$includes{$1}}, tokenize($2) if !@skip || $skip[$#skip] > 0 }, + qr/^\s*DEFINE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ + => sub { push @{$defines{$1}}, tokenize($2) + if !@skip || $skip[$#skip] > 0 }, qr/^\s*DEPEND\[((?:\\.|[^\\\]])*)\]\s*=\s*(.*)\s*$/ => sub { push @{$depends{$1}}, tokenize($2) if !@skip || $skip[$#skip] > 0 }, @@ -2169,6 +2173,27 @@ EOF unless grep { $_ eq $ib } @{$unified_info{includes}->{$ddest}->{build}}; } } + + foreach (keys %defines) { + my $dest = $_; + my $ddest = cleanfile($sourced, $_, $blddir); + + # If the destination doesn't exist in source, it can only be + # a generated file in the build tree. + if (! -f $ddest) { + $ddest = cleanfile($buildd, $_, $blddir); + if ($unified_info{rename}->{$ddest}) { + $ddest = $unified_info{rename}->{$ddest}; + } + } + foreach (@{$defines{$dest}}) { + m|^([^=]*)(=.*)?$|; + die "0 length macro name not permitted\n" if $1 eq ""; + die "$1 defined more than once\n" + if defined $unified_info{defines}->{$ddest}->{$1}; + $unified_info{defines}->{$ddest}->{$1} = $2; + } + } } my $ordinals_text = join(', ', sort keys %ordinals); @@ -2311,6 +2336,12 @@ EOF } } } + # Defines + foreach my $dest (sort keys %{$unified_info{defines}}) { + $unified_info{defines}->{$dest} + = [ map { $_.$unified_info{defines}->{$dest}->{$_} } + sort keys %{$unified_info{defines}->{$dest}} ]; + } # Includes foreach my $dest (sort keys %{$unified_info{includes}}) { if (defined($unified_info{includes}->{$dest}->{build})) {