forked from numpy/numpy
/
prepare_bootstrap.py
109 lines (91 loc) · 3.51 KB
/
prepare_bootstrap.py
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
import os
import subprocess
import shutil
from os.path import join as pjoin, split as psplit, dirname
from zipfile import ZipFile
import re
def get_sdist_tarball():
"""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.zip" % get_numpy_version()
return name
def build_sdist():
cwd = os.getcwd()
try:
os.chdir('../..')
cmd = ["python", "setup.py", "sdist", "--format=zip"]
subprocess.call(cmd)
except Exception, e:
raise RuntimeError("Error while executing cmd (%s)" % e)
finally:
os.chdir(cwd)
def prepare_numpy_sources(bootstrap = 'bootstrap'):
zid = ZipFile(pjoin('..', '..', 'dist', get_sdist_tarball()))
root = 'numpy-%s' % get_numpy_version()
# From the sdist-built tarball, extract all files into bootstrap directory,
# but removing the numpy-VERSION head path
for name in zid.namelist():
cnt = zid.read(name)
if name.startswith(root):
# XXX: even on windows, the path sep in zip is '/' ?
name = name.split('/', 1)[1]
newname = pjoin(bootstrap, name)
if not os.path.exists(dirname(newname)):
os.makedirs(dirname(newname))
fid = open(newname, 'wb')
fid.write(cnt)
def prepare_nsis_script(bootstrap, pyver, numver):
tpl = os.path.join('nsis_scripts', 'numpy-superinstaller.nsi.in')
source = open(tpl, 'r')
target = open(pjoin(bootstrap, 'numpy-superinstaller.nsi'), 'w')
installer_name = 'numpy-%s-win32-superpack-python%s.exe' % (numver, pyver)
cnt = "".join(source.readlines())
cnt = cnt.replace('@NUMPY_INSTALLER_NAME@', installer_name)
for arch in ['nosse', 'sse2', 'sse3']:
cnt = cnt.replace('@%s_BINARY@' % arch.upper(),
get_binary_name(arch))
target.write(cnt)
def prepare_bootstrap(pyver):
bootstrap = "bootstrap-%s" % pyver
if os.path.exists(bootstrap):
shutil.rmtree(bootstrap)
os.makedirs(bootstrap)
build_sdist()
prepare_numpy_sources(bootstrap)
shutil.copy('build.py', bootstrap)
prepare_nsis_script(bootstrap, pyver, get_numpy_version())
def get_binary_name(arch):
return "numpy-%s-%s.exe" % (get_numpy_version(), arch)
def get_numpy_version(chdir = pjoin('..', '..')):
cwd = os.getcwd()
try:
if not chdir:
chdir = cwd
os.chdir(chdir)
version = subprocess.Popen(['python', '-c', 'import __builtin__; __builtin__.__NUMPY_SETUP__ = True; from numpy.version import version;print version'], stdout = subprocess.PIPE).communicate()[0]
version = version.strip()
if 'dev' in version:
out = subprocess.Popen(['svn', 'info'], stdout = subprocess.PIPE).communicate()[0]
r = re.compile('Revision: ([0-9]+)')
svnver = None
for line in out.split('\n'):
m = r.match(line)
if m:
svnver = m.group(1)
if not svnver:
raise ValueError("Error while parsing svn version ?")
version += svnver
finally:
os.chdir(cwd)
return version
if __name__ == '__main__':
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-p", "--pyver", dest="pyver",
help = "Python version (2.4, 2.5, etc...)")
opts, args = parser.parse_args()
pyver = opts.pyver
if not pyver:
pyver = "2.5"
prepare_bootstrap(pyver)