From a90754d673aa4af4d605a657134d76422c390510 Mon Sep 17 00:00:00 2001 From: Pearu Peterson Date: Tue, 16 Aug 2011 23:33:32 +0300 Subject: ENH: Introduce new options extra_f77_compile_args and extra_f90_compile_args to Configuration.add_extension. Configuration.add_library, and Extension. These options allow specifying extra compile options for compiling Fortran sources within a setup.py file. --- numpy/distutils/command/build_clib.py | 4 ++++ numpy/distutils/command/build_ext.py | 3 +++ numpy/distutils/extension.py | 6 +++++- numpy/distutils/fcompiler/__init__.py | 15 ++++++++++++++- numpy/distutils/misc_util.py | 6 ++++++ 5 files changed, 32 insertions(+), 2 deletions(-) (limited to 'numpy/distutils') diff --git a/numpy/distutils/command/build_clib.py b/numpy/distutils/command/build_clib.py index 68f52b26e..d9cfca73e 100644 --- a/numpy/distutils/command/build_clib.py +++ b/numpy/distutils/command/build_clib.py @@ -177,6 +177,10 @@ class build_clib(old_build_clib): raise DistutilsError("library %s has Fortran sources"\ " but no Fortran compiler found" % (lib_name)) + if fcompiler is not None: + fcompiler.extra_f77_compile_args = build_info.get('extra_f77_compile_args') or [] + fcompiler.extra_f90_compile_args = build_info.get('extra_f90_compile_args') or [] + macros = build_info.get('macros') include_dirs = build_info.get('include_dirs') if include_dirs is None: diff --git a/numpy/distutils/command/build_ext.py b/numpy/distutils/command/build_ext.py index 840d43716..f63d5249c 100644 --- a/numpy/distutils/command/build_ext.py +++ b/numpy/distutils/command/build_ext.py @@ -299,6 +299,9 @@ class build_ext (old_build_ext): fcompiler = self._f77_compiler else: # in case ext.language is c++, for instance fcompiler = self._f90_compiler or self._f77_compiler + if fcompiler is not None: + fcompiler.extra_f77_compile_args = ext.extra_f77_compile_args or [] + fcompiler.extra_f90_compile_args = ext.extra_f90_compile_args or [] cxx_compiler = self._cxx_compiler # check for the availability of required compilers diff --git a/numpy/distutils/extension.py b/numpy/distutils/extension.py index 9f28263d8..2fc29f6d5 100644 --- a/numpy/distutils/extension.py +++ b/numpy/distutils/extension.py @@ -31,6 +31,8 @@ class Extension(old_Extension): language=None, f2py_options=None, module_dirs=None, + extra_f77_compile_args=None, + extra_f90_compile_args=None, ): old_Extension.__init__(self,name, [], include_dirs, @@ -63,7 +65,9 @@ class Extension(old_Extension): # numpy_distutils features self.f2py_options = f2py_options or [] self.module_dirs = module_dirs or [] - + self.extra_f77_compile_args = extra_f77_compile_args or [] + self.extra_f90_compile_args = extra_f90_compile_args or [] + return def has_cxx_sources(self): diff --git a/numpy/distutils/fcompiler/__init__.py b/numpy/distutils/fcompiler/__init__.py index 69d9d68d3..550ae208a 100644 --- a/numpy/distutils/fcompiler/__init__.py +++ b/numpy/distutils/fcompiler/__init__.py @@ -213,6 +213,10 @@ class FCompiler(CCompiler): # command/{build_ext.py, build_clib.py, config.py} files. c_compiler = None + # extra_{f77,f90}_compile_args are set by build_ext.build_extension method + extra_f77_compile_args = [] + extra_f90_compile_args = [] + def __init__(self, *args, **kw): CCompiler.__init__(self, *args, **kw) self.distutils_vars = self.distutils_vars.clone(self._environment_hook) @@ -560,18 +564,21 @@ class FCompiler(CCompiler): flavor = ':f77' compiler = self.compiler_f77 src_flags = get_f77flags(src) + extra_compile_args = self.extra_f77_compile_args or [] elif is_free_format(src): flavor = ':f90' compiler = self.compiler_f90 if compiler is None: raise DistutilsExecError('f90 not supported by %s needed for %s'\ % (self.__class__.__name__,src)) + extra_compile_args = self.extra_f90_compile_args or [] else: flavor = ':fix' compiler = self.compiler_fix if compiler is None: raise DistutilsExecError('f90 (fixed) not supported by %s needed for %s'\ % (self.__class__.__name__,src)) + extra_compile_args = self.extra_f90_compile_args or [] if self.object_switch[-1]==' ': o_args = [self.object_switch.strip(),obj] else: @@ -580,13 +587,17 @@ class FCompiler(CCompiler): assert self.compile_switch.strip() s_args = [self.compile_switch, src] + if extra_compile_args: + log.info('extra %s options: %r' \ + % (flavor[1:], ' '.join(extra_compile_args))) + extra_flags = src_flags.get(self.compiler_type,[]) if extra_flags: log.info('using compile options from source: %r' \ % ' '.join(extra_flags)) command = compiler + cc_args + extra_flags + s_args + o_args \ - + extra_postargs + + extra_postargs + extra_compile_args display = '%s: %s' % (os.path.basename(compiler[0]) + flavor, src) @@ -961,5 +972,7 @@ def get_f77flags(src): f.close() return flags +# TODO: implement get_f90flags and use it in _compile similarly to get_f77flags + if __name__ == '__main__': show_fcompilers() diff --git a/numpy/distutils/misc_util.py b/numpy/distutils/misc_util.py index 53ef87373..2e4ed27f3 100644 --- a/numpy/distutils/misc_util.py +++ b/numpy/distutils/misc_util.py @@ -1403,6 +1403,8 @@ class Configuration(object): extra_objects: extra_compile_args: extra_link_args: + extra_f77_compile_args: + extra_f90_compile_args: export_symbols: swig_opts: depends: @@ -1497,6 +1499,8 @@ class Configuration(object): * macros * include_dirs * extra_compiler_args + * extra_f77_compiler_args + * extra_f90_compiler_args * f2py_options * language @@ -1548,6 +1552,8 @@ class Configuration(object): * macros * include_dirs * extra_compiler_args + * extra_f77_compiler_args + * extra_f90_compiler_args * f2py_options * language -- cgit v1.2.1