0e0352ab4d
Previously we called _qt_internal_override_example_install_dir_to_dot
in Qt6CoreConfigExtras.cmake as part of a
find_package(Qt6 COMPONENTS Core) call, and we assumed that the
Extras file would always be included in each example project.
But our package dependencies handling code skips calling
find_package(Qt6Core) if Qt6Core_FOUND is already set to TRUE,
which will definitely happen due to root-scope find_package
calls when configuring other repos.
That means we wouldn't override INSTALL_EXAMPLEDIR to "."
and the install destination would end up being something like
${CMAKE_INSTALL_PREFIX}/example_relative_path/example_relative_path
aka a double nested path.
Make sure we call the
_qt_internal_override_example_install_dir_to_dot function
in Qt6ConfigConfig.cmake in addition to Qt6CoreConfig.cmake.
That way, even if Qt6Core is skipped during dependency resolution,
it's still handled by the Qt6 package itself.
Because the function is defined in the Core package, guard the call
with an if(COMMAND) and only call the function if it wasn't previously
called within the current or ancestor scopes.
Amends ac4a913f33
Pick-to: 6.2 6.3 6.4
Fixes: QTBUG-102879
Change-Id: Id47e3ce06faec6d156ae1473942dae0f9b90cb46
Reviewed-by: Christophe Giboudeaux <christophe@krop.fr>
Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
271 lines
12 KiB
CMake
271 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()
|
|
|
|
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})
|
|
|
|
if(NOT @INSTALL_CMAKE_NAMESPACE@${module}_FOUND)
|
|
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}
|
|
)
|
|
endif()
|
|
|
|
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()
|
|
|
|
if(@INSTALL_CMAKE_NAMESPACE@_FOUND
|
|
AND COMMAND _qt_internal_override_example_install_dir_to_dot
|
|
AND NOT _qt_internal_example_dir_set_to_dot)
|
|
_qt_internal_override_example_install_dir_to_dot()
|
|
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()
|