From 82601c120501cbb03985d456edd69eec4cfe5bc8 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Mon, 12 Dec 2022 12:40:02 +0100 Subject: [PATCH] CMake: Handle non-existent targets when collecting dependencies When collecting the dependencies of a target, it can happen that we encounter a target that is not visible in the current directory scope. This can usually be fixed by moving the corresponding find_package call to a higher directory. Detect this situation and print a warning with instruction how to silence this warning: either by fixing the situation or by setting QT_SILENCE_MISSING_DEPENDENCY_TARGET_WARNING. Fixes: QTBUG-108286 Change-Id: I9033fedbd81ef0710b7cc11fab0e94e67c74ff86 Reviewed-by: Alexandru Croitor --- cmake/QtPublicWalkLibsHelpers.cmake | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/cmake/QtPublicWalkLibsHelpers.cmake b/cmake/QtPublicWalkLibsHelpers.cmake index ebcaad4c786..f0d9280637c 100644 --- a/cmake/QtPublicWalkLibsHelpers.cmake +++ b/cmake/QtPublicWalkLibsHelpers.cmake @@ -277,6 +277,18 @@ ${target}, but not declared.") set(${rcc_objects_out_var} ${rcc_objects} PARENT_SCOPE) endfunction() +function(__qt_internal_print_missing_dependency_target_warning target dep) + if(QT_SILENCE_MISSING_DEPENDENCY_TARGET_WARNING) + return() + endif() + message(WARNING + "When trying to collect dependencies of target '${target}', " + "the non-existent target '${dep}' was encountered. " + "This can likely be fixed by moving the find_package call that pulls in " + "'${dep}' to the scope of directory '${CMAKE_CURRENT_LIST_DIR}' or higher. " + "This warning can be silenced by setting QT_SILENCE_MISSING_DEPENDENCY_TARGET_WARNING to " + "ON.") +endfunction() # Given ${target}, collect all its private dependencies that are CMake targets. # @@ -303,9 +315,14 @@ function(__qt_internal_collect_all_target_dependencies target out_var) "qt_private_link_library_targets" "collect_targets") - if(lib_walked_targets) - list(APPEND dep_targets ${lib_walked_targets}) - endif() + foreach(lib_target IN LISTS lib_walked_targets) + if(NOT TARGET "${lib_target}") + __qt_internal_print_missing_dependency_target_warning(${target} + ${lib_target}) + continue() + endif() + list(APPEND dep_targets ${lib_target}) + endforeach() endif() endforeach() endif()