| Viewing file:  core.py (7.99 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
from __future__ import division, absolute_import, print_function
 import sys
 from distutils.core import *
 
 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 get_data_files, 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=[]):
 """ Return True if command line does not contain any
 help or display requests.
 """
 if _cache:
 return _cache[0]
 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))
 
 |