Warning, /frameworks/kcoreaddons/KF6CoreAddonsMacros.cmake is written in an unsupported language. File is not indexed.
0001 # SPDX-FileCopyrightText: 2023 Alexander Lohnau <alexander.lohnau@gmx.de>
0002 # SPDX-License-Identifier: BSD-2-Clause
0003 #
0004 # kcoreaddons_add_plugin(plugin_name
0005 # [SOURCES <src> [<src> [...]]] # optional since 5.83, required before
0006 # [STATIC]
0007 # [INSTALL_NAMESPACE "servicename"]
0008 # )
0009 #
0010 # This macro helps simplifying the creation of plugins for KPluginFactory
0011 # based systems.
0012 # It will create a plugin given the SOURCES list and the INSTALL_NAMESPACE so that
0013 # the plugin is installed with the rest of the plugins from the same sub-system,
0014 # within ${KDE_INSTALL_PLUGINDIR}.
0015 # Since 5.89 the macro supports static plugins by passing in the STATIC option.
0016 #
0017 # Example:
0018 # kcoreaddons_add_plugin(kdeconnect_share SOURCES ${kdeconnect_share_SRCS} INSTALL_NAMESPACE "kdeconnect")
0019 #
0020 # Since 5.10.0
0021
0022 function(kcoreaddons_add_plugin plugin)
0023 set(options STATIC)
0024 set(oneValueArgs INSTALL_NAMESPACE)
0025 set(multiValueArgs SOURCES)
0026 cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
0027
0028 if (NOT ARGS_INSTALL_NAMESPACE)
0029 message(FATAL_ERROR "Must specify INSTALL_NAMESPACE for ${plugin}")
0030 endif()
0031 if (ARGS_UNPARSED_ARGUMENTS)
0032 message(FATAL_ERROR "kcoreaddons_add_plugin method call recieved unexpected arguments: ${ARGS_UNPARSED_ARGUMENTS}")
0033 endif()
0034 if (NOT BUILD_SHARED_LIBS)
0035 set(ARGS_STATIC ON)
0036 endif()
0037
0038 if (ARGS_STATIC)
0039 add_library(${plugin} STATIC ${ARGS_SOURCES})
0040 target_compile_definitions(${plugin} PRIVATE QT_STATICPLUGIN)
0041 string(REPLACE "/" "_" SANITIZED_PLUGIN_NAMESPACE ${ARGS_INSTALL_NAMESPACE})
0042
0043 if (NOT ${plugin} IN_LIST KCOREADDONS_STATIC_PLUGINS${SANITIZED_PLUGIN_NAMESPACE})
0044 set(KCOREADDONS_STATIC_PLUGINS${SANITIZED_PLUGIN_NAMESPACE} "${KCOREADDONS_STATIC_PLUGINS${SANITIZED_PLUGIN_NAMESPACE}};${plugin}" CACHE INTERNAL "list of known static plugins for ${ARGS_INSTALL_NAMESPACE} namespace")
0045 endif()
0046 set_target_properties(${plugin} PROPERTIES PLUGIN_INSTALL_NAMESPACE "${ARGS_INSTALL_NAMESPACE}" PLUGIN_NAME "${plugin}")
0047 set_property(TARGET ${plugin} APPEND PROPERTY EXPORT_PROPERTIES "PLUGIN_INSTALL_NAMESPACE;PLUGIN_NAME")
0048 else()
0049 add_library(${plugin} MODULE ${ARGS_SOURCES})
0050 endif()
0051
0052 string(REPLACE "." "_" PLUGIN_FACTORY_NAME ${plugin}_factory)
0053 string(REPLACE "-" "_" PLUGIN_FACTORY_NAME ${PLUGIN_FACTORY_NAME})
0054 target_compile_definitions(${plugin} PRIVATE KPLUGINFACTORY_PLUGIN_CLASS_INTERNAL_NAME=${PLUGIN_FACTORY_NAME})
0055
0056 # If we have static plugins there are no plugins to install
0057 if (ARGS_STATIC)
0058 return()
0059 endif()
0060
0061 set_target_properties(${plugin} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${ARGS_INSTALL_NAMESPACE}")
0062
0063 if (NOT KCOREADDONS_INTERNAL_SKIP_PLUGIN_INSTALLATION)
0064 if(NOT ANDROID)
0065 install(TARGETS ${plugin} DESTINATION ${KDE_INSTALL_PLUGINDIR}/${ARGS_INSTALL_NAMESPACE})
0066 else()
0067 string(REPLACE "/" "_" pluginprefix "${ARGS_INSTALL_NAMESPACE}")
0068 set_property(TARGET ${plugin} PROPERTY PREFIX "libplugins_")
0069 if(NOT pluginprefix STREQUAL "")
0070 set_property(TARGET ${plugin} APPEND_STRING PROPERTY PREFIX "${pluginprefix}_")
0071 endif()
0072 install(TARGETS ${plugin} DESTINATION ${KDE_INSTALL_PLUGINDIR})
0073 endif()
0074 endif()
0075 endfunction()
0076
0077 # This macro imports the plugins for the given namespace that were
0078 # registered using the kcoreaddons_add_plugin function.
0079 # This includes the initailization statements and linking the plugins to the given target.
0080 #
0081 # In case the plugins are used in both the executable and multiple autotests it it recommended to
0082 # bundle the static plugins in a shared lib for the autotests. In case of shared libs the plugin registrations
0083 # will take effect when the test link against it.
0084 #
0085 # Since 5.89
0086 function(kcoreaddons_target_static_plugins app_target)
0087 cmake_parse_arguments(ARGS "" "LINK_OPTION;NAMESPACE;TARGETS" "" ${ARGN})
0088 if ((ARGS_LINK_OPTION AND ARGS_NAMESPACE) OR (NOT ARGS_NAMESPACE AND NOT ARGS_TARGETS))
0089 message(FATAL_ERROR "Either NAMESPACE or TARGETS must be set")
0090 endif()
0091
0092 set(START_COMMENTS "// This file is autogenerated by kcoreaddons_target_static_plugins, do not edit!\n//clazy:excludeall=non-pod-global-static\n")
0093 # We access this as extern, because then we don't have to install the header file for it
0094 set(PLUGIN_REGISTRATION_AUTOGEN "${START_COMMENTS}#include <QPluginLoader>\nextern void kRegisterStaticPluginFunction(const QString &, const QString &, QStaticPlugin)\;\n\n")
0095
0096 macro(generate_plugin_registration PLUGIN_NAME PLUGIN_NAMESPACE)
0097 string(REPLACE "." "_" PLUGIN_FACTORY_NAME ${PLUGIN_NAME}_factory)
0098 string(REPLACE "-" "_" PLUGIN_FACTORY_NAME ${PLUGIN_FACTORY_NAME})
0099 set(REGISTER_PLUGIN_CALL "
0100 extern const QT_PREPEND_NAMESPACE(QStaticPlugin) qt_static_plugin_${PLUGIN_FACTORY_NAME}()\;
0101 class Static${PLUGIN_FACTORY_NAME}PluginInstance
0102 {
0103 public:
0104 Static${PLUGIN_FACTORY_NAME}PluginInstance()
0105 {
0106 kRegisterStaticPluginFunction(
0107 QStringLiteral(\"${PLUGIN_NAME}\"),
0108 QStringLiteral(\"${PLUGIN_NAMESPACE}\"),
0109 qt_static_plugin_${PLUGIN_FACTORY_NAME}()
0110 )\;
0111 }
0112 }\;
0113 static Static${PLUGIN_FACTORY_NAME}PluginInstance static${PLUGIN_FACTORY_NAME}Instance\;")
0114 set(PLUGIN_REGISTRATION_AUTOGEN "${PLUGIN_REGISTRATION_AUTOGEN}${REGISTER_PLUGIN_CALL}\n")
0115 endmacro()
0116
0117 if(ARGS_NAMESPACE)
0118 string(REPLACE "/" "_" SANITIZED_PLUGIN_NAMESPACE ${ARGS_NAMESPACE})
0119 set(TMP_PLUGIN_FILE "${CMAKE_CURRENT_BINARY_DIR}/kcoreaddons_static_${SANITIZED_PLUGIN_NAMESPACE}_plugins_tmp.cpp")
0120 set(PLUGIN_FILE "${CMAKE_CURRENT_BINARY_DIR}/kcoreaddons_static_${SANITIZED_PLUGIN_NAMESPACE}_plugins.cpp")
0121
0122 foreach(PLUGIN_NAME IN LISTS KCOREADDONS_STATIC_PLUGINS${SANITIZED_PLUGIN_NAMESPACE})
0123 if (PLUGIN_NAME)
0124 generate_plugin_registration(${PLUGIN_NAME} ${ARGS_NAMESPACE})
0125 target_link_libraries(${app_target} ${ARGS_LINK_OPTION} ${PLUGIN_NAME})
0126 endif()
0127 endforeach()
0128 elseif(ARGS_TARGETS)
0129 set(TMP_PLUGIN_FILE "${CMAKE_CURRENT_BINARY_DIR}/kcoreaddons_static_${app_target}_plugins_tmp.cpp")
0130 set(PLUGIN_FILE "${CMAKE_CURRENT_BINARY_DIR}/kcoreaddons_static_${app_target}_plugins.cpp")
0131 foreach(ARG_TARGET IN LISTS ARGS_TARGETS)
0132 get_target_property(PLUGIN_NAME ${ARG_TARGET} PLUGIN_NAME)
0133 get_target_property(PLUGIN_INSTALL_NAMESPACE ${ARG_TARGET} PLUGIN_INSTALL_NAMESPACE)
0134 generate_plugin_registration(${PLUGIN_NAME} ${PLUGIN_INSTALL_NAMESPACE})
0135 target_link_libraries(${app_target} ${ARGS_LINK_OPTION} ${ARG_TARGET})
0136 endforeach()
0137 endif()
0138
0139 file(WRITE ${TMP_PLUGIN_FILE} ${PLUGIN_REGISTRATION_AUTOGEN})
0140 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${TMP_PLUGIN_FILE} ${PLUGIN_FILE})
0141 file(REMOVE ${TMP_PLUGIN_FILE})
0142 target_sources(${app_target} PRIVATE ${PLUGIN_FILE})
0143 endfunction()
0144
0145 # Clear previously set plugins, otherwise the linker will fail due to the symbols of a removed pugin being missing
0146 get_directory_property(_cache_vars CACHE_VARIABLES)
0147 foreach(CACHED_VAR IN LISTS _cache_vars)
0148 if (CACHED_VAR MATCHES "^KCOREADDONS_STATIC_PLUGINS")
0149 set(${CACHED_VAR} "" CACHE INTERNAL "")
0150 endif()
0151 endforeach()