docs(readme): document build system, prerequisites, and harness

Replace the single cmake invocation with per-platform build scripts,
prerequisite packages for Debian/Ubuntu and Arch/CachyOS, macOS and
Windows cross-compilation instructions, artifact path tables, and the
independent QA harness workflow.
This commit is contained in:
2026-09-09 13:25:24 +02:00
parent 05fd6440bd
commit 42d2302c28
+159 -22
View File
@@ -68,36 +68,173 @@ macro assignments and LFO shape data.
## Building ## Building
Requirements: CMake ≥ 3.22, a C++17 compiler, and the Linux dev libraries Each script configures and builds its own directory. Production builds disable the
(`libasound2-dev`, `libjack-dev`, `libfreetype-dev`, `libcurl`, X11, OpenGL). QA harness explicitly; the harness script creates no plugin or standalone targets.
JUCE 7.0.12 is vendored under `third_party/JUCE`. JUCE 7.0.12 is vendored under `third_party/JUCE` and is not downloaded by the scripts.
### Prerequisites
All scripts require Bash, CMake 3.22+, Ninja, and C/C++17 compilers. The harness
also uses CTest, included with CMake, when invoked with `--run`.
On Linux, install GCC or Clang, `pkg-config`, and the ALSA, FreeType, X11 and OpenGL
development libraries. For Debian/Ubuntu:
```bash ```bash
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release sudo apt update
cmake --build build sudo apt install build-essential cmake ninja-build pkg-config \
libasound2-dev libfreetype6-dev libx11-dev libxcomposite-dev \
libxcursor-dev libxext-dev libxinerama-dev libxrandr-dev libxrender-dev \
libgl1-mesa-dev
``` ```
Outputs: For Arch/CachyOS:
- `build/SerumAlt_artefacts/Release/VST3/SerumAlt.vst3` — VST3
- `build/SerumAlt_artefacts/Release/Standalone/SerumAlt` — standalone app
- (on macOS, the `AU` target is produced automatically)
Cross-compilation for Windows/macOS is handled by JUCE: configure with the relevant
toolchain and add `-DCMAKE_TOOLCHAIN_FILE=...` as usual.
## Headless QA harness
A console app drives the processor through every factory preset, plays a chord,
verifies finite (non-NaN) output and non-silence, and exercises the RAVE toggle.
Build and run with:
```bash ```bash
cmake --build build --target SerumAltTest sudo pacman -S --needed base-devel cmake ninja pkgconf alsa-lib freetype2 \
./build/SerumAltTest_artefacts/Release/SerumAltTest libx11 libxcomposite libxcursor libxext libxinerama libxrandr libxrender libglvnd
``` ```
(Disable it with `-DSERUMALT_BUILD_TESTS=OFF`.) JACK is disabled by JUCE's default `JUCE_JACK=0`. Curl and the web browser are
explicitly disabled in both project targets. Their development packages are not
required for these builds, even though JUCE probes for them during configuration.
See `third_party/JUCE/docs/Linux Dependencies.md` if enabling additional JUCE modules.
On macOS, install Apple's Command Line Tools with `xcode-select --install`, or
select an installed Xcode toolchain. Install CMake and Ninja, for example with
`brew install cmake ninja` if Homebrew is already installed. The macOS script checks
that `xcrun` can locate the macOS SDK. It must run on a Mac; JUCE does not provide
an Apple cross-compilation toolchain for Linux.
For Windows cross-compilation, also install MinGW-w64 on the Linux host:
```bash
sudo apt install gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 binutils-mingw-w64-x86-64
```
On Arch/CachyOS, use `sudo pacman -S --needed mingw-w64-gcc` instead. Keep the
native Linux tools and libraries installed: JUCE builds `juceaide` for the host
before compiling the Windows plugin. The checked-in `mingw64-toolchain.cmake`
selects the `x86_64-w64-mingw32-*` tools and isolates target library searches.
### Production builds
| Host | Command | Build directory | Formats |
| --- | --- | --- | --- |
| Linux | `./build_linux.sh` | `build_linux/` | VST3, Standalone |
| macOS | `./build_macos.sh` | `build_macos/` | VST3, AU, Standalone |
| Linux targeting Windows x64 | `./build_windows.sh` | `build_windows/` | VST3 only |
Default Release artifacts:
- Linux: `build_linux/SerumAlt_artefacts/Release/VST3/SerumAlt.vst3` and
`build_linux/SerumAlt_artefacts/Release/Standalone/SerumAlt`.
- macOS: `build_macos/SerumAlt_artefacts/Release/VST3/SerumAlt.vst3`,
`build_macos/SerumAlt_artefacts/Release/AU/SerumAlt.component`, and
`build_macos/SerumAlt_artefacts/Release/Standalone/SerumAlt.app`.
- Windows: `build_windows/SerumAlt_artefacts/Release/VST3/SerumAlt.vst3`, also
copied to `SerumAlt_Windows/SerumAlt.vst3`.
The Windows script reuses the toolchain file without rewriting it. It injects
`moduleinfo.json` because the cross-compiled JUCE manifest helper cannot run on
Linux. Keep this manifest's metadata in sync with `CMakeLists.txt`,
`cmake/Plugin.cmake`, and the vendored VST3 SDK. MinGW links its C++ and threading
runtimes statically via `-static-libgcc -static-libstdc++ -static`.
macOS builds target the host architecture by default. To request a universal binary:
```bash
CMAKE_OSX_ARCHITECTURES='arm64;x86_64' ./build_macos.sh
```
`CMAKE_OSX_DEPLOYMENT_TARGET` can also be passed to that script. Architecture and
SDK settings persist in CMake's cache. Use a separate build directory when changing
toolchains. These scripts build local artifacts, not signed or notarized releases,
and do not install plugins into a DAW's plugin directories.
### Independent QA harness
On Linux or macOS, build the console harness without production targets:
```bash
./build_harness.sh
```
Build and run the checks:
```bash
./build_harness.sh --run
```
Or rerun an already-built Release harness:
```bash
ctest --test-dir build_harness --build-config Release --output-on-failure --no-tests=error
```
The executable is `build_harness/SerumAltTest_artefacts/Release/SerumAltTest`.
It renders the initial state and every factory preset, checks for non-finite
samples and aggregate non-silence, and exercises the RAVE toggle. A failed check
returns a nonzero exit status. This is a processor integration smoke test, not a
complete DSP, GUI, or real-time safety test suite.
The harness does not open an editor or audio device, but it still compiles the real
processor, editor and JUCE GUI dependencies. Its separate build directory and
CMake options isolate its outputs from production bundles; it is not a DSP-only
library. It is built and run natively, not as a Windows cross-compiled executable.
### Build options and layout
- `BUILD_TYPE` defaults to `Release`; set it to `Debug` for a debug build.
- `BUILD_DIR` overrides a script's build directory. Relative paths are resolved
from the repository root, even when the script is invoked elsewhere.
- `CMAKE_BUILD_PARALLEL_LEVEL` defaults to `2` to limit memory use, including JUCE's
configure-time helper build. Increase it if memory permits.
- Windows-only `OUTPUT_DIR` overrides the staging directory.
For example:
```bash
BUILD_TYPE=Debug BUILD_DIR=build_harness_debug ./build_harness.sh --run
CMAKE_BUILD_PARALLEL_LEVEL=4 ./build_linux.sh
```
`CMakeLists.txt` owns the shared source list and target configuration.
`cmake/Plugin.cmake` owns production formats and platform-specific linking.
`cmake/Harness.cmake` owns the test executable and its CTest registration.
For direct CMake use, `SERUMALT_BUILD_PLUGIN` defaults to `ON` and
`SERUMALT_BUILD_TESTS` defaults to `OFF`. A harness-only configure is:
```bash
cmake -S . -B build_harness -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DSERUMALT_BUILD_PLUGIN=OFF -DSERUMALT_BUILD_TESTS=ON
cmake --build build_harness --target SerumAltTest
```
An existing CMake cache retains its old option values; changing the defaults does
not turn tests off in an old `build/` directory. Use the scripts to set the flags
explicitly. An alternate JUCE checkout can be selected with `-DJUCE_ROOT=/path/to/JUCE`
when configuring directly with CMake.
### Fresh builds
The scripts reuse their build directories without deleting files, resetting Git,
or installing packages. Generated `build/`, `build_*/`, and `SerumAlt_Windows/`
directories are git-ignored. Leave existing builds intact and select an unused
build directory for a fresh configure:
```bash
BUILD_DIR=build_linux_fresh ./build_linux.sh
```
Windows staging updates generated files without deleting extra files already in
the destination. For a clean distribution bundle, choose unused build and output
paths together:
```bash
BUILD_DIR=build_windows_fresh OUTPUT_DIR=build_windows_fresh/staged ./build_windows.sh
```
## License ## License