Header-only install [question]
Created by: jrobbin
Is it possible to do a header-only install of ArborX via spack? I'd like to use ArborX in an existing project by adding something like:
depends_on('arborx~mpi~serial~cuda' when='+arborx')
to my project's spack package.py file, then add:
find_package(ArborX REQUIRED)
to my project's CMakeLists.txt file. I was able to do so by modifying the CMakeLists.txt in ArborX and the package.py for ArborX in spack (diffs shown below), but I'd prefer to use ArborX as is.
Thanks! Josh
Changes to ArborX's package.py in spack:
diff --git a/var/spack/repos/builtin/packages/arborx/package.py b/var/spack/repos/builtin/packages/arborx/package.py
index 45e368884..d63504561 100644
--- a/var/spack/repos/builtin/packages/arborx/package.py
+++ b/var/spack/repos/builtin/packages/arborx/package.py
@@ -36,15 +36,21 @@ class Arborx(CMakePackage):
spec = self.spec
options = [
- '-DCMAKE_PREFIX_PATH=%s' % spec['kokkos'].prefix,
'-DARBORX_ENABLE_TESTS=OFF',
'-DARBORX_ENABLE_EXAMPLES=OFF',
'-DARBORX_ENABLE_BENCHMARKS=OFF',
'-DARBORX_ENABLE_MPI=%s' % ('ON' if '+mpi' in spec else 'OFF')
]
- if '+cuda' in spec:
+ if '+cuda' in spec or '+serial' in spec or '+openmp' in spec:
+ '-DCMAKE_PREFIX_PATH=%s' % spec['kokkos'].prefix,
nvcc_wrapper_path = spec['kokkos'].prefix.bin.nvcc_wrapper
options.append('-DCMAKE_CXX_COMPILER=%s' % nvcc_wrapper_path)
+ else:
+ options.append('-DARBORX_ENABLE_HEADERONLY=ON')
return options
+
+ def setup_environment(self, spack_env, run_env):
+ run_env.prepend_path('CPATH', join_path(self.prefix, 'include', 'details'))
Changes to ArborX:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2ed5176..6530242 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,17 +1,22 @@
cmake_minimum_required(VERSION 3.12)
project(ArborX CXX)
-find_package(Kokkos 3.0 QUIET)
-if(NOT Kokkos_FOUND)
- set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
- find_package(Kokkos 3.0 REQUIRED)
-endif()
-if(Kokkos_ENABLE_CUDA)
- kokkos_check(OPTIONS CUDA_LAMBDA)
+if(NOT ARBORX_ENABLE_HEADERONLY)
+ set(ARBORX_ENABLE_KOKKOS ON)
+ find_package(Kokkos 3.0 QUIET)
+ if(NOT Kokkos_FOUND)
+ set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
+ find_package(Kokkos 3.0 REQUIRED)
+ endif()
+ if(Kokkos_ENABLE_CUDA)
+ kokkos_check(OPTIONS CUDA_LAMBDA)
+ endif()
endif()
add_library(ArborX INTERFACE)
-target_link_libraries(ArborX INTERFACE Kokkos::kokkos)
+if(ARBORX_ENABLE_KOKKOS)
+ target_link_libraries(ArborX INTERFACE Kokkos::kokkos)
+endif()
set_target_properties(ArborX PROPERTIES INTERFACE_COMPILE_FEATURES cxx_std_14)
option(ARBORX_ENABLE_MPI "Enable MPI support" OFF)
@@ -75,11 +80,19 @@ configure_package_config_file(cmake/ArborXConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/ArborXConfig.cmake
INSTALL_DESTINATION lib/cmake/ArborX
)
-install(FILES
- ${CMAKE_CURRENT_BINARY_DIR}/ArborXConfig.cmake
- ${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindKokkos.cmake
- ${CMAKE_CURRENT_BINARY_DIR}/ArborXSettings.cmake
- DESTINATION lib/cmake/ArborX )
+
+if(ARBORX_ENABLE_KOKKOS)
+ install(FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/ArborXConfig.cmake
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindKokkos.cmake
+ ${CMAKE_CURRENT_BINARY_DIR}/ArborXSettings.cmake
+ DESTINATION lib/cmake/ArborX )
+else()
+ install(FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/ArborXConfig.cmake
+ ${CMAKE_CURRENT_BINARY_DIR}/ArborXSettings.cmake
+ DESTINATION lib/cmake/ArborX )
+endif()
if(ARBORX_ENABLE_MPI)
install(DIRECTORY ${PROJECT_SOURCE_DIR}/src/ DESTINATION include
diff --git a/cmake/ArborXConfig.cmake.in b/cmake/ArborXConfig.cmake.in
index 231573e..1442dc0 100644
--- a/cmake/ArborXConfig.cmake.in
+++ b/cmake/ArborXConfig.cmake.in
@@ -2,8 +2,10 @@
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_MODULE_PATH})
-include(CMakeFindDependencyMacro)
-find_dependency(Kokkos)
+if(ARBORX_ENABLE_KOKKOS)
+ include(CMakeFindDependencyMacro)
+ find_dependency(Kokkos)
+endif()
include("${CMAKE_CURRENT_LIST_DIR}/ArborXSettings.cmake")
if(ARBORX_ENABLE_MPI)