From 9bc3555c993932e13ba1e3d166634cfb0aa2ee6a Mon Sep 17 00:00:00 2001 From: Martchus Date: Wed, 11 Nov 2020 18:51:19 +0100 Subject: [PATCH] Resolve QT_INSTALL_TRANSLATIONS via CMAKE_PREFIX_PATH if it is relative The variables provided by Qt 6 might just contain a relative path. This change adds an extra function resolve these via CMAKE_PREFIX_PATH and CMAKE_FIND_ROOT_PATH. --- cmake/modules/QtConfig.cmake | 2 +- cmake/modules/QtLinkage.cmake | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/cmake/modules/QtConfig.cmake b/cmake/modules/QtConfig.cmake index 48e6390..86ac933 100644 --- a/cmake/modules/QtConfig.cmake +++ b/cmake/modules/QtConfig.cmake @@ -227,7 +227,7 @@ option(BUILTIN_TRANSLATIONS_OF_QT "enables/disables built-in translations of Qt # determine relevant Qt translation files set(QT_TRANSLATION_FILES) set(QT_TRANSLATION_SEARCH_PATHS) -query_qmake_variable(QT_INSTALL_TRANSLATIONS) +query_qmake_variable_path(QT_INSTALL_TRANSLATIONS) if (QT_INSTALL_TRANSLATIONS) list(APPEND QT_TRANSLATION_SEARCH_PATHS "${QT_INSTALL_TRANSLATIONS}") endif () diff --git a/cmake/modules/QtLinkage.cmake b/cmake/modules/QtLinkage.cmake index 8516bbf..bc8c4e7 100644 --- a/cmake/modules/QtLinkage.cmake +++ b/cmake/modules/QtLinkage.cmake @@ -160,3 +160,38 @@ function (query_qmake_variable QMAKE_VARIABLE) PARENT_SCOPE) message(STATUS "Qt variable ${QMAKE_VARIABLE} queried from qmake: ${${QMAKE_VARIABLE}}") endfunction () + +# define function to make Qt variable available, resolving relative paths via CMAKE_FIND_ROOT_PATH +function (query_qmake_variable_path QMAKE_VARIABLE) + # query the variable itself + query_qmake_variable("${QMAKE_VARIABLE}") + set(VARIABLE_VALUE "${${QMAKE_VARIABLE}}") + if (NOT VARIABLE_VALUE) + message(WARNING "Unable to resolve Qt variable ${QMAKE_VARIABLE}: it is empty") + return() + endif () + + # pass the variable as-is if it points to an existing dir/file + if (EXISTS "${VARIABLE_VALUE}") + get_filename_component(VARIABLE_VALUE "${VARIABLE_VALUE}" REALPATH) + message(STATUS "Qt variable ${QMAKE_VARIABLE} resolved to path: ${VARIABLE_VALUE}") + set("${QMAKE_VARIABLE}" "${VARIABLE_VALUE}" PARENT_SCOPE) + return() + endif () + + # assume VARIABLE_VALUE is relative within CMAKE_FIND_ROOT_PATH, e.g. QT_INSTALL_TRANSLATIONS might be + # set to "share/qt6/translations" + foreach (ROOT_PATH ${CMAKE_FIND_ROOT_PATH} "") + foreach (PREFIX_PATH ${CMAKE_PREFIX_PATH} "") + string(JOIN "/" FULL_PATH ${ROOT_PATH} ${PREFIX_PATH} ${VARIABLE_VALUE}) + if (EXISTS "${FULL_PATH}") + set("${QMAKE_VARIABLE}" "${FULL_PATH}" PARENT_SCOPE) + message(STATUS "Qt variable ${QMAKE_VARIABLE} resolved to path: ${FULL_PATH}") + return() + else () + list(APPEND CHECKED_PATHS "${FULL_PATH}") + endif () + endforeach() + endforeach () + message(WARNING "Unable to resolve Qt variable ${QMAKE_VARIABLE} to an existing path, was checking for: ${CHECKED_PATHS}") +endfunction ()