summaryrefslogtreecommitdiff
path: root/numpy/distutils/fcompiler
diff options
context:
space:
mode:
authorxoviat <xoviat@users.noreply.github.com>2017-11-07 14:16:18 -0600
committerxoviat <xoviat@users.noreply.github.com>2017-11-22 17:35:14 -0600
commit3ff922786efcfbee29ae2636be8b381f5e376f69 (patch)
tree7ef490000155d8abc387df99854c7f91538fddc0 /numpy/distutils/fcompiler
parentbc9dc649157dd426202c86d41ce50091243a88b6 (diff)
downloadnumpy-3ff922786efcfbee29ae2636be8b381f5e376f69.tar.gz
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.
Diffstat (limited to 'numpy/distutils/fcompiler')
-rw-r--r--numpy/distutils/fcompiler/__init__.py4
-rw-r--r--numpy/distutils/fcompiler/pg.py118
2 files changed, 102 insertions, 20 deletions
diff --git a/numpy/distutils/fcompiler/__init__.py b/numpy/distutils/fcompiler/__init__.py
index b08751226..c926e7378 100644
--- a/numpy/distutils/fcompiler/__init__.py
+++ b/numpy/distutils/fcompiler/__init__.py
@@ -735,7 +735,7 @@ class FCompiler(CCompiler):
_default_compilers = (
# sys.platform mappings
('win32', ('gnu', 'intelv', 'absoft', 'compaqv', 'intelev', 'gnu95', 'g95',
- 'intelvem', 'intelem')),
+ 'intelvem', 'intelem', 'flang')),
('cygwin.*', ('gnu', 'intelv', 'absoft', 'compaqv', 'intelev', 'gnu95', 'g95')),
('linux.*', ('gnu95', 'intel', 'lahey', 'pg', 'absoft', 'nag', 'vast', 'compaq',
'intele', 'intelem', 'gnu', 'g95', 'pathf95', 'nagfor')),
@@ -838,6 +838,8 @@ def get_default_fcompiler(osname=None, platform=None, requiref90=False,
platform."""
matching_compiler_types = available_fcompilers_for_platform(osname,
platform)
+ log.info("get_default_fcompiler: matching types: '%s'",
+ matching_compiler_types)
compiler_type = _find_existing_fcompiler(matching_compiler_types,
osname=osname,
platform=platform,
diff --git a/numpy/distutils/fcompiler/pg.py b/numpy/distutils/fcompiler/pg.py
index 477ce3d3f..e6c816baa 100644
--- a/numpy/distutils/fcompiler/pg.py
+++ b/numpy/distutils/fcompiler/pg.py
@@ -1,49 +1,55 @@
# http://www.pgroup.com
from __future__ import division, absolute_import, print_function
-from numpy.distutils.fcompiler import FCompiler
+import sys
+import os
+
+from numpy.distutils.fcompiler import FCompiler, dummy_fortran_file
from sys import platform
+from os.path import join, dirname, normpath
+
+compilers = ['PGroupFCompiler', 'PGroupFlangCompiler']
-compilers = ['PGroupFCompiler']
class PGroupFCompiler(FCompiler):
compiler_type = 'pg'
description = 'Portland Group Fortran Compiler'
- version_pattern = r'\s*pg(f77|f90|hpf|fortran) (?P<version>[\d.-]+).*'
+ version_pattern = r'\s*pg(f77|f90|hpf|fortran) (?P<version>[\d.-]+).*'
if platform == 'darwin':
executables = {
- 'version_cmd' : ["<F77>", "-V"],
- 'compiler_f77' : ["pgfortran", "-dynamiclib"],
- 'compiler_fix' : ["pgfortran", "-Mfixed", "-dynamiclib"],
- 'compiler_f90' : ["pgfortran", "-dynamiclib"],
- 'linker_so' : ["libtool"],
- 'archiver' : ["ar", "-cr"],
- 'ranlib' : ["ranlib"]
+ 'version_cmd': ["<F77>", "-V"],
+ 'compiler_f77': ["pgfortran", "-dynamiclib"],
+ 'compiler_fix': ["pgfortran", "-Mfixed", "-dynamiclib"],
+ 'compiler_f90': ["pgfortran", "-dynamiclib"],
+ 'linker_so': ["libtool"],
+ 'archiver': ["ar", "-cr"],
+ 'ranlib': ["ranlib"]
}
pic_flags = ['']
else:
executables = {
- 'version_cmd' : ["<F77>", "-V"],
- 'compiler_f77' : ["pgfortran"],
- 'compiler_fix' : ["pgfortran", "-Mfixed"],
- 'compiler_f90' : ["pgfortran"],
- 'linker_so' : ["pgfortran", "-shared", "-fpic"],
- 'archiver' : ["ar", "-cr"],
- 'ranlib' : ["ranlib"]
+ 'version_cmd': ["<F77>", "-V"],
+ 'compiler_f77': ["pgfortran"],
+ 'compiler_fix': ["pgfortran", "-Mfixed"],
+ 'compiler_f90': ["pgfortran"],
+ 'linker_so': ["pgfortran", "-shared", "-fpic"],
+ 'archiver': ["ar", "-cr"],
+ 'ranlib': ["ranlib"]
}
pic_flags = ['-fpic']
-
module_dir_switch = '-module '
module_include_switch = '-I'
def get_flags(self):
opt = ['-Minform=inform', '-Mnosecond_underscore']
return self.pic_flags + opt
+
def get_flags_opt(self):
return ['-fast']
+
def get_flags_debug(self):
return ['-g']
@@ -54,8 +60,82 @@ class PGroupFCompiler(FCompiler):
def runtime_library_dir_option(self, dir):
return '-R"%s"' % dir
+
+if sys.version_info >= (3, 5):
+ import subprocess
+ import shlex
+ import functools
+
+ class PGroupFlangCompiler(FCompiler):
+ compiler_type = 'flang'
+ description = 'Portland Group Fortran LLVM Compiler'
+ version_pattern = r'\s*(flang|clang) version (?P<version>[\d.-]+).*'
+
+ ar_exe = 'lib.exe'
+ possible_executables = ['flang']
+
+ executables = {
+ 'version_cmd': ["<F77>", "--version"],
+ 'compiler_f77': ["flang"],
+ 'compiler_fix': ["flang"],
+ 'compiler_f90': ["flang"],
+ 'linker_so': [None],
+ 'archiver': [ar_exe, "/verbose", "/OUT:"],
+ 'ranlib': None
+ }
+
+ library_switch = '/OUT:' # No space after /OUT:!
+ module_dir_switch = '-module ' # Don't remove ending space!
+
+ def get_libraries(self):
+ opt = FCompiler.get_libraries(self)
+ opt.extend(['flang', 'flangrti', 'ompstub'])
+ return opt
+
+ @functools.lru_cache(maxsize=128)
+ def get_library_dirs(self):
+ """List of compiler library directories."""
+ opt = FCompiler.get_library_dirs(self)
+ flang_dir = dirname(self.executables['compiler_f77'][0])
+ opt.append(normpath(join(flang_dir, '..', 'lib')))
+
+ return opt
+
+ def get_flags(self):
+ return []
+
+ def get_flags_free(self):
+ return []
+
+ def get_flags_debug(self):
+ return ['-g']
+
+ def get_flags_opt(self):
+ return ['-O3']
+
+ def get_flags_arch(self):
+ return []
+
+ def runtime_library_dir_option(self, dir):
+ raise NotImplementedError
+
+else:
+ from numpy.distutils.fcompiler import CompilerNotFound
+
+ # No point in supporting on older Pythons because not ABI compatible
+ class PGroupFlangCompiler(FCompiler):
+ compiler_type = 'flang'
+ description = 'Portland Group Fortran LLVM Compiler'
+
+ def get_version(self):
+ raise CompilerNotFound('Flang unsupported on Python < 3.5')
+
+
if __name__ == '__main__':
from distutils import log
log.set_verbosity(2)
from numpy.distutils import customized_fcompiler
- print(customized_fcompiler(compiler='pg').get_version())
+ if 'flang' in sys.argv:
+ print(customized_fcompiler(compiler='flang').get_version())
+ else:
+ print(customized_fcompiler(compiler='pg').get_version())