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