diff options
author | Alexey Edelev <alexey.edelev@qt.io> | 2021-05-19 19:46:24 +0200 |
---|---|---|
committer | Alexey Edelev <alexey.edelev@qt.io> | 2021-05-27 14:28:17 +0200 |
commit | 19e789bace887105badae83c0a79429bbf8e8221 (patch) | |
tree | 1e369b20032c64cc5cb49b9073dbc70df11325d5 /cmake/QtPublicTargetHelpers.cmake | |
parent | 029425478aed1454ec3f374af0284371d050ca68 (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.cmake | 34 |
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() |