| :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) |