From 7bc3c589779eed1a6a50eb246739206e3633e18e Mon Sep 17 00:00:00 2001 From: Amin Ya Date: Sun, 2 Aug 2026 01:43:49 -0700 Subject: [PATCH] build: support multi-config builds with one configure Use $ instead of CMAKE_BUILD_TYPE so you only need to configure once, and can then build whichever config you want. find_library resolves at configure time, so the Shared Code paths are now built by hand. On Linux we link the .a directly, which means we no longer need to copy it just to give it a lib prefix. --- README.md | 11 ++++++++- cmake/ClapTargetHelpers.cmake | 2 +- cmake/JucerClap.cmake | 43 ++++++++++++----------------------- 3 files changed, 26 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index b3fdd01..b01091f 100644 --- a/README.md +++ b/README.md @@ -126,10 +126,19 @@ create_jucer_clap_target( post-build step triggered from the Projucer: ```bash -cmake -Bbuild-clap -G -DCMAKE_BUILD_TYPE= +# multi-config generators (Visual Studio, Xcode, Ninja Multi-Config) +cmake -Bbuild-clap -G cmake --build build-clap --config + +# single-config generators (Unix Makefiles, Ninja) +cmake -Bbuild-clap -G -DCMAKE_BUILD_TYPE= +cmake --build build-clap ``` +The configuration is selected at build time, so one configure step can serve both `Debug` and +`Release` builds on a multi-config generator. Make sure the matching Projucer configuration has +been built, since the CLAP links against its "Shared Code" library. + The resulting builds will be located in `build-clap/MyPlugin_artefacts`. If you would like to use the [CLAP extensions API](#the-extensions-api), the necessary source diff --git a/cmake/ClapTargetHelpers.cmake b/cmake/ClapTargetHelpers.cmake index ad7a2d6..d333011 100644 --- a/cmake/ClapTargetHelpers.cmake +++ b/cmake/ClapTargetHelpers.cmake @@ -151,7 +151,7 @@ function(clap_juce_extensions_plugin_internal) # the plugin with the extensions... however, we still need to compile # the extensions, since we'll get a linker error otherwise. target_link_libraries(${claptarget} PUBLIC clap_juce_extensions) - target_link_libraries(${claptarget} PUBLIC ${CJA_TARGET_PATH}) + target_link_libraries(${claptarget} PUBLIC "${CJA_TARGET_PATH}") else() target_link_libraries(${target} PUBLIC clap_juce_extensions) target_link_libraries(${claptarget} PUBLIC ${target}) diff --git a/cmake/JucerClap.cmake b/cmake/JucerClap.cmake index 70ba277..52605b1 100644 --- a/cmake/JucerClap.cmake +++ b/cmake/JucerClap.cmake @@ -9,26 +9,21 @@ function(create_jucer_clap_target) set(CJA_BINARY_NAME "${CJA_TARGET}") endif() - if ("${CMAKE_BUILD_TYPE}" STREQUAL "") + get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(NOT is_multi_config AND "${CMAKE_BUILD_TYPE}" STREQUAL "") message(WARNING "CMAKE_BUILD_TYPE not set... using Release by default") - set(CMAKE_BUILD_TYPE "Release") + set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build" FORCE) endif() - if("${JUCER_GENERATOR}" STREQUAL "VisualStudio2019") - find_library(PLUGIN_LIBRARY_PATH ${CJA_TARGET} "Builds/VisualStudio2019/x64/${CMAKE_BUILD_TYPE}/Shared Code") - elseif("${JUCER_GENERATOR}" STREQUAL "VisualStudio2017") - find_library(PLUGIN_LIBRARY_PATH ${CJA_TARGET} "Builds/VisualStudio2017/x64/${CMAKE_BUILD_TYPE}/Shared Code") - elseif("${JUCER_GENERATOR}" STREQUAL "VisualStudio2015") - find_library(PLUGIN_LIBRARY_PATH ${CJA_TARGET} "Builds/VisualStudio2015/x64/${CMAKE_BUILD_TYPE}/Shared Code") - elseif("${JUCER_GENERATOR}" STREQUAL "VisualStudio2022") - find_library(PLUGIN_LIBRARY_PATH ${CJA_TARGET} "Builds/VisualStudio2022/x64/${CMAKE_BUILD_TYPE}/Shared Code") + # multi-config support by using $ in the library names + set(jucer_builds_dir "${CMAKE_CURRENT_SOURCE_DIR}/Builds") + if("${JUCER_GENERATOR}" MATCHES "^VisualStudio(2015|2017|2019|2022)$") + set(PLUGIN_LIBRARY_PATH "${jucer_builds_dir}/${JUCER_GENERATOR}/x64/$/Shared Code/${CJA_TARGET}.lib") elseif("${JUCER_GENERATOR}" STREQUAL "Xcode") - find_library(PLUGIN_LIBRARY_PATH ${CJA_TARGET} "Builds/MacOSX/build/${CMAKE_BUILD_TYPE}") + set(PLUGIN_LIBRARY_PATH "${jucer_builds_dir}/MacOSX/build/$/lib${CJA_TARGET}.a") elseif("${JUCER_GENERATOR}" STREQUAL "LinuxMakefile") - # for some reason Projucer makes a lib called "PluginName.a", but find_library needs "libPluginName.a" - set(LINUX_LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Builds/LinuxMakefile/build") - configure_file("${LINUX_LIB_PATH}/${CJA_TARGET}.a" "${LINUX_LIB_PATH}/lib${CJA_TARGET}.a" COPYONLY) - find_library(PLUGIN_LIBRARY_PATH ${CJA_TARGET} "${LINUX_LIB_PATH}") + # the Makefile exporter is single-config, and makes a lib called "PluginName.a" + set(PLUGIN_LIBRARY_PATH "${jucer_builds_dir}/LinuxMakefile/build/${CJA_TARGET}.a") elseif("${JUCER_GENERATOR}" STREQUAL "") message(FATAL_ERROR "JUCER_GENERATOR variable must be set!") else() @@ -66,19 +61,11 @@ function(create_jucer_clap_target) JucePlugin_Desc="" ) - if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") - target_compile_definitions(${clap_target} - PRIVATE - DEBUG=1 - _DEBUG=1 - ) - else() - target_compile_definitions(${clap_target} - PRIVATE - NDEBUG=1 - _NDEBUG=1 - ) - endif() + target_compile_definitions(${clap_target} + PRIVATE + "$<$:DEBUG=1;_DEBUG=1>" + "$<$>:NDEBUG=1;_NDEBUG=1>" + ) if("${CJA_CLAP_FEATURES}" MATCHES "^instrument.*") message(STATUS "Detected plugin category: instrument")