diff options
author | xoviat <xoviat@users.noreply.github.com> | 2017-11-07 14:16:18 -0600 |
---|---|---|
committer | xoviat <xoviat@users.noreply.github.com> | 2017-11-22 17:35:14 -0600 |
commit | 3ff922786efcfbee29ae2636be8b381f5e376f69 (patch) | |
tree | 7ef490000155d8abc387df99854c7f91538fddc0 /numpy/distutils/fcompiler | |
parent | bc9dc649157dd426202c86d41ce50091243a88b6 (diff) | |
download | numpy-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__.py | 4 | ||||
-rw-r--r-- | numpy/distutils/fcompiler/pg.py | 118 |
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()) |