diff --git a/cmake/QtAutogenHelpers.cmake b/cmake/QtAutogenHelpers.cmake index 029a709e90c..aecbf549f0d 100644 --- a/cmake/QtAutogenHelpers.cmake +++ b/cmake/QtAutogenHelpers.cmake @@ -214,3 +214,53 @@ function(qt_make_output_file infile prefix suffix source_dir binary_dir result) file(MAKE_DIRECTORY "${outpath}") 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. + get_target_property(aliased_target "${lib}" ALIASED_TARGET) + if(aliased_target) + set(lib "${aliased_target}") + endif() + + # 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/QtTargetHelpers.cmake b/cmake/QtTargetHelpers.cmake index 261592ab84d..658239628d2 100644 --- a/cmake/QtTargetHelpers.cmake +++ b/cmake/QtTargetHelpers.cmake @@ -232,6 +232,9 @@ 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}) + if(QT_GENERATE_SBOM) set(sbom_args "") _qt_internal_forward_function_args(