Warning, /kdevelop/kdevelop/cmake/modules/KDevelopMacrosInternal.cmake is written in an unsupported language. File is not indexed.

0001 #
0002 # KDevelop Private Macros
0003 #
0004 # The following macros are defined here:
0005 #
0006 #   add_compile_flag_if_supported(<flag> [CXX_ONLY])
0007 #   add_target_compile_flag_if_supported(<target> <INTERFACE|PUBLIC|PRIVATE> <flag>)
0008 #   declare_qt_logging_category(<sourcevarname>
0009 #                               TYPE LIBRARY|PLUGIN|APP [IDENTIFIER <id>] [CATEGORY_BASENAME <name>]
0010 #                               [HEADER <filename>] [DESCRIPTION <desc>])
0011 #   install_qt_logging_categories(TYPE LIBRARY|APP_PLUGIN)
0012 #   kdevelop_add_private_library(<target> SOURCES <source1> [<source2> [...]])
0013 #
0014 
0015 #=============================================================================
0016 # SPDX-FileCopyrightText: 2018, 2020 Friedrich W. H. Kossebau <kossebau@kde.org>
0017 # SPDX-FileCopyrightText: 2007 Andreas Pakulat <apaku@gmx.de>
0018 #
0019 # SPDX-License-Identifier: BSD-3-Clause
0020 #=============================================================================
0021 
0022 include(CMakeParseArguments)
0023 
0024 # helper method to ensure consistent cache var names
0025 function(_varname_for_compile_flag_check_result _varname _flag )
0026     string(REGEX REPLACE "[-=]" "_" _varname ${_flag})
0027     string(TOUPPER ${_varname} _varname)
0028     set(_varname "KDEV_HAVE${_varname}" PARENT_SCOPE)
0029 endfunction()
0030 
0031 
0032 # add_compile_flag_if_supported(<flag> [CXX_ONLY])
0033 # Optional argument CXX_ONLY to set the flag only for C++ code.
0034 # 
0035 # Example:
0036 #   add_compile_flag_if_supported(-Wsuggest-override CXX_ONLY)
0037 function(add_compile_flag_if_supported _flag)
0038     _varname_for_compile_flag_check_result(_varname ${_flag})
0039     check_cxx_compiler_flag("${_flag}" "${_varname}")
0040 
0041     if (${${_varname}})
0042         if("${ARGV1}" STREQUAL "CXX_ONLY")
0043             set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_flag}" PARENT_SCOPE)
0044         else()
0045             add_compile_options(${_flag})
0046         endif()
0047     endif()
0048 endfunction()
0049 
0050 
0051 # add_target_compile_flag_if_supported(<target> <INTERFACE|PUBLIC|PRIVATE> <flag>)
0052 # 
0053 # Example:
0054 #   add_target_compile_flag_if_supported(kdevqtc-qmlsupport PRIVATE "-Wno-suggest-override")
0055 function(add_target_compile_flag_if_supported _target _scope _flag)
0056     _varname_for_compile_flag_check_result(_varname ${_flag})
0057     check_cxx_compiler_flag("${_flag}" "${_varname}")
0058 
0059     if (${${_varname}})
0060         target_compile_options(${_target} ${_scope} "${_flag}")
0061     endif()
0062 endfunction()
0063 
0064 
0065 # helper method
0066 # _declare_qt_logging_category(<sourcevarname>
0067 #                              HEADER <filename> IDENTIFIER <id> CATEGORY_NAME <name>
0068 #                              EXPORT <target> DESCRIPTION <desc>)
0069 #
0070 # Example:
0071 #   _declare_qt_logging_category(Foo_LIB_SRCS
0072 #       HEADER debug.h
0073 #       IDENTIFIER FOO
0074 #       CATEGORY_NAME "bar.foo"
0075 #       DESCRIPTION "The foo of bar"
0076 #       EXPORT BarCategories
0077 #   )
0078 macro(_declare_qt_logging_category sources)
0079     set(options )
0080     set(oneValueArgs HEADER IDENTIFIER CATEGORY_NAME EXPORT DESCRIPTION)
0081     set(multiValueArgs)
0082 
0083     cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
0084 
0085     if(NOT DEFINED ARGS_HEADER)
0086         message(FATAL_ERROR "HEADER needs to be defined when calling _declare_qt_logging_category().")
0087     endif()
0088     if(NOT DEFINED ARGS_IDENTIFIER)
0089         message(FATAL_ERROR "IDENTIFIER needs to be defined when calling _declare_qt_logging_category().")
0090     endif()
0091     if(NOT DEFINED ARGS_CATEGORY_NAME)
0092         message(FATAL_ERROR "CATEGORY_NAME needs to be defined when calling _declare_qt_logging_category().")
0093     endif()
0094     if(NOT DEFINED ARGS_DESCRIPTION)
0095         message(FATAL_ERROR "DESCRIPTION needs to be defined when calling _declare_qt_logging_category().")
0096     endif()
0097 
0098     ecm_qt_declare_logging_category(${sources}
0099         HEADER ${ARGS_HEADER}
0100         IDENTIFIER ${ARGS_IDENTIFIER}
0101         CATEGORY_NAME ${ARGS_CATEGORY_NAME}
0102     )
0103 
0104     if (NOT IS_ABSOLUTE "${ARGS_HEADER}")
0105         set(ARGS_HEADER "${CMAKE_CURRENT_BINARY_DIR}/${ARGS_HEADER}")
0106     endif()
0107     list(APPEND ${sources} "${ARGS_HEADER}")
0108 
0109     set(_propertyprefix "KDEV_QT_LOGGING_CATEGORY_${ARGS_EXPORT}")
0110     set_property(GLOBAL APPEND PROPERTY "${_propertyprefix}_CATEGORIES" ${ARGS_CATEGORY_NAME})
0111     set_property(GLOBAL PROPERTY "${_propertyprefix}_IDENTIFIER_${ARGS_CATEGORY_NAME}" "${ARGS_IDENTIFIER}")
0112     set_property(GLOBAL PROPERTY "${_propertyprefix}_DESCRIPTION_${ARGS_CATEGORY_NAME}" "${ARGS_DESCRIPTION}")
0113 endmacro()
0114 
0115 
0116 set(_platformlib_qt_logging_categories_export_name "KDevPlatformCategories")
0117 set(_app_plugin_qt_logging_categories_export_name "KDevelopCategories")
0118 
0119 
0120 # declare_qt_logging_category(<sourcevarname>
0121 #                             TYPE LIBRARY|PLUGIN|APP [IDENTIFIER <id>] [CATEGORY_BASENAME <name>]
0122 #                             [HEADER <filename>] [DESCRIPTION <desc>])
0123 #
0124 # CATEGORY_BASENAME <name> is unused of TYPE APP.
0125 # IDENTIFIER <id> defaults to upper-case CATEGORY_BASENAME <name>.
0126 # HEADER <filename> defaults to "debug.h"
0127 # DESCRIPTION <desc> defaults to CATEGORY_BASENAME <name>.
0128 #
0129 # Example:
0130 #   declare_qt_logging_category(Foo_LIB_SRCS
0131 #       TYPE PLUGIN
0132 #       HEADER foodebug.h
0133 #       IDENTIFIER FOO
0134 #       CATEGORY_BASENAME "foo"
0135 #   )
0136 macro(declare_qt_logging_category sources)
0137     set(options )
0138     set(oneValueArgs HEADER IDENTIFIER CATEGORY_BASENAME DESCRIPTION TYPE)
0139     set(multiValueArgs)
0140 
0141     cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
0142 
0143     if(NOT DEFINED ARGS_TYPE)
0144         message(FATAL_ERROR "TYPE needs to be defined when calling declare_qt_logging_category().")
0145     endif()
0146     if(NOT DEFINED ARGS_IDENTIFIER)
0147         if(ARGS_TYPE STREQUAL "LIBRARY" OR ARGS_TYPE STREQUAL "PLUGIN")
0148             string(TOUPPER ${ARGS_CATEGORY_BASENAME} ARGS_IDENTIFIER)
0149         else()
0150             message(FATAL_ERROR "IDENTIFIER needs to be defined when calling declare_qt_logging_category().")
0151         endif()
0152     endif()
0153     if(NOT DEFINED ARGS_CATEGORY_BASENAME)
0154         if(ARGS_TYPE STREQUAL "LIBRARY" OR ARGS_TYPE STREQUAL "PLUGIN")
0155             message(FATAL_ERROR "CATEGORY_BASENAME needs to be defined when calling declare_qt_logging_category() with TYPE of LIBRARY or PLUGIN.")
0156         endif()
0157     endif()
0158     if(NOT DEFINED ARGS_HEADER)
0159         set(ARGS_HEADER debug.h)
0160     endif()
0161     if(NOT DEFINED ARGS_DESCRIPTION)
0162         set(ARGS_DESCRIPTION ${ARGS_CATEGORY_BASENAME})
0163     endif()
0164 
0165     if(ARGS_TYPE STREQUAL "LIBRARY")
0166         _declare_qt_logging_category(${sources}
0167             HEADER ${ARGS_HEADER}
0168             IDENTIFIER ${ARGS_IDENTIFIER}
0169             CATEGORY_NAME "kdevplatform.${ARGS_CATEGORY_BASENAME}"
0170             DESCRIPTION "KDevPlatform lib: ${ARGS_DESCRIPTION}"
0171             EXPORT ${_platformlib_qt_logging_categories_export_name}
0172         )
0173     elseif(ARGS_TYPE STREQUAL "PLUGIN")
0174         _declare_qt_logging_category(${sources}
0175             HEADER ${ARGS_HEADER}
0176             IDENTIFIER ${ARGS_IDENTIFIER}
0177             CATEGORY_NAME "kdevelop.plugins.${ARGS_CATEGORY_BASENAME}"
0178             DESCRIPTION "KDevelop plugin: ${ARGS_DESCRIPTION}"
0179             EXPORT ${_app_plugin_qt_logging_categories_export_name}
0180         )
0181     elseif(ARGS_TYPE STREQUAL "APP")
0182         _declare_qt_logging_category(${sources}
0183             HEADER ${ARGS_HEADER}
0184             IDENTIFIER ${ARGS_IDENTIFIER}
0185             CATEGORY_NAME "kdevelop.app"
0186             DESCRIPTION "KDevelop app"
0187             EXPORT ${_app_plugin_qt_logging_categories_export_name}
0188         )
0189     else()
0190         message(FATAL_ERROR "Unknown \"${ARGS_TYPE}\" with TYPE when calling declare_qt_logging_category().")
0191     endif()
0192 endmacro()
0193 
0194 
0195 # helper method
0196 # _install_qt_logging_categories(EXPORT <target> FILE <name> MACRONAME <macro>)
0197 #
0198 # Needs to be called after the last _declare_qt_logging_category call which uses the same EXPORT name.
0199 #
0200 # Example:
0201 #   _install_qt_logging_categories(
0202 #       EXPORT KDevPlatformCategories
0203 #       FILE kdevplatform.categories
0204 #   )
0205 function(_install_qt_logging_categories)
0206     set(options )
0207     set(oneValueArgs FILE EXPORT MACRONAME)
0208     set(multiValueArgs)
0209 
0210     cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
0211 
0212     if(NOT DEFINED ARGS_FILE)
0213         message(FATAL_ERROR "FILE needs to be defined when calling _install_qt_logging_categories().")
0214     endif()
0215 
0216     if(NOT DEFINED ARGS_EXPORT)
0217         message(FATAL_ERROR "EXPORT needs to be defined when calling _install_qt_logging_categories().")
0218     endif()
0219 
0220     if(NOT DEFINED ARGS_MACRONAME)
0221         message(FATAL_ERROR "MACRONAME needs to be defined when calling _install_qt_logging_categories().")
0222     endif()
0223 
0224     set(_propertyprefix "KDEV_QT_LOGGING_CATEGORY_${ARGS_EXPORT}")
0225     get_property(has_category GLOBAL PROPERTY "${_propertyprefix}_CATEGORIES" SET)
0226 
0227     if (NOT has_category)
0228         message(FATAL_ERROR "${ARGS_EXPORT} is an unknown qt logging category export name.")
0229     endif()
0230 
0231     get_property(_categories GLOBAL PROPERTY "${_propertyprefix}_CATEGORIES")
0232     list(SORT _categories)
0233 
0234     set(_content
0235 "# KDebugSettings data file
0236 # This file was generated by ${ARGS_MACRONAME}(). DO NOT EDIT!
0237 
0238 ")
0239 
0240     foreach(_category IN LISTS _categories)
0241         get_property(_description GLOBAL PROPERTY "${_propertyprefix}_DESCRIPTION_${_category}")
0242         get_property(_identifier GLOBAL PROPERTY "${_propertyprefix}_IDENTIFIER_${_category}")
0243 
0244         # Format:
0245         # logname<space>description(optional <space> DEFAULT_SEVERITY [DEFAULT_CATEGORY] as WARNING/DEBUG/INFO/CRITICAL) optional IDENTIFIER [...])
0246         string(APPEND _content "${_category} ${_description} IDENTIFIER [${_identifier}]\n")
0247     endforeach()
0248 
0249     if (NOT IS_ABSOLUTE ${ARGS_FILE})
0250         set(ARGS_FILE "${CMAKE_CURRENT_BINARY_DIR}/${ARGS_FILE}")
0251     endif()
0252     file(GENERATE
0253         OUTPUT "${ARGS_FILE}"
0254         CONTENT "${_content}"
0255     )
0256 
0257     install(
0258         FILES "${ARGS_FILE}"
0259         DESTINATION ${KDE_INSTALL_LOGGINGCATEGORIESDIR}
0260     )
0261 endfunction()
0262 
0263 # install_qt_logging_categories(TYPE LIBRARY|APP_PLUGIN)
0264 #
0265 # Needs to be called after the last declare_qt_logging_category call for the same TYPE(s).
0266 function(install_qt_logging_categories)
0267     set(options )
0268     set(oneValueArgs TYPE)
0269     set(multiValueArgs)
0270 
0271     cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
0272 
0273     if(NOT DEFINED ARGS_TYPE)
0274         message(FATAL_ERROR "TYPE needs to be defined when calling install_qt_logging_categories().")
0275     endif()
0276 
0277     if(ARGS_TYPE STREQUAL "LIBRARY")
0278         _install_qt_logging_categories(
0279             EXPORT ${_platformlib_qt_logging_categories_export_name}
0280             FILE kdevplatform.categories
0281             MACRONAME install_qt_logging_categories
0282         )
0283     elseif(ARGS_TYPE STREQUAL "APP_PLUGIN")
0284         _install_qt_logging_categories(
0285             EXPORT ${_app_plugin_qt_logging_categories_export_name}
0286             FILE kdevelop.categories
0287             MACRONAME install_qt_logging_categories
0288         )
0289     else()
0290         message(FATAL_ERROR "Unknown \"${ARGS_TYPE}\" with TYPE when calling declare_qt_logging_category().")
0291     endif()
0292 endfunction()
0293 
0294 # kdevelop_add_private_library(<target> SOURCES <source1> [<source2> [...]])
0295 function(kdevelop_add_private_library target)
0296     set(options)
0297     set(oneValueArgs)
0298     set(multiValueArgs SOURCES)
0299 
0300     cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
0301 
0302     string(REPLACE "KDev" "" shortTargetName ${target})
0303     if (${shortTargetName} STREQUAL ${target})
0304         message(FATAL_ERROR "Target passed to kdevelop_add_private_library needs to start with \"KDev\", was \"${target}\"")
0305     endif()
0306 
0307     string(TOLOWER ${shortTargetName} shortTargetNameToLower)
0308 
0309     add_library(${target} SHARED ${ARGS_SOURCES})
0310     add_library(KDev::${shortTargetName} ALIAS ${target})
0311 
0312     generate_export_header(${target} EXPORT_FILE_NAME ${shortTargetNameToLower}export.h)
0313 
0314     target_include_directories(${target}
0315         INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>" # useful for the "something.export.h" includes
0316     )
0317     set_target_properties(${target} PROPERTIES
0318         VERSION ${KDEV_PLUGIN_VERSION}
0319         SOVERSION ${KDEV_PLUGIN_VERSION}
0320     )
0321 
0322     install(TARGETS ${target} ${KDE_INSTALL_TARGETS_DEFAULT_ARGS} LIBRARY NAMELINK_SKIP)
0323 endfunction()