Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Newer
Older
100644 717 lines (584 sloc) 24.269 kB
28a5f5f @cournape Add paver file for scipy.
cournape authored
1 """
c13b702 @alexbrc typos throughout the codebase
alexbrc authored
2 This paver file is intended to help with the release process as much as
28a5f5f @cournape Add paver file for scipy.
cournape authored
3 possible. It relies on virtualenv to generate 'bootstrap' environments as
4 independent from the user system as possible (e.g. to make sure the sphinx doc
5 is built against the built scipy, not an installed one).
6
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
7 The release is assumed to be done on OS X. See release.sh for a script that
8 employs the Paver tasks defined in this file, and builds everything required
9 for a release at once.
28a5f5f @cournape Add paver file for scipy.
cournape authored
10
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
11
12 Building a Windows installer from Wine
13 ======================================
14
15 The Python version the installer is for can be specified with the ``-p 2.6``
16 switch (this works for all installer tasks). To build a simple (no SSE
17 instructions) installer, do::
28a5f5f @cournape Add paver file for scipy.
cournape authored
18
19 paver bdist_wininst_simple
20
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
21 This assumes that blas/lapack are in c:\local\lib inside drive_c. You will
22 have to make sure your Wine python locations (WINE_PYS) are configured
23 correctly.
28a5f5f @cournape Add paver file for scipy.
cournape authored
24
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
25 The superpack requires all the Atlas libraries for every arch to be installed
28a5f5f @cournape Add paver file for scipy.
cournape authored
26 (see SITECFG), and can then be built as follows::
27
28 paver bdist_superpack
29
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
30
31 Building an installer for OS X
32 ==============================
33
34 For a simple installer, which is just an mpkg inside a dmg, do::
35
36 paver simple_dmg
37
38 For a more fancy installer which includes documentation and looks better, do::
39
40 paver pdf # needs to be done only once
41 paver dmg
42
43
28a5f5f @cournape Add paver file for scipy.
cournape authored
44 Building changelog + notes
45 ==========================
46
47 Assumes you have git and the binaries/tarballs in installers/::
48
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
49 paver write_release_and_log
28a5f5f @cournape Add paver file for scipy.
cournape authored
50
51 This automatically put the checksum into NOTES.txt, and write the Changelog
52 which can be uploaded to sourceforge.
53
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
54
28a5f5f @cournape Add paver file for scipy.
cournape authored
55 TODO
56 ====
57 - make it more easily customizable (through command line args)
58 - missing targets: install & test, sdist test, debian packaging
59 - fix bdist_mpkg: we build the same source twice -> how to make sure we use
60 the same underlying python for egg install in venv and for bdist_mpkg
61 """
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
62
28a5f5f @cournape Add paver file for scipy.
cournape authored
63 import os
64 import sys
65 import subprocess
66 import re
67 import shutil
886971f @rgommers BUG: add missing import in paver script.
rgommers authored
68 import warnings
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
69 from hashlib import md5
70 from hashlib import sha256
28a5f5f @cournape Add paver file for scipy.
cournape authored
71
72 import distutils
73
74 try:
75 from paver.tasks import VERSION as _PVER
76 if not _PVER >= '1.0':
77 raise RuntimeError("paver version >= 1.0 required (was %s)" % _PVER)
78 except ImportError, e:
79 raise RuntimeError("paver version >= 1.0 required")
80
81 import paver
82 import paver.doctools
83 import paver.path
cbb82e4 @cournape Fix bdist_wininst_simple task.
cournape authored
84 from paver.easy import options, Bunch, task, needs, dry, sh, call_task, cmdopts
28a5f5f @cournape Add paver file for scipy.
cournape authored
85
86 sys.path.insert(0, os.path.dirname(__file__))
87 try:
88 setup_py = __import__("setup")
f3fb76e @rgommers REL: forward port changes to release scripts from 0.10.x branch.
rgommers authored
89 FULLVERSION = setup_py.VERSION
90 # This is duplicated from setup.py
91 if os.path.exists('.git'):
92 GIT_REVISION = setup_py.git_version()
93 elif os.path.exists('scipy/version.py'):
94 # must be a source distribution, use existing version file
95 from numpy.version import git_revision as GIT_REVISION
96 else:
97 GIT_REVISION = "Unknown"
98
99 if not setup_py.ISRELEASED:
100 if GIT_REVISION == "Unknown":
f194c00 @rgommers REL: update release scripts before 0.16.x branching.
rgommers authored
101 FULLVERSION += '.dev0'
f3fb76e @rgommers REL: forward port changes to release scripts from 0.10.x branch.
rgommers authored
102 else:
f194c00 @rgommers REL: update release scripts before 0.16.x branching.
rgommers authored
103 FULLVERSION += '.dev0+' + GIT_REVISION[:7]
28a5f5f @cournape Add paver file for scipy.
cournape authored
104 finally:
105 sys.path.pop(0)
106
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
107
108 #-----------------------------------
109 # Things to be changed for a release
110 #-----------------------------------
111
112 # Source of the release notes
145e011 @rgommers REL: set version to 0.17.0-dev0, add 0.17.0 release notes.
rgommers authored
113 RELEASE = 'doc/release/0.17.0-notes.rst'
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
114
115 # Start/end of the log (from git)
145e011 @rgommers REL: set version to 0.17.0-dev0, add 0.17.0 release notes.
rgommers authored
116 LOG_START = 'v0.16.0'
cc34137 @rgommers REL: add support for building Windows binary for Python 3.2 to releas…
rgommers authored
117 LOG_END = 'master'
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
118
119
120 #-------------------------------------------------------
121 # Hardcoded build/install dirs, virtualenv options, etc.
122 #-------------------------------------------------------
123
b8fa0df @cournape Do not hardcode python version anymore in bdist_mpkg.
cournape authored
124 # Default python version
f194c00 @rgommers REL: update release scripts before 0.16.x branching.
rgommers authored
125 PYVER="2.7"
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
126
127 # Paver options object, holds all default dirs
128 options(bootstrap=Bunch(bootstrap_dir="bootstrap"),
d242ad7 @rgommers DOC: port 0.10.0 release notes from 0.10.x branch. Also update Sphin…
rgommers authored
129 virtualenv=Bunch(packages_to_install=["sphinx==1.1.3", "numpydoc"],
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
130 no_site_packages=False),
131 sphinx=Bunch(builddir="build", sourcedir="source", docroot='doc'),
132 superpack=Bunch(builddir="build-superpack",
133 bindir=os.path.join("build-superpack","binaries")),
134 installers=Bunch(releasedir="release",
135 installersdir=os.path.join("release", "installers")),
136 doc=Bunch(doc_root="doc",
137 sdir=os.path.join("doc", "source"),
138 bdir=os.path.join("doc", "build"),
139 bdir_latex=os.path.join("doc", "build", "latex"),
140 destdir_pdf=os.path.join("build_doc", "pdf")),
141 html=Bunch(builddir=os.path.join("build", "html")),
142 dmg=Bunch(python_version=PYVER),
143 bdist_wininst_simple=Bunch(python_version=PYVER),)
144
145 # Where we can find BLAS/LAPACK/ATLAS on Windows/Wine
f194c00 @rgommers REL: update release scripts before 0.16.x branching.
rgommers authored
146 SITECFG = {"sse3" : {'BLAS': 'None', 'LAPACK': 'None',
147 'ATLAS': r'C:\local\lib\atlas\sse3'},
148 "sse2" : {'BLAS': 'None', 'LAPACK': 'None',
149 'ATLAS': r'C:\local\lib\atlas\sse2'},
150 "nosse" : {'ATLAS': 'None', 'BLAS': r'C:\local\lib\atlas\nosse',
151 'LAPACK': r'C:\local\lib\atlas\nosse'}}
b8fa0df @cournape Do not hardcode python version anymore in bdist_mpkg.
cournape authored
152
28a5f5f @cournape Add paver file for scipy.
cournape authored
153 # Wine config for win32 builds
f53f767 @cournape Fix paver file to handle bdist targets on windows.
cournape authored
154 if sys.platform == "win32":
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
155 WINE_PY26 = [r"C:\Python26\python.exe"]
156 WINE_PY27 = [r"C:\Python27\python.exe"]
cc34137 @rgommers REL: add support for building Windows binary for Python 3.2 to releas…
rgommers authored
157 WINE_PY32 = [r"C:\Python32\python.exe"]
5a77aad @rgommers REL: forward port changes to release notes and scripts from 0.12.x br…
rgommers authored
158 WINE_PY33 = [r"C:\Python33\python.exe"]
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
159 WINE_PY34 = [r"C:\Python34\python.exe"]
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
160 WINDOWS_ENV = os.environ
493cdbe @rgommers REL: cleanups of Paver script taken from the 0.7.x branch.
rgommers authored
161 MAKENSIS = ["makensis"]
f53f767 @cournape Fix paver file to handle bdist targets on windows.
cournape authored
162 elif sys.platform == "darwin":
493cdbe @rgommers REL: cleanups of Paver script taken from the 0.7.x branch.
rgommers authored
163 WINE_PY26 = ["wine", os.environ['HOME'] + "/.wine/drive_c/Python26/python.exe"]
80fd3e5 @rgommers REL: Update pavement.py for 0.9.0 and add paths for python 2.7.
rgommers authored
164 WINE_PY27 = ["wine", os.environ['HOME'] + "/.wine/drive_c/Python27/python.exe"]
cc34137 @rgommers REL: add support for building Windows binary for Python 3.2 to releas…
rgommers authored
165 WINE_PY32 = ["wine", os.environ['HOME'] + "/.wine/drive_c/Python32/python.exe"]
5a77aad @rgommers REL: forward port changes to release notes and scripts from 0.12.x br…
rgommers authored
166 WINE_PY33 = ["wine", os.environ['HOME'] + "/.wine/drive_c/Python33/python.exe"]
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
167 WINE_PY34 = ["wine", os.environ['HOME'] + "/.wine/drive_c/Python34/python.exe"]
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
168 WINDOWS_ENV = os.environ
169 WINDOWS_ENV["DYLD_FALLBACK_LIBRARY_PATH"] = "/usr/X11/lib:/usr/lib"
493cdbe @rgommers REL: cleanups of Paver script taken from the 0.7.x branch.
rgommers authored
170 MAKENSIS = ["wine", "makensis"]
28a5f5f @cournape Add paver file for scipy.
cournape authored
171 else:
493cdbe @rgommers REL: cleanups of Paver script taken from the 0.7.x branch.
rgommers authored
172 WINE_PY26 = [os.environ['HOME'] + "/.wine/drive_c/Python26/python.exe"]
80fd3e5 @rgommers REL: Update pavement.py for 0.9.0 and add paths for python 2.7.
rgommers authored
173 WINE_PY27 = [os.environ['HOME'] + "/.wine/drive_c/Python27/python.exe"]
cc34137 @rgommers REL: add support for building Windows binary for Python 3.2 to releas…
rgommers authored
174 WINE_PY32 = [os.environ['HOME'] + "/.wine/drive_c/Python32/python.exe"],
5a77aad @rgommers REL: forward port changes to release notes and scripts from 0.12.x br…
rgommers authored
175 WINE_PY33 = [os.environ['HOME'] + "/.wine/drive_c/Python33/python.exe"],
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
176 WINE_PY34 = [os.environ['HOME'] + "/.wine/drive_c/Python34/python.exe"],
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
177 WINDOWS_ENV = os.environ
493cdbe @rgommers REL: cleanups of Paver script taken from the 0.7.x branch.
rgommers authored
178 MAKENSIS = ["wine", "makensis"]
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
179 WINE_PYS = {'3.4':WINE_PY34, '3.3':WINE_PY33, '3.2':WINE_PY32,
5a77aad @rgommers REL: forward port changes to release notes and scripts from 0.12.x br…
rgommers authored
180 '2.7':WINE_PY27, '2.6':WINE_PY26}
28a5f5f @cournape Add paver file for scipy.
cournape authored
181
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
182 # Framework Python locations on OS X
77ab30f @rgommers MAINT: some more updates to release scripts.
rgommers authored
183 MPKG_PYTHON = {
80fd3e5 @rgommers REL: Update pavement.py for 0.9.0 and add paths for python 2.7.
rgommers authored
184 "2.6": "/Library/Frameworks/Python.framework/Versions/2.6/bin/python",
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
185 "2.7": "/Library/Frameworks/Python.framework/Versions/2.7/bin/python",
5a77aad @rgommers REL: forward port changes to release notes and scripts from 0.12.x br…
rgommers authored
186 "3.2": "/Library/Frameworks/Python.framework/Versions/3.2/bin/python3",
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
187 "3.3": "/Library/Frameworks/Python.framework/Versions/3.3/bin/python3",
188 "3.4": "/Library/Frameworks/Python.framework/Versions/3.4/bin/python3"
189 }
28a5f5f @cournape Add paver file for scipy.
cournape authored
190 # Full path to the *static* gfortran runtime
191 LIBGFORTRAN_A_PATH = "/usr/local/lib/libgfortran.a"
192
193
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
194 #--------------------------------------
195 # Utility functions and bootstrap stuff
196 #--------------------------------------
28a5f5f @cournape Add paver file for scipy.
cournape authored
197
9ae1fe1 @cournape Add function to parse numpy version in paver script.
cournape authored
198 def parse_numpy_version(pyexec):
493cdbe @rgommers REL: cleanups of Paver script taken from the 0.7.x branch.
rgommers authored
199 if isinstance(pyexec, str):
b7aa678 @rgommers MAINT: forward port changes to release scripts from 0.13.x branch
rgommers authored
200 cmd = [pyexec, "-c", "'import numpy; print(numpy.version.version)'"]
493cdbe @rgommers REL: cleanups of Paver script taken from the 0.7.x branch.
rgommers authored
201 else:
202 # sequence for pyexec
b7aa678 @rgommers MAINT: forward port changes to release scripts from 0.13.x branch
rgommers authored
203 cmd = pyexec + ["-c", "'import numpy; print(numpy.version.version)'"]
9ae1fe1 @cournape Add function to parse numpy version in paver script.
cournape authored
204
205 # Execute in shell because launching python from python does not work
206 # (hangs)
207 p = subprocess.Popen(" ".join(cmd), stdout=subprocess.PIPE, shell=True)
208 out = p.communicate()[0]
209 if p.returncode:
210 raise RuntimeError("Command %s failed" % " ".join(cmd))
211
212 a = re.compile("^([0-9]+)\.([0-9]+)\.([0-9]+)")
213 if a:
214 return tuple([int(i) for i in a.match(out).groups()[:3]])
215 else:
216 raise ValueError("Could not parse version (%s)" % out)
217
28a5f5f @cournape Add paver file for scipy.
cournape authored
218 @task
219 def bootstrap():
220 """create virtualenv in ./install"""
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
221 try:
222 import virtualenv
b7aa678 @rgommers MAINT: forward port changes to release scripts from 0.13.x branch
rgommers authored
223 except ImportError:
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
224 raise RuntimeError("virtualenv is needed for bootstrap")
225
226 bdir = options.bootstrap_dir
227 if not os.path.exists(bdir):
228 os.makedirs(bdir)
229 bscript = "boostrap.py"
230
231 options.virtualenv.script_name = os.path.join(options.bootstrap_dir,
232 bscript)
233 options.bootstrap.no_site_packages = False
28a5f5f @cournape Add paver file for scipy.
cournape authored
234 call_task('paver.virtual.bootstrap')
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
235 sh('cd %s; %s %s' % (bdir, sys.executable, bscript))
28a5f5f @cournape Add paver file for scipy.
cournape authored
236
237 @task
238 def clean():
239 """Remove build, dist, egg-info garbage."""
240 d = ['build', 'dist', 'scipy.egg-info']
241 for i in d:
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
242 if os.path.exists(i):
243 shutil.rmtree(i)
28a5f5f @cournape Add paver file for scipy.
cournape authored
244
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
245 bdir = os.path.join('doc', options.sphinx.builddir)
246 if os.path.exists(bdir):
247 shutil.rmtree(bdir)
28a5f5f @cournape Add paver file for scipy.
cournape authored
248
249 @task
250 def clean_bootstrap():
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
251 bdir = os.path.join(options.bootstrap.bootstrap_dir)
252 if os.path.exists(bdir):
253 shutil.rmtree(bdir)
28a5f5f @cournape Add paver file for scipy.
cournape authored
254
255 @task
256 @needs('clean', 'clean_bootstrap')
257 def nuke():
258 """Remove everything: build dir, installers, bootstrap dirs, etc..."""
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
259 for d in [options.superpack.builddir, options.installers.releasedir]:
260 if os.path.exists(d):
261 shutil.rmtree(d)
28a5f5f @cournape Add paver file for scipy.
cournape authored
262
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
263 #--------------------
264 # Documentation tasks
265 #--------------------
28a5f5f @cournape Add paver file for scipy.
cournape authored
266
267 @task
268 def html(options):
269 """Build scipy documentation and put it into build/docs"""
270 # Don't use paver html target because of scipy bootstrapping problems
271 subprocess.check_call(["make", "html"], cwd="doc")
272 builtdocs = paver.path.path("doc") / options.sphinx.builddir / "html"
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
273 options.html.builddir.rmtree()
274 builtdocs.copytree(options.html.builddir)
28a5f5f @cournape Add paver file for scipy.
cournape authored
275
276 @task
277 def latex():
278 """Build scipy documentation in latex format."""
279 subprocess.check_call(["make", "latex"], cwd="doc")
280
281 @task
282 @needs('latex')
283 def pdf():
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
284 bdir_latex = options.doc.bdir_latex
285 destdir_pdf = options.doc.destdir_pdf
286
28a5f5f @cournape Add paver file for scipy.
cournape authored
287 def build_pdf():
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
288 subprocess.check_call(["make", "all-pdf"], cwd=str(bdir_latex))
28a5f5f @cournape Add paver file for scipy.
cournape authored
289 dry("Build pdf doc", build_pdf)
290
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
291 if os.path.exists(destdir_pdf):
292 shutil.rmtree(destdir_pdf)
293 os.makedirs(destdir_pdf)
28a5f5f @cournape Add paver file for scipy.
cournape authored
294
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
295 ref = os.path.join(bdir_latex, "scipy-ref.pdf")
296 shutil.copy(ref, os.path.join(destdir_pdf, "reference.pdf"))
28a5f5f @cournape Add paver file for scipy.
cournape authored
297
298 def tarball_name(type='gztar'):
299 root = 'scipy-%s' % FULLVERSION
300 if type == 'gztar':
301 return root + '.tar.gz'
2d65daa @tomspur BLD: generate .tar.xz when running ``paver sdist``.
tomspur authored
302 elif type == 'xztar':
303 return root + '.tar.xz'
304 elif type == 'tar':
305 return root + '.tar'
28a5f5f @cournape Add paver file for scipy.
cournape authored
306 elif type == 'zip':
307 return root + '.zip'
308 raise ValueError("Unknown type %s" % type)
309
310 @task
311 def sdist():
312 # To be sure to bypass paver when building sdist... paver + scipy.distutils
313 # do not play well together.
314 sh('python setup.py sdist --formats=gztar,zip')
2d65daa @tomspur BLD: generate .tar.xz when running ``paver sdist``.
tomspur authored
315 sh('python setup.py sdist --formats=tar')
316 if os.path.exists(os.path.join('dist', tarball_name("xztar"))):
317 os.unlink(os.path.join('dist', tarball_name("xztar")))
318 sh('xz %s' % os.path.join('dist', tarball_name("tar")), ignore_error=True)
28a5f5f @cournape Add paver file for scipy.
cournape authored
319
320 # Copy the superpack into installers dir
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
321 if not os.path.exists(options.installers.installersdir):
322 os.makedirs(options.installers.installersdir)
28a5f5f @cournape Add paver file for scipy.
cournape authored
323
2d65daa @tomspur BLD: generate .tar.xz when running ``paver sdist``.
tomspur authored
324 if not os.path.exists(os.path.join('dist', tarball_name("xztar"))):
325 warnings.warn("Could not create tar.xz! Do you have xz installed?")
326 else:
327 t = 'xztar'
328 source = os.path.join('dist', tarball_name(t))
329 target = os.path.join(options.installers.installersdir, tarball_name(t))
330 shutil.copy(source, target)
331
28a5f5f @cournape Add paver file for scipy.
cournape authored
332 for t in ['gztar', 'zip']:
333 source = os.path.join('dist', tarball_name(t))
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
334 target = os.path.join(options.installers.installersdir, tarball_name(t))
28a5f5f @cournape Add paver file for scipy.
cournape authored
335 shutil.copy(source, target)
336
337
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
338 #---------------------------------------
339 # Windows installers (Wine-based builds)
340 #---------------------------------------
341
342 def superpack_name(pyver, numver):
343 """Return the filename of the superpack installer."""
344 return 'scipy-%s-win32-superpack-python%s.exe' % (numver, pyver)
28a5f5f @cournape Add paver file for scipy.
cournape authored
345
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
346 def internal_wininst_name(arch):
28a5f5f @cournape Add paver file for scipy.
cournape authored
347 """Return the name of the wininst as it will be inside the superpack (i.e.
348 with the arch encoded."""
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
349 ext = '.exe'
28a5f5f @cournape Add paver file for scipy.
cournape authored
350 return "scipy-%s-%s%s" % (FULLVERSION, arch, ext)
351
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
352 def wininst_name(pyver):
28a5f5f @cournape Add paver file for scipy.
cournape authored
353 """Return the name of the installer built by wininst command."""
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
354 ext = '.exe'
355 return "scipy-%s.win32-py%s%s" % (FULLVERSION, pyver, ext)
28a5f5f @cournape Add paver file for scipy.
cournape authored
356
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
357 def bdist_wininst_arch(pyver, arch):
28a5f5f @cournape Add paver file for scipy.
cournape authored
358 """Arch specific wininst build."""
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
359 if os.path.exists("build"):
360 shutil.rmtree("build")
361 _bdist_wininst(pyver, SITECFG[arch])
28a5f5f @cournape Add paver file for scipy.
cournape authored
362
363 def prepare_nsis_script(pyver, numver):
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
364 if not os.path.exists(options.superpack.builddir):
365 os.makedirs(options.superpack.builddir)
28a5f5f @cournape Add paver file for scipy.
cournape authored
366
d426942 @cournape Fix nsis template location.
cournape authored
367 tpl = os.path.join('tools/win32/build_scripts/nsis_scripts', 'scipy-superinstaller.nsi.in')
28a5f5f @cournape Add paver file for scipy.
cournape authored
368 source = open(tpl, 'r')
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
369 target = open(os.path.join(options.superpack.builddir, 'scipy-superinstaller.nsi'), 'w')
28a5f5f @cournape Add paver file for scipy.
cournape authored
370
371 installer_name = superpack_name(pyver, numver)
372 cnt = "".join(source.readlines())
6d54df7 @cournape Fix bdist_superpack paver task (forgot to change name from numpy to s…
cournape authored
373 cnt = cnt.replace('@SCIPY_INSTALLER_NAME@', installer_name)
28a5f5f @cournape Add paver file for scipy.
cournape authored
374 for arch in ['nosse', 'sse2', 'sse3']:
375 cnt = cnt.replace('@%s_BINARY@' % arch.upper(),
376 internal_wininst_name(arch))
377 target.write(cnt)
378
379 @task
380 def bdist_wininst_nosse(options):
381 """Build the nosse wininst installer."""
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
382 bdist_wininst_arch(options.python_version, 'nosse')
28a5f5f @cournape Add paver file for scipy.
cournape authored
383
384 @task
385 def bdist_wininst_sse2(options):
386 """Build the sse2 wininst installer."""
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
387 bdist_wininst_arch(options.python_version, 'sse2')
28a5f5f @cournape Add paver file for scipy.
cournape authored
388
389 @task
390 def bdist_wininst_sse3(options):
391 """Build the sse3 wininst installer."""
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
392 bdist_wininst_arch(options.python_version, 'sse3')
28a5f5f @cournape Add paver file for scipy.
cournape authored
393
394 @task
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
395 @cmdopts([("python-version=", "p", "python version")])
28a5f5f @cournape Add paver file for scipy.
cournape authored
396 def bdist_superpack(options):
397 """Build all arch specific wininst installers."""
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
398 pyver = options.python_version
399 def copy_bdist(arch):
400 # Copy the wininst in dist into the release directory
5a77aad @rgommers REL: forward port changes to release notes and scripts from 0.12.x br…
rgommers authored
401 source = os.path.join('dist', wininst_name(pyver))
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
402 target = os.path.join(options.superpack.bindir, internal_wininst_name(arch))
403 if os.path.exists(target):
404 os.remove(target)
405 if not os.path.exists(os.path.dirname(target)):
406 os.makedirs(os.path.dirname(target))
4c27cd2 @rgommers MAINT: fix building superpack installers for dev versions.
rgommers authored
407
408 try:
409 os.rename(source, target)
410 except OSError:
411 # May be due to dev version having 'Unknown' in name, if git isn't
412 # found. This can be the case when compiling under Wine.
f194c00 @rgommers REL: update release scripts before 0.16.x branching.
rgommers authored
413 ix = source.find('.dev0+') + 5
4c27cd2 @rgommers MAINT: fix building superpack installers for dev versions.
rgommers authored
414 source = source[:ix] + 'Unknown' + source[ix+7:]
415 os.rename(source, target)
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
416
417 bdist_wininst_arch(pyver, 'nosse')
418 copy_bdist("nosse")
419 bdist_wininst_arch(pyver, 'sse2')
420 copy_bdist("sse2")
421 bdist_wininst_arch(pyver, 'sse3')
422 copy_bdist("sse3")
423
424 prepare_nsis_script(pyver, FULLVERSION)
493cdbe @rgommers REL: cleanups of Paver script taken from the 0.7.x branch.
rgommers authored
425 subprocess.check_call(MAKENSIS + ['scipy-superinstaller.nsi'],
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
426 cwd=options.superpack.builddir)
28a5f5f @cournape Add paver file for scipy.
cournape authored
427
428 # Copy the superpack into installers dir
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
429 if not os.path.exists(options.installers.installersdir):
430 os.makedirs(options.installers.installersdir)
28a5f5f @cournape Add paver file for scipy.
cournape authored
431
f194c00 @rgommers REL: update release scripts before 0.16.x branching.
rgommers authored
432 source = os.path.join(options.superpack.builddir,
433 superpack_name(pyver, FULLVERSION))
434 target = os.path.join(options.installers.installersdir,
435 superpack_name(pyver, FULLVERSION))
28a5f5f @cournape Add paver file for scipy.
cournape authored
436 shutil.copy(source, target)
437
438 @task
cbb82e4 @cournape Fix bdist_wininst_simple task.
cournape authored
439 @cmdopts([('python_version=', 'p', 'Python version to build the installer against')])
28a5f5f @cournape Add paver file for scipy.
cournape authored
440 def bdist_wininst_simple():
441 """Simple wininst-based installer."""
cbb82e4 @cournape Fix bdist_wininst_simple task.
cournape authored
442 call_task("clean")
f53f767 @cournape Fix paver file to handle bdist targets on windows.
cournape authored
443 env = os.environ.copy()
444 for k, v in SITECFG['nosse'].items():
445 env[k] = v
446 _bdist_wininst(options.bdist_wininst_simple.python_version, env)
447
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
448 def _bdist_wininst(pyver, cfg_env=None):
449 cmd = WINE_PYS[pyver] + ['setup.py', 'build', '-c', 'mingw32', 'bdist_wininst']
450 if cfg_env:
451 for k, v in WINDOWS_ENV.items():
452 cfg_env[k] = v
453 else:
454 cfg_env = WINDOWS_ENV
b7aa678 @rgommers MAINT: forward port changes to release scripts from 0.13.x branch
rgommers authored
455 try:
456 subprocess.check_call(cmd, env=cfg_env)
457 except subprocess.CalledProcessError:
458 # Too many open files to compile in one go, so re-run.
459 print('RESTART WINDOWS BUILD. See gh-2709.')
460 subprocess.check_call(cmd, env=cfg_env)
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
461
462
463 #--------------------
464 # Mac OS X installers
465 #--------------------
466
467 def dmg_name(fullversion, pyver, osxver=None):
468 """Return name for dmg installer.
469
470 Notes
471 -----
472 Python 2.7 has two binaries, one for 10.3 (ppc, i386) and one for 10.6
473 (i386, x86_64). All other Python versions at python.org at the moment
474 have binaries for 10.3 only. The "macosx%s" part of the dmg name should
475 correspond to the python.org naming scheme.
476 """
477 # assume that for the py2.7/osx10.6 build the deployment target is set
478 # (should be done in the release script).
479 if not osxver:
480 osxver = os.environ.get('MACOSX_DEPLOYMENT_TARGET', '10.3')
481 return "scipy-%s-py%s-python.org-macosx%s.dmg" % (fullversion, pyver,
482 osxver)
28a5f5f @cournape Add paver file for scipy.
cournape authored
483
484 def macosx_version():
485 if not sys.platform == 'darwin':
486 raise ValueError("Not darwin ??")
487 st = subprocess.Popen(["sw_vers"], stdout=subprocess.PIPE)
488 out = st.stdout.readlines()
489 ver = re.compile("ProductVersion:\s+([0-9]+)\.([0-9]+)\.([0-9]+)")
490 for i in out:
491 m = ver.match(i)
492 if m:
493 return m.groups()
494
62e14d7 @cournape Fix .dmg generation.
cournape authored
495 def mpkg_name(pyver):
28a5f5f @cournape Add paver file for scipy.
cournape authored
496 maj, min = macosx_version()[:2]
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
497 return "scipy-%s-py%s-macosx%s.%s.mpkg" % (FULLVERSION, pyver, maj, min)
28a5f5f @cournape Add paver file for scipy.
cournape authored
498
499 def prepare_static_gfortran_runtime(d):
500 if not os.path.exists(d):
501 os.makedirs(d)
502 shutil.copy(LIBGFORTRAN_A_PATH, d)
503
504 @task
b8fa0df @cournape Do not hardcode python version anymore in bdist_mpkg.
cournape authored
505 @cmdopts([('python_version=', 'p', 'Python version to build the installer against')])
28a5f5f @cournape Add paver file for scipy.
cournape authored
506 def bdist_mpkg():
507 call_task("clean")
508
b8fa0df @cournape Do not hardcode python version anymore in bdist_mpkg.
cournape authored
509 try:
510 pyver = options.bdist_mpkg.python_version
511 except AttributeError:
512 pyver = PYVER
513
62e14d7 @cournape Fix .dmg generation.
cournape authored
514 _build_mpkg(pyver)
515
516 def _build_mpkg(pyver):
517 numver = parse_numpy_version(MPKG_PYTHON[pyver])
518 numverstr = ".".join(["%i" % i for i in numver])
77ab30f @rgommers MAINT: some more updates to release scripts.
rgommers authored
519 if pyver < "3.3":
520 # Numpy < 1.7 doesn't support Python 3.3
521 if not numver == (1, 5, 1):
522 raise ValueError("Scipy 0.14.x should be built against numpy "
523 "1.5.1, (detected %s)" % numverstr)
524 else:
525 raise ValueError("Scipy 0.14.x should be built against numpy "
526 "1.7.1, (detected %s) for Python >= 3.3" % numverstr)
62e14d7 @cournape Fix .dmg generation.
cournape authored
527
28a5f5f @cournape Add paver file for scipy.
cournape authored
528 prepare_static_gfortran_runtime("build")
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
529 # account for differences between Python 2.7.1 versions from python.org
530 if os.environ.get('MACOSX_DEPLOYMENT_TARGET', None) == "10.6":
531 ldflags = "-undefined dynamic_lookup -bundle -arch i386 -arch x86_64 -Wl,-search_paths_first"
532 else:
533 ldflags = "-undefined dynamic_lookup -bundle -arch i386 -arch ppc -Wl,-search_paths_first"
28a5f5f @cournape Add paver file for scipy.
cournape authored
534 ldflags += " -L%s" % os.path.join(os.path.dirname(__file__), "build")
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
535
28a5f5f @cournape Add paver file for scipy.
cournape authored
536 sh("LDFLAGS='%s' %s setupegg.py bdist_mpkg" % (ldflags, MPKG_PYTHON[pyver]))
537
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
538
28a5f5f @cournape Add paver file for scipy.
cournape authored
539 @task
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
540 @cmdopts([("python_version=", "p", "python version")])
28a5f5f @cournape Add paver file for scipy.
cournape authored
541 def dmg():
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
542 try:
543 pyver = options.dmg.python_version
544 except:
545 pyver = PYVER
546 idirs = options.installers.installersdir
28a5f5f @cournape Add paver file for scipy.
cournape authored
547
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
548 # Check if doc exists. If not, say so and quit.
dec2589 @rgommers BUG: fix one more bug in paver script.
rgommers authored
549 docpath = options.doc.destdir_pdf
550 ref = os.path.join(docpath, "reference.pdf")
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
551 if not os.path.exists(ref):
552 warnings.warn("Docs need to be built first! \n%s not found." % docpath)
553
554 dmg_n = dmg_name(FULLVERSION, pyver)
28a5f5f @cournape Add paver file for scipy.
cournape authored
555 dmg = paver.path.path('scipy-macosx-installer') / dmg_n
556 if dmg.exists():
557 dmg.remove()
558
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
559 call_task("clean")
560 _build_mpkg(pyver)
561
562 macosx_installer_dir = "tools/scipy-macosx-installer"
563 dmg = os.path.join(macosx_installer_dir, dmg_name(FULLVERSION, pyver))
564 if os.path.exists(dmg):
565 os.remove(dmg)
566
28a5f5f @cournape Add paver file for scipy.
cournape authored
567 # Clean the image source
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
568 content = os.path.join(macosx_installer_dir, 'content')
569 if os.path.exists(content):
570 shutil.rmtree(content)
571 os.makedirs(content)
28a5f5f @cournape Add paver file for scipy.
cournape authored
572
573 # Copy mpkg into image source
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
574 mpkg_source = os.path.join("dist", mpkg_name(pyver))
575 mpkg_target = os.path.join(content, "scipy-%s-py%s.mpkg" % (FULLVERSION, pyver))
576 shutil.copytree(mpkg_source, mpkg_target)
28a5f5f @cournape Add paver file for scipy.
cournape authored
577
578 # Copy docs into image source
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
579 pdf_docs = os.path.join(content, "Documentation")
580 if os.path.exists(pdf_docs):
581 shutil.rmtree(pdf_docs)
582 os.makedirs(pdf_docs)
583 shutil.copy(ref, os.path.join(pdf_docs, "reference.pdf"))
28a5f5f @cournape Add paver file for scipy.
cournape authored
584
585 # Build the dmg
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
586 cmd = ["./new-create-dmg", "--pkgname", os.path.basename(mpkg_target),
587 "--volname", "scipy", os.path.basename(dmg), "./content"]
588 st = subprocess.check_call(cmd, cwd=macosx_installer_dir)
589
590 source = dmg
591 target = os.path.join(idirs, os.path.basename(dmg))
592 if not os.path.exists(os.path.dirname(target)):
593 os.makedirs(os.path.dirname(target))
594 shutil.copy(source, target)
595
28a5f5f @cournape Add paver file for scipy.
cournape authored
596
597 @task
62e14d7 @cournape Fix .dmg generation.
cournape authored
598 @cmdopts([('python_version=', 'p', 'Python version to build the installer against')])
28a5f5f @cournape Add paver file for scipy.
cournape authored
599 def simple_dmg():
62e14d7 @cournape Fix .dmg generation.
cournape authored
600 try:
601 pyver = options.simple_dmg.python_version
602 except AttributeError:
603 pyver = PYVER
604
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
605 src_dir = "dmg-source"
62e14d7 @cournape Fix .dmg generation.
cournape authored
606
607 # Clean the source dir
608 if os.path.exists(src_dir):
609 shutil.rmtree(src_dir)
610 os.makedirs(src_dir)
611
612 # Build the mpkg
a5eb75d @cournape Forgot to clean build directory before generating .dmg.
cournape authored
613 clean()
62e14d7 @cournape Fix .dmg generation.
cournape authored
614 _build_mpkg(pyver)
615
616 # Build the dmg
617 shutil.copytree(os.path.join("dist", mpkg_name(pyver)),
618 os.path.join(src_dir, mpkg_name(pyver)))
619 _create_dmg(pyver, src_dir, "Scipy Universal %s" % FULLVERSION)
620
621 def _create_dmg(pyver, src_dir, volname=None):
28a5f5f @cournape Add paver file for scipy.
cournape authored
622 # Build the dmg
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
623 image_name = dmg_name(FULLVERSION, pyver)
28a5f5f @cournape Add paver file for scipy.
cournape authored
624 image = paver.path.path(image_name)
625 image.remove()
62e14d7 @cournape Fix .dmg generation.
cournape authored
626 cmd = ["hdiutil", "create", image_name, "-srcdir", src_dir]
627 if volname:
628 cmd.extend(["-volname", "'%s'" % volname])
28a5f5f @cournape Add paver file for scipy.
cournape authored
629 sh(" ".join(cmd))
630
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
631
632 #----------------------------
633 # Release notes and Changelog
634 #----------------------------
635
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
636 def compute_md5(idirs):
637 released = paver.path.path(idirs).listdir()
638 checksums = []
639 for f in sorted(released):
640 m = md5(open(f, 'r').read())
641 checksums.append('%s %s' % (m.hexdigest(), os.path.basename(f)))
642
643 return checksums
644
645 def compute_sha256(idirs):
646 # better checksum so gpg signed README.txt containing the sums can be used
647 # to verify the binaries instead of signing all binaries
648 released = paver.path.path(idirs).listdir()
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
649 checksums = []
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
650 for f in sorted(released):
651 m = sha256(open(f, 'r').read())
652 checksums.append('%s %s' % (m.hexdigest(), os.path.basename(f)))
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
653
654 return checksums
655
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
656 def write_release_task(options, filename='NOTES.txt'):
657 idirs = options.installers.installersdir
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
658 source = paver.path.path(RELEASE)
659 target = paver.path.path(filename)
660 if target.exists():
661 target.remove()
7602d5a @pv MAINT: ensure release notes always get gpg signed
pv authored
662
663 tmp_target = paver.path.path(filename + '.tmp')
664 source.copy(tmp_target)
665
666 with open(str(tmp_target), 'a') as ftarget:
667 ftarget.writelines("""
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
668 Checksums
669 =========
670
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
671 MD5
672 ~~~
673
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
674 """)
7602d5a @pv MAINT: ensure release notes always get gpg signed
pv authored
675 ftarget.writelines(['%s\n' % c for c in compute_md5(idirs)])
676 ftarget.writelines("""
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
677 SHA256
678 ~~~~~~
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
679
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
680 """)
7602d5a @pv MAINT: ensure release notes always get gpg signed
pv authored
681 ftarget.writelines(['%s\n' % c for c in compute_sha256(idirs)])
682
683 # Sign release
684 cmd = ['gpg', '--clearsign', '--armor']
685 if hasattr(options, 'gpg_key'):
686 cmd += ['--default-key', options.gpg_key]
687 cmd += ['--output', str(target), str(tmp_target)]
688 subprocess.check_call(cmd)
689 print("signed %s" % (target,))
690 tmp_target.remove()
691
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
692
693 def write_log_task(filename='Changelog'):
694 st = subprocess.Popen(
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
695 ['git', 'log', '%s..%s' % (LOG_START, LOG_END)],
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
696 stdout=subprocess.PIPE)
697
698 out = st.communicate()[0]
699 a = open(filename, 'w')
700 a.writelines(out)
701 a.close()
702
703 @task
7602d5a @pv MAINT: ensure release notes always get gpg signed
pv authored
704 @cmdopts([('gpg_key=', 'g', 'GPG key to use for signing')])
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
705 def write_release(options):
706 write_release_task(options)
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
707
708 @task
709 def write_log():
710 write_log_task()
711
28a5f5f @cournape Add paver file for scipy.
cournape authored
712 @task
7602d5a @pv MAINT: ensure release notes always get gpg signed
pv authored
713 @cmdopts([('gpg_key=', 'g', 'GPG key to use for signing')])
2e2d857 @pv MAINT: fix up paver script, correct paths on windows, py 3.4, sha256 …
pv authored
714 def write_release_and_log(options):
715 write_release_task(options, os.path.join(options.installers.releasedir, 'README'))
0c0dc19 @rgommers ENH: copy improvements to release scripts from 0.9.x branch.
rgommers authored
716 write_log_task(os.path.join(options.installers.releasedir, 'Changelog'))
Something went wrong with that request. Please try again.