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