diff --git a/PCbuild/build_ssl.bat b/PCbuild/prepare_ssl.bat rename from PCbuild/build_ssl.bat rename to PCbuild/prepare_ssl.bat --- a/PCbuild/build_ssl.bat +++ b/PCbuild/prepare_ssl.bat @@ -8,5 +8,4 @@ if not exist python35.dll exit 1 ) ) -%HOST_PYTHON% build_ssl.py %1 %2 %3 - +%HOST_PYTHON% prepare_ssl.py %* diff --git a/PCbuild/build_ssl.py b/PCbuild/prepare_ssl.py rename from PCbuild/build_ssl.py rename to PCbuild/prepare_ssl.py --- a/PCbuild/build_ssl.py +++ b/PCbuild/prepare_ssl.py @@ -1,29 +1,25 @@ -# Script for building the _ssl and _hashlib modules for Windows. +# Script for preparing OpenSSL for building on Windows. # Uses Perl to setup the OpenSSL environment correctly -# and build OpenSSL, then invokes a simple nmake session -# for the actual _ssl.pyd and _hashlib.pyd DLLs. + +# Script originally authored by Mark Hammond. +# Major revisions by: +# Martin v. Löwis +# Christian Heimes +# Zachary Ware # THEORETICALLY, you can: -# * Unpack the latest SSL release one level above your main Python source -# directory. It is likely you will already find the zlib library and -# any other external packages there. +# * Unpack the latest OpenSSL release where $(opensslDir) in +# PCbuild\pyproject.props expects it to be. # * Install ActivePerl and ensure it is somewhere on your path. -# * Run this script from the PCBuild directory. +# * Run this script with the OpenSSL source dir as the only argument. # -# it should configure and build SSL, then build the _ssl and _hashlib -# Python extensions without intervention. +# it should configure OpenSSL such that it is ready to be built by +# ssl.vcxproj on 32 or 64 bit platforms. -# Modified by Christian Heimes -# Now this script supports pre-generated makefiles and assembly files. -# Developers don't need an installation of Perl anymore to build Python. A svn -# checkout from our svn repository is enough. -# -# In Order to create the files in the case of an update you still need Perl. -# Run build_ssl in this order: -# python.exe build_ssl.py Release x64 -# python.exe build_ssl.py Release Win32 - -import os, sys, re, shutil +import os +import re +import sys +import shutil # Find all "foo.exe" files on the PATH. def find_all_on_path(filename, extras = None): @@ -63,14 +59,6 @@ print(" Please install ActivePerl and ensure it appears on your path") return None -# Fetch SSL directory from VC properties -def get_ssl_dir(): - propfile = (os.path.join(os.path.dirname(__file__), 'pyproject.props')) - with open(propfile) as f: - m = re.search('openssl-([^<]+)<', f.read()) - return "..\..\openssl-"+m.group(1) - - def create_makefile64(makefile, m32): """Create and fix makefile for 64bit @@ -138,24 +126,14 @@ return shutil.copy(src, dst) -def main(): - build_all = "-a" in sys.argv - if sys.argv[1] == "Release": - debug = False - elif sys.argv[1] == "Debug": - debug = True - else: - raise ValueError(str(sys.argv)) - - if sys.argv[2] == "Win32": - arch = "x86" +def prep(arch): + if arch == "x86": configure = "VC-WIN32" do_script = "ms\\do_nasm" makefile="ms\\nt.mak" m32 = makefile dirsuffix = "32" - elif sys.argv[2] == "x64": - arch="amd64" + elif arch == "amd64": configure = "VC-WIN64A" do_script = "ms\\do_win64a" makefile = "ms\\nt64.mak" @@ -163,11 +141,54 @@ dirsuffix = "64" #os.environ["VSEXTCOMP_USECL"] = "MS_OPTERON" else: - raise ValueError(str(sys.argv)) + raise ValueError('Unrecognized platform: %s' % arch) - make_flags = "" - if build_all: - make_flags = "-a" + # rebuild makefile when we do the role over from 32 to 64 build + if arch == "amd64" and os.path.isfile(m32) and not os.path.isfile(makefile): + os.unlink(m32) + + # If the ssl makefiles do not exist, we invoke Perl to generate them. + # 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: + print("Creating the makefiles...") + sys.stdout.flush() + run_configure(configure, do_script) + + if arch == "amd64": + create_makefile64(makefile, m32) + fix_makefile(makefile) + copy(r"crypto\buildinf.h", r"crypto\buildinf_%s.h" % arch) + copy(r"crypto\opensslconf.h", r"crypto\opensslconf_%s.h" % arch) + else: + print(makefile, 'already exists!') + + # If the assembler files don't exist in tmpXX, copy them there + if os.path.exists("asm"+dirsuffix): + if not os.path.exists("tmp"+dirsuffix): + os.mkdir("tmp"+dirsuffix) + for f in os.listdir("asm"+dirsuffix): + if not f.endswith(".asm"): continue + if os.path.isfile(r"tmp%s\%s" % (dirsuffix, f)): continue + shutil.copy(r"asm%s\%s" % (dirsuffix, f), "tmp"+dirsuffix) + +def main(): + if len(sys.argv) == 1: + print("Not enough arguments: directory containing OpenSSL", + "sources must be supplied") + sys.exit(1) + + if len(sys.argv) > 2: + print("Too many arguments supplied, all we need is the directory", + "containing OpenSSL sources") + sys.exit(1) + + ssl_dir = sys.argv[1] + + if not os.path.exists(ssl_dir) and os.path.isdir(ssl_dir): + print(ssl_dir, "is not an existing directory!") + sys.exit(1) + # perl should be on the path, but we also look in "\perl" and "c:\\perl" # as "well known" locations perls = find_all_on_path("perl.exe", ["\\perl\\bin", "C:\\perl\\bin"]) @@ -175,79 +196,21 @@ if perl: print("Found a working perl at '%s'" % (perl,)) else: - print("No Perl installation was found. Existing Makefiles are used.") + sys.exit(1) sys.stdout.flush() - # Look for SSL 2 levels up from pcbuild - ie, same place zlib etc all live. - ssl_dir = get_ssl_dir() - if ssl_dir is None: - sys.exit(1) - old_cd = os.getcwd() + # Put our working Perl at the front of our path + os.environ["PATH"] = os.path.dirname(perl) + \ + os.pathsep + \ + os.environ["PATH"] + + old_cwd = os.getcwd() try: os.chdir(ssl_dir) - # rebuild makefile when we do the role over from 32 to 64 build - if arch == "amd64" and os.path.isfile(m32) and not os.path.isfile(makefile): - os.unlink(m32) - - # If the ssl makefiles do not exist, we invoke Perl to generate them. - # 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.dirname(perl) + \ - os.pathsep + \ - os.environ["PATH"] - 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) - - if arch == "amd64": - create_makefile64(makefile, m32) - fix_makefile(makefile) - copy(r"crypto\buildinf.h", r"crypto\buildinf_%s.h" % arch) - copy(r"crypto\opensslconf.h", r"crypto\opensslconf_%s.h" % arch) - - # If the assembler files don't exist in tmpXX, copy them there - if perl is None and os.path.exists("asm"+dirsuffix): - if not os.path.exists("tmp"+dirsuffix): - os.mkdir("tmp"+dirsuffix) - for f in os.listdir("asm"+dirsuffix): - if not f.endswith(".asm"): continue - if os.path.isfile(r"tmp%s\%s" % (dirsuffix, f)): continue - shutil.copy(r"asm%s\%s" % (dirsuffix, f), "tmp"+dirsuffix) - - # Now run make. - if arch == "amd64": - rc = os.system("nasm -f win64 -DNEAR -Ox -g ms\\uptable.asm") - if rc: - print("nasm assembler has failed.") - sys.exit(rc) - - copy(r"crypto\buildinf_%s.h" % arch, r"crypto\buildinf.h") - 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) + for arch in ['amd64', 'x86']: + prep(arch) finally: - os.chdir(old_cd) - sys.exit(rc) + os.chdir(old_cwd) if __name__=='__main__': main() diff --git a/PCbuild/ssl.vcxproj b/PCbuild/ssl.vcxproj --- a/PCbuild/ssl.vcxproj +++ b/PCbuild/ssl.vcxproj @@ -118,9 +118,12 @@ <_ProjectFileVersion>10.0.30319.1 - cd "$(SolutionDir)" -"$(PythonExe)" build_ssl.py Release $(Platform) -a - + +cd "$(SolutionDir)$(opensslDir)" +copy /Y crypto\buildinf_x86.h crypto\buildinf.h +copy /Y crypto\opensslconf_x86.h crypto\opensslconf.h +nmake /nologo -f "ms\nt.mak" + echo OpenSSL must be cleaned manually if you want to rebuild it. @@ -129,9 +132,13 @@ $(NMakeForcedIncludes) $(NMakeAssemblySearchPath) $(NMakeForcedUsingAssemblies) - cd "$(SolutionDir)" -"$(PythonExe)" build_ssl.py Release $(Platform) -a - + +cd "$(SolutionDir)$(opensslDir)" +nasm -f win64 -DNEAR -Ox -g ms\\uptable.asm || echo nasm failed! && exit +copy /Y crypto\buildinf_amd64.h crypto\buildinf.h +copy /Y crypto\opensslconf_amd64.h crypto\opensslconf.h +nmake /nologo -f "ms\nt64.mak" + echo OpenSSL must be cleaned manually if you want to rebuild it. @@ -140,9 +147,12 @@ $(NMakeForcedIncludes) $(NMakeAssemblySearchPath) $(NMakeForcedUsingAssemblies) - cd "$(SolutionDir)" -"$(PythonExe)" build_ssl.py Release $(Platform) -a - + +cd "$(SolutionDir)$(opensslDir)" +copy /Y crypto\buildinf_x86.h crypto\buildinf.h +copy /Y crypto\opensslconf_x86.h crypto\opensslconf.h +nmake /nologo -f "ms\nt.mak" + echo OpenSSL must be cleaned manually if you want to rebuild it. @@ -151,9 +161,13 @@ $(NMakeForcedIncludes) $(NMakeAssemblySearchPath) $(NMakeForcedUsingAssemblies) - cd "$(SolutionDir)" -"$(PythonExe)" build_ssl.py Release $(Platform) -a - + +cd "$(SolutionDir)$(opensslDir)" +nasm -f win64 -DNEAR -Ox -g ms\\uptable.asm || echo nasm failed! && exit +copy /Y crypto\buildinf_amd64.h crypto\buildinf.h +copy /Y crypto\opensslconf_amd64.h crypto\opensslconf.h +nmake /nologo -f "ms\nt64.mak" + echo OpenSSL must be cleaned manually if you want to rebuild it. @@ -162,9 +176,12 @@ $(NMakeForcedIncludes) $(NMakeAssemblySearchPath) $(NMakeForcedUsingAssemblies) - cd "$(SolutionDir)" -"$(PythonExe)" build_ssl.py Release $(Platform) -a - + +cd "$(SolutionDir)$(opensslDir)" +copy /Y crypto\buildinf_x86.h crypto\buildinf.h +copy /Y crypto\opensslconf_x86.h crypto\opensslconf.h +nmake /nologo -f "ms\nt.mak" + echo OpenSSL must be cleaned manually if you want to rebuild it. @@ -173,9 +190,13 @@ $(NMakeForcedIncludes) $(NMakeAssemblySearchPath) $(NMakeForcedUsingAssemblies) - cd "$(SolutionDir)" -"$(PythonExe)" build_ssl.py Release $(Platform) -a - + +cd "$(SolutionDir)$(opensslDir)" +nasm -f win64 -DNEAR -Ox -g ms\\uptable.asm || echo nasm failed! && exit +copy /Y crypto\buildinf_amd64.h crypto\buildinf.h +copy /Y crypto\opensslconf_amd64.h crypto\opensslconf.h +nmake /nologo -f "ms\nt64.mak" + echo OpenSSL must be cleaned manually if you want to rebuild it. @@ -184,9 +205,12 @@ $(NMakeForcedIncludes) $(NMakeAssemblySearchPath) $(NMakeForcedUsingAssemblies) - cd "$(SolutionDir)" -"$(PythonExe)" build_ssl.py Release $(Platform) -a - + +cd "$(SolutionDir)$(opensslDir)" +copy /Y crypto\buildinf_x86.h crypto\buildinf.h +copy /Y crypto\opensslconf_x86.h crypto\opensslconf.h +nmake /nologo -f "ms\nt.mak" + echo OpenSSL must be cleaned manually if you want to rebuild it. @@ -195,9 +219,13 @@ $(NMakeForcedIncludes) $(NMakeAssemblySearchPath) $(NMakeForcedUsingAssemblies) - cd "$(SolutionDir)" -"$(PythonExe)" build_ssl.py Release $(Platform) -a - + +cd "$(SolutionDir)$(opensslDir)" +nasm -f win64 -DNEAR -Ox -g ms\\uptable.asm || echo nasm failed! && exit +copy /Y crypto\buildinf_amd64.h crypto\buildinf.h +copy /Y crypto\opensslconf_amd64.h crypto\opensslconf.h +nmake /nologo -f "ms\nt64.mak" + echo OpenSSL must be cleaned manually if you want to rebuild it. @@ -209,12 +237,6 @@ - - - {b11d750f-cd1f-4a96-85ce-e69a5c5259f9} - false - -