##// END OF EJS Templates
Bump Sphinx version dependency
Thomas Kluyver -
Show More
@@ -1,342 +1,342 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
2 # -*- coding: utf-8 -*-
3 """Setup script for IPython.
3 """Setup script for IPython.
4
4
5 Under Posix environments it works like a typical setup.py script.
5 Under Posix environments it works like a typical setup.py script.
6 Under Windows, the command sdist is not supported, since IPython
6 Under Windows, the command sdist is not supported, since IPython
7 requires utilities which are not available under Windows."""
7 requires utilities which are not available under Windows."""
8
8
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10 # Copyright (c) 2008-2011, IPython Development Team.
10 # Copyright (c) 2008-2011, IPython Development Team.
11 # Copyright (c) 2001-2007, Fernando Perez <fernando.perez@colorado.edu>
11 # Copyright (c) 2001-2007, Fernando Perez <fernando.perez@colorado.edu>
12 # Copyright (c) 2001, Janko Hauser <jhauser@zscout.de>
12 # Copyright (c) 2001, Janko Hauser <jhauser@zscout.de>
13 # Copyright (c) 2001, Nathaniel Gray <n8gray@caltech.edu>
13 # Copyright (c) 2001, Nathaniel Gray <n8gray@caltech.edu>
14 #
14 #
15 # Distributed under the terms of the Modified BSD License.
15 # Distributed under the terms of the Modified BSD License.
16 #
16 #
17 # The full license is in the file COPYING.txt, distributed with this software.
17 # The full license is in the file COPYING.txt, distributed with this software.
18 #-----------------------------------------------------------------------------
18 #-----------------------------------------------------------------------------
19
19
20 #-----------------------------------------------------------------------------
20 #-----------------------------------------------------------------------------
21 # Minimal Python version sanity check
21 # Minimal Python version sanity check
22 #-----------------------------------------------------------------------------
22 #-----------------------------------------------------------------------------
23 from __future__ import print_function
23 from __future__ import print_function
24
24
25 import sys
25 import sys
26
26
27 # This check is also made in IPython/__init__, don't forget to update both when
27 # This check is also made in IPython/__init__, don't forget to update both when
28 # changing Python version requirements.
28 # changing Python version requirements.
29 if sys.version_info[:2] < (2,7):
29 if sys.version_info[:2] < (2,7):
30 error = "ERROR: IPython requires Python Version 2.7 or above."
30 error = "ERROR: IPython requires Python Version 2.7 or above."
31 print(error, file=sys.stderr)
31 print(error, file=sys.stderr)
32 sys.exit(1)
32 sys.exit(1)
33
33
34 PY3 = (sys.version_info[0] >= 3)
34 PY3 = (sys.version_info[0] >= 3)
35
35
36 # At least we're on the python version we need, move on.
36 # At least we're on the python version we need, move on.
37
37
38 #-------------------------------------------------------------------------------
38 #-------------------------------------------------------------------------------
39 # Imports
39 # Imports
40 #-------------------------------------------------------------------------------
40 #-------------------------------------------------------------------------------
41
41
42 # Stdlib imports
42 # Stdlib imports
43 import os
43 import os
44 import shutil
44 import shutil
45
45
46 from glob import glob
46 from glob import glob
47
47
48 # BEFORE importing distutils, remove MANIFEST. distutils doesn't properly
48 # BEFORE importing distutils, remove MANIFEST. distutils doesn't properly
49 # update it when the contents of directories change.
49 # update it when the contents of directories change.
50 if os.path.exists('MANIFEST'): os.remove('MANIFEST')
50 if os.path.exists('MANIFEST'): os.remove('MANIFEST')
51
51
52 from distutils.core import setup
52 from distutils.core import setup
53
53
54 # Our own imports
54 # Our own imports
55 from setupbase import target_update
55 from setupbase import target_update
56
56
57 from setupbase import (
57 from setupbase import (
58 setup_args,
58 setup_args,
59 find_packages,
59 find_packages,
60 find_package_data,
60 find_package_data,
61 find_entry_points,
61 find_entry_points,
62 build_scripts_entrypt,
62 build_scripts_entrypt,
63 find_data_files,
63 find_data_files,
64 check_for_dependencies,
64 check_for_dependencies,
65 git_prebuild,
65 git_prebuild,
66 check_submodule_status,
66 check_submodule_status,
67 update_submodules,
67 update_submodules,
68 require_submodules,
68 require_submodules,
69 UpdateSubmodules,
69 UpdateSubmodules,
70 CompileCSS,
70 CompileCSS,
71 JavascriptVersion,
71 JavascriptVersion,
72 install_symlinked,
72 install_symlinked,
73 install_lib_symlink,
73 install_lib_symlink,
74 install_scripts_for_symlink,
74 install_scripts_for_symlink,
75 )
75 )
76 from setupext import setupext
76 from setupext import setupext
77
77
78 isfile = os.path.isfile
78 isfile = os.path.isfile
79 pjoin = os.path.join
79 pjoin = os.path.join
80
80
81 #-----------------------------------------------------------------------------
81 #-----------------------------------------------------------------------------
82 # Function definitions
82 # Function definitions
83 #-----------------------------------------------------------------------------
83 #-----------------------------------------------------------------------------
84
84
85 def cleanup():
85 def cleanup():
86 """Clean up the junk left around by the build process"""
86 """Clean up the junk left around by the build process"""
87 if "develop" not in sys.argv and "egg_info" not in sys.argv:
87 if "develop" not in sys.argv and "egg_info" not in sys.argv:
88 try:
88 try:
89 shutil.rmtree('ipython.egg-info')
89 shutil.rmtree('ipython.egg-info')
90 except:
90 except:
91 try:
91 try:
92 os.unlink('ipython.egg-info')
92 os.unlink('ipython.egg-info')
93 except:
93 except:
94 pass
94 pass
95
95
96 #-------------------------------------------------------------------------------
96 #-------------------------------------------------------------------------------
97 # Handle OS specific things
97 # Handle OS specific things
98 #-------------------------------------------------------------------------------
98 #-------------------------------------------------------------------------------
99
99
100 if os.name in ('nt','dos'):
100 if os.name in ('nt','dos'):
101 os_name = 'windows'
101 os_name = 'windows'
102 else:
102 else:
103 os_name = os.name
103 os_name = os.name
104
104
105 # Under Windows, 'sdist' has not been supported. Now that the docs build with
105 # Under Windows, 'sdist' has not been supported. Now that the docs build with
106 # Sphinx it might work, but let's not turn it on until someone confirms that it
106 # Sphinx it might work, but let's not turn it on until someone confirms that it
107 # actually works.
107 # actually works.
108 if os_name == 'windows' and 'sdist' in sys.argv:
108 if os_name == 'windows' and 'sdist' in sys.argv:
109 print('The sdist command is not available under Windows. Exiting.')
109 print('The sdist command is not available under Windows. Exiting.')
110 sys.exit(1)
110 sys.exit(1)
111
111
112 #-------------------------------------------------------------------------------
112 #-------------------------------------------------------------------------------
113 # Make sure we aren't trying to run without submodules
113 # Make sure we aren't trying to run without submodules
114 #-------------------------------------------------------------------------------
114 #-------------------------------------------------------------------------------
115 here = os.path.abspath(os.path.dirname(__file__))
115 here = os.path.abspath(os.path.dirname(__file__))
116
116
117 def require_clean_submodules():
117 def require_clean_submodules():
118 """Check on git submodules before distutils can do anything
118 """Check on git submodules before distutils can do anything
119
119
120 Since distutils cannot be trusted to update the tree
120 Since distutils cannot be trusted to update the tree
121 after everything has been set in motion,
121 after everything has been set in motion,
122 this is not a distutils command.
122 this is not a distutils command.
123 """
123 """
124 # PACKAGERS: Add a return here to skip checks for git submodules
124 # PACKAGERS: Add a return here to skip checks for git submodules
125
125
126 # don't do anything if nothing is actually supposed to happen
126 # don't do anything if nothing is actually supposed to happen
127 for do_nothing in ('-h', '--help', '--help-commands', 'clean', 'submodule'):
127 for do_nothing in ('-h', '--help', '--help-commands', 'clean', 'submodule'):
128 if do_nothing in sys.argv:
128 if do_nothing in sys.argv:
129 return
129 return
130
130
131 status = check_submodule_status(here)
131 status = check_submodule_status(here)
132
132
133 if status == "missing":
133 if status == "missing":
134 print("checking out submodules for the first time")
134 print("checking out submodules for the first time")
135 update_submodules(here)
135 update_submodules(here)
136 elif status == "unclean":
136 elif status == "unclean":
137 print('\n'.join([
137 print('\n'.join([
138 "Cannot build / install IPython with unclean submodules",
138 "Cannot build / install IPython with unclean submodules",
139 "Please update submodules with",
139 "Please update submodules with",
140 " python setup.py submodule",
140 " python setup.py submodule",
141 "or",
141 "or",
142 " git submodule update",
142 " git submodule update",
143 "or commit any submodule changes you have made."
143 "or commit any submodule changes you have made."
144 ]))
144 ]))
145 sys.exit(1)
145 sys.exit(1)
146
146
147 require_clean_submodules()
147 require_clean_submodules()
148
148
149 #-------------------------------------------------------------------------------
149 #-------------------------------------------------------------------------------
150 # Things related to the IPython documentation
150 # Things related to the IPython documentation
151 #-------------------------------------------------------------------------------
151 #-------------------------------------------------------------------------------
152
152
153 # update the manuals when building a source dist
153 # update the manuals when building a source dist
154 if len(sys.argv) >= 2 and sys.argv[1] in ('sdist','bdist_rpm'):
154 if len(sys.argv) >= 2 and sys.argv[1] in ('sdist','bdist_rpm'):
155
155
156 # List of things to be updated. Each entry is a triplet of args for
156 # List of things to be updated. Each entry is a triplet of args for
157 # target_update()
157 # target_update()
158 to_update = [
158 to_update = [
159 # FIXME - Disabled for now: we need to redo an automatic way
159 # FIXME - Disabled for now: we need to redo an automatic way
160 # of generating the magic info inside the rst.
160 # of generating the magic info inside the rst.
161 #('docs/magic.tex',
161 #('docs/magic.tex',
162 #['IPython/Magic.py'],
162 #['IPython/Magic.py'],
163 #"cd doc && ./update_magic.sh" ),
163 #"cd doc && ./update_magic.sh" ),
164
164
165 ('docs/man/ipcluster.1.gz',
165 ('docs/man/ipcluster.1.gz',
166 ['docs/man/ipcluster.1'],
166 ['docs/man/ipcluster.1'],
167 'cd docs/man && gzip -9c ipcluster.1 > ipcluster.1.gz'),
167 'cd docs/man && gzip -9c ipcluster.1 > ipcluster.1.gz'),
168
168
169 ('docs/man/ipcontroller.1.gz',
169 ('docs/man/ipcontroller.1.gz',
170 ['docs/man/ipcontroller.1'],
170 ['docs/man/ipcontroller.1'],
171 'cd docs/man && gzip -9c ipcontroller.1 > ipcontroller.1.gz'),
171 'cd docs/man && gzip -9c ipcontroller.1 > ipcontroller.1.gz'),
172
172
173 ('docs/man/ipengine.1.gz',
173 ('docs/man/ipengine.1.gz',
174 ['docs/man/ipengine.1'],
174 ['docs/man/ipengine.1'],
175 'cd docs/man && gzip -9c ipengine.1 > ipengine.1.gz'),
175 'cd docs/man && gzip -9c ipengine.1 > ipengine.1.gz'),
176
176
177 ('docs/man/iplogger.1.gz',
177 ('docs/man/iplogger.1.gz',
178 ['docs/man/iplogger.1'],
178 ['docs/man/iplogger.1'],
179 'cd docs/man && gzip -9c iplogger.1 > iplogger.1.gz'),
179 'cd docs/man && gzip -9c iplogger.1 > iplogger.1.gz'),
180
180
181 ('docs/man/ipython.1.gz',
181 ('docs/man/ipython.1.gz',
182 ['docs/man/ipython.1'],
182 ['docs/man/ipython.1'],
183 'cd docs/man && gzip -9c ipython.1 > ipython.1.gz'),
183 'cd docs/man && gzip -9c ipython.1 > ipython.1.gz'),
184
184
185 ('docs/man/irunner.1.gz',
185 ('docs/man/irunner.1.gz',
186 ['docs/man/irunner.1'],
186 ['docs/man/irunner.1'],
187 'cd docs/man && gzip -9c irunner.1 > irunner.1.gz'),
187 'cd docs/man && gzip -9c irunner.1 > irunner.1.gz'),
188 ]
188 ]
189
189
190
190
191 [ target_update(*t) for t in to_update ]
191 [ target_update(*t) for t in to_update ]
192
192
193 #---------------------------------------------------------------------------
193 #---------------------------------------------------------------------------
194 # Find all the packages, package data, and data_files
194 # Find all the packages, package data, and data_files
195 #---------------------------------------------------------------------------
195 #---------------------------------------------------------------------------
196
196
197 packages = find_packages()
197 packages = find_packages()
198 package_data = find_package_data()
198 package_data = find_package_data()
199 data_files = find_data_files()
199 data_files = find_data_files()
200
200
201 setup_args['packages'] = packages
201 setup_args['packages'] = packages
202 setup_args['package_data'] = package_data
202 setup_args['package_data'] = package_data
203 setup_args['data_files'] = data_files
203 setup_args['data_files'] = data_files
204
204
205 #---------------------------------------------------------------------------
205 #---------------------------------------------------------------------------
206 # custom distutils commands
206 # custom distutils commands
207 #---------------------------------------------------------------------------
207 #---------------------------------------------------------------------------
208 # imports here, so they are after setuptools import if there was one
208 # imports here, so they are after setuptools import if there was one
209 from distutils.command.sdist import sdist
209 from distutils.command.sdist import sdist
210 from distutils.command.upload import upload
210 from distutils.command.upload import upload
211
211
212 class UploadWindowsInstallers(upload):
212 class UploadWindowsInstallers(upload):
213
213
214 description = "Upload Windows installers to PyPI (only used from tools/release_windows.py)"
214 description = "Upload Windows installers to PyPI (only used from tools/release_windows.py)"
215 user_options = upload.user_options + [
215 user_options = upload.user_options + [
216 ('files=', 'f', 'exe file (or glob) to upload')
216 ('files=', 'f', 'exe file (or glob) to upload')
217 ]
217 ]
218 def initialize_options(self):
218 def initialize_options(self):
219 upload.initialize_options(self)
219 upload.initialize_options(self)
220 meta = self.distribution.metadata
220 meta = self.distribution.metadata
221 base = '{name}-{version}'.format(
221 base = '{name}-{version}'.format(
222 name=meta.get_name(),
222 name=meta.get_name(),
223 version=meta.get_version()
223 version=meta.get_version()
224 )
224 )
225 self.files = os.path.join('dist', '%s.*.exe' % base)
225 self.files = os.path.join('dist', '%s.*.exe' % base)
226
226
227 def run(self):
227 def run(self):
228 for dist_file in glob(self.files):
228 for dist_file in glob(self.files):
229 self.upload_file('bdist_wininst', 'any', dist_file)
229 self.upload_file('bdist_wininst', 'any', dist_file)
230
230
231 setup_args['cmdclass'] = {
231 setup_args['cmdclass'] = {
232 'build_py': git_prebuild('IPython'),
232 'build_py': git_prebuild('IPython'),
233 'sdist' : git_prebuild('IPython', sdist),
233 'sdist' : git_prebuild('IPython', sdist),
234 'upload_wininst' : UploadWindowsInstallers,
234 'upload_wininst' : UploadWindowsInstallers,
235 'submodule' : UpdateSubmodules,
235 'submodule' : UpdateSubmodules,
236 'css' : CompileCSS,
236 'css' : CompileCSS,
237 'symlink': install_symlinked,
237 'symlink': install_symlinked,
238 'install_lib_symlink': install_lib_symlink,
238 'install_lib_symlink': install_lib_symlink,
239 'install_scripts_sym': install_scripts_for_symlink,
239 'install_scripts_sym': install_scripts_for_symlink,
240 'jsversion' : JavascriptVersion,
240 'jsversion' : JavascriptVersion,
241 }
241 }
242
242
243 #---------------------------------------------------------------------------
243 #---------------------------------------------------------------------------
244 # Handle scripts, dependencies, and setuptools specific things
244 # Handle scripts, dependencies, and setuptools specific things
245 #---------------------------------------------------------------------------
245 #---------------------------------------------------------------------------
246
246
247 # For some commands, use setuptools. Note that we do NOT list install here!
247 # For some commands, use setuptools. Note that we do NOT list install here!
248 # If you want a setuptools-enhanced install, just run 'setupegg.py install'
248 # If you want a setuptools-enhanced install, just run 'setupegg.py install'
249 needs_setuptools = set(('develop', 'release', 'bdist_egg', 'bdist_rpm',
249 needs_setuptools = set(('develop', 'release', 'bdist_egg', 'bdist_rpm',
250 'bdist', 'bdist_dumb', 'bdist_wininst', 'install_egg_info',
250 'bdist', 'bdist_dumb', 'bdist_wininst', 'install_egg_info',
251 'egg_info', 'easy_install', 'upload',
251 'egg_info', 'easy_install', 'upload',
252 ))
252 ))
253 if sys.platform == 'win32':
253 if sys.platform == 'win32':
254 # Depend on setuptools for install on *Windows only*
254 # Depend on setuptools for install on *Windows only*
255 # If we get script-installation working without setuptools,
255 # If we get script-installation working without setuptools,
256 # then we can back off, but until then use it.
256 # then we can back off, but until then use it.
257 # See Issue #369 on GitHub for more
257 # See Issue #369 on GitHub for more
258 needs_setuptools.add('install')
258 needs_setuptools.add('install')
259
259
260 if len(needs_setuptools.intersection(sys.argv)) > 0:
260 if len(needs_setuptools.intersection(sys.argv)) > 0:
261 import setuptools
261 import setuptools
262
262
263 # This dict is used for passing extra arguments that are setuptools
263 # This dict is used for passing extra arguments that are setuptools
264 # specific to setup
264 # specific to setup
265 setuptools_extra_args = {}
265 setuptools_extra_args = {}
266
266
267 if 'setuptools' in sys.modules:
267 if 'setuptools' in sys.modules:
268 # setup.py develop should check for submodules
268 # setup.py develop should check for submodules
269 from setuptools.command.develop import develop
269 from setuptools.command.develop import develop
270 setup_args['cmdclass']['develop'] = require_submodules(develop)
270 setup_args['cmdclass']['develop'] = require_submodules(develop)
271
271
272 setuptools_extra_args['zip_safe'] = False
272 setuptools_extra_args['zip_safe'] = False
273 setuptools_extra_args['entry_points'] = {'console_scripts':find_entry_points()}
273 setuptools_extra_args['entry_points'] = {'console_scripts':find_entry_points()}
274 setup_args['extras_require'] = dict(
274 setup_args['extras_require'] = dict(
275 parallel = 'pyzmq>=2.1.11',
275 parallel = 'pyzmq>=2.1.11',
276 qtconsole = ['pyzmq>=2.1.11', 'pygments'],
276 qtconsole = ['pyzmq>=2.1.11', 'pygments'],
277 zmq = 'pyzmq>=2.1.11',
277 zmq = 'pyzmq>=2.1.11',
278 doc = ['Sphinx>=0.3', 'numpydoc'],
278 doc = ['Sphinx>=1.1', 'numpydoc'],
279 test = 'nose>=0.10.1',
279 test = 'nose>=0.10.1',
280 notebook = ['tornado>=3.1', 'pyzmq>=2.1.11', 'jinja2'],
280 notebook = ['tornado>=3.1', 'pyzmq>=2.1.11', 'jinja2'],
281 nbconvert = ['pygments', 'jinja2', 'Sphinx>=0.3']
281 nbconvert = ['pygments', 'jinja2', 'Sphinx>=0.3']
282 )
282 )
283 everything = set()
283 everything = set()
284 for deps in setup_args['extras_require'].values():
284 for deps in setup_args['extras_require'].values():
285 if not isinstance(deps, list):
285 if not isinstance(deps, list):
286 deps = [deps]
286 deps = [deps]
287 for dep in deps:
287 for dep in deps:
288 everything.add(dep)
288 everything.add(dep)
289 setup_args['extras_require']['all'] = everything
289 setup_args['extras_require']['all'] = everything
290
290
291 requires = setup_args.setdefault('install_requires', [])
291 requires = setup_args.setdefault('install_requires', [])
292 setupext.display_status = False
292 setupext.display_status = False
293 if not setupext.check_for_readline():
293 if not setupext.check_for_readline():
294 if sys.platform == 'darwin':
294 if sys.platform == 'darwin':
295 requires.append('readline')
295 requires.append('readline')
296 elif sys.platform.startswith('win'):
296 elif sys.platform.startswith('win'):
297 # Pyreadline 64 bit windows issue solved in versions >=1.7.1
297 # Pyreadline 64 bit windows issue solved in versions >=1.7.1
298 # Also solves issues with some older versions of pyreadline that
298 # Also solves issues with some older versions of pyreadline that
299 # satisfy the unconstrained depdendency.
299 # satisfy the unconstrained depdendency.
300 requires.append('pyreadline>=1.7.1')
300 requires.append('pyreadline>=1.7.1')
301 else:
301 else:
302 pass
302 pass
303 # do we want to install readline here?
303 # do we want to install readline here?
304
304
305 # Script to be run by the windows binary installer after the default setup
305 # Script to be run by the windows binary installer after the default setup
306 # routine, to add shortcuts and similar windows-only things. Windows
306 # routine, to add shortcuts and similar windows-only things. Windows
307 # post-install scripts MUST reside in the scripts/ dir, otherwise distutils
307 # post-install scripts MUST reside in the scripts/ dir, otherwise distutils
308 # doesn't find them.
308 # doesn't find them.
309 if 'bdist_wininst' in sys.argv:
309 if 'bdist_wininst' in sys.argv:
310 if len(sys.argv) > 2 and \
310 if len(sys.argv) > 2 and \
311 ('sdist' in sys.argv or 'bdist_rpm' in sys.argv):
311 ('sdist' in sys.argv or 'bdist_rpm' in sys.argv):
312 print >> sys.stderr, "ERROR: bdist_wininst must be run alone. Exiting."
312 print >> sys.stderr, "ERROR: bdist_wininst must be run alone. Exiting."
313 sys.exit(1)
313 sys.exit(1)
314 setup_args['data_files'].append(
314 setup_args['data_files'].append(
315 ['Scripts', ('scripts/ipython.ico', 'scripts/ipython_nb.ico')])
315 ['Scripts', ('scripts/ipython.ico', 'scripts/ipython_nb.ico')])
316 setup_args['scripts'] = [pjoin('scripts','ipython_win_post_install.py')]
316 setup_args['scripts'] = [pjoin('scripts','ipython_win_post_install.py')]
317 setup_args['options'] = {"bdist_wininst":
317 setup_args['options'] = {"bdist_wininst":
318 {"install_script":
318 {"install_script":
319 "ipython_win_post_install.py"}}
319 "ipython_win_post_install.py"}}
320
320
321 else:
321 else:
322 # If we are running without setuptools, call this function which will
322 # If we are running without setuptools, call this function which will
323 # check for dependencies an inform the user what is needed. This is
323 # check for dependencies an inform the user what is needed. This is
324 # just to make life easy for users.
324 # just to make life easy for users.
325 check_for_dependencies()
325 check_for_dependencies()
326 # scripts has to be a non-empty list, or install_scripts isn't called
326 # scripts has to be a non-empty list, or install_scripts isn't called
327 setup_args['scripts'] = [e.split('=')[0].strip() for e in find_entry_points()]
327 setup_args['scripts'] = [e.split('=')[0].strip() for e in find_entry_points()]
328
328
329 setup_args['cmdclass']['build_scripts'] = build_scripts_entrypt
329 setup_args['cmdclass']['build_scripts'] = build_scripts_entrypt
330
330
331 #---------------------------------------------------------------------------
331 #---------------------------------------------------------------------------
332 # Do the actual setup now
332 # Do the actual setup now
333 #---------------------------------------------------------------------------
333 #---------------------------------------------------------------------------
334
334
335 setup_args.update(setuptools_extra_args)
335 setup_args.update(setuptools_extra_args)
336
336
337 def main():
337 def main():
338 setup(**setup_args)
338 setup(**setup_args)
339 cleanup()
339 cleanup()
340
340
341 if __name__ == '__main__':
341 if __name__ == '__main__':
342 main()
342 main()
General Comments 0
You need to be logged in to leave comments. Login now