diff options
Diffstat (limited to 'cmake/QtFindWrapHelper.cmake')
-rw-r--r-- | cmake/QtFindWrapHelper.cmake | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/cmake/QtFindWrapHelper.cmake b/cmake/QtFindWrapHelper.cmake new file mode 100644 index 0000000000..cb6d19600b --- /dev/null +++ b/cmake/QtFindWrapHelper.cmake @@ -0,0 +1,74 @@ +# Creates an imported wrapper target that links against either a Qt bundled package +# or a system package. +# +# Used for consuming 3rd party libraries in Qt. +# +# Example: Creates WrapFreetype::WrapFreetype linking against either +# Qt6::BundledFreetype or WrapSystemFreetype::WrapSystemFreetype. +# +# The implementation has to use a unique prefix in each variable, otherwise when WrapFreetype +# find_package()s WrapPNG, the nested call would override the parent call variables, due to macros +# using the same scope. +macro(qt_find_package_system_or_bundled _unique_prefix) + set(_flags "") + set(_options + FRIENDLY_PACKAGE_NAME + WRAP_PACKAGE_TARGET + WRAP_PACKAGE_FOUND_VAR_NAME + BUNDLED_PACKAGE_NAME + BUNDLED_PACKAGE_TARGET + SYSTEM_PACKAGE_NAME + SYSTEM_PACKAGE_TARGET + USE_BUNDLED_PACKAGE + ) + set(_multioptions "") + + cmake_parse_arguments("_qfwrap_${_unique_prefix}" + "${_flags}" "${_options}" "${_multioptions}" ${ARGN}) + + # We can't create the same interface imported target multiple times, CMake will complain if we + # do that. This can happen if the find_package call is done in multiple different + # subdirectories. + if(TARGET "${_qfwrap_${_unique_prefix}_WRAP_PACKAGE_TARGET}") + set(${_qfwrap_${_unique_prefix}_WRAP_PACKAGE_FOUND_VAR_NAME} ON) + return() + endif() + + set(${_qfwrap_${_unique_prefix}_WRAP_PACKAGE_FOUND_VAR_NAME} OFF) + + if(_qfwrap_${_unique_prefix}_USE_BUNDLED_PACKAGE) + set(${_unique_prefix}_qt_package_name_to_use + "${_qfwrap_${_unique_prefix}_BUNDLED_PACKAGE_NAME}") + set(${_unique_prefix}_qt_package_target_to_use + "${_qfwrap_${_unique_prefix}_BUNDLED_PACKAGE_TARGET}") + set(${_unique_prefix}_qt_package_success_message + "Using Qt bundled ${_qfwrap_${_unique_prefix}_FRIENDLY_PACKAGE_NAME}.") + set(${_unique_prefix}_qt_package_type "bundled") + else() + set(${_unique_prefix}_qt_package_name_to_use + "${_qfwrap_${_unique_prefix}_SYSTEM_PACKAGE_NAME}") + set(${_unique_prefix}_qt_package_target_to_use + "${_qfwrap_${_unique_prefix}_SYSTEM_PACKAGE_TARGET}") + set(${_unique_prefix}_qt_package_success_message + "Using system ${_qfwrap_${_unique_prefix}_FRIENDLY_PACKAGE_NAME}.") + set(${_unique_prefix}_qt_package_type "system") + endif() + + if(NOT TARGET "${${_unique_prefix}_qt_package_target_to_use}") + find_package("${${_unique_prefix}_qt_package_name_to_use}") + endif() + + if(TARGET "${${_unique_prefix}_qt_package_target_to_use}") + set(${_qfwrap_${_unique_prefix}_WRAP_PACKAGE_FOUND_VAR_NAME} ON) + message(STATUS "${${_unique_prefix}_qt_package_success_message}") + add_library("${_qfwrap_${_unique_prefix}_WRAP_PACKAGE_TARGET}" INTERFACE IMPORTED) + target_link_libraries("${_qfwrap_${_unique_prefix}_WRAP_PACKAGE_TARGET}" + INTERFACE + ${${_unique_prefix}_qt_package_target_to_use}) + set_target_properties("${_qfwrap_${_unique_prefix}_WRAP_PACKAGE_TARGET}" PROPERTIES + INTERFACE_QT_3RD_PARTY_PACKAGE_TYPE + "${${_unique_prefix}_qt_package_type}") + elseif(${_unique_prefix}_qt_package_type STREQUAL "bundled") + message(FATAL_ERROR "Can't find ${_qfwrap_${_unique_prefix}_BUNDLED_PACKAGE_TARGET}.") + endif() +endmacro() |