summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--numpy/distutils/ccompiler_opt.py22
-rw-r--r--numpy/distutils/command/build_clib.py28
-rw-r--r--numpy/distutils/command/build_ext.py28
3 files changed, 63 insertions, 15 deletions
diff --git a/numpy/distutils/ccompiler_opt.py b/numpy/distutils/ccompiler_opt.py
index e6c720399..aea9835c7 100644
--- a/numpy/distutils/ccompiler_opt.py
+++ b/numpy/distutils/ccompiler_opt.py
@@ -543,14 +543,14 @@ class _Distutils:
def __init__(self, ccompiler):
self._ccompiler = ccompiler
- def dist_compile(self, sources, flags, **kwargs):
+ def dist_compile(self, sources, flags, ccompiler=None, **kwargs):
"""Wrap CCompiler.compile()"""
assert(isinstance(sources, list))
assert(isinstance(flags, list))
flags = kwargs.pop("extra_postargs", []) + flags
- return self._ccompiler.compile(
- sources, extra_postargs=flags, **kwargs
- )
+ if not ccompiler:
+ ccompiler = self._ccompiler
+ return ccompiler.compile(sources, extra_postargs=flags, **kwargs)
def dist_test(self, source, flags):
"""Return True if 'CCompiler.compile()' able to compile
@@ -2143,7 +2143,7 @@ class CCompilerOpt(_Config, _Distutils, _Cache, _CCompiler, _Feature, _Parse):
"""
return self.parse_dispatch_names
- def try_dispatch(self, sources, src_dir=None, **kwargs):
+ def try_dispatch(self, sources, src_dir=None, ccompiler=None, **kwargs):
"""
Compile one or more dispatch-able sources and generates object files,
also generates abstract C config headers and macros that
@@ -2166,6 +2166,11 @@ class CCompilerOpt(_Config, _Distutils, _Cache, _CCompiler, _Feature, _Parse):
Path of parent directory for the generated headers and wrapped sources.
If None(default) the files will generated in-place.
+ ccompiler: CCompiler
+ Distutils `CCompiler` instance to be used for compilation.
+ If None (default), the provided instance during the initialization
+ will be used instead.
+
**kwargs : any
Arguments to pass on to the `CCompiler.compile()`
@@ -2220,7 +2225,9 @@ class CCompilerOpt(_Config, _Distutils, _Cache, _CCompiler, _Feature, _Parse):
# among them.
objects = []
for flags, srcs in to_compile.items():
- objects += self.dist_compile(srcs, list(flags), **kwargs)
+ objects += self.dist_compile(
+ srcs, list(flags), ccompiler=ccompiler, **kwargs
+ )
return objects
def generate_dispatch_header(self, header_path):
@@ -2454,7 +2461,8 @@ class CCompilerOpt(_Config, _Distutils, _Cache, _CCompiler, _Feature, _Parse):
return wrap_path
def _generate_config(self, output_dir, dispatch_src, targets, has_baseline=False):
- config_path = os.path.basename(dispatch_src).replace(".c", ".h")
+ config_path = os.path.basename(dispatch_src)
+ config_path = os.path.splitext(config_path)[0] + '.h'
config_path = os.path.join(output_dir, config_path)
# check if targets didn't change to avoid recompiling
cache_hash = self.cache_hash(targets, has_baseline)
diff --git a/numpy/distutils/command/build_clib.py b/numpy/distutils/command/build_clib.py
index 1b3004c2f..a4f49b00e 100644
--- a/numpy/distutils/command/build_clib.py
+++ b/numpy/distutils/command/build_clib.py
@@ -271,6 +271,7 @@ class build_clib(old_build_clib):
# filtering C dispatch-table sources when optimization is not disabled,
# otherwise treated as normal sources.
copt_c_sources = []
+ copt_cxx_sources = []
copt_baseline_flags = []
copt_macros = []
if not self.disable_optimization:
@@ -280,15 +281,34 @@ class build_clib(old_build_clib):
include_dirs.append(dispatch_hpath)
copt_build_src = None if self.inplace else bsrc_dir
- copt_c_sources = [
- c_sources.pop(c_sources.index(src))
- for src in c_sources[:] if src.endswith(".dispatch.c")
- ]
+ for _srcs, _dst, _ext in (
+ ((c_sources,), copt_c_sources, ('.dispatch.c',)),
+ ((c_sources, cxx_sources), copt_cxx_sources,
+ ('.dispatch.cpp', '.dispatch.cxx'))
+ ):
+ for _src in _srcs:
+ _dst += [
+ _src.pop(_src.index(s))
+ for s in _src[:] if s.endswith(_ext)
+ ]
copt_baseline_flags = self.compiler_opt.cpu_baseline_flags()
else:
copt_macros.append(("NPY_DISABLE_OPTIMIZATION", 1))
objects = []
+ if copt_cxx_sources:
+ log.info("compiling C++ dispatch-able sources")
+ objects += self.compiler_opt.try_dispatch(
+ copt_c_sources,
+ output_dir=self.build_temp,
+ src_dir=copt_build_src,
+ macros=macros + copt_macros,
+ include_dirs=include_dirs,
+ debug=self.debug,
+ extra_postargs=extra_postargs,
+ ccompiler=cxx_compiler
+ )
+
if copt_c_sources:
log.info("compiling C dispatch-able sources")
objects += self.compiler_opt.try_dispatch(copt_c_sources,
diff --git a/numpy/distutils/command/build_ext.py b/numpy/distutils/command/build_ext.py
index 99c6be873..91cb0d897 100644
--- a/numpy/distutils/command/build_ext.py
+++ b/numpy/distutils/command/build_ext.py
@@ -418,6 +418,7 @@ class build_ext (old_build_ext):
# filtering C dispatch-table sources when optimization is not disabled,
# otherwise treated as normal sources.
copt_c_sources = []
+ copt_cxx_sources = []
copt_baseline_flags = []
copt_macros = []
if not self.disable_optimization:
@@ -427,15 +428,34 @@ class build_ext (old_build_ext):
include_dirs.append(dispatch_hpath)
copt_build_src = None if self.inplace else bsrc_dir
- copt_c_sources = [
- c_sources.pop(c_sources.index(src))
- for src in c_sources[:] if src.endswith(".dispatch.c")
- ]
+ for _srcs, _dst, _ext in (
+ ((c_sources,), copt_c_sources, ('.dispatch.c',)),
+ ((c_sources, cxx_sources), copt_cxx_sources,
+ ('.dispatch.cpp', '.dispatch.cxx'))
+ ):
+ for _src in _srcs:
+ _dst += [
+ _src.pop(_src.index(s))
+ for s in _src[:] if s.endswith(_ext)
+ ]
copt_baseline_flags = self.compiler_opt.cpu_baseline_flags()
else:
copt_macros.append(("NPY_DISABLE_OPTIMIZATION", 1))
c_objects = []
+ if copt_cxx_sources:
+ log.info("compiling C++ dispatch-able sources")
+ c_objects += self.compiler_opt.try_dispatch(
+ copt_cxx_sources,
+ output_dir=output_dir,
+ src_dir=copt_build_src,
+ macros=macros + copt_macros,
+ include_dirs=include_dirs,
+ debug=self.debug,
+ extra_postargs=extra_args,
+ ccompiler=cxx_compiler,
+ **kws
+ )
if copt_c_sources:
log.info("compiling C dispatch-able sources")
c_objects += self.compiler_opt.try_dispatch(copt_c_sources,