Kaydet (Commit) 16f164e9 authored tarafından Zachary Ware's avatar Zachary Ware

Issue #26268: Update the prepare_ssl.py script

It can now handle OpenSSL versions 1.0.2e and greater, which don't
include include files in include/.

Note that sources prepared by this script no longer support the old
project files for 2.7; you now have to have Perl available to use
the old build_ssl.py script with sources from svn.python.org.
üst 1f0e1f3c
...@@ -263,6 +263,10 @@ Build ...@@ -263,6 +263,10 @@ Build
Windows Windows
------- -------
- Issue #26268: Update the prepare_ssl.py script to handle OpenSSL releases
that don't include the contents of the include directory (that is, 1.0.2e
and later).
- Issue #26071: bdist_wininst created binaries fail to start and find - Issue #26071: bdist_wininst created binaries fail to start and find
32bit Python 32bit Python
......
...@@ -21,11 +21,11 @@ ...@@ -21,11 +21,11 @@
import os import os
import re import re
import sys import sys
import shutil
import subprocess import subprocess
from shutil import copy
# Find all "foo.exe" files on the PATH. # Find all "foo.exe" files on the PATH.
def find_all_on_path(filename, extras = None): def find_all_on_path(filename, extras=None):
entries = os.environ["PATH"].split(os.pathsep) entries = os.environ["PATH"].split(os.pathsep)
ret = [] ret = []
for p in entries: for p in entries:
...@@ -39,6 +39,7 @@ def find_all_on_path(filename, extras = None): ...@@ -39,6 +39,7 @@ def find_all_on_path(filename, extras = None):
ret.append(fname) ret.append(fname)
return ret return ret
# Find a suitable Perl installation for OpenSSL. # Find a suitable Perl installation for OpenSSL.
# cygwin perl does *not* work. ActivePerl does. # cygwin perl does *not* work. ActivePerl does.
# Being a Perl dummy, the simplest way I can check is if the "Win32" package # Being a Perl dummy, the simplest way I can check is if the "Win32" package
...@@ -61,82 +62,47 @@ def find_working_perl(perls): ...@@ -61,82 +62,47 @@ def find_working_perl(perls):
print("NO perl interpreters were found on this machine at all!") print("NO perl interpreters were found on this machine at all!")
print(" Please install ActivePerl and ensure it appears on your path") print(" Please install ActivePerl and ensure it appears on your path")
def create_makefile64(makefile, m32):
"""Create and fix makefile for 64bit def create_asms(makefile, tmp_d):
Replace 32 with 64bit directories
"""
if not os.path.isfile(m32):
return
with open(m32) as fin:
with open(makefile, 'w') as fout:
for line in fin:
line = line.replace("=tmp32", "=tmp64")
line = line.replace("=out32", "=out64")
line = line.replace("=inc32", "=inc64")
# force 64 bit machine
line = line.replace("MKLIB=lib", "MKLIB=lib /MACHINE:X64")
line = line.replace("LFLAGS=", "LFLAGS=/MACHINE:X64 ")
# don't link against the lib on 64bit systems
line = line.replace("bufferoverflowu.lib", "")
fout.write(line)
os.unlink(m32)
def create_asms(makefile):
#create a custom makefile out of the provided one #create a custom makefile out of the provided one
asm_makefile = os.path.splitext(makefile)[0] + '.asm.mak' asm_makefile = os.path.splitext(makefile)[0] + '.asm.mak'
with open(makefile) as fin: with open(makefile) as fin, open(asm_makefile, 'w') as fout:
with open(asm_makefile, 'w') as fout: for line in fin:
for line in fin: # Keep everything up to the install target (it's convenient)
# Keep everything up to the install target (it's convenient) if line.startswith('install: all'):
if line.startswith('install: all'): break
break fout.write(line)
else: 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) fout.write(line)
asms = [] line = next(fin)
for line in fin: fout.write('\n')
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('asms: $(TMP_D) ')
fout.write(' '.join(asms)) fout.write(' '.join(asms))
fout.write('\n') fout.write('\n')
os.system('nmake /f {} PERL=perl TMP_D={} asms'.format(asm_makefile, tmp_d))
os.system('nmake /f {} PERL=perl asms'.format(asm_makefile))
os.unlink(asm_makefile)
def copy_includes(makefile, suffix):
dir = 'include'+suffix+'\\openssl'
def fix_makefile(makefile): os.makedirs(dir, exist_ok=True)
"""Fix some stuff in all makefiles
"""
if not os.path.isfile(makefile):
return
copy_if_different = r'$(PERL) $(SRC_D)\util\copy-if-different.pl' copy_if_different = r'$(PERL) $(SRC_D)\util\copy-if-different.pl'
with open(makefile) as fin: with open(makefile) as fin:
lines = fin.readlines() for line in fin:
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'
if copy_if_different in line: if copy_if_different in line:
line = line.replace(copy_if_different, 'copy /Y') perl, script, src, dest = line.split()
fout.write(line) if not '$(INCO_D)' in dest:
continue
# We're in the root of the source tree
src = src.replace('$(SRC_D)', '.').strip('"')
dest = dest.strip('"').replace('$(INCO_D)', dir)
print('copying', src, 'to', dest)
copy(src, dest)
def run_configure(configure, do_script): def run_configure(configure, do_script):
print("perl Configure "+configure+" no-idea no-mdc2") print("perl Configure "+configure+" no-idea no-mdc2")
...@@ -144,61 +110,37 @@ def run_configure(configure, do_script): ...@@ -144,61 +110,37 @@ def run_configure(configure, do_script):
print(do_script) print(do_script)
os.system(do_script) os.system(do_script)
def cmp(f1, f2):
bufsize = 1024 * 8
with open(f1, 'rb') as fp1, open(f2, 'rb') as fp2:
while True:
b1 = fp1.read(bufsize)
b2 = fp2.read(bufsize)
if b1 != b2:
return False
if not b1:
return True
def copy(src, dst):
if os.path.isfile(dst) and cmp(src, dst):
return
shutil.copy(src, dst)
def prep(arch): def prep(arch):
makefile_template = "ms\\nt{}.mak"
generated_makefile = makefile_template.format('')
if arch == "x86": if arch == "x86":
configure = "VC-WIN32" configure = "VC-WIN32"
do_script = "ms\\do_nasm" do_script = "ms\\do_nasm"
makefile="ms\\nt.mak" suffix = "32"
m32 = makefile
dirsuffix = "32"
elif arch == "amd64": elif arch == "amd64":
configure = "VC-WIN64A" configure = "VC-WIN64A"
do_script = "ms\\do_win64a" do_script = "ms\\do_win64a"
makefile = "ms\\nt64.mak" suffix = "64"
m32 = makefile.replace('64', '')
dirsuffix = "64"
#os.environ["VSEXTCOMP_USECL"] = "MS_OPTERON" #os.environ["VSEXTCOMP_USECL"] = "MS_OPTERON"
else: else:
raise ValueError('Unrecognized platform: %s' % arch) raise ValueError('Unrecognized platform: %s' % arch)
# rebuild makefile when we do the role over from 32 to 64 build print("Creating the makefiles...")
if arch == "amd64" and os.path.isfile(m32) and not os.path.isfile(makefile): sys.stdout.flush()
os.unlink(m32) # run configure, copy includes, create asms
run_configure(configure, do_script)
# If the ssl makefiles do not exist, we invoke Perl to generate them. makefile = makefile_template.format(suffix)
# Due to a bug in this script, the makefile sometimes ended up empty try:
# Force a regeneration if it is. os.unlink(makefile)
if not os.path.isfile(makefile) or os.path.getsize(makefile)==0: except FileNotFoundError:
print("Creating the makefiles...") pass
sys.stdout.flush() os.rename(generated_makefile, makefile)
run_configure(configure, do_script) copy_includes(makefile, suffix)
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!')
print('creating asms...') print('creating asms...')
create_asms(makefile) create_asms(makefile, 'tmp'+suffix)
def main(): def main():
if len(sys.argv) == 1: if len(sys.argv) == 1:
...@@ -229,6 +171,9 @@ def main(): ...@@ -229,6 +171,9 @@ def main():
print("Found a working perl at '%s'" % (perl,)) print("Found a working perl at '%s'" % (perl,))
else: else:
sys.exit(1) sys.exit(1)
if not find_all_on_path('nmake.exe'):
print('Could not find nmake.exe, try running env.bat')
sys.exit(1)
sys.stdout.flush() sys.stdout.flush()
# Put our working Perl at the front of our path # Put our working Perl at the front of our path
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment