123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- import sys
- from distutils.core import Distribution
- if 'setuptools' in sys.modules:
- have_setuptools = True
- from setuptools import setup as old_setup
- # easy_install imports math, it may be picked up from cwd
- from setuptools.command import easy_install
- try:
- # very old versions of setuptools don't have this
- from setuptools.command import bdist_egg
- except ImportError:
- have_setuptools = False
- else:
- from distutils.core import setup as old_setup
- have_setuptools = False
- import warnings
- import distutils.core
- import distutils.dist
- from numpy.distutils.extension import Extension # noqa: F401
- from numpy.distutils.numpy_distribution import NumpyDistribution
- from numpy.distutils.command import config, config_compiler, \
- build, build_py, build_ext, build_clib, build_src, build_scripts, \
- sdist, install_data, install_headers, install, bdist_rpm, \
- install_clib
- from numpy.distutils.misc_util import is_sequence, is_string
- numpy_cmdclass = {'build': build.build,
- 'build_src': build_src.build_src,
- 'build_scripts': build_scripts.build_scripts,
- 'config_cc': config_compiler.config_cc,
- 'config_fc': config_compiler.config_fc,
- 'config': config.config,
- 'build_ext': build_ext.build_ext,
- 'build_py': build_py.build_py,
- 'build_clib': build_clib.build_clib,
- 'sdist': sdist.sdist,
- 'install_data': install_data.install_data,
- 'install_headers': install_headers.install_headers,
- 'install_clib': install_clib.install_clib,
- 'install': install.install,
- 'bdist_rpm': bdist_rpm.bdist_rpm,
- }
- if have_setuptools:
- # Use our own versions of develop and egg_info to ensure that build_src is
- # handled appropriately.
- from numpy.distutils.command import develop, egg_info
- numpy_cmdclass['bdist_egg'] = bdist_egg.bdist_egg
- numpy_cmdclass['develop'] = develop.develop
- numpy_cmdclass['easy_install'] = easy_install.easy_install
- numpy_cmdclass['egg_info'] = egg_info.egg_info
- def _dict_append(d, **kws):
- for k, v in kws.items():
- if k not in d:
- d[k] = v
- continue
- dv = d[k]
- if isinstance(dv, tuple):
- d[k] = dv + tuple(v)
- elif isinstance(dv, list):
- d[k] = dv + list(v)
- elif isinstance(dv, dict):
- _dict_append(dv, **v)
- elif is_string(dv):
- d[k] = dv + v
- else:
- raise TypeError(repr(type(dv)))
- def _command_line_ok(_cache=None):
- """ Return True if command line does not contain any
- help or display requests.
- """
- if _cache:
- return _cache[0]
- elif _cache is None:
- _cache = []
- ok = True
- display_opts = ['--'+n for n in Distribution.display_option_names]
- for o in Distribution.display_options:
- if o[1]:
- display_opts.append('-'+o[1])
- for arg in sys.argv:
- if arg.startswith('--help') or arg=='-h' or arg in display_opts:
- ok = False
- break
- _cache.append(ok)
- return ok
- def get_distribution(always=False):
- dist = distutils.core._setup_distribution
- # XXX Hack to get numpy installable with easy_install.
- # The problem is easy_install runs it's own setup(), which
- # sets up distutils.core._setup_distribution. However,
- # when our setup() runs, that gets overwritten and lost.
- # We can't use isinstance, as the DistributionWithoutHelpCommands
- # class is local to a function in setuptools.command.easy_install
- if dist is not None and \
- 'DistributionWithoutHelpCommands' in repr(dist):
- dist = None
- if always and dist is None:
- dist = NumpyDistribution()
- return dist
- def setup(**attr):
- cmdclass = numpy_cmdclass.copy()
- new_attr = attr.copy()
- if 'cmdclass' in new_attr:
- cmdclass.update(new_attr['cmdclass'])
- new_attr['cmdclass'] = cmdclass
- if 'configuration' in new_attr:
- # To avoid calling configuration if there are any errors
- # or help request in command in the line.
- configuration = new_attr.pop('configuration')
- old_dist = distutils.core._setup_distribution
- old_stop = distutils.core._setup_stop_after
- distutils.core._setup_distribution = None
- distutils.core._setup_stop_after = "commandline"
- try:
- dist = setup(**new_attr)
- finally:
- distutils.core._setup_distribution = old_dist
- distutils.core._setup_stop_after = old_stop
- if dist.help or not _command_line_ok():
- # probably displayed help, skip running any commands
- return dist
- # create setup dictionary and append to new_attr
- config = configuration()
- if hasattr(config, 'todict'):
- config = config.todict()
- _dict_append(new_attr, **config)
- # Move extension source libraries to libraries
- libraries = []
- for ext in new_attr.get('ext_modules', []):
- new_libraries = []
- for item in ext.libraries:
- if is_sequence(item):
- lib_name, build_info = item
- _check_append_ext_library(libraries, lib_name, build_info)
- new_libraries.append(lib_name)
- elif is_string(item):
- new_libraries.append(item)
- else:
- raise TypeError("invalid description of extension module "
- "library %r" % (item,))
- ext.libraries = new_libraries
- if libraries:
- if 'libraries' not in new_attr:
- new_attr['libraries'] = []
- for item in libraries:
- _check_append_library(new_attr['libraries'], item)
- # sources in ext_modules or libraries may contain header files
- if ('ext_modules' in new_attr or 'libraries' in new_attr) \
- and 'headers' not in new_attr:
- new_attr['headers'] = []
- # Use our custom NumpyDistribution class instead of distutils' one
- new_attr['distclass'] = NumpyDistribution
- return old_setup(**new_attr)
- def _check_append_library(libraries, item):
- for libitem in libraries:
- if is_sequence(libitem):
- if is_sequence(item):
- if item[0]==libitem[0]:
- if item[1] is libitem[1]:
- return
- warnings.warn("[0] libraries list contains %r with"
- " different build_info" % (item[0],),
- stacklevel=2)
- break
- else:
- if item==libitem[0]:
- warnings.warn("[1] libraries list contains %r with"
- " no build_info" % (item[0],),
- stacklevel=2)
- break
- else:
- if is_sequence(item):
- if item[0]==libitem:
- warnings.warn("[2] libraries list contains %r with"
- " no build_info" % (item[0],),
- stacklevel=2)
- break
- else:
- if item==libitem:
- return
- libraries.append(item)
- def _check_append_ext_library(libraries, lib_name, build_info):
- for item in libraries:
- if is_sequence(item):
- if item[0]==lib_name:
- if item[1] is build_info:
- return
- warnings.warn("[3] libraries list contains %r with"
- " different build_info" % (lib_name,),
- stacklevel=2)
- break
- elif item==lib_name:
- warnings.warn("[4] libraries list contains %r with"
- " no build_info" % (lib_name,),
- stacklevel=2)
- break
- libraries.append((lib_name, build_info))
|