summaryrefslogtreecommitdiff
path: root/scipy_distutils/gnufcompiler.py
diff options
context:
space:
mode:
Diffstat (limited to 'scipy_distutils/gnufcompiler.py')
-rw-r--r--scipy_distutils/gnufcompiler.py166
1 files changed, 166 insertions, 0 deletions
diff --git a/scipy_distutils/gnufcompiler.py b/scipy_distutils/gnufcompiler.py
new file mode 100644
index 000000000..11a2ac28f
--- /dev/null
+++ b/scipy_distutils/gnufcompiler.py
@@ -0,0 +1,166 @@
+
+import re
+import os
+import sys
+
+from cpuinfo import cpu
+from fcompiler import FCompiler
+from exec_command import find_executable
+
+class GnuFCompiler(FCompiler):
+
+ compiler_type = 'gnu'
+ version_pattern = r'GNU Fortran (\(GCC\)|\(GCC.*\)\)|)\s*'\
+ '(?P<version>[^\s*\)]+)'
+
+ for fc_exe in map(find_executable,['g77','f77']):
+ if os.path.isfile(fc_exe):
+ break
+ executables = {
+ 'version_cmd' : [fc_exe,"--version"],
+ 'compiler_f77' : [fc_exe,"-Wall","-fno-second-underscore"],
+ 'compiler_f90' : None,
+ 'compiler_fix' : None,
+ 'linker_so' : [fc_exe],
+ 'archiver' : ["ar", "-cr"],
+ 'ranlib' : ["ranlib"],
+ }
+
+
+ def get_flags(self):
+ opt = FCompiler.get_flags(self)
+ if os.name != 'nt':
+ opt.append('-fPIC')
+ return opt
+
+ 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'(win32|cygwin.*|darwin)', sys.platform):
+ return
+ return FCompiler.get_linker_so(self)
+
+ def get_flags_linker_so(self):
+ opt = FCompiler.get_flags_linker_so(self)
+ if not re.match(r'(win32|cygwin.*|darwin)', sys.platform):
+ opt.append("-shared")
+ if sys.platform[:5]=='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 = self.exec_command('%s -print-libgcc-file-name' \
+ % (self.compiler_f77[0]),use_tee=0)
+ if not status:
+ return os.path.dirname(output)
+ return
+
+ def get_library_dirs(self):
+ opt = FCompiler.get_library_dirs(self)
+ if sys.platform[:5] != 'linux':
+ d = self.get_libgcc_dir()
+ if d:
+ opt.append(d)
+ return opt
+
+ def get_libraries(self):
+ opt = FCompiler.get_library_dirs(self)
+ d = self.get_libgcc_dir()
+ if d is not None:
+ for g2c in ['g2c-pic','g2c']:
+ f = self.static_lib_format % (g2c, self.static_lib_extension)
+ if os.path.isfile(os.path.join(d,f)):
+ break
+ else:
+ g2c = 'g2c'
+ if sys.platform=='win32':
+ opt.extend(['gcc',g2c])
+ else:
+ opt.append(g2c)
+ return opt
+
+ def get_flags_debug(self):
+ return ['-g']
+
+ def get_flags_opt(self):
+ opt = ['-O3','-funroll-loops']
+ return opt
+
+ def get_flags_arch(self):
+ opt = []
+ if sys.platform=='darwin':
+ if os.name != 'posix':
+ # this should presumably correspond to Apple
+ if cpu.is_ppc():
+ opt.append('-arch ppc')
+ elif cpu.is_i386():
+ opt.append('-arch i386')
+ 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
+ march_flag = 1
+ if self.get_version() == '0.5.26': # gcc 3.0
+ if cpu.is_AthlonK6():
+ opt.append('-march=k6')
+ elif cpu.is_AthlonK7():
+ opt.append('-march=athlon')
+ else:
+ march_flag = 0
+ elif self.get_version() >= '3.1.1': # gcc >= 3.1.1
+ if cpu.is_AthlonK6():
+ opt.append('-march=k6')
+ elif cpu.is_AthlonK6_2():
+ opt.append('-march=k6-2')
+ elif cpu.is_AthlonK6_3():
+ opt.append('-march=k6-3')
+ elif cpu.is_AthlonK7():
+ opt.append('-march=athlon')
+ elif cpu.is_AthlonMP():
+ opt.append('-march=athlon-mp')
+ # there's also: athlon-tbird, athlon-4, athlon-xp
+ elif cpu.is_PentiumIV():
+ opt.append('-march=pentium4')
+ elif cpu.is_PentiumIII():
+ opt.append('-march=pentium3')
+ elif cpu.is_PentiumII():
+ opt.append('-march=pentium2')
+ else:
+ march_flag = 0
+ if cpu.has_mmx(): opt.append('-mmmx')
+ if self.get_version() > '3.2.2':
+ if cpu.has_sse2(): opt.append('-msse2')
+ if cpu.has_sse(): opt.append('-msse')
+ if cpu.has_3dnow(): opt.append('-m3dnow')
+ else:
+ march_flag = 0
+ if march_flag:
+ pass
+ elif cpu.is_i686():
+ opt.append('-march=i686')
+ elif cpu.is_i586():
+ opt.append('-march=i586')
+ elif cpu.is_i486():
+ opt.append('-march=i486')
+ elif cpu.is_i386():
+ opt.append('-march=i386')
+ if cpu.is_Intel():
+ opt.extend(['-malign-double','-fomit-frame-pointer'])
+ return opt
+
+if __name__ == '__main__':
+ from distutils import log
+ log.set_verbosity(2)
+ from fcompiler import new_fcompiler
+ compiler = new_fcompiler(compiler='gnu')
+ compiler.customize()
+ print compiler.get_version()