0d91f85f6c
When a Qt component or dependency is not found, we will now show a message that the user can reconfigure the project with -DQT_DEBUG_FIND_PACKAGE=ON. If the option is enabled, various variables that find_package uses to find packages (like CMAKE_PREFIX_PATH, CMAKE_FIND_ROOT_PATH) will be recorded before each find_package / find_dependency call that is executed in any of the Qt package files. If any find_package call fails (a package has its _FOUND variable set to 0), the values of all those recorded variables will be shown. This is useful to troubleshoot issues, especially when cross-compiling, without having to manually modify the various Config files. Pick-to: 6.4 Task-number: QTBUG-104998 Change-Id: I3654960597911bd704fbe3c419bcae347ab739a9 Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
273 lines
12 KiB
CMake
273 lines
12 KiB
CMake
@PACKAGE_INIT@
|
|
|
|
cmake_minimum_required(VERSION @min_new_policy_version@...@max_new_policy_version@)
|
|
|
|
include("${CMAKE_CURRENT_LIST_DIR}/@INSTALL_CMAKE_NAMESPACE@ConfigExtras.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/QtPublicCMakeVersionHelpers.cmake")
|
|
__qt_internal_require_suitable_cmake_version_for_using_qt()
|
|
|
|
get_filename_component(_qt_cmake_dir "${CMAKE_CURRENT_LIST_DIR}/.." ABSOLUTE)
|
|
set(_qt_@PROJECT_VERSION_MAJOR@_config_cmake_dir "${CMAKE_CURRENT_LIST_DIR}")
|
|
|
|
if (NOT QT_NO_CREATE_TARGETS)
|
|
include("${CMAKE_CURRENT_LIST_DIR}/@INSTALL_CMAKE_NAMESPACE@Targets.cmake")
|
|
if(NOT QT_NO_CREATE_VERSIONLESS_TARGETS)
|
|
include("${CMAKE_CURRENT_LIST_DIR}/@INSTALL_CMAKE_NAMESPACE@VersionlessTargets.cmake")
|
|
endif()
|
|
else()
|
|
# For examples using `find_package(...)` inside their CMakeLists.txt files:
|
|
# Make CMake's AUTOGEN detect this Qt version properly
|
|
set_directory_properties(PROPERTIES
|
|
QT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
|
|
QT_VERSION_MINOR @PROJECT_VERSION_MINOR@
|
|
QT_VERSION_PATCH @PROJECT_VERSION_PATCH@)
|
|
endif()
|
|
|
|
if(NOT "${QT_HOST_PATH}" STREQUAL "")
|
|
find_package(Qt@PROJECT_VERSION_MAJOR@HostInfo
|
|
CONFIG
|
|
REQUIRED
|
|
PATHS "${QT_HOST_PATH}"
|
|
"${QT_HOST_PATH_CMAKE_DIR}"
|
|
NO_CMAKE_FIND_ROOT_PATH
|
|
NO_DEFAULT_PATH)
|
|
endif()
|
|
|
|
get_filename_component(_qt_import_prefix "${CMAKE_CURRENT_LIST_FILE}" PATH)
|
|
get_filename_component(_qt_import_prefix "${_qt_import_prefix}" REALPATH)
|
|
list(APPEND CMAKE_MODULE_PATH "${_qt_import_prefix}")
|
|
list(APPEND CMAKE_MODULE_PATH "${_qt_import_prefix}/3rdparty/extra-cmake-modules/find-modules")
|
|
list(APPEND CMAKE_MODULE_PATH "${_qt_import_prefix}/3rdparty/kwin")
|
|
|
|
if(APPLE AND (NOT CMAKE_SYSTEM_NAME OR CMAKE_SYSTEM_NAME STREQUAL "Darwin"))
|
|
# Add module directory to pick up custom Info.plist template for macOS
|
|
list(APPEND CMAKE_MODULE_PATH "${_qt_import_prefix}/macos")
|
|
elseif(APPLE AND CMAKE_SYSTEM_NAME STREQUAL "iOS")
|
|
# Add module directory to pick up custom Info.plist template for iOS
|
|
set(__qt_internal_cmake_ios_support_files_path "${_qt_import_prefix}/ios")
|
|
list(APPEND CMAKE_MODULE_PATH "${__qt_internal_cmake_ios_support_files_path}")
|
|
endif()
|
|
|
|
set(QT_ADDITIONAL_PACKAGES_PREFIX_PATH "" CACHE STRING
|
|
"Additional directories where find(Qt6 ...) components are searched")
|
|
set(QT_ADDITIONAL_HOST_PACKAGES_PREFIX_PATH "" CACHE STRING
|
|
"Additional directories where find(Qt6 ...) host Qt components are searched")
|
|
|
|
# Collect additional package prefix paths to look for Qt packages, both from command line and the
|
|
# env variable ${prefixes_var}. The result is stored in ${out_var} and is a list of paths ending
|
|
# with "/lib/cmake".
|
|
function(__qt_internal_collect_additional_prefix_paths out_var prefixes_var)
|
|
if(DEFINED "${out_var}")
|
|
return()
|
|
endif()
|
|
|
|
set(additional_packages_prefix_paths "")
|
|
|
|
set(additional_packages_prefixes "")
|
|
if(${prefixes_var})
|
|
list(APPEND additional_packages_prefixes ${${prefixes_var}})
|
|
endif()
|
|
if(DEFINED ENV{${prefixes_var}}
|
|
AND NOT "$ENV{${prefixes_var}}" STREQUAL "")
|
|
set(prefixes_from_env "$ENV{${prefixes_var}}")
|
|
if(NOT CMAKE_HOST_WIN32)
|
|
string(REPLACE ":" ";" prefixes_from_env "${prefixes_from_env}")
|
|
endif()
|
|
list(APPEND additional_packages_prefixes ${prefixes_from_env})
|
|
endif()
|
|
|
|
foreach(additional_path IN LISTS additional_packages_prefixes)
|
|
file(TO_CMAKE_PATH "${additional_path}" additional_path)
|
|
|
|
# The prefix paths need to end with lib/cmake to ensure the packages are found when
|
|
# cross compiling. Search for REROOT_PATH_ISSUE_MARKER in the qt.toolchain.cmake file for
|
|
# details.
|
|
# We must pass the values via the PATHS options because the main find_package call uses
|
|
# NO_DEFAULT_PATH, and thus CMAKE_PREFIX_PATH values are discarded.
|
|
# CMAKE_FIND_ROOT_PATH values are not discarded and togegher with the PATHS option, it
|
|
# ensures packages from additional prefixes are found.
|
|
if(NOT additional_path MATCHES "/lib/cmake$")
|
|
string(APPEND additional_path "/lib/cmake")
|
|
endif()
|
|
list(APPEND additional_packages_prefix_paths "${additional_path}")
|
|
endforeach()
|
|
|
|
set("${out_var}" "${additional_packages_prefix_paths}" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
__qt_internal_collect_additional_prefix_paths(_qt_additional_packages_prefix_paths
|
|
QT_ADDITIONAL_PACKAGES_PREFIX_PATH)
|
|
__qt_internal_collect_additional_prefix_paths(_qt_additional_host_packages_prefix_paths
|
|
QT_ADDITIONAL_HOST_PACKAGES_PREFIX_PATH)
|
|
|
|
# Take a list of prefix paths ending with "/lib/cmake", and return a list of absolute paths with
|
|
# "/lib/cmake" removed.
|
|
function(__qt_internal_prefix_paths_to_roots out_var prefix_paths)
|
|
set(result "")
|
|
foreach(path IN LISTS prefix_paths)
|
|
if(path MATCHES "/lib/cmake$")
|
|
string(APPEND path "/../..")
|
|
endif()
|
|
get_filename_component(path "${path}" ABSOLUTE)
|
|
list(APPEND result "${path}")
|
|
endforeach()
|
|
set("${out_var}" "${result}" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
__qt_internal_prefix_paths_to_roots(_qt_additional_host_packages_root_paths
|
|
"${_qt_additional_host_packages_prefix_paths}")
|
|
|
|
# Public helpers available to all Qt packages.
|
|
include("${CMAKE_CURRENT_LIST_DIR}/QtFeature.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/QtPublicFinalizerHelpers.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/QtPublicPluginHelpers.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/QtPublicTargetHelpers.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/QtPublicWalkLibsHelpers.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/QtPublicFindPackageHelpers.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/QtPublicDependencyHelpers.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/QtPublicToolHelpers.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/QtPublicCMakeHelpers.cmake")
|
|
|
|
if(NOT DEFINED QT_CMAKE_EXPORT_NAMESPACE)
|
|
set(QT_CMAKE_EXPORT_NAMESPACE @QT_CMAKE_EXPORT_NAMESPACE@)
|
|
endif()
|
|
|
|
# Propagate sanitizer flags to both internal Qt builds and user projects.
|
|
# Allow opt-out in case if downstream projects handle it in a different way.
|
|
set(QT_CONFIGURED_SANITIZER_OPTIONS "@ECM_ENABLE_SANITIZERS@")
|
|
|
|
if(QT_CONFIGURED_SANITIZER_OPTIONS
|
|
AND NOT __qt_sanitizer_options_set
|
|
AND NOT QT_NO_ADD_SANITIZER_OPTIONS)
|
|
set(ECM_ENABLE_SANITIZERS "${QT_CONFIGURED_SANITIZER_OPTIONS}")
|
|
include(
|
|
"${CMAKE_CURRENT_LIST_DIR}/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake")
|
|
endif()
|
|
# Mark that the current directory scope has its sanitizer flags set.
|
|
set(__qt_sanitizer_options_set TRUE)
|
|
|
|
# Find required dependencies, if any.
|
|
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(@INSTALL_CMAKE_NAMESPACE@
|
|
__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.
|
|
set(@INSTALL_CMAKE_NAMESPACE@_FIND_COMPONENTS "")
|
|
endif()
|
|
endif()
|
|
|
|
set(_@INSTALL_CMAKE_NAMESPACE@_FIND_PARTS_QUIET)
|
|
if(@INSTALL_CMAKE_NAMESPACE@_FIND_QUIETLY)
|
|
set(_@INSTALL_CMAKE_NAMESPACE@_FIND_PARTS_QUIET QUIET)
|
|
endif()
|
|
|
|
set(__qt_use_no_default_path_for_qt_packages "NO_DEFAULT_PATH")
|
|
if(QT_DISABLE_NO_DEFAULT_PATH_IN_QT_PACKAGES)
|
|
set(__qt_use_no_default_path_for_qt_packages "")
|
|
endif()
|
|
|
|
foreach(module ${@INSTALL_CMAKE_NAMESPACE@_FIND_COMPONENTS})
|
|
if(NOT "${QT_HOST_PATH}" STREQUAL ""
|
|
AND "${module}" MATCHES "Tools$"
|
|
AND NOT "${module}" MATCHES "UiTools$"
|
|
AND NOT "${module}" MATCHES "ShaderTools$"
|
|
AND NOT "${module}" MATCHES "^Tools$"
|
|
AND NOT QT_NO_FIND_HOST_TOOLS_PATH_MANIPULATION)
|
|
# Make sure that a Qt*Tools package is also looked up in QT_HOST_PATH.
|
|
# But don't match QtShaderTools and QtTools which are cross-compiled target package names.
|
|
# Allow opt out just in case.
|
|
get_filename_component(__qt_find_package_host_qt_path
|
|
"${Qt@PROJECT_VERSION_MAJOR@HostInfo_DIR}/.." ABSOLUTE)
|
|
set(__qt_backup_cmake_prefix_path "${CMAKE_PREFIX_PATH}")
|
|
set(__qt_backup_cmake_find_root_path "${CMAKE_FIND_ROOT_PATH}")
|
|
list(PREPEND CMAKE_PREFIX_PATH "${__qt_find_package_host_qt_path}"
|
|
${_qt_additional_host_packages_prefix_paths})
|
|
list(PREPEND CMAKE_FIND_ROOT_PATH "${QT_HOST_PATH}"
|
|
${_qt_additional_host_packages_root_paths})
|
|
endif()
|
|
|
|
_qt_internal_save_find_package_context_for_debugging(@INSTALL_CMAKE_NAMESPACE@${module})
|
|
|
|
find_package(@INSTALL_CMAKE_NAMESPACE@${module}
|
|
${@INSTALL_CMAKE_NAMESPACE@_FIND_VERSION}
|
|
${_@INSTALL_CMAKE_NAMESPACE@_FIND_PARTS_QUIET}
|
|
PATHS
|
|
${_qt_cmake_dir}
|
|
${_qt_additional_packages_prefix_paths}
|
|
${QT_EXAMPLES_CMAKE_PREFIX_PATH}
|
|
${__qt_find_package_host_qt_path}
|
|
${_qt_additional_host_packages_prefix_paths}
|
|
${__qt_use_no_default_path_for_qt_packages}
|
|
)
|
|
|
|
if(NOT "${__qt_find_package_host_qt_path}" STREQUAL "")
|
|
set(CMAKE_PREFIX_PATH "${__qt_backup_cmake_prefix_path}")
|
|
set(CMAKE_FIND_ROOT_PATH "${__qt_backup_cmake_find_root_path}")
|
|
unset(__qt_backup_cmake_prefix_path)
|
|
unset(__qt_backup_cmake_find_root_path)
|
|
unset(__qt_find_package_host_qt_path)
|
|
endif()
|
|
|
|
if (NOT @INSTALL_CMAKE_NAMESPACE@${module}_FOUND)
|
|
set(_qt_expected_component_config_path
|
|
"${_qt_cmake_dir}/@INSTALL_CMAKE_NAMESPACE@${module}/@INSTALL_CMAKE_NAMESPACE@${module}Config.cmake")
|
|
get_filename_component(
|
|
_qt_expected_component_dir_path "${_qt_expected_component_config_path}" DIRECTORY)
|
|
|
|
set(_qt_component_not_found_msg
|
|
"\nExpected Config file at \"${_qt_expected_component_config_path}\"")
|
|
|
|
if(EXISTS "${_qt_expected_component_config_path}")
|
|
string(APPEND _qt_component_not_found_msg " exists \n")
|
|
else()
|
|
string(APPEND _qt_component_not_found_msg " does NOT exist\n")
|
|
endif()
|
|
|
|
set(_qt_candidate_component_dir_path "${@INSTALL_CMAKE_NAMESPACE@${module}_DIR}")
|
|
|
|
if(_qt_candidate_component_dir_path AND
|
|
NOT _qt_expected_component_dir_path STREQUAL _qt_candidate_component_dir_path)
|
|
string(APPEND _qt_component_not_found_msg
|
|
"\n@INSTALL_CMAKE_NAMESPACE@${module}_DIR was computed by CMake or specified on the "
|
|
"command line by the user: \"${_qt_candidate_component_dir_path}\" "
|
|
"\nThe expected and computed paths are different, which might be the reason for "
|
|
"the package not to be found.")
|
|
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_full_component_name _Qt_NOTFOUND_MESSAGE)
|
|
unset(_qt_full_component_name)
|
|
break()
|
|
elseif(NOT @INSTALL_CMAKE_NAMESPACE@_FIND_QUIETLY)
|
|
message(WARNING
|
|
"Failed to find optional Qt component \"${module}\". ${_qt_component_not_found_msg}")
|
|
endif()
|
|
|
|
unset(_qt_expected_component_config_path)
|
|
unset(_qt_expected_component_dir_path)
|
|
unset(_qt_candidate_component_dir_path)
|
|
unset(_qt_component_not_found_msg)
|
|
endif()
|
|
endforeach()
|
|
|
|
if(@INSTALL_CMAKE_NAMESPACE@_FIND_COMPONENTS AND _Qt_NOTFOUND_MESSAGE)
|
|
set(@INSTALL_CMAKE_NAMESPACE@_NOT_FOUND_MESSAGE "${_Qt_NOTFOUND_MESSAGE}")
|
|
unset(_Qt_NOTFOUND_MESSAGE)
|
|
endif()
|
|
|
|
__qt_internal_defer_promote_targets_in_dir_scope_to_global()
|
|
if(CMAKE_VERSION VERSION_LESS 3.21)
|
|
__qt_internal_check_link_order_matters()
|
|
__qt_internal_check_cmp0099_available()
|
|
endif()
|