summaryrefslogtreecommitdiff
path: root/fcompiler/gnu.py
diff options
context:
space:
mode:
Diffstat (limited to 'fcompiler/gnu.py')
-rw-r--r--fcompiler/gnu.py330
1 files changed, 0 insertions, 330 deletions
diff --git a/fcompiler/gnu.py b/fcompiler/gnu.py
deleted file mode 100644
index 76980ae7d..000000000
--- a/fcompiler/gnu.py
+++ /dev/null
@@ -1,330 +0,0 @@
-import re
-import os
-import sys
-import warnings
-
-from numpy.distutils.cpuinfo import cpu
-from numpy.distutils.fcompiler import FCompiler
-from numpy.distutils.exec_command import exec_command
-from numpy.distutils.misc_util import mingw32, msvc_runtime_library
-
-compilers = ['GnuFCompiler', 'Gnu95FCompiler']
-
-class GnuFCompiler(FCompiler):
- compiler_type = 'gnu'
- description = 'GNU Fortran 77 compiler'
-
- def gnu_version_match(self, version_string):
- """Handle the different versions of GNU fortran compilers"""
- m = re.match(r'GNU Fortran', version_string)
- if not m:
- return None
- m = re.match(r'GNU Fortran\s+95.*?([0-9-.]+)', version_string)
- if m:
- return ('gfortran', m.group(1))
- m = re.match(r'GNU Fortran.*?([0-9-.]+)', version_string)
- if m:
- v = m.group(1)
- if v.startswith('0') or v.startswith('2') or v.startswith('3'):
- # the '0' is for early g77's
- return ('g77', v)
- else:
- # at some point in the 4.x series, the ' 95' was dropped
- # from the version string
- return ('gfortran', v)
-
- def version_match(self, version_string):
- v = self.gnu_version_match(version_string)
- if not v or v[0] != 'g77':
- return None
- return v[1]
-
- # 'g77 --version' results
- # SunOS: GNU Fortran (GCC 3.2) 3.2 20020814 (release)
- # Debian: GNU Fortran (GCC) 3.3.3 20040110 (prerelease) (Debian)
- # GNU Fortran (GCC) 3.3.3 (Debian 20040401)
- # GNU Fortran 0.5.25 20010319 (prerelease)
- # Redhat: GNU Fortran (GCC 3.2.2 20030222 (Red Hat Linux 3.2.2-5)) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
-
- possible_executables = ['g77', 'f77']
- executables = {
- 'version_cmd' : [None, "--version"],
- 'compiler_f77' : [None, "-g", "-Wall","-fno-second-underscore"],
- 'compiler_f90' : None, # Use --fcompiler=gnu95 for f90 codes
- 'compiler_fix' : None,
- 'linker_so' : [None, "-g", "-Wall"],
- 'archiver' : ["ar", "-cr"],
- 'ranlib' : ["ranlib"],
- 'linker_exe' : [None, "-g", "-Wall"]
- }
- module_dir_switch = None
- module_include_switch = None
-
- # Cygwin: f771: warning: -fPIC ignored for target (all code is
- # position independent)
- if os.name != 'nt' and sys.platform != 'cygwin':
- pic_flags = ['-fPIC']
-
- # use -mno-cygwin for g77 when Python is not Cygwin-Python
- if sys.platform == 'win32':
- for key in ['version_cmd', 'compiler_f77', 'linker_so', 'linker_exe']:
- executables[key].append('-mno-cygwin')
-
- 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.
- # #if re.match(r'(darwin)', sys.platform):
- # # return
- # return FCompiler.get_linker_so(self)
-
- def get_flags_linker_so(self):
- opt = self.linker_so[1:]
- if sys.platform=='darwin':
- # MACOSX_DEPLOYMENT_TARGET must be at least 10.3. This is
- # a reasonable default value even when building on 10.4 when using
- # the official Python distribution and those derived from it (when
- # not broken).
- target = os.environ.get('MACOSX_DEPLOYMENT_TARGET', None)
- if target is None or target == '':
- target = '10.3'
- major, minor = target.split('.')
- if int(minor) < 3:
- minor = '3'
- warnings.warn('Environment variable '
- 'MACOSX_DEPLOYMENT_TARGET reset to %s.%s' % (major, minor))
- os.environ['MACOSX_DEPLOYMENT_TARGET'] = '%s.%s' % (major,
- minor)
-
- opt.extend(['-undefined', 'dynamic_lookup', '-bundle'])
- else:
- opt.append("-shared")
- if sys.platform.startswith('sunos'):
- # SunOS often has dynamically loaded symbols defined in the
- # static library libg2c.a The linker doesn't like this. To
- # ignore the problem, use the -mimpure-text flag. It isn't
- # the safest thing, but seems to work. 'man gcc' says:
- # ".. Instead of using -mimpure-text, you should compile all
- # source code with -fpic or -fPIC."
- opt.append('-mimpure-text')
- return opt
-
- def get_libgcc_dir(self):
- status, output = exec_command(self.compiler_f77 +
- ['-print-libgcc-file-name'],
- use_tee=0)
- if not status:
- return os.path.dirname(output)
- return None
-
- def get_library_dirs(self):
- opt = []
- if sys.platform[:5] != 'linux':
- d = self.get_libgcc_dir()
- if d:
- # if windows and not cygwin, libg2c lies in a different folder
- if sys.platform == 'win32' and not d.startswith('/usr/lib'):
- d = os.path.normpath(d)
- if not os.path.exists(os.path.join(d, 'libg2c.a')):
- d2 = os.path.abspath(os.path.join(d,
- '../../../../lib'))
- if os.path.exists(os.path.join(d2, 'libg2c.a')):
- opt.append(d2)
- opt.append(d)
- return opt
-
- def get_libraries(self):
- opt = []
- d = self.get_libgcc_dir()
- if d is not None:
- g2c = self.g2c + '-pic'
- f = self.static_lib_format % (g2c, self.static_lib_extension)
- if not os.path.isfile(os.path.join(d,f)):
- g2c = self.g2c
- else:
- g2c = self.g2c
-
- if g2c is not None:
- opt.append(g2c)
- if sys.platform == 'win32':
- # in case want to link F77 compiled code with MSVC
- opt.append('gcc')
- runtime_lib = msvc_runtime_library()
- if runtime_lib:
- opt.append(runtime_lib)
- if sys.platform == 'darwin':
- opt.append('cc_dynamic')
- return opt
-
- def get_flags_debug(self):
- return ['-g']
-
- def get_flags_opt(self):
- if self.get_version()<='3.3.3':
- # With this compiler version building Fortran BLAS/LAPACK
- # with -O3 caused failures in lib.lapack heevr,syevr tests.
- opt = ['-O2']
- else:
- opt = ['-O3']
- opt.append('-funroll-loops')
- return opt
-
- def get_flags_arch(self):
- opt = []
- if sys.platform == 'darwin':
- # Since Apple doesn't distribute a GNU Fortran compiler, we
- # can't add -arch ppc or -arch i386, as only their version
- # of the GNU compilers accepts those.
- for a in '601 602 603 603e 604 604e 620 630 740 7400 7450 750'\
- '403 505 801 821 823 860'.split():
- if getattr(cpu,'is_ppc%s'%a)():
- opt.append('-mcpu='+a)
- opt.append('-mtune='+a)
- break
- return opt
-
- # default march options in case we find nothing better
- if cpu.is_i686():
- march_opt = '-march=i686'
- elif cpu.is_i586():
- march_opt = '-march=i586'
- elif cpu.is_i486():
- march_opt = '-march=i486'
- elif cpu.is_i386():
- march_opt = '-march=i386'
- else:
- march_opt = ''
-
- gnu_ver = self.get_version()
-
- if gnu_ver >= '0.5.26': # gcc 3.0
- if cpu.is_AthlonK6():
- march_opt = '-march=k6'
- elif cpu.is_AthlonK7():
- march_opt = '-march=athlon'
-
- if gnu_ver >= '3.1.1':
- if cpu.is_AthlonK6_2():
- march_opt = '-march=k6-2'
- elif cpu.is_AthlonK6_3():
- march_opt = '-march=k6-3'
- elif cpu.is_AthlonMP():
- march_opt = '-march=athlon-mp'
- # there's also: athlon-tbird, athlon-4, athlon-xp
- elif cpu.is_Nocona():
- march_opt = '-march=nocona'
- elif cpu.is_Core2():
- march_opt = '-march=nocona'
- elif cpu.is_Xeon() and cpu.is_64bit():
- march_opt = '-march=nocona'
- elif cpu.is_Prescott():
- march_opt = '-march=prescott'
- elif cpu.is_PentiumIV():
- march_opt = '-march=pentium4'
- elif cpu.is_PentiumIII():
- march_opt = '-march=pentium3'
- elif cpu.is_PentiumM():
- march_opt = '-march=pentium3'
- elif cpu.is_PentiumII():
- march_opt = '-march=pentium2'
-
- if gnu_ver >= '3.4':
- if cpu.is_Opteron():
- march_opt = '-march=opteron'
- elif cpu.is_Athlon64():
- march_opt = '-march=athlon64'
-
- if gnu_ver >= '3.4.4':
- if cpu.is_PentiumM():
- march_opt = '-march=pentium-m'
- # Future:
- # if gnu_ver >= '4.3':
- # if cpu.is_Core2():
- # march_opt = '-march=core2'
-
- # Note: gcc 3.2 on win32 has breakage with -march specified
- if '3.1.1' <= gnu_ver <= '3.4' and sys.platform=='win32':
- march_opt = ''
-
- if march_opt:
- opt.append(march_opt)
-
- # other CPU flags
- if gnu_ver >= '3.1.1':
- if cpu.has_mmx(): opt.append('-mmmx')
- if cpu.has_3dnow(): opt.append('-m3dnow')
-
- if gnu_ver > '3.2.2':
- if cpu.has_sse2(): opt.append('-msse2')
- if cpu.has_sse(): opt.append('-msse')
- if gnu_ver >= '3.4':
- if cpu.has_sse3(): opt.append('-msse3')
- if cpu.is_Intel():
- opt.append('-fomit-frame-pointer')
- if cpu.is_32bit():
- opt.append('-malign-double')
- return opt
-
-class Gnu95FCompiler(GnuFCompiler):
- compiler_type = 'gnu95'
- description = 'GNU Fortran 95 compiler'
-
- def version_match(self, version_string):
- v = self.gnu_version_match(version_string)
- if not v or v[0] != 'gfortran':
- return None
- return v[1]
-
- # 'gfortran --version' results:
- # XXX is the below right?
- # Debian: GNU Fortran 95 (GCC 4.0.3 20051023 (prerelease) (Debian 4.0.2-3))
- # GNU Fortran 95 (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
- # OS X: GNU Fortran 95 (GCC) 4.1.0
- # GNU Fortran 95 (GCC) 4.2.0 20060218 (experimental)
- # GNU Fortran (GCC) 4.3.0 20070316 (experimental)
-
- possible_executables = ['gfortran', 'f95']
- executables = {
- 'version_cmd' : ["<F90>", "--version"],
- 'compiler_f77' : [None, "-Wall", "-ffixed-form",
- "-fno-second-underscore"],
- 'compiler_f90' : [None, "-Wall", "-fno-second-underscore"],
- 'compiler_fix' : [None, "-Wall", "-ffixed-form",
- "-fno-second-underscore"],
- 'linker_so' : ["<F90>", "-Wall"],
- 'archiver' : ["ar", "-cr"],
- 'ranlib' : ["ranlib"],
- 'linker_exe' : [None,"-Wall"]
- }
-
- # use -mno-cygwin flag for g77 when Python is not Cygwin-Python
- if sys.platform == 'win32':
- for key in ['version_cmd', 'compiler_f77', 'compiler_f90',
- 'compiler_fix', 'linker_so', 'linker_exe']:
- executables[key].append('-mno-cygwin')
-
- module_dir_switch = '-J'
- module_include_switch = '-I'
-
- g2c = 'gfortran'
-
- def get_libraries(self):
- opt = GnuFCompiler.get_libraries(self)
- if sys.platform == 'darwin':
- opt.remove('cc_dynamic')
- return opt
-
-if __name__ == '__main__':
- from distutils import log
- log.set_verbosity(2)
- from numpy.distutils.fcompiler import new_fcompiler
- #compiler = new_fcompiler(compiler='gnu')
- compiler = GnuFCompiler()
- compiler.customize()
- print compiler.get_version()
- compiler = Gnu95FCompiler()
- compiler.customize()
- print compiler.get_version()