From 285daccdc0e20fa70ddda9ddcd1f22191425de8a Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 3 Oct 2019 23:30:58 +0200 Subject: [PATCH] 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 (Merged from https://github.com/openssl/openssl/pull/10088) --- Configurations/common.tmpl | 32 ++--- Configurations/descrip.mms.tmpl | 24 ++-- Configurations/unix-Makefile.tmpl | 26 ++-- Configurations/windows-makefile.tmpl | 30 ++-- Configure | 197 +++++++++++++-------------- 5 files changed, 151 insertions(+), 158 deletions(-) diff --git a/Configurations/common.tmpl b/Configurations/common.tmpl index 62b1102c798..d28df743fe3 100644 --- a/Configurations/common.tmpl +++ b/Configurations/common.tmpl @@ -118,7 +118,7 @@ unless ($disabled{shared} || $lib =~ /\.a$/) { my $obj2shlib = defined &obj2shlib ? \&obj2shlib : \&libobj2shlib; $OUT .= $obj2shlib->(lib => $lib, - attrs => $unified_info{attributes}->{$lib}, + attrs => $unified_info{attributes}->{libraries}->{$lib}, objs => $unified_info{shared_sources}->{$lib}, deps => [ reducedepends(resolvedepends($lib)) ]); foreach ((@{$unified_info{shared_sources}->{$lib}}, @@ -127,18 +127,18 @@ # Otherwise, it might simply be generated if (defined $unified_info{sources}->{$_}) { doobj($_, $lib, intent => "shlib", - attrs => $unified_info{attributes}->{$lib}); + attrs => $unified_info{attributes}->{libraries}->{$lib}); } else { dogenerate($_, undef, undef, intent => "lib"); } } } $OUT .= obj2lib(lib => $lib, - attrs => $unified_info{attributes}->{$lib}, + attrs => $unified_info{attributes}->{libraries}->{$lib}, objs => [ @{$unified_info{sources}->{$lib}} ]); foreach (@{$unified_info{sources}->{$lib}}) { doobj($_, $lib, intent => "lib", - attrs => $unified_info{attributes}->{$lib}); + attrs => $unified_info{attributes}->{libraries}->{$lib}); } $cache{$lib} = 1; } @@ -147,23 +147,23 @@ # obj2dso, and also makes sure all object files for the library # are built. sub domodule { - my $lib = shift; - return "" if $cache{$lib}; - $OUT .= obj2dso(lib => $lib, - attrs => $unified_info{attributes}->{$lib}, - objs => $unified_info{sources}->{$lib}, - deps => [ resolvedepends($lib) ]); - foreach (@{$unified_info{sources}->{$lib}}) { + my $module = shift; + return "" if $cache{$module}; + $OUT .= obj2dso(module => $module, + attrs => $unified_info{attributes}->{modules}->{$module}, + objs => $unified_info{sources}->{$module}, + deps => [ resolvedepends($module) ]); + foreach (@{$unified_info{sources}->{$module}}) { # If this is somehow a compiled object, take care of it that way # Otherwise, it might simply be generated if (defined $unified_info{sources}->{$_}) { - doobj($_, $lib, intent => "dso", - attrs => $unified_info{attributes}->{$lib}); + doobj($_, $module, intent => "dso", + attrs => $unified_info{attributes}->{modules}->{$module}); } 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, @@ -173,7 +173,7 @@ return "" if $cache{$bin}; my $deps = [ reducedepends(resolvedepends($bin)) ]; $OUT .= obj2bin(bin => $bin, - attrs => $unified_info{attributes}->{$bin}, + attrs => $unified_info{attributes}->{programs}->{$bin}, objs => [ @{$unified_info{sources}->{$bin}} ], deps => $deps); foreach (@{$unified_info{sources}->{$bin}}) { diff --git a/Configurations/descrip.mms.tmpl b/Configurations/descrip.mms.tmpl index 892102dd91b..e177f2202ee 100644 --- a/Configurations/descrip.mms.tmpl +++ b/Configurations/descrip.mms.tmpl @@ -48,26 +48,26 @@ @{$unified_info{libraries}}; our @install_libs = map { platform->staticname($_) } - grep { !$unified_info{attributes}->{$_}->{noinst} } + grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} } @{$unified_info{libraries}}; our @install_shlibs = map { platform->sharedname($_) // () } - grep { !$unified_info{attributes}->{$_}->{noinst} } + grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} } @{$unified_info{libraries}}; our @install_engines = - grep { !$unified_info{attributes}->{$_}->{noinst} - && $unified_info{attributes}->{$_}->{engine} } + grep { !$unified_info{attributes}->{modules}->{$_}->{noinst} + && $unified_info{attributes}->{modules}->{$_}->{engine} } @{$unified_info{modules}}; our @install_programs = - grep { !$unified_info{attributes}->{$_}->{noinst} } + grep { !$unified_info{attributes}->{programs}->{$_}->{noinst} } @{$unified_info{programs}}; our @install_bin_scripts = - grep { !$unified_info{attributes}->{$_}->{noinst} - && !$unified_info{attributes}->{$_}->{misc} } + grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst} + && !$unified_info{attributes}->{scripts}->{$_}->{misc} } @{$unified_info{scripts}}; our @install_misc_scripts = - grep { !$unified_info{attributes}->{$_}->{noinst} - && $unified_info{attributes}->{$_}->{misc} } + grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst} + && $unified_info{attributes}->{scripts}->{$_}->{misc} } @{$unified_info{scripts}}; # 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 return map { { lib => platform->sharedlib($_) // platform->staticlib($_), - attrs => $unified_info{attributes}->{$_} } + attrs => $unified_info{attributes}->{libraries}->{$_} } } @_; } @@ -1014,8 +1014,8 @@ EOF } sub obj2dso { my %args = @_; - my $dsoname = platform->dsoname($args{lib}); - my $dso = platform->dso($args{lib}); + my $dsoname = platform->dsoname($args{module}); + my $dso = platform->dso($args{module}); my @objs = map { platform->convertext($_) } grep { platform->isobj($_) } @{$args{objs}}; diff --git a/Configurations/unix-Makefile.tmpl b/Configurations/unix-Makefile.tmpl index 74b9079219f..6de2acc9e79 100644 --- a/Configurations/unix-Makefile.tmpl +++ b/Configurations/unix-Makefile.tmpl @@ -54,44 +54,44 @@ GENERATED={- # common0.tmpl provides @generated INSTALL_LIBS={- join(" ", map { platform->staticlib($_) // () } - grep { !$unified_info{attributes}->{$_}->{noinst} } + grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} } @{$unified_info{libraries}}) -} INSTALL_SHLIBS={- join(" ", map { platform->sharedlib($_) // () } - grep { !$unified_info{attributes}->{$_}->{noinst} } + grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} } @{$unified_info{libraries}}) -} INSTALL_SHLIB_INFO={- join(" ", map { my $x = platform->sharedlib($_); my $y = platform->sharedlib_simple($_); $x ? "\"$x;$y\"" : () } - grep { !$unified_info{attributes}->{$_}->{noinst} } + grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} } @{$unified_info{libraries}}) -} INSTALL_ENGINES={- join(" ", map { platform->dso($_) } - grep { !$unified_info{attributes}->{$_}->{noinst} - && $unified_info{attributes}->{$_}->{engine} } + grep { !$unified_info{attributes}->{modules}->{$_}->{noinst} + && $unified_info{attributes}->{modules}->{$_}->{engine} } @{$unified_info{modules}}) -} INSTALL_PROGRAMS={- join(" ", map { platform->bin($_) } - grep { !$unified_info{attributes}->{$_}->{noinst} } + grep { !$unified_info{attributes}->{programs}->{$_}->{noinst} } @{$unified_info{programs}}) -} BIN_SCRIPTS={- - join(" ", map { my $x = $unified_info{attributes}->{$_}->{linkname}; + join(" ", map { my $x = $unified_info{attributes}->{scripts}->{$_}->{linkname}; $x ? "$_:$x" : $_ } - grep { !$unified_info{attributes}->{$_}->{noinst} - && !$unified_info{attributes}->{$_}->{misc} } + grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst} + && !$unified_info{attributes}->{scripts}->{$_}->{misc} } @{$unified_info{scripts}}) -} MISC_SCRIPTS={- - join(" ", map { my $x = $unified_info{attributes}->{$_}->{linkname}; + join(" ", map { my $x = $unified_info{attributes}->{scripts}->{$_}->{linkname}; $x ? "$_:$x" : $_ } - grep { !$unified_info{attributes}->{$_}->{noinst} - && $unified_info{attributes}->{$_}->{misc} } + grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst} + && $unified_info{attributes}->{scripts}->{$_}->{misc} } @{$unified_info{scripts}}) -} @@ -1156,7 +1156,7 @@ EOF } sub obj2dso { my %args = @_; - my $dso = platform->dso($args{lib}); + my $dso = platform->dso($args{module}); my @linkdirs = (); foreach (@{args{deps}}) { my $d = dirname($_); diff --git a/Configurations/windows-makefile.tmpl b/Configurations/windows-makefile.tmpl index bfe88f6cc99..4a83d0cee6a 100644 --- a/Configurations/windows-makefile.tmpl +++ b/Configurations/windows-makefile.tmpl @@ -62,53 +62,53 @@ GENERATED={- # common0.tmpl provides @generated INSTALL_LIBS={- join(" ", map { quotify1(platform->sharedlib_import($_) // platform->staticlib($_)) } - grep { !$unified_info{attributes}->{$_}->{noinst} } + grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} } @{$unified_info{libraries}}) -} INSTALL_SHLIBS={- join(" ", map { my $x = platform->sharedlib($_); $x ? quotify_l($x) : () } - grep { !$unified_info{attributes}->{$_}->{noinst} } + grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} } @{$unified_info{libraries}}) -} INSTALL_SHLIBPDBS={- join(" ", map { my $x = platform->sharedlibpdb($_); $x ? quotify_l($x) : () } - grep { !$unified_info{attributes}->{$_}->{noinst} } + grep { !$unified_info{attributes}->{libraries}->{$_}->{noinst} } @{$unified_info{libraries}}) -} INSTALL_ENGINES={- join(" ", map { quotify1(platform->dso($_)) } - grep { !$unified_info{attributes}->{$_}->{noinst} - && $unified_info{attributes}->{$_}->{engine} } + grep { !$unified_info{attributes}->{modules}->{$_}->{noinst} + && $unified_info{attributes}->{modules}->{$_}->{engine} } @{$unified_info{modules}}) -} INSTALL_ENGINEPDBS={- join(" ", map { quotify1(platform->dsopdb($_)) } - grep { !$unified_info{attributes}->{$_}->{noinst} - && $unified_info{attributes}->{$_}->{engine} } + grep { !$unified_info{attributes}->{modules}->{$_}->{noinst} + && $unified_info{attributes}->{modules}->{$_}->{engine} } @{$unified_info{modules}}) -} INSTALL_PROGRAMS={- join(" ", map { quotify1(platform->bin($_)) } - grep { !$unified_info{attributes}->{$_}->{noinst} } + grep { !$unified_info{attributes}->{programs}->{$_}->{noinst} } @{$unified_info{programs}}) -} INSTALL_PROGRAMPDBS={- join(" ", map { quotify1(platform->binpdb($_)) } - grep { !$unified_info{attributes}->{$_}->{noinst} } + grep { !$unified_info{attributes}->{programs}->{$_}->{noinst} } @{$unified_info{programs}}) -} BIN_SCRIPTS={- join(" ", map { quotify1($_) } - grep { !$unified_info{attributes}->{$_}->{noinst} - && !$unified_info{attributes}->{$_}->{misc} } + grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst} + && !$unified_info{attributes}->{scripts}->{$_}->{misc} } @{$unified_info{scripts}}) -} MISC_SCRIPTS={- join(" ", map { quotify1($_) } - grep { !$unified_info{attributes}->{$_}->{noinst} - && $unified_info{attributes}->{$_}->{misc} } + grep { !$unified_info{attributes}->{scripts}->{$_}->{noinst} + && $unified_info{attributes}->{scripts}->{$_}->{misc} } @{$unified_info{scripts}}) -} @@ -714,8 +714,8 @@ EOF } sub obj2dso { my %args = @_; - my $dso = platform->dso($args{lib}); - my $dso_n = platform->dsoname($args{lib}); + my $dso = platform->dso($args{module}); + my $dso_n = platform->dsoname($args{module}); my @objs = map { platform->convertext($_) } grep { platform->isobj($_) || platform->isres($_) } @{$args{objs}}; diff --git a/Configure b/Configure index 3a29d903298..9185f5dccc2 100755 --- a/Configure +++ b/Configure @@ -1724,7 +1724,6 @@ if ($builder eq "unified") { my @modules = (); my @scripts = (); - my %attributes = (); my %sources = (); my %shared_sources = (); my %includes = (); @@ -1737,7 +1736,7 @@ if ($builder eq "unified") { # contains a dollar sign, it had better be escaped, or it will be # taken for a variable name prefix. my %variables = (); - my $variable_re = qr/\$([[:alpha:]][[:alnum:]_]*)/; + my $variable_re = qr/\$(?P[[:alpha:]][[:alnum:]_]*)/; my $expand_variables = sub { my $value = ''; my $value_rest = shift; @@ -1748,7 +1747,7 @@ if ($builder eq "unified") { } while ($value_rest =~ /(?{$g}->{$ak} = $av; + } else { + delete $$ref->{$g}->{$ak}; + } + } + } + }; + # We want to detect configdata.pm in the source tree, so we # don't use it if the build tree is different. 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) # 2 positive ELSE (following ELSIF should fail) my @skip = (); + + # A few useful generic regexps + my $index_re = qr/\[\s*(?P(?:\\.|.)*?)\s*\]/; + my $cond_re = qr/\[\s*(?P(?:\\.|.)*?)\s*\]/; + my $attribs_re = qr/(?:\{\s*(?P(?:\\.|.)*?)\s*\})?/; + my $value_re = qr/\s*(?P.*?)\s*/; collect_information( collect_from_array([ @text ], qr/\\$/ => sub { my $l1 = shift; my $l2 = shift; $l1 =~ s/\\$//; $l1.$l2 }), # Info we're looking for - qr/^\s*IF\[((?:\\.|[^\\\]])*)\]\s*$/ + qr/^\s* IF ${cond_re} \s*$/x => sub { if (! @skip || $skip[$#skip] > 0) { - push @skip, !! $expand_variables->($1); + push @skip, !! $expand_variables->($+{COND}); } else { push @skip, -1; } }, - qr/^\s*ELSIF\[((?:\\.|[^\\\]])*)\]\s*$/ + qr/^\s* ELSIF ${cond_re} \s*$/x => sub { die "ELSIF out of scope" if ! @skip; die "ELSIF following ELSE" if abs($skip[$#skip]) == 2; $skip[$#skip] = -1 if $skip[$#skip] != 0; - $skip[$#skip] = !! $expand_variables->($1) + $skip[$#skip] = !! $expand_variables->($+{COND}) if $skip[$#skip] == 0; }, - qr/^\s*ELSE\s*$/ + qr/^\s* ELSE \s*$/x => sub { die "ELSE out of scope" if ! @skip; $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; pop @skip; }, - qr/^\s*${variable_re}\s*=\s*(.*?)\s*$/ + qr/^\s* ${variable_re} \s* = ${value_re} $/x => sub { if (!@skip || $skip[$#skip] > 0) { - my $n = $1; - my $v = $2; - $variables{$n} = $expand_variables->($v); + $variables{$+{VARIABLE}} = $expand_variables->($+{VALUE}); } }, - qr/^\s*SUBDIRS\s*=\s*(.*)\s*$/ + qr/^\s* SUBDIRS \s* = ${value_re} $/x => sub { if (!@skip || $skip[$#skip] > 0) { - foreach (tokenize($expand_variables->($1))) { + foreach (tokenize($expand_variables->($+{VALUE}))) { 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 { if (!@skip || $skip[$#skip] > 0) { - my @a = tokenize($1, qr|\s*,\s*|); - my @p = tokenize($expand_variables->($2)); + my @p = tokenize($expand_variables->($+{VALUE})); 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; - } - } + $handle_attributes->($+{ATTRIBS}, + \$attributes{programs}, + @p); } }, - qr/^\s*LIBS(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/ + qr/^\s* LIBS ${attribs_re} \s* = ${value_re} $/x => sub { if (!@skip || $skip[$#skip] > 0) { - my @a = tokenize($1, qr|\s*,\s*|); - my @l = tokenize($expand_variables->($2)); + my @l = tokenize($expand_variables->($+{VALUE})); 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; - } - } + $handle_attributes->($+{ATTRIBS}, + \$attributes{libraries}, + @l); } }, - qr/^\s*MODULES(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/ + qr/^\s* MODULES ${attribs_re} \s* = ${value_re} $/x => sub { if (!@skip || $skip[$#skip] > 0) { - my @a = tokenize($1, qr|\s*,\s*|); - my @m = tokenize($expand_variables->($2)); + my @m = tokenize($expand_variables->($+{VALUE})); 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; - } - } + $handle_attributes->($+{ATTRIBS}, + \$attributes{modules}, + @m); } }, - qr/^\s*SCRIPTS(?:{([\w=]+(?:\s*,\s*[\w=]+)*)})?\s*=\s*(.*)\s*$/ + qr/^\s* SCRIPTS ${attribs_re} \s* = ${value_re} $/x => sub { if (!@skip || $skip[$#skip] > 0) { - my @a = tokenize($1, qr|\s*,\s*|); - my @s = tokenize($expand_variables->($2)); + my @s = tokenize($expand_variables->($+{VALUE})); 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; - } - } + $handle_attributes->($+{ATTRIBS}, + \$attributes{scripts}, + @s); } }, - qr/^\s*ORDINALS\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/, - => sub { push @{$ordinals{$expand_variables->($1)}}, - tokenize($expand_variables->($2)) + qr/^\s* ORDINALS ${index_re} = ${value_re} $/x + => sub { push @{$ordinals{$expand_variables->($+{INDEX})}}, + tokenize($expand_variables->($+{VALUE})) if !@skip || $skip[$#skip] > 0 }, - qr/^\s*SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ - => sub { push @{$sources{$expand_variables->($1)}}, - tokenize($expand_variables->($2)) + qr/^\s* SOURCE ${index_re} = ${value_re} $/x + => sub { push @{$sources{$expand_variables->($+{INDEX})}}, + tokenize($expand_variables->($+{VALUE})) if !@skip || $skip[$#skip] > 0 }, - qr/^\s*SHARED_SOURCE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ - => sub { push @{$shared_sources{$expand_variables->($1)}}, - tokenize($expand_variables->($2)) + qr/^\s* SHARED_SOURCE ${index_re} = ${value_re} $/x + => sub { push @{$shared_sources{$expand_variables->($+{INDEX})}}, + tokenize($expand_variables->($+{VALUE})) if !@skip || $skip[$#skip] > 0 }, - qr/^\s*INCLUDE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ - => sub { push @{$includes{$expand_variables->($1)}}, - tokenize($expand_variables->($2)) + qr/^\s* INCLUDE ${index_re} = ${value_re} $/x + => sub { push @{$includes{$expand_variables->($+{INDEX})}}, + tokenize($expand_variables->($+{VALUE})) if !@skip || $skip[$#skip] > 0 }, - qr/^\s*DEFINE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ - => sub { push @{$defines{$expand_variables->($1)}}, - tokenize($expand_variables->($2)) + qr/^\s* DEFINE ${index_re} = ${value_re} $/x + => sub { push @{$defines{$expand_variables->($+{INDEX})}}, + tokenize($expand_variables->($+{VALUE})) if !@skip || $skip[$#skip] > 0 }, - qr/^\s*DEPEND\[((?:\\.|[^\\\]])*)\]\s*=\s*(.*)\s*$/ - => sub { push @{$depends{$expand_variables->($1)}}, - tokenize($expand_variables->($2)) + qr/^\s* DEPEND ${index_re} = ${value_re} $/x + => sub { push @{$depends{$expand_variables->($+{INDEX})}}, + tokenize($expand_variables->($+{VALUE})) if !@skip || $skip[$#skip] > 0 }, - qr/^\s*GENERATE\[((?:\\.|[^\\\]])+)\]\s*=\s*(.*)\s*$/ - => sub { push @{$generate{$expand_variables->($1)}}, $2 + qr/^\s* GENERATE ${index_re} = ${value_re} $/x + => sub { push @{$generate{$expand_variables->($+{INDEX})}}, + $+{VALUE} if !@skip || $skip[$#skip] > 0 }, - qr/^\s*(?:#.*)?$/ => sub { }, + qr/^\s* (?:\#.*)? $/x => sub { }, "OTHERWISE" => sub { die "Something wrong with this line:\n$_\nat $sourced/$f" }, "BEFORE" => sub { if ($buildinfo_debug) { @@ -1949,7 +1946,7 @@ if ($builder eq "unified") { ); die "runaway IF?" if (@skip); - if (grep { defined $attributes{$_}->{engine} } keys %attributes + if (grep { defined $attributes{modules}->{$_}->{engine} } keys %attributes and !$config{dynamic_engines}) { die <<"EOF" 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 } - foreach (keys %attributes) { - my $dest = $_; - my $ddest = cleanfile($buildd, $_, $blddir); - foreach (keys %{$attributes{$dest} // {}}) { - $unified_info{attributes}->{$ddest}->{$_} = - $attributes{$dest}->{$_}; - } - } - { my %infos = ( programs => [ @programs ], libraries => [ @libraries ], @@ -1975,6 +1963,11 @@ EOF foreach (@{$infos{$k}}) { my $item = cleanfile($buildd, $_, $blddir); $unified_info{$k}->{$item} = 1; + + # Fix up associated attributes + $unified_info{attributes}->{$k}->{$item} = + $attributes{$k}->{$_} + if defined $attributes{$k}->{$_}; } } } -- 2.47.2