Source code for pyjac.pywrap.parallel_compiler
"""Module for performing parallel compilation of source code files.
"""
import multiprocessing
from multiprocessing.pool import ThreadPool
import distutils.ccompiler
N = multiprocessing.cpu_count()
# monkey-patch for parallel compilation
[docs]def parallel_compile(self, sources, output_dir=None, macros=None,
include_dirs=None, debug=False, extra_preargs=None,
extra_postargs=None, depends=None
):
"""Compile source files in parallel.
Parameters
----------
sources : list of `str`
List of source files
output_dir : str
Optional; path to directory for object files
macros : list of `tuple`
Optional; list of macro definitions, like (name, value) or (name,)
include_dirs : list of `str`
Optional; list of directories to add to default include file search path
debug : bool
Optional; if ``True``, instruct compiler to output debug signals
extra_preargs : list of `str`
Optional; extra command-line arguments to prepend to compiler command
extra_postargs : list of `str`
Optional; extra command-line arguments to append to compiler command
depends : list of `str`
Optional; list of filenames that target depends on
Returns
-------
objects : list of `str`
List of object files generated
"""
# those lines are copied from distutils.ccompiler.CCompiler directly
macros, objects, extra_postargs, pp_opts, build = self._setup_compile(
output_dir, macros, include_dirs, sources, depends, extra_postargs
)
cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)
# number of parallel compilations
def _single_compile(obj):
"""Compile single file.
"""
try: src, ext = build[obj]
except KeyError: return
self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
# convert to list, imap is evaluated on-demand
list(ThreadPool(N).imap(_single_compile, objects))
return objects