Spaces:
Running
Running
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 | |
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)) | |