diff --git a/CMakeLists.txt b/CMakeLists.txt index 2191495f6d..20b2701b98 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,20 +88,22 @@ set(JUCE_INSTALL_DESTINATION "lib/cmake/JUCE-${JUCE_VERSION}" CACHE STRING install(EXPORT JUCE NAMESPACE juce:: DESTINATION "${JUCE_INSTALL_DESTINATION}") set(JUCE_EXPORT_FILE_NAME "JUCE.cmake") +set(JUCE_MODULE_PATH "include/JUCE-${JUCE_VERSION}/modules") set(UTILS_INSTALL_DIR "${JUCE_INSTALL_DESTINATION}") set(JUCEAIDE_PATH "${JUCE_TOOL_INSTALL_DIR}/${JUCE_JUCEAIDE_NAME}") configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in" "${JUCE_BINARY_DIR}/JUCEConfig.cmake" - PATH_VARS UTILS_INSTALL_DIR JUCEAIDE_PATH + PATH_VARS UTILS_INSTALL_DIR JUCEAIDE_PATH JUCE_MODULE_PATH INSTALL_DESTINATION "${JUCE_INSTALL_DESTINATION}") set(JUCE_EXPORT_FILE_NAME "JUCEBuildTree.cmake") +set(JUCE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/modules") export(EXPORT JUCE NAMESPACE juce:: FILE "${JUCE_EXPORT_FILE_NAME}") set(UTILS_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/extras/Build/CMake") get_target_property(JUCEAIDE_PATH juceaide IMPORTED_LOCATION) configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in" "${JUCE_BINARY_DIR}/JUCEExportConfig.cmake" - PATH_VARS UTILS_INSTALL_DIR JUCEAIDE_PATH + PATH_VARS UTILS_INSTALL_DIR JUCEAIDE_PATH JUCE_MODULE_PATH INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}" INSTALL_DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") diff --git a/examples/CMake/readme.md b/examples/CMake/readme.md index adfd9b71ae..5b2bafb14e 100644 --- a/examples/CMake/readme.md +++ b/examples/CMake/readme.md @@ -491,15 +491,11 @@ both to the target's `SOURCES` and `INTERFACE_SOURCES`, which may result in many module being built into a single target, which would cause build failures in the best case and silent ODR violations in the worst case. Scary stuff! -This command has a few optional arguments: `INSTALL_PATH` and `INSTALL_EXPORT` should be provided if -you want the module to be installable through the CMake installation mechanism. `INSTALL_PATH` is a -path, relative to the install prefix, to which the module sources will be copied. `INSTALL_EXPORT` -specifies the CMake export group for the installed module. ALIAS_NAMESPACE will add an alias for the -target(s) with the provided namespace. For example, the following invocation will add a module -target named `my_module`, along with an alias named `company::my_module`. -``` -juce_add_module(my_module ALIAS_NAMESPACE company)` -``` +This command has a few optional arguments: `INSTALL_PATH` is a path, relative to the install prefix, +to which the module sources will be copied during installation of the module. ALIAS_NAMESPACE will +add an alias for the module target(s) with the provided namespace. For example, the following +invocation will add a module target named `my_module`, along with an alias named +`company::my_module`. ``` juce_add_module(my_module ALIAS_NAMESPACE company)` ``` `juce_add_modules` is a convenience function that can be used to add multiple JUCE modules at once. This version accepts many module paths, rather than just one. For an example of usage, see the diff --git a/extras/Build/CMake/JUCEConfig.cmake.in b/extras/Build/CMake/JUCEConfig.cmake.in index 7744edc643..038d573a46 100644 --- a/extras/Build/CMake/JUCEConfig.cmake.in +++ b/extras/Build/CMake/JUCEConfig.cmake.in @@ -31,3 +31,59 @@ endif() check_required_components("@PROJECT_NAME@") include("@PACKAGE_UTILS_INSTALL_DIR@/JUCEUtils.cmake") + +set(_juce_modules + juce_analytics + juce_audio_basics + juce_audio_devices + juce_audio_formats + juce_audio_plugin_client + juce_audio_processors + juce_audio_utils + juce_blocks_basics + juce_box2d + juce_core + juce_cryptography + juce_data_structures + juce_dsp + juce_events + juce_graphics + juce_gui_basics + juce_gui_extra + juce_opengl + juce_osc + juce_product_unlocking + juce_video) + +set(_targets_defined) +set(_targets_expected) + +foreach(_juce_module IN LISTS _juce_modules) + list(APPEND _targets_expected ${_juce_module} juce::${_juce_modules}) + if(TARGET ${_juce_module}) + list(APPEND _targets_defined ${_juce_module}) + endif() + + if(TARGET juce::${_juce_module}) + list(APPEND _targets_defined juce::${_juce_module}) + endif() +endforeach() + +if("${_targets_defined}" STREQUAL "${_targets_expected}") + unset(_targets_defined) + unset(_targets_expected) + return() +endif() + +if(NOT "${_targets_defined}" STREQUAL "") + message(FATAL_ERROR "Some targets in this export set were already defined.") +endif() + +unset(_targets_defined) +unset(_targets_expected) + +foreach(_juce_module IN LISTS _juce_modules) + juce_add_module("@PACKAGE_JUCE_MODULE_PATH@/${_juce_module}" ALIAS_NAMESPACE juce) +endforeach() + +unset(_juce_modules) diff --git a/extras/Build/CMake/JUCEUtils.cmake b/extras/Build/CMake/JUCEUtils.cmake index c1e50474ba..735ef65785 100644 --- a/extras/Build/CMake/JUCEUtils.cmake +++ b/extras/Build/CMake/JUCEUtils.cmake @@ -431,7 +431,7 @@ endfunction() # ================================================================================================== function(juce_add_module module_path) - set(one_value_args INSTALL_PATH INSTALL_EXPORT ALIAS_NAMESPACE) + set(one_value_args INSTALL_PATH ALIAS_NAMESPACE) cmake_parse_arguments(JUCE_ARG "" "${one_value_args}" "" ${ARGN}) _juce_make_absolute(module_path) @@ -455,20 +455,13 @@ function(juce_add_module module_path) list(APPEND all_module_sources "${base_path}/${module_name}/${module_header_name}") - set(install_export_args) - - if(JUCE_ARG_INSTALL_EXPORT) - set(install_export_args INSTALL_EXPORT "${JUCE_ARG_INSTALL_EXPORT}") - endif() - if(${module_name} STREQUAL "juce_audio_plugin_client") _juce_get_platform_plugin_kinds(plugin_kinds) foreach(kind IN LISTS plugin_kinds) _juce_add_plugin_wrapper_target(FORMAT ${kind} PATH "${module_path}" - OUT_PATH "${base_path}" - ${install_export_args}) + OUT_PATH "${base_path}") endforeach() list(APPEND all_module_sources "${base_path}/${module_name}/juce_audio_plugin_client_utils.cpp") @@ -497,10 +490,6 @@ function(juce_add_module module_path) "${base_path}/juce_audio_processors/format_types/VST3_SDK") target_link_libraries(juce_audio_processors INTERFACE juce_vst3_headers) - if(JUCE_ARG_INSTALL_EXPORT) - install(TARGETS juce_vst3_headers EXPORT "${JUCE_ARG_INSTALL_EXPORT}") - endif() - if(JUCE_ARG_ALIAS_NAMESPACE) add_library(${JUCE_ARG_ALIAS_NAMESPACE}::juce_vst3_headers ALIAS juce_vst3_headers) endif() @@ -568,9 +557,8 @@ function(juce_add_module module_path) _juce_get_metadata("${metadata_dict}" dependencies module_dependencies) target_link_libraries(${module_name} INTERFACE ${module_dependencies}) - if(JUCE_ARG_INSTALL_PATH OR JUCE_ARG_INSTALL_EXPORT) + if(installed_module_path) install(DIRECTORY "${module_path}" DESTINATION "${installed_module_path}") - install(TARGETS ${module_name} EXPORT "${JUCE_ARG_INSTALL_EXPORT}") endif() if(JUCE_ARG_ALIAS_NAMESPACE) @@ -579,13 +567,12 @@ function(juce_add_module module_path) endfunction() function(juce_add_modules) - set(one_value_args INSTALL_PATH INSTALL_EXPORT ALIAS_NAMESPACE) + set(one_value_args INSTALL_PATH ALIAS_NAMESPACE) cmake_parse_arguments(JUCE_ARG "" "${one_value_args}" "" ${ARGN}) foreach(path IN LISTS JUCE_ARG_UNPARSED_ARGUMENTS) juce_add_module(${path} INSTALL_PATH "${JUCE_ARG_INSTALL_PATH}" - INSTALL_EXPORT "${JUCE_ARG_INSTALL_EXPORT}" ALIAS_NAMESPACE "${JUCE_ARG_ALIAS_NAMESPACE}") endforeach() endfunction() @@ -2063,13 +2050,8 @@ function(juce_add_pip header) set(discovered_module) - # If we're building a PIP from outside the current build tree, the JUCE modules - # might be namespaced, so we try adding a namespace if we can't find a target with - # the name given in the metadata block. if(TARGET "${module}") set(discovered_module "${module}") - elseif(TARGET "juce::${module}") - set(discovered_module "juce::${module}") else() message(FATAL_ERROR "No such module: ${module}") endif() diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 159782b7cc..8028b7b229 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -16,7 +16,6 @@ juce_add_modules( INSTALL_PATH "include/JUCE-${JUCE_VERSION}/modules" - INSTALL_EXPORT JUCE ALIAS_NAMESPACE juce juce_analytics juce_audio_basics