Back to Zephyr

CMake Style Guidelines

doc/contribute/style/cmake.rst

4.4.03.4 KB
Original Source

:orphan:

.. _cmake-style:

CMake Style Guidelines ######################

General Formatting


  • Indentation: Use 2 spaces for indentation. Avoid tabs to ensure consistency across different environments.

  • Line Length: Limit line length to 100 characters where possible.

  • Empty Lines: Use empty lines to separate logically distinct sections within a CMake file.

  • No Space Before Opening Brackets: Do not add a space between a command and the opening parenthesis. Use if(...) instead of if (...).

    .. code-block:: cmake

    Good:

    if(ENABLE_TESTS) add_subdirectory(tests) endif()

    Bad:

    if (ENABLE_TESTS) add_subdirectory(tests) endif()

Commands and Syntax


  • Lowercase Commands: Always use lowercase CMake commands (e.g., add_executable, find_package). This improves readability and consistency.

    .. code-block:: cmake

    Good:

    add_library(my_lib STATIC src/my_lib.cpp)

    Bad:

    ADD_LIBRARY(my_lib STATIC src/my_lib.cpp)

  • One File Argument per Line: Break the file arguments across multiple lines to make it easier to scan and identify each source file or item.

    .. code-block:: cmake

    Good:

    target_sources(my_target PRIVATE src/file1.cpp src/file2.cpp )

    # Bad:
    

    target_sources(my_target PRIVATE src/file1.cpp src/file2.cpp)

Variable Naming


  • Use Uppercase for Cache Variables or variables shared across CMake files: When defining cache variables using option or set(... CACHE ...), use UPPERCASE names.

    .. code-block:: cmake

    option(ENABLE_TESTS "Enable test suite" ON) set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard version")

  • Use Lowercase for Local Variables: For local variables within CMake files, use lowercase or snake_case.

    .. code-block:: cmake

    set(output_dir "${CMAKE_BINARY_DIR}/output")

  • Consistent Prefixing: Use consistent prefixes for variables to avoid name conflicts, especially in large projects.

    .. code-block:: cmake

    set(MYPROJECT_SRC_DIR "${CMAKE_SOURCE_DIR}/src")

Quoting


  • Quote Strings and Variables: Always quote string literals and variables to prevent unintended behavior, especially when dealing with paths or arguments that may contain spaces.

    .. code-block:: cmake

    Good:

    set(my_path "${CMAKE_SOURCE_DIR}/include")

    Bad:

    set(my_path ${CMAKE_SOURCE_DIR}/include)

  • Do Not Quote Boolean Values: For boolean values (ON, OFF, TRUE, FALSE), avoid quoting them.

    .. code-block:: cmake

    option(BUILD_SHARED_LIBS "Build shared libraries" OFF)

Avoid Hardcoding Paths


  • Use CMake variables (CMAKE_SOURCE_DIR, CMAKE_BINARY_DIR, CMAKE_CURRENT_SOURCE_DIR) instead of hardcoding paths.

    .. code-block:: cmake

    set(output_dir "${CMAKE_BINARY_DIR}/bin")

Conditional Logic


  • Use if, elseif, and else with proper indentation, and close with endif().

    .. code-block:: cmake

    if(ENABLE_TESTS) add_subdirectory(tests) endif()

Documentation


  • Use comments to document complex logic in the CMake files.

    .. code-block:: cmake

    Find LlvmLld components required for building with llvm

    find_package(LlvmLld 14.0.0 REQUIRED)