Minimal C++ project template for the VertexNova ecosystem
Minimal VertexNova-standard C++ template: CMake, deps (external + internal), tests, examples, and documentation. Use it as a starting point for new libraries or apps in the VertexNova stack.
| Path | Description |
|---|---|
cmake/vnecmake/ |
CMake modules submodule (ProjectSetup, ProjectWarnings, VneUseDep) |
configs/ |
Configured headers (e.g. config.h.in) |
deps/external/ |
Third-party deps (e.g. googletest) |
deps/internal/ |
VertexNova internal libs (vnecommon, vnelogging) |
include/ |
Public API headers (vertexnova/template/) |
src/ |
Implementation |
tests/ |
Unit tests (Google Test) |
docs/ |
Doxygen input (doxyfile.in) and extra docs |
scripts/ |
Helper scripts (build, format, generate-docs) |
- CMake 3.19 or newer
- C++20 compiler (e.g. GCC 10+, Clang 10+, MSVC 2019+)
- Doxygen (optional, for
scripts/generate-docs.shand-DENABLE_DOXYGEN=ON)
- External: Tests use Google Test. Either add
deps/external/googletestas a submodule (recommended tag:v1.17.0) or let CMake use FetchContent when the directory is missing. - Internal: vnecmake (required) is the CMake modules submodule at
cmake/vnecmake. Optional librariesvnecommonandvnelogginggo underdeps/internal/. See deps/README.md. If they are missing, the template still builds but does not link tovne::commonorvne::logging.
From the project root:
git submodule update --init --recursive(Add submodules first if your repo uses them; see deps/README.md.)
Builds use build/static or build/shared (one library type per directory). From the project root:
# Shared library (default)
cmake -B build/shared -DCMAKE_BUILD_TYPE=Debug -DVNE_TEMPLATE_TESTS=ON
cmake --build build/shared
# Static library
cmake -B build/static -DCMAKE_BUILD_TYPE=Debug -DVNE_TEMPLATE_LIB_TYPE=static -DVNE_TEMPLATE_TESTS=ON
cmake --build build/staticOr use the platform scripts (they use build/<lib_type>/...):
# macOS (default: shared)
./scripts/build_macos.sh -t Debug -a configure_and_build
./scripts/build_macos.sh -l static -t Release -a configure_and_build # static in build/static/...
# Linux
./scripts/build_linux.sh -t Debug -a configure_and_build
./scripts/build_linux.sh -l static -c clang -a test
# Windows
.\scripts\build_windows.ps1 -BuildType Debug -Action configure_and_build
.\scripts\build_windows.ps1 -LibType static -BuildType Release -Action configure_and_build # static in build/static/...Options: -t / -BuildType build type, -a / -Action action, -l / -LibType lib type (static | shared, default shared), -clean / -Clean, -j N / -Jobs N. macOS script also supports -xcode for Xcode project.
ctest -C Debug --test-dir build/shared
# or for static: ctest -C Debug --test-dir build/staticOr:
./scripts/build_macos.sh -a test-
Template overview and diagrams: docs/vertexnova/template/template.md — context and API diagrams (Draw.io sources in
docs/vertexnova/template/diagrams/). -
API docs: Configure with Doxygen enabled and build the doc target:
cmake -B build/shared -DENABLE_DOXYGEN=ON cmake --build build/shared --target vnetemplate_doc_doxygen
Output:
build/shared/docs/html/index.html. -
Script: From project root:
./scripts/generate-docs.sh
Use
--api-onlyto only generate API docs, or--validateto only check links and coverage. See./scripts/generate-docs.sh --help.
- clang-format: Config in .clang-format. Format in place or check only (CI):
./scripts/format.sh # format sources ./scripts/format.sh -check # check only (used in CI)
- clang-tidy: Config in .clang-tidy. Generate
compile_commands.json(e.g.cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -B build/shared), then runclang-tidy -p build/shared.
GitHub Actions runs on push and pull requests to main: format check, clang-tidy, and build/test on Linux (GCC, Clang), macOS, and Windows. See .github/workflows/ci.yml.
See CONTRIBUTING.md for build, test, and style. We follow the Contributor Covenant Code of Conduct.
Releases are manual. The VERSION file at the repo root is the source of truth; CMake reads it at configure time and exposes it as get_version().
To cut a release: update VERSION, add a dated entry to CHANGELOG.md, commit, create and push a tag (e.g. git tag v1.0.0 && git push origin v1.0.0), then create a GitHub Release from that tag and paste the CHANGELOG section.
See LICENSE.