[ Avaa Bypassed ]




Upload:

Command:

hmhc3928@3.17.78.182: ~ $
"""distutils.command.build_clib

Implements the Distutils 'build_clib' command, to build a C/C++ library
that is included in the module distribution and needed by an extension
module."""

__revision__ = "$Id$"


# XXX this module has *lots* of code ripped-off quite transparently from
# build_ext.py -- not surprisingly really, as the work required to build
# a static library from a collection of C source files is not really all
# that different from what's required to build a shared object file from
# a collection of C source files.  Nevertheless, I haven't done the
# necessary refactoring to account for the overlap in code between the
# two modules, mainly because a number of subtle details changed in the
# cut 'n paste.  Sigh.

import os
from distutils.core import Command
from distutils.errors import DistutilsSetupError
from distutils.sysconfig import customize_compiler
from distutils import log

def show_compilers():
    from distutils.ccompiler import show_compilers
    show_compilers()


class build_clib(Command):

    description = "build C/C++ libraries used by Python extensions"

    user_options = [
        ('build-clib=', 'b',
         "directory to build C/C++ libraries to"),
        ('build-temp=', 't',
         "directory to put temporary build by-products"),
        ('debug', 'g',
         "compile with debugging information"),
        ('force', 'f',
         "forcibly build everything (ignore file timestamps)"),
        ('compiler=', 'c',
         "specify the compiler type"),
        ]

    boolean_options = ['debug', 'force']

    help_options = [
        ('help-compiler', None,
         "list available compilers", show_compilers),
        ]

    def initialize_options(self):
        self.build_clib = None
        self.build_temp = None

        # List of libraries to build
        self.libraries = None

        # Compilation options for all libraries
        self.include_dirs = None
        self.define = None
        self.undef = None
        self.debug = None
        self.force = 0
        self.compiler = None


    def finalize_options(self):
        # This might be confusing: both build-clib and build-temp default
        # to build-temp as defined by the "build" command.  This is because
        # I think that C libraries are really just temporary build
        # by-products, at least from the point of view of building Python
        # extensions -- but I want to keep my options open.
        self.set_undefined_options('build',
                                   ('build_temp', 'build_clib'),
                                   ('build_temp', 'build_temp'),
                                   ('compiler', 'compiler'),
                                   ('debug', 'debug'),
                                   ('force', 'force'))

        self.libraries = self.distribution.libraries
        if self.libraries:
            self.check_library_list(self.libraries)

        if self.include_dirs is None:
            self.include_dirs = self.distribution.include_dirs or []
        if isinstance(self.include_dirs, str):
            self.include_dirs = self.include_dirs.split(os.pathsep)

        # XXX same as for build_ext -- what about 'self.define' and
        # 'self.undef' ?

    def run(self):
        if not self.libraries:
            return

        # Yech -- this is cut 'n pasted from build_ext.py!
        from distutils.ccompiler import new_compiler
        self.compiler = new_compiler(compiler=self.compiler,
                                     dry_run=self.dry_run,
                                     force=self.force)
        customize_compiler(self.compiler)

        if self.include_dirs is not None:
            self.compiler.set_include_dirs(self.include_dirs)
        if self.define is not None:
            # 'define' option is a list of (name,value) tuples
            for (name,value) in self.define:
                self.compiler.define_macro(name, value)
        if self.undef is not None:
            for macro in self.undef:
                self.compiler.undefine_macro(macro)

        self.build_libraries(self.libraries)


    def check_library_list(self, libraries):
        """Ensure that the list of libraries is valid.

        `library` is presumably provided as a command option 'libraries'.
        This method checks that it is a list of 2-tuples, where the tuples
        are (library_name, build_info_dict).

        Raise DistutilsSetupError if the structure is invalid anywhere;
        just returns otherwise.
        """
        if not isinstance(libraries, list):
            raise DistutilsSetupError, \
                  "'libraries' option must be a list of tuples"

        for lib in libraries:
            if not isinstance(lib, tuple) and len(lib) != 2:
                raise DistutilsSetupError, \
                      "each element of 'libraries' must a 2-tuple"

            name, build_info = lib

            if not isinstance(name, str):
                raise DistutilsSetupError, \
                      "first element of each tuple in 'libraries' " + \
                      "must be a string (the library name)"
            if '/' in name or (os.sep != '/' and os.sep in name):
                raise DistutilsSetupError, \
                      ("bad library name '%s': " +
                       "may not contain directory separators") % \
                      lib[0]

            if not isinstance(build_info, dict):
                raise DistutilsSetupError, \
                      "second element of each tuple in 'libraries' " + \
                      "must be a dictionary (build info)"

    def get_library_names(self):
        # Assume the library list is valid -- 'check_library_list()' is
        # called from 'finalize_options()', so it should be!
        if not self.libraries:
            return None

        lib_names = []
        for (lib_name, build_info) in self.libraries:
            lib_names.append(lib_name)
        return lib_names


    def get_source_files(self):
        self.check_library_list(self.libraries)
        filenames = []
        for (lib_name, build_info) in self.libraries:
            sources = build_info.get('sources')
            if sources is None or not isinstance(sources, (list, tuple)):
                raise DistutilsSetupError, \
                      ("in 'libraries' option (library '%s'), "
                       "'sources' must be present and must be "
                       "a list of source filenames") % lib_name

            filenames.extend(sources)
        return filenames

    def build_libraries(self, libraries):
        for (lib_name, build_info) in libraries:
            sources = build_info.get('sources')
            if sources is None or not isinstance(sources, (list, tuple)):
                raise DistutilsSetupError, \
                      ("in 'libraries' option (library '%s'), " +
                       "'sources' must be present and must be " +
                       "a list of source filenames") % lib_name
            sources = list(sources)

            log.info("building '%s' library", lib_name)

            # First, compile the source code to object files in the library
            # directory.  (This should probably change to putting object
            # files in a temporary build directory.)
            macros = build_info.get('macros')
            include_dirs = build_info.get('include_dirs')
            objects = self.compiler.compile(sources,
                                            output_dir=self.build_temp,
                                            macros=macros,
                                            include_dirs=include_dirs,
                                            debug=self.debug)

            # Now "link" the object files together into a static library.
            # (On Unix at least, this isn't really linking -- it just
            # builds an archive.  Whatever.)
            self.compiler.create_static_lib(objects, lib_name,
                                            output_dir=self.build_clib,
                                            debug=self.debug)

Filemanager

Name Type Size Permission Actions
.__init__.pyo.40009 File 665 B 0644
.bdist.pyo.40009 File 5.1 KB 0644
.bdist_dumb.pyo.40009 File 4.92 KB 0644
.build.pyo.40009 File 5.03 KB 0644
.build_clib.pyo.40009 File 6.28 KB 0644
.build_ext.pyo.40009 File 19.09 KB 0644
.build_scripts.pyo.40009 File 4.43 KB 0644
.check.pyo.40009 File 6.08 KB 0644
.clean.pyo.40009 File 3.1 KB 0644
.config.pyo.40009 File 12.39 KB 0644
.install.pyo.40009 File 16.5 KB 0644
.install_data.pyo.40009 File 3.09 KB 0644
.install_egg_info.pyo.40009 File 3.68 KB 0644
.install_headers.pyo.40009 File 2.24 KB 0644
.install_lib.pyo.40009 File 6.63 KB 0644
.install_scripts.pyo.40009 File 2.93 KB 0644
.register.pyo.40009 File 9.98 KB 0644
.sdist.pyo.40009 File 16.31 KB 0644
.upload.pyo.40009 File 6.13 KB 0644
__init__.py File 822 B 0644
__init__.pyc File 665 B 0644
__init__.pyo File 665 B 0644
bdist.py File 5.46 KB 0644
bdist.pyc File 5.1 KB 0644
bdist.pyo File 5.1 KB 0644
bdist_dumb.py File 5.07 KB 0644
bdist_dumb.pyc File 4.92 KB 0644
bdist_dumb.pyo File 4.92 KB 0644
bdist_msi.py File 34.37 KB 0644
bdist_msi.pyc File 23.45 KB 0644
bdist_msi.pyo File 23.35 KB 0644
bdist_rpm.py File 20.55 KB 0644
bdist_rpm.pyc File 17.32 KB 0644
bdist_rpm.pyo File 17.24 KB 0644
bdist_wininst.py File 14.65 KB 0644
bdist_wininst.pyc File 10.55 KB 0644
bdist_wininst.pyo File 10.47 KB 0644
build.py File 5.31 KB 0644
build.pyc File 5.03 KB 0644
build.pyo File 5.03 KB 0644
build_clib.py File 7.94 KB 0644
build_clib.pyc File 6.28 KB 0644
build_clib.pyo File 6.28 KB 0644
build_ext.py File 31.75 KB 0644
build_ext.py.debug-build File 31.53 KB 0644
build_ext.pyc File 19.09 KB 0644
build_ext.pyo File 19.09 KB 0644
build_py.py File 15.92 KB 0644
build_py.pyc File 11.24 KB 0644
build_py.pyo File 11.17 KB 0644
build_scripts.py File 4.49 KB 0644
build_scripts.pyc File 4.43 KB 0644
build_scripts.pyo File 4.43 KB 0644
check.py File 5.43 KB 0644
check.pyc File 6.08 KB 0644
check.pyo File 6.08 KB 0644
clean.py File 2.75 KB 0644
clean.pyc File 3.1 KB 0644
clean.pyo File 3.1 KB 0644
command_template File 719 B 0644
config.py File 12.82 KB 0644
config.pyc File 12.39 KB 0644
config.pyo File 12.39 KB 0644
install.py File 25.65 KB 0644
install.pyc File 16.5 KB 0644
install.pyo File 16.5 KB 0644
install_data.py File 2.78 KB 0644
install_data.pyc File 3.09 KB 0644
install_data.pyo File 3.09 KB 0644
install_egg_info.py File 2.53 KB 0644
install_egg_info.pyc File 3.68 KB 0644
install_egg_info.pyo File 3.68 KB 0644
install_headers.py File 1.31 KB 0644
install_headers.pyc File 2.24 KB 0644
install_headers.pyo File 2.24 KB 0644
install_lib.py File 8.14 KB 0644
install_lib.pyc File 6.63 KB 0644
install_lib.pyo File 6.63 KB 0644
install_scripts.py File 2.02 KB 0644
install_scripts.pyc File 2.93 KB 0644
install_scripts.pyo File 2.93 KB 0644
register.py File 11.56 KB 0644
register.pyc File 9.98 KB 0644
register.pyo File 9.98 KB 0644
sdist.py File 18.12 KB 0644
sdist.pyc File 16.31 KB 0644
sdist.pyo File 16.31 KB 0644
upload.py File 6.84 KB 0644
upload.pyc File 6.13 KB 0644
upload.pyo File 6.13 KB 0644
wininst-6.0.exe File 60 KB 0644
wininst-7.1.exe File 64 KB 0644
wininst-8.0.exe File 60 KB 0644
wininst-9.0-amd64.exe File 218.5 KB 0644
wininst-9.0.exe File 191.5 KB 0644