216 lines
8 KiB
Python
216 lines
8 KiB
Python
|
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))
|