From 57acebeac848d4182a3f994b4326b41108cae4ec Mon Sep 17 00:00:00 2001 From: Alexey Edelev Date: Thu, 13 Jun 2024 15:06:09 +0200 Subject: [PATCH] Allow using VCPKG for standalone Qt repos Add the QT_USE_VCPKG variable and the VCPKG_ROOT environment variable handling to the Qt toolchain file. The below rules applicable when configuring Qt project or Qt repository using the qt.toolchain.cmake file: If qtbase(or top-level qt) was initialy configured with vcpkg the new code path will be ignored, if the QT_CHAINLOAD_TOOLCHAIN_FILE matches the path to the vcpkg toolchain file. If qtbase(or top-level qt) was configured with some other toolchain file provided it will be chainloaded next to the vcpkg one using VCPKG_CHAINLOAD_TOOLCHAIN_FILE variable, and the vcpkg toolchain file will be chainloaded by Qt toolchain using QT_CHAINLOAD_TOOLCHAIN_FILE code path. If qtbase(or top-level qt) was configured without extra toolchain file specified, the vcpkg toolchain file will be chainloaded by Qt toolchain using QT_CHAINLOAD_TOOLCHAIN_FILE code path. So the generic toolchain file load sequence can be described as following: qt.toolchain.cmake[->vcpkg.cmake][->customtoolchain.cmake] The QT_USE_VCPKG value is inherited from qtbase(or top-level qt) build by default. We also preserve the VCPKG_TARGET_TRIPLET, but allow using the one that is specified by user. Change-Id: I85c8ed4e9abd658609ac6ea71393dd23a9bc1688 Reviewed-by: Alexandru Croitor --- cmake/QtToolchainHelpers.cmake | 25 +++++++++----- cmake/qt.toolchain.cmake.in | 59 ++++++++++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 10 deletions(-) diff --git a/cmake/QtToolchainHelpers.cmake b/cmake/QtToolchainHelpers.cmake index 26b44bb10c4..3d20a7a3ce0 100644 --- a/cmake/QtToolchainHelpers.cmake +++ b/cmake/QtToolchainHelpers.cmake @@ -14,15 +14,24 @@ set(__qt_chainload_toolchain_file \"\${__qt_initially_configured_toolchain_file} ") endif() - if(VCPKG_CHAINLOAD_TOOLCHAIN_FILE) - file(TO_CMAKE_PATH "${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}" VCPKG_CHAINLOAD_TOOLCHAIN_FILE) - list(APPEND init_vcpkg - "set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE \"${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}\")") - endif() + if(QT_USE_VCPKG) + set(init_vcpkg "set(__qt_initially_configured_use_vcpkg TRUE)") + if(VCPKG_CHAINLOAD_TOOLCHAIN_FILE) + file(TO_CMAKE_PATH "${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}" + initial_vcpkg_chainload_toolchain_file) + get_filename_component(initial_vcpkg_chainload_toolchain_file + "${initial_vcpkg_chainload_toolchain_file}" REALPATH) + list(APPEND init_vcpkg + "set(__qt_initially_configured_vcpkg_chainload_toolchain_file \ + \"${initial_vcpkg_chainload_toolchain_file}\")") + endif() - if(VCPKG_TARGET_TRIPLET) - list(APPEND init_vcpkg - "set(VCPKG_TARGET_TRIPLET \"${VCPKG_TARGET_TRIPLET}\" CACHE STRING \"\")") + if(VCPKG_TARGET_TRIPLET) + list(APPEND init_vcpkg + "set(__qt_initially_configured_vcpkg_target_triplet \"${VCPKG_TARGET_TRIPLET}\")") + endif() + else() + set(init_vcpkg "") endif() if(CMAKE_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64" AND CMAKE_SYSTEM_VERSION STREQUAL "10") diff --git a/cmake/qt.toolchain.cmake.in b/cmake/qt.toolchain.cmake.in index 15cf7a432ea..e21781fb39f 100644 --- a/cmake/qt.toolchain.cmake.in +++ b/cmake/qt.toolchain.cmake.in @@ -22,13 +22,68 @@ if($ENV{_QT_TOOLCHAIN_VARS_INITIALIZED}) endif() @init_original_toolchain_file@ -@init_vcpkg@ - @init_platform@ if(NOT "${QT_CHAINLOAD_TOOLCHAIN_FILE}" STREQUAL "") set(__qt_chainload_toolchain_file "${QT_CHAINLOAD_TOOLCHAIN_FILE}") endif() + +@init_vcpkg@ +if(QT_USE_VCPKG OR (NOT DEFINED QT_USE_VCPKG AND __qt_initially_configured_use_vcpkg) + AND DEFINED ENV{VCPKG_ROOT}) + + # Ensure QT_USE_VCPKG value persists in cache + set(QT_USE_VCPKG TRUE CACHE BOOL "Enable the use of vcpkg") + + # Extract the toolchain file path from the VCPKG_ROOT + set(__qt_vcpkg_toolchain_file "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake") + get_filename_component(__qt_vcpkg_toolchain_file "${__qt_vcpkg_toolchain_file}" REALPATH) + + # If QT_CHAINLOAD_TOOLCHAIN_FILE is already set to the vcpkg one, nothing needs to be done. + # The vcpkg toolchain file will be chainloaded as part of QT_CHAINLOAD_TOOLCHAIN_FILE loading + # procedure. + get_filename_component(__qt_chainload_toolchain_file_real_path + "${__qt_chainload_toolchain_file}" REALPATH) + if(NOT __qt_chainload_toolchain_file_real_path STREQUAL __qt_vcpkg_toolchain_file) + if(QT_CHAINLOAD_TOOLCHAIN_FILE AND VCPKG_CHANLOAD_TOOLCHAIN_FILE) + message(FATAL_ERROR "Both QT_CHAINLOAD_TOOLCHAIN_FILE AND " + " VCPKG_CHAINLOAD_TOOLCHAIN_FILE are specified. This toolchain loading scenario is" + " not supported." + ) + endif() + + if(NOT VCPKG_CHAINLOAD_TOOLCHAIN_FILE AND QT_CHAINLOAD_TOOLCHAIN_FILE) + set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${QT_CHAINLOAD_TOOLCHAIN_FILE}" CACHE STRING "") + endif() + + set(__qt_chainload_toolchain_file "${__qt_vcpkg_toolchain_file}") + endif() + + unset(__qt_chainload_toolchain_file_real_path) + unset(__qt_vcpkg_toolchain_file) +endif() + +if(NOT VCPKG_CHAINLOAD_TOOLCHAIN_FILE AND __qt_initially_configured_vcpkg_chainload_toolchain_file) + set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE + "${__qt_initially_configured_vcpkg_chainload_toolchain_file}" CACHE STRING "") +endif() +unset(__qt_initially_configured_vcpkg_chainload_toolchain_file) + +get_filename_component(__qt_vcpkg_chainload_toolchain_file_realpath + "${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}" REALPATH) +if(VCPKG_CHAINLOAD_TOOLCHAIN_FILE + AND NOT EXISTS "${__qt_vcpkg_chainload_toolchain_file_realpath}") + message(WARNING "The toolchain file to be chainloaded VCPKG_CHAINLOAD_TOOLCHAIN_FILE" + " ${VCPKG_CHAINLOAD_TOOLCHAIN_FILE} doesn't exists and" + " will be skipped.") + set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "") +endif() + +if(NOT VCPKG_TARGET_TRIPLET AND __qt_initially_configured_vcpkg_target_triplet) + set(VCPKG_TARGET_TRIPLET "${__qt_initially_configured_vcpkg_target_triplet}" CACHE STRING "") +endif() +unset(__qt_initially_configured_vcpkg_target_triplet) + if(__qt_chainload_toolchain_file) get_filename_component(__qt_chainload_toolchain_file_real_path "${__qt_chainload_toolchain_file}" REALPATH)