diff options
Diffstat (limited to 'numpy/distutils/fcompiler')
-rw-r--r-- | numpy/distutils/fcompiler/__init__.py | 27 | ||||
-rw-r--r-- | numpy/distutils/fcompiler/gnu.py | 4 |
2 files changed, 25 insertions, 6 deletions
diff --git a/numpy/distutils/fcompiler/__init__.py b/numpy/distutils/fcompiler/__init__.py index 2974f5693..9dc8114a4 100644 --- a/numpy/distutils/fcompiler/__init__.py +++ b/numpy/distutils/fcompiler/__init__.py @@ -104,6 +104,11 @@ class FCompiler(CCompiler): shared_lib_format = "%s%s" exe_extension = "" + # If compiler does not support compiling Fortran 90 then it can + # suggest using another compiler. For example, gnu would suggest + # gnu95 compiler type when there are F90 sources. + suggested_f90_compiler = None + ###################################################################### ## Methods that subclasses may redefine. But don't call these methods! ## They are private to FCompiler class and may return unexpected @@ -589,13 +594,23 @@ _default_compilers = ( ('mac',('gnu','gnu95',)), ) -def _find_existing_fcompiler(compilers, osname=None, platform=None): +def _find_existing_fcompiler(compilers, osname=None, platform=None, requiref90=None): for compiler in compilers: v = None try: c = new_fcompiler(plat=platform, compiler=compiler) c.customize() v = c.get_version() + if requiref90 and c.compiler_f90 is None: + v = None + new_compiler = c.suggested_f90_compiler + if new_compiler: + c = new_fcompiler(plat=platform, compiler=new_compiler) + c.customize() + v = c.get_version() + if requiref90 and c.compiler_f90 is None: + raise ValueError,'%s does not support compiling f90 codes, skipping.' \ + % (c.__class__.__name__) except DistutilsModuleError: pass except Exception, msg: @@ -604,7 +619,7 @@ def _find_existing_fcompiler(compilers, osname=None, platform=None): return compiler return -def get_default_fcompiler(osname=None, platform=None): +def get_default_fcompiler(osname=None, platform=None, requiref90=None): """ Determine the default Fortran compiler to use for the given platform. """ if osname is None: osname = os.name @@ -622,7 +637,8 @@ def get_default_fcompiler(osname=None, platform=None): matching_compilers.append('gnu') compiler = _find_existing_fcompiler(matching_compilers, osname=osname, - platform=platform) + platform=platform, + requiref90=requiref90) if compiler is not None: return compiler return matching_compilers[0] @@ -631,7 +647,8 @@ def new_fcompiler(plat=None, compiler=None, verbose=0, dry_run=0, - force=0): + force=0, + requiref90=0): """ Generate an instance of some FCompiler subclass for the supplied platform/compiler combination. """ @@ -639,7 +656,7 @@ def new_fcompiler(plat=None, plat = os.name try: if compiler is None: - compiler = get_default_fcompiler(plat) + compiler = get_default_fcompiler(plat,requiref90=requiref90) (module_name, class_name, long_description) = fcompiler_class[compiler] except KeyError: msg = "don't know how to compile Fortran code on platform '%s'" % plat diff --git a/numpy/distutils/fcompiler/gnu.py b/numpy/distutils/fcompiler/gnu.py index cd272b885..6e0f1895d 100644 --- a/numpy/distutils/fcompiler/gnu.py +++ b/numpy/distutils/fcompiler/gnu.py @@ -28,7 +28,7 @@ class GnuFCompiler(FCompiler): executables = { 'version_cmd' : [fc_exe,"--version"], 'compiler_f77' : [fc_exe, "-g", "-Wall","-fno-second-underscore"], - 'compiler_f90' : None, + 'compiler_f90' : None, # Use --fcompiler=gnu95 for f90 codes 'compiler_fix' : None, 'linker_so' : [fc_exe, "-g", "-Wall"], 'archiver' : ["ar", "-cr"], @@ -50,6 +50,8 @@ class GnuFCompiler(FCompiler): g2c = 'g2c' + suggested_f90_compiler = 'gnu95' + #def get_linker_so(self): # # win32 linking should be handled by standard linker # # Darwin g77 cannot be used as a linker. |