source: trunk/third/openssl/util/mk1mf.pl @ 15530

Revision 15530, 22.8 KB checked in by ghudson, 24 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r15529, which included commits to RCS files with non-trunk default branches.
  • Property svn:executable set to *
Line 
1#!/usr/local/bin/perl
2# A bit of an evil hack but it post processes the file ../MINFO which
3# is generated by `make files` in the top directory.
4# This script outputs one mega makefile that has no shell stuff or any
5# funny stuff
6#
7
8$INSTALLTOP="/usr/local/ssl";
9$OPTIONS="";
10$ssl_version="";
11$banner="\t\@echo Building OpenSSL";
12
13open(IN,"<Makefile.ssl") || die "unable to open Makefile.ssl!\n";
14while(<IN>) {
15    $ssl_version=$1 if (/^VERSION=(.*)$/);
16    $OPTIONS=$1 if (/^OPTIONS=(.*)$/);
17    $INSTALLTOP=$1 if (/^INSTALLTOP=(.*$)/);
18}
19close(IN);
20
21die "Makefile.ssl is not the toplevel Makefile!\n" if $ssl_version eq "";
22
23$infile="MINFO";
24
25%ops=(
26        "VC-WIN32",   "Microsoft Visual C++ [4-6] - Windows NT or 9X",
27        "VC-NT",   "Microsoft Visual C++ [4-6] - Windows NT ONLY",
28        "VC-W31-16",  "Microsoft Visual C++ 1.52 - Windows 3.1 - 286",
29        "VC-WIN16",   "Alias for VC-W31-32",
30        "VC-W31-32",  "Microsoft Visual C++ 1.52 - Windows 3.1 - 386+",
31        "VC-MSDOS","Microsoft Visual C++ 1.52 - MSDOS",
32        "Mingw32", "GNU C++ - Windows NT or 9x",
33        "Mingw32-files", "Create files with DOS copy ...",
34        "BC-NT",   "Borland C++ 4.5 - Windows NT",
35        "BC-W31",  "Borland C++ 4.5 - Windows 3.1 - PROBABLY NOT WORKING",
36        "BC-MSDOS","Borland C++ 4.5 - MSDOS",
37        "linux-elf","Linux elf",
38        "ultrix-mips","DEC mips ultrix",
39        "FreeBSD","FreeBSD distribution",
40        "default","cc under unix",
41        );
42
43$platform="";
44foreach (@ARGV)
45        {
46        if (!&read_options && !defined($ops{$_}))
47                {
48                print STDERR "unknown option - $_\n";
49                print STDERR "usage: perl mk1mf.pl [options] [system]\n";
50                print STDERR "\nwhere [system] can be one of the following\n";
51                foreach $i (sort keys %ops)
52                { printf STDERR "\t%-10s\t%s\n",$i,$ops{$i}; }
53                print STDERR <<"EOF";
54and [options] can be one of
55        no-md2 no-md4 no-md5 no-sha no-mdc2     - Skip this digest
56        no-ripemd
57        no-rc2 no-rc4 no-idea no-des no-bf no-cast - Skip this symetric cipher
58        no-rc5
59        no-rsa no-dsa no-dh                     - Skip this public key cipher
60        no-ssl2 no-ssl3                         - Skip this version of SSL
61        just-ssl                                - remove all non-ssl keys/digest
62        no-asm                                  - No x86 asm
63        nasm                                    - Use NASM for x86 asm
64        gaswin                                  - Use GNU as with Mingw32
65        no-socks                                - No socket code
66        no-err                                  - No error strings
67        dll/shlib                               - Build shared libraries (MS)
68        debug                                   - Debug build
69        profile                                 - Profiling build
70        gcc                                     - Use Gcc (unix)
71        rsaref                                  - Build to require RSAref
72
73Values that can be set
74TMP=tmpdir OUT=outdir SRC=srcdir BIN=binpath INC=header-outdir CC=C-compiler
75
76-L<ex_lib_path> -l<ex_lib>                      - extra library flags (unix)
77-<ex_cc_flags>                                  - extra 'cc' flags,
78                                                  added (MS), or replace (unix)
79EOF
80                exit(1);
81                }
82        $platform=$_;
83        }
84foreach (split / /, $OPTIONS)
85        {
86        print STDERR "unknown option - $_\n" if !&read_options;
87        }
88
89$no_mdc2=1 if ($no_des);
90
91$no_ssl3=1 if ($no_md5 || $no_sha);
92$no_ssl3=1 if ($no_rsa && $no_dh);
93
94$no_ssl2=1 if ($no_md5 || $no_rsa);
95$no_ssl2=1 if ($no_rsa);
96
97$out_def="out";
98$inc_def="outinc";
99$tmp_def="tmp";
100
101$mkdir="mkdir";
102
103($ssl,$crypto)=("ssl","crypto");
104$RSAglue="RSAglue";
105$ranlib="echo ranlib";
106
107$cc=(defined($VARS{'CC'}))?$VARS{'CC'}:'cc';
108$src_dir=(defined($VARS{'SRC'}))?$VARS{'SRC'}:'.';
109$bin_dir=(defined($VARS{'BIN'}))?$VARS{'BIN'}:'';
110
111# $bin_dir.=$o causes a core dump on my sparc :-(
112
113$NT=0;
114
115push(@INC,"util/pl","pl");
116if ($platform eq "VC-MSDOS")
117        {
118        $asmbits=16;
119        $msdos=1;
120        require 'VC-16.pl';
121        }
122elsif ($platform eq "VC-W31-16")
123        {
124        $asmbits=16;
125        $msdos=1; $win16=1;
126        require 'VC-16.pl';
127        }
128elsif (($platform eq "VC-W31-32") || ($platform eq "VC-WIN16"))
129        {
130        $asmbits=32;
131        $msdos=1; $win16=1;
132        require 'VC-16.pl';
133        }
134elsif (($platform eq "VC-WIN32") || ($platform eq "VC-NT"))
135        {
136        $NT = 1 if $platform eq "VC-NT";
137        require 'VC-32.pl';
138        }
139elsif ($platform eq "Mingw32")
140        {
141        require 'Mingw32.pl';
142        }
143elsif ($platform eq "Mingw32-files")
144        {
145        require 'Mingw32f.pl';
146        }
147elsif ($platform eq "BC-NT")
148        {
149        $bc=1;
150        require 'BC-32.pl';
151        }
152elsif ($platform eq "BC-W31")
153        {
154        $bc=1;
155        $msdos=1; $w16=1;
156        require 'BC-16.pl';
157        }
158elsif ($platform eq "BC-Q16")
159        {
160        $msdos=1; $w16=1; $shlib=0; $qw=1;
161        require 'BC-16.pl';
162        }
163elsif ($platform eq "BC-MSDOS")
164        {
165        $asmbits=16;
166        $msdos=1;
167        require 'BC-16.pl';
168        }
169elsif ($platform eq "FreeBSD")
170        {
171        require 'unix.pl';
172        $cflags='-DTERMIO -D_ANSI_SOURCE -O2 -fomit-frame-pointer';
173        }
174elsif ($platform eq "linux-elf")
175        {
176        require "unix.pl";
177        require "linux.pl";
178        $unix=1;
179        }
180elsif ($platform eq "ultrix-mips")
181        {
182        require "unix.pl";
183        require "ultrix.pl";
184        $unix=1;
185        }
186else
187        {
188        require "unix.pl";
189
190        $unix=1;
191        $cflags.=' -DTERMIO';
192        }
193
194$out_dir=(defined($VARS{'OUT'}))?$VARS{'OUT'}:$out_def.($debug?".dbg":"");
195$tmp_dir=(defined($VARS{'TMP'}))?$VARS{'TMP'}:$tmp_def.($debug?".dbg":"");
196$inc_dir=(defined($VARS{'INC'}))?$VARS{'INC'}:$inc_def;
197
198$bin_dir=$bin_dir.$o unless ((substr($bin_dir,-1,1) eq $o) || ($bin_dir eq ''));
199
200$cflags.=" -DNO_IDEA" if $no_idea;
201$cflags.=" -DNO_RC2"  if $no_rc2;
202$cflags.=" -DNO_RC4"  if $no_rc4;
203$cflags.=" -DNO_RC5"  if $no_rc5;
204$cflags.=" -DNO_MD2"  if $no_md2;
205$cflags.=" -DNO_MD4"  if $no_md4;
206$cflags.=" -DNO_MD5"  if $no_md5;
207$cflags.=" -DNO_SHA"  if $no_sha;
208$cflags.=" -DNO_SHA1" if $no_sha1;
209$cflags.=" -DNO_RIPEMD" if $no_rmd160;
210$cflags.=" -DNO_MDC2" if $no_mdc2;
211$cflags.=" -DNO_BF"  if $no_bf;
212$cflags.=" -DNO_CAST" if $no_cast;
213$cflags.=" -DNO_DES"  if $no_des;
214$cflags.=" -DNO_RSA"  if $no_rsa;
215$cflags.=" -DNO_DSA"  if $no_dsa;
216$cflags.=" -DNO_DH"   if $no_dh;
217$cflags.=" -DNO_SOCK" if $no_sock;
218$cflags.=" -DNO_SSL2" if $no_ssl2;
219$cflags.=" -DNO_SSL3" if $no_ssl3;
220$cflags.=" -DNO_ERR"  if $no_err;
221$cflags.=" -DRSAref"  if $rsaref ne "";
222
223## if ($unix)
224##      { $cflags="$c_flags" if ($c_flags ne ""); }
225##else
226        { $cflags="$c_flags$cflags" if ($c_flags ne ""); }
227
228$ex_libs="$l_flags$ex_libs" if ($l_flags ne "");
229
230if ($msdos)
231        {
232        $banner ="\t\@echo Make sure you have run 'perl Configure $platform' in the\n";
233        $banner.="\t\@echo top level directory, if you don't have perl, you will\n";
234        $banner.="\t\@echo need to probably edit crypto/bn/bn.h, check the\n";
235        $banner.="\t\@echo documentation for details.\n";
236        }
237
238# have to do this to allow $(CC) under unix
239$link="$bin_dir$link" if ($link !~ /^\$/);
240
241$INSTALLTOP =~ s|/|$o|g;
242
243$defs= <<"EOF";
244# This makefile has been automatically generated from the OpenSSL distribution.
245# This single makefile will build the complete OpenSSL distribution and
246# by default leave the 'intertesting' output files in .${o}out and the stuff
247# that needs deleting in .${o}tmp.
248# The file was generated by running 'make makefile.one', which
249# does a 'make files', which writes all the environment variables from all
250# the makefiles to the file call MINFO.  This file is used by
251# util${o}mk1mf.pl to generate makefile.one.
252# The 'makefile per directory' system suites me when developing this
253# library and also so I can 'distribute' indervidual library sections.
254# The one monster makefile better suits building in non-unix
255# environments.
256
257INSTALLTOP=$INSTALLTOP
258
259# Set your compiler options
260PLATFORM=$platform
261CC=$bin_dir${cc}
262CFLAG=$cflags
263APP_CFLAG=$app_cflag
264LIB_CFLAG=$lib_cflag
265SHLIB_CFLAG=$shl_cflag
266APP_EX_OBJ=$app_ex_obj
267SHLIB_EX_OBJ=$shlib_ex_obj
268# add extra libraries to this define, for solaris -lsocket -lnsl would
269# be added
270EX_LIBS=$ex_libs
271
272# The OpenSSL directory
273SRC_D=$src_dir
274
275LINK=$link
276LFLAGS=$lflags
277
278BN_ASM_OBJ=$bn_asm_obj
279BN_ASM_SRC=$bn_asm_src
280BNCO_ASM_OBJ=$bnco_asm_obj
281BNCO_ASM_SRC=$bnco_asm_src
282DES_ENC_OBJ=$des_enc_obj
283DES_ENC_SRC=$des_enc_src
284BF_ENC_OBJ=$bf_enc_obj
285BF_ENC_SRC=$bf_enc_src
286CAST_ENC_OBJ=$cast_enc_obj
287CAST_ENC_SRC=$cast_enc_src
288RC4_ENC_OBJ=$rc4_enc_obj
289RC4_ENC_SRC=$rc4_enc_src
290RC5_ENC_OBJ=$rc5_enc_obj
291RC5_ENC_SRC=$rc5_enc_src
292MD5_ASM_OBJ=$md5_asm_obj
293MD5_ASM_SRC=$md5_asm_src
294SHA1_ASM_OBJ=$sha1_asm_obj
295SHA1_ASM_SRC=$sha1_asm_src
296RMD160_ASM_OBJ=$rmd160_asm_obj
297RMD160_ASM_SRC=$rmd160_asm_src
298
299# The output directory for everything intersting
300OUT_D=$out_dir
301# The output directory for all the temporary muck
302TMP_D=$tmp_dir
303# The output directory for the header files
304INC_D=$inc_dir
305INCO_D=$inc_dir${o}openssl
306
307CP=$cp
308RM=$rm
309RANLIB=$ranlib
310MKDIR=$mkdir
311MKLIB=$bin_dir$mklib
312MLFLAGS=$mlflags
313ASM=$bin_dir$asm
314
315######################################################
316# You should not need to touch anything below this point
317######################################################
318
319E_EXE=openssl
320SSL=$ssl
321CRYPTO=$crypto
322RSAGLUE=$RSAglue
323
324# BIN_D  - Binary output directory
325# TEST_D - Binary test file output directory
326# LIB_D  - library output directory
327# Note: if you change these point to different directories then uncomment out
328# the lines around the 'NB' comment below.
329#
330BIN_D=\$(OUT_D)
331TEST_D=\$(OUT_D)
332LIB_D=\$(OUT_D)
333
334# INCL_D - local library directory
335# OBJ_D  - temp object file directory
336OBJ_D=\$(TMP_D)
337INCL_D=\$(TMP_D)
338
339O_SSL=     \$(LIB_D)$o$plib\$(SSL)$shlibp
340O_CRYPTO=  \$(LIB_D)$o$plib\$(CRYPTO)$shlibp
341O_RSAGLUE= \$(LIB_D)$o$plib\$(RSAGLUE)$libp
342SO_SSL=    $plib\$(SSL)$so_shlibp
343SO_CRYPTO= $plib\$(CRYPTO)$so_shlibp
344L_SSL=     \$(LIB_D)$o$plib\$(SSL)$libp
345L_CRYPTO=  \$(LIB_D)$o$plib\$(CRYPTO)$libp
346
347L_LIBS= \$(L_SSL) \$(L_CRYPTO)
348#L_LIBS= \$(O_SSL) \$(O_RSAGLUE) -lrsaref \$(O_CRYPTO)
349
350######################################################
351# Don't touch anything below this point
352######################################################
353
354INC=-I\$(INC_D) -I\$(INCL_D)
355APP_CFLAGS=\$(INC) \$(CFLAG) \$(APP_CFLAG)
356LIB_CFLAGS=\$(INC) \$(CFLAG) \$(LIB_CFLAG)
357SHLIB_CFLAGS=\$(INC) \$(CFLAG) \$(LIB_CFLAG) \$(SHLIB_CFLAG)
358LIBS_DEP=\$(O_CRYPTO) \$(O_RSAGLUE) \$(O_SSL)
359
360#############################################
361EOF
362
363$rules=<<"EOF";
364all: banner \$(TMP_D) \$(BIN_D) \$(TEST_D) \$(LIB_D) \$(INCO_D) headers lib exe
365
366banner:
367$banner
368
369\$(TMP_D):
370        \$(MKDIR) \$(TMP_D)
371# NB: uncomment out these lines if BIN_D, TEST_D and LIB_D are different
372#\$(BIN_D):
373#       \$(MKDIR) \$(BIN_D)
374#
375#\$(TEST_D):
376#       \$(MKDIR) \$(TEST_D)
377
378\$(LIB_D):
379        \$(MKDIR) \$(LIB_D)
380
381\$(INCO_D): \$(INC_D)
382        \$(MKDIR) \$(INCO_D)
383
384\$(INC_D):
385        \$(MKDIR) \$(INC_D)
386
387headers: \$(HEADER) \$(EXHEADER)
388        @
389
390lib: \$(LIBS_DEP)
391
392exe: \$(T_EXE) \$(BIN_D)$o\$(E_EXE)$exep
393
394install:
395        \$(MKDIR) \$(INSTALLTOP)
396        \$(MKDIR) \$(INSTALLTOP)${o}bin
397        \$(MKDIR) \$(INSTALLTOP)${o}include
398        \$(MKDIR) \$(INSTALLTOP)${o}include${o}openssl
399        \$(MKDIR) \$(INSTALLTOP)${o}lib
400        \$(CP) \$(INCO_D)${o}*.\[ch\] \$(INSTALLTOP)${o}include${o}openssl
401        \$(CP) \$(BIN_D)$o\$(E_EXE)$exep \$(INSTALLTOP)${o}bin
402        \$(CP) \$(O_SSL) \$(INSTALLTOP)${o}lib
403        \$(CP) \$(O_CRYPTO) \$(INSTALLTOP)${o}lib
404
405clean:
406        \$(RM) \$(TMP_D)$o*.*
407
408vclean:
409        \$(RM) \$(TMP_D)$o*.*
410        \$(RM) \$(OUT_D)$o*.*
411
412EOF
413   
414my $platform_cpp_symbol = "MK1MF_PLATFORM_$platform";
415$platform_cpp_symbol =~ s/-/_/g;
416if (open(IN,"crypto/buildinf.h"))
417        {
418        # Remove entry for this platform in existing file buildinf.h.
419
420        my $old_buildinf_h = "";
421        while (<IN>)
422                {
423                if (/^\#ifdef $platform_cpp_symbol$/)
424                        {
425                        while (<IN>) { last if (/^\#endif/); }
426                        }
427                else
428                        {
429                        $old_buildinf_h .= $_;
430                        }
431                }
432        close(IN);
433
434        open(OUT,">crypto/buildinf.h") || die "Can't open buildinf.h";
435        print OUT $old_buildinf_h;
436        close(OUT);
437        }
438
439open (OUT,">>crypto/buildinf.h") || die "Can't open buildinf.h";
440printf OUT <<EOF;
441#ifdef $platform_cpp_symbol
442  /* auto-generated/updated by util/mk1mf.pl for crypto/cversion.c */
443  #define CFLAGS "$cc $cflags"
444  #define PLATFORM "$platform"
445EOF
446printf OUT "  #define DATE \"%s\"\n", scalar gmtime();
447printf OUT "#endif\n";
448close(OUT);
449
450#############################################
451# We parse in input file and 'store' info for later printing.
452open(IN,"<$infile") || die "unable to open $infile:$!\n";
453$_=<IN>;
454for (;;)
455        {
456        chop;
457
458        ($key,$val)=/^([^=]+)=(.*)/;
459        if ($key eq "RELATIVE_DIRECTORY")
460                {
461                if ($lib ne "")
462                        {
463                        $uc=$lib;
464                        $uc =~ s/^lib(.*)\.a/$1/;
465                        $uc =~ tr/a-z/A-Z/;
466                        $lib_nam{$uc}=$uc;
467                        $lib_obj{$uc}.=$libobj." ";
468                        }
469                last if ($val eq "FINISHED");
470                $lib="";
471                $libobj="";
472                $dir=$val;
473                }
474
475        if ($key eq "TEST")
476                { $test.=&var_add($dir,$val); }
477
478        if (($key eq "PROGS") || ($key eq "E_OBJ"))
479                { $e_exe.=&var_add($dir,$val); }
480
481        if ($key eq "LIB")
482                {
483                $lib=$val;
484                $lib =~ s/^.*\/([^\/]+)$/$1/;
485                }
486
487        if ($key eq "EXHEADER")
488                { $exheader.=&var_add($dir,$val); }
489
490        if ($key eq "HEADER")
491                { $header.=&var_add($dir,$val); }
492
493        if ($key eq "LIBOBJ")
494                { $libobj=&var_add($dir,$val); }
495
496        if (!($_=<IN>))
497                { $_="RELATIVE_DIRECTORY=FINISHED\n"; }
498        }
499close(IN);
500
501# Strip of trailing ' '
502foreach (keys %lib_obj) { $lib_obj{$_}=&clean_up_ws($lib_obj{$_}); }
503$test=&clean_up_ws($test);
504$e_exe=&clean_up_ws($e_exe);
505$exheader=&clean_up_ws($exheader);
506$header=&clean_up_ws($header);
507
508# First we strip the exheaders from the headers list
509foreach (split(/\s+/,$exheader)){ $h{$_}=1; }
510foreach (split(/\s+/,$header))  { $h.=$_." " unless $h{$_}; }
511chop($h); $header=$h;
512
513$defs.=&do_defs("HEADER",$header,"\$(INCL_D)",".h");
514$rules.=&do_copy_rule("\$(INCL_D)",$header,".h");
515
516$defs.=&do_defs("EXHEADER",$exheader,"\$(INCO_D)",".h");
517$rules.=&do_copy_rule("\$(INCO_D)",$exheader,".h");
518
519$defs.=&do_defs("T_OBJ",$test,"\$(OBJ_D)",$obj);
520$rules.=&do_compile_rule("\$(OBJ_D)",$test,"\$(APP_CFLAGS)");
521
522$defs.=&do_defs("E_OBJ",$e_exe,"\$(OBJ_D)",$obj);
523$rules.=&do_compile_rule("\$(OBJ_D)",$e_exe,'-DMONOLITH $(APP_CFLAGS)');
524
525foreach (values %lib_nam)
526        {
527        $lib_obj=$lib_obj{$_};
528        local($slib)=$shlib;
529
530        $slib=0 if ($_ eq "RSAGLUE");
531
532        if (($_ eq "SSL") && $no_ssl2 && $no_ssl3)
533                {
534                $rules.="\$(O_SSL):\n\n";
535                next;
536                }
537
538        if (($_ eq "RSAGLUE") && $no_rsa)
539                {
540                $rules.="\$(O_RSAGLUE):\n\n";
541                next;
542                }
543
544        if (($bn_asm_obj ne "") && ($_ eq "CRYPTO"))
545                {
546                $lib_obj =~ s/\s\S*\/bn_asm\S*/ \$(BN_ASM_OBJ)/;
547                $rules.=&do_asm_rule($bn_asm_obj,$bn_asm_src);
548                }
549        if (($bnco_asm_obj ne "") && ($_ eq "CRYPTO"))
550                {
551                $lib_obj .= "\$(BNCO_ASM_OBJ)";
552                $rules.=&do_asm_rule($bnco_asm_obj,$bnco_asm_src);
553                }
554        if (($des_enc_obj ne "") && ($_ eq "CRYPTO"))
555                {
556                $lib_obj =~ s/\s\S*des_enc\S*/ \$(DES_ENC_OBJ)/;
557                $lib_obj =~ s/\s\S*\/fcrypt_b\S*\s*/ /;
558                $rules.=&do_asm_rule($des_enc_obj,$des_enc_src);
559                }
560        if (($bf_enc_obj ne "") && ($_ eq "CRYPTO"))
561                {
562                $lib_obj =~ s/\s\S*\/bf_enc\S*/ \$(BF_ENC_OBJ)/;
563                $rules.=&do_asm_rule($bf_enc_obj,$bf_enc_src);
564                }
565        if (($cast_enc_obj ne "") && ($_ eq "CRYPTO"))
566                {
567                $lib_obj =~ s/(\s\S*\/c_enc\S*)/ \$(CAST_ENC_OBJ)/;
568                $rules.=&do_asm_rule($cast_enc_obj,$cast_enc_src);
569                }
570        if (($rc4_enc_obj ne "") && ($_ eq "CRYPTO"))
571                {
572                $lib_obj =~ s/\s\S*\/rc4_enc\S*/ \$(RC4_ENC_OBJ)/;
573                $rules.=&do_asm_rule($rc4_enc_obj,$rc4_enc_src);
574                }
575        if (($rc5_enc_obj ne "") && ($_ eq "CRYPTO"))
576                {
577                $lib_obj =~ s/\s\S*\/rc5_enc\S*/ \$(RC5_ENC_OBJ)/;
578                $rules.=&do_asm_rule($rc5_enc_obj,$rc5_enc_src);
579                }
580        if (($md5_asm_obj ne "") && ($_ eq "CRYPTO"))
581                {
582                $lib_obj =~ s/\s(\S*\/md5_dgst\S*)/ $1 \$(MD5_ASM_OBJ)/;
583                $rules.=&do_asm_rule($md5_asm_obj,$md5_asm_src);
584                }
585        if (($sha1_asm_obj ne "") && ($_ eq "CRYPTO"))
586                {
587                $lib_obj =~ s/\s(\S*\/sha1dgst\S*)/ $1 \$(SHA1_ASM_OBJ)/;
588                $rules.=&do_asm_rule($sha1_asm_obj,$sha1_asm_src);
589                }
590        if (($rmd160_asm_obj ne "") && ($_ eq "CRYPTO"))
591                {
592                $lib_obj =~ s/\s(\S*\/rmd_dgst\S*)/ $1 \$(RMD160_ASM_OBJ)/;
593                $rules.=&do_asm_rule($rmd160_asm_obj,$rmd160_asm_src);
594                }
595        $defs.=&do_defs(${_}."OBJ",$lib_obj,"\$(OBJ_D)",$obj);
596        $lib=($slib)?" \$(SHLIB_CFLAGS)":" \$(LIB_CFLAGS)";
597        $rules.=&do_compile_rule("\$(OBJ_D)",$lib_obj{$_},$lib);
598        }
599
600$defs.=&do_defs("T_EXE",$test,"\$(TEST_D)",$exep);
601foreach (split(/\s+/,$test))
602        {
603        $t=&bname($_);
604        $tt="\$(OBJ_D)${o}$t${obj}";
605        $rules.=&do_link_rule("\$(TEST_D)$o$t$exep",$tt,"\$(LIBS_DEP)","\$(L_LIBS) \$(EX_LIBS)");
606        }
607
608$rules.= &do_lib_rule("\$(SSLOBJ)","\$(O_SSL)",$ssl,$shlib,"\$(SO_SSL)");
609$rules.= &do_lib_rule("\$(RSAGLUEOBJ)","\$(O_RSAGLUE)",$RSAglue,0,"")
610        unless $no_rsa;
611$rules.= &do_lib_rule("\$(CRYPTOOBJ)","\$(O_CRYPTO)",$crypto,$shlib,"\$(SO_CRYPTO)");
612
613$rules.=&do_link_rule("\$(BIN_D)$o\$(E_EXE)$exep","\$(E_OBJ)","\$(LIBS_DEP)","\$(L_LIBS) \$(EX_LIBS)");
614
615print $defs;
616
617if ($platform eq "linux-elf") {
618    print <<"EOF";
619# Generate perlasm output files
620%.cpp:
621        (cd \$(\@D)/..; PERL=perl make -f Makefile.ssl asm/\$(\@F))
622EOF
623}
624print "###################################################################\n";
625print $rules;
626
627###############################################
628# strip off any trailing .[och] and append the relative directory
629# also remembering to do nothing if we are in one of the dropped
630# directories
631sub var_add
632        {
633        local($dir,$val)=@_;
634        local(@a,$_,$ret);
635
636        return("") if $no_idea && $dir =~ /\/idea/;
637        return("") if $no_rc2  && $dir =~ /\/rc2/;
638        return("") if $no_rc4  && $dir =~ /\/rc4/;
639        return("") if $no_rc5  && $dir =~ /\/rc5/;
640        return("") if $no_rsa  && $dir =~ /\/rsa/;
641        return("") if $no_rsa  && $dir =~ /^rsaref/;
642        return("") if $no_dsa  && $dir =~ /\/dsa/;
643        return("") if $no_dh   && $dir =~ /\/dh/;
644        if ($no_des && $dir =~ /\/des/)
645                {
646                if ($val =~ /read_pwd/)
647                        { return("$dir/read_pwd "); }
648                else
649                        { return(""); }
650                }
651        return("") if $no_mdc2 && $dir =~ /\/mdc2/;
652        return("") if $no_sock && $dir =~ /\/proxy/;
653        return("") if $no_bf   && $dir =~ /\/bf/;
654        return("") if $no_cast && $dir =~ /\/cast/;
655
656        $val =~ s/^\s*(.*)\s*$/$1/;
657        @a=split(/\s+/,$val);
658        grep(s/\.[och]$//,@a);
659
660        @a=grep(!/^e_.*_3d$/,@a) if $no_des;
661        @a=grep(!/^e_.*_d$/,@a) if $no_des;
662        @a=grep(!/^e_.*_i$/,@a) if $no_idea;
663        @a=grep(!/^e_.*_r2$/,@a) if $no_rc2;
664        @a=grep(!/^e_.*_r5$/,@a) if $no_rc5;
665        @a=grep(!/^e_.*_bf$/,@a) if $no_bf;
666        @a=grep(!/^e_.*_c$/,@a) if $no_cast;
667        @a=grep(!/^e_rc4$/,@a) if $no_rc4;
668
669        @a=grep(!/(^s2_)|(^s23_)/,@a) if $no_ssl2;
670        @a=grep(!/(^s3_)|(^s23_)/,@a) if $no_ssl3;
671
672        @a=grep(!/(_sock$)|(_acpt$)|(_conn$)|(^pxy_)/,@a) if $no_sock;
673
674        @a=grep(!/(^md2)|(_md2$)/,@a) if $no_md2;
675        @a=grep(!/(^md4)|(_md4$)/,@a) if $no_md4;
676        @a=grep(!/(^md5)|(_md5$)/,@a) if $no_md5;
677        @a=grep(!/(rmd)|(ripemd)/,@a) if $no_rmd160;
678
679        @a=grep(!/(^d2i_r_)|(^i2d_r_)/,@a) if $no_rsa;
680        @a=grep(!/(^p_open$)|(^p_seal$)/,@a) if $no_rsa;
681        @a=grep(!/(^pem_seal$)/,@a) if $no_rsa;
682
683        @a=grep(!/(m_dss$)|(m_dss1$)/,@a) if $no_dsa;
684        @a=grep(!/(^d2i_s_)|(^i2d_s_)|(_dsap$)/,@a) if $no_dsa;
685
686        @a=grep(!/^n_pkey$/,@a) if $no_rsa || $no_rc4;
687
688        @a=grep(!/_dhp$/,@a) if $no_dh;
689
690        @a=grep(!/(^sha[^1])|(_sha$)|(m_dss$)/,@a) if $no_sha;
691        @a=grep(!/(^sha1)|(_sha1$)|(m_dss1$)/,@a) if $no_sha1;
692        @a=grep(!/_mdc2$/,@a) if $no_mdc2;
693
694        @a=grep(!/(^rsa$)|(^genrsa$)/,@a) if $no_rsa;
695        @a=grep(!/(^dsa$)|(^gendsa$)|(^dsaparam$)/,@a) if $no_dsa;
696        @a=grep(!/^gendsa$/,@a) if $no_sha1;
697        @a=grep(!/(^dh$)|(^gendh$)/,@a) if $no_dh;
698
699        @a=grep(!/(^dh)|(_sha1$)|(m_dss1$)/,@a) if $no_sha1;
700
701        grep($_="$dir/$_",@a);
702        @a=grep(!/(^|\/)s_/,@a) if $no_sock;
703        @a=grep(!/(^|\/)bio_sock/,@a) if $no_sock;
704        $ret=join(' ',@a)." ";
705        return($ret);
706        }
707
708# change things so that each 'token' is only separated by one space
709sub clean_up_ws
710        {
711        local($w)=@_;
712
713        $w =~ s/^\s*(.*)\s*$/$1/;
714        $w =~ s/\s+/ /g;
715        return($w);
716        }
717
718sub do_defs
719        {
720        local($var,$files,$location,$postfix)=@_;
721        local($_,$ret,$pf);
722        local(*OUT,$tmp,$t);
723
724        $files =~ s/\//$o/g if $o ne '/';
725        $ret="$var=";
726        $n=1;
727        $Vars{$var}.="";
728        foreach (split(/ /,$files))
729                {
730                $orig=$_;
731                $_=&bname($_) unless /^\$/;
732                if ($n++ == 2)
733                        {
734                        $n=0;
735                        $ret.="\\\n\t";
736                        }
737                if (($_ =~ /bss_file/) && ($postfix eq ".h"))
738                        { $pf=".c"; }
739                else    { $pf=$postfix; }
740                if ($_ =~ /BN_ASM/)     { $t="$_ "; }
741                elsif ($_ =~ /BNCO_ASM/){ $t="$_ "; }
742                elsif ($_ =~ /DES_ENC/) { $t="$_ "; }
743                elsif ($_ =~ /BF_ENC/)  { $t="$_ "; }
744                elsif ($_ =~ /CAST_ENC/){ $t="$_ "; }
745                elsif ($_ =~ /RC4_ENC/) { $t="$_ "; }
746                elsif ($_ =~ /RC5_ENC/) { $t="$_ "; }
747                elsif ($_ =~ /MD5_ASM/) { $t="$_ "; }
748                elsif ($_ =~ /SHA1_ASM/){ $t="$_ "; }
749                elsif ($_ =~ /RMD160_ASM/){ $t="$_ "; }
750                else    { $t="$location${o}$_$pf "; }
751
752                $Vars{$var}.="$t ";
753                $ret.=$t;
754                }
755        chop($ret);
756        $ret.="\n\n";
757        return($ret);
758        }
759
760# return the name with the leading path removed
761sub bname
762        {
763        local($ret)=@_;
764        $ret =~ s/^.*[\\\/]([^\\\/]+)$/$1/;
765        return($ret);
766        }
767
768
769##############################################################
770# do a rule for each file that says 'compile' to new direcory
771# compile the files in '$files' into $to
772sub do_compile_rule
773        {
774        local($to,$files,$ex)=@_;
775        local($ret,$_,$n);
776       
777        $files =~ s/\//$o/g if $o ne '/';
778        foreach (split(/\s+/,$files))
779                {
780                $n=&bname($_);
781                $ret.=&cc_compile_target("$to${o}$n$obj","${_}.c",$ex)
782                }
783        return($ret);
784        }
785
786##############################################################
787# do a rule for each file that says 'compile' to new direcory
788sub cc_compile_target
789        {
790        local($target,$source,$ex_flags)=@_;
791        local($ret);
792       
793        $ex_flags.=" -DMK1MF_BUILD -D$platform_cpp_symbol" if ($source =~ /cversion/);
794        $target =~ s/\//$o/g if $o ne "/";
795        $source =~ s/\//$o/g if $o ne "/";
796        $ret ="$target: \$(SRC_D)$o$source\n\t";
797        $ret.="\$(CC) ${ofile}$target $ex_flags -c \$(SRC_D)$o$source\n\n";
798        return($ret);
799        }
800
801##############################################################
802sub do_asm_rule
803        {
804        local($target,$src)=@_;
805        local($ret,@s,@t,$i);
806
807        $target =~ s/\//$o/g if $o ne "/";
808        $src =~ s/\//$o/g if $o ne "/";
809
810        @s=split(/\s+/,$src);
811        @t=split(/\s+/,$target);
812
813        for ($i=0; $i<=$#s; $i++)
814                {
815                $ret.="$t[$i]: $s[$i]\n";
816                $ret.="\t\$(ASM) $afile$t[$i] \$(SRC_D)$o$s[$i]\n\n";
817                }
818        return($ret);
819        }
820
821sub do_shlib_rule
822        {
823        local($n,$def)=@_;
824        local($ret,$nn);
825        local($t);
826
827        ($nn=$n) =~ tr/a-z/A-Z/;
828        $ret.="$n.dll: \$(${nn}OBJ)\n";
829        if ($vc && $w32)
830                {
831                $ret.="\t\$(MKSHLIB) $efile$n.dll $def @<<\n  \$(${nn}OBJ_F)\n<<\n";
832                }
833        $ret.="\n";
834        return($ret);
835        }
836
837# do a rule for each file that says 'copy' to new direcory on change
838sub do_copy_rule
839        {
840        local($to,$files,$p)=@_;
841        local($ret,$_,$n,$pp);
842       
843        $files =~ s/\//$o/g if $o ne '/';
844        foreach (split(/\s+/,$files))
845                {
846                $n=&bname($_);
847                if ($n =~ /bss_file/)
848                        { $pp=".c"; }
849                else    { $pp=$p; }
850                $ret.="$to${o}$n$pp: \$(SRC_D)$o$_$pp\n\t\$(CP) \$(SRC_D)$o$_$pp $to${o}$n$pp\n\n";
851                }
852        return($ret);
853        }
854
855sub read_options
856        {
857        if    (/^no-rc2$/)      { $no_rc2=1; }
858        elsif (/^no-rc4$/)      { $no_rc4=1; }
859        elsif (/^no-rc5$/)      { $no_rc5=1; }
860        elsif (/^no-idea$/)     { $no_idea=1; }
861        elsif (/^no-des$/)      { $no_des=1; }
862        elsif (/^no-bf$/)       { $no_bf=1; }
863        elsif (/^no-cast$/)     { $no_cast=1; }
864        elsif (/^no-md2$/)      { $no_md2=1; }
865        elsif (/^no-md4$/)      { $no_md4=1; }
866        elsif (/^no-md5$/)      { $no_md5=1; }
867        elsif (/^no-sha$/)      { $no_sha=1; }
868        elsif (/^no-sha1$/)     { $no_sha1=1; }
869        elsif (/^no-ripemd$/)   { $no_ripemd=1; }
870        elsif (/^no-mdc2$/)     { $no_mdc2=1; }
871        elsif (/^no-patents$/)  { $no_rc2=$no_rc4=$no_rc5=$no_idea=$no_rsa=1; }
872        elsif (/^no-rsa$/)      { $no_rsa=1; }
873        elsif (/^no-dsa$/)      { $no_dsa=1; }
874        elsif (/^no-dh$/)       { $no_dh=1; }
875        elsif (/^no-hmac$/)     { $no_hmac=1; }
876        elsif (/^no-asm$/)      { $no_asm=1; }
877        elsif (/^nasm$/)        { $nasm=1; }
878        elsif (/^gaswin$/)      { $gaswin=1; }
879        elsif (/^no-ssl2$/)     { $no_ssl2=1; }
880        elsif (/^no-ssl3$/)     { $no_ssl3=1; }
881        elsif (/^no-err$/)      { $no_err=1; }
882        elsif (/^no-sock$/)     { $no_sock=1; }
883
884        elsif (/^just-ssl$/)    { $no_rc2=$no_idea=$no_des=$no_bf=$no_cast=1;
885                                  $no_md2=$no_sha=$no_mdc2=$no_dsa=$no_dh=1;
886                                  $no_ssl2=$no_err=$no_rmd160=$no_rc5=1; }
887
888        elsif (/^rsaref$/)      { $rsaref=1; }
889        elsif (/^gcc$/)         { $gcc=1; }
890        elsif (/^debug$/)       { $debug=1; }
891        elsif (/^profile$/)     { $profile=1; }
892        elsif (/^shlib$/)       { $shlib=1; }
893        elsif (/^dll$/)         { $shlib=1; }
894        elsif (/^shared$/)      { } # We just need to ignore it for now...
895        elsif (/^([^=]*)=(.*)$/){ $VARS{$1}=$2; }
896        elsif (/^-[lL].*$/)     { $l_flags.="$_ "; }
897        elsif ((!/^-help/) && (!/^-h/) && (!/^-\?/) && /^-.*$/)
898                { $c_flags.="$_ "; }
899        else { return(0); }
900        return(1);
901        }
Note: See TracBrowser for help on using the repository browser.