cmake_diagnostic
Добавлено в версии 4.4.
Управление параметрами диагностики CMake. Список доступных категорий см. в руководстве cmake-diagnostics(7).
Краткое описание
Setting Diagnostics cmake_diagnostic(SET <category> <action> [RECURSE]) cmake_diagnostic(PROMOTE <category> <action> [NO_RECURSE]) cmake_diagnostic(DEMOTE <category> <action> [NO_RECURSE]) Checking Diagnostic Actions cmake_diagnostic(GET <diagnostic> <out-var>) CMake Diagnostic Stack cmake_diagnostic(PUSH) cmake_diagnostic(POP)
Настройка диагностики
-
cmake_diagnostic(SET CMD_<CATEGORY> <action> [RECURSE]) -
cmake_diagnostic(PROMOTE CMD_<CATEGORY> <action> [NO_RECURSE]) -
cmake_diagnostic(DEMOTE CMD_<CATEGORY> <action> [NO_RECURSE])
Задать или изменить действие, выполняемое при возникновении диагностики, относящейся к определённой категории.
Подкоманда SET задаёт действие для указанной категории диагностики. Подкоманда PROMOTE повышает серьёзность для указанной категории диагностики или ничего не делает, если уже задано действие с такой же или более высокой серьёзностью. Подкоманда DEMOTE понижает серьёзность для указанной категории диагностики или ничего не делает, если уже задано действие с такой же или более низкой серьёзностью.
Возможные действия <action> (в порядке возрастания серьёзности):
-
IGNORE -
Ничего не делать.
-
WARN -
Выдать предупреждение и продолжить обработку.
-
SEND_ERROR -
Выдать ошибку, продолжить обработку, но пропустить генерацию.
Исполняемый файл
cmake(1)вернёт ненулевой код завершения. -
FATAL_ERROR -
Выдать ошибку, остановить обработку и генерацию.
Исполняемый файл
cmake(1)вернёт ненулевой код завершения.
Некоторые категории диагностики имеют иерархическую структуру. Параметры RECURSE и NO_RECURSE определяют, изменяет ли изменение действия для категории диагностики также какие-либо дочерние категории. По умолчанию подкоманды PROMOTE и DEMOTE выполняются рекурсивно, а подкоманда SET — нет. Обратите внимание: изменение дочерних категорий не зависит от ранее заданного действия для родительских категорий; то есть PROMOTE и DEMOTE при рекурсивном выполнении будут применяться ко всем дочерним категориям, даже если действие родительской категории не менялось.
Проверка действий диагностики
-
cmake_diagnostic(GET CMD_<CATEGORY> <variable>)
Проверить, какое действие в данный момент задано для категории диагностики. Выходное значение <variable> будет одним из следующих: IGNORE, WARN, SEND_ERROR или FATAL_ERROR.
Стек диагностики CMake
CMake хранит параметры диагностики в стеке, поэтому изменения, внесённые командой cmake_diagnostic, затрагивают только вершину стека. Для каждого подкаталога автоматически создаётся новая запись в стеке диагностики, чтобы защитить его родительские и соседние каталоги. CMake также создаёт новую запись для скриптов, загруженных командами include() и find_package(), кроме случаев вызова с параметром NO_DIAGNOSTIC_SCOPE. Команда cmake_diagnostic предоставляет интерфейс для управления пользовательскими записями в стеке диагностики:
-
cmake_diagnostic(PUSH) -
Создать новую запись в стеке диагностики.
-
cmake_diagnostic(POP) -
Удалить последнюю запись стека диагностики, созданную с помощью
cmake_diagnostic(PUSH).
Каждому вызову PUSH должен соответствовать вызов POP, чтобы отменить все изменения. Это позволяет временно изменять параметры диагностики. Вызовы команд cmake_diagnostic(SET), cmake_diagnostic(PROMOTE) или cmake_diagnostic(DEMOTE) изменяют только текущую вершину стека диагностики.
Команда block(SCOPE_FOR DIAGNOSTICS) предоставляет более гибкий и надёжный способ управления стеком диагностики. При выходе из области действия блока запись автоматически удаляется, поэтому перед каждым вызовом return() нет необходимости вызывать cmake_diagnostic(POP).
# stack management with cmake_diagnostic()
function(my_func)
cmake_diagnostic(PUSH)
cmake_diagnostic(SET ...)
if (<cond1>)
...
cmake_diagnostic(POP)
return()
elseif(<cond2>)
...
cmake_diagnostic(POP)
return()
endif()
...
cmake_diagnostic(POP)
endfunction()
# stack management with block()/endblock()
function(my_func)
block(SCOPE_FOR DIAGNOSTICS)
cmake_diagnostic(SET ...)
if (<cond1>)
...
return()
elseif(<cond2>)
...
return()
endif()
...
endblock()
endfunction()
Команды, созданные с помощью команд function() и macro(), сохраняют параметры диагностики на момент создания и используют сохранённые параметры при вызове. Если реализация функции или макроса задаёт параметры диагностики, изменения автоматически распространяются вверх по цепочке вызовов, пока не достигнут ближайшей вложенной записи стека диагностики.
© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/command/cmake_diagnostic.html