Ugly hack to avoid recompiling the same thing multiple times in parallel.
[openssl.git] / util / pl / unix.pl
index b8a218db737b44a82bca97c19336d89e95acee30..b76981dc55d1bee5ccd213b8ebdd9c59037d93fe 100644 (file)
@@ -26,6 +26,7 @@ else
                { $cflags="-O"; }
        }
 $obj='.o';
+$asm_suffix='.s';
 $ofile='-o ';
 
 # EXE linking stuff
@@ -69,6 +70,7 @@ $bf_enc_src="";
          'rc4-x86_64' => 'crypto/rc4',
          'rc4-md5-x86_64' => 'crypto/rc4',
          'ghash-x86_64' => 'crypto/modes',
+          'aesni-gcm-x86_64' => 'crypto/modes',
          );
 
 # If I were feeling more clever, these could probably be extracted
@@ -187,13 +189,18 @@ sub fixtests
 
 sub fixdeps
   {
-  my ($str) = @_;
+  my ($str, $fakes) = @_;
 
   my @t = split(/\s+/, $str);
   $str = '';
   foreach my $t (@t)
     {
     $str .= ' ' if $str ne '';
+    if (exists($fakes->{$t}))
+      {
+      $str .= $fakes->{$t};
+      next;
+      }
     if ($t =~ /^[^\/]+$/)
       {
       $str .= '$(TEST_D)/' . $t;
@@ -262,6 +269,8 @@ sub get_tests
   my %targets;
   my %deps;
   my %tests;
+  my %alltests;
+  my %fakes;
   while (my $line = <M>)
     {
     chomp $line;
@@ -276,14 +285,30 @@ sub get_tests
       foreach my $t (@t)
        {
        $targets{$t} = '';
+       $alltests{$t} = undef;
         }
       }
 
-    if (($line =~ /^(\S+):(.*)$/ && exists $targets{$1})
-       || $line =~ /^(test_ss .*):(.*)/)
+    if (($line =~ /^(?<t>\S+):(?<d>.*)$/ && exists $targets{$1})
+       || $line =~ /^(?<t>test_(ss|gen) .*):(?<d>.*)/)
       {
-      my $t = $1;
-      $deps{$t} = $2;
+      my $t = $+{t};
+      my $d = $+{d};
+      # If there are multiple targets stupid FreeBSD make runs the
+      # rules once for each dependency that matches one of the
+      # targets. Running the same rule twice concurrently causes
+      # breakage, so replace with a fake target.
+      if ($t =~ /\s/)
+        {
+       ++$fake;
+       my @targets = split /\s+/, $t;
+       $t = "_fake$fake";
+       foreach my $f (@targets)
+         {
+         $fakes{$f} = $t;
+         }
+       }
+      $deps{$t} = $d;
       $deps{$t} =~ s/#.*$//;
       for (;;)
        {
@@ -302,10 +327,10 @@ sub get_tests
       }
     }
 
-  delete $targets{test_jpake} if $no_jpake;
+  delete $alltests{test_jpake} if $no_jpake;
   delete $targets{test_ige} if $no_ige;
-  delete $targets{test_md2} if $no_md2;
-  delete $targets{test_rc5} if $no_rc5;
+  delete $alltests{test_md2} if $no_md2;
+  delete $alltests{test_rc5} if $no_rc5;
 
   my $tests;
   foreach my $t (keys %tests)
@@ -313,27 +338,16 @@ sub get_tests
     $tests .= "$t = $tests{$t}\n";
     }
 
-  my $all = 'test:';
   my $each;
   foreach my $t (keys %targets)
     {
     next if $t eq '';
 
-    if ($t =~ /^test_ss/)
-      {
-      $t =~ s/\s+/ \$(TEST_D)\//g;
-      $all .= ' test_ss';
-      }
-    else
-      {
-      $all .= " $t";
-      }
-
     my $d = $deps{$t};
     $d =~ s/\.\.\/apps/\$(BIN_D)/g;
     $d =~ s/\.\.\/util/\$(TEST_D)/g;
     $d = fixtests($d, \%tests);
-    $d = fixdeps($d);
+    $d = fixdeps($d, \%fakes);
 
     my $r = $targets{$t};
     $r =~ s/\.\.\/apps/..\/\$(BIN_D)/g;
@@ -341,12 +355,15 @@ sub get_tests
     $r =~ s/\.\.\/(\S+)/\$(SRC_D)\/$1/g;
     $r = fixrules($r);
 
-    $each .= "$t: test_scripts $d\n$r\n";
+    next if $r eq '';
+
+    $t =~ s/\s+/ \$(TEST_D)\//g;
+
+    $each .= "$t: test_scripts $d\n\t\@echo '$t test started'\n$r\t\@echo '$t test done'\n\n";
     }
 
   # FIXME: Might be a clever way to figure out what needs copying
   my @copies = ( 'bctest',
-                'evptests.txt',
                 'testgen',
                 'cms-test.pl',
                 'tx509',
@@ -375,6 +392,7 @@ sub get_tests
                 'trsa',
                 'testrsa.pem',
                 'testsid.pem',
+                'testss',
               );
   my $copies = copy_scripts(1, 'test', @copies);
   $copies .= copy_scripts(0, 'test', ('smcont.txt'));
@@ -389,10 +407,25 @@ sub get_tests
             );
   $copies .= copy_scripts(1, 'apps', @apps);
 
-  $scripts = "test_scripts: \$(TEST_D)/CA.sh \$(TEST_D)/opensslwrap.sh \$(TEST_D)/openssl.cnf ocsp smime\n";
+  $copies .= copy_scripts(1, 'crypto/evp', ('evptests.txt'));
+
+  $scripts = "test_scripts: \$(TEST_D)/CA.sh \$(TEST_D)/opensslwrap.sh \$(TEST_D)/openssl.cnf \$(TEST_D)/shlib_wrap.sh ocsp smime\n";
   $scripts .= "\nocsp:\n\tcp -R test/ocsp-tests \$(TEST_D)\n";
   $scripts .= "\smime:\n\tcp -R test/smime-certs \$(TEST_D)\n";
 
+  my $all = 'test:';
+  foreach my $t (keys %alltests)
+    {
+    if (exists($fakes{$t}))
+      {
+      $all .= " $fakes{$t}";
+      }
+    else
+      {
+      $all .= " $t";
+      }
+    }
+
   return "$scripts\n$copies\n$tests\n$all\n\n$each";
   }