diff options
author | Pearu Peterson <pearu.peterson@gmail.com> | 2004-01-19 09:00:01 +0000 |
---|---|---|
committer | Pearu Peterson <pearu.peterson@gmail.com> | 2004-01-19 09:00:01 +0000 |
commit | c879ef7d77eb19cb4d795e4550573de9c58955b4 (patch) | |
tree | 1f4fefca21b78e13a10f133a5df586faa799347a /scipy_distutils/gnufcompiler.py | |
parent | 60612a648d3b108daf597dfbaee57c316fb0775f (diff) | |
download | numpy-c879ef7d77eb19cb4d795e4550573de9c58955b4.tar.gz |
Refactoring build_flib.py (to follow and use standard distutils conventions and tools). It's work in-progress. Sending the output of 'python fcompiler.py --verbose' would be a great help if you have other than intel and gnu compilers installed.
Diffstat (limited to 'scipy_distutils/gnufcompiler.py')
-rw-r--r-- | scipy_distutils/gnufcompiler.py | 166 |
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() |