summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandru Croitor <[email protected]>2025-06-27 14:22:00 +0200
committerAlexandru Croitor <[email protected]>2025-06-28 12:08:14 +0200
commite5510913a14d5a92a64a8e6ebf7524c01b1f739e (patch)
treec8516f3e20f26c7fb154c0ccd5093125275be2aa
parentdd262d8e2d2e05c031349c00718e22b89a2b613c (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.cmake46
-rw-r--r--cmake/QtPublicTargetHelpers.cmake47
-rw-r--r--cmake/QtTargetHelpers.cmake2
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 "")