blob: 4beb581e7220a1669eebdb5bb918cadec67712e6 [file] [log] [blame]
Fernando Perez36d3c162006-07-12 06:02:281#!/usr/bin/env python
Travis Oliphantc8b5a7e2006-01-06 02:12:502"""NumPy: array processing for numbers, strings, records, and objects.
Travis Oliphantda9c6da2006-01-04 17:31:073
Travis Oliphantc8b5a7e2006-01-06 02:12:504NumPy is a general-purpose array-processing package designed to
Travis Oliphantda9c6da2006-01-04 17:31:075efficiently manipulate large multi-dimensional arrays of arbitrary
6records without sacrificing too much speed for small multi-dimensional
Travis Oliphantc8b5a7e2006-01-06 02:12:507arrays. NumPy is built on the Numeric code base and adds features
Travis Oliphantda9c6da2006-01-04 17:31:078introduced by numarray as well as an extended C-API and the ability to
Travis Oliphant00a35872007-05-31 04:57:019create arrays of arbitrary type which also makes NumPy suitable for
10interfacing with general-purpose data-base applications.
Travis Oliphantda9c6da2006-01-04 17:31:0711
12There are also basic facilities for discrete fourier transform,
13basic linear algebra and random number generation.
Charles Harris6aa264c2013-02-27 20:26:5814
Matthew Brettbe575d52016-03-07 20:52:0815All numpy wheels distributed from pypi are BSD licensed.
16
17Windows wheels are linked against the ATLAS BLAS / LAPACK library, restricted
18to SSE2 instructions, so may not give optimal linear algebra performance for
19your machine. See http://docs.scipy.org/doc/numpy/user/install.html for
20alternatives.
21
Travis Oliphantda9c6da2006-01-04 17:31:0722"""
Charles Harrisbb726ca2013-04-06 19:25:2623from __future__ import division, print_function
Travis Oliphantda9c6da2006-01-04 17:31:0724
David Sanders922442f2015-10-19 20:03:3425DOCLINES = (__doc__ or '').split("\n")
Pearu Petersonc415fd12002-11-18 22:39:3126
Pearu Petersone8fa0132003-03-07 18:08:2827import os
28import sys
David Cournapeau5623a7c2009-04-02 16:21:3029import subprocess
Ralf Gommers99e99e92015-12-29 14:24:2230import textwrap
Pearu Petersonc415fd12002-11-18 22:39:3131
Ralf Gommers17716d72013-12-06 19:45:4032
Joseph Fox-Rabinovitz21d2fb72016-04-12 05:34:3933if sys.version_info[:2] < (2, 7) or (3, 0) <= sys.version_info[:2] < (3, 4):
Charles Harris3ce03de2016-04-09 15:18:2234 raise RuntimeError("Python version 2.7 or >= 3.4 required.")
Charles Harris28eadc02013-07-11 18:08:4935
Charles Harris09a52ed2013-03-28 23:13:5336if sys.version_info[0] >= 3:
David Cournapeau2b517692009-12-03 15:53:2937 import builtins
Charles Harris09a52ed2013-03-28 23:13:5338else:
39 import __builtin__ as builtins
David Cournapeau2b517692009-12-03 15:53:2940
Ralf Gommers17716d72013-12-06 19:45:4041
Travis Oliphantda9c6da2006-01-04 17:31:0742CLASSIFIERS = """\
Robert Kern19da9712008-06-18 22:53:4443Development Status :: 5 - Production/Stable
Travis Oliphantda9c6da2006-01-04 17:31:0744Intended Audience :: Science/Research
45Intended Audience :: Developers
46License :: OSI Approved
47Programming Language :: C
48Programming Language :: Python
Alex Willmer193668a2015-08-05 09:29:3949Programming Language :: Python :: 2
Alex Willmer193668a2015-08-05 09:29:3950Programming Language :: Python :: 2.7
rgommerscdac1202011-01-25 14:02:4051Programming Language :: Python :: 3
Alex Willmer193668a2015-08-05 09:29:3952Programming Language :: Python :: 3.4
53Programming Language :: Python :: 3.5
Charles Harrisb33a5ee2016-11-05 19:48:3054Programming Language :: Python :: 3.6
Ralf Gommersa5e80372018-06-28 02:26:1955Programming Language :: Python :: 3.7
Alex Willmer193668a2015-08-05 09:29:3956Programming Language :: Python :: Implementation :: CPython
Travis Oliphantda9c6da2006-01-04 17:31:0757Topic :: Software Development
58Topic :: Scientific/Engineering
59Operating System :: Microsoft :: Windows
60Operating System :: POSIX
61Operating System :: Unix
62Operating System :: MacOS
63"""
64
Ralf Gommers58c1bf72012-11-05 19:47:2365MAJOR = 1
Charles Harris7978dd42017-12-11 23:26:3566MINOR = 15
David Cournapeau5e041cb2009-03-27 11:16:0167MICRO = 0
Charles Harrisccfbcc12018-07-23 12:56:3368ISRELEASED = True
Charles Harris9f5f1682018-07-09 20:46:1569VERSION = '%d.%d.%d' % (MAJOR, MINOR, MICRO)
Stefan van der Waltb9a22d72009-06-17 14:28:0370
Ralf Gommers17716d72013-12-06 19:45:4071
Scott Sinclair58e63602010-11-09 15:09:1572# Return the git revision as a string
73def git_version():
David Cournapeau44d92ec2009-06-01 05:43:1674 def _minimal_ext_cmd(cmd):
75 # construct minimal environment
76 env = {}
Robert Kernc0be9952017-03-09 00:38:5477 for k in ['SYSTEMROOT', 'PATH', 'HOME']:
David Cournapeau5032b522009-09-18 10:10:3978 v = os.environ.get(k)
79 if v is not None:
80 env[k] = v
David Cournapeau44d92ec2009-06-01 05:43:1681 # LANGUAGE is used on win32
82 env['LANGUAGE'] = 'C'
83 env['LANG'] = 'C'
84 env['LC_ALL'] = 'C'
Charles Harris054d93a2017-11-29 18:53:2185 out = subprocess.Popen(cmd, stdout=subprocess.PIPE, env=env).communicate()[0]
David Cournapeau44d92ec2009-06-01 05:43:1686 return out
87
David Cournapeau5623a7c2009-04-02 16:21:3088 try:
Scott Sinclair58e63602010-11-09 15:09:1589 out = _minimal_ext_cmd(['git', 'rev-parse', 'HEAD'])
Pauli Virtanend1a184c2010-11-15 01:00:0690 GIT_REVISION = out.strip().decode('ascii')
David Cournapeau5623a7c2009-04-02 16:21:3091 except OSError:
Scott Sinclaird5ed7442010-11-10 05:19:1592 GIT_REVISION = "Unknown"
David Cournapeau5e041cb2009-03-27 11:16:0193
Scott Sinclair58e63602010-11-09 15:09:1594 return GIT_REVISION
David Cournapeau5e041cb2009-03-27 11:16:0195
Ralf Gommers4b0ed792015-12-29 10:29:3896# BEFORE importing setuptools, remove MANIFEST. Otherwise it may not be
97# properly updated when the contents of directories change (true for distutils,
98# not sure about setuptools).
99if os.path.exists('MANIFEST'):
100 os.remove('MANIFEST')
David Cournapeau5bb1aa52009-03-27 16:39:01101
102# This is a bit hackish: we are setting a global variable so that the main
103# numpy __init__ can detect if it is being loaded by the setup routine, to
104# avoid attempting to load components that aren't built yet. While ugly, it's
105# a lot more robust than what was previously being used.
David Cournapeau2b517692009-12-03 15:53:29106builtins.__NUMPY_SETUP__ = True
David Cournapeau5bb1aa52009-03-27 16:39:01107
rgommers13212a52011-03-03 16:13:08108
Ralf Gommers17716d72013-12-06 19:45:40109def get_version_info():
Ralf Gommers87e12c12011-03-24 15:30:06110 # Adding the git rev number needs to be done inside write_version_py(),
111 # otherwise the import of numpy.version messes up the build under Python 3.
112 FULLVERSION = VERSION
113 if os.path.exists('.git'):
114 GIT_REVISION = git_version()
115 elif os.path.exists('numpy/version.py'):
116 # must be a source distribution, use existing version file
Ralf Gommerscd6d53f2011-04-17 14:04:11117 try:
118 from numpy.version import git_revision as GIT_REVISION
119 except ImportError:
120 raise ImportError("Unable to import git_revision. Try removing " \
121 "numpy/version.py and the build directory " \
122 "before building.")
Ralf Gommers87e12c12011-03-24 15:30:06123 else:
124 GIT_REVISION = "Unknown"
125
126 if not ISRELEASED:
Ã…smund Hjulstade15f2922015-02-10 17:07:55127 FULLVERSION += '.dev0+' + GIT_REVISION[:7]
Ralf Gommers87e12c12011-03-24 15:30:06128
Ralf Gommers17716d72013-12-06 19:45:40129 return FULLVERSION, GIT_REVISION
130
131
132def write_version_py(filename='numpy/version.py'):
133 cnt = """
134# THIS FILE IS GENERATED FROM NUMPY SETUP.PY
Ralf Gommers105a4982015-12-29 20:58:36135#
136# To compare versions robustly, use `numpy.lib.NumpyVersion`
Ralf Gommers17716d72013-12-06 19:45:40137short_version = '%(version)s'
138version = '%(version)s'
139full_version = '%(full_version)s'
140git_revision = '%(git_revision)s'
141release = %(isrelease)s
142
143if not release:
144 version = full_version
145"""
146 FULLVERSION, GIT_REVISION = get_version_info()
147
David Cournapeaua2ac9852009-03-27 11:15:36148 a = open(filename, 'w')
149 try:
Scott Sinclair58e63602010-11-09 15:09:15150 a.write(cnt % {'version': VERSION,
Charles Harris054d93a2017-11-29 18:53:21151 'full_version': FULLVERSION,
152 'git_revision': GIT_REVISION,
Scott Sinclair58e63602010-11-09 15:09:15153 'isrelease': str(ISRELEASED)})
David Cournapeaua2ac9852009-03-27 11:15:36154 finally:
155 a.close()
156
Ralf Gommers17716d72013-12-06 19:45:40157
Pearu Peterson471196b2006-03-31 08:59:36158def configuration(parent_package='',top_path=None):
159 from numpy.distutils.misc_util import Configuration
160
Pearu Peterson17d7cfe2006-04-04 12:26:14161 config = Configuration(None, parent_package, top_path)
Pearu Peterson471196b2006-03-31 08:59:36162 config.set_options(ignore_setup_xxx_py=True,
163 assume_default_configuration=True,
164 delegate_options_to_subpackages=True,
165 quiet=True)
Jarrod Millman0b77f0e2007-10-29 14:58:18166
Pearu Peterson471196b2006-03-31 08:59:36167 config.add_subpackage('numpy')
Charles Harris054d93a2017-11-29 18:53:21168 config.add_data_files(('numpy', 'LICENSE.txt'))
Jarrod Millman0b77f0e2007-10-29 14:58:18169
Pearu Peterson17d7cfe2006-04-04 12:26:14170 config.get_version('numpy/version.py') # sets config.version
Travis Oliphant00a35872007-05-31 04:57:01171
Pearu Peterson471196b2006-03-31 08:59:36172 return config
173
Ralf Gommers4b0ed792015-12-29 10:29:38174
Julian Taylor4cd72742014-01-29 21:59:19175def check_submodules():
176 """ verify that the submodules are checked out and clean
177 use `git submodule update --init`; on failure
178 """
179 if not os.path.exists('.git'):
180 return
181 with open('.gitmodules') as f:
182 for l in f:
183 if 'path' in l:
184 p = l.split('=')[-1].strip()
185 if not os.path.exists(p):
186 raise ValueError('Submodule %s missing' % p)
187
188
189 proc = subprocess.Popen(['git', 'submodule', 'status'],
190 stdout=subprocess.PIPE)
191 status, _ = proc.communicate()
192 status = status.decode("ascii", "replace")
193 for line in status.splitlines():
194 if line.startswith('-') or line.startswith('+'):
195 raise ValueError('Submodule not clean: %s' % line)
196
Ralf Gommers4b0ed792015-12-29 10:29:38197
Ralf Gommers6770f982016-01-27 20:34:28198from distutils.command.sdist import sdist
Julian Taylor4cd72742014-01-29 21:59:19199class sdist_checked(sdist):
200 """ check submodules on sdist to prevent incomplete tarballs """
201 def run(self):
202 check_submodules()
203 sdist.run(self)
Travis Oliphant14db4192005-09-14 22:08:46204
Ralf Gommers4b0ed792015-12-29 10:29:38205
Julian Taylorc9fd6342014-04-05 11:13:13206def generate_cython():
207 cwd = os.path.abspath(os.path.dirname(__file__))
208 print("Cythonizing sources")
209 p = subprocess.call([sys.executable,
210 os.path.join(cwd, 'tools', 'cythonize.py'),
211 'numpy/random'],
212 cwd=cwd)
213 if p != 0:
214 raise RuntimeError("Running cythonize failed!")
215
Ralf Gommers4b0ed792015-12-29 10:29:38216
Ralf Gommersb9f48092015-12-29 11:05:30217def parse_setuppy_commands():
Ralf Gommers99e99e92015-12-29 14:24:22218 """Check the commands and respond appropriately. Disable broken commands.
219
220 Return a boolean value for whether or not to run the build or not (avoid
221 parsing Cython and template files if False).
222 """
Eric Wieserb8b2a0e2018-03-12 08:29:52223 args = sys.argv[1:]
224
225 if not args:
Ralf Gommersb9f48092015-12-29 11:05:30226 # User forgot to give an argument probably, let setuptools handle that.
Ralf Gommers99e99e92015-12-29 14:24:22227 return True
Ralf Gommersb9f48092015-12-29 11:05:30228
Ralf Gommers99e99e92015-12-29 14:24:22229 info_commands = ['--help-commands', '--name', '--version', '-V',
230 '--fullname', '--author', '--author-email',
231 '--maintainer', '--maintainer-email', '--contact',
232 '--contact-email', '--url', '--license', '--description',
233 '--long-description', '--platforms', '--classifiers',
234 '--keywords', '--provides', '--requires', '--obsoletes']
Ralf Gommers99e99e92015-12-29 14:24:22235
236 for command in info_commands:
Eric Wieserb8b2a0e2018-03-12 08:29:52237 if command in args:
Ralf Gommers99e99e92015-12-29 14:24:22238 return False
239
240 # Note that 'alias', 'saveopts' and 'setopt' commands also seem to work
241 # fine as they are, but are usually used together with one of the commands
242 # below and not standalone. Hence they're not added to good_commands.
243 good_commands = ('develop', 'sdist', 'build', 'build_ext', 'build_py',
Ralf Gommersab5c6d02016-01-16 14:21:23244 'build_clib', 'build_scripts', 'bdist_wheel', 'bdist_rpm',
Ralf Gommersb9f48092015-12-29 11:05:30245 'bdist_wininst', 'bdist_msi', 'bdist_mpkg')
Ralf Gommers99e99e92015-12-29 14:24:22246
Ralf Gommersb9f48092015-12-29 11:05:30247 for command in good_commands:
Eric Wieserb8b2a0e2018-03-12 08:29:52248 if command in args:
Ralf Gommers99e99e92015-12-29 14:24:22249 return True
Ralf Gommersb9f48092015-12-29 11:05:30250
Ralf Gommersab5c6d02016-01-16 14:21:23251 # The following commands are supported, but we need to show more
Ralf Gommers99e99e92015-12-29 14:24:22252 # useful messages to the user
Eric Wieserb8b2a0e2018-03-12 08:29:52253 if 'install' in args:
Ralf Gommers99e99e92015-12-29 14:24:22254 print(textwrap.dedent("""
255 Note: if you need reliable uninstall behavior, then install
256 with pip instead of using `setup.py install`:
257
258 - `pip install .` (from a git repo or downloaded source
259 release)
Pierre de Buyl3f6672a2016-09-06 12:54:08260 - `pip install numpy` (last NumPy release on PyPi)
Ralf Gommers99e99e92015-12-29 14:24:22261
262 """))
263 return True
264
Eric Wieserb8b2a0e2018-03-12 08:29:52265 if '--help' in args or '-h' in sys.argv[1]:
Ralf Gommers99e99e92015-12-29 14:24:22266 print(textwrap.dedent("""
Pierre de Buyl3f6672a2016-09-06 12:54:08267 NumPy-specific help
Ralf Gommers99e99e92015-12-29 14:24:22268 -------------------
269
Pierre de Buyl3f6672a2016-09-06 12:54:08270 To install NumPy from here with reliable uninstall, we recommend
271 that you use `pip install .`. To install the latest NumPy release
Ralf Gommers99e99e92015-12-29 14:24:22272 from PyPi, use `pip install numpy`.
273
274 For help with build/installation issues, please ask on the
275 numpy-discussion mailing list. If you are sure that you have run
276 into a bug, please report it at https://github.com/numpy/numpy/issues.
277
278 Setuptools commands help
279 ------------------------
280 """))
281 return False
282
Eric Wieserb8b2a0e2018-03-12 08:29:52283
Ralf Gommers99e99e92015-12-29 14:24:22284 # The following commands aren't supported. They can only be executed when
285 # the user explicitly adds a --force command-line argument.
Ralf Gommersb9f48092015-12-29 11:05:30286 bad_commands = dict(
287 test="""
288 `setup.py test` is not supported. Use one of the following
289 instead:
290
291 - `python runtests.py` (to build and test)
292 - `python runtests.py --no-build` (to test installed numpy)
293 - `>>> numpy.test()` (run tests for installed numpy
294 from within an interpreter)
295 """,
296 upload="""
297 `setup.py upload` is not supported, because it's insecure.
298 Instead, build what you want to upload and upload those files
299 with `twine upload -s <filenames>` instead.
300 """,
301 upload_docs="`setup.py upload_docs` is not supported",
302 easy_install="`setup.py easy_install` is not supported",
303 clean="""
304 `setup.py clean` is not supported, use one of the following instead:
305
306 - `git clean -xdf` (cleans all files)
307 - `git clean -Xdf` (cleans all versioned files, doesn't touch
308 files that aren't checked into the git repo)
309 """,
310 check="`setup.py check` is not supported",
311 register="`setup.py register` is not supported",
312 bdist_dumb="`setup.py bdist_dumb` is not supported",
Ralf Gommers99e99e92015-12-29 14:24:22313 bdist="`setup.py bdist` is not supported",
314 build_sphinx="""
315 `setup.py build_sphinx` is not supported, use the
316 Makefile under doc/""",
317 flake8="`setup.py flake8` is not supported, use flake8 standalone",
Ralf Gommersb9f48092015-12-29 11:05:30318 )
Ralf Gommers99e99e92015-12-29 14:24:22319 bad_commands['nosetests'] = bad_commands['test']
Luca Mussi69d2cc82016-04-07 11:24:49320 for command in ('upload_docs', 'easy_install', 'bdist', 'bdist_dumb',
Ralf Gommers99e99e92015-12-29 14:24:22321 'register', 'check', 'install_data', 'install_headers',
322 'install_lib', 'install_scripts', ):
323 bad_commands[command] = "`setup.py %s` is not supported" % command
324
Ralf Gommersb9f48092015-12-29 11:05:30325 for command in bad_commands.keys():
Eric Wieserb8b2a0e2018-03-12 08:29:52326 if command in args:
Ralf Gommersb9f48092015-12-29 11:05:30327 print(textwrap.dedent(bad_commands[command]) +
328 "\nAdd `--force` to your command to use it anyway if you "
329 "must (unsupported).\n")
330 sys.exit(1)
331
Eric Wieserb8b2a0e2018-03-12 08:29:52332 # Commands that do more than print info, but also don't need Cython and
333 # template parsing.
334 other_commands = ['egg_info', 'install_egg_info', 'rotate']
335 for command in other_commands:
336 if command in args:
337 return False
338
Ralf Gommers99e99e92015-12-29 14:24:22339 # If we got here, we didn't detect what setup.py command was given
340 import warnings
341 warnings.warn("Unrecognized setuptools command, proceeding with "
Sebastian Berg7884a8c2016-01-23 14:58:58342 "generating Cython sources and expanding templates", stacklevel=2)
Ralf Gommers99e99e92015-12-29 14:24:22343 return True
Ralf Gommersb9f48092015-12-29 11:05:30344
345
Ralf Gommers17716d72013-12-06 19:45:40346def setup_package():
Charles Harrisb4180e32013-04-22 03:26:44347 src_path = os.path.dirname(os.path.abspath(sys.argv[0]))
Pauli Virtanen68159432009-12-06 11:56:18348 old_path = os.getcwd()
349 os.chdir(src_path)
350 sys.path.insert(0, src_path)
351
Pauli Virtanen01312182010-11-23 16:50:54352 # Rewrite the version file everytime
353 write_version_py()
354
Ralf Gommers17716d72013-12-06 19:45:40355 metadata = dict(
356 name = 'numpy',
357 maintainer = "NumPy Developers",
Ralf Gommers46f7dca2017-03-26 07:52:46358 maintainer_email = "numpy-discussion@python.org",
Ralf Gommers17716d72013-12-06 19:45:40359 description = DOCLINES[0],
360 long_description = "\n".join(DOCLINES[2:]),
361 url = "http://www.numpy.org",
362 author = "Travis E. Oliphant et al.",
Charles Harrisec5985d2018-01-10 18:00:11363 download_url = "https://pypi.python.org/pypi/numpy",
Ralf Gommers17716d72013-12-06 19:45:40364 license = 'BSD',
365 classifiers=[_f for _f in CLASSIFIERS.split('\n') if _f],
366 platforms = ["Windows", "Linux", "Solaris", "Mac OS-X", "Unix"],
367 test_suite='nose.collector',
Julian Taylor4cd72742014-01-29 21:59:19368 cmdclass={"sdist": sdist_checked},
Ralf Gommers343de6f2017-04-15 21:29:55369 python_requires='>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*',
Nathaniel J. Smithf46e7162018-01-23 08:02:04370 zip_safe=False,
xoviatbb7b1262018-01-30 23:25:12371 entry_points={
372 'console_scripts': [
373 'f2py = numpy.f2py.__main__:main',
374 'conv-template = numpy.distutils.conv_template:main',
xoviata2ad5f12018-02-14 23:50:57375 'from-template = numpy.distutils.from_template:main',
xoviatbb7b1262018-01-30 23:25:12376 ]
377 },
Ralf Gommers17716d72013-12-06 19:45:40378 )
379
Ralf Gommers99e99e92015-12-29 14:24:22380 if "--force" in sys.argv:
381 run_build = True
Ralf Gommers20c3c2a2017-06-20 10:09:40382 sys.argv.remove('--force')
Ralf Gommers99e99e92015-12-29 14:24:22383 else:
384 # Raise errors for unsupported commands, improve help output, etc.
385 run_build = parse_setuppy_commands()
Ralf Gommersb9f48092015-12-29 11:05:30386
387 from setuptools import setup
Ralf Gommers99e99e92015-12-29 14:24:22388 if run_build:
Ralf Gommers17716d72013-12-06 19:45:40389 from numpy.distutils.core import setup
Julian Taylorc9fd6342014-04-05 11:13:13390 cwd = os.path.abspath(os.path.dirname(__file__))
391 if not os.path.exists(os.path.join(cwd, 'PKG-INFO')):
392 # Generate Cython sources, unless building from source release
393 generate_cython()
Ralf Gommers4b0ed792015-12-29 10:29:38394
Ralf Gommers17716d72013-12-06 19:45:40395 metadata['configuration'] = configuration
Ralf Gommers99e99e92015-12-29 14:24:22396 else:
397 # Version number is added to metadata inside configuration() if build
398 # is run.
399 metadata['version'] = get_version_info()[0]
Pauli Virtanen68159432009-12-06 11:56:18400
Pearu Petersone8fa0132003-03-07 18:08:28401 try:
Ralf Gommers17716d72013-12-06 19:45:40402 setup(**metadata)
Pearu Petersone8fa0132003-03-07 18:08:28403 finally:
404 del sys.path[0]
405 os.chdir(old_path)
Travis Oliphant14db4192005-09-14 22:08:46406 return
Pearu Petersonc415fd12002-11-18 22:39:31407
Ralf Gommers17716d72013-12-06 19:45:40408
Travis Oliphant14db4192005-09-14 22:08:46409if __name__ == '__main__':
Pearu Petersone8fa0132003-03-07 18:08:28410 setup_package()
Ralf Gommersbbee7472016-08-21 05:23:35411 # This may avoid problems where numpy is installed via ``*_requires`` by
412 # setuptools, the global namespace isn't reset properly, and then numpy is
413 # imported later (which will then fail to load numpy extension modules).
414 # See gh-7956 for details
415 del builtins.__NUMPY_SETUP__