8000 ENH: disutils: add the flang compiler · numpy/numpy@3ff9227 · GitHub
[go: up one dir, main page]

Skip to content

Commit 3ff9227

Browse files
committed
ENH: disutils: add the flang compiler
Flang is the first CRT-compatbile compiler for windows. It's added for Python versions with a compatible ABI. Future work may include adding it for other platforms.
1 parent bc9dc64 commit 3ff9227

File tree

2 files changed

+102
-20
lines changed

2 files changed

+102
-20
lines changed

numpy/distutils/fcompiler/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,7 @@ def wrap_unlinkable_objects(self, objects, output_dir, extra_dll_dir):
735735
_default_compilers = (
736736
# sys.platform mappings
737737
('win32', ('gnu', 'intelv', 'absoft', 'compaqv', 'intelev', 'gnu95', 'g95',
738-
'intelvem', 'intelem')),
738+
'intelvem', 'intelem', 'flang')),
739739
('cygwin.*', ('gnu', 'intelv', 'absoft', 'compaqv', 'intelev', 'gnu95', 'g95')),
740740
('linux.*', ('gnu95', 'i 8000 ntel', 'lahey', 'pg', 'absoft', 'nag', 'vast', 'compaq',
741741
'intele', 'intelem', 'gnu', 'g95', 'pathf95', 'nagfor')),
@@ -838,6 +838,8 @@ def get_default_fcompiler(osname=None, platform=None, requiref90=False,
838838
platform."""
839839
matching_compiler_types = available_fcompilers_for_platform(osname,
840840
platform)
841+
log.info("get_default_fcompiler: matching types: '%s'",
842+
matching_compiler_types)
841843
compiler_type = _find_existing_fcompiler(matching_compiler_types,
842844
osname=osname,
843845
platform=platform,

numpy/distutils/fcompiler/pg.py

Lines changed: 99 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,55 @@
11
# http://www.pgroup.com
22
from __future__ import division, absolute_import, print_function
33

4-
from numpy.distutils.fcompiler import FCompiler
4+
import sys
5+
import os
6+
7+
from numpy.distutils.fcompiler import FCompiler, dummy_fortran_file
58
from sys import platform
9+
from os.path import join, dirname, normpath
10+
11+
compilers = ['PGroupFCompiler', 'PGroupFlangCompiler']
612

7-
compilers = ['PGroupFCompiler']
813

914
class PGroupFCompiler(FCompiler):
1015

1116
compiler_type = 'pg'
1217
description = 'Portland Group Fortran Compiler'
13-
version_pattern = r'\s*pg(f77|f90|hpf|fortran) (?P<version>[\d.-]+).*'
18+
version_pattern = r'\s*pg(f77|f90|hpf|fortran) (?P<version>[\d.-]+).*'
1419

1520
if platform == 'darwin':
1621
executables = {
17-
'version_cmd' : ["<F77>", "-V"],
18-
'compiler_f77' : ["pgfortran", "-dynamiclib"],
19-
'compiler_fix' : ["pgfortran", "-Mfixed", "-dynamiclib"],
20-
'compiler_f90' : ["pgfortran", "-dynamiclib"],
21-
'linker_so' : ["libtool"],
22-
'archiver' : [ 8000 "ar", "-cr"],
23-
'ranlib' : ["ranlib"]
22+
'version_cmd': ["<F77>", "-V"],
23+
'compiler_f77': ["pgfortran", "-dynamiclib"],
24+
'compiler_fix': ["pgfortran", "-Mfixed", "-dynamiclib"],
25+
'compiler_f90': ["pgfortran", "-dynamiclib"],
26+
'linker_so': ["libtool"],
27+
'archiver': ["ar", "-cr"],
28+
'ranlib': ["ranlib"]
2429
}
2530
pic_flags = ['']
2631
else:
2732
executables = {
28-
'version_cmd' : ["<F77>", "-V"],
29-
'compiler_f77' : ["pgfortran"],
30-
'compiler_fix' : ["pgfortran", "-Mfixed"],
31-
'compiler_f90' : ["pgfortran"],
32-
'linker_so' : ["pgfortran", "-shared", "-fpic"],
33-
'archiver' : ["ar", "-cr"],
34-
'ranlib' : ["ranlib"]
33+
'version_cmd': ["<F77>", "-V"],
34+
'compiler_f77': ["pgfortran"],
35+
'compiler_fix': ["pgfortran", "-Mfixed"],
36+
'compiler_f90': ["pgfortran"],
37+
'linker_so': ["pgfortran", "-shared", "-fpic"],
38+
'archiver': ["ar", "-cr"],
39+
'ranlib': ["ranlib"]
3540
}
3641
pic_flags = ['-fpic']
3742

38-
3943
module_dir_switch = '-module '
4044
module_include_switch = '-I'
4145

4246
def get_flags(self):
4347
opt = ['-Minform=inform', '-Mnosecond_underscore']
4448
return self.pic_flags + opt
49+
4550
def get_flags_opt(self):
4651
return ['-fast']
52+
4753
def get_flags_debug(self):
4854
return ['-g']
4955

@@ -54,8 +60,82 @@ def get_flags_linker_so(self):
5460
def runtime_library_dir_option(self, dir):
5561
return '-R"%s"' % dir
5662

63+
64+
if sys.version_info >= (3, 5):
65+
import subprocess
66+
import shlex
67+
import functools
68+
69+
class PGroupFlangCompiler(FCompiler):
70+
compiler_type = 'flang'
71+
description = 'Portland Group Fortran LLVM Compiler'
72+
version_pattern = r'\s*(flang|clang) version (?P<version>[\d.-]+).*'
73+
74+
ar_exe = 'lib.exe'
75+
possible_executables = ['flang']
76+
77+
executables = {
78+
'version_cmd': ["<F77>", "--version"],
79+
'compiler_f77': ["flang"],
80+
'compiler_fix': ["flang"],
81+
'compiler_f90': ["flang"],
82+
'linker_so': [None],
83+
'archiver': [ar_exe, "/verbose", "/OUT:"],
84+
'ranlib': None
85+
}
86+
87+
library_switch = '/OUT:' # No space after /OUT:!
88+
module_dir_switch = '-module ' # Don't remove ending space!
89+
90+
def get_libraries(self):
91+
opt = FCompiler.get_libraries(self)
92+
opt.extend(['flang', 'flangrti', 'ompstub'])
93+
return opt
94+
95+
@functools.lru_cache(maxsize=128)
96+
def get_library_dirs(self):
97+
"""List of compiler library directories."""
98+
opt = FCompiler.get_library_dirs(self)
99+
flang_dir = dirname(self.executables['compiler_f77'][0])
100+
opt.append(normpath(join(flang_dir, '..', 'lib')))
101+
102+
return opt
103+
104+
def get_flags(self):
105+
return []
106+
107+
def get_flags_free(self):
108+
return []
109+
110+
def get_flags_debug(self):
111+
return ['-g']
112+
113+
def get_flags_opt(self):
114+
return ['-O3']
115+
116+
def get_flags_arch(self):
117+
return []
118+
119+
def runtime_library_dir_option(self, dir):
120+
raise NotImplementedError
121+
122+
else:
123+
from numpy.distutils.fcompiler import CompilerNotFound
124+
125+
# No point in supporting on older Pythons because not ABI compatible
126+
class PGroupFlangCompiler(FCompiler):
127+
compiler_type = 'flang'
128+
description = 'Portland Group Fortran LLVM Compiler'
129+
130+
def get_version(self):
131+
raise CompilerNotFound('Flang unsupported on Python < 3.5')
132+
133+
57134
if __name__ == '__main__':
58135
from distutils import log
59136
log.set_verbosity(2)
60137
from numpy.distutils import customized_fcompiler
61-
print(customized_fcompiler(compiler='pg').get_version())
138+
if 'flang' in sys.argv:
139+
print(customized_fcompiler(compiler='flang').get_version())
140+
else:
141+
print(customized_fcompiler(compiler='pg').get_version())

0 commit comments

Comments
 (0)
0