CMake and Conan policy
Workflow-level policy for how superbuild workspaces describe builds and manage dependencies. This document is conceptual — product repos implement specifics in their root CMakeLists.txt, conanfile.py, and presets.
CMake is the authoritative build description
- Single language of build truth — targets, dependencies between targets, install rules, and toolchain settings are expressed in CMake
- Superbuild root coordinates subprojects (under
src/,libs/, or fetched dependencies) viaadd_subdirectory,ExternalProject, or equivalent established pattern in that workspace - No parallel build systems for core artifacts — do not introduce Visual Studio
.vcxproj, ad-hoc Makefiles, or bespoke scripts that replace CMake for standard configure/build/test - Generators and platforms are selected through CMake presets and toolchain files, not one-off developer machine settings
Agents should modify or extend CMakeLists when changing how software is built, not bypass CMake.
Conan is the dependency and bootstrap layer
Conan provides:
- Dependency resolution for third-party libraries where packages exist
- Toolchain and profile generation (compiler, C++ standard, flags)
- Environment setup for consistent developer and CI machines
Conan does not replace the superbuild's CMake structure. It feeds CMake (e.g. via CMakeToolchain, CMakeDeps) so that find_package and target linking work uniformly.
Division of responsibility
| Concern | Owner |
|---|---|
| What targets exist and how they link | CMake |
| Where third-party binaries come from | Conan (preferred) or libs/ (exception) |
| Cross-platform configure commands | CMake Presets + documented Conan install step |
| One-off developer PATH hacks | Discouraged — encode in Conan/CMake |
CMake Presets
Presets are the standard interface for configure, build, and test across Windows, Linux, and macOS.
Policy expectations:
- Checked-in
CMakePresets.json(andCMakeUserPresets.jsonlocally if needed) - Named presets reflect intent (
dev-debug,ci-release, platform variants) — exact names are consumer-defined but must be documented - CI and local developers use the same preset names where possible
- Out-of-tree builds only — build directory separate from source (e.g.
build/)
Agents should prefer cmake --preset <name> over manual cache flags unless fixing preset definitions themselves.
Cross-platform consistency
Goals:
- Same high-level flow on all platforms: Conan install → CMake preset configure → build
- Platform differences isolated to profiles, toolchain files, generators, and documented options
- No silent Linux-only or Windows-only steps without mention in consumer
AGENTS.md
When proposing build changes, verify impact on all targeted platforms or explicitly document platform scope.
Windows generator policy
Linux and macOS use Ninja (single-config). Windows supports two first-class CMake generators:
| Generator | Config | Primary use on Windows |
|---|---|---|
| Ninja | Single-config | Fast CLI builds; parity with Linux/macOS command shape |
| Visual Studio | Multi-config | Interactive debugging in VS; installer / release builds via MSBuild |
Both are driven by the same CMake target graph and checked-in presets. MSBuild runs CMake-generated project files — not hand-maintained .vcxproj.
Consumers must document in root AGENTS.md:
- Preset names for each generator (separate
binaryDirper preset) - Which CI job gates merge vs installer/release (VS generator Release typically gates installers)
- Standard
--configusage for VS generator builds
Full detail: conan-cmake-rollout.md.
Relationship to libs/
When a dependency cannot use Conan (yet):
- Build it from
libs/with CMake integrated into the superbuild - Document why Conan is not used
- Plan Conan migration if applicable
Do not duplicate a Conan-available library in libs/ without documented exception.
What agents should not do
- Add non-CMake build entry points for core libraries
- Hardcode absolute paths to dependencies
- Skip Conan when the workspace standard is Conan + CMake toolchain
- Change generator or compiler without updating presets/profiles and docs
Consumer implementation
Each superbuild repo implements this policy in its own files. Shared workflow docs here do not contain product target names or version pins. For layout, see repository-layout.md. For multi-repo coordination, see superbuild-philosophy.md.
Related documents
- superbuild-philosophy.md — orchestration model
- workflow.md — proposing changes to this policy