diff options
Diffstat (limited to 'cmake')
-rw-r--r-- | cmake/QtBuild.cmake | 73 |
1 files changed, 66 insertions, 7 deletions
diff --git a/cmake/QtBuild.cmake b/cmake/QtBuild.cmake index 004e68c3b1..f5c97abf9b 100644 --- a/cmake/QtBuild.cmake +++ b/cmake/QtBuild.cmake @@ -686,6 +686,50 @@ QMAKE_DEPENDS_${uclib}_LD = ${deps} set(${out_var} "${content}" PARENT_SCOPE) endfunction() +# Retrieves the direct Qt module dependencies of the given Qt module. +# By default, the private dependencies are returned. +# Pass the PUBLIC option to return the public dependencies. +function(qt_get_direct_module_dependencies target out_var) + cmake_parse_arguments(arg "PUBLIC" "" "" ${ARGN}) + set(dependencies "") + if(arg_PUBLIC) + get_target_property(libs ${target} INTERFACE_LINK_LIBRARIES) + else() + get_target_property(libs ${target} LINK_LIBRARIES) + endif() + if(NOT libs) + set(libs "") + endif() + get_target_property(target_type ${target} TYPE) + while(libs) + list(POP_FRONT libs lib) + string(GENEX_STRIP "${lib}" lib) + if(NOT lib OR NOT TARGET "${lib}") + continue() + endif() + get_target_property(lib_type ${lib} TYPE) + if (lib_type STREQUAL "INTERFACE_LIBRARY" AND "${lib}" MATCHES "^Qt::(.*)") + # Found a version-less target like Qt::Core outside of qtbase. + # Skip this one and use what this target points to, e.g. Qt6::Core. + get_target_property(ifacelibs ${lib} INTERFACE_LINK_LIBRARIES) + list(PREPEND libs ${ifacelibs}) + continue() + endif() + if(lib_type STREQUAL "OBJECT_LIBRARY") + # Skip object libraries, because they're already part of ${target}. + continue() + elseif(lib_type STREQUAL "STATIC_LIBRARY" AND target_type STREQUAL "SHARED_LIBRARY") + # Skip static libraries if ${target} is a shared library. + continue() + endif() + get_target_property(lib_config_module_name ${lib} "_qt_config_module_name") + if(lib_config_module_name) + list(APPEND dependencies ${lib_config_module_name}) + endif() + endwhile() + set(${out_var} ${dependencies} PARENT_SCOPE) +endfunction() + # Generates module .pri files for consumption by qmake function(qt_generate_module_pri_file target) set(flags INTERNAL_MODULE HEADER_MODULE) @@ -742,7 +786,7 @@ function(qt_generate_module_pri_file target) list(JOIN module_internal_config " " joined_module_internal_config) - get_target_property(config_module_name ${target} ${property_prefix}QT_CONFIG_MODULE_NAME) + get_target_property(config_module_name ${target} _qt_config_module_name) get_target_property(qmake_module_config ${target} ${property_prefix}QT_QMAKE_MODULE_CONFIG) if(qmake_module_config) string(REPLACE ";" " " module_build_config "${qmake_module_config}") @@ -764,6 +808,9 @@ function(qt_generate_module_pri_file target) endif() endif() + qt_get_direct_module_dependencies(${target} public_dependencies PUBLIC) + list(JOIN public_dependencies " " public_dependencies) + qt_path_join(pri_file_name "${target_path}" "qt_lib_${config_module_name}.pri") list(APPEND pri_files "${pri_file_name}") @@ -778,7 +825,7 @@ QT.${config_module_name}.includes = $$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE QT.${config_module_name}.frameworks = QT.${config_module_name}.bins = $$QT_MODULE_BIN_BASE QT.${config_module_name}.plugin_types = ${module_plugin_types} -QT.${config_module_name}.depends = +QT.${config_module_name}.depends = ${public_dependencies} QT.${config_module_name}.uses = QT.${config_module_name}.module_config = ${joined_module_internal_config} QT.${config_module_name}.DEFINES = QT_${module_define}_LIB @@ -800,6 +847,13 @@ QT_MODULES += ${config_module_name} qt_get_qmake_libraries_pri_content(libraries_content ${config_module_name}) endif() + set(private_dependencies "") + if(NOT arg_HEADER_MODULE) + qt_get_direct_module_dependencies(${target} private_dependencies) + endif() + list(APPEND private_dependencies "${config_module_name}") + list(JOIN private_dependencies " " private_dependencies) + file(GENERATE OUTPUT "${private_pri_file}" CONTENT @@ -809,7 +863,7 @@ QT.${config_module_name}_private.module = QT.${config_module_name}_private.libs = $$QT_MODULE_LIB_BASE QT.${config_module_name}_private.includes = $$QT_MODULE_INCLUDE_BASE/${module}/${PROJECT_VERSION} $$QT_MODULE_INCLUDE_BASE/${module}/${PROJECT_VERSION}/${module} QT.${config_module_name}_private.frameworks = -QT.${config_module_name}_private.depends = ${config_module_name} +QT.${config_module_name}_private.depends = ${private_dependencies} QT.${config_module_name}_private.uses = QT.${config_module_name}_private.module_config = ${joined_module_internal_config} QT.${config_module_name}_private.enabled_features = ${enabled_private_features} @@ -2155,12 +2209,12 @@ function(qt_add_module target) "MODULE_INCLUDE_NAME;CONFIG_MODULE_NAME;PRECOMPILED_HEADER;${__default_target_info_args}" "${__default_private_args};${__default_public_args};${__default_private_module_args};QMAKE_MODULE_CONFIG;EXTRA_CMAKE_FILES;EXTRA_CMAKE_INCLUDES;NO_PCH_SOURCES" ${ARGN}) + qt_internal_add_qt_repo_known_module("${target}") + if(NOT DEFINED arg_CONFIG_MODULE_NAME) set(arg_CONFIG_MODULE_NAME "${module_lower}") endif() - qt_internal_add_qt_repo_known_module("${target}") - ### Define Targets: set(is_interface_lib 0) set(is_shared_lib 0) @@ -2177,12 +2231,13 @@ function(qt_add_module target) endif() set(property_prefix "INTERFACE_") - if(NOT is_interface_lib) + if(NOT arg_HEADER_MODULE) qt_set_common_target_properties(${target}) set(property_prefix "") endif() + set_target_properties(${target} PROPERTIES - ${property_prefix}QT_CONFIG_MODULE_NAME "${arg_CONFIG_MODULE_NAME}" + _qt_config_module_name "${arg_CONFIG_MODULE_NAME}" ${property_prefix}QT_QMAKE_MODULE_CONFIG "${arg_QMAKE_MODULE_CONFIG}") set(is_framework 0) @@ -2225,6 +2280,8 @@ function(qt_add_module target) set(target_private "${target}Private") add_library("${target_private}" INTERFACE) qt_internal_add_target_aliases("${target_private}") + set_target_properties(${target_private} PROPERTIES + _qt_config_module_name ${arg_CONFIG_MODULE_NAME}_private) endif() if(NOT arg_HEADER_MODULE) @@ -2452,6 +2509,8 @@ function(qt_add_module target) set_property(TARGET "${target}" APPEND PROPERTY PRIVATE_HEADER "${CMAKE_CURRENT_BINARY_DIR}/qt${arg_CONFIG_MODULE_NAME}-config_p.h") endif() + set_property(TARGET ${target} APPEND PROPERTY EXPORT_PROPERTIES _qt_config_module_name) + if(NOT arg_HEADER_MODULE) if(DEFINED module_headers_private) qt_internal_add_linker_version_script("${target}" PRIVATE_HEADERS ${module_headers_private} ${module_headers_qpa}) |