Skip to content

Commit

Permalink
Merged revisions 70448 via svnmerge from
Browse files Browse the repository at this point in the history
svn+ssh://[email protected]/python/trunk

........
  r70448 | hirokazu.yamamoto | 2009-03-18 19:17:26 +0900 | 3 lines

  Updated openssl support on VC6. (openssl-0.9.6g is old, cannot compile with _ssl.c)
  If you use http://svn.python.org/projects/external/openssl-0.9.8g, Perl is not needed.
  This scheme was ported from PCBuild.
........
  • Loading branch information
Hirokazu Yamamoto committed Mar 18, 2009
1 parent 7303b59 commit ecdfd51
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 58 deletions.
7 changes: 4 additions & 3 deletions PC/VC6/_ssl.mak
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,20 @@
MODULE=_ssl_d.pyd
TEMP_DIR=x86-temp-debug/_ssl
CFLAGS=/Od /Zi /MDd /LDd /DDEBUG /D_DEBUG /DWIN32
SSL_LIB_DIR=$(SSL_DIR)/out32.dbg
LFLAGS=/nodefaultlib:"msvcrt"
!ELSE
MODULE=_ssl.pyd
TEMP_DIR=x86-temp-release/_ssl
CFLAGS=/Ox /MD /LD /DWIN32
SSL_LIB_DIR=$(SSL_DIR)/out32
LFLAGS=
!ENDIF

INCLUDES=-I ../../Include -I .. -I $(SSL_DIR)/inc32
SSL_LIB_DIR=$(SSL_DIR)/out32
LIBS=gdi32.lib wsock32.lib user32.lib advapi32.lib /libpath:$(SSL_LIB_DIR) libeay32.lib ssleay32.lib

SOURCE=../../Modules/_ssl.c $(SSL_LIB_DIR)/libeay32.lib $(SSL_LIB_DIR)/ssleay32.lib

$(MODULE): $(SOURCE) ../*.h ../../Include/*.h
@if not exist "$(TEMP_DIR)/." mkdir "$(TEMP_DIR)"
cl /nologo $(SOURCE) $(CFLAGS) /Fo$(TEMP_DIR)\$*.obj $(INCLUDES) /link /out:$(MODULE) $(LIBS)
cl /nologo $(SOURCE) $(CFLAGS) /Fo$(TEMP_DIR)\$*.obj $(INCLUDES) /link /out:$(MODULE) $(LIBS) $(LFLAGS)
143 changes: 91 additions & 52 deletions PC/VC6/build_ssl.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
# it should configure and build SSL, then build the ssl Python extension
# without intervention.

import os, sys, re
import os, sys, re, shutil

# Find all "foo.exe" files on the PATH.
def find_all_on_path(filename, extras = None):
Expand Down Expand Up @@ -42,24 +42,24 @@ def find_working_perl(perls):
if rc:
continue
return perl
print "Can not find a suitable PERL:"
print("Can not find a suitable PERL:")
if perls:
print " the following perl interpreters were found:"
print(" the following perl interpreters were found:")
for p in perls:
print " ", p
print " None of these versions appear suitable for building OpenSSL"
print(" ", p)
print(" None of these versions appear suitable for building OpenSSL")
else:
print " NO perl interpreters were found on this machine at all!"
print " Please install ActivePerl and ensure it appears on your path"
print "The Python SSL module was not built"
print(" NO perl interpreters were found on this machine at all!")
print(" Please install ActivePerl and ensure it appears on your path")
return None

# Locate the best SSL directory given a few roots to look into.
def find_best_ssl_dir(sources):
candidates = []
for s in sources:
try:
s = os.path.abspath(s)
# note: do not abspath s; the build will fail if any
# higher up directory name has spaces in it.
fnames = os.listdir(s)
except os.error:
fnames = []
Expand All @@ -79,14 +79,57 @@ def find_best_ssl_dir(sources):
best_parts = parts
best_name = c
if best_name is not None:
print "Found an SSL directory at '%s'" % (best_name,)
print("Found an SSL directory at '%s'" % (best_name,))
else:
print "Could not find an SSL directory in '%s'" % (sources,)
print("Could not find an SSL directory in '%s'" % (sources,))
sys.stdout.flush()
return best_name

def fix_makefile(makefile):
"""Fix some stuff in all makefiles
"""
if not os.path.isfile(makefile):
return
# 2.4 compatibility
fin = open(makefile)
if 1: # with open(makefile) as fin:
lines = fin.readlines()
fin.close()
fout = open(makefile, 'w')
if 1: # with open(makefile, 'w') as fout:
for line in lines:
if line.startswith("PERL="):
continue
if line.startswith("CP="):
line = "CP=copy\n"
if line.startswith("MKDIR="):
line = "MKDIR=mkdir\n"
if line.startswith("CFLAG="):
line = line.strip()
for algo in ("RC5", "MDC2", "IDEA"):
noalgo = " -DOPENSSL_NO_%s" % algo
if noalgo not in line:
line = line + noalgo
line = line + '\n'
fout.write(line)
fout.close()

def run_configure(configure, do_script):
print("perl Configure "+configure)
os.system("perl Configure "+configure)
print(do_script)
os.system(do_script)

def main():
debug = "-d" in sys.argv
build_all = "-a" in sys.argv
if 1: # Win32
arch = "x86"
configure = "VC-WIN32"
do_script = "ms\\do_nasm"
makefile="ms\\nt.mak"
m32 = makefile
configure += " no-idea no-rc5 no-mdc2"
make_flags = ""
if build_all:
make_flags = "-a"
Expand All @@ -95,61 +138,57 @@ def main():
perls = find_all_on_path("perl.exe", ["\\perl\\bin", "C:\\perl\\bin"])
perl = find_working_perl(perls)
if perl is None:
sys.exit(1)

print "Found a working perl at '%s'" % (perl,)
print("No Perl installation was found. Existing Makefiles are used.")
else:
print("Found a working perl at '%s'" % (perl,))
sys.stdout.flush()
# Look for SSL 3 levels up from pcbuild - ie, same place zlib etc all live.
ssl_dir = find_best_ssl_dir(("../../..",))
ssl_dir = find_best_ssl_dir(("..\\..\\..",))
if ssl_dir is None:
sys.exit(1)

old_cd = os.getcwd()
try:
os.chdir(ssl_dir)
# If the ssl makefiles do not exist, we invoke Perl to generate them.
if not os.path.isfile(os.path.join(ssl_dir, "32.mak")) or \
not os.path.isfile(os.path.join(ssl_dir, "d32.mak")):
print "Creating the makefiles..."
# Due to a bug in this script, the makefile sometimes ended up empty
# Force a regeneration if it is.
if not os.path.isfile(makefile) or os.path.getsize(makefile)==0:
if perl is None:
print("Perl is required to build the makefiles!")
sys.exit(1)

print("Creating the makefiles...")
sys.stdout.flush()
# Put our working Perl at the front of our path
os.environ["PATH"] = os.path.split(perl)[0] + \
os.environ["PATH"] = os.path.dirname(perl) + \
os.pathsep + \
os.environ["PATH"]
# ms\32all.bat will reconfigure OpenSSL and then try to build
# all outputs (debug/nondebug/dll/lib). So we filter the file
# to exclude any "nmake" commands and then execute.
tempname = "ms\\32all_py.bat"
run_configure(configure, do_script)
if debug:
print("OpenSSL debug builds aren't supported.")
#if arch=="x86" and debug:
# # the do_masm script in openssl doesn't generate a debug
# # build makefile so we generate it here:
# os.system("perl util\mk1mf.pl debug "+configure+" >"+makefile)

in_bat = open("ms\\32all.bat")
temp_bat = open(tempname,"w")
while 1:
cmd = in_bat.readline()
print 'cmd', repr(cmd)
if not cmd: break
if cmd.strip()[:5].lower() == "nmake":
continue
temp_bat.write(cmd)
in_bat.close()
temp_bat.close()
os.system(tempname)
try:
os.remove(tempname)
except:
pass
fix_makefile(makefile)
shutil.copy(r"crypto\buildinf.h", r"crypto\buildinf_%s.h" % arch)
shutil.copy(r"crypto\opensslconf.h", r"crypto\opensslconf_%s.h" % arch)

# Now run make.
print "Executing nmake over the ssl makefiles..."
if debug:
rc = os.system("nmake /nologo -f d32.mak")
if rc:
print "Executing d32.mak failed"
print rc
sys.exit(rc)
else:
rc = os.system("nmake /nologo -f 32.mak")
if rc:
print "Executing 32.mak failed"
print rc
sys.exit(rc)
shutil.copy(r"crypto\buildinf_%s.h" % arch, r"crypto\buildinf.h")
shutil.copy(r"crypto\opensslconf_%s.h" % arch, r"crypto\opensslconf.h")

#makeCommand = "nmake /nologo PERL=\"%s\" -f \"%s\"" %(perl, makefile)
makeCommand = "nmake /nologo -f \"%s\"" % makefile
print("Executing ssl makefiles:", makeCommand)
sys.stdout.flush()
rc = os.system(makeCommand)
if rc:
print("Executing "+makefile+" failed")
print(rc)
sys.exit(rc)
finally:
os.chdir(old_cd)
# And finally, we can build the _ssl module itself for Python.
Expand Down
6 changes: 3 additions & 3 deletions PC/VC6/readme.txt
Original file line number Diff line number Diff line change
Expand Up @@ -150,13 +150,13 @@ _ssl
http://www.openssl.org

You (probably) don't want the "engine" code. For example, get
openssl-0.9.6g.tar.gz
openssl-0.9.8g.tar.gz
not
openssl-engine-0.9.6g.tar.gz
openssl-engine-0.9.8g.tar.gz

Unpack into the "dist" directory, retaining the folder name from
the archive - for example, the latest stable OpenSSL will install as
dist/openssl-0.9.6g
dist/openssl-0.9.8g

You can (theoretically) use any version of OpenSSL you like - the
build process will automatically select the latest version.
Expand Down

0 comments on commit ecdfd51

Please sign in to comment.