188 lines
9 KiB
Markdown
188 lines
9 KiB
Markdown
# Building xtc with CMake
|
|
|
|
The root `CMakeLists.txt` is the authoritative build. C99 engine/model/DSP and
|
|
public C APIs remain in `include/xtc` and `src`; C++17 is used for the optional
|
|
FLTK interface and SDK examples. The small root Makefile only forwards common
|
|
commands to CMake/CTest; it contains no source lists or compilation rules.
|
|
Direct CMake builds need no Make wrapper. CMake does not download SDKs or
|
|
install system dependencies.
|
|
|
|
## Configure, build and test
|
|
|
|
Requirements: CMake 3.25+, a C99 compiler, Python 3.12+ for build/test/release
|
|
tools, a POSIX toolchain with threads, math and dynamic loading, and a CMake
|
|
backend such as Ninja or Unix Makefiles. C++17 is required when GUI/SDK targets
|
|
are enabled. `pkg-config` discovers optional JACK; FLTK discovery tries
|
|
`pkg-config` then `fltk-config`. LADSPA uses its installed development header.
|
|
Missing optional development files do not prevent the core from building.
|
|
|
|
From the source root:
|
|
|
|
```sh
|
|
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
|
|
cmake --build build --parallel
|
|
ctest --test-dir build --output-on-failure
|
|
./build/xtc-check
|
|
./build/xtc # when FLTK was found
|
|
```
|
|
|
|
All binaries and the static `libxtc.a` are in the chosen binary directory.
|
|
The default build includes offline test binaries and plugin fixtures. CTest
|
|
runs offline, fault-injection, plugin, recovery, capacity/endurance, and available
|
|
GUI tests; live JACK tests require explicit opt-in. GUI tests use Xvfb and
|
|
startup checks also require xdotool. No physical ports are connected by tests.
|
|
CTest runs source-relative fixtures with an explicit working directory.
|
|
Assertions stay enabled in optimized test builds.
|
|
|
|
Use a new build directory when changing compiler, generator or instrumentation.
|
|
For Ninja, add `-G Ninja` to the configure command. CMake also writes
|
|
`compile_commands.json` for editors and analysis tools. In CLion, open the root
|
|
project and select a CMake profile/preset; do not import a Makefile project.
|
|
|
|
Optional presets separate configurations:
|
|
|
|
```sh
|
|
cmake --preset debug
|
|
cmake --build --preset debug --parallel
|
|
ctest --preset debug
|
|
```
|
|
|
|
`release`, `minimal` and `sanitize` presets follow the same three commands.
|
|
Release enables optimized builds and source/binary prefix maps. Minimal disables
|
|
FLTK, JACK and LADSPA. Sanitize selects Clang ASan/UBSan for offline C tests;
|
|
it does not enable GUI or physical-device tests. Existing GUI sanitizer caveats
|
|
and fontconfig leak suppressions are described in
|
|
[the integration notes](../tests/integration/README.md).
|
|
|
|
## Quick Make shortcuts
|
|
|
|
With GNU Make installed, `make` (or `make build`) configures and builds;
|
|
`make test`/`make check` also runs CTest. `make gui` builds the FLTK app,
|
|
`make run` builds and launches it, and `make clean` cleans products while keeping
|
|
the cache. `make configure` only configures, and `make help` lists shortcuts.
|
|
|
|
Defaults are `BUILD_DIR=build`, `BUILD_TYPE=Debug` and `JOBS=4`. For example:
|
|
|
|
```sh
|
|
make BUILD_DIR=build/release BUILD_TYPE=Release JOBS=8
|
|
make BUILD_DIR=build/minimal CMAKE_ARGS='-G Ninja -DXTC_BUILD_GUI=OFF -DXTC_WITH_JACK=OFF'
|
|
make test CTEST_ARGS='-R ^core$'
|
|
```
|
|
|
|
Use a fresh binary directory when changing generator/compiler. Extra configure
|
|
flags go in `CMAKE_ARGS`; extra CTest flags go in `CTEST_ARGS`. These shortcuts
|
|
use the same CMake targets and cache as the direct commands above. Keep source
|
|
lists, dependencies, SDK and packaging rules in CMake.
|
|
|
|
## Configuration
|
|
|
|
| Cache option | Default | Meaning |
|
|
| --- | --- | --- |
|
|
| `BUILD_TESTING` | `ON` | Build/register the test suite |
|
|
| `XTC_BUILD_GUI` | `ON` | Discover FLTK and build the application when available |
|
|
| `XTC_WITH_JACK` | `ON` | Discover/build the JACK/PipeWire backend |
|
|
| `XTC_WITH_LADSPA` | `ON` | Enable LADSPA when the system header exists |
|
|
| `XTC_ENABLE_LIVE_TESTS` | `OFF` | Register software JACK loopback and GUI/JACK workflows |
|
|
| `XTC_SANITIZE` | `OFF` | Address/undefined sanitizers, frame pointers |
|
|
| `XTC_REPRODUCIBLE` | `OFF` | Remove source/binary directory paths and debug information |
|
|
| `XTC_BUILD_JUCE` | `OFF` | Build externally supplied JUCE integration |
|
|
| `XTC_BUILD_STEINBERG` | `OFF` | Build externally supplied official VST3 SDK examples |
|
|
|
|
Use `-DNAME=VALUE` during configuration, not Make variables. Standard CMake
|
|
settings include `CMAKE_C_COMPILER`, `CMAKE_CXX_COMPILER`, `CMAKE_BUILD_TYPE`,
|
|
`CMAKE_C_FLAGS`, `CMAKE_CXX_FLAGS` and `CMAKE_EXE_LINKER_FLAGS`. CMake propagates
|
|
includes, definitions and link dependencies through targets. Core users can link
|
|
`xtc::core` inside this build; installed consumers use `pkg-config xtc`.
|
|
|
|
A fully offline minimal configuration:
|
|
|
|
```sh
|
|
cmake -S . -B build/minimal -G Ninja -DCMAKE_BUILD_TYPE=Release \
|
|
-DXTC_BUILD_GUI=OFF -DXTC_WITH_JACK=OFF -DXTC_WITH_LADSPA=OFF
|
|
cmake --build build/minimal --parallel
|
|
ctest --test-dir build/minimal --output-on-failure
|
|
```
|
|
|
|
This path needs no C++ compiler, FLTK, JACK or LADSPA development files. CLAP and
|
|
VST3 C headers stay pinned in `third_party`; VST2 uses original declarations.
|
|
No external plugin or SDK is included in normal packages. See [LICENSES.md](LICENSES.md).
|
|
|
|
## Focused tests and tools
|
|
|
|
Build before invoking CTest, or use `check`, which builds the test dependencies:
|
|
|
|
```sh
|
|
cmake --build build --target check --parallel
|
|
ctest --test-dir build --output-on-failure -R '^(core|realtime|modern-plugins)$'
|
|
ctest --test-dir build --output-on-failure -L gui
|
|
cmake --build build --target test-reliability test-recording test-scale test-soak
|
|
cmake --build build --target analyze
|
|
cmake --build build --target quality-preview builtin-preview
|
|
```
|
|
|
|
Each registered root test also has a `test-NAME` build target (for example
|
|
`test-core`, `test-gui`, `test-track-fx`). `test-builtins` aliases `test-builtin`.
|
|
`gui` builds the optional main application. Preview targets write WAVs below the
|
|
binary directory without playback. Screenshot commands are in
|
|
[the gallery](../screenshots/README.md). These commands assume configuration
|
|
has already completed; feature-specific docs use the same convention.
|
|
|
|
To qualify live software routing against an **existing** JACK-compatible server:
|
|
|
|
```sh
|
|
cmake -S . -B build -DXTC_ENABLE_LIVE_TESTS=ON
|
|
cmake --build build --parallel
|
|
ctest --test-dir build --output-on-failure -L live
|
|
./build/test_jack 30 # optional longer software loopback run
|
|
```
|
|
|
|
Live tests are serialized. They neither start/reconfigure the server nor
|
|
establish physical-device acceptance. See [AUDIO_ENGINE.md](AUDIO_ENGINE.md).
|
|
|
|
Developer targets include `benchmark`, `benchmark-compare`, `benchmark-project`,
|
|
`benchmark-project-compare`, `test-stress`, `test-stress-plugins`,
|
|
`test-plugins-real` and `check-development`. The latter combines the normal
|
|
suite, Clang static analysis and a separate sanitizer build. `debug`, `release`
|
|
and `test-sanitize` convenience targets configure/build/test child directories;
|
|
prefer presets when selecting the directory explicitly. Benchmark/stress cache
|
|
variables are `XTC_BENCHMARK_BLOCKS`, `XTC_BENCHMARK_MAX_REGRESSION`,
|
|
`XTC_BENCHMARK_BASELINE`, `XTC_PROJECT_BENCHMARK_BASELINE` and `XTC_STRESS_ROUNDS`.
|
|
Run benchmarks without concurrent testing/instrumentation for meaningful timing.
|
|
|
|
For ThreadSanitizer, use a separate configuration with
|
|
`-DCMAKE_C_FLAGS='-g -O1 -fsanitize=thread'` and
|
|
`-DCMAKE_EXE_LINKER_FLAGS=-fsanitize=thread`, build `test_realtime`/`test_audio`,
|
|
and run those binaries. Tool/runtime support depends on the host.
|
|
|
|
## SDKs, installation and release
|
|
|
|
See [JUCE.md](JUCE.md) and [STEINBERG.md](STEINBERG.md) for optional SDK
|
|
configuration, licenses and qualification limits. Both now build within the root
|
|
CMake project; the JUCE bridge links the same PIC C core target.
|
|
|
|
```sh
|
|
cmake -S . -B build/release -DCMAKE_BUILD_TYPE=Release -DXTC_REPRODUCIBLE=ON \
|
|
-DCMAKE_INSTALL_PREFIX=/usr
|
|
cmake --build build/release --parallel
|
|
ctest --test-dir build/release --output-on-failure
|
|
DESTDIR="$PWD/build/stage" cmake --install build/release --prefix /usr
|
|
DESTDIR="$PWD/build/stage" cmake --build build/release --target uninstall
|
|
```
|
|
|
|
For uninstall, configure with `-DCMAKE_INSTALL_PREFIX=/usr` first when that is
|
|
the desired permanent prefix, or invoke the generated `xtc-install.cmake` with
|
|
`-DCMAKE_INSTALL_PREFIX=/usr -DXTC_UNINSTALL=ON -P` explicitly. The `--prefix`
|
|
install override does not persist in CMake's cache. Prefer setting the prefix at
|
|
configure time for a matching install/uninstall pair. Standard `DESTDIR` staging
|
|
never enters installed metadata. The audited Python installer retains exact
|
|
owned-file inventory, atomic file replacement and symlink protection.
|
|
|
|
`test-install` and `test-install-layout` stage into temporary directories and
|
|
compile installed C/C++ consumers. `dist` exports indexed files; `test-release`
|
|
rebuilds two exports; `package-binary` (also aliased as `package`) and `test-package` stage and verify a local
|
|
Linux archive. See [RELEASING.md](RELEASING.md) for layout/manifest details.
|
|
|
|
Clean products with `cmake --build build --target clean`; to discard the cache,
|
|
remove only the selected build directory. Never configure in the source tree.
|
|
Historical validation entries in ROADMAP describe the build used at that time;
|
|
Phase 108 records the CMake migration and its verified results.
|