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 <alexandru.croitor@qt.io>
This commit is contained in:
Alexey Edelev 2024-06-13 15:06:09 +02:00
parent e3bfc1a2ef
commit 57acebeac8
2 changed files with 74 additions and 10 deletions

View File

@ -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")

View File

@ -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)