From fbf002bb889d88ceb65d10c9c0062410e278f3e9 Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Sun, 6 Nov 2005 17:58:26 +0000 Subject: [PATCH] Update from stable branch. --- CHANGES | 4 +++ Configure | 17 ++++++++----- crypto/engine/engine.h | 3 ++- util/copy.pl | 58 ++++++++++++++++++++++++++++++++++++++++++ util/mk1mf.pl | 44 +++++++++++++++++++++++++++++--- util/mkdef.pl | 2 ++ util/mkdir-p.pl | 1 + util/pl/VC-32.pl | 16 ++++++++---- 8 files changed, 130 insertions(+), 15 deletions(-) create mode 100644 util/copy.pl diff --git a/CHANGES b/CHANGES index 6b962544a8..3de0267cb6 100644 --- a/CHANGES +++ b/CHANGES @@ -53,6 +53,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] diff --git a/Configure b/Configure index ff5138c910..bfff183e5c 100755 --- 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/); diff --git a/crypto/engine/engine.h b/crypto/engine/engine.h index c94fb28659..3ec59338ff 100644 --- a/crypto/engine/engine.h +++ b/crypto/engine/engine.h @@ -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, \ diff --git a/util/copy.pl b/util/copy.pl new file mode 100644 index 0000000000..73ac928ed2 --- /dev/null +++ b/util/copy.pl @@ -0,0 +1,58 @@ +#!/usr/local/bin/perl + +use Fcntl; + + +# copy.pl + +# Perl script 'copy' comment. On Windows the built in "copy" command also +# copies timestamps: this messes up Makefile dependencies. + +my $arg; + +foreach $arg (@ARGV) { + foreach (glob $arg) + { + push @filelist, $_; + } +} + +$fnum = @filelist; + +if ($fnum <= 1) + { + die "Need at least two filenames"; + } + +$dest = pop @filelist; + +if ($fnum > 2 && ! -d $dest) + { + die "Destination must be a directory"; + } + +foreach (@filelist) + { + if (-d $dest) + { + $dfile = $_; + $dfile =~ s|^.*[/\\]([^/\\]*)$|$1|; + $dfile = "$dest/$dfile"; + } + else + { + $dfile = $dest; + } + sysopen(IN, $_, O_RDONLY|O_BINARY) || die "Can't Open $_"; + sysopen(OUT, $dfile, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY) + || die "Can't Open $dfile"; + while (sysread IN, $buf, 10240) + { + syswrite(OUT, $buf, length($buf)); + } + close(IN); + close(OUT); + print "Copying: $_ to $dfile\n"; + } + + diff --git a/util/mk1mf.pl b/util/mk1mf.pl index ff668375a0..b009072c83 100755 --- a/util/mk1mf.pl +++ b/util/mk1mf.pl @@ -10,6 +10,10 @@ $OPTIONS=""; $ssl_version=""; $banner="\t\@echo Building OpenSSL"; +my $no_static_engine = 0; +my $engines = ""; + + open(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 (!($_=)) { $_="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. diff --git a/util/mkdef.pl b/util/mkdef.pl index eb23bdec60..1139160080 100755 --- a/util/mkdef.pl +++ b/util/mkdef.pl @@ -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"; diff --git a/util/mkdir-p.pl b/util/mkdir-p.pl index 6c69c2daa4..e73d02b073 100755 --- a/util/mkdir-p.pl +++ b/util/mkdir-p.pl @@ -8,6 +8,7 @@ my $arg; foreach $arg (@ARGV) { + $arg =~ tr|\\|/|; &do_mkdir_p($arg); } diff --git a/util/pl/VC-32.pl b/util/pl/VC-32.pl index 938aff65f2..4b489bfc7a 100644 --- a/util/pl/VC-32.pl +++ b/util/pl/VC-32.pl @@ -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); -- 2.25.1