forked from numpy/numpy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
prepare_bootstrap.py
111 lines (92 loc) · 3.56 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
110
111
from __future__ import division, print_function
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 as 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)