1 # Script for building the _ssl module for Windows.
2 # Uses Perl to setup the OpenSSL environment correctly
3 # and build OpenSSL, then invokes a simple nmake session
6 # THEORETICALLY, you can:
7 # * Unpack the latest SSL release one level above your main Python source
8 # directory. It is likely you will already find the zlib library and
9 # any other external packages there.
10 # * Install ActivePerl and ensure it is somewhere on your path.
11 # * Run this script from the PC/VC6 directory.
13 # it should configure and build SSL, then build the ssl Python extension
14 # without intervention.
16 import os
, sys
, re
, shutil
18 # Find all "foo.exe" files on the PATH.
19 def find_all_on_path(filename
, extras
= None):
20 entries
= os
.environ
["PATH"].split(os
.pathsep
)
23 fname
= os
.path
.abspath(os
.path
.join(p
, filename
))
24 if os
.path
.isfile(fname
) and fname
not in ret
:
28 fname
= os
.path
.abspath(os
.path
.join(p
, filename
))
29 if os
.path
.isfile(fname
) and fname
not in ret
:
33 # Find a suitable Perl installation for OpenSSL.
34 # cygwin perl does *not* work. ActivePerl does.
35 # Being a Perl dummy, the simplest way I can check is if the "Win32" package
37 def find_working_perl(perls
):
39 fh
= os
.popen(perl
+ ' -e "use Win32;"')
45 print "Can not find a suitable PERL:"
47 print " the following perl interpreters were found:"
50 print " None of these versions appear suitable for building OpenSSL"
52 print " NO perl interpreters were found on this machine at all!"
53 print " Please install ActivePerl and ensure it appears on your path"
56 # Locate the best SSL directory given a few roots to look into.
57 def find_best_ssl_dir(sources
):
61 # note: do not abspath s; the build will fail if any
62 # higher up directory name has spaces in it.
63 fnames
= os
.listdir(s
)
67 fqn
= os
.path
.join(s
, fname
)
68 if os
.path
.isdir(fqn
) and fname
.startswith("openssl-"):
69 candidates
.append(fqn
)
70 # Now we have all the candidates, locate the best.
74 parts
= re
.split("[.-]", os
.path
.basename(c
))[1:]
75 # eg - openssl-0.9.7-beta1 - ignore all "beta" or any other qualifiers
78 if parts
> best_parts
:
81 if best_name
is not None:
82 print "Found an SSL directory at '%s'" % (best_name
,)
84 print "Could not find an SSL directory in '%s'" % (sources
,)
88 def fix_makefile(makefile
):
89 """Fix some stuff in all makefiles
91 if not os
.path
.isfile(makefile
):
95 if 1: # with open(makefile) as fin:
96 lines
= fin
.readlines()
98 fout
= open(makefile
, 'w')
99 if 1: # with open(makefile, 'w') as fout:
101 if line
.startswith("PERL="):
103 if line
.startswith("CP="):
105 if line
.startswith("MKDIR="):
106 line
= "MKDIR=mkdir\n"
107 if line
.startswith("CFLAG="):
109 for algo
in ("RC5", "MDC2", "IDEA"):
110 noalgo
= " -DOPENSSL_NO_%s" % algo
111 if noalgo
not in line
:
117 def run_configure(configure
, do_script
):
118 print "perl Configure "+configure
119 os
.system("perl Configure "+configure
)
124 debug
= "-d" in sys
.argv
125 build_all
= "-a" in sys
.argv
128 configure
= "VC-WIN32"
129 do_script
= "ms\\do_nasm"
130 makefile
="ms\\nt.mak"
132 configure
+= " no-idea no-rc5 no-mdc2"
136 # perl should be on the path, but we also look in "\perl" and "c:\\perl"
137 # as "well known" locations
138 perls
= find_all_on_path("perl.exe", ["\\perl\\bin", "C:\\perl\\bin"])
139 perl
= find_working_perl(perls
)
141 print "No Perl installation was found. Existing Makefiles are used."
143 print "Found a working perl at '%s'" % (perl
,)
145 # Look for SSL 3 levels up from pcbuild - ie, same place zlib etc all live.
146 ssl_dir
= find_best_ssl_dir(("..\\..\\..",))
153 # If the ssl makefiles do not exist, we invoke Perl to generate them.
154 # Due to a bug in this script, the makefile sometimes ended up empty
155 # Force a regeneration if it is.
156 if not os
.path
.isfile(makefile
) or os
.path
.getsize(makefile
)==0:
158 print "Perl is required to build the makefiles!"
161 print "Creating the makefiles..."
163 # Put our working Perl at the front of our path
164 os
.environ
["PATH"] = os
.path
.dirname(perl
) + \
167 run_configure(configure
, do_script
)
169 print "OpenSSL debug builds aren't supported."
170 #if arch=="x86" and debug:
171 # # the do_masm script in openssl doesn't generate a debug
172 # # build makefile so we generate it here:
173 # os.system("perl util\mk1mf.pl debug "+configure+" >"+makefile)
175 fix_makefile(makefile
)
176 shutil
.copy(r
"crypto\buildinf.h", r
"crypto\buildinf_%s.h" % arch
)
177 shutil
.copy(r
"crypto\opensslconf.h", r
"crypto\opensslconf_%s.h" % arch
)
180 shutil
.copy(r
"crypto\buildinf_%s.h" % arch
, r
"crypto\buildinf.h")
181 shutil
.copy(r
"crypto\opensslconf_%s.h" % arch
, r
"crypto\opensslconf.h")
183 #makeCommand = "nmake /nologo PERL=\"%s\" -f \"%s\"" %(perl, makefile)
184 makeCommand
= "nmake /nologo -f \"%s\"" % makefile
185 print "Executing ssl makefiles:", makeCommand
187 rc
= os
.system(makeCommand
)
189 print "Executing "+makefile
+" failed"
194 # And finally, we can build the _ssl module itself for Python.
195 defs
= "SSL_DIR=%s" % (ssl_dir
,)
197 defs
= defs
+ " " + "DEBUG=1"
198 rc
= os
.system('nmake /nologo -f _ssl.mak ' + defs
+ " " + make_flags
)
201 if __name__
=='__main__':