(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
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);
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}})) {
my %sources = ();
my %shared_sources = ();
my %includes = ();
+ my %defines = ();
my %depends = ();
my %renames = ();
my %sharednames = ();
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 },
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);
}
}
}
+ # 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})) {