diff options
author | Alexandru Croitor <alexandru.croitor@qt.io> | 2022-07-18 16:09:30 +0200 |
---|---|---|
committer | Alexandru Croitor <alexandru.croitor@qt.io> | 2022-07-25 19:52:25 +0200 |
commit | 0f8017efb6d037c4f33f947eb3c56aeafa28313c (patch) | |
tree | 78ea843629b21b699cdb02c3a659f53e9aef27d2 | |
parent | 7b24ffa936880619f54c8cc1a459a0328238657c (diff) |
CMake: Move QT_HOST_PATH check and computation into Qt6 package
Instead of trying to compute and validate the QT_HOST_PATH and
QT_HOST_PATH_CMAKE_DIR variables in the generated toolchain file,
do it in the Qt6 package.
This provides better error messages when a project is configured
without using the Qt generated toolchain file.
Because it's not done in the toolchain anymore, remove the various
host variables from __qt_toolchain_used_variables.
Pick-to: 6.4
Task-number: QTBUG-104998
Change-Id: I1ca239ff83b8f783897e171fee352fc43e8ad7a8
Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
-rw-r--r-- | cmake/QtConfigDependencies.cmake.in | 7 | ||||
-rw-r--r-- | cmake/QtPostProcessHelpers.cmake | 8 | ||||
-rw-r--r-- | cmake/QtPublicDependencyHelpers.cmake | 76 | ||||
-rw-r--r-- | cmake/QtToolchainHelpers.cmake | 15 | ||||
-rw-r--r-- | cmake/qt.toolchain.cmake.in | 71 |
5 files changed, 90 insertions, 87 deletions
diff --git a/cmake/QtConfigDependencies.cmake.in b/cmake/QtConfigDependencies.cmake.in index a369b9035f..c17ae28bac 100644 --- a/cmake/QtConfigDependencies.cmake.in +++ b/cmake/QtConfigDependencies.cmake.in @@ -1,6 +1,13 @@ set(@INSTALL_CMAKE_NAMESPACE@_FOUND FALSE) set(__qt_platform_requires_host_info_package "@platform_requires_host_info_package@") +set(__qt_platform_initial_qt_host_path "@qt_host_path_absolute@") +set(__qt_platform_initial_qt_host_path_cmake_dir "@qt_host_path_cmake_dir_absolute@") + +_qt_internal_setup_qt_host_path( + "${__qt_platform_requires_host_info_package}" + "${__qt_platform_initial_qt_host_path}" + "${__qt_platform_initial_qt_host_path_cmake_dir}") _qt_internal_find_host_info_package(${__qt_platform_requires_host_info_package}) # note: _third_party_deps example: "ICU\\;FALSE\\;1.0\\;i18n uc data;ZLIB\\;FALSE\\;\\;" diff --git a/cmake/QtPostProcessHelpers.cmake b/cmake/QtPostProcessHelpers.cmake index 5507f552de..b6cbb2c4b9 100644 --- a/cmake/QtPostProcessHelpers.cmake +++ b/cmake/QtPostProcessHelpers.cmake @@ -371,6 +371,14 @@ endif()") _qt_internal_determine_if_host_info_package_needed(platform_requires_host_info_package) + if(platform_requires_host_info_package) + # TODO: Figure out how to make the initial QT_HOST_PATH var relocatable in relation + # to the target CMAKE_INSTALL_DIR, if at all possible to do so in a reliable way. + get_filename_component(qt_host_path_absolute "${QT_HOST_PATH}" ABSOLUTE) + get_filename_component(qt_host_path_cmake_dir_absolute + "${Qt${PROJECT_VERSION_MAJOR}HostInfo_DIR}/.." ABSOLUTE) + endif() + if(third_party_deps OR platform_requires_host_info_package) # Setup build and install paths. set(path_suffix "${INSTALL_CMAKE_NAMESPACE}") diff --git a/cmake/QtPublicDependencyHelpers.cmake b/cmake/QtPublicDependencyHelpers.cmake index 2e3db75007..abd1de235c 100644 --- a/cmake/QtPublicDependencyHelpers.cmake +++ b/cmake/QtPublicDependencyHelpers.cmake @@ -194,7 +194,11 @@ endmacro() function(_qt_internal_determine_if_host_info_package_needed out_var) set(needed FALSE) - if(NOT "${QT_HOST_PATH}" STREQUAL "") + + # If a QT_HOST_PATH is provided when configuring qtbase, we assume it's a cross build + # and thus we require the QT_HOST_PATH to be provided also when using the cross-built Qt. + # This tells the QtConfigDependencies file to do appropriate requirement checks. + if(NOT "${QT_HOST_PATH}" STREQUAL "" AND NOT QT_NO_REQUIRE_HOST_PATH_CHECK) set(needed TRUE) endif() set(${out_var} "${needed}" PARENT_SCOPE) @@ -211,3 +215,73 @@ macro(_qt_internal_find_host_info_package platform_requires_host_info) NO_DEFAULT_PATH) endif() endmacro() + +macro(_qt_internal_setup_qt_host_path + host_path_required + initial_qt_host_path + initial_qt_host_path_cmake_dir + ) + # Set up QT_HOST_PATH and do sanity checks. + # A host path is required when cross-compiling but optional when doing a native build. + # Requiredness can be overridden via variable. + if(DEFINED QT_REQUIRE_HOST_PATH_CHECK) + set(_qt_platform_host_path_required "${QT_REQUIRE_HOST_PATH_CHECK}") + else() + set(_qt_platform_host_path_required "${host_path_required}") + endif() + + if(_qt_platform_host_path_required) + # QT_HOST_PATH precedence: + # - cache variable / command line option + # - environment variable + # - initial QT_HOST_PATH when qtbase was configured (and the directory exists) + if(NOT DEFINED QT_HOST_PATH) + if(DEFINED ENV{QT_HOST_PATH}) + set(QT_HOST_PATH "$ENV{QT_HOST_PATH}" CACHE PATH "") + elseif(NOT "${initial_qt_host_path}" STREQUAL "" AND EXISTS "${initial_qt_host_path}") + set(QT_HOST_PATH "${initial_qt_host_path}" CACHE PATH "") + endif() + endif() + + if(NOT QT_HOST_PATH STREQUAL "") + get_filename_component(_qt_platform_host_path_absolute "${QT_HOST_PATH}" ABSOLUTE) + endif() + + if("${QT_HOST_PATH}" STREQUAL "" OR NOT EXISTS "${_qt_platform_host_path_absolute}") + message(FATAL_ERROR + "To use a cross-compiled Qt, please set the QT_HOST_PATH cache variable to the " + "location of your host Qt installation.") + endif() + + # QT_HOST_PATH_CMAKE_DIR is needed to work around the rerooting issue when looking for host + # tools. See REROOT_PATH_ISSUE_MARKER. + # Prefer initially configured path if none was explicitly set. + if(NOT DEFINED QT_HOST_PATH_CMAKE_DIR) + if(NOT "${initial_qt_host_path_cmake_dir}" STREQUAL "" + AND EXISTS "${initial_qt_host_path_cmake_dir}") + set(QT_HOST_PATH_CMAKE_DIR "${initial_qt_host_path_cmake_dir}" CACHE PATH "") + else() + # First try to auto-compute the location instead of requiring to set + # QT_HOST_PATH_CMAKE_DIR explicitly. + set(__qt_candidate_host_path_cmake_dir "${QT_HOST_PATH}/lib/cmake") + if(__qt_candidate_host_path_cmake_dir + AND EXISTS "${__qt_candidate_host_path_cmake_dir}") + set(QT_HOST_PATH_CMAKE_DIR + "${__qt_candidate_host_path_cmake_dir}" CACHE PATH "") + endif() + endif() + endif() + + if(NOT QT_HOST_PATH_CMAKE_DIR STREQUAL "") + get_filename_component(_qt_platform_host_path_cmake_dir_absolute + "${QT_HOST_PATH_CMAKE_DIR}" ABSOLUTE) + endif() + + if("${QT_HOST_PATH_CMAKE_DIR}" STREQUAL "" + OR NOT EXISTS "${_qt_platform_host_path_cmake_dir_absolute}") + message(FATAL_ERROR + "To use a cross-compiled Qt, please set the QT_HOST_PATH_CMAKE_DIR cache variable " + "to the location of your host Qt installation lib/cmake directory.") + endif() + endif() +endmacro() diff --git a/cmake/QtToolchainHelpers.cmake b/cmake/QtToolchainHelpers.cmake index 6a003d3e9b..451e564221 100644 --- a/cmake/QtToolchainHelpers.cmake +++ b/cmake/QtToolchainHelpers.cmake @@ -2,21 +2,6 @@ # as well as CMake application projects. # Expects various global variables to be set. function(qt_internal_create_toolchain_file) - set(qt_host_path_required FALSE) - - if(NOT "${QT_HOST_PATH}" STREQUAL "") - # If a QT_HOST_PATH is provided when configuring qtbase, we assume it's a cross build - # and thus we require the QT_HOST_PATH to be provided also when using the cross-built Qt. - # This tells the Qt toolchain file to do appropriate requirement checks. - set(qt_host_path_required TRUE) - - # TODO: Figure out how to make the initial QT_HOST_PATH var relocatable in relation - # to the target CMAKE_INSTALL_DIR, if at all possible to do so in a reliable way. - get_filename_component(qt_host_path_absolute "${QT_HOST_PATH}" ABSOLUTE) - get_filename_component(qt_host_path_cmake_dir_absolute - "${Qt${PROJECT_VERSION_MAJOR}HostInfo_DIR}/.." ABSOLUTE) - endif() - if(CMAKE_TOOLCHAIN_FILE) file(TO_CMAKE_PATH "${CMAKE_TOOLCHAIN_FILE}" __qt_chainload_toolchain_file) set(init_original_toolchain_file diff --git a/cmake/qt.toolchain.cmake.in b/cmake/qt.toolchain.cmake.in index e20fb6c1b3..15cf7a432e 100644 --- a/cmake/qt.toolchain.cmake.in +++ b/cmake/qt.toolchain.cmake.in @@ -3,11 +3,7 @@ set(__qt_toolchain_used_variables QT_TOOLCHAIN_INCLUDE_FILE QT_TOOLCHAIN_RELOCATABLE_CMAKE_DIR QT_TOOLCHAIN_RELOCATABLE_PREFIX - QT_HOST_PATH - QT_HOST_PATH_CMAKE_DIR - QT_REQUIRE_HOST_PATH_CHECK QT_ADDITIONAL_PACKAGES_PREFIX_PATH - QT_ADDITIONAL_HOST_PACKAGES_PREFIX_PATH ) @init_additional_used_variables@ @@ -154,73 +150,6 @@ if(QT_TOOLCHAIN_INCLUDE_FILE) endif() endif() -# Set up QT_HOST_PATH and do sanity checks. -# A host path is required when cross-compiling but optional when doing a native build. -# Requiredness can be overridden via variable. -if(DEFINED QT_REQUIRE_HOST_PATH_CHECK) - set(__qt_toolchain_host_path_required "${QT_REQUIRE_HOST_PATH_CHECK}") -else() - set(__qt_toolchain_host_path_required "@qt_host_path_required@") -endif() -set(__qt_toolchain_initial_qt_host_path - "@qt_host_path_absolute@") -set(__qt_toolchain_initial_qt_host_path_cmake_dir - "@qt_host_path_cmake_dir_absolute@") - -# QT_HOST_PATH precedence: -# - cache variable / command line option -# - environment variable -# - initial QT_HOST_PATH when qtbase was configured (and the directory exists) -if(NOT DEFINED QT_HOST_PATH) - if(DEFINED ENV{QT_HOST_PATH}) - set(QT_HOST_PATH "$ENV{QT_HOST_PATH}" CACHE PATH "") - else(__qt_toolchain_initial_qt_host_path AND EXISTS "${__qt_toolchain_initial_qt_host_path}") - set(QT_HOST_PATH "${__qt_toolchain_initial_qt_host_path}" CACHE PATH "") - endif() -endif() - -if(NOT QT_HOST_PATH STREQUAL "") - get_filename_component(__qt_toolchain_host_path_absolute "${QT_HOST_PATH}" ABSOLUTE) -endif() - -if(__qt_toolchain_host_path_required AND - ("${QT_HOST_PATH}" STREQUAL "" OR NOT EXISTS "${__qt_toolchain_host_path_absolute}")) - message(FATAL_ERROR - "To use a cross-compiled Qt, please set the QT_HOST_PATH cache variable to the location " - "of your host Qt installation.") -endif() - -# QT_HOST_PATH_CMAKE_DIR is needed to work around the rerooting issue when looking for host tools -# See REROOT_PATH_ISSUE_MARKER. -# Prefer initially configured path if none was explicitly set. -if(__qt_toolchain_host_path_required AND NOT DEFINED QT_HOST_PATH_CMAKE_DIR) - if(__qt_toolchain_initial_qt_host_path_cmake_dir - AND EXISTS "${__qt_toolchain_initial_qt_host_path_cmake_dir}") - set(QT_HOST_PATH_CMAKE_DIR "${__qt_toolchain_initial_qt_host_path_cmake_dir}" CACHE PATH "") - else() - # First try to auto-compute the location instead of requiring to set QT_HOST_PATH_CMAKE_DIR - # explicitly. - set(__qt_candidate_host_path_cmake_dir "${QT_HOST_PATH}/lib/cmake") - if(__qt_candidate_host_path_cmake_dir AND EXISTS "${__qt_candidate_host_path_cmake_dir}") - set(QT_HOST_PATH_CMAKE_DIR - "${__qt_candidate_host_path_cmake_dir}" CACHE PATH "") - endif() - endif() -endif() - -if(NOT QT_HOST_PATH_CMAKE_DIR STREQUAL "") - get_filename_component(__qt_toolchain_host_path_cmake_dir_absolute - "${QT_HOST_PATH_CMAKE_DIR}" ABSOLUTE) -endif() - -if(__qt_toolchain_host_path_required AND - ("${QT_HOST_PATH_CMAKE_DIR}" STREQUAL "" - OR NOT EXISTS "${__qt_toolchain_host_path_cmake_dir_absolute}")) - message(FATAL_ERROR - "To use a cross-compiled Qt, please set the QT_HOST_PATH_CMAKE_DIR cache variable to " - "the location of your host Qt installation lib/cmake directory.") -endif() - # Store initial build type (if any is specified) to be read by QtBuildInternals.cmake when building # a Qt repo, standalone tests or a single test. if(DEFINED CACHE{CMAKE_BUILD_TYPE}) |