diff options
author | Alexey Edelev <alexey.edelev@qt.io> | 2024-01-24 16:12:19 +0100 |
---|---|---|
committer | Alexey Edelev <alexey.edelev@qt.io> | 2024-03-12 20:27:42 +0100 |
commit | 173164cd477211e574c0d04abef51aa0f4c3f78d (patch) | |
tree | f6ed45b761b5a133ba1ff409aeb99ea076ad304e /tests/auto/cmake | |
parent | a1d18276a84f0f72af48c3b899c80d4b9407ef4b (diff) |
"Simplify" versionless targets
Versionless targets in Qt6 are interface libraries that link the
versioned libraries using the INTERFACE link type. This makes the
linking chain more complicated than it can be. Also we miss some
significant interface properties in the versionless targets comparing
to the versioned targets.
The new approach manually generates the versionless targets, instead
of using CMake exports.
For CMake versions < 3.18 we now create a copy of the versioned
targets. The copy includes all the relevant INTERFACE properties from
the versioned targets and imported locations for all configs.
For CMake versions >= 3.18 we now create the versionless target ALIASes
which should behave give the transparent access to the versioned
targets.
Using the QT_USE_OLD_VERSION_LESS_TARGETS flag you may force the
behavor of the CMake versions <= 3.18
The change is partial workaround for QTBUG-86533.
Task-number: QTBUG-114706
Change-Id: Iafadf6154eb4912df0697648c031fcc1cbde04e0
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'tests/auto/cmake')
5 files changed, 166 insertions, 13 deletions
diff --git a/tests/auto/cmake/test_versionless_targets/CMakeLists.txt b/tests/auto/cmake/test_versionless_targets/CMakeLists.txt index 3514f4e0f9..1afcaa6a93 100644 --- a/tests/auto/cmake/test_versionless_targets/CMakeLists.txt +++ b/tests/auto/cmake/test_versionless_targets/CMakeLists.txt @@ -5,22 +5,99 @@ cmake_minimum_required(VERSION 3.16) project(versionless_targets) -set(QT_NO_CREATE_VERSIONLESS_TARGETS ON) +function(check_versionless_targets) + set(known_interface_properties + QT_MAJOR_VERSION + AUTOMOC_MACRO_NAMES + AUTOUIC_OPTIONS + COMPILE_DEFINITIONS + COMPILE_FEATURES + COMPILE_OPTIONS + CXX_MODULE_SETS + HEADER_SETS + HEADER_SETS_TO_VERIFY + INCLUDE_DIRECTORIES + LINK_DEPENDS + LINK_DIRECTORIES + LINK_LIBRARIES + LINK_LIBRARIES_DIRECT + LINK_LIBRARIES_DIRECT_EXCLUDE + LINK_OPTIONS + POSITION_INDEPENDENT_CODE + PRECOMPILE_HEADERS + SOURCES + SYSTEM_INCLUDE_DIRECTORIES + ) -find_package(Qt6Core REQUIRED) + set(known_qt_exported_properties + MODULE_PLUGIN_TYPES + QT_DISABLED_PRIVATE_FEATURES + QT_DISABLED_PUBLIC_FEATURES + QT_ENABLED_PRIVATE_FEATURES + QT_ENABLED_PUBLIC_FEATURES + QT_QMAKE_PRIVATE_CONFIG + QT_QMAKE_PUBLIC_CONFIG + QT_QMAKE_PUBLIC_QT_CONFIG + _qt_config_module_name + _qt_is_public_module + _qt_module_has_headers + _qt_module_has_private_headers + _qt_module_has_public_headers + _qt_module_has_qpa_headers + _qt_module_has_rhi_headers + _qt_module_include_name + _qt_module_interface_name + _qt_package_name + _qt_package_version + _qt_private_module_target_name + ) -if (NOT TARGET Qt6::Core) - message(SEND_ERROR "Qt6::Core target not defined!") -endif() + foreach(prop ${known_interface_properties}) + set(versionless_prop "") + set(versioned_prop "") + get_target_property(versionless_prop Qt::Core INTERFACE_${prop}) + get_target_property(versioned_prop Qt6::Core INTERFACE_${prop}) + if(NOT versionless_prop AND NOT versioned_prop) + continue() + endif() -if (TARGET Qt::Core) - message(SEND_ERROR "Qt::Core target defined despite QT_NO_CREATE_VERSIONLESS_TARGETS!") -endif() + if(NOT "${versionless_prop}" STREQUAL "${versioned_prop}") + message(SEND_ERROR "INTERFACE_${prop} doesn't match versionless ${versionless_prop}" + " versioned ${versioned_prop}") + endif() + endforeach() -set(QT_NO_CREATE_VERSIONLESS_TARGETS OFF) + foreach(prop ${known_qt_exported_properties}) + set(versionless_prop "") + set(versioned_prop "") + get_target_property(versionless_prop Qt::Core ${prop}) + get_target_property(versioned_prop Qt6::Core ${prop}) + if(NOT versionless_prop AND NOT versioned_prop) + continue() + endif() -find_package(Qt6Core REQUIRED) + if(NOT "${versionless_prop}" STREQUAL "${versioned_prop}") + message(SEND_ERROR "${prop} doesn't match versionless ${versionless_prop}" + " versioned ${versioned_prop}") + endif() + endforeach() -if (NOT TARGET Qt::Core) - message(SEND_ERROR "Qt::Core target not defined!") -endif() + foreach(conf "" _RELEASE _DEBUG _RELWITHDEBINFO _MINSIZEREL) + set(versionless_prop "") + set(versioned_prop "") + get_target_property(versionless_prop Qt::Core IMPORTED_LOCATION${conf}) + get_target_property(versioned_prop Qt6::Core IMPORTED_LOCATION${conf}) + if(NOT versionless_prop AND NOT versioned_prop) + continue() + endif() + if(NOT "${versionless_prop}" STREQUAL "${versioned_prop}") + message(SEND_ERROR "IMPORTED_LOCATION${conf} doesn't match versionless ${versionless_prop}" + " versioned ${versioned_prop}") + endif() + endforeach() +endfunction() + +add_subdirectory(default) +add_subdirectory(force_off) +add_subdirectory(force_on) +add_subdirectory(force_old) diff --git a/tests/auto/cmake/test_versionless_targets/default/CMakeLists.txt b/tests/auto/cmake/test_versionless_targets/default/CMakeLists.txt new file mode 100644 index 0000000000..a8757607cf --- /dev/null +++ b/tests/auto/cmake/test_versionless_targets/default/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (C) 2024 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) + +message("Test default creating of versionless targets") +find_package(Qt6Core REQUIRED) + +if(NOT TARGET Qt6::Core) + message(SEND_ERROR "Qt6::Core target not defined!") +endif() + +if(NOT TARGET Qt::Core) + message(SEND_ERROR "Qt::Core target not defined!") +endif() + +check_versionless_targets() diff --git a/tests/auto/cmake/test_versionless_targets/force_off/CMakeLists.txt b/tests/auto/cmake/test_versionless_targets/force_off/CMakeLists.txt new file mode 100644 index 0000000000..247b1b8c27 --- /dev/null +++ b/tests/auto/cmake/test_versionless_targets/force_off/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright (C) 2024 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) + +message("Test disabled versionless targets") + +set(QT_NO_CREATE_VERSIONLESS_TARGETS ON) + +find_package(Qt6Core REQUIRED) + +if(NOT TARGET Qt6::Core) + message(SEND_ERROR "Qt6::Core target not defined!") +endif() + +if(TARGET Qt::Core) + message(SEND_ERROR "Qt::Core target defined despite QT_NO_CREATE_VERSIONLESS_TARGETS!") +endif() diff --git a/tests/auto/cmake/test_versionless_targets/force_old/CMakeLists.txt b/tests/auto/cmake/test_versionless_targets/force_old/CMakeLists.txt new file mode 100644 index 0000000000..9e83fec7b3 --- /dev/null +++ b/tests/auto/cmake/test_versionless_targets/force_old/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (C) 2024 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) + +message("Test force old versionless targets") + +set(QT_USE_OLD_VERSION_LESS_TARGETS ON) + +find_package(Qt6Core REQUIRED) + +if(NOT TARGET Qt6::Core) + message(SEND_ERROR "Qt6::Core target not defined!") +endif() + +if(NOT TARGET Qt::Core) + message(SEND_ERROR "Qt::Core target not defined!") +endif() + +check_versionless_targets() + diff --git a/tests/auto/cmake/test_versionless_targets/force_on/CMakeLists.txt b/tests/auto/cmake/test_versionless_targets/force_on/CMakeLists.txt new file mode 100644 index 0000000000..b3d7596143 --- /dev/null +++ b/tests/auto/cmake/test_versionless_targets/force_on/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright (C) 2024 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) + +message("Test enabled versionless targets") + +set(QT_NO_CREATE_VERSIONLESS_TARGETS OFF) + +find_package(Qt6Core REQUIRED) + +if(NOT TARGET Qt6::Core) + message(SEND_ERROR "Qt6::Core target not defined!") +endif() + +if(NOT TARGET Qt::Core) + message(SEND_ERROR "Qt::Core target not defined!") +endif() + +check_versionless_targets() |