build.info: Add the possibility to add dependencies on raw targets
authorRichard Levitte <levitte@openssl.org>
Thu, 25 Feb 2021 15:55:39 +0000 (16:55 +0100)
committerRichard Levitte <levitte@openssl.org>
Wed, 3 Mar 2021 13:47:01 +0000 (14:47 +0100)
We need to add something for the 'tests' target to depend on, so a
special syntax for those is introduced:

    DEPEND[|tests|]=fipsmodule.cnf

Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/14320)

Configurations/common.tmpl
Configurations/descrip.mms.tmpl
Configurations/unix-Makefile.tmpl
Configurations/windows-makefile.tmpl
Configure
doc/internal/man7/build.info.pod

index 5db3471fe2158a08277d672aa21c7735603cb0b1..e25a61fbedc16bb879e04fbef9acaa154488dfb2 100644 (file)
  # generated source file.
  sub dogenerate {
      my $src = shift;
+     # Safety measure
+     return "" unless defined $unified_info{generate}->{$_};
      return "" if $cache{$src};
      my $obj = shift;
      my $bin = shift;
      $cache{$src} = 1;
  }
 
+ sub dotarget {
+     my $target = shift;
+     return "" if $cache{$target};
+     $OUT .= generatetarget(target => $target,
+                            deps => $unified_info{depends}->{$target});
+     foreach (@{$unified_info{depends}->{$target}}) {
+         dogenerate($_);
+     }
+     $cache{$target} = 1;
+ }
+
  # doobj is responsible for producing all the recipes that build
  # object files as well as dependency files.
  sub doobj {
  # Start with populating the cache with all the overrides
  %cache = map { $_ => 1 } @{$unified_info{overrides}};
 
- # Build mandatory generated headers
+ # Build mandatory header file generators
  foreach (@{$unified_info{depends}->{""}}) { dogenerate($_); }
 
- # Build all known libraries, modules, programs and scripts.
+ # Build all known targets, libraries, modules, programs and scripts.
  # Everything else will be handled as a consequence.
+ foreach (@{$unified_info{targets}})   { dotarget($_); }
  foreach (@{$unified_info{libraries}}) { dolib($_);    }
  foreach (@{$unified_info{modules}})   { domodule($_); }
  foreach (@{$unified_info{programs}})  { dobin($_);    }
index 3f015a0eb5b8479a8a6f18368bfe09ec2041a2af..abc344594de5101dd68d2a9cb2609fe8b57f8695 100644 (file)
@@ -795,6 +795,14 @@ reconfigure reconf :
       return ([ @before ], [ @after ]);
   }
 
+  sub generatetarget {
+      my %args = @_;
+      my $deps = join(" ", @{$args{deps}});
+      return <<"EOF";
+$args{target} : $deps
+EOF
+  }
+
   sub generatesrc {
       my %args = @_;
       my $generator = join(" ", @{$args{generator}});
index aa4b3ec0ec432af18a6744ce11b2b02d30472546..610a6f65579fd32ee25d160123f80c2d2a7b1306 100644 (file)
@@ -1305,6 +1305,14 @@ reconfigure reconf:
                  } @_;
   }
 
+  sub generatetarget {
+      my %args = @_;
+      my $deps = join(" ", @{$args{deps}});
+      return <<"EOF";
+$args{target}: $deps
+EOF
+  }
+
   sub generatesrc {
       my %args = @_;
       my $generator = join(" ", @{$args{generator}});
index ce042d6ee82363378fcb7a47720e3ebd8f914519..f19efba7d1b1ffccfcf1207c72b7dc5dce463025 100644 (file)
@@ -627,6 +627,14 @@ reconfigure reconf:
      return map { platform->sharedlib_import($_) // platform->staticlib($_) } @_;
  }
 
+  sub generatetarget {
+      my %args = @_;
+      my $deps = join(" ", @{$args{deps}});
+      return <<"EOF";
+$args{target}: $deps
+EOF
+  }
+
   sub generatesrc {
       my %args = @_;
       my ($gen0, @gens) = @{$args{generator}};
index 12911d988ab10d16c17ff350a9a5112614e57468..e24564311eaf04865221d05e2a807ad843ecb743 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -2330,12 +2330,22 @@ EOF
 
         foreach (keys %depends) {
             my $dest = $_;
-            my $ddest = $dest eq "" ? "" : cleanfile($sourced, $_, $blddir);
+            my $ddest = $dest;
+
+            if ($dest =~ /^\|(.*)\|$/) {
+                # Collect the raw target
+                $unified_info{targets}->{$1} = 1;
+                $ddest = $1;
+            } elsif ($dest eq '') {
+                $ddest = '';
+            } else {
+                $ddest = cleanfile($sourced, $_, $blddir);
 
-            # If the destination doesn't exist in source, it can only be
-            # a generated file in the build tree.
-            if ($ddest ne "" && ($ddest eq $src_configdata || ! -f $ddest)) {
-                $ddest = cleanfile($buildd, $_, $blddir);
+                # If the destination doesn't exist in source, it can only be
+                # a generated file in the build tree.
+                if ($ddest eq $src_configdata || ! -f $ddest) {
+                    $ddest = cleanfile($buildd, $_, $blddir);
+                }
             }
             foreach (@{$depends{$dest}}) {
                 my $d = cleanfile($sourced, $_, $blddir);
@@ -2628,7 +2638,7 @@ EOF
 
     ### Make unified_info a bit more efficient
     # One level structures
-    foreach (("programs", "libraries", "modules", "scripts")) {
+    foreach (("programs", "libraries", "modules", "scripts", "targets")) {
         $unified_info{$_} = [ sort keys %{$unified_info{$_}} ];
     }
     # Two level structures
index 5a2fdd13eda1e109026eb1b6917f6fa6189dc58b..9acfd02a8d588ae4f882b15cc1f1691ceefb3772 100644 (file)
@@ -444,6 +444,12 @@ rather than the specific I<items>.
 The I<items> may be any program, library, module, script, or any
 filename used as a value anywhere.
 
+The I<items> may also be literal build file targets.  Those are
+recognised by being surrounded be vertical bars (also known as the
+"pipe" character), C<|>.  For example:
+
+    DEPEND[|tests|]=fipsmodule.cnf
+
 B<DEPEND> statements may have attributes, which apply to each
 individual dependency in such a statement.  For example: