##// END OF EJS Templates
Merge pull request #12872 from meeseeksmachine/auto-backport-of-pr-12836-on-7.x...
Matthias Bussonnier -
r26402:f232d30b merge
parent child Browse files
Show More
@@ -1,265 +1,273 b''
1 #!/usr/bin/env python3
1 #!/usr/bin/env python3
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.rst, distributed with this software.
17 # The full license is in the file COPYING.rst, distributed with this software.
18 #-----------------------------------------------------------------------------
18 #-----------------------------------------------------------------------------
19
19
20 from __future__ import print_function
20 from __future__ import print_function
21
21
22 import os
22 import os
23 import sys
23 import sys
24
24
25 # **Python version check**
25 # **Python version check**
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 < (3, 7):
29 if sys.version_info < (3, 7):
30 pip_message = 'This may be due to an out of date pip. Make sure you have pip >= 9.0.1.'
30 pip_message = 'This may be due to an out of date pip. Make sure you have pip >= 9.0.1.'
31 try:
31 try:
32 import pip
32 import pip
33 pip_version = tuple([int(x) for x in pip.__version__.split('.')[:3]])
33 pip_version = tuple([int(x) for x in pip.__version__.split('.')[:3]])
34 if pip_version < (9, 0, 1) :
34 if pip_version < (9, 0, 1) :
35 pip_message = 'Your pip version is out of date, please install pip >= 9.0.1. '\
35 pip_message = 'Your pip version is out of date, please install pip >= 9.0.1. '\
36 'pip {} detected.'.format(pip.__version__)
36 'pip {} detected.'.format(pip.__version__)
37 else:
37 else:
38 # pip is new enough - it must be something else
38 # pip is new enough - it must be something else
39 pip_message = ''
39 pip_message = ''
40 except Exception:
40 except Exception:
41 pass
41 pass
42
42
43
43
44 error = """
44 error = """
45 IPython 7.17+ supports Python 3.7 and above, following NEP 29.
45 IPython 7.17+ supports Python 3.7 and above, following NEP 29.
46 When using Python 2.7, please install IPython 5.x LTS Long Term Support version.
46 When using Python 2.7, please install IPython 5.x LTS Long Term Support version.
47 Python 3.3 and 3.4 were supported up to IPython 6.x.
47 Python 3.3 and 3.4 were supported up to IPython 6.x.
48 Python 3.5 was supported with IPython 7.0 to 7.9.
48 Python 3.5 was supported with IPython 7.0 to 7.9.
49 Python 3.6 was supported with IPython up to 7.16.
49 Python 3.6 was supported with IPython up to 7.16.
50
50
51 See IPython `README.rst` file for more information:
51 See IPython `README.rst` file for more information:
52
52
53 https://github.com/ipython/ipython/blob/master/README.rst
53 https://github.com/ipython/ipython/blob/master/README.rst
54
54
55 Python {py} detected.
55 Python {py} detected.
56 {pip}
56 {pip}
57 """.format(py=sys.version_info, pip=pip_message )
57 """.format(py=sys.version_info, pip=pip_message )
58
58
59 print(error, file=sys.stderr)
59 print(error, file=sys.stderr)
60 sys.exit(1)
60 sys.exit(1)
61
61
62 # At least we're on the python version we need, move on.
62 # At least we're on the python version we need, move on.
63
63
64 # BEFORE importing distutils, remove MANIFEST. distutils doesn't properly
64 # BEFORE importing distutils, remove MANIFEST. distutils doesn't properly
65 # update it when the contents of directories change.
65 # update it when the contents of directories change.
66 if os.path.exists('MANIFEST'): os.remove('MANIFEST')
66 if os.path.exists('MANIFEST'): os.remove('MANIFEST')
67
67
68 from distutils.core import setup
68 from distutils.core import setup
69
69
70 # Our own imports
70 # Our own imports
71 from setupbase import target_update
71 from setupbase import target_update
72
72
73 from setupbase import (
73 from setupbase import (
74 setup_args,
74 setup_args,
75 find_packages,
75 find_packages,
76 find_package_data,
76 find_package_data,
77 check_package_data_first,
77 check_package_data_first,
78 find_entry_points,
78 find_entry_points,
79 build_scripts_entrypt,
79 build_scripts_entrypt,
80 find_data_files,
80 find_data_files,
81 git_prebuild,
81 git_prebuild,
82 install_symlinked,
82 install_symlinked,
83 install_lib_symlink,
83 install_lib_symlink,
84 install_scripts_for_symlink,
84 install_scripts_for_symlink,
85 unsymlink,
85 unsymlink,
86 )
86 )
87
87
88 isfile = os.path.isfile
88 isfile = os.path.isfile
89 pjoin = os.path.join
89 pjoin = os.path.join
90
90
91 #-------------------------------------------------------------------------------
91 #-------------------------------------------------------------------------------
92 # Handle OS specific things
92 # Handle OS specific things
93 #-------------------------------------------------------------------------------
93 #-------------------------------------------------------------------------------
94
94
95 if os.name in ('nt','dos'):
95 if os.name in ('nt','dos'):
96 os_name = 'windows'
96 os_name = 'windows'
97 else:
97 else:
98 os_name = os.name
98 os_name = os.name
99
99
100 # Under Windows, 'sdist' has not been supported. Now that the docs build with
100 # Under Windows, 'sdist' has not been supported. Now that the docs build with
101 # Sphinx it might work, but let's not turn it on until someone confirms that it
101 # Sphinx it might work, but let's not turn it on until someone confirms that it
102 # actually works.
102 # actually works.
103 if os_name == 'windows' and 'sdist' in sys.argv:
103 if os_name == 'windows' and 'sdist' in sys.argv:
104 print('The sdist command is not available under Windows. Exiting.')
104 print('The sdist command is not available under Windows. Exiting.')
105 sys.exit(1)
105 sys.exit(1)
106
106
107
107
108 #-------------------------------------------------------------------------------
108 #-------------------------------------------------------------------------------
109 # Things related to the IPython documentation
109 # Things related to the IPython documentation
110 #-------------------------------------------------------------------------------
110 #-------------------------------------------------------------------------------
111
111
112 # update the manuals when building a source dist
112 # update the manuals when building a source dist
113 if len(sys.argv) >= 2 and sys.argv[1] in ('sdist','bdist_rpm'):
113 if len(sys.argv) >= 2 and sys.argv[1] in ('sdist','bdist_rpm'):
114
114
115 # List of things to be updated. Each entry is a triplet of args for
115 # List of things to be updated. Each entry is a triplet of args for
116 # target_update()
116 # target_update()
117 to_update = [
117 to_update = [
118 ('docs/man/ipython.1.gz',
118 ('docs/man/ipython.1.gz',
119 ['docs/man/ipython.1'],
119 ['docs/man/ipython.1'],
120 'cd docs/man && gzip -9c ipython.1 > ipython.1.gz'),
120 'cd docs/man && gzip -9c ipython.1 > ipython.1.gz'),
121 ]
121 ]
122
122
123
123
124 [ target_update(*t) for t in to_update ]
124 [ target_update(*t) for t in to_update ]
125
125
126 #---------------------------------------------------------------------------
126 #---------------------------------------------------------------------------
127 # Find all the packages, package data, and data_files
127 # Find all the packages, package data, and data_files
128 #---------------------------------------------------------------------------
128 #---------------------------------------------------------------------------
129
129
130 packages = find_packages()
130 packages = find_packages()
131 package_data = find_package_data()
131 package_data = find_package_data()
132
132
133 data_files = find_data_files()
133 data_files = find_data_files()
134
134
135 setup_args['packages'] = packages
135 setup_args['packages'] = packages
136 setup_args['package_data'] = package_data
136 setup_args['package_data'] = package_data
137 setup_args['data_files'] = data_files
137 setup_args['data_files'] = data_files
138
138
139 #---------------------------------------------------------------------------
139 #---------------------------------------------------------------------------
140 # custom distutils commands
140 # custom distutils commands
141 #---------------------------------------------------------------------------
141 #---------------------------------------------------------------------------
142 # imports here, so they are after setuptools import if there was one
142 # imports here, so they are after setuptools import if there was one
143 from distutils.command.sdist import sdist
143 from distutils.command.sdist import sdist
144
144
145 setup_args['cmdclass'] = {
145 setup_args['cmdclass'] = {
146 'build_py': \
146 'build_py': \
147 check_package_data_first(git_prebuild('IPython')),
147 check_package_data_first(git_prebuild('IPython')),
148 'sdist' : git_prebuild('IPython', sdist),
148 'sdist' : git_prebuild('IPython', sdist),
149 'symlink': install_symlinked,
149 'symlink': install_symlinked,
150 'install_lib_symlink': install_lib_symlink,
150 'install_lib_symlink': install_lib_symlink,
151 'install_scripts_sym': install_scripts_for_symlink,
151 'install_scripts_sym': install_scripts_for_symlink,
152 'unsymlink': unsymlink,
152 'unsymlink': unsymlink,
153 }
153 }
154
154
155
155
156 #---------------------------------------------------------------------------
156 #---------------------------------------------------------------------------
157 # Handle scripts, dependencies, and setuptools specific things
157 # Handle scripts, dependencies, and setuptools specific things
158 #---------------------------------------------------------------------------
158 #---------------------------------------------------------------------------
159
159
160 # For some commands, use setuptools. Note that we do NOT list install here!
160 # For some commands, use setuptools. Note that we do NOT list install here!
161 # If you want a setuptools-enhanced install, just run 'setupegg.py install'
161 # If you want a setuptools-enhanced install, just run 'setupegg.py install'
162 needs_setuptools = {'develop', 'release', 'bdist_egg', 'bdist_rpm',
162 needs_setuptools = {'develop', 'release', 'bdist_egg', 'bdist_rpm',
163 'bdist', 'bdist_dumb', 'bdist_wininst', 'bdist_wheel',
163 'bdist', 'bdist_dumb', 'bdist_wininst', 'bdist_wheel',
164 'egg_info', 'easy_install', 'upload', 'install_egg_info',
164 'egg_info', 'easy_install', 'upload', 'install_egg_info',
165 }
165 }
166
166
167 if len(needs_setuptools.intersection(sys.argv)) > 0:
167 if len(needs_setuptools.intersection(sys.argv)) > 0:
168 import setuptools
168 import setuptools
169
169
170 # This dict is used for passing extra arguments that are setuptools
170 # This dict is used for passing extra arguments that are setuptools
171 # specific to setup
171 # specific to setup
172 setuptools_extra_args = {}
172 setuptools_extra_args = {}
173
173
174 # setuptools requirements
174 # setuptools requirements
175
175
176 extras_require = dict(
176 extras_require = dict(
177 parallel = ['ipyparallel'],
177 parallel=["ipyparallel"],
178 qtconsole = ['qtconsole'],
178 qtconsole=["qtconsole"],
179 doc = ['Sphinx>=1.3'],
179 doc=["Sphinx>=1.3"],
180 test = ['nose>=0.10.1', 'requests', 'testpath', 'pygments', 'nbformat', 'ipykernel', 'numpy>=1.14'],
180 test=[
181 terminal = [],
181 "nose>=0.10.1",
182 kernel = ['ipykernel'],
182 "requests",
183 nbformat = ['nbformat'],
183 "testpath",
184 notebook = ['notebook', 'ipywidgets'],
184 "pygments",
185 nbconvert = ['nbconvert'],
185 "nbformat",
186 "ipykernel",
187 "numpy>=1.16",
188 ],
189 terminal=[],
190 kernel=["ipykernel"],
191 nbformat=["nbformat"],
192 notebook=["notebook", "ipywidgets"],
193 nbconvert=["nbconvert"],
186 )
194 )
187
195
188 install_requires = [
196 install_requires = [
189 "setuptools>=18.5",
197 "setuptools>=18.5",
190 "jedi>=0.16",
198 "jedi>=0.16",
191 "decorator",
199 "decorator",
192 "pickleshare",
200 "pickleshare",
193 "traitlets>=4.2",
201 "traitlets>=4.2",
194 "prompt_toolkit>=2.0.0,<3.1.0,!=3.0.0,!=3.0.1",
202 "prompt_toolkit>=2.0.0,<3.1.0,!=3.0.0,!=3.0.1",
195 "pygments",
203 "pygments",
196 "backcall",
204 "backcall",
197 ]
205 ]
198
206
199 # Platform-specific dependencies:
207 # Platform-specific dependencies:
200 # This is the correct way to specify these,
208 # This is the correct way to specify these,
201 # but requires pip >= 6. pip < 6 ignores these.
209 # but requires pip >= 6. pip < 6 ignores these.
202
210
203 extras_require.update(
211 extras_require.update(
204 {
212 {
205 ':sys_platform != "win32"': ["pexpect>4.3"],
213 ':sys_platform != "win32"': ["pexpect>4.3"],
206 ':sys_platform == "darwin"': ["appnope"],
214 ':sys_platform == "darwin"': ["appnope"],
207 ':sys_platform == "win32"': ["colorama"],
215 ':sys_platform == "win32"': ["colorama"],
208 }
216 }
209 )
217 )
210 # FIXME: re-specify above platform dependencies for pip < 6
218 # FIXME: re-specify above platform dependencies for pip < 6
211 # These would result in non-portable bdists.
219 # These would result in non-portable bdists.
212 if not any(arg.startswith('bdist') for arg in sys.argv):
220 if not any(arg.startswith('bdist') for arg in sys.argv):
213 if sys.platform == 'darwin':
221 if sys.platform == 'darwin':
214 install_requires.extend(['appnope'])
222 install_requires.extend(['appnope'])
215
223
216 if not sys.platform.startswith("win"):
224 if not sys.platform.startswith("win"):
217 install_requires.append("pexpect>4.3")
225 install_requires.append("pexpect>4.3")
218
226
219 # workaround pypa/setuptools#147, where setuptools misspells
227 # workaround pypa/setuptools#147, where setuptools misspells
220 # platform_python_implementation as python_implementation
228 # platform_python_implementation as python_implementation
221 if 'setuptools' in sys.modules:
229 if 'setuptools' in sys.modules:
222 for key in list(extras_require):
230 for key in list(extras_require):
223 if 'platform_python_implementation' in key:
231 if 'platform_python_implementation' in key:
224 new_key = key.replace('platform_python_implementation', 'python_implementation')
232 new_key = key.replace('platform_python_implementation', 'python_implementation')
225 extras_require[new_key] = extras_require.pop(key)
233 extras_require[new_key] = extras_require.pop(key)
226
234
227 everything = set()
235 everything = set()
228 for key, deps in extras_require.items():
236 for key, deps in extras_require.items():
229 if ':' not in key:
237 if ':' not in key:
230 everything.update(deps)
238 everything.update(deps)
231 extras_require['all'] = list(sorted(everything))
239 extras_require['all'] = list(sorted(everything))
232
240
233 if 'setuptools' in sys.modules:
241 if 'setuptools' in sys.modules:
234 setuptools_extra_args['python_requires'] = '>=3.7'
242 setuptools_extra_args['python_requires'] = '>=3.7'
235 setuptools_extra_args['zip_safe'] = False
243 setuptools_extra_args['zip_safe'] = False
236 setuptools_extra_args['entry_points'] = {
244 setuptools_extra_args['entry_points'] = {
237 'console_scripts': find_entry_points(),
245 'console_scripts': find_entry_points(),
238 'pygments.lexers': [
246 'pygments.lexers': [
239 'ipythonconsole = IPython.lib.lexers:IPythonConsoleLexer',
247 'ipythonconsole = IPython.lib.lexers:IPythonConsoleLexer',
240 'ipython = IPython.lib.lexers:IPythonLexer',
248 'ipython = IPython.lib.lexers:IPythonLexer',
241 'ipython3 = IPython.lib.lexers:IPython3Lexer',
249 'ipython3 = IPython.lib.lexers:IPython3Lexer',
242 ],
250 ],
243 }
251 }
244 setup_args['extras_require'] = extras_require
252 setup_args['extras_require'] = extras_require
245 setup_args['install_requires'] = install_requires
253 setup_args['install_requires'] = install_requires
246
254
247 else:
255 else:
248 # scripts has to be a non-empty list, or install_scripts isn't called
256 # scripts has to be a non-empty list, or install_scripts isn't called
249 setup_args['scripts'] = [e.split('=')[0].strip() for e in find_entry_points()]
257 setup_args['scripts'] = [e.split('=')[0].strip() for e in find_entry_points()]
250
258
251 setup_args['cmdclass']['build_scripts'] = build_scripts_entrypt
259 setup_args['cmdclass']['build_scripts'] = build_scripts_entrypt
252
260
253 #---------------------------------------------------------------------------
261 #---------------------------------------------------------------------------
254 # Do the actual setup now
262 # Do the actual setup now
255 #---------------------------------------------------------------------------
263 #---------------------------------------------------------------------------
256
264
257 setup_args.update(setuptools_extra_args)
265 setup_args.update(setuptools_extra_args)
258
266
259
267
260
268
261 def main():
269 def main():
262 setup(**setup_args)
270 setup(**setup_args)
263
271
264 if __name__ == '__main__':
272 if __name__ == '__main__':
265 main()
273 main()
General Comments 0
You need to be logged in to leave comments. Login now