mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
CMake: Use juce_add_modules to import modules from install tree
This change means that imported juce modules will be made available both with and without a namespace prefix, e.g. `juce_core` and `juce::juce_core` will both be created. This change allows custom modules to specify dependencies without a juce:: prefix, which allows the modules to be used with the Projucer, or under CMake with JUCE in a subdirectory, or under CMake with JUCE installed to the system.
This commit is contained in:
parent
6f016aa03b
commit
bf51d2c076
5 changed files with 69 additions and 34 deletions
|
|
@ -88,20 +88,22 @@ set(JUCE_INSTALL_DESTINATION "lib/cmake/JUCE-${JUCE_VERSION}" CACHE STRING
|
||||||
|
|
||||||
install(EXPORT JUCE NAMESPACE juce:: DESTINATION "${JUCE_INSTALL_DESTINATION}")
|
install(EXPORT JUCE NAMESPACE juce:: DESTINATION "${JUCE_INSTALL_DESTINATION}")
|
||||||
set(JUCE_EXPORT_FILE_NAME "JUCE.cmake")
|
set(JUCE_EXPORT_FILE_NAME "JUCE.cmake")
|
||||||
|
set(JUCE_MODULE_PATH "include/JUCE-${JUCE_VERSION}/modules")
|
||||||
set(UTILS_INSTALL_DIR "${JUCE_INSTALL_DESTINATION}")
|
set(UTILS_INSTALL_DIR "${JUCE_INSTALL_DESTINATION}")
|
||||||
set(JUCEAIDE_PATH "${JUCE_TOOL_INSTALL_DIR}/${JUCE_JUCEAIDE_NAME}")
|
set(JUCEAIDE_PATH "${JUCE_TOOL_INSTALL_DIR}/${JUCE_JUCEAIDE_NAME}")
|
||||||
configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in"
|
configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in"
|
||||||
"${JUCE_BINARY_DIR}/JUCEConfig.cmake"
|
"${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}")
|
INSTALL_DESTINATION "${JUCE_INSTALL_DESTINATION}")
|
||||||
|
|
||||||
set(JUCE_EXPORT_FILE_NAME "JUCEBuildTree.cmake")
|
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}")
|
export(EXPORT JUCE NAMESPACE juce:: FILE "${JUCE_EXPORT_FILE_NAME}")
|
||||||
set(UTILS_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/extras/Build/CMake")
|
set(UTILS_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/extras/Build/CMake")
|
||||||
get_target_property(JUCEAIDE_PATH juceaide IMPORTED_LOCATION)
|
get_target_property(JUCEAIDE_PATH juceaide IMPORTED_LOCATION)
|
||||||
configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in"
|
configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in"
|
||||||
"${JUCE_BINARY_DIR}/JUCEExportConfig.cmake"
|
"${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_PREFIX "${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
INSTALL_DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
|
INSTALL_DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
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!
|
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
|
This command has a few optional arguments: `INSTALL_PATH` is a path, relative to the install prefix,
|
||||||
you want the module to be installable through the CMake installation mechanism. `INSTALL_PATH` is a
|
to which the module sources will be copied during installation of the module. ALIAS_NAMESPACE will
|
||||||
path, relative to the install prefix, to which the module sources will be copied. `INSTALL_EXPORT`
|
add an alias for the module target(s) with the provided namespace. For example, the following
|
||||||
specifies the CMake export group for the installed module. ALIAS_NAMESPACE will add an alias for the
|
invocation will add a module target named `my_module`, along with an alias named
|
||||||
target(s) with the provided namespace. For example, the following invocation will add a module
|
`company::my_module`. ``` juce_add_module(my_module ALIAS_NAMESPACE company)` ```
|
||||||
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.
|
`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
|
This version accepts many module paths, rather than just one. For an example of usage, see the
|
||||||
|
|
|
||||||
|
|
@ -31,3 +31,59 @@ endif()
|
||||||
check_required_components("@PROJECT_NAME@")
|
check_required_components("@PROJECT_NAME@")
|
||||||
|
|
||||||
include("@PACKAGE_UTILS_INSTALL_DIR@/JUCEUtils.cmake")
|
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)
|
||||||
|
|
|
||||||
|
|
@ -431,7 +431,7 @@ endfunction()
|
||||||
# ==================================================================================================
|
# ==================================================================================================
|
||||||
|
|
||||||
function(juce_add_module module_path)
|
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})
|
cmake_parse_arguments(JUCE_ARG "" "${one_value_args}" "" ${ARGN})
|
||||||
|
|
||||||
_juce_make_absolute(module_path)
|
_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}")
|
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")
|
if(${module_name} STREQUAL "juce_audio_plugin_client")
|
||||||
_juce_get_platform_plugin_kinds(plugin_kinds)
|
_juce_get_platform_plugin_kinds(plugin_kinds)
|
||||||
|
|
||||||
foreach(kind IN LISTS plugin_kinds)
|
foreach(kind IN LISTS plugin_kinds)
|
||||||
_juce_add_plugin_wrapper_target(FORMAT ${kind}
|
_juce_add_plugin_wrapper_target(FORMAT ${kind}
|
||||||
PATH "${module_path}"
|
PATH "${module_path}"
|
||||||
OUT_PATH "${base_path}"
|
OUT_PATH "${base_path}")
|
||||||
${install_export_args})
|
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
list(APPEND all_module_sources "${base_path}/${module_name}/juce_audio_plugin_client_utils.cpp")
|
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")
|
"${base_path}/juce_audio_processors/format_types/VST3_SDK")
|
||||||
target_link_libraries(juce_audio_processors INTERFACE juce_vst3_headers)
|
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)
|
if(JUCE_ARG_ALIAS_NAMESPACE)
|
||||||
add_library(${JUCE_ARG_ALIAS_NAMESPACE}::juce_vst3_headers ALIAS juce_vst3_headers)
|
add_library(${JUCE_ARG_ALIAS_NAMESPACE}::juce_vst3_headers ALIAS juce_vst3_headers)
|
||||||
endif()
|
endif()
|
||||||
|
|
@ -568,9 +557,8 @@ function(juce_add_module module_path)
|
||||||
_juce_get_metadata("${metadata_dict}" dependencies module_dependencies)
|
_juce_get_metadata("${metadata_dict}" dependencies module_dependencies)
|
||||||
target_link_libraries(${module_name} INTERFACE ${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(DIRECTORY "${module_path}" DESTINATION "${installed_module_path}")
|
||||||
install(TARGETS ${module_name} EXPORT "${JUCE_ARG_INSTALL_EXPORT}")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(JUCE_ARG_ALIAS_NAMESPACE)
|
if(JUCE_ARG_ALIAS_NAMESPACE)
|
||||||
|
|
@ -579,13 +567,12 @@ function(juce_add_module module_path)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(juce_add_modules)
|
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})
|
cmake_parse_arguments(JUCE_ARG "" "${one_value_args}" "" ${ARGN})
|
||||||
|
|
||||||
foreach(path IN LISTS JUCE_ARG_UNPARSED_ARGUMENTS)
|
foreach(path IN LISTS JUCE_ARG_UNPARSED_ARGUMENTS)
|
||||||
juce_add_module(${path}
|
juce_add_module(${path}
|
||||||
INSTALL_PATH "${JUCE_ARG_INSTALL_PATH}"
|
INSTALL_PATH "${JUCE_ARG_INSTALL_PATH}"
|
||||||
INSTALL_EXPORT "${JUCE_ARG_INSTALL_EXPORT}"
|
|
||||||
ALIAS_NAMESPACE "${JUCE_ARG_ALIAS_NAMESPACE}")
|
ALIAS_NAMESPACE "${JUCE_ARG_ALIAS_NAMESPACE}")
|
||||||
endforeach()
|
endforeach()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
@ -2063,13 +2050,8 @@ function(juce_add_pip header)
|
||||||
|
|
||||||
set(discovered_module)
|
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}")
|
if(TARGET "${module}")
|
||||||
set(discovered_module "${module}")
|
set(discovered_module "${module}")
|
||||||
elseif(TARGET "juce::${module}")
|
|
||||||
set(discovered_module "juce::${module}")
|
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "No such module: ${module}")
|
message(FATAL_ERROR "No such module: ${module}")
|
||||||
endif()
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@
|
||||||
|
|
||||||
juce_add_modules(
|
juce_add_modules(
|
||||||
INSTALL_PATH "include/JUCE-${JUCE_VERSION}/modules"
|
INSTALL_PATH "include/JUCE-${JUCE_VERSION}/modules"
|
||||||
INSTALL_EXPORT JUCE
|
|
||||||
ALIAS_NAMESPACE juce
|
ALIAS_NAMESPACE juce
|
||||||
juce_analytics
|
juce_analytics
|
||||||
juce_audio_basics
|
juce_audio_basics
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue