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