qtutilities/cmake/modules/QtLinkage.cmake

138 lines
5.6 KiB
CMake
Raw Normal View History

2016-11-08 19:57:57 +01:00
cmake_minimum_required(VERSION 3.3.0 FATAL_ERROR)
# defines helper to link against Qt dynamically or statically
# prevent multiple inclusion
2019-02-06 17:32:10 +01:00
if (DEFINED QT_LINKAGE_DETERMINED)
return()
2019-02-06 17:32:10 +01:00
endif ()
set(QT_LINKAGE_DETERMINED ON)
2019-04-22 22:27:00 +02:00
# include validate_visibility from c++utilities' 3rdParty module
include(3rdParty)
# by default, require Qt 5.6 or higher
2019-02-06 17:32:10 +01:00
if (NOT META_QT5_VERSION)
set(META_QT5_VERSION 5.6)
2019-02-06 17:32:10 +01:00
endif ()
# define function for using Qt and KDE Frameworks modules and static plugins
macro (use_qt_module)
# parse arguments
set(OPTIONAL_ARGS ONLY_PLUGINS)
2019-11-30 17:58:56 +01:00
set(ONE_VALUE_ARGS PREFIX MODULE VISIBILITY LIBRARIES_VARIABLE)
set(MULTI_VALUE_ARGS TARGETS PLUGINS)
2019-11-30 17:58:56 +01:00
cmake_parse_arguments(ARGS "${OPTIONAL_ARGS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN})
# validate values
if (NOT ARGS_PREFIX)
message(FATAL_ERROR "use_qt_module called without PREFIX.")
2019-05-04 20:59:19 +02:00
endif ()
if (NOT ARGS_MODULE)
message(FATAL_ERROR "use_qt_module called without MODULE.")
2019-05-04 20:59:19 +02:00
endif ()
if (ARGS_VISIBILITY)
validate_visibility(${ARGS_VISIBILITY})
2019-05-04 20:59:19 +02:00
else ()
set(ARGS_VISIBILITY PRIVATE)
endif ()
if (NOT ARGS_LIBRARIES_VARIABLE)
2019-05-04 20:59:19 +02:00
set(ARGS_LIBRARIES_VARIABLE "${ARGS_VISIBILITY}_LIBRARIES")
endif ()
if (NOT ARGS_TARGETS)
if (${MODULE}_MODULE_TARGETS)
set(ARGS_TARGETS "${${MODULE}_MODULE_TARGETS}")
2019-05-04 20:59:19 +02:00
else ()
set(ARGS_TARGETS "${ARGS_PREFIX}::${ARGS_MODULE}")
2019-05-04 20:59:19 +02:00
endif ()
endif ()
if (ARGS_ONLY_PLUGINS AND NOT ARGS_PLUGINS)
message(FATAL_ERROR "ONLY_PLUGINS specified but no plugins.")
2019-05-04 20:59:19 +02:00
endif ()
# find and use module
if (NOT ONLY_PLUGINS)
find_package("${ARGS_PREFIX}${ARGS_MODULE}" "${META_QT5_VERSION}" REQUIRED)
2019-05-04 20:59:19 +02:00
foreach (TARGET ${ARGS_TARGETS})
if (NOT TARGET "${TARGET}")
message(FATAL_ERROR "The ${ARGS_PREFIX}${ARGS_MODULE} does not provide the target ${TARGET}.")
2019-05-04 20:59:19 +02:00
endif ()
if ("${TARGET}" IN_LIST "${ARGS_LIBRARIES_VARIABLE}")
continue()
2019-05-04 20:59:19 +02:00
endif ()
set("${ARGS_LIBRARIES_VARIABLE}" "${${ARGS_LIBRARIES_VARIABLE}};${TARGET}")
set("PKG_CONFIG_${ARGS_PREFIX}_${ARGS_MODULE}" "${ARGS_PREFIX}${ARGS_MODULE}")
2020-09-02 19:49:40 +02:00
message(STATUS "Linking ${META_TARGET_NAME} against Qt module ${TARGET}.")
# hack for "StaticQt5": re-assign INTERFACE_LINK_LIBRARIES_RELEASE to INTERFACE_LINK_LIBRARIES
2019-05-04 20:59:19 +02:00
get_target_property("${ARGS_MODULE}_INTERFACE_LINK_LIBRARIES_RELEASE" "${TARGET}"
INTERFACE_LINK_LIBRARIES_RELEASE)
if ("${ARGS_MODULE}_INTERFACE_LINK_LIBRARIES_RELEASE")
2019-11-30 17:58:56 +01:00
set_target_properties("${TARGET}" PROPERTIES INTERFACE_LINK_LIBRARIES
"${${ARGS_MODULE}_INTERFACE_LINK_LIBRARIES_RELEASE}")
endif ()
2019-05-04 20:59:19 +02:00
endforeach ()
endif ()
# find and use plugins
foreach (PLUGIN ${ARGS_PLUGINS})
if (NOT TARGET "${ARGS_PREFIX}::Q${PLUGIN}Plugin")
find_package("${PREFIX}${MODULE}" "${META_QT5_VERSION}" REQUIRED)
2019-05-04 20:59:19 +02:00
endif ()
if (NOT TARGET "${ARGS_PREFIX}::Q${PLUGIN}Plugin")
message(FATAL_ERROR "The ${ARGS_PREFIX}${MODULE} does not provide the target ${ARGS_PREFIX}::Q${PLUGIN}Plugin.")
2019-05-04 20:59:19 +02:00
endif ()
if ("${ARGS_PREFIX}::Q${PLUGIN}Plugin" IN_LIST "${ARGS_LIBRARIES_VARIABLE}")
continue()
2019-05-04 20:59:19 +02:00
endif ()
set("${ARGS_LIBRARIES_VARIABLE}" "${${ARGS_LIBRARIES_VARIABLE}};${ARGS_PREFIX}::Q${PLUGIN}Plugin")
2020-09-02 19:49:40 +02:00
message(STATUS "Linking ${META_TARGET_NAME} against Qt plugin ${ARGS_PREFIX}::Q${PLUGIN}Plugin.")
2019-05-04 20:59:19 +02:00
endforeach ()
# unset variables (can not simply use a function because Qt's variables need to be exported)
2019-11-30 17:58:56 +01:00
foreach (ARGUMENT ${OPTIONAL_ARGS} ${ONE_VALUE_ARGS} ${MULTI_VALUE_ARGS})
unset(ARGS_${ARGUMENT})
2019-05-04 20:59:19 +02:00
endforeach ()
endmacro ()
2020-09-02 19:49:40 +02:00
# define function to make Qt variable available; queries qmake or uses variables provided by Qt 6
function (query_qmake_variable QMAKE_VARIABLE)
# prevent queries for variables already known
if (NOT "${${QMAKE_VARIABLE}}" STREQUAL "")
return()
2019-05-04 20:59:19 +02:00
endif ()
2020-09-02 19:49:40 +02:00
# check configuration variables provided by Qt 6
if (QMAKE_VARIABLE MATCHES "QT_(.*)")
set(VARIABLE_NAME "${CMAKE_MATCH_1}")
if (QT6_${VARIABLE_NAME})
set(VARIABLE_NAME QT6_${VARIABLE_NAME})
endif ()
if (NOT "${${VARIABLE_NAME}}" STREQUAL "")
set ("${QMAKE_VARIABLE}" "${${VARIABLE_NAME}}" PARENT_SCOPE)
message(STATUS "Qt variable ${QMAKE_VARIABLE} taken from ${VARIABLE_NAME}: ${${VARIABLE_NAME}}")
return()
endif ()
endif ()
# execute qmake
get_target_property(QMAKE_BIN "${QT_QMAKE_TARGET}" IMPORTED_LOCATION)
2019-11-30 17:58:56 +01:00
execute_process(
COMMAND "${QMAKE_BIN}" -query "${QMAKE_VARIABLE}"
RESULT_VARIABLE "${QMAKE_VARIABLE}_RESULT"
OUTPUT_VARIABLE "${QMAKE_VARIABLE}")
2019-02-06 17:32:10 +01:00
if (NOT "${${QMAKE_VARIABLE}_RESULT}" STREQUAL 0 OR "${${QMAKE_VARIABLE}}" STREQUAL "")
message(
FATAL_ERROR
"Unable to read qmake variable ${QMAKE_VARIABLE} via \"${QMAKE_BIN} -query ${QMAKE_VARIABLE}\"; output was \"${${QMAKE_VARIABLE}}\"."
2019-11-30 17:58:56 +01:00
)
2019-02-06 17:32:10 +01:00
endif ()
# remove new-line character at the end
2019-11-30 17:58:56 +01:00
string(REGEX REPLACE "\n$" "" "${QMAKE_VARIABLE}" "${${QMAKE_VARIABLE}}")
# export variable to parent scope
2020-09-02 19:49:40 +02:00
set("${QMAKE_VARIABLE}" "${${QMAKE_VARIABLE}}" PARENT_SCOPE)
message(STATUS "Qt variable ${QMAKE_VARIABLE} queried from qmake: ${${QMAKE_VARIABLE}}")
2019-05-04 20:59:19 +02:00
endfunction ()