Warning, /frameworks/kcmutils/KF5KCMUtilsMacros.cmake is written in an unsupported language. File is not indexed.
0001 # SPDX-FileCopyrightText: 2022 Alexander Lohnau <alexander.lohnau@gmx.de> 0002 # SPDX-License-Identifier: BSD-3-Clause 0003 0004 #.rst: 0005 # KF5KCMUtilsGenerateModuleData 0006 # --------------------------- 0007 # 0008 # This module provides the ``kcmutils_generate_module_data`` function for 0009 # generating basic module data classes. Class derivated from KCModuleData 0010 # :: 0011 # 0012 # kcmutils_generate_module_data(<sources_var> 0013 # MODULE_DATA_CLASS_NAME <class_name> 0014 # MODULE_DATA_HEADER <header_file_name> 0015 # SETTINGS_HEADERS <setting_header.h> [<second_setting_header.h> [...]]] 0016 # SETTINGS_CLASSES <SettingClass> [<SecondSettingClass> [...]]] 0017 # ) 0018 # 0019 # A header file, ``<header_file_name>``, will be generated along with a corresponding 0020 # source file, which will be added to ``<sources_var>``. These will provide a 0021 # KCModuleData that can be referred to from C++ code using ``<class_name>``. 0022 # This module will autoregister settings declared on ``setting_header.h`` with class name ``SettingClass``. 0023 # Multiple settings classes / settings headers can be specified. 0024 0025 include(CMakeParseArguments) 0026 0027 set(_KCMODULE_DATA_TEMPLATE_CPP "${CMAKE_CURRENT_LIST_DIR}/kcmutilsgeneratemoduledata.cpp.in") 0028 set(_KCMODULE_DATA_TEMPLATE_H "${CMAKE_CURRENT_LIST_DIR}/kcmutilsgeneratemoduledata.h.in") 0029 0030 function(kcmutils_generate_module_data sources_var) 0031 set(options) 0032 set(oneValueArgs MODULE_DATA_CLASS_NAME MODULE_DATA_HEADER NAMESPACE) 0033 set(multiValueArgs SETTINGS_HEADERS SETTINGS_CLASSES) 0034 cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) 0035 0036 if(ARG_UNPARSED_ARGUMENTS) 0037 message(FATAL_ERROR "Unexpected arguments to kcmutils_generate_module_data: ${ARG_UNPARSED_ARGUMENTS}") 0038 endif() 0039 if(NOT ARG_MODULE_DATA_HEADER) 0040 message(FATAL_ERROR "Missing MODULE_DATA_HEADER argument for kcmutils_generate_module_data") 0041 endif() 0042 0043 if(NOT ARG_MODULE_DATA_CLASS_NAME) 0044 message(FATAL_ERROR "Missing MODULE_DATA_CLASS_NAME argument for kcmutils_generate_module_data") 0045 endif() 0046 0047 if(NOT ARG_SETTINGS_HEADERS) 0048 message(FATAL_ERROR "Missing SETTINGS_HEADERS argument for kcmutils_generate_module_data") 0049 endif() 0050 0051 if(NOT ARG_SETTINGS_CLASSES) 0052 message(FATAL_ERROR "Missing SETTINGS_CLASSES argument for kcmutils_generate_module_data") 0053 endif() 0054 0055 set(MODULE_DATA_CLASS_NAME ${ARG_MODULE_DATA_CLASS_NAME}) 0056 get_filename_component(HEADER_NAME "${ARG_MODULE_DATA_HEADER}" NAME) 0057 0058 string(REGEX REPLACE "[^a-zA-Z0-9]" "_" GUARD_NAME "${HEADER_NAME}") 0059 string(TOUPPER "${GUARD_NAME}" GUARD_NAME) 0060 0061 string(FIND "${ARG_MODULE_DATA_HEADER}" "." pos REVERSE) 0062 if (pos EQUAL -1) 0063 set(cpp_filename "${ARG_MODULE_DATA_HEADER}.cpp") 0064 else() 0065 string(SUBSTRING "${ARG_MODULE_DATA_HEADER}" 0 ${pos} base_filename) 0066 set(cpp_filename "${base_filename}.cpp") 0067 endif() 0068 0069 set(INCLUDES_SETTINGS) 0070 foreach(_header ${ARG_SETTINGS_HEADERS}) 0071 set(INCLUDES_SETTINGS "${INCLUDES_SETTINGS}#include \"${_header}\"\n") 0072 endforeach() 0073 0074 set(SETTINGS_FORWARD_DECLARATION) 0075 set(SETTINGS_CONSTRUCTOR_INITIALIZATION) 0076 set(SETTINGS_METHOD_DEFINITION) 0077 set(SETTINGS_METHOD_DECLARATION) 0078 list(LENGTH ARG_SETTINGS_CLASSES _nb_settings) 0079 foreach(_class ${ARG_SETTINGS_CLASSES}) 0080 if(_nb_settings EQUAL 1) 0081 set(_setting_attribute "m_settings") 0082 set(_setting_getter "settings") 0083 else() 0084 # lower first letter 0085 string(SUBSTRING ${_class} 0 1 _first_letter) 0086 string(TOLOWER ${_first_letter} _first_letter) 0087 string(REGEX REPLACE "^.(.*)" "${_first_letter}\\1" _method_name "${_class}") 0088 set(_setting_attribute "m_${_method_name}") 0089 set(_setting_getter "${_method_name}") 0090 endif() 0091 0092 set(SETTINGS_FORWARD_DECLARATION "${SETTINGS_FORWARD_DECLARATION}class ${_class};\n") 0093 set(SETTINGS_CONSTRUCTOR_INITIALIZATION "${SETTINGS_CONSTRUCTOR_INITIALIZATION}, ${_setting_attribute}(new ${_class}(this))\n") 0094 set(SETTINGS_METHOD_DECLARATION "${SETTINGS_METHOD_DECLARATION}${_class} *${_setting_getter}() const;\n") 0095 set(SETTINGS_ATTRIBUTE_DECLARATION "${SETTINGS_ATTRIBUTE_DECLARATION}${_class} *${_setting_attribute};\n") 0096 set(SETTINGS_METHOD_DEFINITION "${SETTINGS_METHOD_DEFINITION}${_class} *${ARG_MODULE_DATA_CLASS_NAME}::${_setting_getter}() const 0097 { 0098 return ${_setting_attribute}; 0099 }\n\n") 0100 endforeach() 0101 0102 if(ARG_NAMESPACE) 0103 set(OPEN_NAMESPACE "namespace ${ARG_NAMESPACE} {") 0104 set(CLOSE_NAMESPACE "}") 0105 endif() 0106 configure_file("${_KCMODULE_DATA_TEMPLATE_CPP}" "${cpp_filename}") 0107 configure_file("${_KCMODULE_DATA_TEMPLATE_H}" "${ARG_MODULE_DATA_HEADER}") 0108 0109 set(sources "${${sources_var}}") 0110 list(APPEND sources "${cpp_filename}") 0111 set(${sources_var} "${sources}" PARENT_SCOPE) 0112 endfunction() 0113 0114 0115 # kcmutils_generate_desktop_file(kcm_target_nam) 0116 # 0117 # This macro generates a desktop file for the given KCM. 0118 # This desktop file has the following attributes: 0119 # Type=Application 0120 # NoDisplay=true 0121 # Icon=icon from the .json file 0122 # Name=name from the .json file 0123 # Name[foo]=translated name from the .json file 0124 # and an Exec launching it in systemsettings 0125 # The .json file must have the same basename as the kcm_target parameter. 0126 # Since 5.97 0127 0128 function(kcmutils_generate_desktop_file kcm_target) 0129 set(OUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${kcm_target}.desktop) 0130 set(IN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${kcm_target}.json) 0131 if (NOT EXISTS ${IN_FILE}) 0132 message(FATAL_ERROR "Could not find metadata file for ${kcm_target}, expected path was ${IN_FILE}") 0133 endif() 0134 0135 set(IN_SOURCE_DESKTOP_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${kcm_target}.desktop) 0136 if (EXISTS ${IN_SOURCE_DESKTOP_FILE}) 0137 message(FATAL_ERROR "A metadata desktop file for the KCM already exists in ${IN_SOURCE_DESKTOP_FILE} Remove this file or remove the method call to generate_kcm_desktop_file") 0138 endif() 0139 0140 if(NOT KDE_INSTALL_APPDIR) 0141 include(KDEInstallDirs) 0142 endif() 0143 0144 add_custom_target(${kcm_target}-kcm-desktop-gen 0145 COMMAND KF5::kcmdesktopfilegenerator ${IN_FILE} ${OUT_FILE} 0146 DEPENDS ${IN_FILE}) 0147 add_dependencies(${kcm_target} ${kcm_target}-kcm-desktop-gen) 0148 if (NOT KCMUTILS_INTERNAL_TEST_MODE) 0149 install(FILES ${OUT_FILE} DESTINATION ${KDE_INSTALL_APPDIR}) 0150 endif() 0151 endfunction()