.. # Copyright (c) 2017-2025, Lawrence Livermore National Security, LLC and .. # other BLT Project Developers. See the top-level LICENSE file for details .. # .. # SPDX-License-Identifier: (BSD-3-Clause) Code Check Macros ================== .. _blt_add_code_checks: blt_add_code_checks ~~~~~~~~~~~~~~~~~~~ .. code-block:: cmake blt_add_code_checks( PREFIX SOURCES [source1 [source2 ...]] ASTYLE_CFG_FILE CLANGFORMAT_CFG_FILE UNCRUSTIFY_CFG_FILE YAPF_CFG_FILE CMAKEFORMAT_CFG_FILE CPPCHECK_FLAGS CLANGQUERY_CHECKER_DIRECTORIES [dir1 [dir2]]) This macro adds all enabled code check targets for the given SOURCES. PREFIX Prefix used for the created code check build targets. For example: _uncrustify_check SOURCES Source list that the code checks will be ran on ASTYLE_CFG_FILE Path to AStyle config file CLANGFORMAT_CFG_FILE Path to ClangFormat config file UNCRUSTIFY_CFG_FILE Path to Uncrustify config file YAPF_CFG_FILE Path to Yapf config file CMAKEFORMAT_CFG_FILE Path to CMakeFormat config file CPPCHECK_FLAGS List of flags added to Cppcheck CLANGQUERY_CHECKER_DIRECTORIES List of directories where clang-query's checkers are located The purpose of this macro is to enable all code checks in the default manner. It runs all code checks from the working directory ``CMAKE_BINARY_DIR``. If you need more specific functionality you will need to call the individual code check macros yourself. .. note:: For library projects that may be included as a subproject of another code via CMake's ``add_subproject()``, we recommend guarding "code check" targets against being included in other codes. The following check ``if ("${PROJECT_SOURCE_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}")`` will stop your code checks from running unless you are the main CMake project. Enabled code checks produce a ``check`` build target that will test to see if you are out of compliance with your code formatting and a ``style`` build target that will actually modify your source files. These default names can be modified via the ``BLT_CODE_CHECK_TARGET_NAME`` and ``BLT_CODE_STYLE_TARGET_NAME`` variables (e.g. if they conflict with existing project target names). Depending on enabled features, it also creates build targets that follow the following pattern ``__``. .. note:: Since clang-tidy can produce unsafe changes, BLT does not add ``clang_tidy_check`` to the main ``check`` target or ``clang_tidy_style`` to the main ``style`` target. User projects can do so by adding the following CMake commands: ``add_dependencies(check clang_tidy_check)`` and/or ``add_dependencies(style clang_tidy_style)`` or can manually run the ``clang_tidy_check`` and ``clang_tidy_style`` targets. Sources are filtered based on file extensions for use in these code checks. If you need additional file extensions defined add them to ``BLT_C_FILE_EXTS``, ``BLT_Python_FILE_EXTS``, ``BLT_CMAKE_FILE_EXTS``, and ``BLT_Fortran_FILE_EXTS``. Currently this macro only has code checks for C/C++ and Python; it simply filters out the Fortran files. This macro supports C/C++ code formatting with either AStyle, ClangFormat, or Uncrustify (but not all at the same time) only if the following requirements are met: - AStyle * ``ASTYLE_CFG_FILE`` is given * ``ASTYLE_EXECUTABLE`` is defined and found prior to calling this macro - ClangFormat * ``CLANGFORMAT_CFG_FILE`` is given * ``CLANGFORMAT_EXECUTABLE`` is defined and found prior to calling this macro - Uncrustify * ``UNCRUSTIFY_CFG_FILE`` is given * ``UNCRUSTIFY_EXECUTABLE`` is defined and found prior to calling this macro .. note:: ClangFormat and clang-tidy do not support a command line option for config files. To work around this, we copy the given config file to the build directory where this macro runs from. This macro also supports Python code formatting with Yapf only if the following requirements are met: * ``YAPF_CFG_FILE`` is given * ``YAPF_EXECUTABLE`` is defined and found prior to calling this macro This macro also supports CMake code formatting with CMakeFormat only if the following requirements are met: * ``CMAKEFORMAT_CFG_FILE`` is given * ``CMAKEFORMAT_EXECUTABLE`` is defined and found prior to calling this macro If a particular version of a code formatting tool is required, you can configure BLT to enforce that version by setting ``BLT_REQUIRED__VERSION`` to as much of the version as you need. For example: .. code-block:: cmake # If astyle major version 3 is required (3.0, 3.1, etc are acceptable) set(BLT_REQUIRED_ASTYLE_VERSION "3") # Or, if exactly 3.1 is needed set(BLT_REQUIRED_ASTYLE_VERSION "3.1") This macro supports the following static analysis tools with their requirements: - CppCheck * ``CPPCHECK_EXECUTABLE`` is defined and found prior to calling this macro * ``CPPCHECK_FLAGS`` added to the cppcheck command line before the sources - Clang-Query * ``CLANGQUERY_EXECUTABLE`` is defined and found prior to calling this macro * ``CLANGQUERY_CHECKER_DIRECTORIES`` parameter given or ``BLT_CLANGQUERY_CHECKER_DIRECTORIES`` is defined - clang-tidy * ``CLANGTIDY_EXECUTABLE`` is defined and found prior to calling this macro * ``CLANGAPPLYREPLACEMENTS_EXECUTABLE`` should be defined and found prior to calling this macro to support applying clang-tidy changes .. _blt_add_clang_query_target: blt_add_clang_query_target ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: cmake blt_add_clang_query_target( NAME WORKING_DIRECTORY COMMENT CHECKERS DIE_ON_MATCH SRC_FILES [source1 [source2 ...]] CHECKER_DIRECTORIES [dir1 [dir2]]) Creates a new build target for running clang-query. NAME Name of created build target WORKING_DIRECTORY Directory in which the clang-query command is run. Defaults to where macro is called. COMMENT Comment prepended to the build target output CHECKERS list of checkers to be run by created build target DIE_ON_MATCH Causes build failure on first clang-query match. Defaults to FALSE.S SRC_FILES Source list that clang-query will be ran on CHECKER_DIRECTORIES List of directories where clang-query's checkers are located Clang-query is a tool used for examining and matching the Clang AST. It is useful for enforcing coding standards and rules on your source code. A good primer on how to use clang-query can be found `here `__. A list of checker directories is required for clang-query, this can be defined either by the parameter ``CHECKER_DIRECTORIES`` or the variable ``BLT_CLANGQUERY_CHECKER_DIRECTORIES``. Turning on ``DIE_ON_MATCH`` is useful if you're using this in CI to enforce rules about your code. ``CHECKERS`` are the static analysis passes to specifically run on the target. The following checker options can be given: * (no value) : run all available static analysis checks found * (checker1:checker2) : run checker1 and checker2 * (interpreter) : run the clang-query interpreter to interactively develop queries .. _blt_add_cppcheck_target: blt_add_cppcheck_target ~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: cmake blt_add_cppcheck_target( NAME WORKING_DIRECTORY PREPEND_FLAGS APPEND_FLAGS COMMENT SRC_FILES [source1 [source2 ...]] ) Creates a new build target for running cppcheck NAME Name of created build target WORKING_DIRECTORY Directory in which the clang-query command is run. Defaults to where macro is called. PREPEND_FLAGS Additional flags added to the front of the cppcheck flags APPEND_FLAGS Additional flags added to the end of the cppcheck flags COMMENT Comment prepended to the build target output SRC_FILES Source list that cppcheck will be ran on Cppcheck is a static analysis tool for C/C++ code. More information about Cppcheck can be found `here `__. .. _blt_add_clang_tidy_target: blt_add_clang_tidy_target ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: cmake blt_add_clang_tidy_target( NAME WORKING_DIRECTORY COMMENT CHECKS FIX SRC_FILES [source1 [source2 ...]] ) Creates a new build target for running clang-tidy. NAME Name of created build target WORKING_DIRECTORY Directory in which the clang-tidy command is run. Defaults to where macro is called. COMMENT Comment prepended to the build target output CHECKS List of checks to be run on the selected source files, available checks are listed `here `__. FIX Applies fixes for checks (a subset of clang-tidy checks specify how they should be resolved) SRC_FILES Source list that clang-tidy will be ran on Clang-tidy is a tool used for diagnosing and fixing typical programming errors. It is useful for enforcing coding standards and rules on your source code. Clang-tidy is documented `here `__. ``CHECKS`` are the static analysis "rules" to specifically run on the target. If no checks are specified, clang-tidy will run the default available static analysis checks. .. note:: The ``FIX`` option requires ``clang-apply-replacements``, which is controlled by the ``ENABLE_CLANGAPPLYREPLACEMENTS`` CMake variable and can be provided with the ``CLANGAPPLYREPLACEMENTS_EXECUTABLE`` CMake variable. .. _blt_add_astyle_target: blt_add_astyle_target ~~~~~~~~~~~~~~~~~~~~~ .. code-block:: cmake blt_add_astyle_target( NAME MODIFY_FILES [TRUE | FALSE (default)] CFG_FILE PREPEND_FLAGS APPEND_FLAGS COMMENT WORKING_DIRECTORY SRC_FILES [FILE1 [FILE2 ...]] ) Creates a new build target for running AStyle NAME Name of created build target MODIFY_FILES Modify the files in place. Defaults to FALSE. CFG_FILE Path to AStyle config file PREPEND_FLAGS Additional flags added to the front of the AStyle flags APPEND_FLAGS Additional flags added to the end of the AStyle flags COMMENT Comment prepended to the build target output WORKING_DIRECTORY Directory in which the AStyle command is run. Defaults to where macro is called. SRC_FILES Source list that AStyle will be ran on AStyle is a Source Code Beautifier for C/C++ code. More information about AStyle can be found `here `__. When ``MODIFY_FILES`` is set to ``TRUE``, modifies the files in place and adds the created build target to the parent `style` build target. Otherwise the files are not modified and the created target is added to the parent ``check`` build target. This target will notify you which files do not conform to your style guide. .. Note:: Setting ``MODIFY_FILES`` to ``FALSE`` is only supported in AStyle v2.05 or greater. .. _blt_add_clangformat_target: blt_add_clangformat_target ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: cmake blt_add_clangformat_target( NAME MODIFY_FILES [TRUE | FALSE (default)] CFG_FILE PREPEND_FLAGS APPEND_FLAGS COMMENT WORKING_DIRECTORY SRC_FILES [FILE1 [FILE2 ...]] ) Creates a new build target for running ClangFormat NAME Name of created build target MODIFY_FILES Modify the files in place. Defaults to FALSE. CFG_FILE Path to ClangFormat config file PREPEND_FLAGS Additional flags added to the front of the ClangFormat flags APPEND_FLAGS Additional flags added to the end of the ClangFormat flags COMMENT Comment prepended to the build target output WORKING_DIRECTORY Directory in which the ClangFormat command is run. Defaults to where macro is called. SRC_FILES Source list that ClangFormat will be ran on ClangFormat is a Source Code Beautifier for C/C++ code. More information about ClangFormat can be found `here `__. When ``MODIFY_FILES`` is set to ``TRUE``, modifies the files in place and adds the created build target to the parent ``style`` build target. Otherwise the files are not modified and the created target is added to the parent `check` build target. This target will notify you which files do not conform to your style guide. .. note:: ClangFormat does not support a command line option for config files. To work around this, we copy the given config file to the given working directory. We recommend using the build directory ``${PROJECT_BINARY_DIR}``. Also if someone is directly including your CMake project in theirs, you may conflict with theirs. We recommend guarding your code checks against this with the following check ``if ("${PROJECT_SOURCE_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}")``. .. note:: ClangFormat does not support a command line option for check ``--dry-run`` until version 10. This version is not widely used or available at this time. To work around this, we use an included script called ``run-clang-format.py`` that does not use ``PREPEND_FLAGS`` or ``APPEND_FLAGS`` in the ``check`` build target because the script does not support command line flags passed to ``clang-format``. This script is not used in the ``style`` build target. .. _blt_add_uncrustify_target: blt_add_uncrustify_target ~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: cmake blt_add_uncrustify_target( NAME MODIFY_FILES [TRUE | FALSE (default)] CFG_FILE PREPEND_FLAGS APPEND_FLAGS COMMENT WORKING_DIRECTORY SRC_FILES [source1 [source2 ...]] ) Creates a new build target for running Uncrustify NAME Name of created build target MODIFY_FILES Modify the files in place. Defaults to FALSE. CFG_FILE Path to Uncrustify config file PREPEND_FLAGS Additional flags added to the front of the Uncrustify flags APPEND_FLAGS Additional flags added to the end of the Uncrustify flags COMMENT Comment prepended to the build target output WORKING_DIRECTORY Directory in which the Uncrustify command is run. Defaults to where macro is called. SRC_FILES Source list that Uncrustify will be ran on Uncrustify is a Source Code Beautifier for C/C++ code. More information about Uncrustify can be found `here `__. When ``MODIFY_FILES`` is set to ``TRUE``, modifies the files in place and adds the created build target to the parent ``style`` build target. Otherwise the files are not modified and the created target is added to the parent ``check`` build target. This target will notify you which files do not conform to your style guide. .. Note:: Setting ``MODIFY_FILES`` to ``FALSE`` is only supported in Uncrustify v0.61 or greater. .. _blt_add_yapf_target: blt_add_yapf_target ~~~~~~~~~~~~~~~~~~~ .. code-block:: cmake blt_add_yapf_target( NAME MODIFY_FILES [TRUE | FALSE (default)] CFG_FILE PREPEND_FLAGS APPEND_FLAGS COMMENT WORKING_DIRECTORY SRC_FILES [source1 [source2 ...]] ) Creates a new build target for running Yapf NAME Name of created build target MODIFY_FILES Modify the files in place. Defaults to FALSE. CFG_FILE Path to Yapf config file PREPEND_FLAGS Additional flags added to the front of the Yapf flags APPEND_FLAGS Additional flags added to the end of the Yapf flags COMMENT Comment prepended to the build target output WORKING_DIRECTORY Directory in which the Yapf command is run. Defaults to where macro is called. SRC_FILES Source list that Yapf will be ran on Yapf is a Source Code Beautifier for Python code. More information about Yapf can be found `here `__. When ``MODIFY_FILES`` is set to ``TRUE``, modifies the files in place and adds the created build target to the parent ``style`` build target. Otherwise the files are not modified and the created target is added to the parent ``check`` build target. This target will notify you which files do not conform to your style guide. .. _blt_add_cmake_format_target: blt_add_cmakeformat_target ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: cmake blt_add_cmakeformat_target( NAME MODIFY_FILES [TRUE | FALSE (default)] CFG_FILE PREPEND_FLAGS APPEND_FLAGS COMMENT WORKING_DIRECTORY SRC_FILES [FILE1 [FILE2 ...]] ) Creates a new build target for running CMakeFormat NAME Name of created build target MODIFY_FILES Modify the files in place. Defaults to FALSE. CFG_FILE Path to CMakeFormat config file PREPEND_FLAGS Additional flags added to the front of the CMakeFormat flags APPEND_FLAGS Additional flags added to the end of the CMakeFormat flags COMMENT Comment prepended to the build target output WORKING_DIRECTORY Directory in which the CMakeFormat command is run. Defaults to where macro is called. SRC_FILES Source list that CMakeFormat will be ran on CMakeFormat is a Source Code Beautifier for CMake code. More information about CMakeFormat can be found `here `__. When ``MODIFY_FILES`` is set to ``TRUE``, modifies the files in place and adds the created build target to the parent ``style`` build target. Otherwise the files are not modified and the created target is added to the parent `check` build target. This target will notify you which files do not conform to your style guide.