Browse Source

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.
tags/2021-05-28
reuk 5 years ago
parent
commit
bf51d2c076
No known key found for this signature in database GPG Key ID: 9ADCD339CFC98A11
5 changed files with 69 additions and 34 deletions
  1. +4
    -2
      CMakeLists.txt
  2. +5
    -9
      examples/CMake/readme.md
  3. +56
    -0
      extras/Build/CMake/JUCEConfig.cmake.in
  4. +4
    -22
      extras/Build/CMake/JUCEUtils.cmake
  5. +0
    -1
      modules/CMakeLists.txt

+ 4
- 2
CMakeLists.txt View File

@@ -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}")




+ 5
- 9
examples/CMake/readme.md View File

@@ -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
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. `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


+ 56
- 0
extras/Build/CMake/JUCEConfig.cmake.in View File

@@ -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)

+ 4
- 22
extras/Build/CMake/JUCEUtils.cmake View File

@@ -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}"
${install_export_args})
OUT_PATH "${base_path}")
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()


+ 0
- 1
modules/CMakeLists.txt View File

@@ -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…
Cancel
Save