blob: 29b258917d01f19dae9e6590d6b4e4e64d35ab70 [file] [log] [blame] [edit]
cmake_diagnostic
----------------
.. versionadded:: 4.4
Manage CMake Diagnostic settings. See the :manual:`cmake-diagnostics(7)`
manual for a list of available categories.
Synopsis
^^^^^^^^
.. parsed-literal::
`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`_)
Setting Diagnostics
^^^^^^^^^^^^^^^^^^^
.. signature::
cmake_diagnostic(SET CMD_<CATEGORY> <action> [RECURSE])
cmake_diagnostic(PROMOTE CMD_<CATEGORY> <action> [NO_RECURSE])
cmake_diagnostic(DEMOTE CMD_<CATEGORY> <action> [NO_RECURSE])
:target:
SET
PROMOTE
DEMOTE
Set or alter the action taken when a diagnostic belonging to a particular
category is triggered.
The ``SET`` subcommand sets the action for the specified diagnostic category.
The ``PROMOTE`` subcommand increases the severity for the specified diagnostic
category, or does nothing if the action was already set to an equal or higher
severity. The ``DEMOTE`` subcommand decreases the severity for the specified
diagnostic category, or does nothing if the action was already set to an equal
or lower severity.
The possible ``<action>``\ s (in order of severity) are:
``IGNORE``
Do nothing.
``WARN``
Report a warning and continue processing.
``SEND_ERROR``
Report an error, continue processing, but skip generation.
The :manual:`cmake(1)` executable will return a non-zero
:ref:`exit code <CMake Exit Code>`.
``FATAL_ERROR``
Report an error, stop processing and generation.
The :manual:`cmake(1)` executable will return a non-zero
:ref:`exit code <CMake Exit Code>`.
Some diagnostic categories are hierarchical. The ``RECURSE`` and
``NO_RECURSE`` options determine whether changing the action for a diagnostic
category also modifies any child categories. By default, the ``PROMOTE`` and
``DEMOTE`` subcommands are recursive, while the ``SET`` subcommand is not.
Note that the alteration for child categories is independent of the prior
action set on any parents; that is, ``PROMOTE`` and ``DEMOTE``, when operating
recursively, will operate on all child categories even if a parent category's
action was not altered.
Checking Diagnostic Actions
^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. signature:: cmake_diagnostic(GET CMD_<CATEGORY> <variable>)
:target: GET
Check what action is currently specified for a diagnostic category.
The output ``<variable>`` value will be one of ``IGNORE``, ``WARN``,
``SEND_ERROR`` or ``FATAL_ERROR``.
CMake Diagnostic Stack
^^^^^^^^^^^^^^^^^^^^^^
CMake keeps diagnostic settings on a stack, so changes made by the
``cmake_diagnostic`` command affect only the top of the stack. A new entry on
the diagnostic stack is managed automatically for each subdirectory to protect
its parents and siblings. CMake also manages a new entry for scripts loaded by
:command:`include` and :command:`find_package` commands except when invoked
with the ``NO_DIAGNOSTIC_SCOPE`` option. The ``cmake_diagnostic`` command
provides an interface to manage custom entries on the diagnostic stack:
.. signature:: cmake_diagnostic(PUSH)
Create a new entry on the diagnostic stack.
.. signature:: cmake_diagnostic(POP)
Remove the last diagnostic stack entry created with
``cmake_diagnostic(PUSH)``.
Each ``PUSH`` must have a matching ``POP`` to erase any changes.
This is useful to make temporary changes to diagnostic settings.
Calls to the :command:`cmake_diagnostic(SET)`,
:command:`cmake_diagnostic(PROMOTE)`, or :command:`cmake_diagnostic(DEMOTE)`
commands influence only the current top of the diagnostic stack.
The :command:`block(SCOPE_FOR DIAGNOSTICS)` command offers a more flexible
and more secure way to manage the diagnostic stack. The pop action is done
automatically when leaving the block scope, so there is no need to
precede each :command:`return` with a call to :command:`cmake_diagnostic(POP)`.
.. code-block:: cmake
# 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()
Commands created by the :command:`function` and :command:`macro` commands
record diagnostic settings when they are created and use the pre-record
diagnostics when they are invoked. If the function or macro implementation
sets diagnostics, the changes automatically propagate up through callers until
they reach the closest nested diagnostic stack entry.