Adds a package for LvArray (#19221)
* RAJA and CHAI changes. * Added LvArray package.
This commit is contained in:
		| @@ -25,6 +25,8 @@ class Chai(CMakePackage, CudaPackage): | ||||
| 
 | ||||
|     variant('shared', default=True, description='Build Shared Libs') | ||||
|     variant('raja', default=False, description='Build plugin for RAJA') | ||||
|     variant('benchmarks', default=True, description='Build benchmarks.') | ||||
|     variant('examples', default=True, description='Build examples.') | ||||
| 
 | ||||
|     depends_on('cmake@3.8:', type='build') | ||||
|     depends_on('umpire') | ||||
| @@ -42,7 +44,7 @@ def cmake_args(self): | ||||
|         if '+cuda' in spec: | ||||
|             options.extend([ | ||||
|                 '-DENABLE_CUDA=ON', | ||||
|                 '-DCUDA_TOOLKIT_ROOT_DIR=%s' % (spec['cuda'].prefix)]) | ||||
|                 '-DCUDA_TOOLKIT_ROOT_DIR=' + spec['cuda'].prefix]) | ||||
| 
 | ||||
|             if not spec.satisfies('cuda_arch=none'): | ||||
|                 cuda_arch = spec.variants['cuda_arch'].value | ||||
| @@ -52,10 +54,20 @@ def cmake_args(self): | ||||
|         else: | ||||
|             options.append('-DENABLE_CUDA=OFF') | ||||
| 
 | ||||
|         if '+raja' in spec: | ||||
|             options.extend(['-DENABLE_RAJA_PLUGIN=ON', | ||||
|                             '-DRAJA_DIR=' + spec['raja'].prefix]) | ||||
| 
 | ||||
|         options.append('-Dumpire_DIR:PATH=' | ||||
|                        + spec['umpire'].prefix.share.umpire.cmake) | ||||
| 
 | ||||
|         options.append('-DENABLE_TESTS={0}'.format( | ||||
|             'ON' if self.run_tests else 'OFF')) | ||||
| 
 | ||||
|         options.append('-DENABLE_BENCHMARKS={0}'.format( | ||||
|             'ON' if '+benchmarks' in spec else 'OFF')) | ||||
| 
 | ||||
|         options.append('-DENABLE_EXAMPLES={0}'.format( | ||||
|             'ON' if '+examples' in spec else 'OFF')) | ||||
| 
 | ||||
|         return options | ||||
|   | ||||
							
								
								
									
										326
									
								
								var/spack/repos/builtin/packages/lvarray/package.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										326
									
								
								var/spack/repos/builtin/packages/lvarray/package.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,326 @@ | ||||
| # Copyright 2013-2020 Lawrence Livermore National Security, LLC and other | ||||
| # Spack Project Developers. See the top-level COPYRIGHT file for details. | ||||
| # | ||||
| # SPDX-License-Identifier: (Apache-2.0 OR MIT) | ||||
| 
 | ||||
| from spack import * | ||||
| import warnings | ||||
| 
 | ||||
| import socket | ||||
| import os | ||||
| 
 | ||||
| from os import environ as env | ||||
| from os.path import join as pjoin | ||||
| 
 | ||||
| 
 | ||||
| def cmake_cache_entry(name, value, comment=""): | ||||
|     """Generate a string for a cmake cache variable""" | ||||
| 
 | ||||
|     return 'set(%s "%s" CACHE PATH "%s")\n\n' % (name, value, comment) | ||||
| 
 | ||||
| 
 | ||||
| def cmake_cache_string(name, string, comment=""): | ||||
|     """Generate a string for a cmake cache variable""" | ||||
| 
 | ||||
|     return 'set(%s "%s" CACHE STRING "%s")\n\n' % (name, string, comment) | ||||
| 
 | ||||
| 
 | ||||
| def cmake_cache_option(name, boolean_value, comment=""): | ||||
|     """Generate a string for a cmake configuration option""" | ||||
| 
 | ||||
|     value = "ON" if boolean_value else "OFF" | ||||
|     return 'set(%s %s CACHE BOOL "%s")\n\n' % (name, value, comment) | ||||
| 
 | ||||
| 
 | ||||
| class Lvarray(CMakePackage, CudaPackage): | ||||
|     """LvArray portable HPC containers.""" | ||||
| 
 | ||||
|     homepage = "https://github.com/GEOSX/lvarray" | ||||
|     git      = "https://github.com/GEOSX/LvArray.git" | ||||
| 
 | ||||
|     version('develop', branch='develop', submodules='True') | ||||
|     version('main', branch='main', submodules='True') | ||||
|     version('0.1.0', tag='v0.1.0', submodules='True') | ||||
| 
 | ||||
|     variant('shared', default=True, description='Build Shared Libs') | ||||
|     variant('umpire', default=False, description='Build Umpire support') | ||||
|     variant('chai', default=False, description='Build Chai support') | ||||
|     variant('caliper', default=False, description='Build Caliper support') | ||||
|     variant('tests', default=True, description='Build tests') | ||||
|     variant('benchmarks', default=False, description='Build benchmarks') | ||||
|     variant('examples', default=False, description='Build examples') | ||||
|     variant('docs', default=False, description='Build docs') | ||||
|     variant('addr2line', default=True, | ||||
|             description='Build support for addr2line.') | ||||
| 
 | ||||
|     depends_on('cmake@3.8:', type='build') | ||||
|     depends_on('cmake@3.9:', when='+cuda', type='build') | ||||
| 
 | ||||
|     depends_on('raja') | ||||
|     depends_on('raja+cuda', when='+cuda') | ||||
| 
 | ||||
|     depends_on('umpire', when='+umpire') | ||||
|     depends_on('umpire+cuda', when='+umpire+cuda') | ||||
| 
 | ||||
|     depends_on('chai+raja', when='+chai') | ||||
|     depends_on('chai+raja+cuda', when='+chai+cuda') | ||||
| 
 | ||||
|     depends_on('caliper', when='+caliper') | ||||
| 
 | ||||
|     depends_on('doxygen@1.8.13:', when='+docs', type='build') | ||||
|     depends_on('py-sphinx@1.6.3:', when='+docs', type='build') | ||||
| 
 | ||||
|     phases = ['hostconfig', 'cmake', 'build', 'install'] | ||||
| 
 | ||||
|     @run_after('build') | ||||
|     @on_package_attributes(run_tests=True) | ||||
|     def check(self): | ||||
|         """Searches the CMake-generated Makefile for the target ``test`` | ||||
|         and runs it if found. | ||||
|         """ | ||||
|         with working_dir(self.build_directory): | ||||
|             ctest('-V', '--force-new-ctest-process', '-j 1') | ||||
| 
 | ||||
|     @run_after('build') | ||||
|     def build_docs(self): | ||||
|         if '+docs' in self.spec: | ||||
|             with working_dir(self.build_directory): | ||||
|                 make('docs') | ||||
| 
 | ||||
|     def _get_sys_type(self, spec): | ||||
|         sys_type = str(spec.architecture) | ||||
|         # if on llnl systems, we can use the SYS_TYPE | ||||
|         if "SYS_TYPE" in env: | ||||
|             sys_type = env["SYS_TYPE"] | ||||
|         return sys_type | ||||
| 
 | ||||
|     def _get_host_config_path(self, spec): | ||||
|         var = '' | ||||
|         if '+cuda' in spec: | ||||
|             var = '-'.join([var, 'cuda']) | ||||
| 
 | ||||
|         hostname = socket.gethostname().rstrip('1234567890') | ||||
|         host_config_path = "%s-%s-%s%s.cmake" % (hostname, | ||||
|                                                  self._get_sys_type(spec), | ||||
|                                                  spec.compiler, var) | ||||
| 
 | ||||
|         dest_dir = self.stage.source_path | ||||
|         host_config_path = os.path.abspath(pjoin(dest_dir, host_config_path)) | ||||
|         return host_config_path | ||||
| 
 | ||||
|     def hostconfig(self, spec, prefix, py_site_pkgs_dir=None): | ||||
|         """ | ||||
|         This method creates a 'host-config' file that specifies | ||||
|         all of the options used to configure and build Umpire. | ||||
| 
 | ||||
|         For more details about 'host-config' files see: | ||||
|             http://software.llnl.gov/conduit/building.html | ||||
| 
 | ||||
|         Note: | ||||
|           The `py_site_pkgs_dir` arg exists to allow a package that | ||||
|           subclasses this package provide a specific site packages | ||||
|           dir when calling this function. `py_site_pkgs_dir` should | ||||
|           be an absolute path or `None`. | ||||
| 
 | ||||
|           This is necessary because the spack `site_packages_dir` | ||||
|           var will not exist in the base class. For more details | ||||
|           on this issue see: https://github.com/spack/spack/issues/6261 | ||||
|         """ | ||||
| 
 | ||||
|         ####################### | ||||
|         # Compiler Info | ||||
|         ####################### | ||||
|         c_compiler = env["SPACK_CC"] | ||||
|         cpp_compiler = env["SPACK_CXX"] | ||||
| 
 | ||||
|         ####################################################################### | ||||
|         # By directly fetching the names of the actual compilers we appear | ||||
|         # to doing something evil here, but this is necessary to create a | ||||
|         # 'host config' file that works outside of the spack install env. | ||||
|         ####################################################################### | ||||
| 
 | ||||
|         sys_type = self._get_sys_type(spec) | ||||
| 
 | ||||
|         ############################################## | ||||
|         # Find and record what CMake is used | ||||
|         ############################################## | ||||
| 
 | ||||
|         cmake_exe = spec['cmake'].command.path | ||||
|         cmake_exe = os.path.realpath(cmake_exe) | ||||
| 
 | ||||
|         host_config_path = self._get_host_config_path(spec) | ||||
|         cfg = open(host_config_path, "w") | ||||
|         cfg.write("#{0}\n".format("#" * 80)) | ||||
|         cfg.write("# Generated host-config - Edit at own risk!\n") | ||||
|         cfg.write("#{0}\n".format("#" * 80)) | ||||
| 
 | ||||
|         cfg.write("#{0}\n".format("-" * 80)) | ||||
|         cfg.write("# SYS_TYPE: {0}\n".format(sys_type)) | ||||
|         cfg.write("# Compiler Spec: {0}\n".format(spec.compiler)) | ||||
|         cfg.write("# CMake executable path: %s\n" % cmake_exe) | ||||
|         cfg.write("#{0}\n\n".format("-" * 80)) | ||||
| 
 | ||||
|         ####################### | ||||
|         # Compiler Settings | ||||
|         ####################### | ||||
| 
 | ||||
|         cfg.write("#{0}\n".format("-" * 80)) | ||||
|         cfg.write("# Compilers\n") | ||||
|         cfg.write("#{0}\n\n".format("-" * 80)) | ||||
|         cfg.write(cmake_cache_entry("CMAKE_C_COMPILER", c_compiler)) | ||||
|         cfg.write(cmake_cache_entry("CMAKE_CXX_COMPILER", cpp_compiler)) | ||||
| 
 | ||||
|         # use global spack compiler flags | ||||
|         cflags = ' '.join(spec.compiler_flags['cflags']) | ||||
|         if cflags: | ||||
|             cfg.write(cmake_cache_entry("CMAKE_C_FLAGS", cflags)) | ||||
| 
 | ||||
|         cxxflags = ' '.join(spec.compiler_flags['cxxflags']) | ||||
|         if cxxflags: | ||||
|             cfg.write(cmake_cache_entry("CMAKE_CXX_FLAGS", cxxflags)) | ||||
| 
 | ||||
|         release_flags = "-O3 -DNDEBUG" | ||||
|         cfg.write(cmake_cache_string("CMAKE_CXX_FLAGS_RELEASE", | ||||
|                                      release_flags)) | ||||
|         reldebinf_flags = "-O3 -g -DNDEBUG" | ||||
|         cfg.write(cmake_cache_string("CMAKE_CXX_FLAGS_RELWITHDEBINFO", | ||||
|                                      reldebinf_flags)) | ||||
|         debug_flags = "-O0 -g" | ||||
|         cfg.write(cmake_cache_string("CMAKE_CXX_FLAGS_DEBUG", debug_flags)) | ||||
| 
 | ||||
|         if "+cuda" in spec: | ||||
|             cfg.write("#{0}\n".format("-" * 80)) | ||||
|             cfg.write("# Cuda\n") | ||||
|             cfg.write("#{0}\n\n".format("-" * 80)) | ||||
| 
 | ||||
|             cfg.write(cmake_cache_option("ENABLE_CUDA", True)) | ||||
|             cfg.write(cmake_cache_entry("CMAKE_CUDA_STANDARD", 14)) | ||||
| 
 | ||||
|             cudatoolkitdir = spec['cuda'].prefix | ||||
|             cfg.write(cmake_cache_entry("CUDA_TOOLKIT_ROOT_DIR", | ||||
|                                         cudatoolkitdir)) | ||||
|             cudacompiler = "${CUDA_TOOLKIT_ROOT_DIR}/bin/nvcc" | ||||
|             cfg.write(cmake_cache_entry("CMAKE_CUDA_COMPILER", cudacompiler)) | ||||
| 
 | ||||
|             cmake_cuda_flags = ('-restrict --expt-extended-lambda -Werror ' | ||||
|                                 'cross-execution-space-call,reorder,' | ||||
|                                 'deprecated-declarations') | ||||
| 
 | ||||
|             archSpecifiers = ("-mtune", "-mcpu", "-march", "-qtune", "-qarch") | ||||
|             for archSpecifier in archSpecifiers: | ||||
|                 for compilerArg in spec.compiler_flags['cxxflags']: | ||||
|                     if compilerArg.startswith(archSpecifier): | ||||
|                         cmake_cuda_flags += ' -Xcompiler ' + compilerArg | ||||
| 
 | ||||
|             if not spec.satisfies('cuda_arch=none'): | ||||
|                 cuda_arch = spec.variants['cuda_arch'].value | ||||
|                 cmake_cuda_flags += ' -arch sm_{0}'.format(cuda_arch[0]) | ||||
| 
 | ||||
|             cfg.write(cmake_cache_string("CMAKE_CUDA_FLAGS", cmake_cuda_flags)) | ||||
| 
 | ||||
|             cfg.write(cmake_cache_string("CMAKE_CUDA_FLAGS_RELEASE", | ||||
|                                          "-O3 -Xcompiler -O3 -DNDEBUG")) | ||||
|             cfg.write(cmake_cache_string("CMAKE_CUDA_FLAGS_RELWITHDEBINFO", | ||||
|                                          "-O3 -g -lineinfo -Xcompiler -O3")) | ||||
|             cfg.write(cmake_cache_string("CMAKE_CUDA_FLAGS_DEBUG", | ||||
|                                          "-O0 -Xcompiler -O0 -g -G")) | ||||
| 
 | ||||
|         else: | ||||
|             cfg.write(cmake_cache_option("ENABLE_CUDA", False)) | ||||
| 
 | ||||
|         cfg.write("#{0}\n".format("-" * 80)) | ||||
|         cfg.write("# RAJA\n") | ||||
|         cfg.write("#{0}\n\n".format("-" * 80)) | ||||
| 
 | ||||
|         raja_dir = spec['raja'].prefix | ||||
|         cfg.write(cmake_cache_entry("RAJA_DIR", raja_dir)) | ||||
| 
 | ||||
|         cfg.write("#{0}\n".format("-" * 80)) | ||||
|         cfg.write("# Umpire\n") | ||||
|         cfg.write("#{0}\n\n".format("-" * 80)) | ||||
| 
 | ||||
|         if "+umpire" in spec: | ||||
|             cfg.write(cmake_cache_option("ENABLE_UMPIRE", True)) | ||||
|             umpire_dir = spec['umpire'].prefix | ||||
|             cfg.write(cmake_cache_entry("UMPIRE_DIR", umpire_dir)) | ||||
|         else: | ||||
|             cfg.write(cmake_cache_option("ENABLE_UMPIRE", False)) | ||||
| 
 | ||||
|         cfg.write("#{0}\n".format("-" * 80)) | ||||
|         cfg.write("# CHAI\n") | ||||
|         cfg.write("#{0}\n\n".format("-" * 80)) | ||||
| 
 | ||||
|         if "+chai" in spec: | ||||
|             cfg.write(cmake_cache_option("ENABLE_CHAI", True)) | ||||
|             chai_dir = spec['chai'].prefix | ||||
|             cfg.write(cmake_cache_entry("CHAI_DIR", chai_dir)) | ||||
|         else: | ||||
|             cfg.write(cmake_cache_option("ENABLE_CHAI", False)) | ||||
| 
 | ||||
|         cfg.write("#{0}\n".format("-" * 80)) | ||||
|         cfg.write("# Caliper\n") | ||||
|         cfg.write("#{0}\n\n".format("-" * 80)) | ||||
| 
 | ||||
|         if "+caliper" in spec: | ||||
|             cfg.write("#{0}\n".format("-" * 80)) | ||||
|             cfg.write("# Caliper\n") | ||||
|             cfg.write("#{0}\n\n".format("-" * 80)) | ||||
| 
 | ||||
|             cfg.write(cmake_cache_option("ENABLE_CALIPER", True)) | ||||
|             caliper_dir = spec['caliper'].prefix | ||||
|             cfg.write(cmake_cache_entry("CALIPER_DIR", caliper_dir)) | ||||
|         else: | ||||
|             cfg.write(cmake_cache_option("ENABLE_CALIPER", False)) | ||||
| 
 | ||||
|         cfg.write("#{0}\n".format("-" * 80)) | ||||
|         cfg.write("# Documentation\n") | ||||
|         cfg.write("#{0}\n\n".format("-" * 80)) | ||||
|         if "+docs" in spec: | ||||
|             sphinx_dir = spec['py-sphinx'].prefix | ||||
|             cfg.write(cmake_cache_string('SPHINX_EXECUTABLE', | ||||
|                                          os.path.join(sphinx_dir, | ||||
|                                                       'bin', | ||||
|                                                       'sphinx-build'))) | ||||
| 
 | ||||
|             doxygen_dir = spec['doxygen'].prefix | ||||
|             cfg.write(cmake_cache_string('DOXYGEN_EXECUTABLE', | ||||
|                                          os.path.join(doxygen_dir, | ||||
|                                                       'bin', | ||||
|                                                       'doxygen'))) | ||||
| 
 | ||||
|         cfg.write("#{0}\n".format("-" * 80)) | ||||
|         cfg.write("# addr2line\n") | ||||
|         cfg.write("#{0}\n\n".format("-" * 80)) | ||||
|         cfg.write(cmake_cache_option('ENABLE_ADDR2LINE', '+addr2line' in spec)) | ||||
| 
 | ||||
|         cfg.write("#{0}\n".format("-" * 80)) | ||||
|         cfg.write("# Other\n") | ||||
|         cfg.write("#{0}\n\n".format("-" * 80)) | ||||
| 
 | ||||
|     def cmake_args(self): | ||||
|         spec = self.spec | ||||
|         host_config_path = self._get_host_config_path(spec) | ||||
| 
 | ||||
|         options = [] | ||||
|         options.extend(['-C', host_config_path]) | ||||
| 
 | ||||
|         # Shared libs | ||||
|         options.append(self.define_from_variant('BUILD_SHARED_LIBS', 'shared')) | ||||
| 
 | ||||
|         if '~tests~examples~benchmarks' in spec: | ||||
|             options.append('-DENABLE_TESTS=OFF') | ||||
|         else: | ||||
|             options.append('-DENABLE_TESTS=ON') | ||||
| 
 | ||||
|         if '~test' in spec: | ||||
|             options.append('-DDISABLE_UNIT_TESTS=ON') | ||||
|         elif "+tests" in spec and ('%intel' in spec or '%xl' in spec): | ||||
|             warnings.warn('The LvArray unit tests take an excessive amount of' | ||||
|                           ' time to build with the Intel or IBM compilers.') | ||||
| 
 | ||||
|         options.append(self.define_from_variant('ENABLE_EXAMPLES', 'examples')) | ||||
|         options.append(self.define_from_variant('ENABLE_BENCHMARKS', | ||||
|                                                 'benchmarks')) | ||||
|         options.append(self.define_from_variant('ENABLE_DOCS', 'docs')) | ||||
| 
 | ||||
|         return options | ||||
| @@ -32,6 +32,8 @@ class Raja(CMakePackage, CudaPackage): | ||||
| 
 | ||||
|     variant('openmp', default=True, description='Build OpenMP backend') | ||||
|     variant('shared', default=True, description='Build Shared Libs') | ||||
|     variant('examples', default=True, description='Build examples.') | ||||
|     variant('exercises', default=True, description='Build exercises.') | ||||
| 
 | ||||
|     depends_on('cmake@3.8:', type='build') | ||||
|     depends_on('cmake@3.9:', when='+cuda', type='build') | ||||
| @@ -41,7 +43,7 @@ def cmake_args(self): | ||||
| 
 | ||||
|         options = [] | ||||
|         options.append('-DENABLE_OPENMP={0}'.format( | ||||
|             'ON' if '+openmp' in spec else 'Off')) | ||||
|             'ON' if '+openmp' in spec else 'OFF')) | ||||
| 
 | ||||
|         if '+cuda' in spec: | ||||
|             options.extend([ | ||||
| @@ -57,8 +59,11 @@ def cmake_args(self): | ||||
|         options.append('-DBUILD_SHARED_LIBS={0}'.format( | ||||
|             'ON' if '+shared' in spec else 'OFF')) | ||||
| 
 | ||||
|         options.append('-DENABLE_CHAI={0}'.format( | ||||
|             'ON' if '+chai' in spec else 'OFF')) | ||||
|         options.append('-DENABLE_EXAMPLES={0}'.format( | ||||
|             'ON' if '+examples' in spec else 'OFF')) | ||||
| 
 | ||||
|         options.append('-DENABLE_EXERCISES={0}'.format( | ||||
|             'ON' if '+exercises' in spec else 'OFF')) | ||||
| 
 | ||||
|         # Work around spack adding -march=ppc64le to SPACK_TARGET_ARGS which | ||||
|         # is used by the spack compiler wrapper.  This can go away when BLT | ||||
| @@ -68,8 +73,4 @@ def cmake_args(self): | ||||
|         else: | ||||
|             options.append('-DENABLE_TESTS=ON') | ||||
| 
 | ||||
|         if '+chai' in spec: | ||||
|             options.extend([ | ||||
|                 '-DENABLE_CHAI=ON']) | ||||
| 
 | ||||
|         return options | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Ben Corbett
					Ben Corbett