my $f = 'build.info';
# The basic things we're trying to build
my @programs = ();
- my @programs_install = ();
my @libraries = ();
- my @libraries_install = ();
- my @engines = ();
- my @engines_install = ();
+ my @modules = ();
my @scripts = ();
- my @scripts_install = ();
- my @extra = ();
- my @overrides = ();
- my @intermediates = ();
- my @rawlines = ();
+ my %attributes = ();
my %sources = ();
my %shared_sources = ();
my %includes = ();
}
}
},
- qr/^\s*PROGRAMS(_NO_INST)?\s*=\s*(.*)\s*$/
+ qr/^\s*PROGRAMS(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/
=> sub {
if (!@skip || $skip[$#skip] > 0) {
- my $install = $1;
- my @x = tokenize($2);
- push @programs, @x;
- push @programs_install, @x unless $install;
+ my @a = tokenize($1, qr|\s*,\s*|);
+ my @p = tokenize($2);
+ push @programs, @p;
+ foreach my $a (@a) {
+ my $ak = $a;
+ my $av = 1;
+ if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
+ $ak = $1;
+ $av = $2;
+ }
+ foreach my $p (@p) {
+ $attributes{$p}->{$ak} = $av;
+ }
+ }
}
},
- qr/^\s*LIBS(_NO_INST)?\s*=\s*(.*)\s*$/
+ qr/^\s*LIBS(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/
=> sub {
if (!@skip || $skip[$#skip] > 0) {
- my $install = $1;
- my @x = tokenize($2);
- push @libraries, @x;
- push @libraries_install, @x unless $install;
+ my @a = tokenize($1, qr|\s*,\s*|);
+ my @l = tokenize($2);
+ push @libraries, @l;
+ foreach my $a (@a) {
+ my $ak = $a;
+ my $av = 1;
+ if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
+ $ak = $1;
+ $av = $2;
+ }
+ foreach my $l (@l) {
+ $attributes{$l}->{$ak} = $av;
+ }
+ }
}
},
- qr/^\s*ENGINES(_NO_INST)?\s*=\s*(.*)\s*$/
+ qr/^\s*MODULES(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/
=> sub {
if (!@skip || $skip[$#skip] > 0) {
- my $install = $1;
- my @x = tokenize($2);
- push @engines, @x;
- push @engines_install, @x unless $install;
+ my @a = tokenize($1, qr|\s*,\s*|);
+ my @m = tokenize($2);
+ push @modules, @m;
+ foreach my $a (@a) {
+ my $ak = $a;
+ my $av = 1;
+ if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
+ $ak = $1;
+ $av = $2;
+ }
+ foreach my $m (@m) {
+ $attributes{$m}->{$ak} = $av;
+ }
+ }
}
},
- qr/^\s*SCRIPTS(_NO_INST)?\s*=\s*(.*)\s*$/
+ qr/^\s*SCRIPTS(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/
=> sub {
if (!@skip || $skip[$#skip] > 0) {
- my $install = $1;
- my @x = tokenize($2);
- push @scripts, @x;
- push @scripts_install, @x unless $install;
+ my @a = tokenize($1, qr|\s*,\s*|);
+ my @s = tokenize($2);
+ push @scripts, @s;
+ foreach my $a (@a) {
+ my $ak = $a;
+ my $av = 1;
+ if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
+ $ak = $1;
+ $av = $2;
+ }
+ foreach my $s (@s) {
+ $attributes{$s}->{$ak} = $av;
+ }
+ }
}
},
- qr/^\s*EXTRA\s*=\s*(.*)\s*$/
- => sub { push @extra, tokenize($1)
- if !@skip || $skip[$#skip] > 0 },
- qr/^\s*OVERRIDES\s*=\s*(.*)\s*$/
- => sub { push @overrides, tokenize($1)
- if !@skip || $skip[$#skip] > 0 },
qr/^\s*ORDINALS\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/,
=> sub { push @{$ordinals{$1}}, tokenize($2)
qr/^\s*GENERATE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
=> sub { push @{$generate{$1}}, $2
if !@skip || $skip[$#skip] > 0 },
- qr/^\s*RENAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
- => sub { warn "RENAME is no longer supported\n" },
- qr/^\s*SHARED_NAME\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/
- => sub { warn "SHARED_NAME is no longer supported\n" },
- qr/^\s*BEGINRAW\[((?:\\.|[^\\\]])+)\]\s*$/
- => sub {
- my $lineiterator = shift;
- my $target_kind = $1;
- while (defined $lineiterator->()) {
- s|\R$||;
- if (/^\s*ENDRAW\[((?:\\.|[^\\\]])+)\]\s*$/) {
- die "ENDRAW doesn't match BEGINRAW"
- if $1 ne $target_kind;
- last;
- }
- next if @skip && $skip[$#skip] <= 0;
- push @rawlines, $_
- if ($target_kind eq $target{build_file}
- || $target_kind eq $target{build_file}."(".$builder_platform.")");
- }
- },
qr/^\s*(?:#.*)?$/ => sub { },
"OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" },
"BEFORE" => sub {
);
die "runaway IF?" if (@skip);
- foreach (@programs) {
- my $program = cleanfile($buildd, $_, $blddir);
- $unified_info{programs}->{$program} = 1;
- }
-
- foreach (@programs_install) {
- my $program = cleanfile($buildd, $_, $blddir);
- $unified_info{install}->{programs}->{$program} = 1;
- }
-
- foreach (@libraries) {
- my $library = cleanfile($buildd, $_, $blddir);
- $unified_info{libraries}->{$library} = 1;
- }
-
- foreach (@libraries_install) {
- my $library = cleanfile($buildd, $_, $blddir);
- $unified_info{install}->{libraries}->{$library} = 1;
- }
-
- die <<"EOF" if scalar @engines and !$config{dynamic_engines};
+ if (grep { defined $attributes{$_}->{engine} } keys %attributes
+ and !$config{dynamic_engines}) {
+ die <<"EOF"
ENGINES can only be used if configured with 'dynamic-engine'.
This is usually a fault in a build.info file.
EOF
- foreach (@engines) {
- my $library = cleanfile($buildd, $_, $blddir);
- $unified_info{engines}->{$library} = 1;
}
- foreach (@engines_install) {
- my $library = cleanfile($buildd, $_, $blddir);
- $unified_info{install}->{engines}->{$library} = 1;
- }
-
- foreach (@scripts) {
- my $script = cleanfile($buildd, $_, $blddir);
- $unified_info{scripts}->{$script} = 1;
- }
-
- foreach (@scripts_install) {
- my $script = cleanfile($buildd, $_, $blddir);
- $unified_info{install}->{scripts}->{$script} = 1;
- }
-
- foreach (@extra) {
- my $extra = cleanfile($buildd, $_, $blddir);
- $unified_info{extra}->{$extra} = 1;
+ foreach (keys %attributes) {
+ my $dest = $_;
+ my $ddest = cleanfile($buildd, $_, $blddir);
+ foreach (keys %{$attributes{$dest} // {}}) {
+ $unified_info{attributes}->{$ddest}->{$_} =
+ $attributes{$dest}->{$_};
+ }
}
- foreach (@overrides) {
- my $override = cleanfile($buildd, $_, $blddir);
- $unified_info{overrides}->{$override} = 1;
+ {
+ my %infos = ( programs => [ @programs ],
+ libraries => [ @libraries ],
+ modules => [ @modules ],
+ scripts => [ @scripts ] );
+ foreach my $k (keys %infos) {
+ foreach (@{$infos{$k}}) {
+ my $item = cleanfile($buildd, $_, $blddir);
+ $unified_info{$k}->{$item} = 1;
+ }
+ }
}
- push @{$unified_info{rawlines}}, @rawlines;
-
# Check that we haven't defined any library as both shared and
# explicitly static. That is forbidden.
my @doubles = ();
if defined($unified_info{$_});
delete $unified_info{$_};
}
- foreach my $prodtype (('programs', 'libraries', 'engines', 'scripts')) {
+ foreach my $prodtype (('programs', 'libraries', 'modules', 'scripts')) {
# $intent serves multi purposes:
# - give a prefix for the new object files names
# - in the case of libraries, rearrange the object files so static
src => [ 'sources',
'shared_sources' ],
dst => 'shared_sources' } },
- engines => { dso => { src => [ 'sources',
+ modules => { dso => { src => [ 'sources',
'shared_sources' ],
dst => 'shared_sources' } },
scripts => { script => { src => [ 'sources' ],
### Make unified_info a bit more efficient
# One level structures
- foreach (("programs", "libraries", "engines", "scripts", "extra", "overrides")) {
+ foreach (("programs", "libraries", "modules", "scripts")) {
$unified_info{$_} = [ sort keys %{$unified_info{$_}} ];
}
# Two level structures
- foreach my $l1 (("install", "sources", "shared_sources", "ldadd", "depends")) {
+ foreach my $l1 (("sources", "shared_sources", "ldadd", "depends")) {
foreach my $l2 (sort keys %{$unified_info{$l1}}) {
my @items =
sort
# they end up in where applicable. Then, add build rules for those
# directories
my %loopinfo = ( "lib" => [ @{$unified_info{libraries}} ],
- "dso" => [ @{$unified_info{engines}} ],
+ "dso" => [ @{$unified_info{modules}} ],
"bin" => [ @{$unified_info{programs}} ],
"script" => [ @{$unified_info{scripts}} ] );
foreach my $type (keys %loopinfo) {