summaryrefslogtreecommitdiffstats
path: root/cmake/QtFindWrapHelper.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/QtFindWrapHelper.cmake')
-rw-r--r--cmake/QtFindWrapHelper.cmake74
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()