Merge pull request #882 from davydden/openmp_compiler_flag
Compiler::openmp_flag()
This commit is contained in:
commit
cbae98670b
@ -1831,6 +1831,25 @@ successfully find ``libdwarf.h`` and ``libdwarf.so``, without the
|
|||||||
packager having to provide ``--with-libdwarf=/path/to/libdwarf`` on
|
packager having to provide ``--with-libdwarf=/path/to/libdwarf`` on
|
||||||
the command line.
|
the command line.
|
||||||
|
|
||||||
|
Compiler flags
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
In rare circumstances such as compiling and running small unit tests, a package
|
||||||
|
developer may need to know what are the appropriate compiler flags to enable
|
||||||
|
features like ``OpenMP``, ``c++11``, ``c++14`` and alike. To that end the
|
||||||
|
compiler classes in ``spack`` implement the following _properties_ :
|
||||||
|
``openmp_flag``, ``cxx11_flag``, ``cxx14_flag``, which can be accessed in a
|
||||||
|
package by ``self.compiler.cxx11_flag`` and alike. Note that the implementation
|
||||||
|
is such that if a given compiler version does not support this feature, an
|
||||||
|
error will be produced. Therefore package developers can also use these properties
|
||||||
|
to assert that a compiler supports the requested feature. This is handy when a
|
||||||
|
package supports additional variants like
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
variant('openmp', default=True, description="Enable OpenMP support.")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Message Parsing Interface (MPI)
|
Message Parsing Interface (MPI)
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
It is common for high performance computing software/packages to use ``MPI``.
|
It is common for high performance computing software/packages to use ``MPI``.
|
||||||
|
@ -94,12 +94,6 @@ class Compiler(object):
|
|||||||
# Names of generic arguments used by this compiler
|
# Names of generic arguments used by this compiler
|
||||||
arg_rpath = '-Wl,-rpath,%s'
|
arg_rpath = '-Wl,-rpath,%s'
|
||||||
|
|
||||||
# argument used to get C++11 options
|
|
||||||
cxx11_flag = "-std=c++11"
|
|
||||||
|
|
||||||
# argument used to get C++14 options
|
|
||||||
cxx14_flag = "-std=c++1y"
|
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, cspec, cc, cxx, f77, fc):
|
def __init__(self, cspec, cc, cxx, f77, fc):
|
||||||
def check(exe):
|
def check(exe):
|
||||||
@ -120,6 +114,37 @@ def check(exe):
|
|||||||
def version(self):
|
def version(self):
|
||||||
return self.spec.version
|
return self.spec.version
|
||||||
|
|
||||||
|
# This property should be overridden in the compiler subclass if
|
||||||
|
# OpenMP is supported by that compiler
|
||||||
|
@property
|
||||||
|
def openmp_flag(self):
|
||||||
|
# If it is not overridden, assume it is not supported and warn the user
|
||||||
|
tty.die("The compiler you have chosen does not currently support OpenMP.",
|
||||||
|
"If you think it should, please edit the compiler subclass and",
|
||||||
|
"submit a pull request or issue.")
|
||||||
|
|
||||||
|
|
||||||
|
# This property should be overridden in the compiler subclass if
|
||||||
|
# C++11 is supported by that compiler
|
||||||
|
@property
|
||||||
|
def cxx11_flag(self):
|
||||||
|
# If it is not overridden, assume it is not supported and warn the user
|
||||||
|
tty.die("The compiler you have chosen does not currently support C++11.",
|
||||||
|
"If you think it should, please edit the compiler subclass and",
|
||||||
|
"submit a pull request or issue.")
|
||||||
|
|
||||||
|
|
||||||
|
# This property should be overridden in the compiler subclass if
|
||||||
|
# C++14 is supported by that compiler
|
||||||
|
@property
|
||||||
|
def cxx14_flag(self):
|
||||||
|
# If it is not overridden, assume it is not supported and warn the user
|
||||||
|
tty.die("The compiler you have chosen does not currently support C++14.",
|
||||||
|
"If you think it should, please edit the compiler subclass and",
|
||||||
|
"submit a pull request or issue.")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Compiler classes have methods for querying the version of
|
# Compiler classes have methods for querying the version of
|
||||||
# specific compiler executables. This is used when discovering compilers.
|
# specific compiler executables. This is used when discovering compilers.
|
||||||
|
@ -26,6 +26,8 @@
|
|||||||
import spack.compiler as cpr
|
import spack.compiler as cpr
|
||||||
from spack.compiler import *
|
from spack.compiler import *
|
||||||
from spack.util.executable import *
|
from spack.util.executable import *
|
||||||
|
import llnl.util.tty as tty
|
||||||
|
from spack.version import ver
|
||||||
|
|
||||||
class Clang(Compiler):
|
class Clang(Compiler):
|
||||||
# Subclasses use possible names of C compiler
|
# Subclasses use possible names of C compiler
|
||||||
@ -47,6 +49,29 @@ class Clang(Compiler):
|
|||||||
'f77' : 'f77',
|
'f77' : 'f77',
|
||||||
'fc' : 'f90' }
|
'fc' : 'f90' }
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_apple(self):
|
||||||
|
ver_string = str(self.version)
|
||||||
|
return ver_string.endswith('-apple')
|
||||||
|
|
||||||
|
@property
|
||||||
|
def openmp_flag(self):
|
||||||
|
if self.is_apple:
|
||||||
|
tty.die("Clang from Apple does not support Openmp yet.")
|
||||||
|
else:
|
||||||
|
return "-fopenmp"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def cxx11_flag(self):
|
||||||
|
if self.is_apple:
|
||||||
|
# FIXME: figure out from which version Apple's clang supports c++11
|
||||||
|
return "-std=c++11"
|
||||||
|
else:
|
||||||
|
if self.version < ver('3.3'):
|
||||||
|
tty.die("Only Clang 3.3 and above support c++11.")
|
||||||
|
else:
|
||||||
|
return "-std=c++11"
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def default_version(self, comp):
|
def default_version(self, comp):
|
||||||
"""The '--version' option works for clang compilers.
|
"""The '--version' option works for clang compilers.
|
||||||
|
@ -49,6 +49,10 @@ class Gcc(Compiler):
|
|||||||
'f77' : 'gcc/gfortran',
|
'f77' : 'gcc/gfortran',
|
||||||
'fc' : 'gcc/gfortran' }
|
'fc' : 'gcc/gfortran' }
|
||||||
|
|
||||||
|
@property
|
||||||
|
def openmp_flag(self):
|
||||||
|
return "-fopenmp"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def cxx11_flag(self):
|
def cxx11_flag(self):
|
||||||
if self.version < ver('4.3'):
|
if self.version < ver('4.3'):
|
||||||
|
@ -23,6 +23,8 @@
|
|||||||
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
##############################################################################
|
##############################################################################
|
||||||
from spack.compiler import *
|
from spack.compiler import *
|
||||||
|
import llnl.util.tty as tty
|
||||||
|
from spack.version import ver
|
||||||
|
|
||||||
class Intel(Compiler):
|
class Intel(Compiler):
|
||||||
# Subclasses use possible names of C compiler
|
# Subclasses use possible names of C compiler
|
||||||
@ -43,6 +45,13 @@ class Intel(Compiler):
|
|||||||
'f77' : 'intel/ifort',
|
'f77' : 'intel/ifort',
|
||||||
'fc' : 'intel/ifort' }
|
'fc' : 'intel/ifort' }
|
||||||
|
|
||||||
|
@property
|
||||||
|
def openmp_flag(self):
|
||||||
|
if self.version < ver('16.0'):
|
||||||
|
return "-openmp"
|
||||||
|
else:
|
||||||
|
return "-qopenmp"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def cxx11_flag(self):
|
def cxx11_flag(self):
|
||||||
if self.version < ver('11.1'):
|
if self.version < ver('11.1'):
|
||||||
@ -68,5 +77,3 @@ def default_version(cls, comp):
|
|||||||
"""
|
"""
|
||||||
return get_compiler_version(
|
return get_compiler_version(
|
||||||
comp, '--version', r'\((?:IFORT|ICC)\) ([^ ]+)')
|
comp, '--version', r'\((?:IFORT|ICC)\) ([^ ]+)')
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
from spack.compiler import *
|
from spack.compiler import *
|
||||||
|
import llnl.util.tty as tty
|
||||||
|
|
||||||
class Nag(Compiler):
|
class Nag(Compiler):
|
||||||
# Subclasses use possible names of C compiler
|
# Subclasses use possible names of C compiler
|
||||||
@ -20,6 +21,16 @@ class Nag(Compiler):
|
|||||||
'f77' : 'nag/nagfor',
|
'f77' : 'nag/nagfor',
|
||||||
'fc' : 'nag/nagfor' }
|
'fc' : 'nag/nagfor' }
|
||||||
|
|
||||||
|
@property
|
||||||
|
def openmp_flag(self):
|
||||||
|
return "-openmp"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def cxx11_flag(self):
|
||||||
|
# NAG does not have a C++ compiler
|
||||||
|
# However, it can be mixed with a compiler that does support it
|
||||||
|
return "-std=c++11"
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def default_version(self, comp):
|
def default_version(self, comp):
|
||||||
"""The '-V' option works for nag compilers.
|
"""The '-V' option works for nag compilers.
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
##############################################################################
|
##############################################################################
|
||||||
from spack.compiler import *
|
from spack.compiler import *
|
||||||
|
import llnl.util.tty as tty
|
||||||
|
|
||||||
class Pgi(Compiler):
|
class Pgi(Compiler):
|
||||||
# Subclasses use possible names of C compiler
|
# Subclasses use possible names of C compiler
|
||||||
@ -43,6 +44,15 @@ class Pgi(Compiler):
|
|||||||
'f77' : 'pgi/pgfortran',
|
'f77' : 'pgi/pgfortran',
|
||||||
'fc' : 'pgi/pgfortran' }
|
'fc' : 'pgi/pgfortran' }
|
||||||
|
|
||||||
|
@property
|
||||||
|
def openmp_flag(self):
|
||||||
|
return "-mp"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def cxx11_flag(self):
|
||||||
|
return "-std=c++11"
|
||||||
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def default_version(cls, comp):
|
def default_version(cls, comp):
|
||||||
"""The '-V' option works for all the PGI compilers.
|
"""The '-V' option works for all the PGI compilers.
|
||||||
@ -54,4 +64,3 @@ def default_version(cls, comp):
|
|||||||
"""
|
"""
|
||||||
return get_compiler_version(
|
return get_compiler_version(
|
||||||
comp, '-V', r'pg[^ ]* ([^ ]+) \d\d\d?-bit target')
|
comp, '-V', r'pg[^ ]* ([^ ]+) \d\d\d?-bit target')
|
||||||
|
|
||||||
|
@ -24,6 +24,8 @@
|
|||||||
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
##############################################################################
|
##############################################################################
|
||||||
from spack.compiler import *
|
from spack.compiler import *
|
||||||
|
import llnl.util.tty as tty
|
||||||
|
from spack.version import ver
|
||||||
|
|
||||||
class Xl(Compiler):
|
class Xl(Compiler):
|
||||||
# Subclasses use possible names of C compiler
|
# Subclasses use possible names of C compiler
|
||||||
@ -44,6 +46,10 @@ class Xl(Compiler):
|
|||||||
'f77' : 'xl/xlf',
|
'f77' : 'xl/xlf',
|
||||||
'fc' : 'xl/xlf90' }
|
'fc' : 'xl/xlf90' }
|
||||||
|
|
||||||
|
@property
|
||||||
|
def openmp_flag(self):
|
||||||
|
return "-qsmp=omp"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def cxx11_flag(self):
|
def cxx11_flag(self):
|
||||||
if self.version < ver('13.1'):
|
if self.version < ver('13.1'):
|
||||||
|
Loading…
Reference in New Issue
Block a user