diff options
-rw-r--r-- | var/spack/repos/builtin/packages/gunrock/package.py | 100 |
1 files changed, 97 insertions, 3 deletions
diff --git a/var/spack/repos/builtin/packages/gunrock/package.py b/var/spack/repos/builtin/packages/gunrock/package.py index f47c1bf635..391b31b723 100644 --- a/var/spack/repos/builtin/packages/gunrock/package.py +++ b/var/spack/repos/builtin/packages/gunrock/package.py @@ -12,7 +12,10 @@ class Gunrock(CMakePackage, CudaPackage): homepage = "https://gunrock.github.io/docs/" git = "https://github.com/gunrock/gunrock.git" - version('master', submodules=True) + # tagged versions are broken. See + # https://github.com/gunrock/gunrock/issues/777 + # Hence, prefer master version. + version('master', submodules=True, preferred=True) version('1.1', submodules=True, tag='v1.1') version('1.0', submodules=True, tag='v1.0') version('0.5.1', submodules=True, tag='v0.5.1') @@ -23,9 +26,100 @@ class Gunrock(CMakePackage, CudaPackage): version('0.2', submodules=True, tag='v0.2') version('0.1', submodules=True, tag='v0.1') - depends_on('cuda') + variant('cuda', default=True, description="Build with Cuda support") + + variant('lib', default=True, description='Build main gunrock library') + variant('shared_libs', default=True, description='Turn off to build for static libraries') + variant('tests', default=True, description='Build functional tests / examples') + variant('mgpu_tests', default=False, description='Builds Gunrock applications and enables the ctest framework for single GPU implementations') + variant('cuda_verbose_ptxas', default=False, description='Enable verbose output from the PTXAS assembler') + variant('google_tests', default=False, description='Build unit tests using googletest') + variant('code_coverage', default=False, description="run code coverage on Gunrock's source code") + # apps + msg = 'select either all or individual applications' + variant( + "applications", + values=disjoint_sets( + ('all',), ('bc', 'bfs', 'cc', 'pr', 'sssp', 'dobfs', 'hits', + 'salsa', 'mst', 'wtf', 'topk') + ).allow_empty_set().with_default('all').with_error(msg), + description="Application to be built" + ) + + variant('boost', default=True, description='Build with Boost') + variant('metis', default=False, description='Build with Metis support') + + depends_on('googletest', when='+google_tests') + depends_on('lcov', when='+code_coverage') + depends_on('boost@1.58.0:', when='+boost') + depends_on('metis', when='+metis') + + conflicts('cuda_arch=none', when='+cuda', + msg='Must specify CUDA compute capabilities of your GPU. \ +See "spack info gunrock"') + + def cmake_args(self): + spec = self.spec + args = [] + args.extend([ + '-DGUNROCK_BUILD_LIB={0}'.format( + 'ON' if '+lib' in spec else 'OFF'), + '-DGUNROCK_BUILD_SHARED_LIBS={0}'.format( + 'ON' if '+shared_libs' in spec else 'OFF'), + '-DGUNROCK_BUILD_TESTS={0}'.format( + 'ON' if '+tests' in spec else 'OFF'), + '-DGUNROCK_MGPU_TESTS={0}'.format( + 'ON' if '+mgpu_tests' in spec else 'OFF'), + '-DCUDA_VERBOSE_PTXAS={0}'.format( + 'ON' if '+cuda_verbose_ptxas' in spec else 'OFF'), + '-DGUNROCK_GOOGLE_TESTS={0}'.format( + 'ON' if '+google_tests' in spec else 'OFF'), + '-DGUNROCK_CODE_COVERAGE={0}'.format( + 'ON' if '+code_coverage' in spec else 'OFF'), + ]) + + # turn off auto detect, which undoes custom cuda arch options + args.append('-DCUDA_AUTODETECT_GENCODE=OFF') + + cuda_arch_list = self.spec.variants['cuda_arch'].value + if cuda_arch_list[0] != 'none': + for carch in cuda_arch_list: + args.append('-DGUNROCK_GENCODE_SM' + carch + '=ON') + + app_list = self.spec.variants['applications'].value + if app_list[0] != 'none': + args.extend([ + '-DGUNROCK_BUILD_APPLICATIONS={0}'.format( + 'ON' if spec.satisfies('applications=all') else 'OFF'), + '-DGUNROCK_APP_BC={0}'.format( + 'ON' if spec.satisfies('applications=bc') else 'OFF'), + '-DGUNROCK_APP_BFS={0}'.format( + 'ON' if spec.satisfies('applications=bfs') else 'OFF'), + '-DGUNROCK_APP_CC={0}'.format( + 'ON' if spec.satisfies('applications=cc') else 'OFF'), + '-DGUNROCK_APP_PR={0}'.format( + 'ON' if spec.satisfies('applications=pr') else 'OFF'), + '-DGUNROCK_APP_SSSP={0}'.format( + 'ON' if spec.satisfies('applications=sssp') else 'OFF'), + '-DGUNROCK_APP_DOBFS={0}'.format( + 'ON' if spec.satisfies('applications=dobfs') else 'OFF'), + '-DGUNROCK_APP_HITS={0}'.format( + 'ON' if spec.satisfies('applications=hits') else 'OFF'), + '-DGUNROCK_APP_SALSA={0}'.format( + 'ON' if spec.satisfies('applications=salsa') else 'OFF'), + '-DGUNROCK_APP_MST={0}'.format( + 'ON' if spec.satisfies('applications=mst') else 'OFF'), + '-DGUNROCK_APP_WTF={0}'.format( + 'ON' if spec.satisfies('applications=wtf') else 'OFF'), + '-DGUNROCK_APP_TOPK={0}'.format( + 'ON' if spec.satisfies('applications=topk') else 'OFF'), + ]) + + return args def install(self, spec, prefix): with working_dir(self.build_directory): - install_tree('bin', prefix.bin) install_tree('lib', prefix.lib) + # bin dir is created only if tests/examples are built + if '+tests' in spec: + install_tree('bin', prefix.bin) |