Update VC++ build engine to include supported engine DLL builds.
authorDr. Stephen Henson <steve@openssl.org>
Sun, 6 Nov 2005 17:49:00 +0000 (17:49 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Sun, 6 Nov 2005 17:49:00 +0000 (17:49 +0000)
CHANGES
Configure
crypto/engine/engine.h
util/mk1mf.pl
util/mkdef.pl
util/mkdir-p.pl
util/pl/VC-32.pl

diff --git a/CHANGES b/CHANGES
index efa4ae80958d1d93c6afc67c5849abca77fee135..acd99f7ad05eb454c2ebfd0e9865b4479f8396bc 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,10 @@
 
  Changes between 0.9.8a and 0.9.8b  [XX xxx XXXX]
 
+  *) Add support for building of engines under engine/ as shared libraries
+     under VC++ build system.
+     [Steve Henson]
+
   *) Corrected the numerous bugs in the Win32 path splitter in DSO.
      Hopefully, we will not see any false combination of paths any more.
      [Richard Levitte]
index 7b40246a17ec1dda3e182cb2e46e8cba9508afaa..855ad1522ddd40505e435f69f5d54c6c5289ee06 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -866,6 +866,8 @@ foreach (sort (keys %disabled))
                { $no_shared = 1; }
        elsif (/^zlib$/)
                { $zlib = 0; }
+       elsif (/^static-engine$/)
+               { }
        elsif (/^zlib-dynamic$/)
                { }
        elsif (/^symlinks$/)
@@ -1124,13 +1126,16 @@ if (!$no_shared)
                }
        }
 
-if ($no_shared)
+if (!$IsMK1MF)
        {
-       $openssl_other_defines.="#define OPENSSL_NO_DYNAMIC_ENGINE\n";
-       }
-else
-       {
-       $openssl_other_defines.="#define OPENSSL_NO_STATIC_ENGINE\n";
+       if ($no_shared)
+               {
+               $openssl_other_defines.="#define OPENSSL_NO_DYNAMIC_ENGINE\n";
+               }
+       else
+               {
+               $openssl_other_defines.="#define OPENSSL_NO_STATIC_ENGINE\n";
+               }
        }
 
 $cpuid_obj.=" uplink.o uplink-cof.o" if ($cflags =~ /\-DOPENSSL_USE_APPLINK/);
index c94fb28659d6335df8b6da6954a475508e7e4829..3ec59338ffd1ba6d6ebc7e5ce5711cf6c718a61d 100644 (file)
@@ -637,7 +637,7 @@ typedef struct st_dynamic_fns {
  * can be fully instantiated with IMPLEMENT_DYNAMIC_CHECK_FN(). */
 typedef unsigned long (*dynamic_v_check_fn)(unsigned long ossl_version);
 #define IMPLEMENT_DYNAMIC_CHECK_FN() \
-       unsigned long v_check(unsigned long v) { \
+       OPENSSL_EXPORT unsigned long v_check(unsigned long v) { \
                if(v >= OSSL_DYNAMIC_OLDEST) return OSSL_DYNAMIC_VERSION; \
                return 0; }
 
@@ -659,6 +659,7 @@ typedef unsigned long (*dynamic_v_check_fn)(unsigned long ossl_version);
 typedef int (*dynamic_bind_engine)(ENGINE *e, const char *id,
                                const dynamic_fns *fns);
 #define IMPLEMENT_DYNAMIC_BIND_FN(fn) \
+       OPENSSL_EXPORT \
        int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns) { \
                if(ENGINE_get_static_state() == fns->static_state) goto skip_cbs; \
                if(!CRYPTO_set_mem_functions(fns->mem_fns.malloc_cb, \
index ff668375a02c525e08378bc5b20c4f5f79ac2160..b009072c835c884b652f253b27281ef4d7f3d4b1 100755 (executable)
@@ -10,6 +10,10 @@ $OPTIONS="";
 $ssl_version="";
 $banner="\t\@echo Building OpenSSL";
 
+my $no_static_engine = 0;
+my $engines = "";
+
+
 open(IN,"<Makefile") || die "unable to open Makefile!\n";
 while(<IN>) {
     $ssl_version=$1 if (/^VERSION=(.*)$/);
@@ -95,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);
@@ -214,6 +220,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)
@@ -288,8 +304,10 @@ for (;;)
        if ($key eq "HEADER")
                { $header.=&var_add($dir,$val, 1); }
 
-       if ($key eq "LIBOBJ")
+       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"; }
@@ -385,12 +403,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
@@ -446,7 +466,7 @@ $banner
 headers: \$(HEADER) \$(EXHEADER)
        @
 
-lib: \$(LIBS_DEP)
+lib: \$(LIBS_DEP) \$(E_SHLIB)
 
 exe: \$(T_EXE) \$(BIN_D)$o\$(E_EXE)$exep
 
@@ -617,6 +637,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)");
 
@@ -777,7 +807,7 @@ sub do_defs
                elsif ($var eq "SSLOBJ")
                        { $ret.="\$(OBJ_D)\\\$(SSL).res "; }
                }
-       chop($ret);
+       chomp($ret);
        $ret.="\n\n";
        return($ret);
        }
@@ -960,6 +990,14 @@ sub read_options
                {
                $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.
index c9417d3b90d47b480b0dbc76e58cc4e51539c64d..8be2e39f541403dc4dfacfac56138cfef7bcd7dc 100755 (executable)
@@ -145,6 +145,8 @@ foreach (@ARGV, split(/ /, $options))
                $do_crypto=1;
                $libname=$_;
        }
+       $no_static_engine=1 if $_ eq "no-static-engine";
+       $no_static_engine=0 if $_ eq "enable-static-engine";
        $do_update=1 if $_ eq "update";
        $do_rewrite=1 if $_ eq "rewrite";
        $do_ctest=1 if $_ eq "ctest";
index 6c69c2daa4d0824cf1b35a9a5540aa0eecd95529..e73d02b073bbf6171d300b1d66ca2be542dcf15a 100755 (executable)
@@ -8,6 +8,7 @@
 my $arg;
 
 foreach $arg (@ARGV) {
+  $arg =~ tr|\\|/|;
   &do_mkdir_p($arg);
 }
 
index 938aff65f2fcdca69b2a7d6afcf0c02620ff5175..4b489bfc7aaf360853c5b4348325aabaec47d9f5 100644 (file)
@@ -235,10 +235,14 @@ $cflags.=" /Fd$out_def";
 sub do_lib_rule
        {
        local($objs,$target,$name,$shlib)=@_;
-       local($ret,$Name);
+       local($ret);
 
        $taget =~ s/\//$o/g if $o ne '/';
-       ($Name=$name) =~ tr/a-z/A-Z/;
+       if ($name ne "")
+               {
+               $name =~ tr/a-z/A-Z/;
+               $name = "/def:ms/${name}.def";
+               }
 
 #      $target="\$(LIB_D)$o$target";
        $ret.="$target: $objs\n";
@@ -250,8 +254,10 @@ sub do_lib_rule
                }
        else
                {
-               local($ex)=($target =~ /O_SSL/)?' $(L_CRYPTO)':'';
-               if ($FLAVOR =~ /CE/)
+               local($ex)=($target =~ /O_CRYPTO/)?'':' $(L_CRYPTO)';
+               if ($name eq "")
+                       {}
+               elsif ($FLAVOR =~ /CE/)
                        {
                        $ex.=' winsock.lib $(WCECOMPAT)/lib/wcecompatex.lib';
                        }
@@ -261,7 +267,7 @@ sub do_lib_rule
                        $ex.=' wsock32.lib gdi32.lib advapi32.lib user32.lib';
                        $ex.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/);
                        }
-               $ret.="\t\$(LINK) \$(MLFLAGS) $efile$target /def:ms/${Name}.def @<<\n  \$(SHLIB_EX_OBJ) $objs $ex\n<<\n";
+               $ret.="\t\$(LINK) \$(MLFLAGS) $efile$target $name @<<\n  \$(SHLIB_EX_OBJ) $objs $ex\n<<\n";
                }
        $ret.="\n";
        return($ret);