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`_ [RECURSE]) cmake_diagnostic(`PROMOTE`_ [NO_RECURSE]) cmake_diagnostic(`DEMOTE`_ [NO_RECURSE]) `Checking Diagnostic Actions`_ cmake_diagnostic(`GET`_ ) `CMake Diagnostic Stack`_ cmake_diagnostic(`PUSH`_) cmake_diagnostic(`POP`_) Setting Diagnostics ^^^^^^^^^^^^^^^^^^^ .. signature:: cmake_diagnostic(SET CMD_ [RECURSE]) cmake_diagnostic(PROMOTE CMD_ [NO_RECURSE]) cmake_diagnostic(DEMOTE CMD_ [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 ````\ 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 `. ``FATAL_ERROR`` Report an error, stop processing and generation. The :manual:`cmake(1)` executable will return a non-zero :ref:`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_ ) :target: GET Check what action is currently specified for a diagnostic category. The output ```` 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 () ... cmake_diagnostic(POP) return() elseif() ... 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 () ... return() elseif() ... 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.