summaryrefslogtreecommitdiffstats
path: root/cmake/QtPublicTargetHelpers.cmake
diff options
context:
space:
mode:
authorAlexey Edelev <alexey.edelev@qt.io>2021-05-19 19:46:24 +0200
committerAlexey Edelev <alexey.edelev@qt.io>2021-05-27 14:28:17 +0200
commit19e789bace887105badae83c0a79429bbf8e8221 (patch)
tree1e369b20032c64cc5cb49b9073dbc70df11325d5 /cmake/QtPublicTargetHelpers.cmake
parent029425478aed1454ec3f374af0284371d050ca68 (diff)
Implement propagation of object files to the end-point executable
This proposal collects all the resource objects to the qt-specific property of the static libraries. This is done to avoid littering of other static libraries and put resource object files to the source part of the linker line when linking the end-point executable. The way we link object resource libraries is changed back to the target_link_libraries approach as we may omit using finalizers with linkers other than ld. Users may enforce finalizers by calling the qt6_enable_resource_objects_finalizer_mode function if need. Refactor tests related to the static resources. Amends ddaa7150d85624ab545ccfe098fe8b2d18241940 Task-number: QTBUG-93002 Change-Id: I74135e291cd82fb54d1b284b4b4a1e002b1fef98 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'cmake/QtPublicTargetHelpers.cmake')
-rw-r--r--cmake/QtPublicTargetHelpers.cmake34
1 files changed, 34 insertions, 0 deletions
diff --git a/cmake/QtPublicTargetHelpers.cmake b/cmake/QtPublicTargetHelpers.cmake
index 9ce8cbf700..1a01a3066b 100644
--- a/cmake/QtPublicTargetHelpers.cmake
+++ b/cmake/QtPublicTargetHelpers.cmake
@@ -14,3 +14,37 @@ function(__qt_internal_strip_target_directory_scope_token target out_var)
string(REGEX REPLACE "::@<.+>$" "" target "${target}")
set("${out_var}" "${target}" PARENT_SCOPE)
endfunction()
+
+function(__qt_internal_process_dependency_resource_objects target)
+ get_target_property(processed ${target} _qt_resource_object_finalizers_processed)
+ if(processed)
+ return()
+ endif()
+ set_target_properties(${target} PROPERTIES _qt_resource_object_finalizers_processed TRUE)
+
+ __qt_internal_check_finalizer_mode(${target} use_finalizer_mode resource_objects)
+ if(NOT use_finalizer_mode)
+ return()
+ endif()
+
+ __qt_internal_collect_dependency_resource_objects(${target} resource_objects)
+ target_sources(${target} PRIVATE "${resource_objects}")
+endfunction()
+
+function(__qt_internal_collect_dependency_resource_objects target out_var)
+ # TODO: The __qt_internal_collect_all_target_dependencies function is not cheap and called
+ # multiple times in the finalizer jobs. It make sense to re-use its results.
+ __qt_internal_collect_all_target_dependencies(${target} dep_targets)
+
+ set(resource_objects "")
+ foreach(dep IN LISTS dep_targets)
+ get_target_property(dep_resource_targets ${dep} _qt_resource_object_libraries)
+ foreach(resource_target IN LISTS dep_resource_targets)
+ if(resource_target)
+ list(PREPEND resource_objects "$<TARGET_OBJECTS:$<TARGET_NAME:${resource_target}>>")
+ endif()
+ endforeach()
+ endforeach()
+
+ set(${out_var} "${resource_objects}" PARENT_SCOPE)
+endfunction()