From: Richard Levitte Date: Tue, 18 May 2021 16:21:51 +0000 (+0200) Subject: build.info: Make it possible to set attributes on SOURCE / SHARED_SOURCE stmts X-Git-Tag: openssl-3.0.0-alpha17~31 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=dd05c7938d70b620204f2808812f3bf7c535db48;p=thirdparty%2Fopenssl.git build.info: Make it possible to set attributes on SOURCE / SHARED_SOURCE stmts Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/15332) --- diff --git a/Configure b/Configure index cd40abedf7a..635dc1c84e3 100755 --- a/Configure +++ b/Configure @@ -2186,14 +2186,14 @@ if ($builder eq "unified") { undef, undef, tokenize($expand_variables->($+{VALUE}))) if !@skip || $skip[$#skip] > 0; }, - qr/^\s* SOURCE ${index_re} = ${value_re} $/x + qr/^\s* SOURCE ${index_re} ${attribs_re} = ${value_re} $/x => sub { $push_to->(\%sources, $expand_variables->($+{INDEX}), - undef, undef, + \$attributes{sources}, $+{ATTRIBS}, tokenize($expand_variables->($+{VALUE}))) if !@skip || $skip[$#skip] > 0; }, - qr/^\s* SHARED_SOURCE ${index_re} = ${value_re} $/x + qr/^\s* SHARED_SOURCE ${index_re} ${attribs_re} = ${value_re} $/x => sub { $push_to->(\%shared_sources, $expand_variables->($+{INDEX}), - undef, undef, + \$attributes{sources}, $+{ATTRIBS}, tokenize($expand_variables->($+{VALUE}))) if !@skip || $skip[$#skip] > 0; }, qr/^\s* INCLUDE ${index_re} = ${value_re} $/x @@ -2279,10 +2279,10 @@ EOF if ($s eq $src_configdata || $generate{$_} || ! -f $s) { $s = cleanfile($buildd, $_, $blddir); } + my $o = $_; # We recognise C++, C and asm files if ($s =~ /\.(cc|cpp|c|s|S)$/) { push @{$check_exist{$s}}, $ddest; - my $o = $_; $o =~ s/\.[csS]$/.o/; # C and assembler $o =~ s/\.(cc|cpp)$/_cc.o/; # C++ $o = cleanfile($buildd, $o, $blddir); @@ -2291,7 +2291,6 @@ EOF } elsif ($s =~ /\.rc$/) { # We also recognise resource files push @{$check_exist{$s}}, $ddest; - my $o = $_; $o =~ s/\.rc$/.res/; # Resource configuration $o = cleanfile($buildd, $o, $blddir); $unified_info{sources}->{$ddest}->{$o} = -1; @@ -2300,6 +2299,17 @@ EOF push @{$check_exist{$s}}, $ddest; $unified_info{sources}->{$ddest}->{$s} = 1; } + # Fix up associated attributes + if ($o ne $_) { + $unified_info{attributes}->{sources}->{$ddest}->{$o} = + $unified_info{attributes}->{sources}->{$o}->{$s} = + $attributes{sources}->{$dest}->{$_} + if defined $attributes{sources}->{$dest}->{$_}; + } else { + $unified_info{attributes}->{sources}->{$ddest}->{$s} = + $attributes{sources}->{$dest}->{$_} + if defined $attributes{sources}->{$dest}->{$_}; + } } } @@ -2315,10 +2325,10 @@ EOF $s = cleanfile($buildd, $_, $blddir); } + my $o = $_; if ($s =~ /\.(cc|cpp|c|s|S)$/) { # We recognise C++, C and asm files push @{$check_exist{$s}}, $ddest; - my $o = $_; $o =~ s/\.[csS]$/.o/; # C and assembler $o =~ s/\.(cc|cpp)$/_cc.o/; # C++ $o = cleanfile($buildd, $o, $blddir); @@ -2327,7 +2337,6 @@ EOF } elsif ($s =~ /\.rc$/) { # We also recognise resource files push @{$check_exist{$s}}, $ddest; - my $o = $_; $o =~ s/\.rc$/.res/; # Resource configuration $o = cleanfile($buildd, $o, $blddir); $unified_info{shared_sources}->{$ddest}->{$o} = -1; @@ -2336,11 +2345,22 @@ EOF # We also recognise linker scripts (or corresponding) # We know they are generated files push @{$check_exist{$s}}, $ddest; - my $ld = cleanfile($buildd, $_, $blddir); - $unified_info{shared_sources}->{$ddest}->{$ld} = 1; + $o = cleanfile($buildd, $_, $blddir); + $unified_info{shared_sources}->{$ddest}->{$o} = 1; } else { die "unrecognised source file type for shared library: $s\n"; } + # Fix up associated attributes + if ($o ne $_) { + $unified_info{attributes}->{shared_sources}->{$ddest}->{$o} = + $unified_info{attributes}->{sources}->{$o}->{$s} = + $attributes{sources}->{$dest}->{$_} + if defined $attributes{sources}->{$dest}->{$_}; + } else { + $unified_info{attributes}->{shared_sources}->{$ddest}->{$o} = + $attributes{sources}->{$dest}->{$_} + if defined $attributes{sources}->{$dest}->{$_}; + } } } @@ -2644,6 +2664,19 @@ EOF $unified_info{$dst}->{$prod}->{$newobj} = 1; foreach my $src (@{$prod_sources{$_}}) { $unified_info{sources}->{$newobj}->{$src} = 1; + # Adjust source attributes + my $attrs = $unified_info{attributes}->{sources}; + if (defined $attrs->{$prod} + && defined $attrs->{$prod}->{$_}) { + $attrs->{$prod}->{$newobj} = + $attrs->{$prod}->{$_}; + delete $attrs->{$prod}->{$_}; + } + foreach my $objsrc (keys %{$attrs->{$_} // {}}) { + $attrs->{$newobj}->{$objsrc} = + $attrs->{$_}->{$objsrc}; + delete $attrs->{$_}->{$objsrc}; + } } # Adjust dependencies foreach my $deps (keys %{$unified_info{depends}->{$_}}) { diff --git a/doc/internal/man7/build.info.pod b/doc/internal/man7/build.info.pod index c959f1060d7..8c651b37e67 100644 --- a/doc/internal/man7/build.info.pod +++ b/doc/internal/man7/build.info.pod @@ -492,6 +492,17 @@ Static libraries may be sources. In that case, its object files are used directly when building I instead of relying on library dependency and symbol resolution (through B statements). +B statements may have attributes, which apply to each +individual dependency in such a statement. For example: + + SOURCE[prog]=prog_a.c + SOURCE[prog]{check}=prog_b.c prog_c.c + +With those statements, the association between C and C +comes with no extra attributes, while the association between C +and C as well as C comes with the extra attribute +C. + =item BIB<]> B<=> I ... Collects filenames that will be used as source files for I. @@ -501,6 +512,9 @@ given with B or B. For libraries, the given filenames are only used for their shared form, so if the item is a library name ending with C<.a>, the filenames will be ignored. +B statements may have attributes, just as B +statements. + =item BIB<]> B<=> I[B<=>I] ... Collects I / I pairs (or just I with no defined