diff options
author | Richard Levitte <levitte@openssl.org> | 2021-05-18 18:21:51 +0200 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2021-05-19 19:03:16 +0200 |
commit | dd05c7938d70b620204f2808812f3bf7c535db48 (patch) | |
tree | 2a7f1df5b485225113b4976293609e28ac58eff9 | |
parent | speed: Document the deficiencies of the command (diff) | |
download | openssl-dd05c7938d70b620204f2808812f3bf7c535db48.tar.xz openssl-dd05c7938d70b620204f2808812f3bf7c535db48.zip |
build.info: Make it possible to set attributes on SOURCE / SHARED_SOURCE stmts
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/15332)
-rwxr-xr-x | Configure | 53 | ||||
-rw-r--r-- | doc/internal/man7/build.info.pod | 14 |
2 files changed, 57 insertions, 10 deletions
@@ -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 c959f1060d..8c651b37e6 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<item> instead of relying on library dependency and symbol resolution (through B<DEPEND> statements). +B<SOURCE> 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<prog> and C<prog_a.c> +comes with no extra attributes, while the association between C<prog> +and C<prog_b.c> as well as C<prog_c.c> comes with the extra attribute +C<check>. + =item B<SHARED_SOURCE[>I<item>B<]> B<=> I<file> ... Collects filenames that will be used as source files for I<item>. @@ -501,6 +512,9 @@ given with B<LIBS> or B<MODULES>. 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<SHARED_SOURCE> statements may have attributes, just as B<SOURCE> +statements. + =item B<DEFINE[>I<items>B<]> B<=> I<name>[B<=>I<value>] ... Collects I<name> / I<value> pairs (or just I<name> with no defined |