Changqing Li | 583901a | 2020-03-04 08:22:40 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
Ralf Gommers | 759dd95 | 2018-08-23 17:11:58 | [diff] [blame] | 2 | """ NumPy is the fundamental package for array computing with Python. |
Travis Oliphant | da9c6da | 2006-01-04 17:31:07 | [diff] [blame] | 3 | |
Ralf Gommers | 759dd95 | 2018-08-23 17:11:58 | [diff] [blame] | 4 | It provides: |
Travis Oliphant | da9c6da | 2006-01-04 17:31:07 | [diff] [blame] | 5 | |
Ralf Gommers | 759dd95 | 2018-08-23 17:11:58 | [diff] [blame] | 6 | - 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 Harris | 6aa264c | 2013-02-27 20:26:58 | [diff] [blame] | 11 | |
Ralf Gommers | 759dd95 | 2018-08-23 17:11:58 | [diff] [blame] | 12 | Besides its obvious scientific uses, NumPy can also be used as an efficient |
| 13 | multi-dimensional container of generic data. Arbitrary data-types can be |
| 14 | defined. This allows NumPy to seamlessly and speedily integrate with a wide |
| 15 | variety of databases. |
Matthew Brett | be575d5 | 2016-03-07 20:52:08 | [diff] [blame] | 16 | |
Ralf Gommers | 759dd95 | 2018-08-23 17:11:58 | [diff] [blame] | 17 | All NumPy wheels distributed on PyPI are BSD licensed. |
Matthew Brett | be575d5 | 2016-03-07 20:52:08 | [diff] [blame] | 18 | |
Travis Oliphant | da9c6da | 2006-01-04 17:31:07 | [diff] [blame] | 19 | """ |
David Sanders | 922442f | 2015-10-19 20:03:34 | [diff] [blame] | 20 | DOCLINES = (__doc__ or '').split("\n") |
Pearu Peterson | c415fd1 | 2002-11-18 22:39:31 | [diff] [blame] | 21 | |
Pearu Peterson | e8fa013 | 2003-03-07 18:08:28 | [diff] [blame] | 22 | import os |
| 23 | import sys |
David Cournapeau | 5623a7c | 2009-04-02 16:21:30 | [diff] [blame] | 24 | import subprocess |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 25 | import textwrap |
Hugo van Kemenade | 595af82 | 2020-10-04 09:41:47 | [diff] [blame] | 26 | import sysconfig |
Hugo van Kemenade | 5339331 | 2020-10-04 09:09:52 | [diff] [blame] | 27 | import warnings |
Pearu Peterson | c415fd1 | 2002-11-18 22:39:31 | [diff] [blame] | 28 | |
Ralf Gommers | 17716d7 | 2013-12-06 19:45:40 | [diff] [blame] | 29 | |
Hugo van Kemenade | 595af82 | 2020-10-04 09:41:47 | [diff] [blame] | 30 | |
Charles Harris | fbcb58c | 2019-12-03 23:45:09 | [diff] [blame] | 31 | if sys.version_info[:2] < (3, 6): |
| 32 | raise RuntimeError("Python version >= 3.6 required.") |
Charles Harris | 28eadc0 | 2013-07-11 18:08:49 | [diff] [blame] | 33 | |
Charles Harris | badf290 | 2018-12-07 21:16:26 | [diff] [blame] | 34 | import builtins |
David Cournapeau | 2b51769 | 2009-12-03 15:53:29 | [diff] [blame] | 35 | |
Ralf Gommers | 17716d7 | 2013-12-06 19:45:40 | [diff] [blame] | 36 | |
Travis Oliphant | da9c6da | 2006-01-04 17:31:07 | [diff] [blame] | 37 | CLASSIFIERS = """\ |
Robert Kern | 19da971 | 2008-06-18 22:53:44 | [diff] [blame] | 38 | Development Status :: 5 - Production/Stable |
Travis Oliphant | da9c6da | 2006-01-04 17:31:07 | [diff] [blame] | 39 | Intended Audience :: Science/Research |
| 40 | Intended Audience :: Developers |
| 41 | License :: OSI Approved |
| 42 | Programming Language :: C |
| 43 | Programming Language :: Python |
rgommers | cdac120 | 2011-01-25 14:02:40 | [diff] [blame] | 44 | Programming Language :: Python :: 3 |
Charles Harris | b33a5ee | 2016-11-05 19:48:30 | [diff] [blame] | 45 | Programming Language :: Python :: 3.6 |
Ralf Gommers | 943695b | 2018-06-28 02:26:19 | [diff] [blame] | 46 | Programming Language :: Python :: 3.7 |
Grzegorz Bokota | c861a36 | 2019-10-24 18:29:09 | [diff] [blame] | 47 | Programming Language :: Python :: 3.8 |
Hugo van Kemenade | 5339331 | 2020-10-04 09:09:52 | [diff] [blame] | 48 | Programming Language :: Python :: 3.9 |
Jon Dufresne | 334201d | 2019-08-27 04:18:35 | [diff] [blame] | 49 | Programming Language :: Python :: 3 :: Only |
Alex Willmer | 193668a | 2015-08-05 09:29:39 | [diff] [blame] | 50 | Programming Language :: Python :: Implementation :: CPython |
Travis Oliphant | da9c6da | 2006-01-04 17:31:07 | [diff] [blame] | 51 | Topic :: Software Development |
| 52 | Topic :: Scientific/Engineering |
| 53 | Operating System :: Microsoft :: Windows |
| 54 | Operating System :: POSIX |
| 55 | Operating System :: Unix |
| 56 | Operating System :: MacOS |
| 57 | """ |
| 58 | |
Ralf Gommers | 58c1bf7 | 2012-11-05 19:47:23 | [diff] [blame] | 59 | MAJOR = 1 |
Charles Harris | fbcb58c | 2019-12-03 23:45:09 | [diff] [blame] | 60 | MINOR = 19 |
Charles Harris | 06a646e | 2020-09-10 17:37:12 | [diff] [blame] | 61 | MICRO = 3 |
Charles Harris | 5010177 | 2020-10-28 21:27:05 | [diff] [blame] | 62 | ISRELEASED = True |
Charles Harris | 1b5d0d1 | 2020-05-31 23:04:58 | [diff] [blame] | 63 | VERSION = '%d.%d.%d' % (MAJOR, MINOR, MICRO) |
Stefan van der Walt | b9a22d7 | 2009-06-17 14:28:03 | [diff] [blame] | 64 | |
Hugo van Kemenade | 5339331 | 2020-10-04 09:09:52 | [diff] [blame] | 65 | # The first version not in the `Programming Language :: Python :: ...` classifiers above |
| 66 | if sys.version_info >= (3, 10): |
| 67 | warnings.warn( |
| 68 | f"NumPy {VERSION} may not yet support Python " |
| 69 | f"{sys.version_info.major}.{sys.version_info.minor}.", |
| 70 | RuntimeWarning, |
| 71 | ) |
| 72 | |
Ralf Gommers | 17716d7 | 2013-12-06 19:45:40 | [diff] [blame] | 73 | |
Scott Sinclair | 58e6360 | 2010-11-09 15:09:15 | [diff] [blame] | 74 | # Return the git revision as a string |
| 75 | def git_version(): |
David Cournapeau | 44d92ec | 2009-06-01 05:43:16 | [diff] [blame] | 76 | def _minimal_ext_cmd(cmd): |
| 77 | # construct minimal environment |
| 78 | env = {} |
Robert Kern | c0be995 | 2017-03-09 00:38:54 | [diff] [blame] | 79 | for k in ['SYSTEMROOT', 'PATH', 'HOME']: |
David Cournapeau | 5032b52 | 2009-09-18 10:10:39 | [diff] [blame] | 80 | v = os.environ.get(k) |
| 81 | if v is not None: |
| 82 | env[k] = v |
David Cournapeau | 44d92ec | 2009-06-01 05:43:16 | [diff] [blame] | 83 | # LANGUAGE is used on win32 |
| 84 | env['LANGUAGE'] = 'C' |
| 85 | env['LANG'] = 'C' |
| 86 | env['LC_ALL'] = 'C' |
mattip | 6424fee | 2019-04-25 12:51:55 | [diff] [blame] | 87 | out = subprocess.check_output(cmd, stderr=subprocess.STDOUT, env=env) |
David Cournapeau | 44d92ec | 2009-06-01 05:43:16 | [diff] [blame] | 88 | return out |
| 89 | |
David Cournapeau | 5623a7c | 2009-04-02 16:21:30 | [diff] [blame] | 90 | try: |
Scott Sinclair | 58e6360 | 2010-11-09 15:09:15 | [diff] [blame] | 91 | out = _minimal_ext_cmd(['git', 'rev-parse', 'HEAD']) |
Pauli Virtanen | d1a184c | 2010-11-15 01:00:06 | [diff] [blame] | 92 | GIT_REVISION = out.strip().decode('ascii') |
mattip | 1f1e8f9 | 2019-05-02 02:53:54 | [diff] [blame] | 93 | except (subprocess.SubprocessError, OSError): |
Scott Sinclair | d5ed744 | 2010-11-10 05:19:15 | [diff] [blame] | 94 | GIT_REVISION = "Unknown" |
David Cournapeau | 5e041cb | 2009-03-27 11:16:01 | [diff] [blame] | 95 | |
Seth Troisi | 0498afe | 2019-09-23 19:30:44 | [diff] [blame] | 96 | if not GIT_REVISION: |
| 97 | # this shouldn't happen but apparently can (see gh-8512) |
| 98 | GIT_REVISION = "Unknown" |
| 99 | |
Scott Sinclair | 58e6360 | 2010-11-09 15:09:15 | [diff] [blame] | 100 | return GIT_REVISION |
David Cournapeau | 5e041cb | 2009-03-27 11:16:01 | [diff] [blame] | 101 | |
Hugo van Kemenade | 595af82 | 2020-10-04 09:41:47 | [diff] [blame] | 102 | |
Ralf Gommers | 4b0ed79 | 2015-12-29 10:29:38 | [diff] [blame] | 103 | # BEFORE importing setuptools, remove MANIFEST. Otherwise it may not be |
| 104 | # properly updated when the contents of directories change (true for distutils, |
| 105 | # not sure about setuptools). |
| 106 | if os.path.exists('MANIFEST'): |
| 107 | os.remove('MANIFEST') |
David Cournapeau | 5bb1aa5 | 2009-03-27 16:39:01 | [diff] [blame] | 108 | |
| 109 | # This is a bit hackish: we are setting a global variable so that the main |
| 110 | # numpy __init__ can detect if it is being loaded by the setup routine, to |
| 111 | # avoid attempting to load components that aren't built yet. While ugly, it's |
| 112 | # a lot more robust than what was previously being used. |
David Cournapeau | 2b51769 | 2009-12-03 15:53:29 | [diff] [blame] | 113 | builtins.__NUMPY_SETUP__ = True |
David Cournapeau | 5bb1aa5 | 2009-03-27 16:39:01 | [diff] [blame] | 114 | |
rgommers | 13212a5 | 2011-03-03 16:13:08 | [diff] [blame] | 115 | |
Ralf Gommers | 17716d7 | 2013-12-06 19:45:40 | [diff] [blame] | 116 | def get_version_info(): |
Ralf Gommers | 87e12c1 | 2011-03-24 15:30:06 | [diff] [blame] | 117 | # Adding the git rev number needs to be done inside write_version_py(), |
| 118 | # otherwise the import of numpy.version messes up the build under Python 3. |
| 119 | FULLVERSION = VERSION |
| 120 | if os.path.exists('.git'): |
| 121 | GIT_REVISION = git_version() |
| 122 | elif os.path.exists('numpy/version.py'): |
| 123 | # must be a source distribution, use existing version file |
Ralf Gommers | cd6d53f | 2011-04-17 14:04:11 | [diff] [blame] | 124 | try: |
| 125 | from numpy.version import git_revision as GIT_REVISION |
| 126 | except ImportError: |
MSeifert04 | 78d269d | 2019-07-01 18:51:40 | [diff] [blame] | 127 | raise ImportError("Unable to import git_revision. Try removing " |
| 128 | "numpy/version.py and the build directory " |
Ralf Gommers | cd6d53f | 2011-04-17 14:04:11 | [diff] [blame] | 129 | "before building.") |
Ralf Gommers | 87e12c1 | 2011-03-24 15:30:06 | [diff] [blame] | 130 | else: |
| 131 | GIT_REVISION = "Unknown" |
| 132 | |
| 133 | if not ISRELEASED: |
Ã…smund Hjulstad | e15f292 | 2015-02-10 17:07:55 | [diff] [blame] | 134 | FULLVERSION += '.dev0+' + GIT_REVISION[:7] |
Ralf Gommers | 87e12c1 | 2011-03-24 15:30:06 | [diff] [blame] | 135 | |
Ralf Gommers | 17716d7 | 2013-12-06 19:45:40 | [diff] [blame] | 136 | return FULLVERSION, GIT_REVISION |
| 137 | |
| 138 | |
| 139 | def write_version_py(filename='numpy/version.py'): |
| 140 | cnt = """ |
| 141 | # THIS FILE IS GENERATED FROM NUMPY SETUP.PY |
Ralf Gommers | 105a498 | 2015-12-29 20:58:36 | [diff] [blame] | 142 | # |
| 143 | # To compare versions robustly, use `numpy.lib.NumpyVersion` |
Ralf Gommers | 17716d7 | 2013-12-06 19:45:40 | [diff] [blame] | 144 | short_version = '%(version)s' |
| 145 | version = '%(version)s' |
| 146 | full_version = '%(full_version)s' |
| 147 | git_revision = '%(git_revision)s' |
| 148 | release = %(isrelease)s |
| 149 | |
| 150 | if not release: |
| 151 | version = full_version |
| 152 | """ |
| 153 | FULLVERSION, GIT_REVISION = get_version_info() |
| 154 | |
David Cournapeau | a2ac985 | 2009-03-27 11:15:36 | [diff] [blame] | 155 | a = open(filename, 'w') |
| 156 | try: |
Scott Sinclair | 58e6360 | 2010-11-09 15:09:15 | [diff] [blame] | 157 | a.write(cnt % {'version': VERSION, |
Charles Harris | 054d93a | 2017-11-29 18:53:21 | [diff] [blame] | 158 | 'full_version': FULLVERSION, |
| 159 | 'git_revision': GIT_REVISION, |
Scott Sinclair | 58e6360 | 2010-11-09 15:09:15 | [diff] [blame] | 160 | 'isrelease': str(ISRELEASED)}) |
David Cournapeau | a2ac985 | 2009-03-27 11:15:36 | [diff] [blame] | 161 | finally: |
| 162 | a.close() |
| 163 | |
Ralf Gommers | 17716d7 | 2013-12-06 19:45:40 | [diff] [blame] | 164 | |
Hugo van Kemenade | 595af82 | 2020-10-04 09:41:47 | [diff] [blame] | 165 | def configuration(parent_package='', top_path=None): |
Pearu Peterson | 471196b | 2006-03-31 08:59:36 | [diff] [blame] | 166 | from numpy.distutils.misc_util import Configuration |
| 167 | |
Pearu Peterson | 17d7cfe | 2006-04-04 12:26:14 | [diff] [blame] | 168 | config = Configuration(None, parent_package, top_path) |
Pearu Peterson | 471196b | 2006-03-31 08:59:36 | [diff] [blame] | 169 | config.set_options(ignore_setup_xxx_py=True, |
| 170 | assume_default_configuration=True, |
| 171 | delegate_options_to_subpackages=True, |
| 172 | quiet=True) |
Jarrod Millman | 0b77f0e | 2007-10-29 14:58:18 | [diff] [blame] | 173 | |
Pearu Peterson | 471196b | 2006-03-31 08:59:36 | [diff] [blame] | 174 | config.add_subpackage('numpy') |
Charles Harris | 054d93a | 2017-11-29 18:53:21 | [diff] [blame] | 175 | config.add_data_files(('numpy', 'LICENSE.txt')) |
scoder | f4c6fb1 | 2020-08-05 04:28:30 | [diff] [blame] | 176 | config.add_data_files(('numpy', 'numpy/*.pxd')) |
Jarrod Millman | 0b77f0e | 2007-10-29 14:58:18 | [diff] [blame] | 177 | |
Hugo van Kemenade | 595af82 | 2020-10-04 09:41:47 | [diff] [blame] | 178 | config.get_version('numpy/version.py') # sets config.version |
Travis Oliphant | 00a3587 | 2007-05-31 04:57:01 | [diff] [blame] | 179 | |
Pearu Peterson | 471196b | 2006-03-31 08:59:36 | [diff] [blame] | 180 | return config |
| 181 | |
Ralf Gommers | 4b0ed79 | 2015-12-29 10:29:38 | [diff] [blame] | 182 | |
Julian Taylor | 4cd7274 | 2014-01-29 21:59:19 | [diff] [blame] | 183 | def check_submodules(): |
| 184 | """ verify that the submodules are checked out and clean |
| 185 | use `git submodule update --init`; on failure |
| 186 | """ |
| 187 | if not os.path.exists('.git'): |
| 188 | return |
| 189 | with open('.gitmodules') as f: |
Hugo van Kemenade | 595af82 | 2020-10-04 09:41:47 | [diff] [blame] | 190 | for line in f: |
| 191 | if 'path' in line: |
| 192 | p = line.split('=')[-1].strip() |
Julian Taylor | 4cd7274 | 2014-01-29 21:59:19 | [diff] [blame] | 193 | if not os.path.exists(p): |
Wojciech Rzadkowski | c3c4ec9 | 2020-05-22 15:43:08 | [diff] [blame] | 194 | raise ValueError('Submodule {} missing'.format(p)) |
Julian Taylor | 4cd7274 | 2014-01-29 21:59:19 | [diff] [blame] | 195 | |
Julian Taylor | 4cd7274 | 2014-01-29 21:59:19 | [diff] [blame] | 196 | proc = subprocess.Popen(['git', 'submodule', 'status'], |
| 197 | stdout=subprocess.PIPE) |
| 198 | status, _ = proc.communicate() |
| 199 | status = status.decode("ascii", "replace") |
| 200 | for line in status.splitlines(): |
| 201 | if line.startswith('-') or line.startswith('+'): |
Wojciech Rzadkowski | c3c4ec9 | 2020-05-22 15:43:08 | [diff] [blame] | 202 | raise ValueError('Submodule not clean: {}'.format(line)) |
Charles Harris | 13661ac | 2020-07-21 17:57:15 | [diff] [blame] | 203 | |
Julian Taylor | 4cd7274 | 2014-01-29 21:59:19 | [diff] [blame] | 204 | |
Ralf Gommers | 4b0ed79 | 2015-12-29 10:29:38 | [diff] [blame] | 205 | |
Ralf Gommers | a08fb60 | 2019-05-03 14:44:23 | [diff] [blame] | 206 | class concat_license_files(): |
Ralf Gommers | 3341590 | 2019-05-07 09:00:50 | [diff] [blame] | 207 | """Merge LICENSE.txt and LICENSES_bundled.txt for sdist creation |
Ralf Gommers | a08fb60 | 2019-05-03 14:44:23 | [diff] [blame] | 208 | |
| 209 | Done this way to keep LICENSE.txt in repo as exact BSD 3-clause (see |
| 210 | gh-13447). This makes GitHub state correctly how NumPy is licensed. |
| 211 | """ |
| 212 | def __init__(self): |
| 213 | self.f1 = 'LICENSE.txt' |
Ralf Gommers | 3341590 | 2019-05-07 09:00:50 | [diff] [blame] | 214 | self.f2 = 'LICENSES_bundled.txt' |
Ralf Gommers | a08fb60 | 2019-05-03 14:44:23 | [diff] [blame] | 215 | |
| 216 | def __enter__(self): |
Ralf Gommers | 3341590 | 2019-05-07 09:00:50 | [diff] [blame] | 217 | """Concatenate files and remove LICENSES_bundled.txt""" |
Ralf Gommers | a08fb60 | 2019-05-03 14:44:23 | [diff] [blame] | 218 | with open(self.f1, 'r') as f1: |
| 219 | self.bsd_text = f1.read() |
| 220 | |
| 221 | with open(self.f1, 'a') as f1: |
| 222 | with open(self.f2, 'r') as f2: |
| 223 | self.bundled_text = f2.read() |
| 224 | f1.write('\n\n') |
| 225 | f1.write(self.bundled_text) |
| 226 | |
Ralf Gommers | a08fb60 | 2019-05-03 14:44:23 | [diff] [blame] | 227 | def __exit__(self, exception_type, exception_value, traceback): |
| 228 | """Restore content of both files""" |
| 229 | with open(self.f1, 'w') as f: |
| 230 | f.write(self.bsd_text) |
| 231 | |
Ralf Gommers | a08fb60 | 2019-05-03 14:44:23 | [diff] [blame] | 232 | |
Ralf Gommers | 6770f98 | 2016-01-27 20:34:28 | [diff] [blame] | 233 | from distutils.command.sdist import sdist |
Julian Taylor | 4cd7274 | 2014-01-29 21:59:19 | [diff] [blame] | 234 | class sdist_checked(sdist): |
| 235 | """ check submodules on sdist to prevent incomplete tarballs """ |
| 236 | def run(self): |
| 237 | check_submodules() |
Ralf Gommers | a08fb60 | 2019-05-03 14:44:23 | [diff] [blame] | 238 | with concat_license_files(): |
| 239 | sdist.run(self) |
Travis Oliphant | 14db419 | 2005-09-14 22:08:46 | [diff] [blame] | 240 | |
Ralf Gommers | 4b0ed79 | 2015-12-29 10:29:38 | [diff] [blame] | 241 | |
mattip | 18af8e0 | 2020-01-04 20:47:47 | [diff] [blame] | 242 | def get_build_overrides(): |
| 243 | """ |
mattip | c2f9300 | 2020-01-05 15:00:30 | [diff] [blame] | 244 | Custom build commands to add `-std=c99` to compilation |
mattip | 18af8e0 | 2020-01-04 20:47:47 | [diff] [blame] | 245 | """ |
| 246 | from numpy.distutils.command.build_clib import build_clib |
| 247 | from numpy.distutils.command.build_ext import build_ext |
| 248 | |
| 249 | def _is_using_gcc(obj): |
| 250 | is_gcc = False |
| 251 | if obj.compiler.compiler_type == 'unix': |
| 252 | cc = sysconfig.get_config_var("CC") |
| 253 | if not cc: |
| 254 | cc = "" |
| 255 | compiler_name = os.path.basename(cc) |
| 256 | is_gcc = "gcc" in compiler_name |
| 257 | return is_gcc |
| 258 | |
| 259 | class new_build_clib(build_clib): |
| 260 | def build_a_library(self, build_info, lib_name, libraries): |
| 261 | if _is_using_gcc(self): |
| 262 | args = build_info.get('extra_compiler_args') or [] |
mattip | c2f9300 | 2020-01-05 15:00:30 | [diff] [blame] | 263 | args.append('-std=c99') |
mattip | 18af8e0 | 2020-01-04 20:47:47 | [diff] [blame] | 264 | build_info['extra_compiler_args'] = args |
| 265 | build_clib.build_a_library(self, build_info, lib_name, libraries) |
| 266 | |
| 267 | class new_build_ext(build_ext): |
| 268 | def build_extension(self, ext): |
| 269 | if _is_using_gcc(self): |
mattip | c2f9300 | 2020-01-05 15:00:30 | [diff] [blame] | 270 | if '-std=c99' not in ext.extra_compile_args: |
| 271 | ext.extra_compile_args.append('-std=c99') |
mattip | 18af8e0 | 2020-01-04 20:47:47 | [diff] [blame] | 272 | build_ext.build_extension(self, ext) |
| 273 | return new_build_clib, new_build_ext |
| 274 | |
| 275 | |
Julian Taylor | c9fd634 | 2014-04-05 11:13:13 | [diff] [blame] | 276 | def generate_cython(): |
| 277 | cwd = os.path.abspath(os.path.dirname(__file__)) |
| 278 | print("Cythonizing sources") |
mattip | 4e6a812 | 2019-05-23 04:54:47 | [diff] [blame] | 279 | for d in ('random',): |
mattip | fa8af41 | 2019-03-20 10:39:53 | [diff] [blame] | 280 | p = subprocess.call([sys.executable, |
Hugo van Kemenade | 595af82 | 2020-10-04 09:41:47 | [diff] [blame] | 281 | os.path.join(cwd, 'tools', 'cythonize.py'), |
| 282 | 'numpy/{0}'.format(d)], |
| 283 | cwd=cwd) |
mattip | fa8af41 | 2019-03-20 10:39:53 | [diff] [blame] | 284 | if p != 0: |
| 285 | raise RuntimeError("Running cythonize failed!") |
Julian Taylor | c9fd634 | 2014-04-05 11:13:13 | [diff] [blame] | 286 | |
Ralf Gommers | 4b0ed79 | 2015-12-29 10:29:38 | [diff] [blame] | 287 | |
Ralf Gommers | b9f4809 | 2015-12-29 11:05:30 | [diff] [blame] | 288 | def parse_setuppy_commands(): |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 289 | """Check the commands and respond appropriately. Disable broken commands. |
| 290 | |
| 291 | Return a boolean value for whether or not to run the build or not (avoid |
| 292 | parsing Cython and template files if False). |
| 293 | """ |
Eric Wieser | b8b2a0e | 2018-03-12 08:29:52 | [diff] [blame] | 294 | args = sys.argv[1:] |
| 295 | |
| 296 | if not args: |
Ralf Gommers | b9f4809 | 2015-12-29 11:05:30 | [diff] [blame] | 297 | # User forgot to give an argument probably, let setuptools handle that. |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 298 | return True |
Ralf Gommers | b9f4809 | 2015-12-29 11:05:30 | [diff] [blame] | 299 | |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 300 | info_commands = ['--help-commands', '--name', '--version', '-V', |
| 301 | '--fullname', '--author', '--author-email', |
| 302 | '--maintainer', '--maintainer-email', '--contact', |
| 303 | '--contact-email', '--url', '--license', '--description', |
| 304 | '--long-description', '--platforms', '--classifiers', |
| 305 | '--keywords', '--provides', '--requires', '--obsoletes'] |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 306 | |
| 307 | for command in info_commands: |
Eric Wieser | b8b2a0e | 2018-03-12 08:29:52 | [diff] [blame] | 308 | if command in args: |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 309 | return False |
| 310 | |
| 311 | # Note that 'alias', 'saveopts' and 'setopt' commands also seem to work |
| 312 | # fine as they are, but are usually used together with one of the commands |
| 313 | # below and not standalone. Hence they're not added to good_commands. |
| 314 | good_commands = ('develop', 'sdist', 'build', 'build_ext', 'build_py', |
Ralf Gommers | ab5c6d0 | 2016-01-16 14:21:23 | [diff] [blame] | 315 | 'build_clib', 'build_scripts', 'bdist_wheel', 'bdist_rpm', |
mattip | 2e4af96 | 2019-09-19 20:47:29 | [diff] [blame] | 316 | 'bdist_wininst', 'bdist_msi', 'bdist_mpkg', 'build_src') |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 317 | |
Ralf Gommers | b9f4809 | 2015-12-29 11:05:30 | [diff] [blame] | 318 | for command in good_commands: |
Eric Wieser | b8b2a0e | 2018-03-12 08:29:52 | [diff] [blame] | 319 | if command in args: |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 320 | return True |
Ralf Gommers | b9f4809 | 2015-12-29 11:05:30 | [diff] [blame] | 321 | |
Ralf Gommers | ab5c6d0 | 2016-01-16 14:21:23 | [diff] [blame] | 322 | # The following commands are supported, but we need to show more |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 323 | # useful messages to the user |
Eric Wieser | b8b2a0e | 2018-03-12 08:29:52 | [diff] [blame] | 324 | if 'install' in args: |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 325 | print(textwrap.dedent(""" |
| 326 | Note: if you need reliable uninstall behavior, then install |
| 327 | with pip instead of using `setup.py install`: |
| 328 | |
| 329 | - `pip install .` (from a git repo or downloaded source |
| 330 | release) |
Pierre de Buyl | 3f6672a | 2016-09-06 12:54:08 | [diff] [blame] | 331 | - `pip install numpy` (last NumPy release on PyPi) |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 332 | |
| 333 | """)) |
| 334 | return True |
| 335 | |
Eric Wieser | b8b2a0e | 2018-03-12 08:29:52 | [diff] [blame] | 336 | if '--help' in args or '-h' in sys.argv[1]: |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 337 | print(textwrap.dedent(""" |
Pierre de Buyl | 3f6672a | 2016-09-06 12:54:08 | [diff] [blame] | 338 | NumPy-specific help |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 339 | ------------------- |
| 340 | |
Pierre de Buyl | 3f6672a | 2016-09-06 12:54:08 | [diff] [blame] | 341 | To install NumPy from here with reliable uninstall, we recommend |
| 342 | that you use `pip install .`. To install the latest NumPy release |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 343 | from PyPi, use `pip install numpy`. |
| 344 | |
| 345 | For help with build/installation issues, please ask on the |
| 346 | numpy-discussion mailing list. If you are sure that you have run |
| 347 | into a bug, please report it at https://github.com/numpy/numpy/issues. |
| 348 | |
| 349 | Setuptools commands help |
| 350 | ------------------------ |
| 351 | """)) |
| 352 | return False |
| 353 | |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 354 | # The following commands aren't supported. They can only be executed when |
| 355 | # the user explicitly adds a --force command-line argument. |
Ralf Gommers | b9f4809 | 2015-12-29 11:05:30 | [diff] [blame] | 356 | bad_commands = dict( |
| 357 | test=""" |
| 358 | `setup.py test` is not supported. Use one of the following |
| 359 | instead: |
| 360 | |
| 361 | - `python runtests.py` (to build and test) |
| 362 | - `python runtests.py --no-build` (to test installed numpy) |
| 363 | - `>>> numpy.test()` (run tests for installed numpy |
| 364 | from within an interpreter) |
| 365 | """, |
| 366 | upload=""" |
| 367 | `setup.py upload` is not supported, because it's insecure. |
| 368 | Instead, build what you want to upload and upload those files |
| 369 | with `twine upload -s <filenames>` instead. |
| 370 | """, |
| 371 | upload_docs="`setup.py upload_docs` is not supported", |
| 372 | easy_install="`setup.py easy_install` is not supported", |
| 373 | clean=""" |
| 374 | `setup.py clean` is not supported, use one of the following instead: |
| 375 | |
| 376 | - `git clean -xdf` (cleans all files) |
| 377 | - `git clean -Xdf` (cleans all versioned files, doesn't touch |
| 378 | files that aren't checked into the git repo) |
| 379 | """, |
| 380 | check="`setup.py check` is not supported", |
| 381 | register="`setup.py register` is not supported", |
| 382 | bdist_dumb="`setup.py bdist_dumb` is not supported", |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 383 | bdist="`setup.py bdist` is not supported", |
| 384 | build_sphinx=""" |
| 385 | `setup.py build_sphinx` is not supported, use the |
| 386 | Makefile under doc/""", |
| 387 | flake8="`setup.py flake8` is not supported, use flake8 standalone", |
Ralf Gommers | b9f4809 | 2015-12-29 11:05:30 | [diff] [blame] | 388 | ) |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 389 | bad_commands['nosetests'] = bad_commands['test'] |
Luca Mussi | 69d2cc8 | 2016-04-07 11:24:49 | [diff] [blame] | 390 | for command in ('upload_docs', 'easy_install', 'bdist', 'bdist_dumb', |
Hugo van Kemenade | 595af82 | 2020-10-04 09:41:47 | [diff] [blame] | 391 | 'register', 'check', 'install_data', 'install_headers', |
| 392 | 'install_lib', 'install_scripts', ): |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 393 | bad_commands[command] = "`setup.py %s` is not supported" % command |
| 394 | |
Ralf Gommers | b9f4809 | 2015-12-29 11:05:30 | [diff] [blame] | 395 | for command in bad_commands.keys(): |
Eric Wieser | b8b2a0e | 2018-03-12 08:29:52 | [diff] [blame] | 396 | if command in args: |
Ralf Gommers | b9f4809 | 2015-12-29 11:05:30 | [diff] [blame] | 397 | print(textwrap.dedent(bad_commands[command]) + |
| 398 | "\nAdd `--force` to your command to use it anyway if you " |
| 399 | "must (unsupported).\n") |
| 400 | sys.exit(1) |
| 401 | |
Eric Wieser | b8b2a0e | 2018-03-12 08:29:52 | [diff] [blame] | 402 | # Commands that do more than print info, but also don't need Cython and |
| 403 | # template parsing. |
| 404 | other_commands = ['egg_info', 'install_egg_info', 'rotate'] |
| 405 | for command in other_commands: |
| 406 | if command in args: |
| 407 | return False |
| 408 | |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 409 | # If we got here, we didn't detect what setup.py command was given |
| 410 | import warnings |
| 411 | warnings.warn("Unrecognized setuptools command, proceeding with " |
Hugo van Kemenade | 595af82 | 2020-10-04 09:41:47 | [diff] [blame] | 412 | "generating Cython sources and expanding templates", |
| 413 | stacklevel=2) |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 414 | return True |
Ralf Gommers | b9f4809 | 2015-12-29 11:05:30 | [diff] [blame] | 415 | |
| 416 | |
Eric Wieser | be0d7ab | 2020-06-20 16:28:51 | [diff] [blame] | 417 | def get_docs_url(): |
| 418 | if not ISRELEASED: |
| 419 | return "https://numpy.org/devdocs" |
| 420 | else: |
| 421 | # For releaeses, this URL ends up on pypi. |
| 422 | # By pinning the version, users looking at old PyPI releases can get |
| 423 | # to the associated docs easily. |
| 424 | return "https://numpy.org/doc/{}.{}".format(MAJOR, MINOR) |
| 425 | |
| 426 | |
Ralf Gommers | 17716d7 | 2013-12-06 19:45:40 | [diff] [blame] | 427 | def setup_package(): |
mattip | 8b26655 | 2019-07-03 22:24:42 | [diff] [blame] | 428 | src_path = os.path.dirname(os.path.abspath(__file__)) |
Pauli Virtanen | 6815943 | 2009-12-06 11:56:18 | [diff] [blame] | 429 | old_path = os.getcwd() |
| 430 | os.chdir(src_path) |
| 431 | sys.path.insert(0, src_path) |
| 432 | |
Brian Wignall | b485da1 | 2020-01-14 12:27:33 | [diff] [blame] | 433 | # Rewrite the version file every time |
Pauli Virtanen | 0131218 | 2010-11-23 16:50:54 | [diff] [blame] | 434 | write_version_py() |
| 435 | |
Charles Harris | f22a33b | 2018-08-22 17:57:48 | [diff] [blame] | 436 | # The f2py scripts that will be installed |
| 437 | if sys.platform == 'win32': |
| 438 | f2py_cmds = [ |
| 439 | 'f2py = numpy.f2py.f2py2e:main', |
| 440 | ] |
| 441 | else: |
| 442 | f2py_cmds = [ |
| 443 | 'f2py = numpy.f2py.f2py2e:main', |
| 444 | 'f2py%s = numpy.f2py.f2py2e:main' % sys.version_info[:1], |
| 445 | 'f2py%s.%s = numpy.f2py.f2py2e:main' % sys.version_info[:2], |
| 446 | ] |
| 447 | |
Hugo van Kemenade | 595af82 | 2020-10-04 09:41:47 | [diff] [blame] | 448 | cmdclass = {"sdist": sdist_checked, } |
Ralf Gommers | 17716d7 | 2013-12-06 19:45:40 | [diff] [blame] | 449 | metadata = dict( |
Hugo van Kemenade | 595af82 | 2020-10-04 09:41:47 | [diff] [blame] | 450 | name='numpy', |
| 451 | maintainer="NumPy Developers", |
| 452 | maintainer_email="numpy-discussion@python.org", |
| 453 | description=DOCLINES[0], |
| 454 | long_description="\n".join(DOCLINES[2:]), |
| 455 | url="https://www.numpy.org", |
| 456 | author="Travis E. Oliphant et al.", |
| 457 | download_url="https://pypi.python.org/pypi/numpy", |
Jarrod Millman | 0486b6d | 2019-04-12 01:11:21 | [diff] [blame] | 458 | project_urls={ |
| 459 | "Bug Tracker": "https://github.com/numpy/numpy/issues", |
Eric Wieser | be0d7ab | 2020-06-20 16:28:51 | [diff] [blame] | 460 | "Documentation": get_docs_url(), |
Jarrod Millman | 0486b6d | 2019-04-12 01:11:21 | [diff] [blame] | 461 | "Source Code": "https://github.com/numpy/numpy", |
| 462 | }, |
Hugo van Kemenade | 595af82 | 2020-10-04 09:41:47 | [diff] [blame] | 463 | license='BSD', |
Ralf Gommers | 17716d7 | 2013-12-06 19:45:40 | [diff] [blame] | 464 | classifiers=[_f for _f in CLASSIFIERS.split('\n') if _f], |
Hugo van Kemenade | 595af82 | 2020-10-04 09:41:47 | [diff] [blame] | 465 | platforms=["Windows", "Linux", "Solaris", "Mac OS-X", "Unix"], |
Charles Harris | 67d29b1 | 2020-05-18 22:26:10 | [diff] [blame] | 466 | test_suite='pytest', |
mattip | 18af8e0 | 2020-01-04 20:47:47 | [diff] [blame] | 467 | cmdclass=cmdclass, |
Charles Harris | 67d29b1 | 2020-05-18 22:26:10 | [diff] [blame] | 468 | python_requires='>=3.6', |
Nathaniel J. Smith | f46e716 | 2018-01-23 08:02:04 | [diff] [blame] | 469 | zip_safe=False, |
Charles Harris | f22a33b | 2018-08-22 17:57:48 | [diff] [blame] | 470 | entry_points={ |
| 471 | 'console_scripts': f2py_cmds |
| 472 | }, |
Ralf Gommers | 17716d7 | 2013-12-06 19:45:40 | [diff] [blame] | 473 | ) |
| 474 | |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 475 | if "--force" in sys.argv: |
| 476 | run_build = True |
Ralf Gommers | 20c3c2a | 2017-06-20 10:09:40 | [diff] [blame] | 477 | sys.argv.remove('--force') |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 478 | else: |
| 479 | # Raise errors for unsupported commands, improve help output, etc. |
| 480 | run_build = parse_setuppy_commands() |
Ralf Gommers | b9f4809 | 2015-12-29 11:05:30 | [diff] [blame] | 481 | |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 482 | if run_build: |
Mike Taves | 07bf33f | 2020-02-04 19:21:51 | [diff] [blame] | 483 | # patches distutils, even though we don't use it |
| 484 | import setuptools # noqa: F401 |
Ralf Gommers | 17716d7 | 2013-12-06 19:45:40 | [diff] [blame] | 485 | from numpy.distutils.core import setup |
Hugo van Kemenade | 595af82 | 2020-10-04 09:41:47 | [diff] [blame] | 486 | if 'sdist' not in sys.argv: |
Ralf Gommers | d630d96 | 2019-09-08 05:01:41 | [diff] [blame] | 487 | # Generate Cython sources, unless we're generating an sdist |
Julian Taylor | c9fd634 | 2014-04-05 11:13:13 | [diff] [blame] | 488 | generate_cython() |
Ralf Gommers | 4b0ed79 | 2015-12-29 10:29:38 | [diff] [blame] | 489 | |
Ralf Gommers | 17716d7 | 2013-12-06 19:45:40 | [diff] [blame] | 490 | metadata['configuration'] = configuration |
mattip | 18af8e0 | 2020-01-04 20:47:47 | [diff] [blame] | 491 | # Customize extension building |
| 492 | cmdclass['build_clib'], cmdclass['build_ext'] = get_build_overrides() |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 493 | else: |
Mike Taves | 07bf33f | 2020-02-04 19:21:51 | [diff] [blame] | 494 | from setuptools import setup |
Ralf Gommers | 99e99e9 | 2015-12-29 14:24:22 | [diff] [blame] | 495 | # Version number is added to metadata inside configuration() if build |
| 496 | # is run. |
| 497 | metadata['version'] = get_version_info()[0] |
Pauli Virtanen | 6815943 | 2009-12-06 11:56:18 | [diff] [blame] | 498 | |
Pearu Peterson | e8fa013 | 2003-03-07 18:08:28 | [diff] [blame] | 499 | try: |
Ralf Gommers | 17716d7 | 2013-12-06 19:45:40 | [diff] [blame] | 500 | setup(**metadata) |
Pearu Peterson | e8fa013 | 2003-03-07 18:08:28 | [diff] [blame] | 501 | finally: |
| 502 | del sys.path[0] |
| 503 | os.chdir(old_path) |
Travis Oliphant | 14db419 | 2005-09-14 22:08:46 | [diff] [blame] | 504 | return |
Pearu Peterson | c415fd1 | 2002-11-18 22:39:31 | [diff] [blame] | 505 | |
Ralf Gommers | 17716d7 | 2013-12-06 19:45:40 | [diff] [blame] | 506 | |
Travis Oliphant | 14db419 | 2005-09-14 22:08:46 | [diff] [blame] | 507 | if __name__ == '__main__': |
Pearu Peterson | e8fa013 | 2003-03-07 18:08:28 | [diff] [blame] | 508 | setup_package() |
Ralf Gommers | bbee747 | 2016-08-21 05:23:35 | [diff] [blame] | 509 | # This may avoid problems where numpy is installed via ``*_requires`` by |
| 510 | # setuptools, the global namespace isn't reset properly, and then numpy is |
| 511 | # imported later (which will then fail to load numpy extension modules). |
| 512 | # See gh-7956 for details |
| 513 | del builtins.__NUMPY_SETUP__ |