Configure: rework build.info grammar and attributes

The build.info grammar's regular expressions were a horrible read.
By assigning certain sub-expressions to variables, we hope to make
it a little more readable.

Also, the handling of build.info attributes is reworked to use a
common function instead of having copies of the same code.

Finally, the attributes are reorganized to specify if they belong with
programs, libraries, modules or scripts.  This will enable more
intricate attribute assignment in changes to come.

Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/10088)
This commit is contained in:
Richard Levitte 2019-10-03 23:30:58 +02:00
parent 12a765a523
commit 285daccdc0
5 changed files with 151 additions and 158 deletions

View File

@ -118,7 +118,7 @@
unless ($disabled{shared} || $lib =~ /\.a$/) { unless ($disabled{shared} || $lib =~ /\.a$/) {
my $obj2shlib = defined &obj2shlib ? \&obj2shlib : \&libobj2shlib; my $obj2shlib = defined &obj2shlib ? \&obj2shlib : \&libobj2shlib;
$OUT .= $obj2shlib->(lib => $lib, $OUT .= $obj2shlib->(lib => $lib,
attrs => $unified_info{attributes}->{$lib}, attrs => $unified_info{attributes}->{libraries}->{$lib},
objs => $unified_info{shared_sources}->{$lib}, objs => $unified_info{shared_sources}->{$lib},
deps => [ reducedepends(resolvedepends($lib)) ]); deps => [ reducedepends(resolvedepends($lib)) ]);
foreach ((@{$unified_info{shared_sources}->{$lib}}, foreach ((@{$unified_info{shared_sources}->{$lib}},
@ -127,18 +127,18 @@
# Otherwise, it might simply be generated # Otherwise, it might simply be generated
if (defined $unified_info{sources}->{$_}) { if (defined $unified_info{sources}->{$_}) {
doobj($_, $lib, intent => "shlib", doobj($_, $lib, intent => "shlib",
attrs => $unified_info{attributes}->{$lib}); attrs => $unified_info{attributes}->{libraries}->{$lib});
} else { } else {
dogenerate($_, undef, undef, intent => "lib"); dogenerate($_, undef, undef, intent => "lib");
} }
} }
} }
$OUT .= obj2lib(lib => $lib, $OUT .= obj2lib(lib => $lib,
attrs => $unified_info{attributes}->{$lib}, attrs => $unified_info{attributes}->{libraries}->{$lib},
objs => [ @{$unified_info{sources}->{$lib}} ]); objs => [ @{$unified_info{sources}->{$lib}} ]);
foreach (@{$unified_info{sources}->{$lib}}) { foreach (@{$unified_info{sources}->{$lib}}) {
doobj($_, $lib, intent => "lib", doobj($_, $lib, intent => "lib",
attrs => $unified_info{attributes}->{$lib}); attrs => $unified_info{attributes}->{libraries}->{$lib});
} }
$cache{$lib} = 1; $cache{$lib} = 1;
} }
@ -147,23 +147,23 @@
# obj2dso, and also makes sure all object files for the library # obj2dso, and also makes sure all object files for the library
# are built. # are built.
sub domodule { sub domodule {
my $lib = shift; my $module = shift;
return "" if $cache{$lib}; return "" if $cache{$module};
$OUT .= obj2dso(lib => $lib, $OUT .= obj2dso(module => $module,
attrs => $unified_info{attributes}->{$lib}, attrs => $unified_info{attributes}->{modules}->{$module},
objs => $unified_info{sources}->{$lib}, objs => $unified_info{sources}->{$module},
deps => [ resolvedepends($lib) ]); deps => [ resolvedepends($module) ]);
foreach (@{$unified_info{sources}->{$lib}}) { foreach (@{$unified_info{sources}->{$module}}) {
# If this is somehow a compiled object, take care of it that way # If this is somehow a compiled object, take care of it that way
# Otherwise, it might simply be generated # Otherwise, it might simply be generated
if (defined $unified_info{sources}->{$_}) { if (defined $unified_info{sources}->{$_}) {
doobj($_, $lib, intent => "dso", doobj($_, $module, intent => "dso",
attrs => $unified_info{attributes}->{$lib}); attrs => $unified_info{attributes}->{modules}->{$module});
} else { } else {
dogenerate($_, undef, $lib, intent => "dso"); dogenerate($_, undef, $module, intent => "dso");
} }
} }
$cache{$lib} = 1; $cache{$module} = 1;
} }
# dobin is responsible for building programs. It will call obj2bin, # dobin is responsible for building programs. It will call obj2bin,
@ -173,7 +173,7 @@
return "" if $cache{$bin}; return "" if $cache{$bin};
my $deps = [ reducedepends(resolvedepends($bin)) ]; my $deps = [ reducedepends(resolvedepends($bin)) ];
$OUT .= obj2bin(bin => $bin, $OUT .= obj2bin(bin => $bin,
attrs => $unified_info{attributes}->{$bin}, attrs => $unified_info{attributes}->{programs}->{$bin},
objs => [ @{$unified_info{sources}->{$bin}} ], objs => [ @{$unified_info{sources}->{$bin}} ],
deps => $deps); deps => $deps);
foreach (@{$unified_info{sources}->{$bin}}) { foreach (@{$unified_info{sources}->{$bin}}) {

View File

@ -48,26 +48,26 @@
@{$unified_info{libraries}}; @{$unified_info{libraries}};
our @install_libs = our @install_libs =
map { platform->staticname($_) } map { platform->staticname($_) }
grep { !$unified_info{attributes}->{$_}->{noinst} } grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
@{$unified_info{libraries}}; @{$unified_info{libraries}};
our @install_shlibs = our @install_shlibs =
map { platform->sharedname($_) // () } map { platform->sharedname($_) // () }
grep { !$unified_info{attributes}->{$_}->{noinst} } grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
@{$unified_info{libraries}}; @{$unified_info{libraries}};
our @install_engines = our @install_engines =
grep { !$unified_info{attributes}->{$_}->{noinst} grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
&& $unified_info{attributes}->{$_}->{engine} } && $unified_info{attributes}->{modules}->{$_}->{engine} }
@{$unified_info{modules}}; @{$unified_info{modules}};
our @install_programs = our @install_programs =
grep { !$unified_info{attributes}->{$_}->{noinst} } grep { !$unified_info{attributes}->{programs}->{$_}->{noinst} }
@{$unified_info{programs}}; @{$unified_info{programs}};
our @install_bin_scripts = our @install_bin_scripts =
grep { !$unified_info{attributes}->{$_}->{noinst} grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst}
&& !$unified_info{attributes}->{$_}->{misc} } && !$unified_info{attributes}->{scripts}->{$_}->{misc} }
@{$unified_info{scripts}}; @{$unified_info{scripts}};
our @install_misc_scripts = our @install_misc_scripts =
grep { !$unified_info{attributes}->{$_}->{noinst} grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst}
&& $unified_info{attributes}->{$_}->{misc} } && $unified_info{attributes}->{scripts}->{$_}->{misc} }
@{$unified_info{scripts}}; @{$unified_info{scripts}};
# This is a horrible hack, but is needed because recursive inclusion of files # This is a horrible hack, but is needed because recursive inclusion of files
@ -704,7 +704,7 @@ reconfigure reconf :
# On Unix platforms, we depend on {shlibname}.so # On Unix platforms, we depend on {shlibname}.so
return map { return map {
{ lib => platform->sharedlib($_) // platform->staticlib($_), { lib => platform->sharedlib($_) // platform->staticlib($_),
attrs => $unified_info{attributes}->{$_} } attrs => $unified_info{attributes}->{libraries}->{$_} }
} @_; } @_;
} }
@ -1014,8 +1014,8 @@ EOF
} }
sub obj2dso { sub obj2dso {
my %args = @_; my %args = @_;
my $dsoname = platform->dsoname($args{lib}); my $dsoname = platform->dsoname($args{module});
my $dso = platform->dso($args{lib}); my $dso = platform->dso($args{module});
my @objs = map { platform->convertext($_) } my @objs = map { platform->convertext($_) }
grep { platform->isobj($_) } grep { platform->isobj($_) }
@{$args{objs}}; @{$args{objs}};

View File

@ -54,44 +54,44 @@ GENERATED={- # common0.tmpl provides @generated
INSTALL_LIBS={- INSTALL_LIBS={-
join(" ", map { platform->staticlib($_) // () } join(" ", map { platform->staticlib($_) // () }
grep { !$unified_info{attributes}->{$_}->{noinst} } grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
@{$unified_info{libraries}}) @{$unified_info{libraries}})
-} -}
INSTALL_SHLIBS={- INSTALL_SHLIBS={-
join(" ", map { platform->sharedlib($_) // () } join(" ", map { platform->sharedlib($_) // () }
grep { !$unified_info{attributes}->{$_}->{noinst} } grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
@{$unified_info{libraries}}) @{$unified_info{libraries}})
-} -}
INSTALL_SHLIB_INFO={- INSTALL_SHLIB_INFO={-
join(" ", map { my $x = platform->sharedlib($_); join(" ", map { my $x = platform->sharedlib($_);
my $y = platform->sharedlib_simple($_); my $y = platform->sharedlib_simple($_);
$x ? "\"$x;$y\"" : () } $x ? "\"$x;$y\"" : () }
grep { !$unified_info{attributes}->{$_}->{noinst} } grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
@{$unified_info{libraries}}) @{$unified_info{libraries}})
-} -}
INSTALL_ENGINES={- INSTALL_ENGINES={-
join(" ", map { platform->dso($_) } join(" ", map { platform->dso($_) }
grep { !$unified_info{attributes}->{$_}->{noinst} grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
&& $unified_info{attributes}->{$_}->{engine} } && $unified_info{attributes}->{modules}->{$_}->{engine} }
@{$unified_info{modules}}) @{$unified_info{modules}})
-} -}
INSTALL_PROGRAMS={- INSTALL_PROGRAMS={-
join(" ", map { platform->bin($_) } join(" ", map { platform->bin($_) }
grep { !$unified_info{attributes}->{$_}->{noinst} } grep { !$unified_info{attributes}->{programs}->{$_}->{noinst} }
@{$unified_info{programs}}) @{$unified_info{programs}})
-} -}
BIN_SCRIPTS={- BIN_SCRIPTS={-
join(" ", map { my $x = $unified_info{attributes}->{$_}->{linkname}; join(" ", map { my $x = $unified_info{attributes}->{scripts}->{$_}->{linkname};
$x ? "$_:$x" : $_ } $x ? "$_:$x" : $_ }
grep { !$unified_info{attributes}->{$_}->{noinst} grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst}
&& !$unified_info{attributes}->{$_}->{misc} } && !$unified_info{attributes}->{scripts}->{$_}->{misc} }
@{$unified_info{scripts}}) @{$unified_info{scripts}})
-} -}
MISC_SCRIPTS={- MISC_SCRIPTS={-
join(" ", map { my $x = $unified_info{attributes}->{$_}->{linkname}; join(" ", map { my $x = $unified_info{attributes}->{scripts}->{$_}->{linkname};
$x ? "$_:$x" : $_ } $x ? "$_:$x" : $_ }
grep { !$unified_info{attributes}->{$_}->{noinst} grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst}
&& $unified_info{attributes}->{$_}->{misc} } && $unified_info{attributes}->{scripts}->{$_}->{misc} }
@{$unified_info{scripts}}) @{$unified_info{scripts}})
-} -}
@ -1156,7 +1156,7 @@ EOF
} }
sub obj2dso { sub obj2dso {
my %args = @_; my %args = @_;
my $dso = platform->dso($args{lib}); my $dso = platform->dso($args{module});
my @linkdirs = (); my @linkdirs = ();
foreach (@{args{deps}}) { foreach (@{args{deps}}) {
my $d = dirname($_); my $d = dirname($_);

View File

@ -62,53 +62,53 @@ GENERATED={- # common0.tmpl provides @generated
INSTALL_LIBS={- INSTALL_LIBS={-
join(" ", map { quotify1(platform->sharedlib_import($_) join(" ", map { quotify1(platform->sharedlib_import($_)
// platform->staticlib($_)) } // platform->staticlib($_)) }
grep { !$unified_info{attributes}->{$_}->{noinst} } grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
@{$unified_info{libraries}}) @{$unified_info{libraries}})
-} -}
INSTALL_SHLIBS={- INSTALL_SHLIBS={-
join(" ", map { my $x = platform->sharedlib($_); join(" ", map { my $x = platform->sharedlib($_);
$x ? quotify_l($x) : () } $x ? quotify_l($x) : () }
grep { !$unified_info{attributes}->{$_}->{noinst} } grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
@{$unified_info{libraries}}) @{$unified_info{libraries}})
-} -}
INSTALL_SHLIBPDBS={- INSTALL_SHLIBPDBS={-
join(" ", map { my $x = platform->sharedlibpdb($_); join(" ", map { my $x = platform->sharedlibpdb($_);
$x ? quotify_l($x) : () } $x ? quotify_l($x) : () }
grep { !$unified_info{attributes}->{$_}->{noinst} } grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} }
@{$unified_info{libraries}}) @{$unified_info{libraries}})
-} -}
INSTALL_ENGINES={- INSTALL_ENGINES={-
join(" ", map { quotify1(platform->dso($_)) } join(" ", map { quotify1(platform->dso($_)) }
grep { !$unified_info{attributes}->{$_}->{noinst} grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
&& $unified_info{attributes}->{$_}->{engine} } && $unified_info{attributes}->{modules}->{$_}->{engine} }
@{$unified_info{modules}}) @{$unified_info{modules}})
-} -}
INSTALL_ENGINEPDBS={- INSTALL_ENGINEPDBS={-
join(" ", map { quotify1(platform->dsopdb($_)) } join(" ", map { quotify1(platform->dsopdb($_)) }
grep { !$unified_info{attributes}->{$_}->{noinst} grep { !$unified_info{attributes}->{modules}->{$_}->{noinst}
&& $unified_info{attributes}->{$_}->{engine} } && $unified_info{attributes}->{modules}->{$_}->{engine} }
@{$unified_info{modules}}) @{$unified_info{modules}})
-} -}
INSTALL_PROGRAMS={- INSTALL_PROGRAMS={-
join(" ", map { quotify1(platform->bin($_)) } join(" ", map { quotify1(platform->bin($_)) }
grep { !$unified_info{attributes}->{$_}->{noinst} } grep { !$unified_info{attributes}->{programs}->{$_}->{noinst} }
@{$unified_info{programs}}) @{$unified_info{programs}})
-} -}
INSTALL_PROGRAMPDBS={- INSTALL_PROGRAMPDBS={-
join(" ", map { quotify1(platform->binpdb($_)) } join(" ", map { quotify1(platform->binpdb($_)) }
grep { !$unified_info{attributes}->{$_}->{noinst} } grep { !$unified_info{attributes}->{programs}->{$_}->{noinst} }
@{$unified_info{programs}}) @{$unified_info{programs}})
-} -}
BIN_SCRIPTS={- BIN_SCRIPTS={-
join(" ", map { quotify1($_) } join(" ", map { quotify1($_) }
grep { !$unified_info{attributes}->{$_}->{noinst} grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst}
&& !$unified_info{attributes}->{$_}->{misc} } && !$unified_info{attributes}->{scripts}->{$_}->{misc} }
@{$unified_info{scripts}}) @{$unified_info{scripts}})
-} -}
MISC_SCRIPTS={- MISC_SCRIPTS={-
join(" ", map { quotify1($_) } join(" ", map { quotify1($_) }
grep { !$unified_info{attributes}->{$_}->{noinst} grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst}
&& $unified_info{attributes}->{$_}->{misc} } && $unified_info{attributes}->{scripts}->{$_}->{misc} }
@{$unified_info{scripts}}) @{$unified_info{scripts}})
-} -}
@ -714,8 +714,8 @@ EOF
} }
sub obj2dso { sub obj2dso {
my %args = @_; my %args = @_;
my $dso = platform->dso($args{lib}); my $dso = platform->dso($args{module});
my $dso_n = platform->dsoname($args{lib}); my $dso_n = platform->dsoname($args{module});
my @objs = map { platform->convertext($_) } my @objs = map { platform->convertext($_) }
grep { platform->isobj($_) || platform->isres($_) } grep { platform->isobj($_) || platform->isres($_) }
@{$args{objs}}; @{$args{objs}};

197
Configure
View File

@ -1724,7 +1724,6 @@ if ($builder eq "unified") {
my @modules = (); my @modules = ();
my @scripts = (); my @scripts = ();
my %attributes = ();
my %sources = (); my %sources = ();
my %shared_sources = (); my %shared_sources = ();
my %includes = (); my %includes = ();
@ -1737,7 +1736,7 @@ if ($builder eq "unified") {
# contains a dollar sign, it had better be escaped, or it will be # contains a dollar sign, it had better be escaped, or it will be
# taken for a variable name prefix. # taken for a variable name prefix.
my %variables = (); my %variables = ();
my $variable_re = qr/\$([[:alpha:]][[:alnum:]_]*)/; my $variable_re = qr/\$(?P<VARIABLE>[[:alpha:]][[:alnum:]_]*)/;
my $expand_variables = sub { my $expand_variables = sub {
my $value = ''; my $value = '';
my $value_rest = shift; my $value_rest = shift;
@ -1748,7 +1747,7 @@ if ($builder eq "unified") {
} }
while ($value_rest =~ /(?<!\\)${variable_re}/) { while ($value_rest =~ /(?<!\\)${variable_re}/) {
$value .= $`; $value .= $`;
$value .= $variables{$1}; $value .= $variables{$+{VARIABLE}};
$value_rest = $'; $value_rest = $';
} }
if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) { if ($ENV{CONFIGURE_DEBUG_VARIABLE_EXPAND}) {
@ -1758,6 +1757,35 @@ if ($builder eq "unified") {
return $value . $value_rest; return $value . $value_rest;
}; };
# Support for attributes in build.info files
my %attributes = ();
my $handle_attributes = sub {
my $attr_str = shift;
my $ref = shift;
my @goals = @_;
return unless defined $attr_str;
my @a = tokenize($attr_str, qr|\s*,\s*|);
foreach my $a (@a) {
my $ac = 1;
my $ak = $a;
my $av = 1;
if ($a =~ m|^(!)?(.*?)\s* = \s*(.*?)$|) {
$ac = ! $1;
$ak = $1;
$av = $2;
}
foreach my $g (@goals) {
if ($ac) {
$$ref->{$g}->{$ak} = $av;
} else {
delete $$ref->{$g}->{$ak};
}
}
}
};
# We want to detect configdata.pm in the source tree, so we # We want to detect configdata.pm in the source tree, so we
# don't use it if the build tree is different. # don't use it if the build tree is different.
my $src_configdata = cleanfile($srcdir, "configdata.pm", $blddir); my $src_configdata = cleanfile($srcdir, "configdata.pm", $blddir);
@ -1787,153 +1815,122 @@ if ($builder eq "unified") {
# 1 last was positive (don't skip lines until next ELSE, ELSIF or ENDIF) # 1 last was positive (don't skip lines until next ELSE, ELSIF or ENDIF)
# 2 positive ELSE (following ELSIF should fail) # 2 positive ELSE (following ELSIF should fail)
my @skip = (); my @skip = ();
# A few useful generic regexps
my $index_re = qr/\[\s*(?P<INDEX>(?:\\.|.)*?)\s*\]/;
my $cond_re = qr/\[\s*(?P<COND>(?:\\.|.)*?)\s*\]/;
my $attribs_re = qr/(?:\{\s*(?P<ATTRIBS>(?:\\.|.)*?)\s*\})?/;
my $value_re = qr/\s*(?P<VALUE>.*?)\s*/;
collect_information( collect_information(
collect_from_array([ @text ], collect_from_array([ @text ],
qr/\\$/ => sub { my $l1 = shift; my $l2 = shift; qr/\\$/ => sub { my $l1 = shift; my $l2 = shift;
$l1 =~ s/\\$//; $l1.$l2 }), $l1 =~ s/\\$//; $l1.$l2 }),
# Info we're looking for # Info we're looking for
qr/^\s*IF\[((?:\\.|[^\\\]])*)\]\s*$/ qr/^\s* IF ${cond_re} \s*$/x
=> sub { => sub {
if (! @skip || $skip[$#skip] > 0) { if (! @skip || $skip[$#skip] > 0) {
push @skip, !! $expand_variables->($1); push @skip, !! $expand_variables->($+{COND});
} else { } else {
push @skip, -1; push @skip, -1;
} }
}, },
qr/^\s*ELSIF\[((?:\\.|[^\\\]])*)\]\s*$/ qr/^\s* ELSIF ${cond_re} \s*$/x
=> sub { die "ELSIF out of scope" if ! @skip; => sub { die "ELSIF out of scope" if ! @skip;
die "ELSIF following ELSE" if abs($skip[$#skip]) == 2; die "ELSIF following ELSE" if abs($skip[$#skip]) == 2;
$skip[$#skip] = -1 if $skip[$#skip] != 0; $skip[$#skip] = -1 if $skip[$#skip] != 0;
$skip[$#skip] = !! $expand_variables->($1) $skip[$#skip] = !! $expand_variables->($+{COND})
if $skip[$#skip] == 0; }, if $skip[$#skip] == 0; },
qr/^\s*ELSE\s*$/ qr/^\s* ELSE \s*$/x
=> sub { die "ELSE out of scope" if ! @skip; => sub { die "ELSE out of scope" if ! @skip;
$skip[$#skip] = -2 if $skip[$#skip] != 0; $skip[$#skip] = -2 if $skip[$#skip] != 0;
$skip[$#skip] = 2 if $skip[$#skip] == 0; }, $skip[$#skip] = 2 if $skip[$#skip] == 0; },
qr/^\s*ENDIF\s*$/ qr/^\s* ENDIF \s*$/x
=> sub { die "ENDIF out of scope" if ! @skip; => sub { die "ENDIF out of scope" if ! @skip;
pop @skip; }, pop @skip; },
qr/^\s*${variable_re}\s*=\s*(.*?)\s*$/ qr/^\s* ${variable_re} \s* = ${value_re} $/x
=> sub { => sub {
if (!@skip || $skip[$#skip] > 0) { if (!@skip || $skip[$#skip] > 0) {
my $n = $1; $variables{$+{VARIABLE}} = $expand_variables->($+{VALUE});
my $v = $2;
$variables{$n} = $expand_variables->($v);
} }
}, },
qr/^\s*SUBDIRS\s*=\s*(.*)\s*$/ qr/^\s* SUBDIRS \s* = ${value_re} $/x
=> sub { => sub {
if (!@skip || $skip[$#skip] > 0) { if (!@skip || $skip[$#skip] > 0) {
foreach (tokenize($expand_variables->($1))) { foreach (tokenize($expand_variables->($+{VALUE}))) {
push @build_dirs, [ @curd, splitdir($_, 1) ]; push @build_dirs, [ @curd, splitdir($_, 1) ];
} }
} }
}, },
qr/^\s*PROGRAMS(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/ qr/^\s* PROGRAMS ${attribs_re} \s* = ${value_re} $/x
=> sub { => sub {
if (!@skip || $skip[$#skip] > 0) { if (!@skip || $skip[$#skip] > 0) {
my @a = tokenize($1, qr|\s*,\s*|); my @p = tokenize($expand_variables->($+{VALUE}));
my @p = tokenize($expand_variables->($2));
push @programs, @p; push @programs, @p;
foreach my $a (@a) { $handle_attributes->($+{ATTRIBS},
my $ak = $a; \$attributes{programs},
my $av = 1; @p);
if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
$ak = $1;
$av = $2;
}
foreach my $p (@p) {
$attributes{$p}->{$ak} = $av;
}
}
} }
}, },
qr/^\s*LIBS(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/ qr/^\s* LIBS ${attribs_re} \s* = ${value_re} $/x
=> sub { => sub {
if (!@skip || $skip[$#skip] > 0) { if (!@skip || $skip[$#skip] > 0) {
my @a = tokenize($1, qr|\s*,\s*|); my @l = tokenize($expand_variables->($+{VALUE}));
my @l = tokenize($expand_variables->($2));
push @libraries, @l; push @libraries, @l;
foreach my $a (@a) { $handle_attributes->($+{ATTRIBS},
my $ak = $a; \$attributes{libraries},
my $av = 1; @l);
if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
$ak = $1;
$av = $2;
}
foreach my $l (@l) {
$attributes{$l}->{$ak} = $av;
}
}
} }
}, },
qr/^\s*MODULES(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/ qr/^\s* MODULES ${attribs_re} \s* = ${value_re} $/x
=> sub { => sub {
if (!@skip || $skip[$#skip] > 0) { if (!@skip || $skip[$#skip] > 0) {
my @a = tokenize($1, qr|\s*,\s*|); my @m = tokenize($expand_variables->($+{VALUE}));
my @m = tokenize($expand_variables->($2));
push @modules, @m; push @modules, @m;
foreach my $a (@a) { $handle_attributes->($+{ATTRIBS},
my $ak = $a; \$attributes{modules},
my $av = 1; @m);
if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
$ak = $1;
$av = $2;
}
foreach my $m (@m) {
$attributes{$m}->{$ak} = $av;
}
}
} }
}, },
qr/^\s*SCRIPTS(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/ qr/^\s* SCRIPTS ${attribs_re} \s* = ${value_re} $/x
=> sub { => sub {
if (!@skip || $skip[$#skip] > 0) { if (!@skip || $skip[$#skip] > 0) {
my @a = tokenize($1, qr|\s*,\s*|); my @s = tokenize($expand_variables->($+{VALUE}));
my @s = tokenize($expand_variables->($2));
push @scripts, @s; push @scripts, @s;
foreach my $a (@a) { $handle_attributes->($+{ATTRIBS},
my $ak = $a; \$attributes{scripts},
my $av = 1; @s);
if ($a =~ m|^(.*?)\s*=\s*(.*?)$|) {
$ak = $1;
$av = $2;
}
foreach my $s (@s) {
$attributes{$s}->{$ak} = $av;
}
}
} }
}, },
qr/^\s*ORDINALS\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/, qr/^\s* ORDINALS ${index_re} = ${value_re} $/x
=> sub { push @{$ordinals{$expand_variables->($1)}}, => sub { push @{$ordinals{$expand_variables->($+{INDEX})}},
tokenize($expand_variables->($2)) tokenize($expand_variables->($+{VALUE}))
if !@skip || $skip[$#skip] > 0 }, if !@skip || $skip[$#skip] > 0 },
qr/^\s*SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ qr/^\s* SOURCE ${index_re} = ${value_re} $/x
=> sub { push @{$sources{$expand_variables->($1)}}, => sub { push @{$sources{$expand_variables->($+{INDEX})}},
tokenize($expand_variables->($2)) tokenize($expand_variables->($+{VALUE}))
if !@skip || $skip[$#skip] > 0 }, if !@skip || $skip[$#skip] > 0 },
qr/^\s*SHARED_SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ qr/^\s* SHARED_SOURCE ${index_re} = ${value_re} $/x
=> sub { push @{$shared_sources{$expand_variables->($1)}}, => sub { push @{$shared_sources{$expand_variables->($+{INDEX})}},
tokenize($expand_variables->($2)) tokenize($expand_variables->($+{VALUE}))
if !@skip || $skip[$#skip] > 0 }, if !@skip || $skip[$#skip] > 0 },
qr/^\s*INCLUDE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ qr/^\s* INCLUDE ${index_re} = ${value_re} $/x
=> sub { push @{$includes{$expand_variables->($1)}}, => sub { push @{$includes{$expand_variables->($+{INDEX})}},
tokenize($expand_variables->($2)) tokenize($expand_variables->($+{VALUE}))
if !@skip || $skip[$#skip] > 0 }, if !@skip || $skip[$#skip] > 0 },
qr/^\s*DEFINE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ qr/^\s* DEFINE ${index_re} = ${value_re} $/x
=> sub { push @{$defines{$expand_variables->($1)}}, => sub { push @{$defines{$expand_variables->($+{INDEX})}},
tokenize($expand_variables->($2)) tokenize($expand_variables->($+{VALUE}))
if !@skip || $skip[$#skip] > 0 }, if !@skip || $skip[$#skip] > 0 },
qr/^\s*DEPEND\[((?:\\.|[^\\\]])*)\]\s*=\s*(.*)\s*$/ qr/^\s* DEPEND ${index_re} = ${value_re} $/x
=> sub { push @{$depends{$expand_variables->($1)}}, => sub { push @{$depends{$expand_variables->($+{INDEX})}},
tokenize($expand_variables->($2)) tokenize($expand_variables->($+{VALUE}))
if !@skip || $skip[$#skip] > 0 }, if !@skip || $skip[$#skip] > 0 },
qr/^\s*GENERATE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ qr/^\s* GENERATE ${index_re} = ${value_re} $/x
=> sub { push @{$generate{$expand_variables->($1)}}, $2 => sub { push @{$generate{$expand_variables->($+{INDEX})}},
$+{VALUE}
if !@skip || $skip[$#skip] > 0 }, if !@skip || $skip[$#skip] > 0 },
qr/^\s*(?:#.*)?$/ => sub { }, qr/^\s* (?:\#.*)? $/x => sub { },
"OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" }, "OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" },
"BEFORE" => sub { "BEFORE" => sub {
if ($buildinfo_debug) { if ($buildinfo_debug) {
@ -1949,7 +1946,7 @@ if ($builder eq "unified") {
); );
die "runaway IF?" if (@skip); die "runaway IF?" if (@skip);
if (grep { defined $attributes{$_}->{engine} } keys %attributes if (grep { defined $attributes{modules}->{$_}->{engine} } keys %attributes
and !$config{dynamic_engines}) { and !$config{dynamic_engines}) {
die <<"EOF" die <<"EOF"
ENGINES can only be used if configured with 'dynamic-engine'. ENGINES can only be used if configured with 'dynamic-engine'.
@ -1957,15 +1954,6 @@ This is usually a fault in a build.info file.
EOF EOF
} }
foreach (keys %attributes) {
my $dest = $_;
my $ddest = cleanfile($buildd, $_, $blddir);
foreach (keys %{$attributes{$dest} // {}}) {
$unified_info{attributes}->{$ddest}->{$_} =
$attributes{$dest}->{$_};
}
}
{ {
my %infos = ( programs => [ @programs ], my %infos = ( programs => [ @programs ],
libraries => [ @libraries ], libraries => [ @libraries ],
@ -1975,6 +1963,11 @@ EOF
foreach (@{$infos{$k}}) { foreach (@{$infos{$k}}) {
my $item = cleanfile($buildd, $_, $blddir); my $item = cleanfile($buildd, $_, $blddir);
$unified_info{$k}->{$item} = 1; $unified_info{$k}->{$item} = 1;
# Fix up associated attributes
$unified_info{attributes}->{$k}->{$item} =
$attributes{$k}->{$_}
if defined $attributes{$k}->{$_};
} }
} }
} }