experimental-foo support for mk1mf.pl.
[openssl.git] / util / mk1mf.pl
index 7f901ee934a73b7831fd63c27b822f153902883e..ecd046f9b786013e9acd900bead423307b151804 100755 (executable)
@@ -6,6 +6,7 @@
 #
 
 $INSTALLTOP="/usr/local/ssl";
+$OPENSSLDIR="/usr/local/ssl";
 $OPTIONS="";
 $ssl_version="";
 $banner="\t\@echo Building OpenSSL";
@@ -14,13 +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=(.*$)/);
+    my ($mf_opt, $mf_ref);
+    while (($mf_opt, $mf_ref) = each %mf_import) {
+       if (/^$mf_opt\s*=\s*(.*)$/) {
+          $$mf_ref = $1;
+       }
+    }
 }
 close(IN);
 
@@ -42,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="";
@@ -63,7 +95,7 @@ and [options] can be one of
        no-md2 no-md4 no-md5 no-sha no-mdc2     - Skip this digest
        no-ripemd
        no-rc2 no-rc4 no-rc5 no-idea no-des     - Skip this symetric cipher
-       no-bf no-cast no-aes
+       no-bf no-cast no-aes no-camellia no-seed
        no-rsa no-dsa no-dh                     - Skip this public key cipher
        no-ssl2 no-ssl3                         - Skip this version of SSL
        just-ssl                                - remove all non-ssl keys/digest
@@ -76,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
@@ -131,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;
@@ -173,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
@@ -197,6 +235,8 @@ $cflags= "$xcflags$cflags" if $xcflags ne "";
 
 $cflags.=" -DOPENSSL_NO_IDEA" if $no_idea;
 $cflags.=" -DOPENSSL_NO_AES"  if $no_aes;
+$cflags.=" -DOPENSSL_NO_CAMELLIA"  if $no_camellia;
+$cflags.=" -DOPENSSL_NO_SEED" if $no_seed;
 $cflags.=" -DOPENSSL_NO_RC2"  if $no_rc2;
 $cflags.=" -DOPENSSL_NO_RC4"  if $no_rc4;
 $cflags.=" -DOPENSSL_NO_RC5"  if $no_rc5;
@@ -217,6 +257,8 @@ $cflags.=" -DOPENSSL_NO_WHIRLPOOL"   if $no_whirlpool;
 $cflags.=" -DOPENSSL_NO_SOCK" if $no_sock;
 $cflags.=" -DOPENSSL_NO_SSL2" if $no_ssl2;
 $cflags.=" -DOPENSSL_NO_SSL3" if $no_ssl3;
+$cflags.=" -DOPENSSL_NO_TLSEXT" if $no_tlsext;
+$cflags.=" -DOPENSSL_NO_CMS" if $no_cms;
 $cflags.=" -DOPENSSL_NO_ERR"  if $no_err;
 $cflags.=" -DOPENSSL_NO_KRB5" if $no_krb5;
 $cflags.=" -DOPENSSL_NO_EC"   if $no_ec;
@@ -224,7 +266,7 @@ $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;
-
+$cflags.=" -DOPENSSL_NO_JPAKE"    if $no_jpake;
 $cflags.= " -DZLIB" if $zlib_opt;
 $cflags.= " -DZLIB_SHARED" if $zlib_opt == 2;
 
@@ -262,6 +304,7 @@ if ($msdos)
 $link="$bin_dir$link" if ($link !~ /^\$/);
 
 $INSTALLTOP =~ s|/|$o|g;
+$OPENSSLDIR =~ s|/|$o|g;
 
 #############################################
 # We parse in input file and 'store' info for later printing.
@@ -331,24 +374,24 @@ 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
+       \$(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
+       \$(MKDIR) \"\$(INSTALLTOP)${o}lib${o}engines\"
+       \$(CP) \"\$(E_SHLIB)\" \"\$(INSTALLTOP)${o}lib${o}engines\"
 EOF
                }
        }
 else
        {
        $extra_install= <<"EOF";
-       \$(CP) \$(O_SSL) \$(INSTALLTOP)${o}lib
-       \$(CP) \$(O_CRYPTO) \$(INSTALLTOP)${o}lib
+       \$(CP) \"\$(O_SSL)\" \"\$(INSTALLTOP)${o}lib\"
+       \$(CP) \"\$(O_CRYPTO)\" \"\$(INSTALLTOP)${o}lib\"
 EOF
        $ex_libs .= " $zlib_lib" if $zlib_opt == 1;
        }
@@ -373,6 +416,7 @@ $defs .= $preamble if defined $preamble;
 
 $defs.= <<"EOF";
 INSTALLTOP=$INSTALLTOP
+OPENSSLDIR=$OPENSSLDIR
 
 # Set your compiler options
 PLATFORM=$platform
@@ -394,29 +438,6 @@ LINK=$link
 LFLAGS=$lflags
 RSC=$rsc
 
-BN_ASM_OBJ=$bn_asm_obj
-BN_ASM_SRC=$bn_asm_src
-BNCO_ASM_OBJ=$bnco_asm_obj
-BNCO_ASM_SRC=$bnco_asm_src
-DES_ENC_OBJ=$des_enc_obj
-DES_ENC_SRC=$des_enc_src
-BF_ENC_OBJ=$bf_enc_obj
-BF_ENC_SRC=$bf_enc_src
-CAST_ENC_OBJ=$cast_enc_obj
-CAST_ENC_SRC=$cast_enc_src
-RC4_ENC_OBJ=$rc4_enc_obj
-RC4_ENC_SRC=$rc4_enc_src
-RC5_ENC_OBJ=$rc5_enc_obj
-RC5_ENC_SRC=$rc5_enc_src
-MD5_ASM_OBJ=$md5_asm_obj
-MD5_ASM_SRC=$md5_asm_src
-SHA1_ASM_OBJ=$sha1_asm_obj
-SHA1_ASM_SRC=$sha1_asm_src
-RMD160_ASM_OBJ=$rmd160_asm_obj
-RMD160_ASM_SRC=$rmd160_asm_src
-WHIRLPOOL_ASM_OBJ=$whirlpool_asm_obj
-WHIRLPOOL_ASM_SRC=$whirlpool_asm_src
-
 # The output directory for everything intersting
 OUT_D=$out_dir
 # The output directory for all the temporary muck
@@ -488,7 +509,7 @@ banner:
 $banner
 
 \$(TMP_D):
-       \$(MKDIR) \$(TMP_D)
+       \$(MKDIR) \"\$(TMP_D)\"
 # NB: uncomment out these lines if BIN_D, TEST_D and LIB_D are different
 #\$(BIN_D):
 #      \$(MKDIR) \$(BIN_D)
@@ -497,13 +518,13 @@ $banner
 #      \$(MKDIR) \$(TEST_D)
 
 \$(LIB_D):
-       \$(MKDIR) \$(LIB_D)
+       \$(MKDIR) \"\$(LIB_D)\"
 
 \$(INCO_D): \$(INC_D)
-       \$(MKDIR) \$(INCO_D)
+       \$(MKDIR) \"\$(INCO_D)\"
 
 \$(INC_D):
-       \$(MKDIR) \$(INC_D)
+       \$(MKDIR) \"\$(INC_D)\"
 
 headers: \$(HEADER) \$(EXHEADER)
        @
@@ -513,14 +534,15 @@ lib: \$(LIBS_DEP) \$(E_SHLIB)
 exe: \$(T_EXE) \$(BIN_D)$o\$(E_EXE)$exep
 
 install: all
-       \$(MKDIR) \$(INSTALLTOP)
-       \$(MKDIR) \$(INSTALLTOP)${o}bin
-       \$(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) \$(BIN_D)$o\$(E_EXE)$exep \$(INSTALLTOP)${o}bin
-       \$(CP) apps${o}openssl.cnf \$(INSTALLTOP)
+       \$(MKDIR) \"\$(INSTALLTOP)\"
+       \$(MKDIR) \"\$(INSTALLTOP)${o}bin\"
+       \$(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) \"\$(BIN_D)$o\$(E_EXE)$exep \$(INSTALLTOP)${o}bin\"
+       \$(MKDIR) \"\$(OPENSSLDIR)\"
+       \$(CP) apps${o}openssl.cnf \"\$(OPENSSLDIR)\"
 $extra_install
 
 
@@ -608,62 +630,6 @@ foreach (values %lib_nam)
                next;
                }
 
-       if (($bn_asm_obj ne "") && ($_ eq "CRYPTO"))
-               {
-               $lib_obj =~ s/\s\S*\/bn_asm\S*/ \$(BN_ASM_OBJ)/;
-               $rules.=&do_asm_rule($bn_asm_obj,$bn_asm_src);
-               }
-       if (($bnco_asm_obj ne "") && ($_ eq "CRYPTO"))
-               {
-               $lib_obj .= "\$(BNCO_ASM_OBJ)";
-               $rules.=&do_asm_rule($bnco_asm_obj,$bnco_asm_src);
-               }
-       if (($des_enc_obj ne "") && ($_ eq "CRYPTO"))
-               {
-               $lib_obj =~ s/\s\S*des_enc\S*/ \$(DES_ENC_OBJ)/;
-               $lib_obj =~ s/\s\S*\/fcrypt_b\S*\s*/ /;
-               $rules.=&do_asm_rule($des_enc_obj,$des_enc_src);
-               }
-       if (($bf_enc_obj ne "") && ($_ eq "CRYPTO"))
-               {
-               $lib_obj =~ s/\s\S*\/bf_enc\S*/ \$(BF_ENC_OBJ)/;
-               $rules.=&do_asm_rule($bf_enc_obj,$bf_enc_src);
-               }
-       if (($cast_enc_obj ne "") && ($_ eq "CRYPTO"))
-               {
-               $lib_obj =~ s/(\s\S*\/c_enc\S*)/ \$(CAST_ENC_OBJ)/;
-               $rules.=&do_asm_rule($cast_enc_obj,$cast_enc_src);
-               }
-       if (($rc4_enc_obj ne "") && ($_ eq "CRYPTO"))
-               {
-               $lib_obj =~ s/\s\S*\/rc4_enc\S*/ \$(RC4_ENC_OBJ)/;
-               $rules.=&do_asm_rule($rc4_enc_obj,$rc4_enc_src);
-               }
-       if (($rc5_enc_obj ne "") && ($_ eq "CRYPTO"))
-               {
-               $lib_obj =~ s/\s\S*\/rc5_enc\S*/ \$(RC5_ENC_OBJ)/;
-               $rules.=&do_asm_rule($rc5_enc_obj,$rc5_enc_src);
-               }
-       if (($md5_asm_obj ne "") && ($_ eq "CRYPTO"))
-               {
-               $lib_obj =~ s/\s(\S*\/md5_dgst\S*)/ $1 \$(MD5_ASM_OBJ)/;
-               $rules.=&do_asm_rule($md5_asm_obj,$md5_asm_src);
-               }
-       if (($sha1_asm_obj ne "") && ($_ eq "CRYPTO"))
-               {
-               $lib_obj =~ s/\s(\S*\/sha1dgst\S*)/ $1 \$(SHA1_ASM_OBJ)/;
-               $rules.=&do_asm_rule($sha1_asm_obj,$sha1_asm_src);
-               }
-       if (($rmd160_asm_obj ne "") && ($_ eq "CRYPTO"))
-               {
-               $lib_obj =~ s/\s(\S*\/rmd_dgst\S*)/ $1 \$(RMD160_ASM_OBJ)/;
-               $rules.=&do_asm_rule($rmd160_asm_obj,$rmd160_asm_src);
-               }
-       if (($whirlpool_asm_obj ne "") && ($_ eq "CRYPTO"))
-               {
-               $lib_obj =~ s/\s(\S*\/wp_dgst\S*)/ $1 \$(WHIRLPOOL_ASM_OBJ)/;
-               $rules.=&do_asm_rule($whirlpool_asm_obj,$whirlpool_asm_src);
-               }
        $defs.=&do_defs(${_}."OBJ",$lib_obj,"\$(OBJ_D)",$obj);
        $lib=($slib)?" \$(SHLIB_CFLAGS)".$shlib_ex_cflags{$_}:" \$(LIB_CFLAGS)";
        $rules.=&do_compile_rule("\$(OBJ_D)",$lib_obj{$_},$lib);
@@ -729,6 +695,8 @@ sub var_add
        return("") if $no_hw   && $dir =~ /\/hw/;
        return("") if $no_idea && $dir =~ /\/idea/;
        return("") if $no_aes  && $dir =~ /\/aes/;
+       return("") if $no_camellia  && $dir =~ /\/camellia/;
+       return("") if $no_seed && $dir =~ /\/seed/;
        return("") if $no_rc2  && $dir =~ /\/rc2/;
        return("") if $no_rc4  && $dir =~ /\/rc4/;
        return("") if $no_rc5  && $dir =~ /\/rc5/;
@@ -737,6 +705,8 @@ sub var_add
        return("") if $no_dsa  && $dir =~ /\/dsa/;
        return("") if $no_dh   && $dir =~ /\/dh/;
        return("") if $no_ec   && $dir =~ /\/ec/;
+       return("") if $no_cms  && $dir =~ /\/cms/;
+       return("") if $no_jpake  && $dir =~ /\/jpake/;
        if ($no_des && $dir =~ /\/des/)
                {
                if ($val =~ /read_pwd/)
@@ -763,6 +733,8 @@ sub var_add
        @a=grep(!/^e_.*_bf$/,@a) if $no_bf;
        @a=grep(!/^e_.*_c$/,@a) if $no_cast;
        @a=grep(!/^e_rc4$/,@a) if $no_rc4;
+       @a=grep(!/^e_camellia$/,@a) if $no_camellia;
+       @a=grep(!/^e_seed$/,@a) if $no_seed;
 
        @a=grep(!/(^s2_)|(^s23_)/,@a) if $no_ssl2;
        @a=grep(!/(^s3_)|(^s23_)/,@a) if $no_ssl3;
@@ -839,6 +811,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="$_ "; }
@@ -848,6 +821,7 @@ sub do_defs
                elsif ($_ =~ /SHA1_ASM/){ $t="$_ "; }
                elsif ($_ =~ /RMD160_ASM/){ $t="$_ "; }
                elsif ($_ =~ /WHIRLPOOL_ASM/){ $t="$_ "; }
+               elsif ($_ =~ /CPUID_ASM/){ $t="$_ "; }
                else    { $t="$location${o}$_$pf "; }
 
                $Vars{$var}.="$t ";
@@ -874,6 +848,13 @@ sub bname
        return($ret);
        }
 
+# return the leading path
+sub dname
+       {
+       my $ret=shift;
+       $ret =~ s/(^.*)[\\\/][^\\\/]+$/$1/;
+       return($ret);
+       }
 
 ##############################################################
 # do a rule for each file that says 'compile' to new direcory
@@ -881,19 +862,61 @@ sub bname
 sub do_compile_rule
        {
        local($to,$files,$ex)=@_;
-       local($ret,$_,$n);
-       
+       local($ret,$_,$n,$d,$s);
+
        $files =~ s/\//$o/g if $o ne '/';
        foreach (split(/\s+/,$files))
                {
                $n=&bname($_);
-               $ret.=&cc_compile_target("$to${o}$n$obj","${_}.c",$ex)
+               $d=&dname($_);
+               if (-f "${_}.c")
+                       {
+                       $ret.=&cc_compile_target("$to${o}$n$obj","${_}.c",$ex)
+                       }
+               elsif (-f ($s="${d}${o}asm${o}${n}.pl") or
+                      ($s=~s/sha256/sha512/ and -f $s) or
+                      -f ($s="${d}${o}${n}.pl"))
+                       {
+                       $ret.=&perlasm_compile_target("$to${o}$n$obj",$s,$n);
+                       }
+               elsif (-f ($s="${d}${o}asm${o}${n}.S") or
+                      -f ($s="${d}${o}${n}.S"))
+                       {
+                       $ret.=&Sasm_compile_target("$to${o}$n$obj",$s,$n);
+                       }
+               else    { die "no rule for $_"; }
                }
        return($ret);
        }
 
 ##############################################################
 # do a rule for each file that says 'compile' to new direcory
+sub perlasm_compile_target
+       {
+       my($target,$source,$bname)=@_;
+       my($ret);
+
+       $bname =~ s/(.*)\.[^\.]$/$1/;
+       $ret ="\$(TMP_D)$o$bname.asm: $source\n";
+       $ret.="\t\$(PERL) $source $asmtype \$(CFLAG) >\$\@\n\n";
+       $ret.="$target: \$(TMP_D)$o$bname.asm\n";
+       $ret.="\t\$(ASM) $afile\$\@ \$(TMP_D)$o$bname.asm\n\n";
+       return($ret);
+       }
+
+sub Sasm_compile_target
+       {
+       my($target,$source,$bname)=@_;
+       my($ret);
+
+       $bname =~ s/(.*)\.[^\.]$/$1/;
+       $ret ="\$(TMP_D)$o$bname.asm: $source\n";
+       $ret.="\t\$(CC) -E \$(CFLAG) $source >\$\@\n\n";
+       $ret.="$target: \$(TMP_D)$o$bname.asm\n";
+       $ret.="\t\$(ASM) $afile\$\@ \$(TMP_D)$o$bname.asm\n\n";
+       return($ret);
+       }
+
 sub cc_compile_target
        {
        local($target,$source,$ex_flags)=@_;
@@ -916,13 +939,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);
        }
@@ -956,7 +991,7 @@ sub do_copy_rule
                if ($n =~ /bss_file/)
                        { $pp=".c"; }
                else    { $pp=$p; }
-               $ret.="$to${o}$n$pp: \$(SRC_D)$o$_$pp\n\t\$(CP) \$(SRC_D)$o$_$pp $to${o}$n$pp\n\n";
+               $ret.="$to${o}$n$pp: \$(SRC_D)$o$_$pp\n\t\$(CP) \"\$(SRC_D)$o$_$pp\" \"$to${o}$n$pp\"\n\n";
                }
        return($ret);
        }
@@ -974,6 +1009,8 @@ sub read_options
                "no-rc5" => \$no_rc5,
                "no-idea" => \$no_idea,
                "no-aes" => \$no_aes,
+               "no-camellia" => \$no_camellia,
+               "no-seed" => \$no_seed,
                "no-des" => \$no_des,
                "no-bf" => \$no_bf,
                "no-cast" => \$no_cast,
@@ -991,7 +1028,6 @@ sub read_options
                "no-dsa" => \$no_dsa,
                "no-dh" => \$no_dh,
                "no-hmac" => \$no_hmac,
-               "no-aes" => \$no_aes,
                "no-asm" => \$no_asm,
                "nasm" => \$nasm,
                "nw-nasm" => \$nw_nasm,
@@ -999,6 +1035,9 @@ sub read_options
                "gaswin" => \$gaswin,
                "no-ssl2" => \$no_ssl2,
                "no-ssl3" => \$no_ssl3,
+               "no-tlsext" => \$no_tlsext,
+               "no-cms" => \$no_cms,
+               "no-jpake" => \$no_jpake,
                "no-err" => \$no_err,
                "no-sock" => \$no_sock,
                "no-krb5" => \$no_krb5,
@@ -1011,7 +1050,7 @@ sub read_options
                        [\$no_rc2, \$no_idea, \$no_des, \$no_bf, \$no_cast,
                          \$no_md2, \$no_sha, \$no_mdc2, \$no_dsa, \$no_dh,
                          \$no_ssl2, \$no_err, \$no_ripemd, \$no_rc5,
-                         \$no_aes],
+                         \$no_aes, \$no_camellia, \$no_seed],
                "rsaref" => 0,
                "gcc" => \$gcc,
                "debug" => \$debug,
@@ -1020,6 +1059,8 @@ sub read_options
                "dll" => \$shlib,
                "shared" => 0,
                "no-gmp" => 0,
+               "no-rfc3779" => 0,
+               "no-montasm" => 0,
                "no-shared" => 0,
                "no-zlib" => 0,
                "no-zlib-dynamic" => 0,
@@ -1063,6 +1104,18 @@ sub read_options
                if (exists $valid_options{$t})
                        {return 1;}
                return 0;
+               }
+       # experimental-xxx is mostly like enable-xxx, but opensslconf.v
+       # will still set OPENSSL_NO_xxx unless we set OPENSSL_EXPERIMENTAL_xxx.
+       # (No need to fail if we don't know the algorithm -- this is for adventurous users only.)
+       elsif (/^experimental-/)
+               {
+               my $algo, $ALGO;
+               ($algo = $_) =~ s/^experimental-//;
+               ($ALGO = $algo) =~ tr/[a-z]/[A-Z]/;
+
+               $xcflags="-DOPENSSL_EXPERIMENTAL_$ALGO $xcflags";
+               
                }
        elsif (/^--with-krb5-flavor=(.*)$/)
                {