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()