Changeset View
Changeset View
Standalone View
Standalone View
cmake/modules/KDevelopMacrosInternal.cmake
- This file was added.
1 | # | ||||
---|---|---|---|---|---|
2 | # KDevelop Private Macros | ||||
3 | # | ||||
4 | # The following macros are defined here: | ||||
5 | # | ||||
6 | # add_compile_flag_if_supported(<flag> [CXX_ONLY]) | ||||
7 | # add_target_compile_flag_if_supported(<target> <INTERFACE|PUBLIC|PRIVATE> <flag>) | ||||
8 | # declare_qt_logging_category(<sourcevarname> | ||||
9 | # TYPE LIBRARY|PLUGIN|APP [IDENTIFIER <id>] [CATEGORY_BASENAME <name>] | ||||
10 | # [HEADER <filename>] [DESCRIPTION <desc>]) | ||||
11 | # install_qt_logging_categories(TYPE LIBRARY|APP_PLUGIN) | ||||
12 | # | ||||
13 | #============================================================================= | ||||
14 | # Copyright 2018 Friedrich W. H. Kossebau <kossebau@kde.org> | ||||
15 | # | ||||
16 | # Distributed under the OSI-approved BSD License (the "License"); | ||||
17 | # see accompanying file Copyright.txt for details. | ||||
18 | # | ||||
19 | # This software is distributed WITHOUT ANY WARRANTY; without even the | ||||
20 | # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||||
21 | # See the License for more information. | ||||
22 | #============================================================================= | ||||
23 | | ||||
24 | | ||||
25 | # helper method to ensure consistent cache var names | ||||
26 | function(_varname_for_compile_flag_check_result _varname _flag ) | ||||
27 | string(REGEX REPLACE "[-=]" "_" _varname ${_flag}) | ||||
28 | string(TOUPPER ${_varname} _varname) | ||||
29 | set(_varname "KDEV_HAVE${_varname}" PARENT_SCOPE) | ||||
30 | endfunction() | ||||
31 | | ||||
32 | | ||||
33 | # add_compile_flag_if_supported(<flag> [CXX_ONLY]) | ||||
34 | # Optional argument CXX_ONLY to set the flag only for C++ code. | ||||
35 | # | ||||
36 | # Example: | ||||
37 | # add_compile_flag_if_supported(-Wsuggest-override CXX_ONLY) | ||||
38 | function(add_compile_flag_if_supported _flag) | ||||
39 | _varname_for_compile_flag_check_result(_varname ${_flag}) | ||||
40 | check_cxx_compiler_flag("${_flag}" "${_varname}") | ||||
41 | | ||||
42 | if (${${_varname}}) | ||||
43 | if("${ARGV1}" STREQUAL "CXX_ONLY") | ||||
44 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_flag}" PARENT_SCOPE) | ||||
45 | else() | ||||
46 | add_compile_options(${_flag}) | ||||
47 | endif() | ||||
48 | endif() | ||||
49 | endfunction() | ||||
50 | | ||||
51 | | ||||
52 | # add_target_compile_flag_if_supported(<target> <INTERFACE|PUBLIC|PRIVATE> <flag>) | ||||
53 | # | ||||
54 | # Example: | ||||
55 | # add_target_compile_flag_if_supported(kdevqtc-qmlsupport PRIVATE "-Wno-suggest-override") | ||||
56 | function(add_target_compile_flag_if_supported _target _scope _flag) | ||||
57 | _varname_for_compile_flag_check_result(_varname ${_flag}) | ||||
58 | check_cxx_compiler_flag("${_flag}" "${_varname}") | ||||
59 | | ||||
60 | if (${${_varname}}) | ||||
61 | target_compile_options(${_target} ${_scope} "${_flag}") | ||||
62 | endif() | ||||
63 | endfunction() | ||||
64 | | ||||
65 | | ||||
66 | # helper method | ||||
67 | # _declare_qt_logging_category(<sourcevarname> | ||||
68 | # HEADER <filename> IDENTIFIER <id> CATEGORY_NAME <name> | ||||
69 | # EXPORT <target> DESCRIPTION <desc>) | ||||
70 | # | ||||
71 | # Example: | ||||
72 | # _declare_qt_logging_category(Foo_LIB_SRCS | ||||
73 | # HEADER debug.h | ||||
74 | # IDENTIFIER FOO | ||||
75 | # CATEGORY_NAME "bar.foo" | ||||
76 | # DESCRIPTION "The foo of bar" | ||||
77 | # EXPORT BarCategories | ||||
78 | # ) | ||||
79 | macro(_declare_qt_logging_category sources) | ||||
80 | set(options ) | ||||
81 | set(oneValueArgs HEADER IDENTIFIER CATEGORY_NAME EXPORT DESCRIPTION) | ||||
82 | set(multiValueArgs) | ||||
83 | | ||||
84 | cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||||
85 | | ||||
86 | if(NOT DEFINED ARGS_HEADER) | ||||
87 | message(FATAL_ERROR "HEADER needs to be defined when calling _declare_qt_logging_category().") | ||||
88 | endif() | ||||
89 | if(NOT DEFINED ARGS_IDENTIFIER) | ||||
90 | message(FATAL_ERROR "IDENTIFIER needs to be defined when calling _declare_qt_logging_category().") | ||||
91 | endif() | ||||
92 | if(NOT DEFINED ARGS_CATEGORY_NAME) | ||||
93 | message(FATAL_ERROR "CATEGORY_NAME needs to be defined when calling _declare_qt_logging_category().") | ||||
94 | endif() | ||||
95 | if(NOT DEFINED ARGS_DESCRIPTION) | ||||
96 | message(FATAL_ERROR "DESCRIPTION needs to be defined when calling _declare_qt_logging_category().") | ||||
97 | endif() | ||||
98 | | ||||
99 | ecm_qt_declare_logging_category(${sources} | ||||
100 | HEADER ${ARGS_HEADER} | ||||
101 | IDENTIFIER ${ARGS_IDENTIFIER} | ||||
102 | CATEGORY_NAME ${ARGS_CATEGORY_NAME} | ||||
103 | ) | ||||
104 | | ||||
105 | # Nasty hack: we create a target just to store all the category data in some build-system global object | ||||
106 | # which then can be accessed from other places like _install_qt_logging_categories(). | ||||
107 | # we also create it here on first usage, to spare some additional call. | ||||
108 | # Better idea how to solve that welcome | ||||
109 | set(_targetname "qt_logging_category_${ARGS_EXPORT}") | ||||
110 | if (NOT TARGET ${_targetname}) | ||||
111 | add_custom_target(${_targetname}) | ||||
112 | set(_categories ${ARGS_CATEGORY_NAME}) | ||||
113 | else() | ||||
114 | get_target_property(_value ${_targetname} CATEGORIES) | ||||
115 | set(_categories "${_value};${ARGS_CATEGORY_NAME}") | ||||
116 | endif() | ||||
117 | set_property(TARGET ${_targetname} PROPERTY CATEGORIES "${_categories}") | ||||
118 | set_property(TARGET ${_targetname} PROPERTY "IDENTIFIER_${ARGS_CATEGORY_NAME}" "${ARGS_IDENTIFIER}") | ||||
119 | set_property(TARGET ${_targetname} PROPERTY "DESCRIPTION_${ARGS_CATEGORY_NAME}" "${ARGS_DESCRIPTION}") | ||||
120 | endmacro() | ||||
121 | | ||||
122 | | ||||
123 | set(_platformlib_qt_logging_categories_export_name "KDevPlatformCategories") | ||||
124 | set(_app_plugin_qt_logging_categories_export_name "KDevelopCategories") | ||||
125 | | ||||
126 | | ||||
127 | # declare_qt_logging_category(<sourcevarname> | ||||
128 | # TYPE LIBRARY|PLUGIN|APP [IDENTIFIER <id>] [CATEGORY_BASENAME <name>] | ||||
129 | # [HEADER <filename>] [DESCRIPTION <desc>]) | ||||
130 | # | ||||
131 | # CATEGORY_BASENAME <name> is unused of TYPE APP. | ||||
132 | # IDENTIFIER <id> defaults to upper-case CATEGORY_BASENAME <name>. | ||||
133 | # HEADER <filename> defaults to "debug.h" | ||||
134 | # DESCRIPTION <desc> defaults to CATEGORY_BASENAME <name>. | ||||
135 | # | ||||
136 | # Example: | ||||
137 | # declare_qt_logging_category(Foo_LIB_SRCS | ||||
138 | # TYPE PLUGIN | ||||
139 | # HEADER foodebug.h | ||||
140 | # IDENTIFIER FOO | ||||
141 | # CATEGORY_BASENAME "foo" | ||||
142 | # ) | ||||
143 | macro(declare_qt_logging_category sources) | ||||
144 | set(options ) | ||||
145 | set(oneValueArgs HEADER IDENTIFIER CATEGORY_BASENAME DESCRIPTION TYPE) | ||||
146 | set(multiValueArgs) | ||||
147 | | ||||
148 | cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||||
149 | | ||||
150 | if(NOT DEFINED ARGS_TYPE) | ||||
151 | message(FATAL_ERROR "TYPE needs to be defined when calling declare_qt_logging_category().") | ||||
152 | endif() | ||||
153 | if(NOT DEFINED ARGS_IDENTIFIER) | ||||
154 | if(ARGS_TYPE STREQUAL "LIBRARY" OR ARGS_TYPE STREQUAL "PLUGIN") | ||||
155 | string(TOUPPER ${ARGS_CATEGORY_BASENAME} ARGS_IDENTIFIER) | ||||
156 | else() | ||||
157 | message(FATAL_ERROR "IDENTIFIER needs to be defined when calling declare_qt_logging_category().") | ||||
158 | endif() | ||||
159 | endif() | ||||
160 | if(NOT DEFINED ARGS_CATEGORY_BASENAME) | ||||
161 | if(ARGS_TYPE STREQUAL "LIBRARY" OR ARGS_TYPE STREQUAL "PLUGIN") | ||||
162 | message(FATAL_ERROR "CATEGORY_BASENAME needs to be defined when calling declare_qt_logging_category() with TYPE of LIBRARY or PLUGIN.") | ||||
163 | endif() | ||||
164 | endif() | ||||
165 | if(NOT DEFINED ARGS_HEADER) | ||||
166 | set(ARGS_HEADER debug.h) | ||||
167 | endif() | ||||
168 | if(NOT DEFINED ARGS_DESCRIPTION) | ||||
169 | set(ARGS_DESCRIPTION ${ARGS_CATEGORY_BASENAME}) | ||||
170 | endif() | ||||
171 | | ||||
172 | if(ARGS_TYPE STREQUAL "LIBRARY") | ||||
173 | _declare_qt_logging_category(${sources} | ||||
174 | HEADER ${ARGS_HEADER} | ||||
175 | IDENTIFIER ${ARGS_IDENTIFIER} | ||||
176 | CATEGORY_NAME "kdevplatform.${ARGS_CATEGORY_BASENAME}" | ||||
177 | DESCRIPTION "KDevPlatform lib: ${ARGS_DESCRIPTION}" | ||||
178 | EXPORT ${_platformlib_qt_logging_categories_export_name} | ||||
179 | ) | ||||
180 | elseif(ARGS_TYPE STREQUAL "PLUGIN") | ||||
181 | _declare_qt_logging_category(${sources} | ||||
182 | HEADER ${ARGS_HEADER} | ||||
183 | IDENTIFIER ${ARGS_IDENTIFIER} | ||||
184 | CATEGORY_NAME "kdevelop.plugins.${ARGS_CATEGORY_BASENAME}" | ||||
185 | DESCRIPTION "KDevelop plugin: ${ARGS_DESCRIPTION}" | ||||
186 | EXPORT ${_app_plugin_qt_logging_categories_export_name} | ||||
187 | ) | ||||
188 | elseif(ARGS_TYPE STREQUAL "APP") | ||||
189 | _declare_qt_logging_category(${sources} | ||||
190 | HEADER ${ARGS_HEADER} | ||||
191 | IDENTIFIER ${ARGS_IDENTIFIER} | ||||
192 | CATEGORY_NAME "kdevelop.app" | ||||
193 | DESCRIPTION "KDevelop app" | ||||
194 | EXPORT ${_app_plugin_qt_logging_categories_export_name} | ||||
195 | ) | ||||
196 | else() | ||||
197 | message(FATAL_ERROR "Unknown \"${ARGS_TYPE}\" with TYPE when calling declare_qt_logging_category().") | ||||
198 | endif() | ||||
199 | endmacro() | ||||
200 | | ||||
201 | | ||||
202 | # helper method | ||||
203 | # _install_qt_logging_categories(EXPORT <target> FILE <name> MACRONAME <macro>) | ||||
204 | # | ||||
205 | # Needs to be called after the last _declare_qt_logging_category call which uses the same EXPORT name. | ||||
206 | # | ||||
207 | # Example: | ||||
208 | # _install_qt_logging_categories( | ||||
209 | # EXPORT KDevPlatformCategories | ||||
210 | # FILE kdevplatform.categories | ||||
211 | # ) | ||||
212 | function(_install_qt_logging_categories) | ||||
213 | set(options ) | ||||
214 | set(oneValueArgs FILE EXPORT MACRONAME) | ||||
215 | set(multiValueArgs) | ||||
216 | | ||||
217 | cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||||
218 | | ||||
219 | if(NOT DEFINED ARGS_FILE) | ||||
220 | message(FATAL_ERROR "FILE needs to be defined when calling _install_qt_logging_categories().") | ||||
221 | endif() | ||||
222 | | ||||
223 | if(NOT DEFINED ARGS_EXPORT) | ||||
224 | message(FATAL_ERROR "EXPORT needs to be defined when calling _install_qt_logging_categories().") | ||||
225 | endif() | ||||
226 | | ||||
227 | if(NOT DEFINED ARGS_MACRONAME) | ||||
228 | message(FATAL_ERROR "MACRONAME needs to be defined when calling _install_qt_logging_categories().") | ||||
229 | endif() | ||||
230 | | ||||
231 | set(_targetname "qt_logging_category_${ARGS_EXPORT}") | ||||
232 | if (NOT TARGET ${_targetname}) | ||||
233 | message(FATAL_ERROR "${ARGS_EXPORT} is an unknown qt logging category export name.") | ||||
234 | endif() | ||||
235 | | ||||
236 | get_target_property(_categories ${_targetname} CATEGORIES) | ||||
237 | list(SORT _categories) | ||||
238 | | ||||
239 | set(_content | ||||
240 | "# KDebugSettings data file | ||||
241 | # This file was generated by ${ARGS_MACRONAME}(). DO NOT EDIT! | ||||
242 | | ||||
243 | ") | ||||
244 | | ||||
245 | foreach(_category IN LISTS _categories) | ||||
246 | get_target_property(_description ${_targetname} "DESCRIPTION_${_category}") | ||||
247 | | ||||
248 | # Format: | ||||
249 | # logname<space>description | ||||
250 | string(APPEND _content "${_category} ${_description}\n") | ||||
251 | | ||||
252 | # TODO: support newer not backward-compatible format as supported by kdebugsettings 18.12 | ||||
253 | # Format: | ||||
254 | # logname<space>description(optional <space> DEFAULT_SEVERITY [DEFAULT_CATEGORY] as WARNING/DEBUG/INFO/CRITICAL) optional IDENTIFIER [...]) | ||||
255 | # example: logname<space>description<space>DEFAULT_SEVERITY<space>[DEBUG]<space>IDENTIFIER<space>[foo] | ||||
256 | # Needs idea how to ensure that at runtime kdebugsettings is min KA 18.12 | ||||
257 | endforeach() | ||||
258 | | ||||
259 | if (NOT IS_ABSOLUTE ${ARGS_FILE}) | ||||
260 | set(ARGS_FILE "${CMAKE_CURRENT_BINARY_DIR}/${ARGS_FILE}") | ||||
261 | endif() | ||||
262 | file(GENERATE | ||||
263 | OUTPUT "${ARGS_FILE}" | ||||
264 | CONTENT "${_content}" | ||||
265 | ) | ||||
266 | | ||||
267 | install( | ||||
268 | FILES "${ARGS_FILE}" | ||||
269 | DESTINATION ${KDE_INSTALL_CONFDIR} | ||||
270 | ) | ||||
271 | endfunction() | ||||
272 | | ||||
273 | # install_qt_logging_categories(TYPE LIBRARY|APP_PLUGIN) | ||||
274 | # | ||||
275 | # Needs to be called after the last declare_qt_logging_category call for the same TYPE(s). | ||||
276 | function(install_qt_logging_categories) | ||||
277 | set(options ) | ||||
278 | set(oneValueArgs TYPE) | ||||
279 | set(multiValueArgs) | ||||
280 | | ||||
281 | cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | ||||
282 | | ||||
283 | if(NOT DEFINED ARGS_TYPE) | ||||
284 | message(FATAL_ERROR "TYPE needs to be defined when calling install_qt_logging_categories().") | ||||
285 | endif() | ||||
286 | | ||||
287 | if(ARGS_TYPE STREQUAL "LIBRARY") | ||||
288 | _install_qt_logging_categories( | ||||
289 | EXPORT ${_platformlib_qt_logging_categories_export_name} | ||||
290 | FILE kdevplatform.categories | ||||
291 | MACRONAME install_qt_logging_categories | ||||
292 | ) | ||||
293 | elseif(ARGS_TYPE STREQUAL "APP_PLUGIN") | ||||
294 | _install_qt_logging_categories( | ||||
295 | EXPORT ${_app_plugin_qt_logging_categories_export_name} | ||||
296 | FILE kdevelop.categories | ||||
297 | MACRONAME install_qt_logging_categories | ||||
298 | ) | ||||
299 | else() | ||||
300 | message(FATAL_ERROR "Unknown \"${ARGS_TYPE}\" with TYPE when calling declare_qt_logging_category().") | ||||
301 | endif() | ||||
302 | endfunction() |