1import platform
2
3from distutils.unixccompiler import UnixCCompiler
4from numpy.distutils.exec_command import find_executable
5from numpy.distutils.ccompiler import simple_version_match
6if platform.system() == 'Windows':
7    from numpy.distutils.msvc9compiler import MSVCCompiler
8
9
10class IntelCCompiler(UnixCCompiler):
11    """A modified Intel compiler compatible with a GCC-built Python."""
12    compiler_type = 'intel'
13    cc_exe = 'icc'
14    cc_args = 'fPIC'
15
16    def __init__(self, verbose=0, dry_run=0, force=0):
17        UnixCCompiler.__init__(self, verbose, dry_run, force)
18
19        v = self.get_version()
20        mpopt = 'openmp' if v and v < '15' else 'qopenmp'
21        self.cc_exe = ('icc -fPIC -fp-model strict -O3 '
22                       '-fomit-frame-pointer -{}').format(mpopt)
23        compiler = self.cc_exe
24
25        if platform.system() == 'Darwin':
26            shared_flag = '-Wl,-undefined,dynamic_lookup'
27        else:
28            shared_flag = '-shared'
29        self.set_executables(compiler=compiler,
30                             compiler_so=compiler,
31                             compiler_cxx=compiler,
32                             archiver='xiar' + ' cru',
33                             linker_exe=compiler + ' -shared-intel',
34                             linker_so=compiler + ' ' + shared_flag +
35                             ' -shared-intel')
36
37
38class IntelItaniumCCompiler(IntelCCompiler):
39    compiler_type = 'intele'
40
41    # On Itanium, the Intel Compiler used to be called ecc, let's search for
42    # it (now it's also icc, so ecc is last in the search).
43    for cc_exe in map(find_executable, ['icc', 'ecc']):
44        if cc_exe:
45            break
46
47
48class IntelEM64TCCompiler(UnixCCompiler):
49    """
50    A modified Intel x86_64 compiler compatible with a 64bit GCC-built Python.
51    """
52    compiler_type = 'intelem'
53    cc_exe = 'icc -m64'
54    cc_args = '-fPIC'
55
56    def __init__(self, verbose=0, dry_run=0, force=0):
57        UnixCCompiler.__init__(self, verbose, dry_run, force)
58
59        v = self.get_version()
60        mpopt = 'openmp' if v and v < '15' else 'qopenmp'
61        self.cc_exe = ('icc -m64 -fPIC -fp-model strict -O3 '
62                       '-fomit-frame-pointer -{}').format(mpopt)
63        compiler = self.cc_exe
64
65        if platform.system() == 'Darwin':
66            shared_flag = '-Wl,-undefined,dynamic_lookup'
67        else:
68            shared_flag = '-shared'
69        self.set_executables(compiler=compiler,
70                             compiler_so=compiler,
71                             compiler_cxx=compiler,
72                             archiver='xiar' + ' cru',
73                             linker_exe=compiler + ' -shared-intel',
74                             linker_so=compiler + ' ' + shared_flag +
75                             ' -shared-intel')
76
77
78if platform.system() == 'Windows':
79    class IntelCCompilerW(MSVCCompiler):
80        """
81        A modified Intel compiler compatible with an MSVC-built Python.
82        """
83        compiler_type = 'intelw'
84        compiler_cxx = 'icl'
85
86        def __init__(self, verbose=0, dry_run=0, force=0):
87            MSVCCompiler.__init__(self, verbose, dry_run, force)
88            version_match = simple_version_match(start=r'Intel\(R\).*?32,')
89            self.__version = version_match
90
91        def initialize(self, plat_name=None):
92            MSVCCompiler.initialize(self, plat_name)
93            self.cc = self.find_exe('icl.exe')
94            self.lib = self.find_exe('xilib')
95            self.linker = self.find_exe('xilink')
96            self.compile_options = ['/nologo', '/O3', '/MD', '/W3',
97                                    '/Qstd=c99']
98            self.compile_options_debug = ['/nologo', '/Od', '/MDd', '/W3',
99                                          '/Qstd=c99', '/Z7', '/D_DEBUG']
100
101    class IntelEM64TCCompilerW(IntelCCompilerW):
102        """
103        A modified Intel x86_64 compiler compatible with
104        a 64bit MSVC-built Python.
105        """
106        compiler_type = 'intelemw'
107
108        def __init__(self, verbose=0, dry_run=0, force=0):
109            MSVCCompiler.__init__(self, verbose, dry_run, force)
110            version_match = simple_version_match(start=r'Intel\(R\).*?64,')
111            self.__version = version_match
112