blob: 1206bcc6a995985fc9beee75a0c4f539ca4bfaa9 [file] [log] [blame]
Changqing Li583901a2020-03-04 08:22:401#!/usr/bin/env python3
Ralf Gommers759dd952018-08-23 17:11:582""" NumPy is the fundamental package for array computing with Python.
Travis Oliphantda9c6da2006-01-04 17:31:073
Ralf Gommers759dd952018-08-23 17:11:584It provides:
Travis Oliphantda9c6da2006-01-04 17:31:075
Ralf Gommers759dd952018-08-23 17:11:586- a powerful N-dimensional array object
7- sophisticated (broadcasting) functions
8- tools for integrating C/C++ and Fortran code
9- useful linear algebra, Fourier transform, and random number capabilities
10- and much more
Charles Harris6aa264c2013-02-27 20:26:5811
Ralf Gommers759dd952018-08-23 17:11:5812Besides its obvious scientific uses, NumPy can also be used as an efficient
13multi-dimensional container of generic data. Arbitrary data-types can be
14defined. This allows NumPy to seamlessly and speedily integrate with a wide
15variety of databases.
Matthew Brettbe575d52016-03-07 20:52:0816
Ralf Gommers759dd952018-08-23 17:11:5817All NumPy wheels distributed on PyPI are BSD licensed.
Matthew Brettbe575d52016-03-07 20:52:0818
Travis Oliphantda9c6da2006-01-04 17:31:0719"""
David Sanders922442f2015-10-19 20:03:3420DOCLINES = (__doc__ or '').split("\n")
Pearu Petersonc415fd12002-11-18 22:39:3121
Pearu Petersone8fa0132003-03-07 18:08:2822import os
23import sys
David Cournapeau5623a7c2009-04-02 16:21:3024import subprocess
Ralf Gommers99e99e92015-12-29 14:24:2225import textwrap
Hugo van Kemenadef3a6b332020-10-04 09:09:5226import warnings
Pearu Petersonc415fd12002-11-18 22:39:3127
Ralf Gommers17716d72013-12-06 19:45:4028
Charles Harris420091d2020-12-02 20:35:5729if sys.version_info[:2] < (3, 7):
30 raise RuntimeError("Python version >= 3.7 required.")
Charles Harris28eadc02013-07-11 18:08:4931
Charles Harrisbadf2902018-12-07 21:16:2632import builtins
David Cournapeau2b517692009-12-03 15:53:2933
Ralf Gommers17716d72013-12-06 19:45:4034
Travis Oliphantda9c6da2006-01-04 17:31:0735CLASSIFIERS = """\
Robert Kern19da9712008-06-18 22:53:4436Development Status :: 5 - Production/Stable
Travis Oliphantda9c6da2006-01-04 17:31:0737Intended Audience :: Science/Research
38Intended Audience :: Developers
johnthagen5cb80d62020-10-22 12:43:0339License :: OSI Approved :: BSD License
Travis Oliphantda9c6da2006-01-04 17:31:0740Programming Language :: C
41Programming Language :: Python
rgommerscdac1202011-01-25 14:02:4042Programming Language :: Python :: 3
Ralf Gommers943695b2018-06-28 02:26:1943Programming Language :: Python :: 3.7
Grzegorz Bokotac861a362019-10-24 18:29:0944Programming Language :: Python :: 3.8
Hugo van Kemenade79a8e162020-10-04 11:59:5345Programming Language :: Python :: 3.9
Jon Dufresne334201d2019-08-27 04:18:3546Programming Language :: Python :: 3 :: Only
Alex Willmer193668a2015-08-05 09:29:3947Programming Language :: Python :: Implementation :: CPython
Travis Oliphantda9c6da2006-01-04 17:31:0748Topic :: Software Development
49Topic :: Scientific/Engineering
Bas van Beeke592c272020-10-04 13:10:4250Typing :: Typed
Travis Oliphantda9c6da2006-01-04 17:31:0751Operating System :: Microsoft :: Windows
52Operating System :: POSIX
53Operating System :: Unix
54Operating System :: MacOS
55"""
56
Ralf Gommers58c1bf72012-11-05 19:47:2357MAJOR = 1
Charles Harrisb5783122020-05-17 13:59:2358MINOR = 20
Charles Harris84f429d2021-02-07 20:24:2959MICRO = 2
Charles Harrisb19ad5b2021-03-27 18:45:5160ISRELEASED = True
Charles Harris9fa23b32020-12-25 02:44:2461VERSION = '%d.%d.%d' % (MAJOR, MINOR, MICRO)
Stefan van der Waltb9a22d72009-06-17 14:28:0362
Hugo van Kemenade7178a1d2020-10-04 11:59:4563# The first version not in the `Programming Language :: Python :: ...` classifiers above
Hugo van Kemenadecac2df02020-10-04 11:53:2064if sys.version_info >= (3, 10):
Charles Harrise41dfe82020-12-12 15:28:2165 fmt = "NumPy {} may not yet support Python {}.{}."
Hugo van Kemenadef3a6b332020-10-04 09:09:5266 warnings.warn(
Charles Harrise41dfe82020-12-12 15:28:2167 fmt.format(VERSION, *sys.version_info[:2]),
Hugo van Kemenadef3a6b332020-10-04 09:09:5268 RuntimeWarning,
69 )
Charles Harrise41dfe82020-12-12 15:28:2170 del fmt
Hugo van Kemenadef3a6b332020-10-04 09:09:5271
Ralf Gommers17716d72013-12-06 19:45:4072
Scott Sinclair58e63602010-11-09 15:09:1573# Return the git revision as a string
74def git_version():
David Cournapeau44d92ec2009-06-01 05:43:1675 def _minimal_ext_cmd(cmd):
76 # construct minimal environment
77 env = {}
Robert Kernc0be9952017-03-09 00:38:5478 for k in ['SYSTEMROOT', 'PATH', 'HOME']:
David Cournapeau5032b522009-09-18 10:10:3979 v = os.environ.get(k)
80 if v is not None:
81 env[k] = v
David Cournapeau44d92ec2009-06-01 05:43:1682 # LANGUAGE is used on win32
83 env['LANGUAGE'] = 'C'
84 env['LANG'] = 'C'
85 env['LC_ALL'] = 'C'
mattip6424fee2019-04-25 12:51:5586 out = subprocess.check_output(cmd, stderr=subprocess.STDOUT, env=env)
David Cournapeau44d92ec2009-06-01 05:43:1687 return out
88
David Cournapeau5623a7c2009-04-02 16:21:3089 try:
Scott Sinclair58e63602010-11-09 15:09:1590 out = _minimal_ext_cmd(['git', 'rev-parse', 'HEAD'])
Pauli Virtanend1a184c2010-11-15 01:00:0691 GIT_REVISION = out.strip().decode('ascii')
mattip1f1e8f92019-05-02 02:53:5492 except (subprocess.SubprocessError, OSError):
Scott Sinclaird5ed7442010-11-10 05:19:1593 GIT_REVISION = "Unknown"
David Cournapeau5e041cb2009-03-27 11:16:0194
Seth Troisi0498afe2019-09-23 19:30:4495 if not GIT_REVISION:
96 # this shouldn't happen but apparently can (see gh-8512)
97 GIT_REVISION = "Unknown"
98
Scott Sinclair58e63602010-11-09 15:09:1599 return GIT_REVISION
David Cournapeau5e041cb2009-03-27 11:16:01100
Hugo van Kemenade2ebb4532020-10-04 09:41:47101
Ralf Gommers4b0ed792015-12-29 10:29:38102# BEFORE importing setuptools, remove MANIFEST. Otherwise it may not be
103# properly updated when the contents of directories change (true for distutils,
104# not sure about setuptools).
105if os.path.exists('MANIFEST'):
106 os.remove('MANIFEST')
David Cournapeau5bb1aa52009-03-27 16:39:01107
108# This is a bit hackish: we are setting a global variable so that the main
109# numpy __init__ can detect if it is being loaded by the setup routine, to
110# avoid attempting to load components that aren't built yet. While ugly, it's
111# a lot more robust than what was previously being used.
David Cournapeau2b517692009-12-03 15:53:29112builtins.__NUMPY_SETUP__ = True
David Cournapeau5bb1aa52009-03-27 16:39:01113
rgommers13212a52011-03-03 16:13:08114
Ralf Gommers17716d72013-12-06 19:45:40115def get_version_info():
Ralf Gommers87e12c12011-03-24 15:30:06116 # Adding the git rev number needs to be done inside write_version_py(),
117 # otherwise the import of numpy.version messes up the build under Python 3.
118 FULLVERSION = VERSION
119 if os.path.exists('.git'):
120 GIT_REVISION = git_version()
121 elif os.path.exists('numpy/version.py'):
122 # must be a source distribution, use existing version file
Ralf Gommerscd6d53f2011-04-17 14:04:11123 try:
124 from numpy.version import git_revision as GIT_REVISION
125 except ImportError:
MSeifert0478d269d2019-07-01 18:51:40126 raise ImportError("Unable to import git_revision. Try removing "
127 "numpy/version.py and the build directory "
Ralf Gommerscd6d53f2011-04-17 14:04:11128 "before building.")
Ralf Gommers87e12c12011-03-24 15:30:06129 else:
130 GIT_REVISION = "Unknown"
131
132 if not ISRELEASED:
Ã…smund Hjulstade15f2922015-02-10 17:07:55133 FULLVERSION += '.dev0+' + GIT_REVISION[:7]
Ralf Gommers87e12c12011-03-24 15:30:06134
Ralf Gommers17716d72013-12-06 19:45:40135 return FULLVERSION, GIT_REVISION
136
137
138def write_version_py(filename='numpy/version.py'):
139 cnt = """
140# THIS FILE IS GENERATED FROM NUMPY SETUP.PY
Ralf Gommers105a4982015-12-29 20:58:36141#
142# To compare versions robustly, use `numpy.lib.NumpyVersion`
Douglas Fenstermacher49d62f82020-11-05 15:39:07143short_version: str = '%(version)s'
144version: str = '%(version)s'
145full_version: str = '%(full_version)s'
146git_revision: str = '%(git_revision)s'
147release: bool = %(isrelease)s
Ralf Gommers17716d72013-12-06 19:45:40148
149if not release:
150 version = full_version
151"""
152 FULLVERSION, GIT_REVISION = get_version_info()
153
David Cournapeaua2ac9852009-03-27 11:15:36154 a = open(filename, 'w')
155 try:
Scott Sinclair58e63602010-11-09 15:09:15156 a.write(cnt % {'version': VERSION,
Charles Harris054d93a2017-11-29 18:53:21157 'full_version': FULLVERSION,
158 'git_revision': GIT_REVISION,
Scott Sinclair58e63602010-11-09 15:09:15159 'isrelease': str(ISRELEASED)})
David Cournapeaua2ac9852009-03-27 11:15:36160 finally:
161 a.close()
162
Ralf Gommers17716d72013-12-06 19:45:40163
Hugo van Kemenade2ebb4532020-10-04 09:41:47164def configuration(parent_package='', top_path=None):
Pearu Peterson471196b2006-03-31 08:59:36165 from numpy.distutils.misc_util import Configuration
166
Pearu Peterson17d7cfe2006-04-04 12:26:14167 config = Configuration(None, parent_package, top_path)
Pearu Peterson471196b2006-03-31 08:59:36168 config.set_options(ignore_setup_xxx_py=True,
169 assume_default_configuration=True,
170 delegate_options_to_subpackages=True,
171 quiet=True)
Jarrod Millman0b77f0e2007-10-29 14:58:18172
Pearu Peterson471196b2006-03-31 08:59:36173 config.add_subpackage('numpy')
Charles Harris054d93a2017-11-29 18:53:21174 config.add_data_files(('numpy', 'LICENSE.txt'))
scodere1211b82020-08-05 04:28:30175 config.add_data_files(('numpy', 'numpy/*.pxd'))
Jarrod Millman0b77f0e2007-10-29 14:58:18176
Hugo van Kemenade2ebb4532020-10-04 09:41:47177 config.get_version('numpy/version.py') # sets config.version
Travis Oliphant00a35872007-05-31 04:57:01178
Pearu Peterson471196b2006-03-31 08:59:36179 return config
180
Ralf Gommers4b0ed792015-12-29 10:29:38181
Julian Taylor4cd72742014-01-29 21:59:19182def check_submodules():
183 """ verify that the submodules are checked out and clean
184 use `git submodule update --init`; on failure
185 """
186 if not os.path.exists('.git'):
187 return
188 with open('.gitmodules') as f:
Hugo van Kemenade2ebb4532020-10-04 09:41:47189 for line in f:
190 if 'path' in line:
191 p = line.split('=')[-1].strip()
Julian Taylor4cd72742014-01-29 21:59:19192 if not os.path.exists(p):
Wojciech Rzadkowskidabf31c2020-05-22 15:43:08193 raise ValueError('Submodule {} missing'.format(p))
Julian Taylor4cd72742014-01-29 21:59:19194
Julian Taylor4cd72742014-01-29 21:59:19195 proc = subprocess.Popen(['git', 'submodule', 'status'],
196 stdout=subprocess.PIPE)
197 status, _ = proc.communicate()
198 status = status.decode("ascii", "replace")
199 for line in status.splitlines():
200 if line.startswith('-') or line.startswith('+'):
Wojciech Rzadkowskidabf31c2020-05-22 15:43:08201 raise ValueError('Submodule not clean: {}'.format(line))
Julian Taylor4cd72742014-01-29 21:59:19202
Ralf Gommers4b0ed792015-12-29 10:29:38203
Ralf Gommersa08fb602019-05-03 14:44:23204class concat_license_files():
Ralf Gommers33415902019-05-07 09:00:50205 """Merge LICENSE.txt and LICENSES_bundled.txt for sdist creation
Ralf Gommersa08fb602019-05-03 14:44:23206
207 Done this way to keep LICENSE.txt in repo as exact BSD 3-clause (see
208 gh-13447). This makes GitHub state correctly how NumPy is licensed.
209 """
210 def __init__(self):
211 self.f1 = 'LICENSE.txt'
Ralf Gommers33415902019-05-07 09:00:50212 self.f2 = 'LICENSES_bundled.txt'
Ralf Gommersa08fb602019-05-03 14:44:23213
214 def __enter__(self):
Ralf Gommers33415902019-05-07 09:00:50215 """Concatenate files and remove LICENSES_bundled.txt"""
Ralf Gommersa08fb602019-05-03 14:44:23216 with open(self.f1, 'r') as f1:
217 self.bsd_text = f1.read()
218
219 with open(self.f1, 'a') as f1:
220 with open(self.f2, 'r') as f2:
221 self.bundled_text = f2.read()
222 f1.write('\n\n')
223 f1.write(self.bundled_text)
224
Ralf Gommersa08fb602019-05-03 14:44:23225 def __exit__(self, exception_type, exception_value, traceback):
226 """Restore content of both files"""
227 with open(self.f1, 'w') as f:
228 f.write(self.bsd_text)
229
Ralf Gommersa08fb602019-05-03 14:44:23230
Ralf Gommers6770f982016-01-27 20:34:28231from distutils.command.sdist import sdist
Julian Taylor4cd72742014-01-29 21:59:19232class sdist_checked(sdist):
233 """ check submodules on sdist to prevent incomplete tarballs """
234 def run(self):
235 check_submodules()
Ralf Gommersa08fb602019-05-03 14:44:23236 with concat_license_files():
237 sdist.run(self)
Travis Oliphant14db4192005-09-14 22:08:46238
Ralf Gommers4b0ed792015-12-29 10:29:38239
mattip18af8e02020-01-04 20:47:47240def get_build_overrides():
241 """
mattipc2f93002020-01-05 15:00:30242 Custom build commands to add `-std=c99` to compilation
mattip18af8e02020-01-04 20:47:47243 """
244 from numpy.distutils.command.build_clib import build_clib
245 from numpy.distutils.command.build_ext import build_ext
mattip57fb47c2020-07-28 03:39:16246 from distutils.version import LooseVersion
mattip18af8e02020-01-04 20:47:47247
mattip10dcfb02020-07-28 08:56:35248 def _needs_gcc_c99_flag(obj):
249 if obj.compiler.compiler_type != 'unix':
250 return False
251
252 cc = obj.compiler.compiler[0]
253 if "gcc" not in cc:
254 return False
255
256 # will print something like '4.2.1\n'
257 out = subprocess.run([cc, '-dumpversion'], stdout=subprocess.PIPE,
258 stderr=subprocess.PIPE, universal_newlines=True)
259 # -std=c99 is default from this version on
260 if LooseVersion(out.stdout) >= LooseVersion('5.0'):
261 return False
262 return True
mattip18af8e02020-01-04 20:47:47263
264 class new_build_clib(build_clib):
265 def build_a_library(self, build_info, lib_name, libraries):
mattip10dcfb02020-07-28 08:56:35266 if _needs_gcc_c99_flag(self):
mattip18af8e02020-01-04 20:47:47267 args = build_info.get('extra_compiler_args') or []
mattipc2f93002020-01-05 15:00:30268 args.append('-std=c99')
mattip18af8e02020-01-04 20:47:47269 build_info['extra_compiler_args'] = args
270 build_clib.build_a_library(self, build_info, lib_name, libraries)
271
272 class new_build_ext(build_ext):
273 def build_extension(self, ext):
mattip10dcfb02020-07-28 08:56:35274 if _needs_gcc_c99_flag(self):
mattipc2f93002020-01-05 15:00:30275 if '-std=c99' not in ext.extra_compile_args:
276 ext.extra_compile_args.append('-std=c99')
mattip18af8e02020-01-04 20:47:47277 build_ext.build_extension(self, ext)
278 return new_build_clib, new_build_ext
279
280
Julian Taylorc9fd6342014-04-05 11:13:13281def generate_cython():
282 cwd = os.path.abspath(os.path.dirname(__file__))
283 print("Cythonizing sources")
mattip4e6a8122019-05-23 04:54:47284 for d in ('random',):
mattipfa8af412019-03-20 10:39:53285 p = subprocess.call([sys.executable,
Hugo van Kemenade2ebb4532020-10-04 09:41:47286 os.path.join(cwd, 'tools', 'cythonize.py'),
287 'numpy/{0}'.format(d)],
288 cwd=cwd)
mattipfa8af412019-03-20 10:39:53289 if p != 0:
290 raise RuntimeError("Running cythonize failed!")
Julian Taylorc9fd6342014-04-05 11:13:13291
Ralf Gommers4b0ed792015-12-29 10:29:38292
Ralf Gommersb9f48092015-12-29 11:05:30293def parse_setuppy_commands():
Ralf Gommers99e99e92015-12-29 14:24:22294 """Check the commands and respond appropriately. Disable broken commands.
295
296 Return a boolean value for whether or not to run the build or not (avoid
297 parsing Cython and template files if False).
298 """
Eric Wieserb8b2a0e2018-03-12 08:29:52299 args = sys.argv[1:]
300
301 if not args:
Ralf Gommersb9f48092015-12-29 11:05:30302 # User forgot to give an argument probably, let setuptools handle that.
Ralf Gommers99e99e92015-12-29 14:24:22303 return True
Ralf Gommersb9f48092015-12-29 11:05:30304
Ralf Gommers99e99e92015-12-29 14:24:22305 info_commands = ['--help-commands', '--name', '--version', '-V',
306 '--fullname', '--author', '--author-email',
307 '--maintainer', '--maintainer-email', '--contact',
308 '--contact-email', '--url', '--license', '--description',
309 '--long-description', '--platforms', '--classifiers',
310 '--keywords', '--provides', '--requires', '--obsoletes']
Ralf Gommers99e99e92015-12-29 14:24:22311
312 for command in info_commands:
Eric Wieserb8b2a0e2018-03-12 08:29:52313 if command in args:
Ralf Gommers99e99e92015-12-29 14:24:22314 return False
315
316 # Note that 'alias', 'saveopts' and 'setopt' commands also seem to work
317 # fine as they are, but are usually used together with one of the commands
318 # below and not standalone. Hence they're not added to good_commands.
319 good_commands = ('develop', 'sdist', 'build', 'build_ext', 'build_py',
Ralf Gommersab5c6d02016-01-16 14:21:23320 'build_clib', 'build_scripts', 'bdist_wheel', 'bdist_rpm',
mattip2e4af962019-09-19 20:47:29321 'bdist_wininst', 'bdist_msi', 'bdist_mpkg', 'build_src')
Ralf Gommers99e99e92015-12-29 14:24:22322
Ralf Gommersb9f48092015-12-29 11:05:30323 for command in good_commands:
Eric Wieserb8b2a0e2018-03-12 08:29:52324 if command in args:
Ralf Gommers99e99e92015-12-29 14:24:22325 return True
Ralf Gommersb9f48092015-12-29 11:05:30326
Ralf Gommersab5c6d02016-01-16 14:21:23327 # The following commands are supported, but we need to show more
Ralf Gommers99e99e92015-12-29 14:24:22328 # useful messages to the user
Eric Wieserb8b2a0e2018-03-12 08:29:52329 if 'install' in args:
Ralf Gommers99e99e92015-12-29 14:24:22330 print(textwrap.dedent("""
331 Note: if you need reliable uninstall behavior, then install
332 with pip instead of using `setup.py install`:
333
334 - `pip install .` (from a git repo or downloaded source
335 release)
Pierre de Buyl3f6672a2016-09-06 12:54:08336 - `pip install numpy` (last NumPy release on PyPi)
Ralf Gommers99e99e92015-12-29 14:24:22337
338 """))
339 return True
340
Eric Wieserb8b2a0e2018-03-12 08:29:52341 if '--help' in args or '-h' in sys.argv[1]:
Ralf Gommers99e99e92015-12-29 14:24:22342 print(textwrap.dedent("""
Pierre de Buyl3f6672a2016-09-06 12:54:08343 NumPy-specific help
Ralf Gommers99e99e92015-12-29 14:24:22344 -------------------
345
Pierre de Buyl3f6672a2016-09-06 12:54:08346 To install NumPy from here with reliable uninstall, we recommend
347 that you use `pip install .`. To install the latest NumPy release
Ralf Gommers99e99e92015-12-29 14:24:22348 from PyPi, use `pip install numpy`.
349
350 For help with build/installation issues, please ask on the
351 numpy-discussion mailing list. If you are sure that you have run
352 into a bug, please report it at https://github.com/numpy/numpy/issues.
353
354 Setuptools commands help
355 ------------------------
356 """))
357 return False
358
359 # The following commands aren't supported. They can only be executed when
360 # the user explicitly adds a --force command-line argument.
Ralf Gommersb9f48092015-12-29 11:05:30361 bad_commands = dict(
362 test="""
363 `setup.py test` is not supported. Use one of the following
364 instead:
365
366 - `python runtests.py` (to build and test)
367 - `python runtests.py --no-build` (to test installed numpy)
368 - `>>> numpy.test()` (run tests for installed numpy
369 from within an interpreter)
370 """,
371 upload="""
372 `setup.py upload` is not supported, because it's insecure.
373 Instead, build what you want to upload and upload those files
374 with `twine upload -s <filenames>` instead.
375 """,
376 upload_docs="`setup.py upload_docs` is not supported",
377 easy_install="`setup.py easy_install` is not supported",
378 clean="""
379 `setup.py clean` is not supported, use one of the following instead:
380
381 - `git clean -xdf` (cleans all files)
382 - `git clean -Xdf` (cleans all versioned files, doesn't touch
383 files that aren't checked into the git repo)
384 """,
385 check="`setup.py check` is not supported",
386 register="`setup.py register` is not supported",
387 bdist_dumb="`setup.py bdist_dumb` is not supported",
Ralf Gommers99e99e92015-12-29 14:24:22388 bdist="`setup.py bdist` is not supported",
389 build_sphinx="""
390 `setup.py build_sphinx` is not supported, use the
391 Makefile under doc/""",
392 flake8="`setup.py flake8` is not supported, use flake8 standalone",
Ralf Gommersb9f48092015-12-29 11:05:30393 )
Ralf Gommers99e99e92015-12-29 14:24:22394 bad_commands['nosetests'] = bad_commands['test']
Luca Mussi69d2cc82016-04-07 11:24:49395 for command in ('upload_docs', 'easy_install', 'bdist', 'bdist_dumb',
Hugo van Kemenade2ebb4532020-10-04 09:41:47396 'register', 'check', 'install_data', 'install_headers',
397 'install_lib', 'install_scripts', ):
Ralf Gommers99e99e92015-12-29 14:24:22398 bad_commands[command] = "`setup.py %s` is not supported" % command
399
Ralf Gommersb9f48092015-12-29 11:05:30400 for command in bad_commands.keys():
Eric Wieserb8b2a0e2018-03-12 08:29:52401 if command in args:
Ralf Gommersb9f48092015-12-29 11:05:30402 print(textwrap.dedent(bad_commands[command]) +
403 "\nAdd `--force` to your command to use it anyway if you "
404 "must (unsupported).\n")
405 sys.exit(1)
406
Eric Wieserb8b2a0e2018-03-12 08:29:52407 # Commands that do more than print info, but also don't need Cython and
408 # template parsing.
409 other_commands = ['egg_info', 'install_egg_info', 'rotate']
410 for command in other_commands:
411 if command in args:
412 return False
413
Ralf Gommers99e99e92015-12-29 14:24:22414 # If we got here, we didn't detect what setup.py command was given
415 import warnings
416 warnings.warn("Unrecognized setuptools command, proceeding with "
Hugo van Kemenade2ebb4532020-10-04 09:41:47417 "generating Cython sources and expanding templates",
418 stacklevel=2)
Ralf Gommers99e99e92015-12-29 14:24:22419 return True
Ralf Gommersb9f48092015-12-29 11:05:30420
421
Eric Wieserfb47ba62020-06-20 16:28:51422def get_docs_url():
423 if not ISRELEASED:
424 return "https://numpy.org/devdocs"
425 else:
Qiyu8779d3062020-11-03 12:30:49426 # For releases, this URL ends up on pypi.
Eric Wieserfb47ba62020-06-20 16:28:51427 # By pinning the version, users looking at old PyPI releases can get
428 # to the associated docs easily.
429 return "https://numpy.org/doc/{}.{}".format(MAJOR, MINOR)
430
431
Ralf Gommers17716d72013-12-06 19:45:40432def setup_package():
mattip8b266552019-07-03 22:24:42433 src_path = os.path.dirname(os.path.abspath(__file__))
Pauli Virtanen68159432009-12-06 11:56:18434 old_path = os.getcwd()
435 os.chdir(src_path)
436 sys.path.insert(0, src_path)
437
Brian Wignallb485da12020-01-14 12:27:33438 # Rewrite the version file every time
Pauli Virtanen01312182010-11-23 16:50:54439 write_version_py()
440
Charles Harrisf22a33b2018-08-22 17:57:48441 # The f2py scripts that will be installed
442 if sys.platform == 'win32':
443 f2py_cmds = [
444 'f2py = numpy.f2py.f2py2e:main',
445 ]
446 else:
447 f2py_cmds = [
448 'f2py = numpy.f2py.f2py2e:main',
449 'f2py%s = numpy.f2py.f2py2e:main' % sys.version_info[:1],
450 'f2py%s.%s = numpy.f2py.f2py2e:main' % sys.version_info[:2],
451 ]
452
Hugo van Kemenade2ebb4532020-10-04 09:41:47453 cmdclass = {"sdist": sdist_checked, }
Ralf Gommers17716d72013-12-06 19:45:40454 metadata = dict(
Hugo van Kemenade2ebb4532020-10-04 09:41:47455 name='numpy',
456 maintainer="NumPy Developers",
457 maintainer_email="numpy-discussion@python.org",
458 description=DOCLINES[0],
459 long_description="\n".join(DOCLINES[2:]),
460 url="https://www.numpy.org",
461 author="Travis E. Oliphant et al.",
462 download_url="https://pypi.python.org/pypi/numpy",
Jarrod Millman0486b6d2019-04-12 01:11:21463 project_urls={
464 "Bug Tracker": "https://github.com/numpy/numpy/issues",
Eric Wieserfb47ba62020-06-20 16:28:51465 "Documentation": get_docs_url(),
Jarrod Millman0486b6d2019-04-12 01:11:21466 "Source Code": "https://github.com/numpy/numpy",
467 },
Hugo van Kemenade2ebb4532020-10-04 09:41:47468 license='BSD',
Ralf Gommers17716d72013-12-06 19:45:40469 classifiers=[_f for _f in CLASSIFIERS.split('\n') if _f],
Hugo van Kemenade2ebb4532020-10-04 09:41:47470 platforms=["Windows", "Linux", "Solaris", "Mac OS-X", "Unix"],
Charles Harrisb3b6cc02020-05-18 22:26:10471 test_suite='pytest',
mattip18af8e02020-01-04 20:47:47472 cmdclass=cmdclass,
Charles Harris420091d2020-12-02 20:35:57473 python_requires='>=3.7',
Nathaniel J. Smithf46e7162018-01-23 08:02:04474 zip_safe=False,
Charles Harrisf22a33b2018-08-22 17:57:48475 entry_points={
476 'console_scripts': f2py_cmds
477 },
Ralf Gommers17716d72013-12-06 19:45:40478 )
479
Ralf Gommers99e99e92015-12-29 14:24:22480 if "--force" in sys.argv:
481 run_build = True
Ralf Gommers20c3c2a2017-06-20 10:09:40482 sys.argv.remove('--force')
Ralf Gommers99e99e92015-12-29 14:24:22483 else:
484 # Raise errors for unsupported commands, improve help output, etc.
485 run_build = parse_setuppy_commands()
Ralf Gommersb9f48092015-12-29 11:05:30486
Ralf Gommers99e99e92015-12-29 14:24:22487 if run_build:
Mike Taves07bf33f2020-02-04 19:21:51488 # patches distutils, even though we don't use it
489 import setuptools # noqa: F401
Ralf Gommers17716d72013-12-06 19:45:40490 from numpy.distutils.core import setup
Hugo van Kemenade2ebb4532020-10-04 09:41:47491 if 'sdist' not in sys.argv:
Ralf Gommersd630d962019-09-08 05:01:41492 # Generate Cython sources, unless we're generating an sdist
Julian Taylorc9fd6342014-04-05 11:13:13493 generate_cython()
Ralf Gommers4b0ed792015-12-29 10:29:38494
Ralf Gommers17716d72013-12-06 19:45:40495 metadata['configuration'] = configuration
mattip18af8e02020-01-04 20:47:47496 # Customize extension building
497 cmdclass['build_clib'], cmdclass['build_ext'] = get_build_overrides()
Ralf Gommers99e99e92015-12-29 14:24:22498 else:
Mike Taves07bf33f2020-02-04 19:21:51499 from setuptools import setup
Ralf Gommers99e99e92015-12-29 14:24:22500 # Version number is added to metadata inside configuration() if build
501 # is run.
502 metadata['version'] = get_version_info()[0]
Pauli Virtanen68159432009-12-06 11:56:18503
Pearu Petersone8fa0132003-03-07 18:08:28504 try:
Ralf Gommers17716d72013-12-06 19:45:40505 setup(**metadata)
Pearu Petersone8fa0132003-03-07 18:08:28506 finally:
507 del sys.path[0]
508 os.chdir(old_path)
Travis Oliphant14db4192005-09-14 22:08:46509 return
Pearu Petersonc415fd12002-11-18 22:39:31510
Ralf Gommers17716d72013-12-06 19:45:40511
Travis Oliphant14db4192005-09-14 22:08:46512if __name__ == '__main__':
Pearu Petersone8fa0132003-03-07 18:08:28513 setup_package()
Ralf Gommersbbee7472016-08-21 05:23:35514 # This may avoid problems where numpy is installed via ``*_requires`` by
515 # setuptools, the global namespace isn't reset properly, and then numpy is
516 # imported later (which will then fail to load numpy extension modules).
517 # See gh-7956 for details
518 del builtins.__NUMPY_SETUP__