From 9797403e8162263d8bc2501200d2af9bdd7a487c Mon Sep 17 00:00:00 2001
From: boeschf <48126478+boeschf@users.noreply.github.com>
Date: Tue, 22 Nov 2022 14:13:25 +0100
Subject: [PATCH] simplify make catalogue (#2042)

- unit tests and some examples build their own mechanism catalogue
- repeated logic for detecting GPUs, passing compile time flags
- leverage the cmake variables and targets which are already there since these catalogues are internal to arbor
- build a static library with mechanisms, which links to arbor-private-deps
---
 example/ornstein_uhlenbeck/CMakeLists.txt | 16 ++------
 mechanisms/BuildModules.cmake             | 16 ++++++++
 test/unit/CMakeLists.txt                  | 45 +++--------------------
 3 files changed, 26 insertions(+), 51 deletions(-)

diff --git a/example/ornstein_uhlenbeck/CMakeLists.txt b/example/ornstein_uhlenbeck/CMakeLists.txt
index 70981afa..e6ed7a83 100644
--- a/example/ornstein_uhlenbeck/CMakeLists.txt
+++ b/example/ornstein_uhlenbeck/CMakeLists.txt
@@ -1,20 +1,12 @@
 include(${PROJECT_SOURCE_DIR}/mechanisms/BuildModules.cmake)
 
-make_catalogue(
+make_catalogue_lib(
     NAME    ornstein_uhlenbeck
     MOD     ornstein_uhlenbeck
-    VERBOSE ${ARB_CAT_VERBOSE}
-    ADD_DEPS OFF)
+    VERBOSE ${ARB_CAT_VERBOSE})
 
-add_executable(ou EXCLUDE_FROM_ALL ou.cpp ${catalogue-ornstein_uhlenbeck-mechanisms})
-add_dependencies(ou catalogue-ornstein_uhlenbeck-target)
-
-if(ARB_WITH_CUDA_CLANG OR ARB_WITH_HIP_CLANG)
-    set_source_files_properties(${catalogue-ornstein_uhlenbeck-meachanisms} PROPERTIES LANGUAGE CXX)
-endif()
-target_include_directories(ou PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/generated/ornstein_uhlenbeck")
-
-target_link_libraries(ou PRIVATE arbor-private-deps) # compiler flags, GPU options etc
+add_executable(ou EXCLUDE_FROM_ALL ou.cpp)
+target_link_libraries(ou PRIVATE catalogue-ornstein_uhlenbeck)
 target_link_libraries(ou PRIVATE arbor arborio)
 if (ARB_USE_BUNDLED_FMT)
     target_include_directories(ou PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../ext/fmt/include")
diff --git a/mechanisms/BuildModules.cmake b/mechanisms/BuildModules.cmake
index 80385088..afaaae9d 100644
--- a/mechanisms/BuildModules.cmake
+++ b/mechanisms/BuildModules.cmake
@@ -114,3 +114,19 @@ function("make_catalogue_standalone")
     target_link_libraries(${MK_CAT_NAME}-catalogue PRIVATE arbor::arbor)
   endif()
 endfunction()
+
+function("make_catalogue_lib")
+  cmake_parse_arguments(MK_CAT "" "NAME;VERBOSE" "MOD;CXX" ${ARGN})
+  set(MK_CAT_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated/${MK_CAT_NAME}")
+  make_catalogue(
+      NAME ${MK_CAT_NAME}
+      MOD ${MK_CAT_MOD}
+      VERBOSE ${MK_CAT_VERBOSE}
+      ADD_DEPS OFF)
+  if(ARB_WITH_CUDA_CLANG OR ARB_WITH_HIP_CLANG)
+    set_source_files_properties(${catalogue-${MK_CAT_NAME}-mechanisms} PROPERTIES LANGUAGE CXX)
+  endif()
+  add_library(catalogue-${MK_CAT_NAME} STATIC EXCLUDE_FROM_ALL ${catalogue-${MK_CAT_NAME}-mechanisms})
+  target_link_libraries(catalogue-${MK_CAT_NAME} PRIVATE arbor arbor-private-deps)
+  target_include_directories(catalogue-${MK_CAT_NAME} INTERFACE ${MK_CAT_OUT_DIR})
+endfunction()
diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt
index f42737eb..360028f2 100644
--- a/test/unit/CMakeLists.txt
+++ b/test/unit/CMakeLists.txt
@@ -48,11 +48,10 @@ set(test_mechanisms
 
 include(${PROJECT_SOURCE_DIR}/mechanisms/BuildModules.cmake)
 
-make_catalogue(
+make_catalogue_lib(
     NAME    testing
     MOD     ${test_mechanisms}
-    VERBOSE ${ARB_CAT_VERBOSE}
-    ADD_DEPS OFF)
+    VERBOSE ${ARB_CAT_VERBOSE})
 
 # Unit test sources
 
@@ -177,14 +176,12 @@ endif()
 
 if(ARB_WITH_CUDA_CLANG OR ARB_WITH_HIP_CLANG)
     set_source_files_properties(${unit_sources} PROPERTIES LANGUAGE CXX)
-    set_source_files_properties(${test_mech_sources} PROPERTIES LANGUAGE CXX)
 endif()
 
-add_executable(unit EXCLUDE_FROM_ALL ${unit_sources} ${catalogue-testing-mechanisms})
-add_dependencies(unit catalogue-testing-target)
+add_executable(unit EXCLUDE_FROM_ALL ${unit_sources})
+target_link_libraries(unit PRIVATE catalogue-testing)
 add_dependencies(tests unit)
 
-
 make_catalogue_standalone(
     NAME dummy
     SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/dummy"
@@ -193,40 +190,10 @@ make_catalogue_standalone(
     CXX_FLAGS_TARGET ${ARB_CXX_FLAGS_TARGET_FULL}
     VERBOSE ON)
 
-if(ARB_WITH_NVCC)
-    target_compile_options(dummy-catalogue PRIVATE -DARB_CUDA)
-endif()
-
-if(ARB_WITH_CUDA_CLANG)
-    set(clang_options_ -DARB_CUDA -xcuda --cuda-gpu-arch=sm_60 --cuda-path=${CUDA_TOOLKIT_ROOT_DIR})
-    target_compile_options(unit PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${clang_options_}>)
-endif()
-
-if(ARB_WITH_HIP_CLANG)
-    set(clang_options_ -DARB_HIP -xhip --amdgpu-target=gfx906 --amdgpu-target=gfx900)
-    target_compile_options(unit PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${clang_options_}>)
-endif()
+target_link_libraries(dummy-catalogue PRIVATE arbor-private-deps)
 add_dependencies(unit dummy-catalogue)
 
-if(ARB_WITH_GPU)
-  target_compile_definitions(unit PRIVATE ARB_GPU_ENABLED)
-endif()
-
-if(ARB_WITH_NVCC)
-    target_compile_options(unit PRIVATE -DARB_CUDA)
-endif()
-
-if(ARB_WITH_CUDA_CLANG)
-    set(clang_options_ -DARB_CUDA -xcuda --cuda-gpu-arch=sm_60 --cuda-path=${CUDA_TOOLKIT_ROOT_DIR})
-    target_compile_options(unit PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${clang_options_}>)
-endif()
-
-if(ARB_WITH_HIP_CLANG)
-    set(clang_options_ -DARB_HIP -xhip --amdgpu-target=gfx906 --amdgpu-target=gfx900)
-    target_compile_options(unit PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${clang_options_}>)
-endif()
-
-target_compile_options(unit PRIVATE ${ARB_CXX_FLAGS_TARGET_FULL})
+target_link_libraries(unit PRIVATE arbor-private-deps)
 target_compile_definitions(unit PRIVATE "-DDATADIR=\"${CMAKE_CURRENT_SOURCE_DIR}/../swc\"")
 target_compile_definitions(unit PRIVATE "-DLIBDIR=\"${PROJECT_BINARY_DIR}/lib\"")
 target_include_directories(unit PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
-- 
GitLab