Commit 16f164e9 authored by 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.
parent 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,37 +62,15 @@ def find_working_perl(perls): ...@@ -61,37 +62,15 @@ 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
Replace 32 with 64bit directories def create_asms(makefile, tmp_d):
"""
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
else:
fout.write(line) fout.write(line)
asms = [] asms = []
for line in fin: for line in fin:
...@@ -105,38 +84,25 @@ def create_asms(makefile): ...@@ -105,38 +84,25 @@ def create_asms(makefile):
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 fix_makefile(makefile): def copy_includes(makefile, suffix):
"""Fix some stuff in all makefiles dir = 'include'+suffix+'\\openssl'
""" os.makedirs(dir, exist_ok=True)
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
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...") print("Creating the makefiles...")
sys.stdout.flush() sys.stdout.flush()
# run configure, copy includes, create asms
run_configure(configure, do_script) run_configure(configure, do_script)
makefile = makefile_template.format(suffix)
if arch == "amd64": try:
create_makefile64(makefile, m32) os.unlink(makefile)
fix_makefile(makefile) except FileNotFoundError:
copy(r"crypto\buildinf.h", r"crypto\buildinf_%s.h" % arch) pass
copy(r"crypto\opensslconf.h", r"crypto\opensslconf_%s.h" % arch) os.rename(generated_makefile, makefile)
else: copy_includes(makefile, suffix)
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