---
description: C++ Tooling and Build System
alwaysApply: false
---

# C++ Tooling and Build System

CMake is the standard. Sanitizers are mandatory. Static analysis catches bugs before they ship.

## CMake Essentials

```cmake
cmake_minimum_required(VERSION 3.25)
project(myapp VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

add_library(mylib src/types.cpp src/utils.cpp)
target_include_directories(mylib PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>)

add_executable(myapp src/main.cpp)
target_link_libraries(myapp PRIVATE mylib)
```

```bash
cmake --preset dev && cmake --build --preset dev
ctest --preset dev
```

## Package Management

- **vcpkg**: `vcpkg.json` with dependencies, `find_package()` + `target_link_libraries()`
- **Conan**: `conanfile.txt` with `CMakeDeps`/`CMakeToolchain` generators

## clang-format

```yaml
BasedOnStyle: Google
IndentWidth: 4
ColumnLimit: 100
PointerAlignment: Left
```

```bash
clang-format --dry-run --Werror src/*.cpp  # CI check
```

## clang-tidy

```yaml
Checks: >
    -*, bugprone-*, clang-analyzer-*, cppcoreguidelines-*,
    misc-*, modernize-*, performance-*, readability-*
WarningsAsErrors: '*'
```

```bash
clang-tidy -p build/dev src/*.cpp -- -std=c++20
```

## CI Essentials

```bash
cmake --preset dev && cmake --build --preset dev
ctest --preset dev
clang-format --dry-run --Werror src/*.cpp
clang-tidy -p build/dev src/*.cpp
# Sanitizer builds (ASan+UBSan and TSan separately)
```

## Anti-Patterns

- **Hand-written Makefiles** for complex projects — use CMake with presets
- **Skipping sanitizers in CI** — ASan + UBSan + TSan catch real bugs tests miss
- **`-Wno-*` to suppress warnings** — fix the code, don't silence the compiler
