import distutils.command.build_clib as orig from distutils.errors import DistutilsSetupError from distutils import log from setuptools.dep_util import newer_pairwise_group class build_clib(orig.build_clib): """ Override the default build_clib behaviour to do the following: 1. Implement a rudimentary timestamp-based dependency system so 'compile()' doesn't run every time. 2. Add more keys to the 'build_info' dictionary: * obj_deps - specify dependencies for each object compiled. this should be a dictionary mapping a key with the source filename to a list of dependencies. Use an empty string for global dependencies. * cflags - specify a list of additional flags to pass to the compiler. """ 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) # Make sure everything is the correct type. # obj_deps should be a dictionary of keys as sources # and a list/tuple of files that are its dependencies. obj_deps = build_info.get('obj_deps', dict()) if not isinstance(obj_deps, dict): raise DistutilsSetupError( "in 'libraries' option (library '%s'), " "'obj_deps' must be a dictionary of " "type 'source: list'" % lib_name) dependencies = [] # Get the global dependencies that are specified by the '' key. # These will go into every source's dependency list. global_deps = obj_deps.get('', list()) if not isinstance(global_deps, (list, tuple)): raise DistutilsSetupError( "in 'libraries' option (library '%s'), " "'obj_deps' must be a dictionary of " "type 'source: list'" % lib_name) # Build the list to be used by newer_pairwise_group # each source will be auto-added to its dependencies. for source in sources: src_deps = [source] src_deps.extend(global_deps) extra_deps = obj_deps.get(source, list()) if not isinstance(extra_deps, (list, tuple)): raise DistutilsSetupError( "in 'libraries' option (library '%s'), " "'obj_deps' must be a dictionary of " "type 'source: list'" % lib_name) src_deps.extend(extra_deps) dependencies.append(src_deps) expected_objects = self.compiler.object_filenames( sources, output_dir=self.build_temp ) if newer_pairwise_group(dependencies, expected_objects) != ([], []): # 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') cflags = build_info.get('cflags') objects = self.compiler.compile( sources, output_dir=self.build_temp, macros=macros, include_dirs=include_dirs, extra_postargs=cflags, 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( expected_objects, lib_name, output_dir=self.build_clib, debug=self.debug )
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
__init__.py | File | 594 B | 0644 |
|
alias.py | File | 2.37 KB | 0644 |
|
bdist_egg.py | File | 17.76 KB | 0644 |
|
bdist_rpm.py | File | 1.47 KB | 0644 |
|
bdist_wininst.py | File | 637 B | 0644 |
|
build_clib.py | File | 4.38 KB | 0644 |
|
build_ext.py | File | 12.86 KB | 0644 |
|
build_py.py | File | 9.37 KB | 0644 |
|
develop.py | File | 7.86 KB | 0644 |
|
dist_info.py | File | 960 B | 0644 |
|
easy_install.py | File | 85.16 KB | 0644 |
|
egg_info.py | File | 24.22 KB | 0644 |
|
install.py | File | 4.57 KB | 0644 |
|
install_egg_info.py | File | 2.15 KB | 0644 |
|
install_lib.py | File | 3.75 KB | 0644 |
|
install_scripts.py | File | 2.38 KB | 0644 |
|
launcher manifest.xml | File | 628 B | 0644 |
|
py36compat.py | File | 4.87 KB | 0644 |
|
register.py | File | 270 B | 0644 |
|
rotate.py | File | 2.11 KB | 0644 |
|
saveopts.py | File | 658 B | 0644 |
|
sdist.py | File | 6.55 KB | 0644 |
|
setopt.py | File | 4.97 KB | 0644 |
|
test.py | File | 9 KB | 0644 |
|
upload.py | File | 1.14 KB | 0644 |
|
upload_docs.py | File | 7.14 KB | 0644 |
|