source: vendor/python/2.5/PCbuild/build_ssl.py@ 3232

Last change on this file since 3232 was 3225, checked in by bird, 19 years ago

Python 2.5

File size: 6.3 KB
Line 
1# Script for building the _ssl and _hashlib modules for Windows.
2# Uses Perl to setup the OpenSSL environment correctly
3# and build OpenSSL, then invokes a simple nmake session
4# for the actual _ssl.pyd and _hashlib.pyd DLLs.
5
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 PCBuild directory.
12#
13# it should configure and build SSL, then build the _ssl and _hashlib
14# Python extensions without intervention.
15
16import os, sys, re
17
18# Find all "foo.exe" files on the PATH.
19def find_all_on_path(filename, extras = None):
20 entries = os.environ["PATH"].split(os.pathsep)
21 ret = []
22 for p in entries:
23 fname = os.path.abspath(os.path.join(p, filename))
24 if os.path.isfile(fname) and fname not in ret:
25 ret.append(fname)
26 if extras:
27 for p in extras:
28 fname = os.path.abspath(os.path.join(p, filename))
29 if os.path.isfile(fname) and fname not in ret:
30 ret.append(fname)
31 return ret
32
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
36# is available.
37def find_working_perl(perls):
38 for perl in perls:
39 fh = os.popen(perl + ' -e "use Win32;"')
40 fh.read()
41 rc = fh.close()
42 if rc:
43 continue
44 return perl
45 print "Can not find a suitable PERL:"
46 if perls:
47 print " the following perl interpreters were found:"
48 for p in perls:
49 print " ", p
50 print " None of these versions appear suitable for building OpenSSL"
51 else:
52 print " NO perl interpreters were found on this machine at all!"
53 print " Please install ActivePerl and ensure it appears on your path"
54 print "The Python SSL module was not built"
55 return None
56
57# Locate the best SSL directory given a few roots to look into.
58def find_best_ssl_dir(sources):
59 candidates = []
60 for s in sources:
61 try:
62 # note: do not abspath s; the build will fail if any
63 # higher up directory name has spaces in it.
64 fnames = os.listdir(s)
65 except os.error:
66 fnames = []
67 for fname in fnames:
68 fqn = os.path.join(s, fname)
69 if os.path.isdir(fqn) and fname.startswith("openssl-"):
70 candidates.append(fqn)
71 # Now we have all the candidates, locate the best.
72 best_parts = []
73 best_name = None
74 for c in candidates:
75 parts = re.split("[.-]", os.path.basename(c))[1:]
76 # eg - openssl-0.9.7-beta1 - ignore all "beta" or any other qualifiers
77 if len(parts) >= 4:
78 continue
79 if parts > best_parts:
80 best_parts = parts
81 best_name = c
82 if best_name is not None:
83 print "Found an SSL directory at '%s'" % (best_name,)
84 else: