Experimental support for import of more options from Configure
[openssl.git] / util / mk1mf.pl
index 3bbad5150948fa4cb27cfdd9008a06565a97656e..0bcda863c2c83b1a85cb5b38eb1b2cabffa82577 100755 (executable)
@@ -15,14 +15,42 @@ my $no_static_engine = 1;
 my $engines = "";
 local $zlib_opt = 0;   # 0 = no zlib, 1 = static, 2 = dynamic
 local $zlib_lib = "";
+local $perl_asm = 0;   # 1 to autobuild asm files from perl scripts
+
+# Options to import from top level Makefile
+
+my %mf_import = (
+       VERSION        => \$ssl_version,
+       OPTIONS        => \$OPTIONS,
+       INSTALLTOP     => \$INSTALLTOP,
+       OPENSSLDIR     => \$OPENSSLDIR,
+       PLATFORM       => \$mf_platform,
+       CFLAG          => \$mf_cflag,
+       DEPFLAG        => \$mf_depflag,
+       CPUID_OBJ      => \$mf_cpuid_asm,
+       BN_ASM         => \$mf_bn_asm,
+       DES_ENC        => \$mf_des_asm,
+       AES_ENC        => \$mf_aes_asm,
+       BF_ENC         => \$mf_bf_asm,
+       CAST_ENC       => \$mf_cast_asm,
+       RC4_ENC        => \$mf_rc4_asm,
+       RC5_ENC        => \$mf_rc5_asm,
+       MD5_ASM_OBJ    => \$mf_md5_asm,
+       SHA1_ASM_OBJ   => \$mf_sha_asm,
+       RMD160_ASM_OBJ => \$mf_rmd_asm,
+       WP_ASM_OBJ     => \$mf_wp_asm,
+       CMLL_ENC       => \$mf_cm_asm
+);
 
 
 open(IN,"<Makefile") || die "unable to open Makefile!\n";
 while(<IN>) {
-    $ssl_version=$1 if (/^VERSION=(.*)$/);
-    $OPTIONS=$1 if (/^OPTIONS=(.*)$/);
-    $INSTALLTOP=$1 if (/^INSTALLTOP=(.*$)/);
-    $OPENSSLDIR=$1 if (/^OPENSSLDIR=(.*$)/);
+    my ($mf_opt, $mf_ref);
+    while (($mf_opt, $mf_ref) = each %mf_import) {
+       if (/^$mf_opt\s*=\s*(.*)$/) {
+          $$mf_ref = $1;
+       }
+    }
 }
 close(IN);
 
@@ -44,9 +72,11 @@ $infile="MINFO";
        "FreeBSD","FreeBSD distribution",
        "OS2-EMX", "EMX GCC OS/2",
        "netware-clib", "CodeWarrior for NetWare - CLib - with WinSock Sockets",
+       "netware-clib-bsdsock", "CodeWarrior for NetWare - CLib - with BSD Sockets",
        "netware-libc", "CodeWarrior for NetWare - LibC - with WinSock Sockets",
        "netware-libc-bsdsock", "CodeWarrior for NetWare - LibC - with BSD Sockets",
        "default","cc under unix",
+       "auto", "auto detect from top level Makefile"
        );
 
 $platform="";
@@ -78,7 +108,7 @@ and [options] can be one of
        no-hw                                   - No hw
        nasm                                    - Use NASM for x86 asm
        nw-nasm                                 - Use NASM x86 asm for NetWare
-       nw-mwasm                                        - Use Metrowerks x86 asm for NetWare
+       nw-mwasm                                - Use Metrowerks x86 asm for NetWare
        gaswin                                  - Use GNU as with Mingw32
        no-socks                                - No socket code
        no-err                                  - No error strings
@@ -133,6 +163,12 @@ $bin_dir=(defined($VARS{'BIN'}))?$VARS{'BIN'}:'';
 $NT=0;
 
 push(@INC,"util/pl","pl");
+
+if ($platform eq "auto") {
+       $platform = $mf_platform;
+       print STDERR "Imported platform $mf_platform\n";
+}
+
 if (($platform =~ /VC-(.+)/))
        {
        $FLAVOR=$1;
@@ -175,10 +211,10 @@ elsif ($platform eq "OS2-EMX")
        require 'OS2-EMX.pl';
        }
 elsif (($platform eq "netware-clib") || ($platform eq "netware-libc") ||
-       ($platform eq "netware-libc-bsdsock"))
+       ($platform eq "netware-clib-bsdsock") || ($platform eq "netware-libc-bsdsock"))
        {
        $LIBC=1 if $platform eq "netware-libc" || $platform eq "netware-libc-bsdsock";
-       $BSDSOCK=1 if $platform eq "netware-libc-bsdsock";
+       $BSDSOCK=1 if ($platform eq "netware-libc-bsdsock") || ($platform eq "netware-clib-bsdsock");
        require 'netware.pl';
        }
 else
@@ -401,6 +437,8 @@ LINK=$link
 LFLAGS=$lflags
 RSC=$rsc
 
+AES_ASM_OBJ=$aes_asm_obj
+AES_ASM_SRC=$aes_asm_src
 BN_ASM_OBJ=$bn_asm_obj
 BN_ASM_SRC=$bn_asm_src
 BNCO_ASM_OBJ=$bnco_asm_obj
@@ -527,7 +565,7 @@ install: all
        \$(MKDIR) \"\$(INSTALLTOP)${o}include\"
        \$(MKDIR) \"\$(INSTALLTOP)${o}include${o}openssl\"
        \$(MKDIR) \"\$(INSTALLTOP)${o}lib\"
-       \$(CP) \"\$(INCO_D)${o}*.\[ch\] \$(INSTALLTOP)${o}include${o}openssl\"
+       \$(CP) \"\$(INCO_D)${o}*.\[ch\]\" \"\$(INSTALLTOP)${o}include${o}openssl\"
        \$(CP) \"\$(BIN_D)$o\$(E_EXE)$exep \$(INSTALLTOP)${o}bin\"
        \$(MKDIR) \"\$(OPENSSLDIR)\"
        \$(CP) apps${o}openssl.cnf \"\$(OPENSSLDIR)\"
@@ -618,6 +656,12 @@ foreach (values %lib_nam)
                next;
                }
 
+       if (($aes_asm_obj ne "") && ($_ eq "CRYPTO"))
+               {
+               $lib_obj =~ s/\s(\S*\/aes_core\S*)/ \$(AES_ASM_OBJ)/;
+               $lib_obj =~ s/\s\S*\/aes_cbc\S*//;
+               $rules.=&do_asm_rule($aes_asm_obj,$aes_asm_src);
+               }
        if (($bn_asm_obj ne "") && ($_ eq "CRYPTO"))
                {
                $lib_obj =~ s/\s\S*\/bn_asm\S*/ \$(BN_ASM_OBJ)/;
@@ -859,6 +903,7 @@ sub do_defs
                else    { $pf=$postfix; }
                if ($_ =~ /BN_ASM/)     { $t="$_ "; }
                elsif ($_ =~ /BNCO_ASM/){ $t="$_ "; }
+               elsif ($_ =~ /AES_ASM/){ $t="$_ "; }
                elsif ($_ =~ /DES_ENC/) { $t="$_ "; }
                elsif ($_ =~ /BF_ENC/)  { $t="$_ "; }
                elsif ($_ =~ /CAST_ENC/){ $t="$_ "; }
@@ -937,13 +982,25 @@ sub do_asm_rule
        $target =~ s/\//$o/g if $o ne "/";
        $src =~ s/\//$o/g if $o ne "/";
 
-       @s=split(/\s+/,$src);
        @t=split(/\s+/,$target);
+       @s=split(/\s+/,$src);
+
 
        for ($i=0; $i<=$#s; $i++)
                {
-               $ret.="$t[$i]: $s[$i]\n";
-               $ret.="\t\$(ASM) $afile$t[$i] \$(SRC_D)$o$s[$i]\n\n";
+               my $objfile = $t[$i];
+               my $srcfile = $s[$i];
+
+               if ($perl_asm == 1)
+                       {
+                       my $plasm = $objfile;
+                       $plasm =~ s/${obj}/.pl/;
+                       $ret.="$srcfile: $plasm\n";
+                       $ret.="\t\$(PERL) $plasm $asmtype \$(CFLAG) >$srcfile\n\n";
+                       }
+
+               $ret.="$objfile: $srcfile\n";
+               $ret.="\t\$(ASM) $afile$objfile \$(SRC_D)$o$srcfile\n\n";
                }
        return($ret);
        }