From d002fa52e28d831521642462fde8f11c364930d9 Mon Sep 17 00:00:00 2001 From: Cristian Le Date: Fri, 10 Jan 2025 18:16:00 +0100 Subject: [PATCH] Add `_qt_internal_relative_path` This is a compatibility function for `cmake_path(RELATIVE_PATH)`. For CMake<3.20 it uses `file(RELATIVE_PATH)` instead Change-Id: Ibf9ca221c1753bd99dcc1820bffaea28f9bfe5af Reviewed-by: Alexandru Croitor (cherry picked from commit 334acc2eb3ec0cba702780036c94abdac306864e) Reviewed-by: Qt Cherry-pick Bot (cherry picked from commit 54f5a61fbc01ac6b176a3811294aea1aa32ecdba) --- cmake/QtPublicCMakeHelpers.cmake | 54 ++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/cmake/QtPublicCMakeHelpers.cmake b/cmake/QtPublicCMakeHelpers.cmake index 5bb260c5383..d259b2dd5cd 100644 --- a/cmake/QtPublicCMakeHelpers.cmake +++ b/cmake/QtPublicCMakeHelpers.cmake @@ -675,3 +675,57 @@ function(_qt_internal_forward_function_args) set(${arg_FORWARD_OUT_VAR} "${forward_args}" PARENT_SCOPE) endfunction() + +# Compatibility of `cmake_path(RELATIVE_PATH)` +# +# In order to be compatible with `file(RELATIVE_PATH)`, path normalization of the result is +# always performed, with the trailing slash stripped. +# +# Synopsis +# +# _qt_internal_relative_path( +# [BASE_DIRECTORY ] +# [OUTPUT_VARIABLE ] +# ) +# +# Arguments +# +# `path-var` +# Equivalent to `cmake_path(RELATIVE_PATH )`. +# +# `BASE_DIRECTORY` +# Equivalent to `cmake_path(RELATIVE_PATH BASE_DIRECTORY)`. +# +# `OUTPUT_VARIABLE` +# Equivalent to `cmake_path(RELATIVE_PATH OUTPUT_VARIABLE)`. +function(_qt_internal_relative_path path_var) + set(option_args "") + set(single_args + BASE_DIRECTORY + OUTPUT_VARIABLE + ) + set(multi_args "") + cmake_parse_arguments(PARSE_ARGV 1 arg "${option_args}" "${single_args}" "${multi_args}") + + if(NOT arg_BASE_DIRECTORY) + set(arg_BASE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + endif() + if(NOT arg_OUTPUT_VARIABLE) + set(arg_OUTPUT_VARIABLE ${path_var}) + endif() + + if(CMAKE_VERSION VERSION_LESS 3.20) + file(RELATIVE_PATH ${arg_OUTPUT_VARIABLE} + "${arg_BASE_DIRECTORY}" + "${${path_var}}") + else() + cmake_path(RELATIVE_PATH ${path_var} + BASE_DIRECTORY "${arg_BASE_DIRECTORY}" + OUTPUT_VARIABLE ${arg_OUTPUT_VARIABLE} + ) + cmake_path(NORMAL_PATH ${arg_OUTPUT_VARIABLE}) + string(REGEX REPLACE "/$" "" ${arg_OUTPUT_VARIABLE} + "${${arg_OUTPUT_VARIABLE}}") + endif() + set(${arg_OUTPUT_VARIABLE} "${${arg_OUTPUT_VARIABLE}}" PARENT_SCOPE) +endfunction()