summaryrefslogtreecommitdiffstats
path: root/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake
diff options
context:
space:
mode:
authorAlexey Edelev <alexey.edelev@qt.io>2021-06-10 19:01:35 +0200
committerAlexey Edelev <alexey.edelev@qt.io>2021-06-16 16:58:45 +0200
commit5fb99e3860eb43f4bacacec7f4a4626cb0159b14 (patch)
tree5f521fbb62d9408d42b3325e831eff5489eb78a0 /cmake/QtBuildInternals/QtBuildInternalsConfig.cmake
parent1f4b237dade9d0d2ed5439e3834ac22985797561 (diff)
Check the impact of static link order for user projects
For user projects we run the static link order check once 'find_package(Qt6 ...)' is called. If linker can resolve circular dependencies between static libraries and object files we set the _qt_link_order_matters property of the Qt::Platform target. This indicates the use of finalizers is not required and we may rely on CMake-base propagation of resource libraries and resource object files. If linker could not resolve circular dependencies depending on the _qt_resource_objects_finalizer_mode value: - Finalizer will be called and collected resource objects will be linked to the target directly. - Finalizer will be omitted and resource objects will be linked using the target_sources function implicitly. This only propagates resource one level up if consumer links the static library PUBLICly, but all symbols will be resolved correctly since object files are placed in the beginning of the linker line. In the CMake version 3.21 we expect that CMake will take care about the order of the resource object files in a linker line, it's expected that all object files are located at the beginning of the linker line. TODO: Need to confirm that the CMake 3.21 meets the expectations. Amends 4e901a2f99cbfda3b479253ea54b16f02e1c3aa5 Pick-to: 6.2 Task-number: QTBUG-93002 Task-number: QTBUG-94528 Change-Id: Ia68976df8182d3d3007b90c475c1e3928a305339 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'cmake/QtBuildInternals/QtBuildInternalsConfig.cmake')
-rw-r--r--cmake/QtBuildInternals/QtBuildInternalsConfig.cmake35
1 files changed, 13 insertions, 22 deletions
diff --git a/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake b/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake
index 1427f5a5fc..8cbd0b566f 100644
--- a/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake
+++ b/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake
@@ -372,11 +372,6 @@ macro(qt_build_repo_begin)
qt_build_internals_set_up_private_api()
qt_enable_cmake_languages()
- # QtBase has own call right after definition of internal platform-specific targets.
- if(NOT PROJECT_NAME STREQUAL "QtBase")
- qt_internal_run_common_config_tests()
- endif()
-
# Add global docs targets that will work both for per-repo builds, and super builds.
if(NOT TARGET docs)
add_custom_target(docs)
@@ -950,24 +945,20 @@ if ("STANDALONE_TEST" IN_LIST Qt6BuildInternals_FIND_COMPONENTS)
endif()
function(qt_internal_static_link_order_test)
- if(TARGET ${QT_CMAKE_EXPORT_NAMESPACE}::PlatformCommonInternal)
- get_target_property(linker_options
- ${QT_CMAKE_EXPORT_NAMESPACE}::PlatformCommonInternal INTERFACE_LINK_OPTIONS
- )
- string(JOIN " " linker_options ${linker_options})
- endif()
-
- qt_config_compile_test(static_link_order
- LABEL "Check if linker can resolve circular dependencies"
- PROJECT_PATH "${QT_CMAKE_DIR}/config.tests/static_link_order"
- CMAKE_FLAGS "-DCMAKE_EXE_LINKER_FLAGS:STRING=${linker_options}"
- )
-
- if(TEST_static_link_order)
- set_property(GLOBAL PROPERTY QT_LINK_ORDER_MATTERS FALSE)
- set(summary_message "no")
+ # The CMake versions greater than 3.21 take care about the resource object files order in a
+ # linker line, it's expected that all object files are located at the beginning of the linker
+ # line.
+ # No need to run the test.
+ # TODO: This check is added before the actual release of CMake 3.21. So need to check if the
+ # target version meets the expectations.
+ if(CMAKE_VERSION VERSION_LESS 3.21)
+ __qt_internal_check_link_order_matters(${QT_CMAKE_EXPORT_NAMESPACE}::Platform)
+ if(link_order_matters)
+ set(summary_message "no")
+ else()
+ set(summary_message "yes")
+ endif()
else()
- set_property(GLOBAL PROPERTY QT_LINK_ORDER_MATTERS TRUE)
set(summary_message "yes")
endif()
qt_configure_add_summary_entry(TYPE "message"