diff --git a/CMakeLists.txt b/CMakeLists.txt index 85354f7..1251f28 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,8 +57,9 @@ option( option(AARE_ASAN "Enable AddressSanitizer" OFF) option(AARE_CUDA "Build CUDA cluster finder backend" OFF) -set(AARE_CUDA_ARCHITECTURES "native" CACHE STRING - "CUDA architectures to compile for (used when AARE_CUDA=ON)") +set(AARE_CUDA_ARCHITECTURES + "native" + CACHE STRING "CUDA architectures to compile for (used when AARE_CUDA=ON)") # Configure which of the dependencies to use FetchContent for option(AARE_FETCH_FMT "Use FetchContent to download fmt" ON) @@ -72,62 +73,64 @@ option(AARE_FETCH_MINUIT2 "Use FetchContent to download Minuit2" ON) # Convenience option to use system libraries only (no FetchContent) option(AARE_SYSTEM_LIBRARIES "Use system libraries" OFF) if(AARE_SYSTEM_LIBRARIES) - message(STATUS "Build using system libraries") - set(AARE_FETCH_FMT - OFF - CACHE BOOL "Disabled FetchContent for FMT" FORCE) - set(AARE_FETCH_PYBIND11 - OFF - CACHE BOOL "Disabled FetchContent for pybind11" FORCE) - set(AARE_FETCH_CATCH - OFF - CACHE BOOL "Disabled FetchContent for catch2" FORCE) - set(AARE_FETCH_JSON - OFF - CACHE BOOL "Disabled FetchContent for nlohmann::json" FORCE) - set(AARE_FETCH_ZMQ - OFF - CACHE BOOL "Disabled FetchContent for libzmq" FORCE) - # Still fetch lmfit and Minuit2 when setting AARE_SYSTEM_LIBRARIES since these - # are not available on conda-forge + message(STATUS "Build using system libraries") + set(AARE_FETCH_FMT + OFF + CACHE BOOL "Disabled FetchContent for FMT" FORCE) + set(AARE_FETCH_PYBIND11 + OFF + CACHE BOOL "Disabled FetchContent for pybind11" FORCE) + set(AARE_FETCH_CATCH + OFF + CACHE BOOL "Disabled FetchContent for catch2" FORCE) + set(AARE_FETCH_JSON + OFF + CACHE BOOL "Disabled FetchContent for nlohmann::json" FORCE) + set(AARE_FETCH_ZMQ + OFF + CACHE BOOL "Disabled FetchContent for libzmq" FORCE) + # Still fetch lmfit and Minuit2 when setting AARE_SYSTEM_LIBRARIES since these + # are not available on conda-forge endif() if(AARE_CUDA) - enable_language(CUDA) - find_package(CUDAToolkit REQUIRED) - - set(CMAKE_CUDA_STANDARD 17) - set(CMAKE_CUDA_STANDARD_REQUIRED ON) - set(CMAKE_CUDA_EXTENSIONS OFF) - set(CMAKE_CUDA_SEPARABLE_COMPILATION ON) - - if(NOT CMAKE_CUDA_ARCHITECTURES) - set(CMAKE_CUDA_ARCHITECTURES ${AARE_CUDA_ARCHITECTURES}) - endif() - - message(STATUS "AARE: CUDA support ENABLED (archs=${CMAKE_CUDA_ARCHITECTURES}, " - "toolkit=${CUDAToolkit_VERSION})") + enable_language(CUDA) + find_package(CUDAToolkit REQUIRED) + + set(CMAKE_CUDA_STANDARD 17) + set(CMAKE_CUDA_STANDARD_REQUIRED ON) + set(CMAKE_CUDA_EXTENSIONS OFF) + set(CMAKE_CUDA_SEPARABLE_COMPILATION ON) + + if(NOT CMAKE_CUDA_ARCHITECTURES) + set(CMAKE_CUDA_ARCHITECTURES ${AARE_CUDA_ARCHITECTURES}) + endif() + + message( + STATUS "AARE: CUDA support ENABLED (archs=${CMAKE_CUDA_ARCHITECTURES}, " + "toolkit=${CUDAToolkit_VERSION})") else() - message(STATUS "AARE: CUDA support DISABLED (CPU-only build)") + message(STATUS "AARE: CUDA support DISABLED (CPU-only build)") endif() if(AARE_CUDA) - enable_language(CUDA) - find_package(CUDAToolkit REQUIRED) - - set(CMAKE_CUDA_STANDARD 17) - set(CMAKE_CUDA_STANDARD_REQUIRED ON) - set(CMAKE_CUDA_EXTENSIONS OFF) - set(CMAKE_CUDA_SEPARABLE_COMPILATION ON) - - if(NOT CMAKE_CUDA_ARCHITECTURES) - set(CMAKE_CUDA_ARCHITECTURES ${AARE_CUDA_ARCHITECTURES}) - endif() - - message(STATUS "AARE: CUDA support ENABLED (archs=${CMAKE_CUDA_ARCHITECTURES}, " - "toolkit=${CUDAToolkit_VERSION})") + enable_language(CUDA) + find_package(CUDAToolkit REQUIRED) + + set(CMAKE_CUDA_STANDARD 17) + set(CMAKE_CUDA_STANDARD_REQUIRED ON) + set(CMAKE_CUDA_EXTENSIONS OFF) + set(CMAKE_CUDA_SEPARABLE_COMPILATION ON) + + if(NOT CMAKE_CUDA_ARCHITECTURES) + set(CMAKE_CUDA_ARCHITECTURES ${AARE_CUDA_ARCHITECTURES}) + endif() + + message( + STATUS "AARE: CUDA support ENABLED (archs=${CMAKE_CUDA_ARCHITECTURES}, " + "toolkit=${CUDAToolkit_VERSION})") else() - message(STATUS "AARE: CUDA support DISABLED (CPU-only build)") + message(STATUS "AARE: CUDA support DISABLED (CPU-only build)") endif() if(AARE_BENCHMARKS) @@ -366,26 +369,27 @@ else() message(STATUS "Debug build") endif() -# Common flags for GCC and Clang -# The strict host warnings (especially -Wold-style-cast and -Wdouble-promotion) -# trip on NVIDIA's CUDA runtime headers when they get preprocessed by nvcc's -# host pass, so we gate them behind $. -target_compile_options( - aare_compiler_flags - INTERFACE - $<$:-Wall> - $<$:-Wextra> - $<$:-pedantic> - $<$:-Wshadow> - $<$:-Wold-style-cast> - $<$:-Wnon-virtual-dtor> - $<$:-Woverloaded-virtual> - $<$:-Wdouble-promotion> - $<$:-Wformat=2> - $<$:-Wredundant-decls> - $<$:-Wvla> - $<$:-Werror=return-type> #important can cause segfault in optimzed builds - ) + # Common flags for GCC and Clang The strict host warnings (especially + # -Wold-style-cast and -Wdouble-promotion) trip on NVIDIA's CUDA runtime + # headers when they get preprocessed by nvcc's host pass, so we gate them + # behind $. + target_compile_options( + aare_compiler_flags + INTERFACE $<$:-Wall> + $<$:-Wextra> + $<$:-pedantic> + $<$:-Wshadow> + $<$:-Wold-style-cast> + $<$:-Wnon-virtual-dtor> + $<$:-Woverloaded-virtual> + $<$:-Wdouble-promotion> + $<$:-Wformat=2> + $<$:-Wredundant-decls> + $<$:-Wvla> + $<$:-Werror=return-type> # important can + # cause segfault in + # optimzed builds + ) endif() # GCC/Clang specific @@ -447,17 +451,12 @@ set(PUBLICHEADERS include/aare/RawMasterFile.hpp include/aare/RawSubFile.hpp include/aare/VarClusterFinder.hpp - include/aare/utils/task.hpp -) - -if(AARE_CUDA) -list(APPEND PUBLICHEADERS - include/aare/ClusterFinderCUDA.hpp - include/aare/clusterfinder_kernel.cuh - include/aare/utils/cuda_check.cuh -) -endif() + include/aare/utils/task.hpp) +if(AARE_CUDA) + list(APPEND PUBLICHEADERS include/aare/ClusterFinderCUDA.hpp + include/aare/clusterfinder_kernel.cuh include/aare/utils/cuda_check.cuh) +endif() set(SourceFiles ${CMAKE_CURRENT_SOURCE_DIR}/src/calibration.cpp @@ -523,19 +522,14 @@ set_target_properties( PUBLIC_HEADER "${PUBLICHEADERS}") if(AARE_CUDA) - add_library(aare_cuda INTERFACE) - target_link_libraries(aare_cuda INTERFACE - aare_core - CUDA::cudart - ) - target_compile_features(aare_cuda INTERFACE cuda_std_17) - target_compile_definitions(aare_cuda INTERFACE - AARE_HAS_CUDA - _GLIBCXX_USE_CXX11_ABI=1 - ) - # Usage example downstream: - # set_source_files_properties(bind_ClusterFinderCUDA.cpp PROPERTIES LANGUAGE CUDA) - # target_link_libraries(my_pymodule PRIVATE aare_cuda) + add_library(aare_cuda INTERFACE) + target_link_libraries(aare_cuda INTERFACE aare_core CUDA::cudart) + target_compile_features(aare_cuda INTERFACE cuda_std_17) + target_compile_definitions(aare_cuda INTERFACE AARE_HAS_CUDA + _GLIBCXX_USE_CXX11_ABI=1) + # Usage example downstream: + # set_source_files_properties(bind_ClusterFinderCUDA.cpp PROPERTIES LANGUAGE + # CUDA) target_link_libraries(my_pymodule PRIVATE aare_cuda) endif() if(AARE_TESTS) @@ -569,16 +563,16 @@ if(AARE_TESTS) endif() if(AARE_MASTER_PROJECT) - set(AARE_INSTALL_TARGETS aare_core aare_compiler_flags) - if(AARE_CUDA) - list(APPEND AARE_INSTALL_TARGETS aare_cuda) - endif() - install(TARGETS ${AARE_INSTALL_TARGETS} - EXPORT "${TARGETS_EXPORT_NAME}" - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/aare - ) + set(AARE_INSTALL_TARGETS aare_core aare_compiler_flags) + if(AARE_CUDA) + list(APPEND AARE_INSTALL_TARGETS aare_cuda) + endif() + install( + TARGETS ${AARE_INSTALL_TARGETS} + EXPORT "${TARGETS_EXPORT_NAME}" + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/aare) endif() set(CMAKE_INSTALL_RPATH $ORIGIN) @@ -644,10 +638,10 @@ add_custom_target( VERBATIM) if(AARE_MASTER_PROJECT) - set(CMAKE_INSTALL_DIR "share/cmake/${PROJECT_NAME}") - set(PROJECT_LIBRARIES aare-core aare-compiler-flags ) - if(AARE_CUDA) - list(APPEND PROJECT_LIBRARIES aare-cuda) - endif() - include(cmake/package_config.cmake) + set(CMAKE_INSTALL_DIR "share/cmake/${PROJECT_NAME}") + set(PROJECT_LIBRARIES aare-core aare-compiler-flags) + if(AARE_CUDA) + list(APPEND PROJECT_LIBRARIES aare-cuda) + endif() + include(cmake/package_config.cmake) endif() diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index ceb0b93..fcb377f 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -18,47 +18,46 @@ else() endif() # ---- Main CPU module -------------------------------------------------------- -# module.cpp is the only source for the main module. When AARE_CUDA=ON, the -# CUDA bindings live in a *separate* Python extension (_aare_cuda.so) loaded +# module.cpp is the only source for the main module. When AARE_CUDA=ON, the CUDA +# bindings live in a *separate* Python extension (_aare_cuda.so) loaded # independently at runtime. This isolates the nvcc-compiled translation unit # into its own ELF image so pybind11's type registry cannot be corrupted by # weak-symbol collisions between gcc-emitted and nvcc-emitted template # instantiations. pybind11_add_module(_aare NO_EXTRAS src/module.cpp) - + target_link_libraries(_aare PRIVATE aare_core aare_compiler_flags) target_include_directories( _aare SYSTEM PRIVATE $) - -set_target_properties(_aare PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/aare - INTERPROCEDURAL_OPTIMIZATION FALSE -) + +set_target_properties( + _aare PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/aare + INTERPROCEDURAL_OPTIMIZATION FALSE) # ---- CUDA module (separate .so) -------------------------------------------- if(AARE_CUDA) - pybind11_add_module(_aare_cuda NO_EXTRAS src/cuda_bindings.cu) - - target_link_libraries(_aare_cuda PRIVATE aare_cuda aare_compiler_flags) - - target_include_directories(_aare_cuda SYSTEM PRIVATE - $ - ) - - set_target_properties(_aare_cuda PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/aare - INTERPROCEDURAL_OPTIMIZATION FALSE - CUDA_RESOLVE_DEVICE_SYMBOLS ON - CUDA_SEPARABLE_COMPILATION ON - ) - - target_compile_options(_aare_cuda PRIVATE - $<$:--expt-relaxed-constexpr> - $<$:--extended-lambda> - $<$:-Xcompiler=-fvisibility=hidden> - $<$:-Xcompiler=-fPIC> - ) + pybind11_add_module(_aare_cuda NO_EXTRAS src/cuda_bindings.cu) + + target_link_libraries(_aare_cuda PRIVATE aare_cuda aare_compiler_flags) + + target_include_directories( + _aare_cuda SYSTEM + PRIVATE $) + + set_target_properties( + _aare_cuda + PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/aare + INTERPROCEDURAL_OPTIMIZATION FALSE + CUDA_RESOLVE_DEVICE_SYMBOLS ON + CUDA_SEPARABLE_COMPILATION ON) + + target_compile_options( + _aare_cuda + PRIVATE $<$:--expt-relaxed-constexpr> + $<$:--extended-lambda> + $<$:-Xcompiler=-fvisibility=hidden> + $<$:-Xcompiler=-fPIC>) endif() # List of python files to be copied to the build directory @@ -77,12 +76,11 @@ set(PYTHON_FILES # Copy the python files to the build directory foreach(FILE ${PYTHON_FILES}) - configure_file(${FILE} ${CMAKE_BINARY_DIR}/${FILE}) + configure_file(${FILE} ${CMAKE_BINARY_DIR}/${FILE}) endforeach(FILE ${PYTHON_FILES}) -# set_target_properties(_aare PROPERTIES -# LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/aare -# ) +# set_target_properties(_aare PROPERTIES LIBRARY_OUTPUT_DIRECTORY +# ${CMAKE_BINARY_DIR}/aare ) set(PYTHON_EXAMPLES examples/play.py examples/fits.py) @@ -93,21 +91,18 @@ foreach(FILE ${PYTHON_EXAMPLES}) endforeach(FILE ${PYTHON_EXAMPLES}) if(AARE_INSTALL_PYTHONEXT) - set(AARE_PY_INSTALL_TARGETS _aare) - if(AARE_CUDA) - list(APPEND AARE_PY_INSTALL_TARGETS _aare_cuda) - endif() - - install( - TARGETS ${AARE_PY_INSTALL_TARGETS} - EXPORT "${TARGETS_EXPORT_NAME}" - LIBRARY DESTINATION aare - COMPONENT python - ) + set(AARE_PY_INSTALL_TARGETS _aare) + if(AARE_CUDA) + list(APPEND AARE_PY_INSTALL_TARGETS _aare_cuda) + endif() - install( - FILES ${PYTHON_FILES} - DESTINATION aare - COMPONENT python - ) + install( + TARGETS ${AARE_PY_INSTALL_TARGETS} + EXPORT "${TARGETS_EXPORT_NAME}" + LIBRARY DESTINATION aare COMPONENT python) + + install( + FILES ${PYTHON_FILES} + DESTINATION aare + COMPONENT python) endif()