blob: 0fff427341618a1b04148c165bdfeb020e337320 [file] [log] [blame]
: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)