Update from stable branch.
[openssl.git] / util / mk1mf.pl
index 26a5d036ede3a8c41a58003caea915c76c439eb9..65d7d9cca2f968a850d968540fe0c6a740f10ee5 100755 (executable)
@@ -10,6 +10,10 @@ $OPTIONS="";
 $ssl_version="";
 $banner="\t\@echo Building OpenSSL";
 
+my $no_static_engine = 1;
+my $engines = "";
+
+
 open(IN,"<Makefile") || die "unable to open Makefile!\n";
 while(<IN>) {
     $ssl_version=$1 if (/^VERSION=(.*)$/);
@@ -18,29 +22,26 @@ while(<IN>) {
 }
 close(IN);
 
-die "Makefile.ssl is not the toplevel Makefile!\n" if $ssl_version eq "";
+die "Makefile is not the toplevel Makefile!\n" if $ssl_version eq "";
 
 $infile="MINFO";
 
 %ops=(
        "VC-WIN32",   "Microsoft Visual C++ [4-6] - Windows NT or 9X",
+       "VC-WIN64I",  "Microsoft C/C++ - Win64/IA-64",
+       "VC-WIN64A",  "Microsoft C/C++ - Win64/x64",
        "VC-CE",   "Microsoft eMbedded Visual C++ 3.0 - Windows CE ONLY",
        "VC-NT",   "Microsoft Visual C++ [4-6] - Windows NT ONLY",
-       "VC-W31-16",  "Microsoft Visual C++ 1.52 - Windows 3.1 - 286",
-       "VC-WIN16",   "Alias for VC-W31-32",
-       "VC-W31-32",  "Microsoft Visual C++ 1.52 - Windows 3.1 - 386+",
-       "VC-MSDOS","Microsoft Visual C++ 1.52 - MSDOS",
        "Mingw32", "GNU C++ - Windows NT or 9x",
        "Mingw32-files", "Create files with DOS copy ...",
        "BC-NT",   "Borland C++ 4.5 - Windows NT",
-       "BC-W31",  "Borland C++ 4.5 - Windows 3.1 - PROBABLY NOT WORKING",
-       "BC-MSDOS","Borland C++ 4.5 - MSDOS",
        "linux-elf","Linux elf",
        "ultrix-mips","DEC mips ultrix",
        "FreeBSD","FreeBSD distribution",
        "OS2-EMX", "EMX GCC OS/2",
-       "netware-clib", "CodeWarrior for NetWare - CLib",
-       "netware-libc", "CodeWarrior for NetWare - LibC",
+       "netware-clib", "CodeWarrior for NetWare - CLib - with WinSock Sockets",
+       "netware-libc", "CodeWarrior for NetWare - LibC - with WinSock Sockets",
+       "netware-libc-bsdsock", "CodeWarrior for NetWare - LibC - with BSD Sockets",
        "default","cc under unix",
        );
 
@@ -98,6 +99,8 @@ foreach (grep(!/^$/, split(/ /, $OPTIONS)))
        print STDERR "unknown option - $_\n" if !&read_options;
        }
 
+$no_static_engine = 0 if (!$shlib);
+
 $no_mdc2=1 if ($no_des);
 
 $no_ssl3=1 if ($no_md5 || $no_sha);
@@ -110,7 +113,8 @@ $out_def="out";
 $inc_def="outinc";
 $tmp_def="tmp";
 
-$mkdir="-mkdir";
+$perl="perl" unless defined $perl;
+$mkdir="-mkdir" unless defined $mkdir;
 
 ($ssl,$crypto)=("ssl","crypto");
 $ranlib="echo ranlib";
@@ -125,33 +129,12 @@ $bin_dir=(defined($VARS{'BIN'}))?$VARS{'BIN'}:'';
 $NT=0;
 
 push(@INC,"util/pl","pl");
-if ($platform eq "VC-MSDOS")
-       {
-       $asmbits=16;
-       $msdos=1;
-       require 'VC-16.pl';
-       }
-elsif ($platform eq "VC-W31-16")
-       {
-       $asmbits=16;
-       $msdos=1; $win16=1;
-       require 'VC-16.pl';
-       }
-elsif (($platform eq "VC-W31-32") || ($platform eq "VC-WIN16"))
+if (($platform =~ /VC-(.+)/))
        {
-       $asmbits=32;
-       $msdos=1; $win16=1;
-       require 'VC-16.pl';
-       }
-elsif (($platform eq "VC-WIN32") || ($platform eq "VC-NT"))
-       {
-       $NT = 1 if $platform eq "VC-NT";
+       $FLAVOR=$1;
+       $NT = 1 if $1 eq "NT";
        require 'VC-32.pl';
        }
-elsif ($platform eq "VC-CE")
-       {
-       require 'VC-CE.pl';
-       }
 elsif ($platform eq "Mingw32")
        {
        require 'Mingw32.pl';
@@ -165,23 +148,6 @@ elsif ($platform eq "BC-NT")
        $bc=1;
        require 'BC-32.pl';
        }
-elsif ($platform eq "BC-W31")
-       {
-       $bc=1;
-       $msdos=1; $w16=1;
-       require 'BC-16.pl';
-       }
-elsif ($platform eq "BC-Q16")
-       {
-       $msdos=1; $w16=1; $shlib=0; $qw=1;
-       require 'BC-16.pl';
-       }
-elsif ($platform eq "BC-MSDOS")
-       {
-       $asmbits=16;
-       $msdos=1;
-       require 'BC-16.pl';
-       }
 elsif ($platform eq "FreeBSD")
        {
        require 'unix.pl';
@@ -204,9 +170,11 @@ elsif ($platform eq "OS2-EMX")
        $wc=1;
        require 'OS2-EMX.pl';
        }
-elsif (($platform eq "netware-clib") || ($platform eq "netware-libc"))
+elsif (($platform eq "netware-clib") || ($platform eq "netware-libc") ||
+       ($platform eq "netware-libc-bsdsock"))
        {
-   $LIBC=1 if $platform eq "netware-libc";
+       $LIBC=1 if $platform eq "netware-libc" || $platform eq "netware-libc-bsdsock";
+       $BSDSOCK=1 if $platform eq "netware-libc-bsdsock";
        require 'netware.pl';
        }
 else
@@ -253,6 +221,16 @@ $cflags.=" -DOPENSSL_NO_ECDSA" if $no_ecdsa;
 $cflags.=" -DOPENSSL_NO_ECDH" if $no_ecdh;
 $cflags.=" -DOPENSSL_NO_ENGINE"   if $no_engine;
 $cflags.=" -DOPENSSL_NO_HW"   if $no_hw;
+
+if ($no_static_engine)
+       {
+       $cflags .= " -DOPENSSL_NO_STATIC_ENGINE";
+       }
+else
+       {
+       $cflags .= " -DOPENSSL_NO_DYNAMIC_ENGINE";
+       }
+
 #$cflags.=" -DRSAref"  if $rsaref ne "";
 
 ## if ($unix)
@@ -310,10 +288,10 @@ for (;;)
                { $ex_libs .= " $val";}
 
        if ($key eq "TEST")
-               { $test.=&var_add($dir,$val); }
+               { $test.=&var_add($dir,$val, 0); }
 
        if (($key eq "PROGS") || ($key eq "E_OBJ"))
-               { $e_exe.=&var_add($dir,$val); }
+               { $e_exe.=&var_add($dir,$val, 0); }
 
        if ($key eq "LIB")
                {
@@ -322,19 +300,45 @@ for (;;)
                }
 
        if ($key eq "EXHEADER")
-               { $exheader.=&var_add($dir,$val); }
+               { $exheader.=&var_add($dir,$val, 1); }
 
        if ($key eq "HEADER")
-               { $header.=&var_add($dir,$val); }
+               { $header.=&var_add($dir,$val, 1); }
 
-       if ($key eq "LIBOBJ")
-               { $libobj=&var_add($dir,$val); }
+       if ($key eq "LIBOBJ" && ($dir ne "engines" || !$no_static_engine))
+               { $libobj=&var_add($dir,$val, 0); }
+       if ($key eq "LIBNAMES" && $dir eq "engines" && $no_static_engine)
+               { $engines.=$val }
 
        if (!($_=<IN>))
                { $_="RELATIVE_DIRECTORY=FINISHED\n"; }
        }
 close(IN);
 
+if ($shlib)
+       {
+       $extra_install= <<"EOF";
+       \$(CP) \$(O_SSL) \$(INSTALLTOP)${o}bin
+       \$(CP) \$(O_CRYPTO) \$(INSTALLTOP)${o}bin
+       \$(CP) \$(L_SSL) \$(INSTALLTOP)${o}lib
+       \$(CP) \$(L_CRYPTO) \$(INSTALLTOP)${o}lib
+EOF
+       if ($no_static_engine)
+               {
+               $extra_install .= <<"EOF"
+       \$(MKDIR) \$(INSTALLTOP)${o}engines
+       \$(CP) \$(E_SHLIB) \$(INSTALLTOP)${o}engines
+EOF
+               }
+       }
+else
+       {
+       $extra_install= <<"EOF";
+       \$(CP) \$(O_SSL) \$(INSTALLTOP)${o}lib
+       \$(CP) \$(O_CRYPTO) \$(INSTALLTOP)${o}lib
+EOF
+       }
+
 $defs= <<"EOF";
 # This makefile has been automatically generated from the OpenSSL distribution.
 # This single makefile will build the complete OpenSSL distribution and
@@ -353,14 +357,6 @@ EOF
 
 $defs .= $preamble if defined $preamble;
 
-if ($platform eq "VC-CE")
-       {
-       $defs.= <<"EOF";
-!INCLUDE <\$(WCECOMPAT)/wcedefs.mak>
-
-EOF
-       }
-
 $defs.= <<"EOF";
 INSTALLTOP=$INSTALLTOP
 
@@ -413,6 +409,7 @@ TMP_D=$tmp_dir
 INC_D=$inc_dir
 INCO_D=$inc_dir${o}openssl
 
+PERL=$perl
 CP=$cp
 RM=$rm
 RANLIB=$ranlib
@@ -432,12 +429,14 @@ CRYPTO=$crypto
 # BIN_D  - Binary output directory
 # TEST_D - Binary test file output directory
 # LIB_D  - library output directory
+# ENG_D  - dynamic engine output directory
 # Note: if you change these point to different directories then uncomment out
 # the lines around the 'NB' comment below.
 # 
 BIN_D=\$(OUT_D)
 TEST_D=\$(OUT_D)
 LIB_D=\$(OUT_D)
+ENG_D=\$(OUT_D)
 
 # INCL_D - local library directory
 # OBJ_D  - temp object file directory
@@ -493,11 +492,11 @@ $banner
 headers: \$(HEADER) \$(EXHEADER)
        @
 
-lib: \$(LIBS_DEP)
+lib: \$(LIBS_DEP) \$(E_SHLIB)
 
 exe: \$(T_EXE) \$(BIN_D)$o\$(E_EXE)$exep
 
-install:
+install: all
        \$(MKDIR) \$(INSTALLTOP)
        \$(MKDIR) \$(INSTALLTOP)${o}bin
        \$(MKDIR) \$(INSTALLTOP)${o}include
@@ -505,8 +504,13 @@ install:
        \$(MKDIR) \$(INSTALLTOP)${o}lib
        \$(CP) \$(INCO_D)${o}*.\[ch\] \$(INSTALLTOP)${o}include${o}openssl
        \$(CP) \$(BIN_D)$o\$(E_EXE)$exep \$(INSTALLTOP)${o}bin
-       \$(CP) \$(O_SSL) \$(INSTALLTOP)${o}lib
-       \$(CP) \$(O_CRYPTO) \$(INSTALLTOP)${o}lib
+       \$(CP) apps${o}openssl.cnf \$(INSTALLTOP)
+$extra_install
+
+
+test: \$(T_EXE)
+       cd \$(BIN_D)
+       ..${o}ms${o}test
 
 clean:
        \$(RM) \$(TMP_D)$o*.*
@@ -565,11 +569,11 @@ foreach (split(/\s+/,$exheader)){ $h{$_}=1; }
 foreach (split(/\s+/,$header)) { $h.=$_." " unless $h{$_}; }
 chop($h); $header=$h;
 
-$defs.=&do_defs("HEADER",$header,"\$(INCL_D)",".h");
-$rules.=&do_copy_rule("\$(INCL_D)",$header,".h");
+$defs.=&do_defs("HEADER",$header,"\$(INCL_D)","");
+$rules.=&do_copy_rule("\$(INCL_D)",$header,"");
 
-$defs.=&do_defs("EXHEADER",$exheader,"\$(INCO_D)",".h");
-$rules.=&do_copy_rule("\$(INCO_D)",$exheader,".h");
+$defs.=&do_defs("EXHEADER",$exheader,"\$(INCO_D)","");
+$rules.=&do_copy_rule("\$(INCO_D)",$exheader,"");
 
 $defs.=&do_defs("T_OBJ",$test,"\$(OBJ_D)",$obj);
 $rules.=&do_compile_rule("\$(OBJ_D)",$test,"\$(APP_CFLAGS)");
@@ -664,6 +668,16 @@ foreach (split(/\s+/,$test))
        $rules.=&do_link_rule("\$(TEST_D)$o$t$exep",$tt,"\$(LIBS_DEP)","\$(L_LIBS) \$(EX_LIBS)");
        }
 
+$defs.=&do_defs("E_SHLIB",$engines,"\$(ENG_D)",$shlibp);
+
+foreach (split(/\s+/,$engines))
+       {
+       $rules.=&do_compile_rule("\$(OBJ_D)","engines${o}e_$_",$lib);
+       $rules.= &do_lib_rule("\$(OBJ_D)${o}e_${_}.obj","\$(ENG_D)$o$_$shlibp","",$shlib,"");
+       }
+
+
+
 $rules.= &do_lib_rule("\$(SSLOBJ)","\$(O_SSL)",$ssl,$shlib,"\$(SO_SSL)");
 $rules.= &do_lib_rule("\$(CRYPTOOBJ)","\$(O_CRYPTO)",$crypto,$shlib,"\$(SO_CRYPTO)");
 
@@ -675,7 +689,7 @@ if ($platform eq "linux-elf") {
     print <<"EOF";
 # Generate perlasm output files
 %.cpp:
-       (cd \$(\@D)/..; PERL=perl make -f Makefile.ssl asm/\$(\@F))
+       (cd \$(\@D)/..; PERL=perl make -f Makefile asm/\$(\@F))
 EOF
 }
 print "###################################################################\n";
@@ -687,7 +701,7 @@ print $rules;
 # directories
 sub var_add
        {
-       local($dir,$val)=@_;
+       local($dir,$val,$keepext)=@_;
        local(@a,$_,$ret);
 
        return("") if $no_engine && $dir =~ /\/engine/;
@@ -716,7 +730,7 @@ sub var_add
 
        $val =~ s/^\s*(.*)\s*$/$1/;
        @a=split(/\s+/,$val);
-       grep(s/\.[och]$//,@a);
+       grep(s/\.[och]$//,@a) unless $keepext;
 
        @a=grep(!/^e_.*_3d$/,@a) if $no_des;
        @a=grep(!/^e_.*_d$/,@a) if $no_des;
@@ -824,7 +838,7 @@ sub do_defs
                elsif ($var eq "SSLOBJ")
                        { $ret.="\$(OBJ_D)\\\$(SSL).res "; }
                }
-       chop($ret);
+       chomp($ret);
        $ret.="\n\n";
        return($ret);
        }
@@ -1001,11 +1015,20 @@ sub read_options
                                }
                        }
                }
+       elsif (/^no-comp$/) { $xcflags = "-DOPENSSL_NO_COMP $xcflags"; }
        elsif (/^enable-zlib$/) { $xcflags = "-DZLIB $xcflags"; }
        elsif (/^enable-zlib-dynamic$/)
                {
                $xcflags = "-DZLIB_SHARED -DZLIB $xcflags";
                }
+       elsif (/^no-static-engine/)
+               {
+               $no_static_engine = 1;
+               }
+       elsif (/^enable-static-engine/)
+               {
+               $no_static_engine = 0;
+               }
        # There are also enable-xxx options which correspond to
        # the no-xxx. Since the scalars are enabled by default
        # these can be ignored.