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