CMake: Fill QT.<module-name>.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.<module-name>.uses variable.

Take into account the "_nolink" target modifier and translate it to
qmake's "/nolink".

Pick-to: 6.0
Fixes: QTBUG-88951
Change-Id: Ib6ef65b842a1fe1da3ade55867583343b4ee76ee
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
Joerg Bornemann 2020-11-26 17:52:12 +01:00
parent bf483ca979
commit 92d60ae589
2 changed files with 38 additions and 5 deletions

View File

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

View File

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