Chris@87: # http://developer.intel.com/software/products/compilers/flin/ Chris@87: from __future__ import division, absolute_import, print_function Chris@87: Chris@87: import sys Chris@87: Chris@87: from numpy.distutils.ccompiler import simple_version_match Chris@87: from numpy.distutils.fcompiler import FCompiler, dummy_fortran_file Chris@87: Chris@87: compilers = ['IntelFCompiler', 'IntelVisualFCompiler', Chris@87: 'IntelItaniumFCompiler', 'IntelItaniumVisualFCompiler', Chris@87: 'IntelEM64VisualFCompiler', 'IntelEM64TFCompiler'] Chris@87: Chris@87: def intel_version_match(type): Chris@87: # Match against the important stuff in the version string Chris@87: return simple_version_match(start=r'Intel.*?Fortran.*?(?:%s).*?Version' % (type,)) Chris@87: Chris@87: class BaseIntelFCompiler(FCompiler): Chris@87: def update_executables(self): Chris@87: f = dummy_fortran_file() Chris@87: self.executables['version_cmd'] = ['', '-FI', '-V', '-c', Chris@87: f + '.f', '-o', f + '.o'] Chris@87: Chris@87: class IntelFCompiler(BaseIntelFCompiler): Chris@87: Chris@87: compiler_type = 'intel' Chris@87: compiler_aliases = ('ifort',) Chris@87: description = 'Intel Fortran Compiler for 32-bit apps' Chris@87: version_match = intel_version_match('32-bit|IA-32') Chris@87: Chris@87: possible_executables = ['ifort', 'ifc'] Chris@87: Chris@87: executables = { Chris@87: 'version_cmd' : None, # set by update_executables Chris@87: 'compiler_f77' : [None, "-72", "-w90", "-w95"], Chris@87: 'compiler_f90' : [None], Chris@87: 'compiler_fix' : [None, "-FI"], Chris@87: 'linker_so' : ["", "-shared"], Chris@87: 'archiver' : ["ar", "-cr"], Chris@87: 'ranlib' : ["ranlib"] Chris@87: } Chris@87: Chris@87: pic_flags = ['-fPIC'] Chris@87: module_dir_switch = '-module ' # Don't remove ending space! Chris@87: module_include_switch = '-I' Chris@87: Chris@87: def get_flags_free(self): Chris@87: return ["-FR"] Chris@87: Chris@87: def get_flags(self): Chris@87: return ['-fPIC'] Chris@87: Chris@87: def get_flags_opt(self): Chris@87: #return ['-i8 -xhost -openmp -fp-model strict'] Chris@87: return ['-xhost -openmp -fp-model strict'] Chris@87: Chris@87: def get_flags_arch(self): Chris@87: return [] Chris@87: Chris@87: def get_flags_linker_so(self): Chris@87: opt = FCompiler.get_flags_linker_so(self) Chris@87: v = self.get_version() Chris@87: if v and v >= '8.0': Chris@87: opt.append('-nofor_main') Chris@87: if sys.platform == 'darwin': Chris@87: # Here, it's -dynamiclib Chris@87: try: Chris@87: idx = opt.index('-shared') Chris@87: opt.remove('-shared') Chris@87: except ValueError: Chris@87: idx = 0 Chris@87: opt[idx:idx] = ['-dynamiclib', '-Wl,-undefined,dynamic_lookup'] Chris@87: return opt Chris@87: Chris@87: class IntelItaniumFCompiler(IntelFCompiler): Chris@87: compiler_type = 'intele' Chris@87: compiler_aliases = () Chris@87: description = 'Intel Fortran Compiler for Itanium apps' Chris@87: Chris@87: version_match = intel_version_match('Itanium|IA-64') Chris@87: Chris@87: possible_executables = ['ifort', 'efort', 'efc'] Chris@87: Chris@87: executables = { Chris@87: 'version_cmd' : None, Chris@87: 'compiler_f77' : [None, "-FI", "-w90", "-w95"], Chris@87: 'compiler_fix' : [None, "-FI"], Chris@87: 'compiler_f90' : [None], Chris@87: 'linker_so' : ['', "-shared"], Chris@87: 'archiver' : ["ar", "-cr"], Chris@87: 'ranlib' : ["ranlib"] Chris@87: } Chris@87: Chris@87: class IntelEM64TFCompiler(IntelFCompiler): Chris@87: compiler_type = 'intelem' Chris@87: compiler_aliases = () Chris@87: description = 'Intel Fortran Compiler for 64-bit apps' Chris@87: Chris@87: version_match = intel_version_match('EM64T-based|Intel\\(R\\) 64|64|IA-64|64-bit') Chris@87: Chris@87: possible_executables = ['ifort', 'efort', 'efc'] Chris@87: Chris@87: executables = { Chris@87: 'version_cmd' : None, Chris@87: 'compiler_f77' : [None, "-FI"], Chris@87: 'compiler_fix' : [None, "-FI"], Chris@87: 'compiler_f90' : [None], Chris@87: 'linker_so' : ['', "-shared"], Chris@87: 'archiver' : ["ar", "-cr"], Chris@87: 'ranlib' : ["ranlib"] Chris@87: } Chris@87: Chris@87: def get_flags(self): Chris@87: return ['-fPIC'] Chris@87: Chris@87: def get_flags_opt(self): Chris@87: #return ['-i8 -xhost -openmp -fp-model strict'] Chris@87: return ['-xhost -openmp -fp-model strict'] Chris@87: Chris@87: def get_flags_arch(self): Chris@87: return [] Chris@87: Chris@87: # Is there no difference in the version string between the above compilers Chris@87: # and the Visual compilers? Chris@87: Chris@87: class IntelVisualFCompiler(BaseIntelFCompiler): Chris@87: compiler_type = 'intelv' Chris@87: description = 'Intel Visual Fortran Compiler for 32-bit apps' Chris@87: version_match = intel_version_match('32-bit|IA-32') Chris@87: Chris@87: def update_executables(self): Chris@87: f = dummy_fortran_file() Chris@87: self.executables['version_cmd'] = ['', '/FI', '/c', Chris@87: f + '.f', '/o', f + '.o'] Chris@87: Chris@87: ar_exe = 'lib.exe' Chris@87: possible_executables = ['ifort', 'ifl'] Chris@87: Chris@87: executables = { Chris@87: 'version_cmd' : None, Chris@87: 'compiler_f77' : [None, "-FI", "-w90", "-w95"], Chris@87: 'compiler_fix' : [None, "-FI", "-4L72", "-w"], Chris@87: 'compiler_f90' : [None], Chris@87: 'linker_so' : ['', "-shared"], Chris@87: 'archiver' : [ar_exe, "/verbose", "/OUT:"], Chris@87: 'ranlib' : None Chris@87: } Chris@87: Chris@87: compile_switch = '/c ' Chris@87: object_switch = '/Fo' #No space after /Fo! Chris@87: library_switch = '/OUT:' #No space after /OUT:! Chris@87: module_dir_switch = '/module:' #No space after /module: Chris@87: module_include_switch = '/I' Chris@87: Chris@87: def get_flags(self): Chris@87: opt = ['/nologo', '/MD', '/nbs', '/Qlowercase', '/us'] Chris@87: return opt Chris@87: Chris@87: def get_flags_free(self): Chris@87: return ["-FR"] Chris@87: Chris@87: def get_flags_debug(self): Chris@87: return ['/4Yb', '/d2'] Chris@87: Chris@87: def get_flags_opt(self): Chris@87: return ['/O1'] # Scipy test failures with /O2 Chris@87: Chris@87: def get_flags_arch(self): Chris@87: return ["/arch:IA-32", "/QaxSSE3"] Chris@87: Chris@87: class IntelItaniumVisualFCompiler(IntelVisualFCompiler): Chris@87: compiler_type = 'intelev' Chris@87: description = 'Intel Visual Fortran Compiler for Itanium apps' Chris@87: Chris@87: version_match = intel_version_match('Itanium') Chris@87: Chris@87: possible_executables = ['efl'] # XXX this is a wild guess Chris@87: ar_exe = IntelVisualFCompiler.ar_exe Chris@87: Chris@87: executables = { Chris@87: 'version_cmd' : None, Chris@87: 'compiler_f77' : [None, "-FI", "-w90", "-w95"], Chris@87: 'compiler_fix' : [None, "-FI", "-4L72", "-w"], Chris@87: 'compiler_f90' : [None], Chris@87: 'linker_so' : ['', "-shared"], Chris@87: 'archiver' : [ar_exe, "/verbose", "/OUT:"], Chris@87: 'ranlib' : None Chris@87: } Chris@87: Chris@87: class IntelEM64VisualFCompiler(IntelVisualFCompiler): Chris@87: compiler_type = 'intelvem' Chris@87: description = 'Intel Visual Fortran Compiler for 64-bit apps' Chris@87: Chris@87: version_match = simple_version_match(start='Intel\(R\).*?64,') Chris@87: Chris@87: def get_flags_arch(self): Chris@87: return ["/arch:SSE2"] Chris@87: Chris@87: Chris@87: if __name__ == '__main__': Chris@87: from distutils import log Chris@87: log.set_verbosity(2) Chris@87: from numpy.distutils.fcompiler import new_fcompiler Chris@87: compiler = new_fcompiler(compiler='intel') Chris@87: compiler.customize() Chris@87: print(compiler.get_version())