diff options
author | Steve Dower <steve.dower@microsoft.com> | 2017-07-17 09:15:48 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-17 09:15:48 (GMT) |
commit | 68d663cf85d1ac5eaf83482eed39c0a6f8093601 (patch) | |
tree | fe26ff995655c31aca2d5c0f7bc4f8048cca5cc4 /PCbuild/prepare_ssl.py | |
parent | 49f6449ef4b81537c19b82329caaf60596c516c2 (diff) | |
download | cpython-68d663cf85d1ac5eaf83482eed39c0a6f8093601.zip cpython-68d663cf85d1ac5eaf83482eed39c0a6f8093601.tar.gz cpython-68d663cf85d1ac5eaf83482eed39c0a6f8093601.tar.bz2 |
[bpo-30916] Pre-build OpenSSL and Tcl/Tk for Windows (#2688)
Updates ssl and tkinter projects to use pre-built externals
Diffstat (limited to 'PCbuild/prepare_ssl.py')
-rw-r--r-- | PCbuild/prepare_ssl.py | 71 |
1 files changed, 37 insertions, 34 deletions
diff --git a/PCbuild/prepare_ssl.py b/PCbuild/prepare_ssl.py index 3429254..0f3c63e 100644 --- a/PCbuild/prepare_ssl.py +++ b/PCbuild/prepare_ssl.py @@ -21,6 +21,7 @@ from __future__ import print_function import os +import re import sys import subprocess from shutil import copy @@ -64,32 +65,8 @@ def find_working_perl(perls): print(" Please install ActivePerl and ensure it appears on your path") -def create_asms(makefile, tmp_d): - #create a custom makefile out of the provided one - asm_makefile = os.path.splitext(makefile)[0] + '.asm.mak' - with open(makefile) as fin, open(asm_makefile, 'w') as fout: - for line in fin: - # Keep everything up to the install target (it's convenient) - if line.startswith('install: all'): - break - fout.write(line) - asms = [] - for line in fin: - if '.asm' in line and line.strip().endswith('.pl'): - asms.append(line.split(':')[0]) - while line.strip(): - fout.write(line) - line = next(fin) - fout.write('\n') - - fout.write('asms: $(TMP_D) ') - fout.write(' '.join(asms)) - fout.write('\n') - os.system('nmake /f {} PERL=perl TMP_D={} asms'.format(asm_makefile, tmp_d)) - - def copy_includes(makefile, suffix): - dir = 'include'+suffix+'\\openssl' + dir = 'inc'+suffix+'\\openssl' try: os.makedirs(dir) except OSError: @@ -114,9 +91,29 @@ def run_configure(configure, do_script): print(do_script) os.system(do_script) +def fix_uplink(): + # uplink.c tries to find the OPENSSL_Applink function exported from the current + # executable. However, we export it from _ssl[_d].pyd instead. So we update the + # module name here before building. + with open('ms\\uplink.c', 'r', encoding='utf-8') as f1: + code = list(f1) + os.replace('ms\\uplink.c', 'ms\\uplink.c.orig') + already_patched = False + with open('ms\\uplink.c', 'w', encoding='utf-8') as f2: + for line in code: + if not already_patched: + if re.search('MODIFIED FOR CPYTHON _ssl MODULE', line): + already_patched = True + elif re.match(r'^\s+if\s*\(\(h\s*=\s*GetModuleHandle[AW]?\(NULL\)\)\s*==\s*NULL\)', line): + f2.write("/* MODIFIED FOR CPYTHON _ssl MODULE */\n") + f2.write('if ((h = GetModuleHandleW(L"_ssl.pyd")) == NULL) if ((h = GetModuleHandleW(L"_ssl_d.pyd")) == NULL)\n') + already_patched = True + f2.write(line) + if not already_patched: + print("WARN: failed to patch ms\\uplink.c") def prep(arch): - makefile_template = "ms\\nt{}.mak" + makefile_template = "ms\\ntdll{}.mak" generated_makefile = makefile_template.format('') if arch == "x86": configure = "VC-WIN32" @@ -126,13 +123,12 @@ def prep(arch): configure = "VC-WIN64A" do_script = "ms\\do_win64a" suffix = "64" - #os.environ["VSEXTCOMP_USECL"] = "MS_OPTERON" else: raise ValueError('Unrecognized platform: %s' % arch) print("Creating the makefiles...") sys.stdout.flush() - # run configure, copy includes, create asms + # run configure, copy includes, patch files run_configure(configure, do_script) makefile = makefile_template.format(suffix) try: @@ -142,9 +138,8 @@ def prep(arch): os.rename(generated_makefile, makefile) copy_includes(makefile, suffix) - print('creating asms...') - create_asms(makefile, 'tmp'+suffix) - + print('patching ms\\uplink.c...') + fix_uplink() def main(): if len(sys.argv) == 1: @@ -152,12 +147,17 @@ def main(): "sources must be supplied") sys.exit(1) - if len(sys.argv) > 2: + if len(sys.argv) == 3 and sys.argv[2] not in ('x86', 'amd64'): + print("Second argument must be x86 or amd64") + sys.exit(1) + + if len(sys.argv) > 3: print("Too many arguments supplied, all we need is the directory", - "containing OpenSSL sources") + "containing OpenSSL sources and optionally the architecture") sys.exit(1) ssl_dir = sys.argv[1] + arch = sys.argv[2] if len(sys.argv) >= 3 else None if not os.path.isdir(ssl_dir): print(ssl_dir, "is not an existing directory!") @@ -191,8 +191,11 @@ def main(): old_cwd = os.getcwd() try: os.chdir(ssl_dir) - for arch in ['amd64', 'x86']: + if arch: prep(arch) + else: + for arch in ['amd64', 'x86']: + prep(arch) finally: os.chdir(old_cwd) |