Skip to content
Snippets Groups Projects
Commit 405b04ef authored by Massimiliano Culpo's avatar Massimiliano Culpo
Browse files

Merge branch 'develop' of https://github.com/LLNL/spack into openmpi_variants

parents 3d768427 2e0ee540
No related branches found
No related tags found
No related merge requests found
...@@ -1831,6 +1831,25 @@ successfully find ``libdwarf.h`` and ``libdwarf.so``, without the ...@@ -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): ...@@ -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): ...@@ -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 @@ ...@@ -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): ...@@ -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): ...@@ -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 @@ ...@@ -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): ...@@ -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): ...@@ -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)\) ([^ ]+)')
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): ...@@ -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 @@ ...@@ -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): ...@@ -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): ...@@ -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 @@ ...@@ -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): ...@@ -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'):
......
from spack import *
class Kripke(Package):
"""Kripke is a simple, scalable, 3D Sn deterministic particle
transport proxy/mini app.
"""
homepage = "https://codesign.llnl.gov/kripke.php"
url = "https://codesign.llnl.gov/downloads/kripke-openmp-1.1.tar.gz"
version('1.1', '7fe6f2b26ed983a6ce5495ab701f85bf')
variant('mpi', default=True, description='Enable MPI support')
depends_on('mpi', when="+mpi")
def install(self, spec, prefix):
with working_dir('build', create=True):
cmake('-DCMAKE_INSTALL_PREFIX:PATH=.',
'-DENABLE_OPENMP=1',
'-DENABLE_MPI=1',
'..',
*std_cmake_args)
make()
# Kripke does not provide install target, so we have to copy
# things into place.
mkdirp(prefix.bin)
install('kripke', prefix.bin)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment