##// END OF EJS Templates
Backport PR #2067: update tools/release_windows.py...
MinRK -
Show More
@@ -1,259 +1,285 b''
1 1 #!/usr/bin/env python
2 2 # -*- coding: utf-8 -*-
3 3 """Setup script for IPython.
4 4
5 5 Under Posix environments it works like a typical setup.py script.
6 6 Under Windows, the command sdist is not supported, since IPython
7 7 requires utilities which are not available under Windows."""
8 8
9 9 #-----------------------------------------------------------------------------
10 10 # Copyright (c) 2008-2011, IPython Development Team.
11 11 # Copyright (c) 2001-2007, Fernando Perez <fernando.perez@colorado.edu>
12 12 # Copyright (c) 2001, Janko Hauser <jhauser@zscout.de>
13 13 # Copyright (c) 2001, Nathaniel Gray <n8gray@caltech.edu>
14 14 #
15 15 # Distributed under the terms of the Modified BSD License.
16 16 #
17 17 # The full license is in the file COPYING.txt, distributed with this software.
18 18 #-----------------------------------------------------------------------------
19 19
20 20 #-----------------------------------------------------------------------------
21 21 # Minimal Python version sanity check
22 22 #-----------------------------------------------------------------------------
23 23 from __future__ import print_function
24 24
25 25 import sys
26 26
27 27 # This check is also made in IPython/__init__, don't forget to update both when
28 28 # changing Python version requirements.
29 29 #~ if sys.version[0:3] < '2.6':
30 30 #~ error = """\
31 31 #~ ERROR: 'IPython requires Python Version 2.6 or above.'
32 32 #~ Exiting."""
33 33 #~ print >> sys.stderr, error
34 34 #~ sys.exit(1)
35 35
36 36 PY3 = (sys.version_info[0] >= 3)
37 37
38 38 # At least we're on the python version we need, move on.
39 39
40 40 #-------------------------------------------------------------------------------
41 41 # Imports
42 42 #-------------------------------------------------------------------------------
43 43
44 44 # Stdlib imports
45 45 import os
46 46 import shutil
47 47
48 48 from glob import glob
49 49
50 50 # BEFORE importing distutils, remove MANIFEST. distutils doesn't properly
51 51 # update it when the contents of directories change.
52 52 if os.path.exists('MANIFEST'): os.remove('MANIFEST')
53 53
54 54 from distutils.core import setup
55 from distutils.command.upload import upload
55 56
56 57 # On Python 3, we need distribute (new setuptools) to do the 2to3 conversion
57 58 if PY3:
58 59 import setuptools
59 60
60 61 # Our own imports
61 62 from setupbase import target_update
62 63
63 64 from setupbase import (
64 65 setup_args,
65 66 find_packages,
66 67 find_package_data,
67 68 find_scripts,
68 69 find_data_files,
69 70 check_for_dependencies,
70 71 record_commit_info,
71 72 )
72 73 from setupext import setupext
73 74
74 75 isfile = os.path.isfile
75 76 pjoin = os.path.join
76 77
77 78 #-----------------------------------------------------------------------------
78 79 # Function definitions
79 80 #-----------------------------------------------------------------------------
80 81
81 82 def cleanup():
82 83 """Clean up the junk left around by the build process"""
83 84 if "develop" not in sys.argv:
84 85 try:
85 86 shutil.rmtree('ipython.egg-info')
86 87 except:
87 88 try:
88 89 os.unlink('ipython.egg-info')
89 90 except:
90 91 pass
91 92
92 93 #-------------------------------------------------------------------------------
93 94 # Handle OS specific things
94 95 #-------------------------------------------------------------------------------
95 96
96 97 if os.name == 'posix':
97 98 os_name = 'posix'
98 99 elif os.name in ['nt','dos']:
99 100 os_name = 'windows'
100 101 else:
101 102 print('Unsupported operating system:',os.name)
102 103 sys.exit(1)
103 104
104 105 # Under Windows, 'sdist' has not been supported. Now that the docs build with
105 106 # Sphinx it might work, but let's not turn it on until someone confirms that it
106 107 # actually works.
107 108 if os_name == 'windows' and 'sdist' in sys.argv:
108 109 print('The sdist command is not available under Windows. Exiting.')
109 110 sys.exit(1)
110 111
111 112 #-------------------------------------------------------------------------------
112 113 # Things related to the IPython documentation
113 114 #-------------------------------------------------------------------------------
114 115
115 116 # update the manuals when building a source dist
116 117 if len(sys.argv) >= 2 and sys.argv[1] in ('sdist','bdist_rpm'):
117 118 import textwrap
118 119
119 120 # List of things to be updated. Each entry is a triplet of args for
120 121 # target_update()
121 122 to_update = [
122 123 # FIXME - Disabled for now: we need to redo an automatic way
123 124 # of generating the magic info inside the rst.
124 125 #('docs/magic.tex',
125 126 #['IPython/Magic.py'],
126 127 #"cd doc && ./update_magic.sh" ),
127 128
128 129 ('docs/man/ipcluster.1.gz',
129 130 ['docs/man/ipcluster.1'],
130 131 'cd docs/man && gzip -9c ipcluster.1 > ipcluster.1.gz'),
131 132
132 133 ('docs/man/ipcontroller.1.gz',
133 134 ['docs/man/ipcontroller.1'],
134 135 'cd docs/man && gzip -9c ipcontroller.1 > ipcontroller.1.gz'),
135 136
136 137 ('docs/man/ipengine.1.gz',
137 138 ['docs/man/ipengine.1'],
138 139 'cd docs/man && gzip -9c ipengine.1 > ipengine.1.gz'),
139 140
140 141 ('docs/man/iplogger.1.gz',
141 142 ['docs/man/iplogger.1'],
142 143 'cd docs/man && gzip -9c iplogger.1 > iplogger.1.gz'),
143 144
144 145 ('docs/man/ipython.1.gz',
145 146 ['docs/man/ipython.1'],
146 147 'cd docs/man && gzip -9c ipython.1 > ipython.1.gz'),
147 148
148 149 ('docs/man/irunner.1.gz',
149 150 ['docs/man/irunner.1'],
150 151 'cd docs/man && gzip -9c irunner.1 > irunner.1.gz'),
151 152
152 153 ('docs/man/pycolor.1.gz',
153 154 ['docs/man/pycolor.1'],
154 155 'cd docs/man && gzip -9c pycolor.1 > pycolor.1.gz'),
155 156 ]
156 157
157 158
158 159 [ target_update(*t) for t in to_update ]
159 160
160 161 #---------------------------------------------------------------------------
161 162 # Find all the packages, package data, and data_files
162 163 #---------------------------------------------------------------------------
163 164
164 165 packages = find_packages()
165 166 package_data = find_package_data()
166 167 data_files = find_data_files()
167 168
168 169 setup_args['cmdclass'] = {'build_py': record_commit_info('IPython')}
169 170 setup_args['packages'] = packages
170 171 setup_args['package_data'] = package_data
171 172 setup_args['data_files'] = data_files
172 173
173 174 #---------------------------------------------------------------------------
175 # custom upload_wininst command
176 #---------------------------------------------------------------------------
177
178 class UploadWindowsInstallers(upload):
179
180 description = "Upload Windows installers to PyPI (only used from tools/release_windows.py)"
181 user_options = upload.user_options + [
182 ('files=', 'f', 'exe file (or glob) to upload')
183 ]
184 def initialize_options(self):
185 upload.initialize_options(self)
186 meta = self.distribution.metadata
187 base = '{name}-{version}'.format(
188 name=meta.get_name(),
189 version=meta.get_version()
190 )
191 self.files = os.path.join('dist', '%s.*.exe' % base)
192
193 def run(self):
194 for dist_file in glob(self.files):
195 self.upload_file('bdist_wininst', 'any', dist_file)
196
197 setup_args['cmdclass']['upload_wininst'] = UploadWindowsInstallers
198
199 #---------------------------------------------------------------------------
174 200 # Handle scripts, dependencies, and setuptools specific things
175 201 #---------------------------------------------------------------------------
176 202
177 203 # For some commands, use setuptools. Note that we do NOT list install here!
178 204 # If you want a setuptools-enhanced install, just run 'setupegg.py install'
179 205 needs_setuptools = set(('develop', 'release', 'bdist_egg', 'bdist_rpm',
180 206 'bdist', 'bdist_dumb', 'bdist_wininst', 'install_egg_info',
181 207 'egg_info', 'easy_install', 'upload',
182 208 ))
183 209 if sys.platform == 'win32':
184 210 # Depend on setuptools for install on *Windows only*
185 211 # If we get script-installation working without setuptools,
186 212 # then we can back off, but until then use it.
187 213 # See Issue #369 on GitHub for more
188 214 needs_setuptools.add('install')
189 215
190 216 if len(needs_setuptools.intersection(sys.argv)) > 0:
191 217 import setuptools
192 218
193 219 # This dict is used for passing extra arguments that are setuptools
194 220 # specific to setup
195 221 setuptools_extra_args = {}
196 222
197 223 if 'setuptools' in sys.modules:
198 224 setuptools_extra_args['zip_safe'] = False
199 225 setuptools_extra_args['entry_points'] = find_scripts(True)
200 226 setup_args['extras_require'] = dict(
201 227 parallel = 'pyzmq>=2.1.4',
202 228 zmq = 'pyzmq>=2.1.4',
203 229 doc = 'Sphinx>=0.3',
204 230 test = 'nose>=0.10.1',
205 231 notebook = 'tornado>=2.0'
206 232 )
207 233 requires = setup_args.setdefault('install_requires', [])
208 234 setupext.display_status = False
209 235 if not setupext.check_for_readline():
210 236 if sys.platform == 'darwin':
211 237 requires.append('readline')
212 238 elif sys.platform.startswith('win'):
213 239 # Pyreadline 64 bit windows issue solved in versions >=1.7.1
214 240 # Also solves issues with some older versions of pyreadline that
215 241 # satisfy the unconstrained depdendency.
216 242 requires.append('pyreadline>=1.7.1')
217 243 else:
218 244 pass
219 245 # do we want to install readline here?
220 246
221 247 # Script to be run by the windows binary installer after the default setup
222 248 # routine, to add shortcuts and similar windows-only things. Windows
223 249 # post-install scripts MUST reside in the scripts/ dir, otherwise distutils
224 250 # doesn't find them.
225 251 if 'bdist_wininst' in sys.argv:
226 252 if len(sys.argv) > 2 and \
227 253 ('sdist' in sys.argv or 'bdist_rpm' in sys.argv):
228 254 print >> sys.stderr, "ERROR: bdist_wininst must be run alone. Exiting."
229 255 sys.exit(1)
230 256 setup_args['scripts'] = [pjoin('scripts','ipython_win_post_install.py')]
231 257 setup_args['options'] = {"bdist_wininst":
232 258 {"install_script":
233 259 "ipython_win_post_install.py"}}
234 260
235 261 if PY3:
236 262 setuptools_extra_args['use_2to3'] = True
237 263 from setuptools.command.build_py import build_py
238 264 setup_args['cmdclass'] = {'build_py': record_commit_info('IPython', build_cmd=build_py)}
239 265 setuptools_extra_args['entry_points'] = find_scripts(True, suffix='3')
240 266 setuptools._dont_write_bytecode = True
241 267 else:
242 268 # If we are running without setuptools, call this function which will
243 269 # check for dependencies an inform the user what is needed. This is
244 270 # just to make life easy for users.
245 271 check_for_dependencies()
246 272 setup_args['scripts'] = find_scripts(False)
247 273
248 274 #---------------------------------------------------------------------------
249 275 # Do the actual setup now
250 276 #---------------------------------------------------------------------------
251 277
252 278 setup_args.update(setuptools_extra_args)
253 279
254 280 def main():
255 281 setup(**setup_args)
256 282 cleanup()
257 283
258 284 if __name__ == '__main__':
259 285 main()
@@ -1,46 +1,52 b''
1 1 """
2 2 build [and upload] Windows IPython releases
3 3
4 4 usage:
5 5
6 6 python tools/release_windows.py [--github] [--pypi]
7 7
8 8 Meant to be run on Windows
9 9
10 10 Requires that you have python and python3 on your PATH
11 11 """
12 12
13 13 import glob
14 14 import os
15 15 import shutil
16 16 import sys
17 17
18 18 from toollib import sh
19 19 try:
20 20 import gh_api
21 21 except ImportError:
22 22 gh_api = None
23 23
24 24 github = '--github' in sys.argv
25 25
26 cmd_t = "{py} setup.py bdist_wininst --plat-name=py{v}-{plat}"
26 cmd_t = "{py} setup.py bdist_wininst --plat-name={plat}"
27 27
28 if '--pypi' in sys.argv:
29 cmd_t += ' --upload'
28 pypi = '--pypi' in sys.argv
29 pypi_cmd_t = "python setup.py upload_wininst -f {fname}"
30 30
31 31 for py in ['python', 'python3']:
32 32 # deliberately mangle the name,
33 33 # so easy_install doesn't find these and do horrible wrong things
34 34 v = 3 if py.endswith('3') else 2
35 35 try:
36 36 shutil.rmtree('build')
37 37 except OSError:
38 38 pass
39 for plat in ['32b-Windows', '64b-Windows']:
39 for plat in ['win32', 'win-amd64']:
40 40 cmd = cmd_t.format(**locals())
41 41 sh(cmd)
42 orig = glob.glob(os.path.join('dist', 'ipython-*.{plat}.exe'.format(**locals())))[0]
43 mangled = orig.replace('.{plat}.exe'.format(**locals()),
44 '.py{v}-{plat}.exe'.format(**locals())
45 )
46 os.rename(orig, mangled)
47 if pypi:
48 sh(pypi_cmd_t.format(fname=mangled))
42 49 if github and gh_api:
43 exe = glob.glob(os.path.join("dist", "ipython-*{v}-{plat}.exe".format(**locals())))[0]
44 print ("Uploading %s to GitHub" % exe)
50 print ("Uploading %s to GitHub" % mangled)
45 51 desc = "IPython Installer for Python {v}.x on {plat}".format(**locals())
46 gh_api.post_download('ipython/ipython', exe, description=desc)
52 gh_api.post_download('ipython/ipython', mangled, description=desc)
General Comments 0
You need to be logged in to leave comments. Login now