1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
"""Python script to build windows binaries to be fed to the "superpack".
The script is pretty dumb: it assumes python executables are installed the
standard way, and the location for blas/lapack/atlas is harcoded."""
# TODO:
# - integrate the x86analysis script to check built binaries
# - make the config configurable with a file
import sys
import subprocess
import os
import shutil
from os.path import join as pjoin, split as psplit, dirname
PYEXECS = {"2.5" : "C:\python25\python.exe",
"2.4" : "C:\python24\python2.4.exe"}
_SSE3_CFG = r"""[atlas]
library_dirs = C:\local\lib\yop\sse3"""
_SSE2_CFG = r"""[atlas]
library_dirs = C:\local\lib\yop\sse2"""
_NOSSE_CFG = r"""[DEFAULT]
library_dirs = C:\local\lib\yop\nosse"""
SITECFG = {"sse2" : _SSE2_CFG, "sse3" : _SSE3_CFG, "nosse" : _NOSSE_CFG}
def get_python_exec(ver):
"""Return the executable of python for the given version."""
# XXX Check that the file actually exists
try:
return PYEXECS[ver]
except KeyError:
raise ValueError("Version %s not supported/recognized" % ver)
def get_clean():
if os.path.exists("build"):
shutil.rmtree("build")
if os.path.exists("dist"):
shutil.rmtree("dist")
def write_site_cfg(arch):
if os.path.exists("site.cfg"):
os.remove("site.cfg")
f = open("site.cfg", 'w')
f.writelines(SITECFG[arch])
f.close()
def build(arch, pyver):
print "Building numpy binary for python %s, arch is %s" % (get_python_exec(pyver), arch)
get_clean()
write_site_cfg(arch)
cmd = "%s setup.py build -c mingw32 bdist_wininst" % get_python_exec(pyver)
build_log = "build-%s-%s.log" % (arch, pyver)
f = open(build_log, 'w')
try:
try:
subprocess.check_call(cmd, shell = True, stderr = subprocess.STDOUT, stdout = f)
finally:
f.close()
except subprocess.CalledProcessError, e:
msg = """
There was an error while executing the following command:
%s
Error was : %s
Look at the build log (%s).""" % (cmd, str(e), build_log)
raise Exception(msg)
move_binary(arch, pyver)
def move_binary(arch, pyver):
if not os.path.exists("binaries"):
os.makedirs("binaries")
shutil.move(os.path.join('dist', get_windist_exec(pyver)),
os.path.join("binaries", get_binary_name(arch)))
def get_numpy_version():
import __builtin__
__builtin__.__NUMPY_SETUP__ = True
from numpy.version import version
return version
def get_binary_name(arch):
return "numpy-%s-%s.exe" % (get_numpy_version(), arch)
def get_windist_exec(pyver):
"""Return the name of the installer built by wininst command."""
# Yeah, the name logic is harcoded in distutils. We have to reproduce it
# here
name = "numpy-%s.win32-py%s.exe" % (get_numpy_version(), pyver)
return name
if __name__ == '__main__':
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-a", "--arch", dest="arch",
help = "Architecture to build (sse2, sse3, nosse, etc...)")
parser.add_option("-p", "--pyver", dest="pyver",
help = "Python version (2.4, 2.5, etc...)")
opts, args = parser.parse_args()
arch = opts.arch
pyver = opts.pyver
if not pyver:
pyver = "2.5"
if not arch:
for arch in SITECFG.keys():
build(arch, pyver)
else:
build(arch, pyver)
|