| #!/usr/bin/env python |
| """NumPy: array processing for numbers, strings, records, and objects. |
| |
| NumPy is a general-purpose array-processing package designed to |
| efficiently manipulate large multi-dimensional arrays of arbitrary |
| records without sacrificing too much speed for small multi-dimensional |
| arrays. NumPy is built on the Numeric code base and adds features |
| introduced by numarray as well as an extended C-API and the ability to |
| create arrays of arbitrary type which also makes NumPy suitable for |
| interfacing with general-purpose data-base applications. |
| |
| There are also basic facilities for discrete fourier transform, |
| basic linear algebra and random number generation. |
| """ |
| |
| DOCLINES = __doc__.split("\n") |
| |
| import os |
| import shutil |
| import sys |
| import re |
| import subprocess |
| |
| if sys.version_info[0] < 3: |
| import __builtin__ as builtins |
| else: |
| import builtins |
| |
| CLASSIFIERS = """\ |
| Development Status :: 5 - Production/Stable |
| Intended Audience :: Science/Research |
| Intended Audience :: Developers |
| License :: OSI Approved |
| Programming Language :: C |
| Programming Language :: Python |
| Programming Language :: Python :: 3 |
| Topic :: Software Development |
| Topic :: Scientific/Engineering |
| Operating System :: Microsoft :: Windows |
| Operating System :: POSIX |
| Operating System :: Unix |
| Operating System :: MacOS |
| """ |
| |
| NAME = 'numpy' |
| MAINTAINER = "NumPy Developers" |
| MAINTAINER_EMAIL = "numpy-discussion@scipy.org" |
| DESCRIPTION = DOCLINES[0] |
| LONG_DESCRIPTION = "\n".join(DOCLINES[2:]) |
| URL = "http://www.numpy.org" |
| DOWNLOAD_URL = "http://sourceforge.net/projects/numpy/files/NumPy/" |
| LICENSE = 'BSD' |
| CLASSIFIERS = filter(None, CLASSIFIERS.split('\n')) |
| AUTHOR = "Travis E. Oliphant et al." |
| AUTHOR_EMAIL = "numpy-discussion@scipy.org" |
| PLATFORMS = ["Windows", "Linux", "Solaris", "Mac OS-X", "Unix"] |
| MAJOR = 1 |
| MINOR = 7 |
| MICRO = 1 |
| ISRELEASED = True |
| VERSION = '%d.%d.%d' % (MAJOR, MINOR, MICRO) |
| |
| # Return the git revision as a string |
| def git_version(): |
| def _minimal_ext_cmd(cmd): |
| # construct minimal environment |
| env = {} |
| for k in ['SYSTEMROOT', 'PATH']: |
| v = os.environ.get(k) |
| if v is not None: |
| env[k] = v |
| # LANGUAGE is used on win32 |
| env['LANGUAGE'] = 'C' |
| env['LANG'] = 'C' |
| env['LC_ALL'] = 'C' |
| out = subprocess.Popen(cmd, stdout = subprocess.PIPE, env=env).communicate()[0] |
| return out |
| |
| try: |
| out = _minimal_ext_cmd(['git', 'rev-parse', 'HEAD']) |
| GIT_REVISION = out.strip().decode('ascii') |
| except OSError: |
| GIT_REVISION = "Unknown" |
| |
| return GIT_REVISION |
| |
| # BEFORE importing distutils, remove MANIFEST. distutils doesn't properly |
| # update it when the contents of directories change. |
| if os.path.exists('MANIFEST'): os.remove('MANIFEST') |
| |
| # This is a bit hackish: we are setting a global variable so that the main |
| # numpy __init__ can detect if it is being loaded by the setup routine, to |
| # avoid attempting to load components that aren't built yet. While ugly, it's |
| # a lot more robust than what was previously being used. |
| builtins.__NUMPY_SETUP__ = True |
| |
| |
| def write_version_py(filename='numpy/version.py'): |
| cnt = """ |
| # THIS FILE IS GENERATED FROM NUMPY SETUP.PY |
| short_version = '%(version)s' |
| version = '%(version)s' |
| full_version = '%(full_version)s' |
| git_revision = '%(git_revision)s' |
| release = %(isrelease)s |
| |
| if not release: |
| version = full_version |
| """ |
| # Adding the git rev number needs to be done inside write_version_py(), |
| # otherwise the import of numpy.version messes up the build under Python 3. |
| FULLVERSION = VERSION |
| if os.path.exists('.git'): |
| GIT_REVISION = git_version() |
| elif os.path.exists('numpy/version.py'): |
| # must be a source distribution, use existing version file |
| try: |
| from numpy.version import git_revision as GIT_REVISION |
| except ImportError: |
| raise ImportError("Unable to import git_revision. Try removing " \ |
| "numpy/version.py and the build directory " \ |
| "before building.") |
| else: |
| GIT_REVISION = "Unknown" |
| |
| if not ISRELEASED: |
| FULLVERSION += '.dev-' + GIT_REVISION[:7] |
| |
| a = open(filename, 'w') |
| try: |
| a.write(cnt % {'version': VERSION, |
| 'full_version' : FULLVERSION, |
| 'git_revision' : GIT_REVISION, |
| 'isrelease': str(ISRELEASED)}) |
| finally: |
| a.close() |
| |
| def configuration(parent_package='',top_path=None): |
| from numpy.distutils.misc_util import Configuration |
| |
| config = Configuration(None, parent_package, top_path) |
| config.set_options(ignore_setup_xxx_py=True, |
| assume_default_configuration=True, |
| delegate_options_to_subpackages=True, |
| quiet=True) |
| |
| config.add_subpackage('numpy') |
| |
| config.get_version('numpy/version.py') # sets config.version |
| |
| return config |
| |
| def setup_package(): |
| |
| # Perform 2to3 if needed |
| local_path = os.path.dirname(os.path.abspath(sys.argv[0])) |
| src_path = local_path |
| |
| if sys.version_info[0] == 3: |
| src_path = os.path.join(local_path, 'build', 'py3k') |
| sys.path.insert(0, os.path.join(local_path, 'tools')) |
| import py3tool |
| print("Converting to Python3 via 2to3...") |
| py3tool.sync_2to3('numpy', os.path.join(src_path, 'numpy')) |
| |
| site_cfg = os.path.join(local_path, 'site.cfg') |
| if os.path.isfile(site_cfg): |
| shutil.copy(site_cfg, src_path) |
| |
| # Ugly hack to make pip work with Python 3, see #1857. |
| # Explanation: pip messes with __file__ which interacts badly with the |
| # change in directory due to the 2to3 conversion. Therefore we restore |
| # __file__ to what it would have been otherwise. |
| global __file__ |
| __file__ = os.path.join(os.curdir, os.path.basename(__file__)) |
| if '--egg-base' in sys.argv: |
| # Change pip-egg-info entry to absolute path, so pip can find it |
| # after changing directory. |
| idx = sys.argv.index('--egg-base') |
| if sys.argv[idx + 1] == 'pip-egg-info': |
| sys.argv[idx + 1] = os.path.join(local_path, 'pip-egg-info') |
| |
| old_path = os.getcwd() |
| os.chdir(src_path) |
| sys.path.insert(0, src_path) |
| |
| # Rewrite the version file everytime |
| write_version_py() |
| |
| # Run build |
| from numpy.distutils.core import setup |
| |
| try: |
| setup( |
| name=NAME, |
| maintainer=MAINTAINER, |
| maintainer_email=MAINTAINER_EMAIL, |
| description=DESCRIPTION, |
| long_description=LONG_DESCRIPTION, |
| url=URL, |
| download_url=DOWNLOAD_URL, |
| license=LICENSE, |
| classifiers=CLASSIFIERS, |
| author=AUTHOR, |
| author_email=AUTHOR_EMAIL, |
| platforms=PLATFORMS, |
| configuration=configuration ) |
| finally: |
| del sys.path[0] |
| os.chdir(old_path) |
| return |
| |
| if __name__ == '__main__': |
| setup_package() |