From 569385a639285e46f7ba1b4073e37452cf3eb1bc Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Thu, 26 Nov 2020 17:52:12 +0100 Subject: CMake: Fill QT..uses entries in module .pri files Those entries were always empty. The INTERFACE_QT_MODULE_USES property was never set. Map each public dependency to its qmake lib name and place this value into the module's QT..uses variable. Take into account the "_nolink" target modifier and translate it to qmake's "/nolink". Fixes: QTBUG-88951 Change-Id: Ib6ef65b842a1fe1da3ade55867583343b4ee76ee Reviewed-by: Alexandru Croitor (cherry picked from commit 92d60ae589442cfbe1e7ac1bb4c42334a09af310) Reviewed-by: Qt Cherry-pick Bot --- cmake/QtFindPackageHelpers.cmake | 8 ++++++++ cmake/QtPriHelpers.cmake | 35 ++++++++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 5 deletions(-) (limited to 'cmake') diff --git a/cmake/QtFindPackageHelpers.cmake b/cmake/QtFindPackageHelpers.cmake index bc38089947..2ccd61c938 100644 --- a/cmake/QtFindPackageHelpers.cmake +++ b/cmake/QtFindPackageHelpers.cmake @@ -167,10 +167,18 @@ macro(qt_find_package) set(QT_QMAKE_LIBS_FOR_${arg_MODULE_NAME} ${QT_QMAKE_LIBS_FOR_${arg_MODULE_NAME}};${arg_QMAKE_LIB} CACHE INTERNAL "") set(QT_TARGETS_OF_QMAKE_LIB_${arg_QMAKE_LIB} ${arg_PROVIDED_TARGETS} CACHE INTERNAL "") + foreach(provided_target ${arg_PROVIDED_TARGETS}) + set(QT_QMAKE_LIB_OF_TARGET_${provided_target} ${arg_QMAKE_LIB} CACHE INTERNAL "") + endforeach() endif() endif() endmacro() +# Return qmake library name for the given target, e.g. return "vulkan" for "Vulkan::Vulkan". +function(qt_internal_map_target_to_qmake_lib target out_var) + set(${out_var} "${QT_QMAKE_LIB_OF_TARGET_${target}}" PARENT_SCOPE) +endfunction() + # This function records a dependency between ${main_target_name} and ${dep_package_name}. # at the CMake package level. # E.g. The Tools package that provides the qtwaylandscanner target diff --git a/cmake/QtPriHelpers.cmake b/cmake/QtPriHelpers.cmake index 87cc2cfd10..4fe8c609d4 100644 --- a/cmake/QtPriHelpers.cmake +++ b/cmake/QtPriHelpers.cmake @@ -116,6 +116,23 @@ function(qt_get_direct_module_dependencies target out_var) set(${out_var} ${dependencies} PARENT_SCOPE) endfunction() +# Return a list of qmake library names for a given list of targets. +# For example, Vulkan::Vulkan_nolink is mapped to vulkan/nolink. +function(qt_internal_map_targets_to_qmake_libs out_var) + set(result "") + foreach(target ${ARGN}) + string(REGEX REPLACE "_nolink$" "" stripped_target "${target}") + qt_internal_map_target_to_qmake_lib(${stripped_target} qmake_lib) + if(NOT "${qmake_lib}" STREQUAL "") + if(NOT target STREQUAL stripped_target) + string(APPEND qmake_lib "/nolink") + endif() + list(APPEND result "${qmake_lib}") + endif() + endforeach() + set(${out_var} "${result}" PARENT_SCOPE) +endfunction() + # Generates module .pri files for consumption by qmake function(qt_generate_module_pri_file target) set(flags INTERNAL_MODULE HEADER_MODULE NO_PRIVATE_MODULE) @@ -146,8 +163,6 @@ function(qt_generate_module_pri_file target) get_target_property(module_internal_config "${target}" "${property_prefix}QT_MODULE_INTERNAL_CONFIG") - get_target_property(module_uses "${target}" - "${property_prefix}QT_MODULE_USES") get_target_property(module_pri_extra_content "${target}" "${property_prefix}QT_MODULE_PRI_EXTRA_CONTENT") get_target_property(module_ldflags "${target}" @@ -156,7 +171,7 @@ function(qt_generate_module_pri_file target) "${property_prefix}QT_MODULE_DEPENDS") foreach(var enabled_features disabled_features enabled_private_features disabled_private_features - module_internal_config module_uses module_pri_extra_content module_ldflags module_depends) + module_internal_config module_pri_extra_content module_ldflags module_depends) if(${var} STREQUAL "${var}-NOTFOUND") set(${var} "") else() @@ -272,6 +287,11 @@ function(qt_generate_module_pri_file target) set(extra_assignments "\nQT_DEFAULT_QPA_PLUGIN = q${QT_QPA_DEFAULT_PLATFORM}") endif() + # Map the public dependencies of the target to qmake library names. + get_target_property(dep_targets ${target} INTERFACE_LINK_LIBRARIES) + qt_internal_map_targets_to_qmake_libs(module_uses ${dep_targets}) + list(JOIN module_uses " " joined_module_uses) + file(GENERATE OUTPUT "${pri_file_name}" CONTENT @@ -284,7 +304,7 @@ QT.${config_module_name}.includes = ${public_module_includes} QT.${config_module_name}.frameworks = ${public_module_frameworks} QT.${config_module_name}.bins = $$QT_MODULE_BIN_BASE${module_plugin_types_assignment} QT.${config_module_name}.depends = ${public_module_dependencies} -QT.${config_module_name}.uses = ${module_uses} +QT.${config_module_name}.uses = ${joined_module_uses} QT.${config_module_name}.module_config = ${joined_module_internal_config}${module_build_config} QT.${config_module_name}.DEFINES = ${joined_target_defines} QT.${config_module_name}.enabled_features = ${enabled_features} @@ -312,6 +332,11 @@ ${module_pri_extra_content} list(APPEND module_internal_config internal_module) list(JOIN module_internal_config " " joined_module_internal_config) + # Map the public dependencies of the private module to qmake library names. + get_target_property(dep_targets ${target}Private INTERFACE_LINK_LIBRARIES) + qt_internal_map_targets_to_qmake_libs(private_module_uses ${dep_targets}) + list(JOIN private_module_uses " " joined_private_module_uses) + # Generate a preliminary qt_lib_XXX_private.pri file file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${private_pri_file_name}" @@ -323,7 +348,7 @@ QT.${config_module_name}_private.libs = $$QT_MODULE_LIB_BASE QT.${config_module_name}_private.includes = ${private_module_includes} QT.${config_module_name}_private.frameworks = ${private_module_frameworks} QT.${config_module_name}_private.depends = ${private_module_dependencies} -QT.${config_module_name}_private.uses = +QT.${config_module_name}_private.uses = ${joined_private_module_uses} QT.${config_module_name}_private.module_config = ${joined_module_internal_config} QT.${config_module_name}_private.enabled_features = ${enabled_private_features} QT.${config_module_name}_private.disabled_features = ${disabled_private_features}" -- cgit v1.2.3