From ed1a48f50a919b1de8628a21e29ae462ca834cfb Mon Sep 17 00:00:00 2001 From: "Seth R. Johnson" Date: Tue, 29 Mar 2022 11:09:02 -0400 Subject: SUNDIALS: refactor CMake recipe (#29585) - Use define/define_from_variant - Remove unused "fortran_flags" - Fix CUDA architectures when using multiple (needs semicolon not comma separators) - Add `when=` variant restrictions to simplify logic --- .../repos/builtin/packages/sundials/package.py | 276 +++++++-------------- 1 file changed, 95 insertions(+), 181 deletions(-) diff --git a/var/spack/repos/builtin/packages/sundials/package.py b/var/spack/repos/builtin/packages/sundials/package.py index 463e587a2e..758edaafdd 100644 --- a/var/spack/repos/builtin/packages/sundials/package.py +++ b/var/spack/repos/builtin/packages/sundials/package.py @@ -97,7 +97,7 @@ class Sundials(CMakePackage, CudaPackage, ROCmPackage): description='Enable SYCL vector') # External libraries - variant('caliper', default=False, when='@6.0.0:', + variant('caliper', default=False, when='@6.0.0: +profiling', description='Enable Caliper instrumentation/profiling') variant('hypre', default=False, description='Enable Hypre MPI parallel vector') @@ -181,9 +181,6 @@ class Sundials(CMakePackage, CudaPackage, ROCmPackage): # rocm+examples and cstd do not work together in 6.0.0 conflicts('+rocm+examples', when='@6.0.0') - # profiling must be on for Caliper support to mean anything - conflicts('+caliper', when='~profiling') - # ========================================================================== # Dependencies # ========================================================================== @@ -245,16 +242,8 @@ class Sundials(CMakePackage, CudaPackage, ROCmPackage): def cmake_args(self): spec = self.spec - - def on_off(varstr): - return 'ON' if varstr in self.spec else 'OFF' - - fortran_flag = self.compiler.f77_pic_flag - if (spec.satisfies('%apple-clang')) and ('+fcmix' in spec): - f77 = Executable(self.compiler.f77) - libgfortran = LibraryList(f77('--print-file-name', - 'libgfortran.a', output=str)) - fortran_flag += ' ' + libgfortran.ld_flags + define = CMakePackage.define + from_variant = self.define_from_variant # List of CMake arguments # Note: CMAKE_INSTALL_PREFIX and CMAKE_BUILD_TYPE are set automatically @@ -262,239 +251,164 @@ class Sundials(CMakePackage, CudaPackage, ROCmPackage): # SUNDIALS solvers for pkg in self.sun_solvers: - args.append(self.define_from_variant('BUILD_' + pkg, pkg)) - - # language standard - cstd = spec.variants['cstd'].value - args.append('-DCMAKE_C_STANDARD=%s' % cstd) - cxxstd = spec.variants['cxxstd'].value - args.append('-DCMAKE_CXX_STANDARD=%s' % cxxstd) + args.append(from_variant('BUILD_' + pkg, pkg)) - # precision args.extend([ - '-DSUNDIALS_PRECISION=%s' % spec.variants['precision'].value + # language standard + from_variant('CMAKE_C_STANDARD', 'cstd'), + from_variant('CMAKE_CXX_STANDARD', 'cxxstd'), + # precision + from_variant('SUNDIALS_PRECISION', 'precision'), ]) # index type (v3.0.0 or later) - if spec.satisfies('@3.0.0:'): - if '+int64' in spec: - args.extend(['-DSUNDIALS_INDEX_SIZE=64']) - args.extend(['-DSUNDIALS_INDEX_TYPE=int64_t']) - else: - args.extend(['-DSUNDIALS_INDEX_SIZE=32']) - args.extend(['-DSUNDIALS_INDEX_TYPE=int32_t']) - - # Fortran interface - args.extend([self.define_from_variant('F77_INTERFACE_ENABLE', 'fcmix')]) - args.extend([self.define_from_variant('F2003_INTERFACE_ENABLE', 'f2003')]) - - # library type - args.extend([ - self.define_from_variant('BUILD_SHARED_LIBS', 'shared'), - self.define_from_variant('BUILD_STATIC_LIBS', 'static') - ]) - - # generic (std-c) math libraries - args.extend([ - '-DUSE_GENERIC_MATH=%s' % on_off('+generic-math') - ]) + if spec.satisfies('@3:'): + intsize = "64" if '+int64' in spec else "32" + args.extend([ + define('SUNDIALS_INDEX_SIZE', intsize), + define('SUNDIALS_INDEX_TYPE', 'int{}_t'.format(intsize)), + ]) - # Monitoring args.extend([ - self.define_from_variant('SUNDIALS_BUILD_WITH_MONITORING', 'monitoring') + # Fortran interface + from_variant('F77_INTERFACE_ENABLE', 'fcmix'), + from_variant('F2003_INTERFACE_ENABLE', 'f2003'), + # library type + from_variant('BUILD_SHARED_LIBS', 'shared'), + from_variant('BUILD_STATIC_LIBS', 'static'), + # Generic (std-c) math libraries + from_variant('USE_GENERIC_MATH', 'generic-math'), + # Monitoring + from_variant('SUNDIALS_BUILD_WITH_MONITORING', 'monitoring'), + # Profiling + from_variant('SUNDIALS_BUILD_WITH_PROFILING', 'profiling'), + from_variant('ENABLE_CALIPER', 'caliper'), ]) - # Profiling - args.extend([ - self.define_from_variant('SUNDIALS_BUILD_WITH_PROFILING', 'profiling') - ]) - if '+profiling+caliper' in spec: - args.extend([ - '-DENABLE_CALIPER=ON', - '-DCALIPER_DIR=%s' % spec['caliper'].prefix - ]) + if '+caliper' in spec: + args.append(define('CALIPER_DIR', spec['caliper'].prefix)) # parallelism args.extend([ - self.define_from_variant('MPI_ENABLE', 'mpi'), - self.define_from_variant('OPENMP_ENABLE', 'openmp'), - self.define_from_variant('PTHREAD_ENABLE', 'pthread'), - self.define_from_variant('ENABLE_SYCL', 'sycl') + from_variant('MPI_ENABLE', 'mpi'), + from_variant('OPENMP_ENABLE', 'openmp'), + from_variant('PTHREAD_ENABLE', 'pthread'), + from_variant('ENABLE_SYCL', 'sycl'), + from_variant('CUDA_ENABLE', 'cuda'), + from_variant('ENABLE_HIP', 'rocm'), + from_variant('HYPRE_ENABLE', 'hypre'), + from_variant('KLU_ENABLE', 'klu'), + from_variant('LAPACK_ENABLE', 'lapack'), + from_variant('PETSC_ENABLE', 'petsc'), + from_variant('RAJA_ENABLE', 'raja'), + from_variant('SUPERLUMT_ENABLE', 'superlu-mt'), + from_variant('SUPERLUDIST_ENABLE', 'superlu-dist'), + from_variant('Trilinos_ENABLE', 'trilinos'), + from_variant('EXAMPLES_INSTALL', 'examples-install'), ]) if '+cuda' in spec: - args.append('-DCUDA_ENABLE=ON') - archs = spec.variants['cuda_arch'].value - if archs[0] != 'none': - arch_str = ",".join(archs) - args.append('-DCMAKE_CUDA_ARCHITECTURES=%s' % arch_str) - else: - args.append('-DCUDA_ENABLE=OFF') + args.append(define( + 'CMAKE_CUDA_ARCHITECTURES', spec.variants['cuda_arch'].value + )) if '+rocm' in spec: args.extend([ - '-DCMAKE_C_COMPILER=%s' % (spec['llvm-amdgpu'].prefix + '/bin/clang'), - '-DCMAKE_CXX_COMPILER=%s' % spec['hip'].hipcc, - '-DENABLE_HIP=ON', - '-DHIP_PATH=%s' % spec['hip'].prefix, - '-DHIP_CLANG_INCLUDE_PATH=%s/include' % spec['llvm-amdgpu'].prefix, - '-DROCM_PATH=%s' % spec['llvm-amdgpu'].prefix + define('CMAKE_C_COMPILER', spec['llvm-amdgpu'].prefix.bin.clang), + define('CMAKE_CXX_COMPILER', spec['hip'].hipcc), + define('HIP_PATH', spec['hip'].prefix), + define('HIP_CLANG_INCLUDE_PATH', spec['llvm-amdgpu'].prefix.include), + define('ROCM_PATH', spec['llvm-amdgpu'].prefix), + define('AMDGPU_TARGETS', spec.variants['amdgpu_target'].value), ]) - archs = spec.variants['amdgpu_target'].value - if archs[0] != 'none': - arch_str = ",".join(archs) - args.append('-DAMDGPU_TARGETS=%s' % arch_str) - else: - args.append('-DENABLE_HIP=OFF') # MPI support if '+mpi' in spec: args.extend([ - '-DMPI_MPICC=%s' % spec['mpi'].mpicc, - '-DMPI_MPICXX=%s' % spec['mpi'].mpicxx, - '-DMPI_MPIF77=%s' % spec['mpi'].mpif77, - '-DMPI_MPIF90=%s' % spec['mpi'].mpifc + define('MPI_MPICC', spec['mpi'].mpicc), + define('MPI_MPICXX', spec['mpi'].mpicxx), + define('MPI_MPIF77', spec['mpi'].mpif77), + define('MPI_MPIF90', spec['mpi'].mpifc), ]) # Building with Hypre if '+hypre' in spec: args.extend([ - '-DHYPRE_ENABLE=ON', - '-DHYPRE_INCLUDE_DIR=%s' % spec['hypre'].prefix.include, - '-DHYPRE_LIBRARY_DIR=%s' % spec['hypre'].prefix.lib - ]) - else: - args.extend([ - '-DHYPRE_ENABLE=OFF' + define('HYPRE_INCLUDE_DIR', spec['hypre'].prefix.include), + define('HYPRE_LIBRARY_DIR', spec['hypre'].prefix.lib) ]) # Building with KLU if '+klu' in spec: args.extend([ - '-DKLU_ENABLE=ON', - '-DKLU_INCLUDE_DIR=%s' % spec['suite-sparse'].prefix.include, - '-DKLU_LIBRARY_DIR=%s' % spec['suite-sparse'].prefix.lib - ]) - else: - args.extend([ - '-DKLU_ENABLE=OFF' + define('KLU_INCLUDE_DIR', spec['suite-sparse'].prefix.include), + define('KLU_LIBRARY_DIR', spec['suite-sparse'].prefix.lib) ]) # Building with LAPACK if '+lapack' in spec: - args.extend([ - '-DLAPACK_ENABLE=ON', - '-DLAPACK_LIBRARIES=%s' - % (spec['lapack'].libs + spec['blas'].libs).joined(';') - ]) - else: - args.extend([ - '-DLAPACK_ENABLE=OFF' - ]) + args.append(define('LAPACK_LIBRARIES', + spec['lapack'].libs + spec['blas'].libs)) # Building with PETSc if '+petsc' in spec: - args.extend([ - '-DPETSC_ENABLE=ON', - # PETSC_DIR was added in 5.0.0 - '-DPETSC_DIR=%s' % spec['petsc'].prefix, - # The following options were removed 5.0.0, but we keep - # them here for versions < 5.0.0. - '-DPETSC_INCLUDE_DIR=%s' % spec['petsc'].prefix.include, - '-DPETSC_LIBRARY_DIR=%s' % spec['petsc'].prefix.lib - ]) - else: - args.extend([ - '-DPETSC_ENABLE=OFF' - ]) + if spec.version >= Version('5'): + args.append(define('PETSC_DIR', spec['petsc'].prefix)) + else: + args.extend([ + define('PETSC_INCLUDE_DIR', spec['petsc'].prefix.include), + define('PETSC_LIBRARY_DIR', spec['petsc'].prefix.lib), + ]) # Building with RAJA if '+raja' in spec: - args.extend([ - '-DRAJA_ENABLE=ON', - '-DRAJA_DIR=%s' % spec['raja'].prefix - ]) - else: - args.extend([ - '-DRAJA_ENABLE=OFF' - ]) + args.append(define('RAJA_DIR', spec['raja'].prefix)) # Building with SuperLU_MT if '+superlu-mt' in spec: - if spec.satisfies('@3.0.0:'): + if spec.satisfies('@3:'): args.extend([ - '-DBLAS_ENABLE=ON', - '-DBLAS_LIBRARIES=%s' % spec['blas'].libs + define('BLAS_ENABLE', True), + define('BLAS_LIBRARIES', spec['blas'].libs), ]) args.extend([ - '-DSUPERLUMT_ENABLE=ON', - '-DSUPERLUMT_INCLUDE_DIR=%s' - % spec['superlu-mt'].prefix.include, - '-DSUPERLUMT_LIBRARY_DIR=%s' - % spec['superlu-mt'].prefix.lib - ]) - if spec.satisfies('^superlu-mt+openmp'): - args.append('-DSUPERLUMT_THREAD_TYPE=OpenMP') - else: - args.append('-DSUPERLUMT_THREAD_TYPE=Pthread') - else: - args.extend([ - '-DSUPERLUMT_ENABLE=OFF' + define('SUPERLUMT_INCLUDE_DIR', spec['superlu-mt'].prefix.include), + define('SUPERLUMT_LIBRARY_DIR', spec['superlu-mt'].prefix.lib), + define('SUPERLUMT_THREAD_TYPE', + 'OpenMP' if '^superlu-mt+openmp' in spec else 'Pthread'), ]) # Building with SuperLU_DIST if '+superlu-dist' in spec: args.extend([ - '-DOPENMP_ENABLE=%s' - % on_off('^superlu-dist+openmp'), - '-DSUPERLUDIST_ENABLE=ON', - '-DSUPERLUDIST_INCLUDE_DIR=%s' - % spec['superlu-dist'].prefix.include, - '-DSUPERLUDIST_LIBRARY_DIR=%s' - % spec['superlu-dist'].prefix.lib, - '-DSUPERLUDIST_LIBRARIES=%s' - % spec['blas'].libs.joined(';'), - '-DSUPERLUDIST_OpenMP=%s' - % on_off('^superlu-dist+openmp') - ]) - else: - args.extend([ - '-DSUPERLUDIST_ENABLE=OFF' + define('OPENMP_ENABLE', '^superlu-dist+openmp' in spec), + define('SUPERLUDIST_INCLUDE_DIR', spec['superlu-dist'].prefix.include), + define('SUPERLUDIST_LIBRARY_DIR', spec['superlu-dist'].prefix.lib), + define('SUPERLUDIST_LIBRARIES', spec['blas'].libs), + define('SUPERLUDIST_OpenMP', '^superlu-dist+openmp' in spec), ]) # Building with Trilinos if '+trilinos' in spec: - args.extend([ - '-DTrilinos_ENABLE=ON', - '-DTrilinos_DIR=%s' - % spec['trilinos'].prefix - ]) - else: - args.extend([ - '-DTrilinos_ENABLE=OFF' - ]) + args.append(define('Trilinos_DIR', spec['trilinos'].prefix)) # Examples - if spec.satisfies('@3.0.0:'): + if spec.satisfies('@3:'): args.extend([ - self.define_from_variant('EXAMPLES_ENABLE_C', 'examples'), - self.define_from_variant('EXAMPLES_ENABLE_CXX', 'examples'), - '-DEXAMPLES_ENABLE_CUDA=%s' % on_off('+examples+cuda'), - '-DEXAMPLES_ENABLE_F77=%s' % on_off('+examples+fcmix'), - '-DEXAMPLES_ENABLE_F90=%s' % on_off('+examples+fcmix'), - '-DEXAMPLES_ENABLE_F2003=%s' % on_off('+examples+f2003'), + from_variant('EXAMPLES_ENABLE_C', 'examples'), + from_variant('EXAMPLES_ENABLE_CXX', 'examples'), + define('EXAMPLES_ENABLE_CUDA', '+examples+cuda' in spec), + define('EXAMPLES_ENABLE_F77', '+examples+fcmix' in spec), + define('EXAMPLES_ENABLE_F90', '+examples+fcmix' in spec), + define('EXAMPLES_ENABLE_F2003', '+examples+f2003' in spec), ]) else: args.extend([ - self.define_from_variant('EXAMPLES_ENABLE', 'examples'), - self.define_from_variant('CXX_ENABLE', 'examples'), - '-DF90_ENABLE=%s' % on_off('+examples+fcmix') + from_variant('EXAMPLES_ENABLE', 'examples'), + from_variant('CXX_ENABLE', 'examples'), + define('F90_ENABLE', '+examples+fcmix' in spec), ]) - args.extend([ - '-DEXAMPLES_INSTALL=%s' % on_off('+examples-install') - ]) - return args # ========================================================================== -- cgit v1.2.3-70-g09d2