diff options
author | Alexandru Croitor <[email protected]> | 2025-06-27 14:22:00 +0200 |
---|---|---|
committer | Alexandru Croitor <[email protected]> | 2025-06-28 12:08:14 +0200 |
commit | e5510913a14d5a92a64a8e6ebf7524c01b1f739e (patch) | |
tree | c8516f3e20f26c7fb154c0ccd5093125275be2aa | |
parent | dd262d8e2d2e05c031349c00718e22b89a2b613c (diff) |
CMake: Move qt_internal_work_around_autogen_discarded_dependencies
Move it to a public Helpers file, so we can call it also from public
API, because there are cases when we need the workaround for public
API calls as well.
Amends fcb20586316aff2ccc39e2ae840b79f8b0e904a7
Pick-to: 6.5 6.8 6.9 6.10
Task-number: QTBUG-133725
Task-number: QTBUG-137587
Change-Id: I9aef59f5eadc78fd581b24790e6b69795c32c1bf
Reviewed-by: Alexey Edelev <[email protected]>
-rw-r--r-- | cmake/QtAutogenHelpers.cmake | 46 | ||||
-rw-r--r-- | cmake/QtPublicTargetHelpers.cmake | 47 | ||||
-rw-r--r-- | cmake/QtTargetHelpers.cmake | 2 |
3 files changed, 48 insertions, 47 deletions
diff --git a/cmake/QtAutogenHelpers.cmake b/cmake/QtAutogenHelpers.cmake index 8aabb09e14a..b50dd0b2899 100644 --- a/cmake/QtAutogenHelpers.cmake +++ b/cmake/QtAutogenHelpers.cmake @@ -215,49 +215,3 @@ function(qt_make_output_file infile prefix suffix source_dir binary_dir result) set("${result}" "${outpath}/${prefix}${outfilename}${suffix}" PARENT_SCOPE) endfunction() -# Work around AUTOGEN issue when a library is added as a dependency more than once, and the autogen -# library dependency results in being discarded. To mitigate that, add all autogen dependencies -# manually, based on the passed in dependencies. -# CMake 4.0+ has a fix, so we don't need the extra logic. -# See https://gitlab.kitware.com/cmake/cmake/-/issues/26700 -function(qt_internal_work_around_autogen_discarded_dependencies target) - if(CMAKE_VERSION VERSION_GREATER_EQUAL 4.0 - OR QT_NO_AUTOGEN_DISCARDED_DEPENDENCIES_WORKAROUND) - return() - endif() - - set(libraries ${ARGN}) - set(final_libraries "") - - foreach(lib IN LISTS libraries) - # Skip non-target dependencies. - if(NOT TARGET "${lib}") - continue() - endif() - - # Resolve alias targets, because AUTOGEN_TARGET_DEPENDS doesn't seem to handle them. - _qt_internal_dealias_target(lib) - - # Skip imported targets, they don't have sync_headers targets. - get_target_property(imported "${lib}" IMPORTED) - if(imported) - continue() - endif() - - # Resolve Qt private modules to their public counterparts. - get_target_property(is_private_module "${lib}" _qt_is_private_module) - get_target_property(public_module_target "${lib}" _qt_public_module_target_name) - - if(is_private_module AND public_module_target) - set(lib "${public_module_target}") - endif() - - # Another TARGET check, just in case. - if(TARGET "${lib}") - list(APPEND final_libraries "${lib}") - endif() - endforeach() - if(final_libraries) - set_property(TARGET ${target} APPEND PROPERTY AUTOGEN_TARGET_DEPENDS "${final_libraries}") - endif() -endfunction() diff --git a/cmake/QtPublicTargetHelpers.cmake b/cmake/QtPublicTargetHelpers.cmake index b62c5e6ae3d..e0be0b740e7 100644 --- a/cmake/QtPublicTargetHelpers.cmake +++ b/cmake/QtPublicTargetHelpers.cmake @@ -18,6 +18,53 @@ function(__qt_internal_strip_target_directory_scope_token target out_var) set("${out_var}" "${target}" PARENT_SCOPE) endfunction() +# Work around AUTOGEN issue when a library is added as a dependency more than once, and the autogen +# library dependency results in being discarded. To mitigate that, add all autogen dependencies +# manually, based on the passed in dependencies. +# CMake 4.0+ has a fix, so we don't need the extra logic. +# See https://gitlab.kitware.com/cmake/cmake/-/issues/26700 +function(_qt_internal_work_around_autogen_discarded_dependencies target) + if(CMAKE_VERSION VERSION_GREATER_EQUAL 4.0 + OR QT_NO_AUTOGEN_DISCARDED_DEPENDENCIES_WORKAROUND) + return() + endif() + + set(libraries ${ARGN}) + set(final_libraries "") + + foreach(lib IN LISTS libraries) + # Skip non-target dependencies. + if(NOT TARGET "${lib}") + continue() + endif() + + # Resolve alias targets, because AUTOGEN_TARGET_DEPENDS doesn't seem to handle them. + _qt_internal_dealias_target(lib) + + # Skip imported targets, they don't have sync_headers targets. + get_target_property(imported "${lib}" IMPORTED) + if(imported) + continue() + endif() + + # Resolve Qt private modules to their public counterparts. + get_target_property(is_private_module "${lib}" _qt_is_private_module) + get_target_property(public_module_target "${lib}" _qt_public_module_target_name) + + if(is_private_module AND public_module_target) + set(lib "${public_module_target}") + endif() + + # Another TARGET check, just in case. + if(TARGET "${lib}") + list(APPEND final_libraries "${lib}") + endif() + endforeach() + if(final_libraries) + set_property(TARGET ${target} APPEND PROPERTY AUTOGEN_TARGET_DEPENDS "${final_libraries}") + endif() +endfunction() + # Tests if linker could resolve circular dependencies between object files and static libraries. function(__qt_internal_static_link_order_public_test result) # We could trust iOS linker diff --git a/cmake/QtTargetHelpers.cmake b/cmake/QtTargetHelpers.cmake index 25f6ec07046..cbf0df3b7f3 100644 --- a/cmake/QtTargetHelpers.cmake +++ b/cmake/QtTargetHelpers.cmake @@ -235,7 +235,7 @@ function(qt_internal_extend_target target) endif() set(all_libraries ${arg_LIBRARIES} ${arg_PUBLIC_LIBRARIES}) - qt_internal_work_around_autogen_discarded_dependencies(${target} ${all_libraries}) + _qt_internal_work_around_autogen_discarded_dependencies(${target} ${all_libraries}) if(QT_GENERATE_SBOM) set(sbom_args "") |