Contributing to chesscxx¶
Thank you for considering contributing to chesscxx
!
This document describes how to set up a development environment and use the available developer tools.
Developer mode¶
Build system targets that are only useful for developers of this project are
hidden if the chesscxx_DEVELOPER_MODE
option is disabled. Enabling this
option makes tests and other developer targets and options available. Not
enabling this option means that you are a consumer of this project and thus you
have no need for these targets and options.
Prerequisites¶
To set up a development environment for chesscxx
, you’ll need:
C++23 compatible compiler (See the docs → for a list of supported compilers)
CMake 3.28+ and a compatible generator (e.g., Ninja, Make, or Visual Studio)
clang-tidy (for IWYU & static analysis checks)
clang-format (for code formatting)
cppcheck (for additional static analysis)
codespell (for spell checking)
Doxygen (for generating documentation) Extra packages:
sphinx
,breathe
,furo
,sphinx-inline-tabs
,myst-parser
gcovr (for coverage reports)
GTest, yaml-cpp, magic-enum (for tests)
You can install most of these tools via your system package manager or using pip
for Python-based tools.
Docker¶
If you prefer, you can use Docker instead of installing all dependencies manually.
A Dockerfile
is provided at the project root that contains all required tools and libraries for building, testing, and running all targets of chesscxx
.
First, install Docker, then build the image:
docker build -t chesscxx .
To start an interactive container with the project mounted:
docker run --rm -it -v $(pwd):/chesscxx -w /chesscxx chesscxx
From inside the container, you can run all the usual commands (e.g., cmake --preset=dev
, cmake --build --preset=dev
, ctest --preset=dev
).
Alternatively, instead of entering the container, you can run each command directly from your host system:
docker run --rm -v $(pwd):/chesscxx -w /chesscxx chesscxx <command>
# Examples:
docker run --rm -v $(pwd):/chesscxx -w /chesscxx chesscxx cmake --preset=dev
docker run --rm -v $(pwd):/chesscxx -w /chesscxx chesscxx cmake --build --preset=dev
docker run --rm -v $(pwd):/chesscxx -w /chesscxx chesscxx ctest --preset=dev
Presets¶
This project makes use of presets to simplify the process of configuring the project.
You have a few options to pass chesscxx_DEVELOPER_MODE
to the configure
command, but this project prefers to use presets.
As a developer, you should create a CMakeUserPresets.json
file at the root of
the project:
{
"version": 2,
"cmakeMinimumRequired": {
"major": 3,
"minor": 28,
"patch": 0
},
"configurePresets": [
{
"name": "dev",
"binaryDir": "${sourceDir}/build/dev",
"inherits": ["dev-mode", "ci-ubuntu"],
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
}
}
],
"buildPresets": [
{
"name": "dev",
"configurePreset": "dev",
"configuration": "Debug"
}
],
"testPresets": [
{
"name": "dev",
"configurePreset": "dev",
"configuration": "Debug",
"output": {
"outputOnFailure": true
}
}
]
}
CMakeUserPresets.json
is also the perfect place in which you can put all
sorts of things that you would otherwise want to pass to the configure command
in the terminal.
Configure, build and test¶
If you followed the above instructions, then you can configure, build and test the project respectively with the following commands from the project root:
cmake --preset=dev
cmake --build --preset=dev
ctest --preset=dev
Developer mode targets¶
These are targets you may invoke using the build command from above, with an
additional -t <target>
flag:
iwyu-check
and iwyu-fix
¶
These targets run clang-tidy
with the misc-include-cleaner check
on the header files to check IWYU errors and to fix them, respectively.
Customization is available using the IWYU_PATTERNS
and IWYU_COMMAND
cache variables.
format-check
and format-fix
¶
These targets run the clang-format
tool on the codebase to check formatting errors and to
fix them, respectively. Customization is available using the FORMAT_PATTERNS
and
FORMAT_COMMAND
cache variables.
spell-check
and spell-fix
¶
These targets run the codespell
tool on the codebase to check spelling errors and to fix
them, respectively. Customization is available using the SPELL_COMMAND
cache
variable.
run-examples
and run_<name>
¶
Available if BUILD_EXAMPLES
is enabled. Runs all the examples created by the add_example
command,
or runs a single example.
docs
¶
Builds the documentation using Doxygen + Breathe + Sphinx. The output will
go to <binary-dir>/docs
. Customization is available using the DOXYGEN_COMMAND
and SPHINX_COMMAND
cache variables.
Since the documentation uses the examples’ outputs, you need to run the run-examples
target before building the documentation.
coverage
¶
This target processes the output of the previously run tests and generates a coverage
report at <build_dir>/coverage/index.html
using the gcovr
tool. It requires the project
to be built using the coverage flags, which can be done by using the ci-coverage
preset.
Customization is available using the chesscxx_COVERAGE_COMMAND
cache variable.