diff options
-rwxr-xr-x | lib/spack/env/cc | 8 | ||||
l--------- | lib/spack/env/xl_r/xlc++_r | 1 | ||||
l--------- | lib/spack/env/xl_r/xlc_r | 1 | ||||
l--------- | lib/spack/env/xl_r/xlf90_r | 1 | ||||
l--------- | lib/spack/env/xl_r/xlf_r | 1 | ||||
-rw-r--r-- | lib/spack/spack/compilers/__init__.py | 4 | ||||
-rw-r--r-- | lib/spack/spack/compilers/xl.py | 23 | ||||
-rw-r--r-- | lib/spack/spack/compilers/xl_r.py | 128 |
8 files changed, 158 insertions, 9 deletions
diff --git a/lib/spack/env/cc b/lib/spack/env/cc index c4e51834a5..c0e97f3416 100755 --- a/lib/spack/env/cc +++ b/lib/spack/env/cc @@ -98,25 +98,25 @@ case "$command" in cpp) mode=cpp ;; - cc|c89|c99|gcc|clang|icc|pgcc|xlc) + cc|c89|c99|gcc|clang|icc|pgcc|xlc|xlc_r) command="$SPACK_CC" language="C" comp="CC" lang_flags=C ;; - c++|CC|g++|clang++|icpc|pgc++|xlc++) + c++|CC|g++|clang++|icpc|pgc++|xlc++|xlc++_r) command="$SPACK_CXX" language="C++" comp="CXX" lang_flags=CXX ;; - ftn|f90|fc|f95|gfortran|ifort|pgfortran|xlf90|nagfor) + ftn|f90|fc|f95|gfortran|ifort|pgfortran|xlf90|xlf90_r|nagfor) command="$SPACK_FC" language="Fortran 90" comp="FC" lang_flags=F ;; - f77|gfortran|ifort|pgfortran|xlf|nagfor|ftn) + f77|gfortran|ifort|pgfortran|xlf|xlf_r|nagfor|ftn) command="$SPACK_F77" language="Fortran 77" comp="F77" diff --git a/lib/spack/env/xl_r/xlc++_r b/lib/spack/env/xl_r/xlc++_r new file mode 120000 index 0000000000..82c2b8e90a --- /dev/null +++ b/lib/spack/env/xl_r/xlc++_r @@ -0,0 +1 @@ +../cc
\ No newline at end of file diff --git a/lib/spack/env/xl_r/xlc_r b/lib/spack/env/xl_r/xlc_r new file mode 120000 index 0000000000..82c2b8e90a --- /dev/null +++ b/lib/spack/env/xl_r/xlc_r @@ -0,0 +1 @@ +../cc
\ No newline at end of file diff --git a/lib/spack/env/xl_r/xlf90_r b/lib/spack/env/xl_r/xlf90_r new file mode 120000 index 0000000000..82c2b8e90a --- /dev/null +++ b/lib/spack/env/xl_r/xlf90_r @@ -0,0 +1 @@ +../cc
\ No newline at end of file diff --git a/lib/spack/env/xl_r/xlf_r b/lib/spack/env/xl_r/xlf_r new file mode 120000 index 0000000000..82c2b8e90a --- /dev/null +++ b/lib/spack/env/xl_r/xlf_r @@ -0,0 +1 @@ +../cc
\ No newline at end of file diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index 6e65f50269..731acaf9c2 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -40,6 +40,7 @@ from spack.util.naming import mod_to_class _imported_compilers_module = 'spack.compilers' _path_instance_vars = ['cc', 'cxx', 'f77', 'fc'] +_flags_instance_vars = ['cflags', 'cppflags', 'cxxflags', 'fflags'] _other_instance_vars = ['modules', 'operating_system', 'environment', 'extra_rpaths'] _cache_config_file = [] @@ -60,6 +61,9 @@ def _to_dict(compiler): d['paths'] = dict((attr, getattr(compiler, attr, None)) for attr in _path_instance_vars) d['flags'] = dict((fname, fvals) for fname, fvals in compiler.flags) + d['flags'].update(dict((attr, getattr(compiler, attr, None)) + for attr in _flags_instance_vars + if hasattr(compiler, attr))) d['operating_system'] = str(compiler.operating_system) d['target'] = str(compiler.target) d['modules'] = compiler.modules if compiler.modules else [] diff --git a/lib/spack/spack/compilers/xl.py b/lib/spack/spack/compilers/xl.py index f4b7c4237d..77a5ed7acd 100644 --- a/lib/spack/spack/compilers/xl.py +++ b/lib/spack/spack/compilers/xl.py @@ -29,17 +29,16 @@ from spack.version import ver class Xl(Compiler): # Subclasses use possible names of C compiler - cc_names = ['xlc', 'xlc_r'] + cc_names = ['xlc'] # Subclasses use possible names of C++ compiler - cxx_names = ['xlC', 'xlC_r', 'xlc++', 'xlc++_r'] + cxx_names = ['xlC', 'xlc++'] # Subclasses use possible names of Fortran 77 compiler - f77_names = ['xlf', 'xlf_r'] + f77_names = ['xlf'] # Subclasses use possible names of Fortran 90 compiler - fc_names = ['xlf90', 'xlf90_r', 'xlf95', 'xlf95_r', - 'xlf2003', 'xlf2003_r', 'xlf2008', 'xlf2008_r'] + fc_names = ['xlf90', 'xlf95', 'xlf2003', 'xlf2008'] # Named wrapper links within spack.build_env_path link_paths = {'cc': 'xl/xlc', @@ -62,6 +61,20 @@ class Xl(Compiler): def pic_flag(self): return "-qpic" + @property + def fflags(self): + # The -qzerosize flag is effective only for the Fortran 77 + # compilers and allows the use of zero size objects. + # For Fortran 90 and beyond, it is set by default and has not impact. + # Its use has no negative side effects. + # The -qstrict flag allows the Fortran 90+ compilers to parse the + # source files using fixed form rule. As a result, if -qfixed is in + # effect, free form files (that are not also fixed form files) will + # fail to compile regardless of the compiler invocation command. + # Use the -qfree flag in the packages' configuration file to undo the + # -qfixed flag, as the last one wins. + return "-qzerosize -qfixed" + @classmethod def default_version(cls, comp): """The '-qversion' is the standard option fo XL compilers. diff --git a/lib/spack/spack/compilers/xl_r.py b/lib/spack/spack/compilers/xl_r.py new file mode 100644 index 0000000000..ca76f219ce --- /dev/null +++ b/lib/spack/spack/compilers/xl_r.py @@ -0,0 +1,128 @@ +############################################################################## +# Copyright (c) 2016, International Business Machines Corporation +# +# This file is part of Spack. +# Created by Serban Maerean, serban@us.ibm.com based on a similar file, +# spack/lib/spack/spack/compilers/xl.py, produced by Todd Gamblin, +# tgamblin@llnl.gov, All rights reserved. +# LLNL-CODE-647188 +# +# For details, see https://github.com/llnl/spack +# Please also see the LICENSE file for our notice and the LGPL. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License (as +# published by the Free Software Foundation) version 2.1, February 1999. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and +# conditions of the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +############################################################################## +from spack.compiler import * +import llnl.util.tty as tty +from spack.version import ver + + +class XlR(Compiler): + # Subclasses use possible names of C compiler + cc_names = ['xlc_r'] + + # Subclasses use possible names of C++ compiler + cxx_names = ['xlC_r', 'xlc++_r'] + + # Subclasses use possible names of Fortran 77 compiler + f77_names = ['xlf_r'] + + # Subclasses use possible names of Fortran 90 compiler + fc_names = ['xlf90_r', 'xlf95_r', 'xlf2003_r', 'xlf2008_r'] + + # Named wrapper links within spack.build_env_path + link_paths = {'cc': 'xl_r/xlc_r', + 'cxx': 'xl_r/xlc++_r', + 'f77': 'xl_r/xlf_r', + 'fc': 'xl_r/xlf90_r'} + + @property + def openmp_flag(self): + return "-qsmp=omp" + + @property + def cxx11_flag(self): + if self.version < ver('13.1'): + tty.die("Only xlC 13.1 and above have some c++11 support.") + else: + return "-qlanglvl=extended0x" + + @property + def pic_flag(self): + return("-qpic") + + @property + def fflags(self): + # The -qzerosize flag is effective only for the Fortran 77 + # compilers and allows the use of zero size objects. + # For Fortran 90 and beyond, it is set by default and has not impact. + # Its use has no negative side effects. + # The -qstrict flag allows the Fortran 90+ compilers to parse the + # source files using fixed form rule. As a result, if -qfixed is in + # effect, free form files (that are not also fixed form files) will + # fail to compile regardless of the compiler invocation command. + # Use the -qfree flag in the packages' configuration file to undo the + # -qfixed flag, as the last one wins. + return "-qzerosize -qfixed" + + @classmethod + def default_version(self, comp): + """The '-qversion' is the standard option fo XL compilers. + Output looks like this:: + + IBM XL C/C++ for Linux, V11.1 (5724-X14) + Version: 11.01.0000.0000 + + or:: + + IBM XL Fortran for Linux, V13.1 (5724-X16) + Version: 13.01.0000.0000 + + or:: + + IBM XL C/C++ for AIX, V11.1 (5724-X13) + Version: 11.01.0000.0009 + + or:: + + IBM XL C/C++ Advanced Edition for Blue Gene/P, V9.0 + Version: 09.00.0000.0017 + """ + + return get_compiler_version( + comp, '-qversion', r'([0-9]?[0-9]\.[0-9])') + + @classmethod + def fc_version(cls, fc): + """The fortran and C/C++ versions of the XL compiler are always + two units apart. By this we mean that the fortran release that + goes with XL C/C++ 11.1 is 13.1. Having such a difference in + version number is confusing spack quite a lot. Most notably + if you keep the versions as is the default xl compiler will + only have fortran and no C/C++. So we associate the Fortran + compiler with the version associated to the C/C++ compiler. + One last stumble. Version numbers over 10 have at least a .1 + those under 10 a .0. There is no xlf 9.x or under currently + available. BG/P and BG/L can such a compiler mix and possibly + older version of AIX and linux on power. + """ + fver = get_compiler_version(fc, '-qversion', r'([0-9]?[0-9]\.[0-9])') + cver = float(fver) - 2 + if cver < 10: + cver = cver - 0.1 + return str(cver) + + @classmethod + def f77_version(cls, f77): + return cls.fc_version(f77) |