Experimental support for import of more options from Configure
authorDr. Stephen Henson <steve@openssl.org>
Sun, 6 Jan 2008 00:36:22 +0000 (00:36 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Sun, 6 Jan 2008 00:36:22 +0000 (00:36 +0000)
(via top level Makefile) into mk1mf builds. This avoids the need
to duplicate the CFLAG handling and can auto build assembly language
source files from perl scripts.

Extend VC-WIN32 Configure entry to include new options.

CHANGES
Configure
ms/do_nasm.bat
util/mk1mf.pl
util/pl/VC-32.pl

diff --git a/CHANGES b/CHANGES
index 8ee98d1f59dc71c38f4c35437adb8ba4abfd1e20..d4426974ead67b6c78f3f50dbfd8d38e88488e50 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,12 @@
 
  Changes between 0.9.8g and 0.9.9  [xx XXX xxxx]
 
+  *) Extend mk1mf to support importing of options and assembly language
+     files from Configure script, currently only included in VC-WIN32.
+     The assembly language rules can now optionally generate the source
+     files from the associated perl scripts.
+     [Steve Henson]
+
   *) Implement remaining functionality needed to support GOST ciphersuites.
      Interop testing has been performed using CryptoPro implementations.
      [Victor B. Wagner <vitus@cryptocom.ru>]
index f2fb01659231ad37cbdc4a9ae97f6d78f4498671..67f1cfa3aa3707f614b21fcbc3a76e154b5a50f2 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -121,6 +121,8 @@ my $x86_coff_asm="x86cpuid-cof.o:bn86-cof.o co86-cof.o mo86-cof.o:dx86-cof.o yx8
 my $x86_out_asm="x86cpuid-out.o:bn86-out.o co86-out.o mo86-out.o:dx86-out.o yx86-out.o:ax86-out.o:bx86-out.o:mx86-out.o:sx86-out.o sha256x86-out.o sha512x86-out.o:cx86-out.o:rx86-out.o:rm86-out.o:r586-out.o:wp_block.o w86mmx-out.o:";
 my $x86_macosx_asm="x86cpuid-macosx.o:bn86-macosx.o co86-macosx.o mo86-macosx.o:dx86-macosx.o yx86-macosx.o:ax86-macosx.o:bx86-macosx.o:mx86-macosx.o:sx86-macosx.o sha256x86-macosx.o sha512x86-macosx.o:cx86-macosx.o:rx86-macosx.o:rm86-macosx.o:r586-macosx.o:wp_block.o w86mmx-macosx.o:";
 
+my $x86_win32_asm="x86cpuid.o:bn-586.o co-586.o x86-mont.o:des-586.o crypt586.o:aes-586.o:bf-586.o:md5-586.o:sha1-586.o sha256-586.o sha512-586.o:cast-586.o:rc4-586.o:rmd-586.o:rc5-586.o:wp-mmx.o:";
+
 my $x86_64_asm="x86_64cpuid.o:x86_64-gcc.o x86_64-mont.o::aes-x86_64.o::md5-x86_64.o:sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o::rc4-x86_64.o:::wp-x86_64.o:";
 my $ia64_asm="ia64cpuid.o:bn-ia64.o::aes_core.o aes_cbc.o aes-ia64.o::md5-ia64.o:sha1-ia64.o sha256-ia64.o sha512-ia64.o::rc4-ia64.o rc4_skey.o::::";
 my $sparcv9_asm="sparcv9cap.o sparccpuid.o:bn-sparcv9.o sparcv9-mont.o sparcv9a-mont.o:des_enc-sparc.o fcrypt_b.o:aes_core.o aes_cbc.o aes-sparcv9.o:::sha1-sparcv9.o sha256-sparcv9.o sha512-sparcv9.o::::::";
@@ -480,7 +482,7 @@ my %table=(
 # Visual C targets
 "VC-NT","cl::::WINNT::BN_LLONG RC4_INDEX EXPORT_VAR_AS_FN ${x86_gcc_opts}:${no_asm}:win32",
 "VC-CE","cl::::WINCE::BN_LLONG RC4_INDEX EXPORT_VAR_AS_FN ${x86_gcc_opts}:${no_asm}:win32",
-"VC-WIN32","cl::::WIN32::BN_LLONG RC4_INDEX EXPORT_VAR_AS_FN ${x86_gcc_opts}:${no_asm}:win32",
+"VC-WIN32","cl:-W3 -WX -Gs0 -GF -Gy -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE:::WIN32::BN_LLONG RC4_INDEX EXPORT_VAR_AS_FN ${x86_gcc_opts}:${x86_win32_asm}:win32",
 
 # Borland C++ 4.5
 "BC-32","bcc32::::WIN32::BN_LLONG DES_PTR RC4_INDEX EXPORT_VAR_AS_FN:${no_asm}:win32",
@@ -1256,7 +1258,7 @@ $cpuid_obj="" if ($processor eq "386");
 
 $bn_obj = $bn_asm unless $bn_obj ne "";
 # bn86* is the only one implementing bn_*_part_words
-$cflags.=" -DOPENSSL_BN_ASM_PART_WORDS" if ($bn_obj =~ /bn86/);
+$cflags.=" -DOPENSSL_BN_ASM_PART_WORDS" if ($bn_obj =~ /bn(86|-586)/);
 $cflags.=" -DOPENSSL_IA32_SSE2" if (!$no_sse2 && $bn_obj =~ /bn86/);
 
 $cflags.=" -DOPENSSL_BN_ASM_MONT" if ($bn_obj =~ /\-mont|mo86\-/);
index 7cceea023a767f9b1a606129e1762934211f6a0d..7b3f3edbf03478f0e50c52b5ce18bd26fdfbecc9 100755 (executable)
@@ -1,82 +1,4 @@
 
-@echo off
-
-SET ASMOPTS=-DOPENSSL_IA32_SSE2
-echo Generating x86 for NASM assember
-
-echo Bignum
-cd crypto\bn\asm
-perl bn-586.pl win32n %ASMOPTS% > bn_win32.asm
-perl co-586.pl win32n %ASMOPTS% > co_win32.asm
-perl x86-mont.pl win32n %ASMOPTS% > mo_win32.asm
-cd ..\..\..
-
-echo AES
-cd crypto\aes\asm
-perl aes-586.pl win32n %ASMOPTS% > a_win32.asm
-cd ..\..\..
-
-echo DES
-cd crypto\des\asm
-perl des-586.pl win32n %ASMOPTS% > d_win32.asm
-cd ..\..\..
-
-echo "crypt(3)"
-
-cd crypto\des\asm
-perl crypt586.pl win32n %ASMOPTS% > y_win32.asm
-cd ..\..\..
-
-echo Blowfish
-
-cd crypto\bf\asm
-perl bf-586.pl win32n %ASMOPTS% > b_win32.asm
-cd ..\..\..
-
-echo CAST5
-cd crypto\cast\asm
-perl cast-586.pl win32n %ASMOPTS% > c_win32.asm
-cd ..\..\..
-
-echo RC4
-cd crypto\rc4\asm
-perl rc4-586.pl win32n %ASMOPTS% > r4_win32.asm
-cd ..\..\..
-
-echo MD5
-cd crypto\md5\asm
-perl md5-586.pl win32n %ASMOPTS% > m5_win32.asm
-cd ..\..\..
-
-echo SHA1
-cd crypto\sha\asm
-perl sha1-586.pl win32n %ASMOPTS% > s1_win32.asm
-perl sha256-586.pl win32n %ASMOPTS% > sha256_win32.asm
-perl sha512-586.pl win32n %ASMOPTS% > sha512_win32.asm
-cd ..\..\..
-
-echo RIPEMD160
-cd crypto\ripemd\asm
-perl rmd-586.pl win32n %ASMOPTS% > rm_win32.asm
-cd ..\..\..
-
-echo RC5\32
-cd crypto\rc5\asm
-perl rc5-586.pl win32n %ASMOPTS% > r5_win32.asm
-cd ..\..\..
-
-echo Whirlpool
-cd crypto\whrlpool\asm
-perl wp-mmx.pl win32n %ASMOPTS% > wp_win32.asm
-cd ..\..\..
-
-echo CPU-ID
-cd crypto
-perl x86cpuid.pl win32n %ASMOPTS% > cpu_win32.asm
-cd ..
-
-echo on
-
 perl util\mkfiles.pl >MINFO
 perl util\mk1mf.pl nasm VC-WIN32 >ms\nt.mak
 perl util\mk1mf.pl dll nasm VC-WIN32 >ms\ntdll.mak
index a76199cf58e588de2c1d033aa87d81f8ec04f8d4..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);
 
@@ -48,6 +76,7 @@ $infile="MINFO";
        "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="";
@@ -134,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;
@@ -947,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);
        }
index 5cdf62264f1a4bdf6d11c40227be8e6a7c90e29a..f9ab6ab9f65fdc6901475db0e940fabfdcd49228 100644 (file)
@@ -95,9 +95,7 @@ elsif ($FLAVOR =~ /CE/)
     }
 else   # Win32
     {
-    $base_cflags=' /W3 /WX /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32';
-    $base_cflags.=' -D_CRT_SECURE_NO_DEPRECATE';       # shut up VC8
-    $base_cflags.=' -D_CRT_NONSTDC_NO_DEPRECATE';      # shut up VC8
+    $base_cflags= " $mf_cflag";
     my $f = $shlib?' /MD':' /MT';
     $lib_cflag='/Zl' if (!$shlib);     # remove /DEFAULTLIBs from static lib
     $opt_cflags=$f.' /Ox /O2 /Ob2';
@@ -122,6 +120,7 @@ else
        }
 
 $obj='.obj';
+$asm_suffix='.asm';
 $ofile="/Fo";
 
 # EXE linking stuff
@@ -167,11 +166,13 @@ if ($nasm) {
        my $vew=`nasmw -v 2>NUL`;
        # pick newest version
        $asm=($ver gt $vew?"nasm":"nasmw")." -f win32";
+       $asmtype="win32n";
        $afile='-o ';
 } else {
        $asm='ml /Cp /coff /c /Cx';
        $asm.=" /Zi" if $debug;
        $afile='/Fo';
+       $asmtype="win32";
 }
 
 $bn_asm_obj='';
@@ -183,36 +184,19 @@ $bf_enc_src='';
 
 if (!$no_asm)
        {
-       $aes_asm_obj='crypto\aes\asm\a_win32.obj';
-       $aes_asm_src='crypto\aes\asm\a_win32.asm';
-       $bn_asm_obj='crypto\bn\asm\bn_win32.obj crypto\bn\asm\mo_win32.obj';
-       $bn_asm_src='crypto\bn\asm\bn_win32.asm crypto\bn\asm\mo_win32.asm';
-       $bnco_asm_obj='crypto\bn\asm\co_win32.obj';
-       $bnco_asm_src='crypto\bn\asm\co_win32.asm';
-       $des_enc_obj='crypto\des\asm\d_win32.obj crypto\des\asm\y_win32.obj';
-       $des_enc_src='crypto\des\asm\d_win32.asm crypto\des\asm\y_win32.asm';
-       $bf_enc_obj='crypto\bf\asm\b_win32.obj';
-       $bf_enc_src='crypto\bf\asm\b_win32.asm';
-       $cast_enc_obj='crypto\cast\asm\c_win32.obj';
-       $cast_enc_src='crypto\cast\asm\c_win32.asm';
-       $rc4_enc_obj='crypto\rc4\asm\r4_win32.obj';
-       $rc4_enc_src='crypto\rc4\asm\r4_win32.asm';
-       $rc5_enc_obj='crypto\rc5\asm\r5_win32.obj';
-       $rc5_enc_src='crypto\rc5\asm\r5_win32.asm';
-       $md5_asm_obj='crypto\md5\asm\m5_win32.obj';
-       $md5_asm_src='crypto\md5\asm\m5_win32.asm';
-       $sha1_asm_obj='crypto\sha\asm\s1_win32.obj crypto\sha\asm\sha256_win32.obj crypto\sha\asm\sha512_win32.obj';
-       $sha1_asm_src='crypto\sha\asm\s1_win32.asm crypto\sha\asm\sha256_win32.asm crypto\sha\asm\sha512_win32.asm';
-       $rmd160_asm_obj='crypto\ripemd\asm\rm_win32.obj';
-       $rmd160_asm_src='crypto\ripemd\asm\rm_win32.asm';
-       $whirlpool_asm_obj='crypto\whrlpool\asm\wp_win32.obj';
-       $whirlpool_asm_src='crypto\whrlpool\asm\wp_win32.asm';
-       $cpuid_asm_obj='crypto\cpu_win32.obj';
-       $cpuid_asm_src='crypto\cpu_win32.asm';
-       $cflags.=" -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2";
-       $cflags.=" -DOPENSSL_BN_ASM_PART_WORDS -DBN_ASM -DOPENSSL_BN_ASM_MONT";
-        $cflags.=" -DAES_ASM -DMD5_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM";
-       $cflags.=" -DRMD160_ASM -DWHIRLPOOL_ASM";
+       win32_import_asm($mf_bn_asm, "bn", \$bn_asm_obj, \$bn_asm_src);
+       win32_import_asm($mf_aes_asm, "aes", \$aes_asm_obj, \$aes_asm_src);
+       win32_import_asm($mf_des_asm, "des", \$des_enc_obj, \$des_enc_src);
+       win32_import_asm($mf_bf_asm, "bf", \$bf_enc_obj, \$bf_enc_src);
+       win32_import_asm($mf_cast_asm, "cast", \$cast_enc_obj, \$cast_enc_src);
+       win32_import_asm($mf_rc4_asm, "rc4", \$rc4_enc_obj, \$rc4_enc_src);
+       win32_import_asm($mf_rc5_asm, "rc5", \$rc5_enc_obj, \$rc5_enc_src);
+       win32_import_asm($mf_md5_asm, "md5", \$md5_asm_obj, \$md5_asm_src);
+       win32_import_asm($mf_sha_asm, "sha", \$sha1_asm_obj, \$sha1_asm_src);
+       win32_import_asm($mf_rmd_asm, "ripemd", \$rmd160_asm_obj, \$rmd160_asm_src);
+       win32_import_asm($mf_wp_asm, "whrlpool", \$whirlpool_asm_obj, \$whirlpool_asm_src);
+       win32_import_asm($mf_cpuid_asm, "", \$cpuid_asm_obj, \$cpuid_asm_src);
+       $perl_asm = 1;
        }
 
 if ($shlib && $FLAVOR !~ /CE/)
@@ -318,4 +302,31 @@ sub do_link_rule
        return($ret);
        }
 
+sub win32_import_asm
+       {
+       my ($mf_var, $asm_name, $oref, $sref) = @_;
+       my $asm_dir;
+       if ($asm_name eq "")
+               {
+               $asm_dir = "crypto\\";
+               }
+       else
+               {
+               $asm_dir = "crypto\\$asm_name\\asm\\";
+               }
+
+       $$oref = "";
+       $mf_var =~ s/\.o/.obj/g;
+
+       foreach (split(/ /, $mf_var))
+               {
+               $$oref .= $asm_dir . $_ . " ";
+               }
+       $$oref =~ s/ $//;
+       $$sref = $$oref;
+       $$sref =~ s/\.obj/.asm/g;
+
+       }
+
+
 1;