diff --git a/cmake/QtConfig.cmake.in b/cmake/QtConfig.cmake.in index f9f625c354f..93d9251cb9b 100644 --- a/cmake/QtConfig.cmake.in +++ b/cmake/QtConfig.cmake.in @@ -150,6 +150,10 @@ set(__qt_sanitizer_options_set TRUE) include(CMakeFindDependencyMacro) if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/@INSTALL_CMAKE_NAMESPACE@Dependencies.cmake") include("${CMAKE_CURRENT_LIST_DIR}/@INSTALL_CMAKE_NAMESPACE@Dependencies.cmake") + + _qt_internal_suggest_dependency_debugging( + __qt_@INSTALL_CMAKE_NAMESPACE@_pkg ${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE) + if(NOT @INSTALL_CMAKE_NAMESPACE@_FOUND) # Clear the components, no need to look for them if dependencies were not found, otherwise # you get a wall of recursive error messages. @@ -234,8 +238,12 @@ foreach(module ${@INSTALL_CMAKE_NAMESPACE@_FIND_COMPONENTS}) endif() if(@INSTALL_CMAKE_NAMESPACE@_FIND_REQUIRED_${module}) + set(@INSTALL_CMAKE_NAMESPACE@_FOUND False) set(_Qt_NOTFOUND_MESSAGE "${_Qt_NOTFOUND_MESSAGE}Failed to find required Qt component \"${module}\". ${_qt_component_not_found_msg}") + set(_qt_full_component_name "@INSTALL_CMAKE_NAMESPACE@${module}") + _qt_internal_suggest_dependency_debugging(_qt_full_component_name _Qt_NOTFOUND_MESSAGE) + unset(_qt_full_component_name) break() elseif(NOT @INSTALL_CMAKE_NAMESPACE@_FIND_QUIETLY) message(WARNING @@ -251,7 +259,6 @@ endforeach() if(@INSTALL_CMAKE_NAMESPACE@_FIND_COMPONENTS AND _Qt_NOTFOUND_MESSAGE) set(@INSTALL_CMAKE_NAMESPACE@_NOT_FOUND_MESSAGE "${_Qt_NOTFOUND_MESSAGE}") - set(@INSTALL_CMAKE_NAMESPACE@_FOUND False) unset(_Qt_NOTFOUND_MESSAGE) endif() diff --git a/cmake/QtConfigDependencies.cmake.in b/cmake/QtConfigDependencies.cmake.in index 3f4fe7ff799..d7176435e7a 100644 --- a/cmake/QtConfigDependencies.cmake.in +++ b/cmake/QtConfigDependencies.cmake.in @@ -9,6 +9,6 @@ set(__qt_third_party_deps "@third_party_deps@") # set _NOT_FOUND_MESSAGE which will be displayed by the includer of the Dependencies file. set(${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED FALSE) -_qt_internal_find_third_party_dependencies(Platform __qt_third_party_deps) +_qt_internal_find_third_party_dependencies(@INSTALL_CMAKE_NAMESPACE@ __qt_third_party_deps) set(@INSTALL_CMAKE_NAMESPACE@_FOUND TRUE) diff --git a/cmake/QtModuleConfig.cmake.in b/cmake/QtModuleConfig.cmake.in index 0c0dd8846e1..869c84b1ad2 100644 --- a/cmake/QtModuleConfig.cmake.in +++ b/cmake/QtModuleConfig.cmake.in @@ -14,6 +14,8 @@ get_filename_component(_import_prefix "${_import_prefix}" REALPATH) # Find required dependencies, if any. if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/@INSTALL_CMAKE_NAMESPACE@@target@Dependencies.cmake") include("${CMAKE_CURRENT_LIST_DIR}/@INSTALL_CMAKE_NAMESPACE@@target@Dependencies.cmake") + _qt_internal_suggest_dependency_debugging( + __qt_@target@_pkg ${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE) endif() # If *ConfigDependencies.cmake exists, the variable value will be defined there. diff --git a/cmake/QtModuleDependencies.cmake.in b/cmake/QtModuleDependencies.cmake.in index d2269d64a5c..f050d1323d7 100644 --- a/cmake/QtModuleDependencies.cmake.in +++ b/cmake/QtModuleDependencies.cmake.in @@ -33,7 +33,8 @@ _qt_internal_find_tool_dependencies("@target@" __qt_@target@_tool_deps) # note: target_deps example: "Qt6Core\;5.12.0;Qt6Gui\;5.12.0" set(__qt_@target@_target_deps "@target_deps@") set(__qt_@target@_find_dependency_paths "${CMAKE_CURRENT_LIST_DIR}/.." "${_qt_cmake_dir}") -_qt_internal_find_qt_dependencies(__qt_@target@_target_deps __qt_@target@_find_dependency_paths) +_qt_internal_find_qt_dependencies("@target@" __qt_@target@_target_deps + __qt_@target@_find_dependency_paths) set(_@QT_CMAKE_EXPORT_NAMESPACE@@target@_MODULE_DEPENDENCIES "@qt_module_dependencies@") set(@INSTALL_CMAKE_NAMESPACE@@target@_FOUND TRUE) diff --git a/cmake/QtPluginDependencies.cmake.in b/cmake/QtPluginDependencies.cmake.in index a3ae1215ab8..c9dd1873d81 100644 --- a/cmake/QtPluginDependencies.cmake.in +++ b/cmake/QtPluginDependencies.cmake.in @@ -12,6 +12,7 @@ endif() # note: target_deps example: "Qt6Core\;5.12.0;Qt6Gui\;5.12.0" set(__qt_@target@_target_deps "@target_deps@") set(__qt_@target@_find_dependency_paths "@find_dependency_paths@") -_qt_internal_find_qt_dependencies(__qt_@target@_target_deps __qt_@target@_find_dependency_paths) +_qt_internal_find_qt_dependencies("@target@" __qt_@target@_target_deps + __qt_@target@_find_dependency_paths) set(@target@_FOUND TRUE) diff --git a/cmake/QtPublicDependencyHelpers.cmake b/cmake/QtPublicDependencyHelpers.cmake index 234ef7e5152..6624dcc60dc 100644 --- a/cmake/QtPublicDependencyHelpers.cmake +++ b/cmake/QtPublicDependencyHelpers.cmake @@ -83,19 +83,19 @@ endmacro() # Please note the target_dep_list accepts not the actual list values but the list names that # contain preformed dependencies. See foreach block for reference. # The same applies for find_dependency_path_list. -macro(_qt_internal_find_qt_dependencies target_dep_list find_dependency_path_list) - foreach(__qt_target_dep IN LISTS ${target_dep_list}) - list(GET __qt_target_dep 0 __qt_pkg) - list(GET __qt_target_dep 1 __qt_version) +macro(_qt_internal_find_qt_dependencies target target_dep_list find_dependency_path_list) + foreach(__qt_${target}_target_dep IN LISTS ${target_dep_list}) + list(GET __qt_${target}_target_dep 0 __qt_${target}_pkg) + list(GET __qt_${target}_target_dep 1 __qt_${target}_version) - if (NOT ${__qt_pkg}_FOUND) - set(__qt_pkg_names ${__qt_pkg}) - if(__qt_pkg MATCHES "(.*)Private$") - set(__qt_pkg_names "${CMAKE_MATCH_1};${__qt_pkg}") + if (NOT ${__qt_${target}_pkg}_FOUND) + set(__qt_${target}_pkg_names ${__qt_${target}_pkg}) + if(__qt_${target}_pkg MATCHES "(.*)Private$") + set(__qt_${target}_pkg_names "${CMAKE_MATCH_1};${__qt_${target}_pkg}") endif() - find_dependency(${__qt_pkg} ${__qt_version} + find_dependency(${__qt_${target}_pkg} ${__qt_${target}_version} NAMES - ${__qt_pkg_names} + ${__qt_${target}_pkg_names} PATHS ${${find_dependency_path_list}} ${_qt_additional_packages_prefix_paths} @@ -112,5 +112,30 @@ endmacro() # The name is too generic, it doesn't look for any kind of dependencies but only Qt package # dependencies. macro(_qt_internal_find_dependencies target_dep_list find_dependency_path_list) - _qt_internal_find_qt_dependencies("${target_dep_list}" "${find_dependency_path_list}") + _qt_internal_find_qt_dependencies("none" "${target_dep_list}" "${find_dependency_path_list}") +endmacro() + +# If a dependency package was not found, provide some hints in the error message on how to debug +# the issue. +# pkg_name_var should be the variable name that contains the package that was not found. +# e.g. __qt_Core_pkg +# message_out_var should contain the variable name of the original "not found" message, and it +# will have the hints appended to it as a string. e.g. ${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE +# +# The function should not be called in Dependencies.cmake files directly, because find_dependency +# returns out of the included file. +macro(_qt_internal_suggest_dependency_debugging pkg_name_var message_out_var) + if(${pkg_name_var} + AND NOT ${CMAKE_FIND_PACKAGE_NAME}_FOUND + AND ${message_out_var}) + if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.23") + string(APPEND ${message_out_var} + "\nConfiguring with --debug-find-pkg=${${pkg_name_var}} might reveal \ +details why the package was not found.") + elseif(CMAKE_VERSION VERSION_GREATER_EQUAL "3.17") + string(APPEND ${message_out_var} + "\nConfiguring with -DCMAKE_FIND_DEBUG_MODE=TRUE might reveal \ +details why the package was not found.") + endif() + endif() endmacro()