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 <cristian.adam@qt.io>
This commit is contained in:
Eike Ziller
2020-10-22 13:19:12 +02:00
parent e83e146d08
commit c510cf79d8
3 changed files with 42 additions and 2 deletions

5
cmake/Config.cmake.in Normal file
View File

@@ -0,0 +1,5 @@
@PACKAGE_INIT@
if (NOT TARGET QtCreator::@target_name@)
include ("${CMAKE_CURRENT_LIST_DIR}/@export@Targets.cmake")
endif()

View File

@@ -29,6 +29,9 @@ list(APPEND DEFAULT_DEFINES
RELATIVE_DOC_PATH="${RELATIVE_DOC_PATH}" 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_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_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) 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) function(add_qtc_plugin target_name)
cmake_parse_arguments(_arg 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" "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" "CONDITION;DEPENDS;PUBLIC_DEPENDS;DEFINES;PUBLIC_DEFINES;INCLUDES;PUBLIC_INCLUDES;SOURCES;EXPLICIT_MOC;SKIP_AUTOMOC;EXTRA_TRANSLATIONS;PLUGIN_DEPENDS;PLUGIN_RECOMMENDS;PROPERTIES"
${ARGN} ${ARGN}
@@ -459,8 +462,14 @@ function(add_qtc_plugin target_name)
enable_pch(${target_name}) enable_pch(${target_name})
if (NOT _arg_SKIP_INSTALL) if (NOT _arg_SKIP_INSTALL)
if (_arg_EXPORT)
set(export QtCreator${target_name})
else()
set(export QtCreator)
endif()
install(TARGETS ${target_name} install(TARGETS ${target_name}
EXPORT QtCreator EXPORT ${export}
RUNTIME DESTINATION "${plugin_dir}" OPTIONAL RUNTIME DESTINATION "${plugin_dir}" OPTIONAL
LIBRARY DESTINATION "${plugin_dir}" OPTIONAL LIBRARY DESTINATION "${plugin_dir}" OPTIONAL
ARCHIVE ARCHIVE
@@ -468,6 +477,30 @@ function(add_qtc_plugin target_name)
COMPONENT Devel EXCLUDE_FROM_ALL COMPONENT Devel EXCLUDE_FROM_ALL
OPTIONAL 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_suffix ${target_name} SUFFIX)
get_target_property(target_prefix ${target_name} PREFIX) get_target_property(target_prefix ${target_name} PREFIX)
if (target_suffix STREQUAL "target_suffix-NOTFOUND") if (target_suffix STREQUAL "target_suffix-NOTFOUND")

View File

@@ -76,6 +76,7 @@ file(COPY
${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPI.cmake ${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPI.cmake
${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPIInternal.cmake ${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPIInternal.cmake
${PROJECT_SOURCE_DIR}/cmake/FindQt5.cmake ${PROJECT_SOURCE_DIR}/cmake/FindQt5.cmake
${PROJECT_SOURCE_DIR}/cmake/Config.cmake.in
DESTINATION ${CMAKE_BINARY_DIR}/cmake DESTINATION ${CMAKE_BINARY_DIR}/cmake
) )
@@ -88,6 +89,7 @@ install(
${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPI.cmake ${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPI.cmake
${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPIInternal.cmake ${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPIInternal.cmake
${PROJECT_SOURCE_DIR}/cmake/FindQt5.cmake ${PROJECT_SOURCE_DIR}/cmake/FindQt5.cmake
${PROJECT_SOURCE_DIR}/cmake/Config.cmake.in
${CMAKE_BINARY_DIR}/cmake/QtCreatorConfig.cmake ${CMAKE_BINARY_DIR}/cmake/QtCreatorConfig.cmake
DESTINATION lib/cmake/QtCreator DESTINATION lib/cmake/QtCreator
COMPONENT Devel EXCLUDE_FROM_ALL COMPONENT Devel EXCLUDE_FROM_ALL