From c510cf79d8444ff9e098143cb7727a60025a41af Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 22 Oct 2020 13:19:12 +0200 Subject: [PATCH] cmake build: Add option for exporting plugins That can be used for external plugins. Just add the option "EXPORT" to your "add_qtc_plugin(MyPlugin ...." call. Other plugins can then do "find_package(QtCreatorMyPlugin)" and link against "QtCreator::MyPlugin". Supports both using a Devel install or using a build directory of the plugin that is depended on. Task-number: QTCREATORBUG-22803 Change-Id: I80724eca8c828d2d5be307d32f3125c4e3bd8b3a Reviewed-by: Cristian Adam --- cmake/Config.cmake.in | 5 +++++ cmake/QtCreatorAPI.cmake | 37 +++++++++++++++++++++++++++++++++++-- src/CMakeLists.txt | 2 ++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 cmake/Config.cmake.in diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in new file mode 100644 index 00000000000..647a8462a91 --- /dev/null +++ b/cmake/Config.cmake.in @@ -0,0 +1,5 @@ +@PACKAGE_INIT@ + +if (NOT TARGET QtCreator::@target_name@) + include ("${CMAKE_CURRENT_LIST_DIR}/@export@Targets.cmake") +endif() diff --git a/cmake/QtCreatorAPI.cmake b/cmake/QtCreatorAPI.cmake index 9c2c582b933..2e1183c75ed 100644 --- a/cmake/QtCreatorAPI.cmake +++ b/cmake/QtCreatorAPI.cmake @@ -29,6 +29,9 @@ list(APPEND DEFAULT_DEFINES RELATIVE_DOC_PATH="${RELATIVE_DOC_PATH}" ) +# use CMAKE_CURRENT_FUNCTION_LIST_DIR when we can require CMake 3.17 +set(_THIS_MODULE_BASE_DIR "${CMAKE_CURRENT_LIST_DIR}") + option(BUILD_PLUGINS_BY_DEFAULT "Build plugins by default. This can be used to build all plugins by default, or none." ON) option(BUILD_EXECUTABLES_BY_DEFAULT "Build executables by default. This can be used to build all executables by default, or none." ON) option(BUILD_LIBRARIES_BY_DEFAULT "Build libraries by default. This can be used to build all libraries by default, or none." ON) @@ -264,7 +267,7 @@ endfunction(add_qtc_library) function(add_qtc_plugin target_name) cmake_parse_arguments(_arg - "EXPERIMENTAL;SKIP_DEBUG_CMAKE_FILE_CHECK;SKIP_INSTALL;INTERNAL_ONLY;SKIP_TRANSLATION" + "EXPERIMENTAL;SKIP_DEBUG_CMAKE_FILE_CHECK;SKIP_INSTALL;INTERNAL_ONLY;SKIP_TRANSLATION;EXPORT" "VERSION;COMPAT_VERSION;PLUGIN_JSON_IN;PLUGIN_PATH;PLUGIN_NAME;OUTPUT_NAME;BUILD_DEFAULT" "CONDITION;DEPENDS;PUBLIC_DEPENDS;DEFINES;PUBLIC_DEFINES;INCLUDES;PUBLIC_INCLUDES;SOURCES;EXPLICIT_MOC;SKIP_AUTOMOC;EXTRA_TRANSLATIONS;PLUGIN_DEPENDS;PLUGIN_RECOMMENDS;PROPERTIES" ${ARGN} @@ -459,8 +462,14 @@ function(add_qtc_plugin target_name) enable_pch(${target_name}) if (NOT _arg_SKIP_INSTALL) + if (_arg_EXPORT) + set(export QtCreator${target_name}) + else() + set(export QtCreator) + endif() + install(TARGETS ${target_name} - EXPORT QtCreator + EXPORT ${export} RUNTIME DESTINATION "${plugin_dir}" OPTIONAL LIBRARY DESTINATION "${plugin_dir}" OPTIONAL ARCHIVE @@ -468,6 +477,30 @@ function(add_qtc_plugin target_name) COMPONENT Devel EXCLUDE_FROM_ALL OPTIONAL ) + + if (_arg_EXPORT) + # export of external plugins + install(EXPORT ${export} + FILE ${export}Targets.cmake + DESTINATION lib/cmake/${export} + COMPONENT Devel EXCLUDE_FROM_ALL + NAMESPACE QtCreator:: + ) + include(CMakePackageConfigHelpers) + configure_package_config_file(${_THIS_MODULE_BASE_DIR}/Config.cmake.in + "${CMAKE_BINARY_DIR}/cmake/${export}Config.cmake" + INSTALL_DESTINATION lib/cmake/${export} + ) + install( + FILES ${CMAKE_BINARY_DIR}/cmake/${export}Config.cmake + DESTINATION lib/cmake/${export} + COMPONENT Devel EXCLUDE_FROM_ALL + ) + export(EXPORT ${export} + NAMESPACE QtCreator:: + FILE ${CMAKE_BINARY_DIR}/cmake/${export}Targets.cmake + ) + endif() get_target_property(target_suffix ${target_name} SUFFIX) get_target_property(target_prefix ${target_name} PREFIX) if (target_suffix STREQUAL "target_suffix-NOTFOUND") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ce51c6ad53b..dfc9c24cf7e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -76,6 +76,7 @@ file(COPY ${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPI.cmake ${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPIInternal.cmake ${PROJECT_SOURCE_DIR}/cmake/FindQt5.cmake + ${PROJECT_SOURCE_DIR}/cmake/Config.cmake.in DESTINATION ${CMAKE_BINARY_DIR}/cmake ) @@ -88,6 +89,7 @@ install( ${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPI.cmake ${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPIInternal.cmake ${PROJECT_SOURCE_DIR}/cmake/FindQt5.cmake + ${PROJECT_SOURCE_DIR}/cmake/Config.cmake.in ${CMAKE_BINARY_DIR}/cmake/QtCreatorConfig.cmake DESTINATION lib/cmake/QtCreator COMPONENT Devel EXCLUDE_FROM_ALL