diff --git a/example/ornstein_uhlenbeck/CMakeLists.txt b/example/ornstein_uhlenbeck/CMakeLists.txt
index 70981afab7ac279074d80d89fa4b6c81dfa78fad..e6ed7a834740a3388a6939da3aaa3999da7ec8c0 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 80385088dcefc33957097b485bd079f88f45df6a..afaaae9d23fd9b1c81d52c17969b14d5e1ec6aaa 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 f42737eb5467dcb635e6bcbcbacb3f155eb63ee1..360028f217068ba31da21a905fbc11dfaa8caecb 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}")