d722e051ba954f3cdc4ae1765f7a368433244512
[openssl.git] / util / pl / unix.pl
1 #!/usr/local/bin/perl
2 #
3 # unix.pl - the standard unix makefile stuff.
4 #
5
6 $o='/';
7 $cp='/bin/cp';
8 $rm='/bin/rm -f';
9
10 # C compiler stuff
11
12 if ($gcc)
13         {
14         $cc='gcc';
15         if ($debug)
16                 { $cflags="-g2 -ggdb"; }
17         else
18                 { $cflags="-O3 -fomit-frame-pointer"; }
19         }
20 else
21         {
22         $cc='cc';
23         if ($debug)
24                 { $cflags="-g"; }
25         else
26                 { $cflags="-O"; }
27         }
28 $obj='.o';
29 $ofile='-o ';
30
31 # EXE linking stuff
32 $link='${CC}';
33 $lflags='${CFLAG}';
34 $efile='-o ';
35 $exep='';
36 $ex_libs="";
37
38 # static library stuff
39 $mklib='ar r';
40 $mlflags='';
41 $ranlib=&which("ranlib") or $ranlib="true";
42 $plib='lib';
43 $libp=".a";
44 $shlibp=".a";
45 $lfile='';
46
47 $asm='as';
48 $afile='-o ';
49 $bn_asm_obj="";
50 $bn_asm_src="";
51 $des_enc_obj="";
52 $des_enc_src="";
53 $bf_enc_obj="";
54 $bf_enc_src="";
55
56 %perl1 = (
57           'md5-x86_64' => 'crypto/md5',
58           'x86_64-mont' => 'crypto/bn',
59           'x86_64-mont5' => 'crypto/bn',
60           'x86_64-gf2m' => 'crypto/bn',
61           'modexp512-x86_64' => 'crypto/bn',
62           'aes-x86_64' => 'crypto/aes',
63           'vpaes-x86_64' => 'crypto/aes',
64           'bsaes-x86_64' => 'crypto/aes',
65           'aesni-x86_64' => 'crypto/aes',
66           'aesni-sha1-x86_64' => 'crypto/aes',
67           'sha1-x86_64' => 'crypto/sha',
68           'e_padlock-x86_64' => 'engines',
69           'rc4-x86_64' => 'crypto/rc4',
70           'rc4-md5-x86_64' => 'crypto/rc4',
71           'ghash-x86_64' => 'crypto/modes',
72           'aesni-gcm-x86_64' => 'crypto/modes',
73          );
74
75 # If I were feeling more clever, these could probably be extracted
76 # from makefiles.
77 sub platform_perlasm_compile_target
78         {
79         local($target, $source, $bname) = @_;
80
81         for $p (keys %perl1)
82                 {
83                 if ($target eq "\$(OBJ_D)/$p.o")
84                         {
85                         return << "EOF";
86 \$(TMP_D)/$p.s: $perl1{$p}/asm/$p.pl
87         \$(PERL) $perl1{$p}/asm/$p.pl \$(PERLASM_SCHEME) > \$@
88 EOF
89                         }
90                 }
91         if ($target eq '$(OBJ_D)/x86_64cpuid.o')
92                 {
93                 return << 'EOF';
94 $(TMP_D)/x86_64cpuid.s: crypto/x86_64cpuid.pl
95         $(PERL) crypto/x86_64cpuid.pl $(PERLASM_SCHEME) > $@
96 EOF
97                 }
98         elsif ($target eq '$(OBJ_D)/sha256-x86_64.o')
99                 {
100                 return << 'EOF';
101 $(TMP_D)/sha256-x86_64.s: crypto/sha/asm/sha512-x86_64.pl
102         $(PERL) crypto/sha/asm/sha512-x86_64.pl $(PERLASM_SCHEME) $@
103 EOF
104                 }
105         elsif ($target eq '$(OBJ_D)/sha512-x86_64.o')
106                 {
107                 return << 'EOF';
108 $(TMP_D)/sha512-x86_64.s: crypto/sha/asm/sha512-x86_64.pl
109         $(PERL) crypto/sha/asm/sha512-x86_64.pl $(PERLASM_SCHEME) $@
110 EOF
111                 }
112         elsif ($target eq '$(OBJ_D)/sha512-x86_64.o')
113                 {
114                 return << 'EOF';
115 $(TMP_D)/sha512-x86_64.s: crypto/sha/asm/sha512-x86_64.pl
116         $(PERL) crypto/sha/asm/sha512-x86_64.pl $(PERLASM_SCHEME) $@
117 EOF
118                 }
119
120         die $target;
121         }
122
123 sub special_compile_target
124         {
125         local($target) = @_;
126
127         if ($target eq 'crypto/bn/x86_64-gcc')
128                 {
129                 return << "EOF";
130 \$(TMP_D)/x86_64-gcc.o: crypto/bn/asm/x86_64-gcc.c
131         \$(CC) \$(CFLAGS) -c -o \$@ crypto/bn/asm/x86_64-gcc.c
132 EOF
133                 }
134         return undef;
135         }
136
137 sub do_lib_rule
138         {
139         local($obj,$target,$name,$shlib)=@_;
140         local($ret,$_,$Name);
141
142         $target =~ s/\//$o/g if $o ne '/';
143         $target="$target";
144         ($Name=$name) =~ tr/a-z/A-Z/;
145
146         $ret.="$target: \$(${Name}OBJ)\n";
147         $ret.="\t\$(RM) $target\n";
148         $ret.="\t\$(MKLIB) $target \$(${Name}OBJ)\n";
149         $ret.="\t\$(RANLIB) $target\n\n";
150         }
151
152 sub do_link_rule
153         {
154         local($target,$files,$dep_libs,$libs)=@_;
155         local($ret,$_);
156
157         $file =~ s/\//$o/g if $o ne '/';
158         $n=&bname($target);
159         $ret.="$target: $files $dep_libs\n";
160         $ret.="\t\$(LINK) ${efile}$target \$(LFLAGS) $files $libs\n\n";
161         return($ret);
162         }
163
164 sub which
165         {
166         my ($name)=@_;
167         my $path;
168         foreach $path (split /:/, $ENV{PATH})
169                 {
170                 if (-x "$path/$name")
171                         {
172                         return "$path/$name";
173                         }
174                 }
175         }
176
177 sub fixtests
178   {
179   my ($str, $tests) = @_;
180
181   foreach my $t (keys %$tests)
182     {
183     $str =~ s/(\.\/)?\$\($t\)/\$(TEST_D)\/$tests->{$t}/g;
184     }
185
186   return $str;
187   }
188
189 sub fixdeps
190   {
191   my ($str) = @_;
192
193   my @t = split(/\s+/, $str);
194   $str = '';
195   foreach my $t (@t)
196     {
197     $str .= ' ' if $str ne '';
198     if ($t =~ /^[^\/]+$/)
199       {
200       $str .= '$(TEST_D)/' . $t;
201       }
202     else
203       {
204       $str .= $t;
205       }
206     }
207
208   return $str;
209   }
210
211 sub fixrules
212   {
213   my ($str) = @_;
214
215   # Compatible with -j...
216   $str =~ s/^(\s+@?)/$1cd \$(TEST_D) && /;
217   return $str;
218
219   # Compatible with not -j.
220   my @t = split("\n", $str);
221   $str = '';
222   my $prev;
223   foreach my $t (@t)
224     {
225     $t =~ s/^\s+//;
226     if (!$prev)
227       {
228       if ($t =~ /^@/)
229         {
230         $t =~ s/^@/\@cd \$(TEST_D) && /;
231         }
232       elsif ($t !~ /^\s*#/)
233         {
234         $t = 'cd $(TEST_D) && ' . $t;
235         }
236       }
237     $str .= "\t$t\n";
238     $prev = $t =~/\\$/;
239     }
240   return $str;
241 }
242
243 sub copy_scripts
244   {
245   my ($sed, $src, @targets) = @_;
246
247   my $s = '';
248   foreach my $t (@targets)
249     {
250     # Copy first so we get file modes...
251     $s .= "\$(TEST_D)/$t: \$(SRC_D)/$src/$t\n\tcp \$(SRC_D)/$src/$t \$(TEST_D)/$t\n";
252     $s .= "\tsed -e 's/\\.\\.\\/apps/..\\/\$(OUT_D)/' -e 's/\\.\\.\\/util/..\\/\$(TEST_D)/' < \$(SRC_D)/$src/$t > \$(TEST_D)/$t\n" if $sed;
253     $s .= "\n";
254     }
255   return $s;
256   }
257
258 sub get_tests
259   {
260   my ($makefile) = @_;
261
262   open(M, $makefile) || die "Can't open $makefile: $!";
263   my %targets;
264   my %deps;
265   my %tests;
266   while (my $line = <M>)
267     {
268     chomp $line;
269     while ($line =~ /^(.*)\\$/)
270       {
271       $line = $1 . <M>;
272       }
273
274     if ($line =~ /^alltests:(.*)$/)
275       {
276       my @t = split(/\s+/, $1);
277       foreach my $t (@t)
278         {
279         $targets{$t} = '';
280         }
281       }
282
283     if (($line =~ /^(\S+):(.*)$/ && exists $targets{$1})
284         || $line =~ /^(test_ss .*):(.*)/)
285       {
286       my $t = $1;
287       $deps{$t} = $2;
288       $deps{$t} =~ s/#.*$//;
289       for (;;)
290         {
291         $line = <M>;
292         chomp $line;
293         last if $line eq '';
294         $targets{$t} .= "$line\n";
295         }
296       next;
297       }
298
299     if ($line =~ /^(\S+TEST)=\s*(\S+)$/)
300       {
301       $tests{$1} = $2;
302       next;
303       }
304     }
305
306   delete $targets{test_jpake} if $no_jpake;
307   delete $targets{test_ige} if $no_ige;
308   delete $targets{test_md2} if $no_md2;
309   delete $targets{test_rc5} if $no_rc5;
310
311   my $tests;
312   foreach my $t (keys %tests)
313     {
314     $tests .= "$t = $tests{$t}\n";
315     }
316
317   my $all = 'test:';
318   my $each;
319   foreach my $t (keys %targets)
320     {
321     next if $t eq '';
322
323     if ($t =~ /^test_ss/)
324       {
325       $t =~ s/\s+/ \$(TEST_D)\//g;
326       $all .= ' test_ss';
327       }
328     else
329       {
330       $all .= " $t";
331       }
332
333     my $d = $deps{$t};
334     $d =~ s/\.\.\/apps/\$(BIN_D)/g;
335     $d =~ s/\.\.\/util/\$(TEST_D)/g;
336     $d = fixtests($d, \%tests);
337     $d = fixdeps($d);
338
339     my $r = $targets{$t};
340     $r =~ s/\.\.\/apps/..\/\$(BIN_D)/g;
341     $r =~ s/\.\.\/util/..\/\$(TEST_D)/g;
342     $r =~ s/\.\.\/(\S+)/\$(SRC_D)\/$1/g;
343     $r = fixrules($r);
344
345     $each .= "$t: test_scripts $d\n\t\@echo '$t test started'\n$r\t\@echo '$t test done'\n\n";
346     }
347
348   # FIXME: Might be a clever way to figure out what needs copying
349   my @copies = ( 'bctest',
350                  'evptests.txt',
351                  'testgen',
352                  'cms-test.pl',
353                  'tx509',
354                  'test.cnf',
355                  'testenc',
356                  'tocsp',
357                  'testca',
358                  'CAss.cnf',
359                  'testtsa',
360                  'CAtsa.cnf',
361                  'Uss.cnf',
362                  'P1ss.cnf',
363                  'P2ss.cnf',
364                  'tcrl',
365                  'tsid',
366                  'treq',
367                  'tpkcs7',
368                  'tpkcs7d',
369                  'testcrl.pem',
370                  'testx509.pem',
371                  'v3-cert1.pem',
372                  'v3-cert2.pem',
373                  'testreq2.pem',
374                  'testp7.pem',
375                  'pkcs7-1.pem',
376                  'trsa',
377                  'testrsa.pem',
378                  'testsid.pem',
379                );
380   my $copies = copy_scripts(1, 'test', @copies);
381   $copies .= copy_scripts(0, 'test', ('smcont.txt'));
382
383   my @utils = ( 'shlib_wrap.sh',
384                 'opensslwrap.sh',
385               );
386   $copies .= copy_scripts(1, 'util', @utils);
387
388   my @apps = ( 'CA.sh',
389                'openssl.cnf',
390              );
391   $copies .= copy_scripts(1, 'apps', @apps);
392
393   $scripts = "test_scripts: \$(TEST_D)/CA.sh \$(TEST_D)/opensslwrap.sh \$(TEST_D)/openssl.cnf ocsp smime\n";
394   $scripts .= "\nocsp:\n\tcp -R test/ocsp-tests \$(TEST_D)\n";
395   $scripts .= "\smime:\n\tcp -R test/smime-certs \$(TEST_D)\n";
396
397   return "$scripts\n$copies\n$tests\n$all\n\n$each";
398   }
399
400 1;