Commit 0ad1d94d authored by Richard Levitte's avatar Richard Levitte
Browse files

Add developer targets for each subdirectory we have something to build in



Previous build scheme allowed building just the stuff in one
subdirectory, like this:

    make -C crypto/aes

Because the unified only has a top-level Makefile, this is not
possible with it.  This change adds a replacement where each directory
we have something to build in becomes a target in its own right,
allowing building something like this:

    make crypto/aes

The exception is the directory test, because we already have such a
target.

Reviewed-by: default avatarStephen Henson <steve@openssl.org>
parent 578b5514
Loading
Loading
Loading
Loading
+44 −2
Original line number Diff line number Diff line
{- # -*- Mode: perl -*-

 use File::Basename;

 # A cache of objects for which a recipe has already been generated
 my %cache;

@@ -158,9 +160,47 @@
     $cache{$script} = 1;
 }

 sub dodir {
     my $dir = shift;
     return "" if !exists(&generatedir) or $cache{$dir};
     $OUT .= generatedir(dir => $dir,
                         deps => $unified_info{dirinfo}->{$dir}->{deps},
                         %{$unified_info{dirinfo}->{$_}->{products}});
     $cache{$dir} = 1;
 }

 # Start with populating the cache with all the overrides
 %cache = map { $_ => 1 } @{$unified_info{overrides}};

 # For convenience collect information regarding directories where
 # files are generated, those generated files and the end product
 # they end up in where applicable.  Then, add build rules for those
 # directories
 if (exists &generatedir) {
     my %loopinfo = ( "dso" => [ @{$unified_info{engines}} ],
                      "lib" => [ @{$unified_info{libraries}} ],
                      "bin" => [ @{$unified_info{programs}} ],
                      "script" => [ @{$unified_info{scripts}} ] );
     foreach my $type (keys %loopinfo) {
         foreach my $product (@{$loopinfo{$type}}) {
             my %dirs = ();
             my $pd = dirname($product);
             foreach (@{$unified_info{sources}->{$product}}) {
                 my $d = dirname($_);
                 next if $d eq "test";    # we already have a test target
                 next if $d eq ".";       # current directory is just silly
                 $dirs{$d} = 1;
                 push @{$unified_info{dirinfo}->{$d}->{deps}}, $_
                     if $d ne $pd;
             }
             foreach (keys %dirs) {
                 push @{$unified_info{dirinfo}->{$_}->{products}->{$type}},
                 $product;
             }
         }
     }
 }

 # Build all known libraries, engines, programs and scripts.
 # Everything else will be handled as a consequence.
 foreach (@{$unified_info{libraries}}) { dolib($_);    }
@@ -168,6 +208,8 @@
 foreach (@{$unified_info{programs}})  { dobin($_);    }
 foreach (@{$unified_info{scripts}})   { doscript($_); }

 foreach (sort keys %{$unified_info{dirinfo}})  { dodir($_); }

 # Finally, should there be any applicable BEGINRAW/ENDRAW sections,
 # they are added here.
 $OUT .= $_."\n" foreach @{$unified_info{rawlines}};
+35 −0
Original line number Diff line number Diff line
@@ -1052,6 +1052,41 @@ $script: $sources
	\$(PERL) "-I\$(BLDDIR)" -Mconfigdata "$dofile" \\
	    "-o$target{build_file}" $sources > "$script"
	chmod a+x $script
EOF
  }
  sub generatedir {
      my %args = @_;
      my $dir = $args{dir};
      my @deps = map { s|\.o$|$objext|; $_ } @{$args{deps}};
      my @actions = ();
      my %extinfo = ( dso => $dsoext,
                      lib => $libext,
                      bin => $exeext );

      foreach my $type (("dso", "lib", "bin", "script")) {
          next unless defined($unified_info{dirinfo}->{$dir}->{products}->{$type});
          if ($type eq "lib") {
              foreach my $lib (@{$unified_info{dirinfo}->{$dir}->{products}->{$type}}) {
                  push @actions, <<"EOF";
	\$(AR) $lib$libext \$\?
	\$(RANLIB) $lib$libext || echo Never mind.
EOF
              }
          } else {
              foreach my $prod (@{$unified_info{dirinfo}->{$dir}->{products}->{$type}}) {
                  if (dirname($prod) eq $dir) {
                      push @deps, $prod.$extinfo{$type};
                  } else {
                      push @actions, "\t@ : No support to produce $type ".join(", ", @{$unified_info{dirinfo}->{$dir}->{products}->{$type}});
                  }
              }
          }
      }

      my $deps = join(" ", @deps);
      my $actions = join("\n", "", @actions);
      return <<"EOF";
$args{dir} $args{dir}/: $deps$actions
EOF
  }
  ""    # Important!  This becomes part of the template result.
+36 −0
Original line number Diff line number Diff line
@@ -488,6 +488,42 @@ EOF
$script: $sources
	"\$(PERL)" "-I\$(BLDDIR)" -Mconfigdata "$dofile" \\
	    "-o$target{build_file}" $sources > "$script"
EOF
  }
  sub generatedir {
      my %args = @_;
      my $dir = $args{dir};
      my @deps = map { s|\.o$|$objext|; $_ } @{$args{deps}};
      my @actions = ();
      my %extinfo = ( dso => $dsoext,
                      lib => $libext,
                      bin => $exeext );

      foreach my $type (("dso", "lib", "bin", "script")) {
          next unless defined($unified_info{dirinfo}->{$dir}->{products}->{$type});
          if ($type eq "lib") {
              foreach my $lib (@{$unified_info{dirinfo}->{$dir}->{products}->{$type}}) {
                  push @actions, <<"EOF";
	\$(AR) \$(ARFLAGS) \$(AROUTFLAG)$lib$libext @<<
\$\?
<<
EOF
              }
          } else {
              foreach my $prod (@{$unified_info{dirinfo}->{$dir}->{products}->{$type}}) {
                  if (dirname($prod) eq $dir) {
                      push @deps, $prod.$extinfo{$type};
                  } else {
                      push @actions, "\t@ : No support to produce $type ".join(", ", @{$unified_info{dirinfo}->{$dir}->{products}->{$type}});
                  }
              }
          }
      }

      my $deps = join(" ", @deps);
      my $actions = join("\n", "", @actions);
      return <<"EOF";
$args{dir} $args{dir}\\ : $deps$actions
EOF
  }
  ""    # Important!  This becomes part of the template result.