diff --git a/cmake/QtBuildHelpers.cmake b/cmake/QtBuildHelpers.cmake index c1e59036aba..bfd210a6ec3 100644 --- a/cmake/QtBuildHelpers.cmake +++ b/cmake/QtBuildHelpers.cmake @@ -227,6 +227,7 @@ function(qt_internal_get_qt_build_private_files_to_install out_var) ModuleDescription.json.in PkgConfigLibrary.pc.in Qt3rdPartyLibraryConfig.cmake.in + QtTransitiveExtras.cmake.in QtBaseTopLevelHelpers.cmake QtBuild.cmake QtBuildHelpers.cmake diff --git a/cmake/QtModuleHelpers.cmake b/cmake/QtModuleHelpers.cmake index fdcbb700899..a1f44db699e 100644 --- a/cmake/QtModuleHelpers.cmake +++ b/cmake/QtModuleHelpers.cmake @@ -216,6 +216,17 @@ function(qt_internal_add_module target) "_qt_package_version" "_qt_package_name" ) + + if(CMAKE_VERSION VERSION_LESS 3.30) + # For the CMake versions higher than 3.30 the corresponding INTERFACE_ + # properties will be in QtTargets.cmake without extra code + # needed. + list(APPEND export_properties + "_qt_transitive_compile_properties" + "_qt_transitive_link_properties" + ) + endif() + if(NOT is_internal_module) set_target_properties(${target} PROPERTIES _qt_is_public_module TRUE @@ -728,6 +739,21 @@ function(qt_internal_add_module target) list(APPEND extra_cmake_includes "${INSTALL_CMAKE_NAMESPACE}${target}Macros.cmake") endif() + if(CMAKE_VERSION VERSION_LESS 3.30) + # For the CMake versions higher than 3.30 the corresponding INTERFACE_ + # properties will be in QtTargets.cmake without extra code + # needed. + configure_file( + "${QT_CMAKE_DIR}/QtTransitiveExtras.cmake.in" + "${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}TransitiveExtras.cmake" + @ONLY + ) + list(APPEND extra_cmake_files + "${config_build_dir}/${INSTALL_CMAKE_NAMESPACE}${target}TransitiveExtras.cmake") + list(APPEND extra_cmake_includes + "${INSTALL_CMAKE_NAMESPACE}${target}TransitiveExtras.cmake") + endif() + if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/${INSTALL_CMAKE_NAMESPACE}${target}ConfigExtras.cmake.in") if(target STREQUAL Core) if(NOT "${QT_NAMESPACE}" STREQUAL "") diff --git a/cmake/QtTransitiveExtras.cmake.in b/cmake/QtTransitiveExtras.cmake.in new file mode 100644 index 00000000000..2febebead91 --- /dev/null +++ b/cmake/QtTransitiveExtras.cmake.in @@ -0,0 +1,38 @@ +# Copyright (C) 2025 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# This file sets the transitive properties supported by Qt Libraries. +if(NOT QT_NO_CREATE_TARGETS AND CMAKE_VERSION VERSION_GREATER_EQUAL 3.30) + foreach(_qt_@target@_transitive_property_type COMPILE LINK) + string(TOLOWER "${_qt_@target@_transitive_property_type}" + _qt_@target@_transitive_property_type_lower) + + get_target_property(_qt_@target@_transitive_properties @QT_CMAKE_EXPORT_NAMESPACE@::@target@ + _qt_transitive_${_qt_@target@_transitive_property_type_lower}_properties) + if(NOT _qt_@target@_transitive_properties) + continue() + endif() + + foreach(_qt_@target@_transitive_property IN LISTS _qt_@target@_transitive_properties) + string(TOLOWER "_qt_internal_${_qt_@target@_transitive_property}" + _qt_@target@_transitive_property_internal) + get_target_property(_qt_@target@_transitive_property_value + @QT_CMAKE_EXPORT_NAMESPACE@::@target@ ${_qt_@target@_transitive_property_internal}) + + if(_qt_@target@_transitive_property_value) + _qt_internal_add_transitive_property(@QT_CMAKE_EXPORT_NAMESPACE@::@target@ + ${_qt_@target@_transitive_property_type} ${_qt_@target@_transitive_property}) + + set_property(TARGET @QT_CMAKE_EXPORT_NAMESPACE@::@target@ PROPERTY + INTERFACE_${_qt_@target@_transitive_property} + "${_qt_@target@_transitive_property_value}") + endif() + endforeach() + endforeach() + unset(_qt_@target@_transitive_property_value) + unset(_qt_@target@_transitive_property_internal) + unset(_qt_@target@_transitive_property) + unset(_qt_@target@_transitive_properties) + unset(_qt_@target@_transitive_property_type_lower) + unset(_qt_@target@_transitive_property_type) +endif()