Chris@87
|
1 # http://developer.intel.com/software/products/compilers/flin/
|
Chris@87
|
2 from __future__ import division, absolute_import, print_function
|
Chris@87
|
3
|
Chris@87
|
4 import sys
|
Chris@87
|
5
|
Chris@87
|
6 from numpy.distutils.ccompiler import simple_version_match
|
Chris@87
|
7 from numpy.distutils.fcompiler import FCompiler, dummy_fortran_file
|
Chris@87
|
8
|
Chris@87
|
9 compilers = ['IntelFCompiler', 'IntelVisualFCompiler',
|
Chris@87
|
10 'IntelItaniumFCompiler', 'IntelItaniumVisualFCompiler',
|
Chris@87
|
11 'IntelEM64VisualFCompiler', 'IntelEM64TFCompiler']
|
Chris@87
|
12
|
Chris@87
|
13 def intel_version_match(type):
|
Chris@87
|
14 # Match against the important stuff in the version string
|
Chris@87
|
15 return simple_version_match(start=r'Intel.*?Fortran.*?(?:%s).*?Version' % (type,))
|
Chris@87
|
16
|
Chris@87
|
17 class BaseIntelFCompiler(FCompiler):
|
Chris@87
|
18 def update_executables(self):
|
Chris@87
|
19 f = dummy_fortran_file()
|
Chris@87
|
20 self.executables['version_cmd'] = ['<F77>', '-FI', '-V', '-c',
|
Chris@87
|
21 f + '.f', '-o', f + '.o']
|
Chris@87
|
22
|
Chris@87
|
23 class IntelFCompiler(BaseIntelFCompiler):
|
Chris@87
|
24
|
Chris@87
|
25 compiler_type = 'intel'
|
Chris@87
|
26 compiler_aliases = ('ifort',)
|
Chris@87
|
27 description = 'Intel Fortran Compiler for 32-bit apps'
|
Chris@87
|
28 version_match = intel_version_match('32-bit|IA-32')
|
Chris@87
|
29
|
Chris@87
|
30 possible_executables = ['ifort', 'ifc']
|
Chris@87
|
31
|
Chris@87
|
32 executables = {
|
Chris@87
|
33 'version_cmd' : None, # set by update_executables
|
Chris@87
|
34 'compiler_f77' : [None, "-72", "-w90", "-w95"],
|
Chris@87
|
35 'compiler_f90' : [None],
|
Chris@87
|
36 'compiler_fix' : [None, "-FI"],
|
Chris@87
|
37 'linker_so' : ["<F90>", "-shared"],
|
Chris@87
|
38 'archiver' : ["ar", "-cr"],
|
Chris@87
|
39 'ranlib' : ["ranlib"]
|
Chris@87
|
40 }
|
Chris@87
|
41
|
Chris@87
|
42 pic_flags = ['-fPIC']
|
Chris@87
|
43 module_dir_switch = '-module ' # Don't remove ending space!
|
Chris@87
|
44 module_include_switch = '-I'
|
Chris@87
|
45
|
Chris@87
|
46 def get_flags_free(self):
|
Chris@87
|
47 return ["-FR"]
|
Chris@87
|
48
|
Chris@87
|
49 def get_flags(self):
|
Chris@87
|
50 return ['-fPIC']
|
Chris@87
|
51
|
Chris@87
|
52 def get_flags_opt(self):
|
Chris@87
|
53 #return ['-i8 -xhost -openmp -fp-model strict']
|
Chris@87
|
54 return ['-xhost -openmp -fp-model strict']
|
Chris@87
|
55
|
Chris@87
|
56 def get_flags_arch(self):
|
Chris@87
|
57 return []
|
Chris@87
|
58
|
Chris@87
|
59 def get_flags_linker_so(self):
|
Chris@87
|
60 opt = FCompiler.get_flags_linker_so(self)
|
Chris@87
|
61 v = self.get_version()
|
Chris@87
|
62 if v and v >= '8.0':
|
Chris@87
|
63 opt.append('-nofor_main')
|
Chris@87
|
64 if sys.platform == 'darwin':
|
Chris@87
|
65 # Here, it's -dynamiclib
|
Chris@87
|
66 try:
|
Chris@87
|
67 idx = opt.index('-shared')
|
Chris@87
|
68 opt.remove('-shared')
|
Chris@87
|
69 except ValueError:
|
Chris@87
|
70 idx = 0
|
Chris@87
|
71 opt[idx:idx] = ['-dynamiclib', '-Wl,-undefined,dynamic_lookup']
|
Chris@87
|
72 return opt
|
Chris@87
|
73
|
Chris@87
|
74 class IntelItaniumFCompiler(IntelFCompiler):
|
Chris@87
|
75 compiler_type = 'intele'
|
Chris@87
|
76 compiler_aliases = ()
|
Chris@87
|
77 description = 'Intel Fortran Compiler for Itanium apps'
|
Chris@87
|
78
|
Chris@87
|
79 version_match = intel_version_match('Itanium|IA-64')
|
Chris@87
|
80
|
Chris@87
|
81 possible_executables = ['ifort', 'efort', 'efc']
|
Chris@87
|
82
|
Chris@87
|
83 executables = {
|
Chris@87
|
84 'version_cmd' : None,
|
Chris@87
|
85 'compiler_f77' : [None, "-FI", "-w90", "-w95"],
|
Chris@87
|
86 'compiler_fix' : [None, "-FI"],
|
Chris@87
|
87 'compiler_f90' : [None],
|
Chris@87
|
88 'linker_so' : ['<F90>', "-shared"],
|
Chris@87
|
89 'archiver' : ["ar", "-cr"],
|
Chris@87
|
90 'ranlib' : ["ranlib"]
|
Chris@87
|
91 }
|
Chris@87
|
92
|
Chris@87
|
93 class IntelEM64TFCompiler(IntelFCompiler):
|
Chris@87
|
94 compiler_type = 'intelem'
|
Chris@87
|
95 compiler_aliases = ()
|
Chris@87
|
96 description = 'Intel Fortran Compiler for 64-bit apps'
|
Chris@87
|
97
|
Chris@87
|
98 version_match = intel_version_match('EM64T-based|Intel\\(R\\) 64|64|IA-64|64-bit')
|
Chris@87
|
99
|
Chris@87
|
100 possible_executables = ['ifort', 'efort', 'efc']
|
Chris@87
|
101
|
Chris@87
|
102 executables = {
|
Chris@87
|
103 'version_cmd' : None,
|
Chris@87
|
104 'compiler_f77' : [None, "-FI"],
|
Chris@87
|
105 'compiler_fix' : [None, "-FI"],
|
Chris@87
|
106 'compiler_f90' : [None],
|
Chris@87
|
107 'linker_so' : ['<F90>', "-shared"],
|
Chris@87
|
108 'archiver' : ["ar", "-cr"],
|
Chris@87
|
109 'ranlib' : ["ranlib"]
|
Chris@87
|
110 }
|
Chris@87
|
111
|
Chris@87
|
112 def get_flags(self):
|
Chris@87
|
113 return ['-fPIC']
|
Chris@87
|
114
|
Chris@87
|
115 def get_flags_opt(self):
|
Chris@87
|
116 #return ['-i8 -xhost -openmp -fp-model strict']
|
Chris@87
|
117 return ['-xhost -openmp -fp-model strict']
|
Chris@87
|
118
|
Chris@87
|
119 def get_flags_arch(self):
|
Chris@87
|
120 return []
|
Chris@87
|
121
|
Chris@87
|
122 # Is there no difference in the version string between the above compilers
|
Chris@87
|
123 # and the Visual compilers?
|
Chris@87
|
124
|
Chris@87
|
125 class IntelVisualFCompiler(BaseIntelFCompiler):
|
Chris@87
|
126 compiler_type = 'intelv'
|
Chris@87
|
127 description = 'Intel Visual Fortran Compiler for 32-bit apps'
|
Chris@87
|
128 version_match = intel_version_match('32-bit|IA-32')
|
Chris@87
|
129
|
Chris@87
|
130 def update_executables(self):
|
Chris@87
|
131 f = dummy_fortran_file()
|
Chris@87
|
132 self.executables['version_cmd'] = ['<F77>', '/FI', '/c',
|
Chris@87
|
133 f + '.f', '/o', f + '.o']
|
Chris@87
|
134
|
Chris@87
|
135 ar_exe = 'lib.exe'
|
Chris@87
|
136 possible_executables = ['ifort', 'ifl']
|
Chris@87
|
137
|
Chris@87
|
138 executables = {
|
Chris@87
|
139 'version_cmd' : None,
|
Chris@87
|
140 'compiler_f77' : [None, "-FI", "-w90", "-w95"],
|
Chris@87
|
141 'compiler_fix' : [None, "-FI", "-4L72", "-w"],
|
Chris@87
|
142 'compiler_f90' : [None],
|
Chris@87
|
143 'linker_so' : ['<F90>', "-shared"],
|
Chris@87
|
144 'archiver' : [ar_exe, "/verbose", "/OUT:"],
|
Chris@87
|
145 'ranlib' : None
|
Chris@87
|
146 }
|
Chris@87
|
147
|
Chris@87
|
148 compile_switch = '/c '
|
Chris@87
|
149 object_switch = '/Fo' #No space after /Fo!
|
Chris@87
|
150 library_switch = '/OUT:' #No space after /OUT:!
|
Chris@87
|
151 module_dir_switch = '/module:' #No space after /module:
|
Chris@87
|
152 module_include_switch = '/I'
|
Chris@87
|
153
|
Chris@87
|
154 def get_flags(self):
|
Chris@87
|
155 opt = ['/nologo', '/MD', '/nbs', '/Qlowercase', '/us']
|
Chris@87
|
156 return opt
|
Chris@87
|
157
|
Chris@87
|
158 def get_flags_free(self):
|
Chris@87
|
159 return ["-FR"]
|
Chris@87
|
160
|
Chris@87
|
161 def get_flags_debug(self):
|
Chris@87
|
162 return ['/4Yb', '/d2']
|
Chris@87
|
163
|
Chris@87
|
164 def get_flags_opt(self):
|
Chris@87
|
165 return ['/O1'] # Scipy test failures with /O2
|
Chris@87
|
166
|
Chris@87
|
167 def get_flags_arch(self):
|
Chris@87
|
168 return ["/arch:IA-32", "/QaxSSE3"]
|
Chris@87
|
169
|
Chris@87
|
170 class IntelItaniumVisualFCompiler(IntelVisualFCompiler):
|
Chris@87
|
171 compiler_type = 'intelev'
|
Chris@87
|
172 description = 'Intel Visual Fortran Compiler for Itanium apps'
|
Chris@87
|
173
|
Chris@87
|
174 version_match = intel_version_match('Itanium')
|
Chris@87
|
175
|
Chris@87
|
176 possible_executables = ['efl'] # XXX this is a wild guess
|
Chris@87
|
177 ar_exe = IntelVisualFCompiler.ar_exe
|
Chris@87
|
178
|
Chris@87
|
179 executables = {
|
Chris@87
|
180 'version_cmd' : None,
|
Chris@87
|
181 'compiler_f77' : [None, "-FI", "-w90", "-w95"],
|
Chris@87
|
182 'compiler_fix' : [None, "-FI", "-4L72", "-w"],
|
Chris@87
|
183 'compiler_f90' : [None],
|
Chris@87
|
184 'linker_so' : ['<F90>', "-shared"],
|
Chris@87
|
185 'archiver' : [ar_exe, "/verbose", "/OUT:"],
|
Chris@87
|
186 'ranlib' : None
|
Chris@87
|
187 }
|
Chris@87
|
188
|
Chris@87
|
189 class IntelEM64VisualFCompiler(IntelVisualFCompiler):
|
Chris@87
|
190 compiler_type = 'intelvem'
|
Chris@87
|
191 description = 'Intel Visual Fortran Compiler for 64-bit apps'
|
Chris@87
|
192
|
Chris@87
|
193 version_match = simple_version_match(start='Intel\(R\).*?64,')
|
Chris@87
|
194
|
Chris@87
|
195 def get_flags_arch(self):
|
Chris@87
|
196 return ["/arch:SSE2"]
|
Chris@87
|
197
|
Chris@87
|
198
|
Chris@87
|
199 if __name__ == '__main__':
|
Chris@87
|
200 from distutils import log
|
Chris@87
|
201 log.set_verbosity(2)
|
Chris@87
|
202 from numpy.distutils.fcompiler import new_fcompiler
|
Chris@87
|
203 compiler = new_fcompiler(compiler='intel')
|
Chris@87
|
204 compiler.customize()
|
Chris@87
|
205 print(compiler.get_version())
|