diff options
author | Jean-Michaël Celerier <jean-michael.celerier@kdab.com> | 2019-02-11 12:12:07 +0100 |
---|---|---|
committer | Jean-Michaël Celerier <jean-michael.celerier@kdab.com> | 2019-05-02 11:41:55 +0000 |
commit | 1b36fe53c621a4f37322c1bca755989d76b7d3cf (patch) | |
tree | b5a8c1a8ca61be00cc8a53a1c6c6e0fdebd3b688 /cmake | |
parent | 94c9d15355e07113da693f067c1ac15e5f7dc8d7 (diff) |
cmake: export locally-built dependencies in static build
Change-Id: Ifbcedd32cef3b9c8b4b8c9ca0d229850f696f406
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'cmake')
-rw-r--r-- | cmake/3rdpartyConfig.cmake.in | 13 | ||||
-rw-r--r-- | cmake/QtBaseGlobalTargets.cmake | 1 | ||||
-rw-r--r-- | cmake/QtBuild.cmake | 95 |
3 files changed, 108 insertions, 1 deletions
diff --git a/cmake/3rdpartyConfig.cmake.in b/cmake/3rdpartyConfig.cmake.in new file mode 100644 index 0000000000..fe15a1efc6 --- /dev/null +++ b/cmake/3rdpartyConfig.cmake.in @@ -0,0 +1,13 @@ +@PACKAGE_INIT@ + +get_filename_component(_import_prefix "${CMAKE_CURRENT_LIST_FILE}" PATH) +get_filename_component(_import_prefix "${_import_prefix}" REALPATH) + +set(old_CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}") +set(CMAKE_MODULE_PATH "${_import_prefix}" ${CMAKE_MODULE_PATH} ) + +@3RDPARTY_ADDITIONAL_SETUP_CODE@ + +set(CMAKE_MODULE_PATH "${old_CMAKE_MODULE_PATH}") + +include("${CMAKE_CURRENT_LIST_DIR}/@target@Targets.cmake") diff --git a/cmake/QtBaseGlobalTargets.cmake b/cmake/QtBaseGlobalTargets.cmake index d50d1e2c2b..67d20b775c 100644 --- a/cmake/QtBaseGlobalTargets.cmake +++ b/cmake/QtBaseGlobalTargets.cmake @@ -78,6 +78,7 @@ add_library(Qt::GlobalConfigPrivate ALIAS GlobalConfigPrivate) install(TARGETS Platform GlobalConfig GlobalConfigPrivate EXPORT "${INSTALL_CMAKE_NAMESPACE}Targets") install(EXPORT "${INSTALL_CMAKE_NAMESPACE}Targets" NAMESPACE ${INSTALL_CMAKE_EXPORT_NAMESPACE}:: DESTINATION "${config_install_dir}") +export(EXPORT "${INSTALL_CMAKE_NAMESPACE}Targets") ## Install some QtBase specific CMake files: install(FILES diff --git a/cmake/QtBuild.cmake b/cmake/QtBuild.cmake index f5775f2b1f..ddf6389db1 100644 --- a/cmake/QtBuild.cmake +++ b/cmake/QtBuild.cmake @@ -712,6 +712,15 @@ function(add_qt_module target) endif() endforeach() + foreach(lib ${arg_LIBRARIES}) + if (TARGET "${lib}") + get_target_property(_is_exported "${lib}" INTERFACE_QT_EXPORTED_LIBRARY) + if("${_is_exported}") + list(APPEND target_deps "${lib}\;${PROJECT_VERSION}") + endif() + endif() + endforeach() + configure_package_config_file( "${QT_CMAKE_DIR}/QtModuleConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/${INSTALL_CMAKE_NAMESPACE}${target}Config.cmake" @@ -801,7 +810,6 @@ function(qt_internal_check_directory_or_type name dir type default result_var) endif() endfunction() - # This is the main entry point for defining Qt plugins. # A CMake target is created with the given target. The TYPE parameter is needed to place the # plugin into the correct plugins/ sub-directory. @@ -1222,6 +1230,13 @@ function(add_qt_simd_part target) $<TARGET_PROPERTY:${target},COMPILE_DEFINITIONS>) target_link_libraries("${target}" PRIVATE "${name}") + + if(NOT BUILD_SHARED_LIBS) + install( + TARGETS ${name} + EXPORT "${INSTALL_CMAKE_NAMESPACE}Targets" + ) + endif() else() if(QT_CMAKE_DEBUG_EXTEND_TARGET) message("add_qt_simd_part(${target} SIMD ${arg_SIMD} ...): Skipped") @@ -1421,3 +1436,81 @@ macro(qt_find_package) endforeach() endif() endmacro() + +# Creates a simple export set for the various Find* dependencies +# which are needed when creating a static build of Qt. +# This introduces a custom target property: INTERFACE_QT_EXPORTED_LIBRARY +# This target property indicates that Qt modules / plugins using this 3rd party library +# must add it to their list of dependencies when creating their own ${qtmodule}Config.cmake +function(qt_install_static_target_export target) + if(BUILD_SHARED_LIBS) + return() + endif() + + qt_parse_all_arguments(arg "qt_install_3rdparty_config_files" "" "EXPORT" "" ${ARGN}) + # TODO mark EXPORT as required + + set(config_install_dir "${INSTALL_LIBDIR}/cmake/${arg_EXPORT}") + + set_target_properties(${target} + PROPERTIES + INTERFACE_QT_EXPORTED_LIBRARY 1) + + install( + TARGETS ${target} + EXPORT ${arg_EXPORT}Targets + LIBRARY DESTINATION ${INSTALL_LIBDIR} + ARCHIVE DESTINATION ${INSTALL_LIBDIR}) + + install( + EXPORT ${arg_EXPORT}Targets + DESTINATION "${config_install_dir}" + ) + + export(EXPORT ${arg_EXPORT}Targets) +endfunction() + +# Create a set of ${target}Config.cmake and ${target}Version.cmake for a +# third-party library so that it can be found by client code linking statically. +function(qt_install_3rdparty_config_files target) + if(BUILD_SHARED_LIBS) + return() + endif() + + qt_parse_all_arguments(arg "qt_install_3rdparty_config_files" "" "EXPORT" "PACKAGES;ADDITIONAL_FILES" ${ARGN}) + # TODO mark EXPORT as required + + set(3RDPARTY_ADDITIONAL_SETUP_CODE) + foreach(package ${arg_PACKAGES}) + list(APPEND 3RDPARTY_ADDITIONAL_SETUP_CODE "find_package(${package})\n") + endforeach() + + set(config_install_dir "${INSTALL_LIBDIR}/cmake/${arg_EXPORT}") + configure_package_config_file( + "${PROJECT_SOURCE_DIR}/cmake/3rdpartyConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/${target}Config.cmake" + INSTALL_DESTINATION "${config_install_dir}" + ) + + write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/${target}ConfigVersion.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY AnyNewerVersion + ) + + install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/${target}Config.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/${target}ConfigVersion.cmake" + ${arg_ADDITIONAL_FILES} + DESTINATION "${config_install_dir}" + COMPONENT Devel + ) +endfunction() + +# Call this function in 3rdparty find modules that ought to be installed alongside +# Qt modules and must be found when linking statically. +function(qt_install_3rdparty_library target) + qt_install_static_target_export(${target} EXPORT ${target}) + qt_install_3rdparty_config_files(${target} EXPORT ${target} ${ARGN}) +endfunction() + |