| | 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) |
| |
|
| | |
| | |
| | |
| | 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 = [] |
| |
|
| | |
| | |
| | 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) |
| |
|
| | |
| | |
| | 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) |
| | != ([], []) |
| | ): |
| | |
| | |
| | |
| | macros = build_info.get('macros') |
| | include_dirs = build_info.get('include_dirs') |
| | cflags = build_info.get('cflags') |
| | self.compiler.compile( |
| | sources, |
| | output_dir=self.build_temp, |
| | macros=macros, |
| | include_dirs=include_dirs, |
| | extra_postargs=cflags, |
| | debug=self.debug |
| | ) |
| |
|
| | |
| | |
| | |
| | self.compiler.create_static_lib( |
| | expected_objects, |
| | lib_name, |
| | output_dir=self.build_clib, |
| | debug=self.debug |
| | ) |
| |
|