Version 1.0.0
Initial public release of StormByte-BuildMaster: a CMake DSL to configure, build, install and consume external CMake and Meson projects as first-class parts of a parent tree, with stage-based orchestration, explicit targets, coherent environment propagation, portable static-library bundling, and controlled failure propagation across the dependency graph.
Added
Core orchestration
- Parent-configure generation of configure / build / install stage scripts for external projects
- Explicit stage targets:
<component>_configure,<component>_build,<component>_install <component>_builddepends on<component>_configure- Shared install prefix (
BUILDMASTER_INSTALL_DIR) and generated script tree across the whole dependency graph - Safe recursive nesting via
BUILDMASTER_CONFIGURED(single initialization, no prefix fights) - IMPORTED targets (static and shared, including MSVC import libraries and DLLs) wired to install stages
- INTERFACE libraries also depend on
<component>_installso parenttarget_link_librarieswaits for a successful install - Simple API:
create_cmake_component,create_meson_component - Dependant variants:
create_cmake_dependant_component,create_meson_dependant_component - Advanced/explicit API:
create_cmake_stages,create_meson_stages - Project version exposed as
BUILDMASTER_VERSIONand shown in the bootstrap status line
Fail-fast and failure propagation
- Optional
BUILDMASTER_FAIL_FAST(env or-D; truthy:1/ON/TRUE/YES; default OFF) - On stage failure with fail-fast ON: write
markers/buildmaster.failedandmarkers/<component_id>.failed - Later stages print
Skipped <component title>and exit non-zero when the global marker exists - Env runners refuse further work if the global fail marker is present (
Skipped due to previous errors) - Unique
buildmaster_build_inittarget resets the markers directory at the start of every parent build (Ninja, Make,cmake --build) - Markers directory under
${BUILDMASTER_BINDIR}/markers/(no persistent success stamps) - Fail-fast OFF writes no markers so independent components can keep building (cache warming with ccache/sccache)
- Stage exec scripts (
configure_exec/build_exec/install_execfor CMake;setup_exec/compile_exec/install_execfor Meson) centralize exit-code handling and marker writes
Environment and toolchain
- Platform env runners (Linux/macOS shell, Windows batch) with silent variants
- Propagation of compilers, flags,
PATH,PKG_CONFIG_PATH,LIB,INCLUDE - Compiler-cache support (
CMAKE_*_COMPILER_LAUNCHER,CCACHE_DIR,SCCACHE_DIR) into child CMake and Meson builds - Optional full live output (
BUILDMASTER_DEBUG) and verbose compile-only output (BUILDMASTER_VERBOSE) - Failure diagnostics: silent runners dump captured logs on non-zero exit
CMake and Meson backends
- Nested CMake configures with Ninja, toolchain file, PIC, LTO and launcher injection
- Nested Meson setup/compile/install with matching environment and library type control
- Parallel builds via
NPROC/CMAKE_BUILD_PARALLEL_LEVEL - Stage targets depend on
buildmaster_build_initwhen available
File helpers
- Cache-aware downloads (
file_download_cached) with hash verification and retries - Force downloads (
file_download) with progressive backoff - Flexible
EXPECTED_HASH(ALGORITHM=digest, including forms such asSHA3_256=…; bare digest defaults to SHA256) - Portable archive extraction (
file_decompress) viafile(ARCHIVE_EXTRACT) - Strict path-traversal protection and consistent status messages
Git helpers
- Generated fragments for fetch, reset/clean, patch apply and branch switch
- API binds each operation to a component id (same id as
create_*_component):create_git_reset_file(out, component_id, title, repo)create_git_patch_file(out, component_id, title, repo, patches)create_git_fetch(out, component_id, title, repo)create_git_switch_branch(out, component_id, title, repo, branch)
- Registered git scripts run at the start of
<component>_configure(before nested CMake/Meson setup), in registration order - Call
create_git_*beforecreate_*_component/create_*_stagesfor that component - Optional aggregate target
buildmaster_clean(BUILDMASTER_CLEAN_RESET_REPOS, default ON)- Only components that used
create_git_*are affected - Per component:
git reset --hard+git clean -fdfrom the git toplevel (rev-parse --show-toplevel) - Invalidates that component’s configure (removes Meson
build.ninja/meson-private, or CMakeCMakeCache.txt/build.ninjaunder the component build dir) - Next
cmake --build/ninja/makere-enters<component>_configure→ re-applies git ops → nested setup → build - Controlled exclusively via environment variable (falsy:
0/OFF/FALSE/NO) - Propagated to nested BuildMaster instances through the toolchain file
- Not wired to the generator’s native
cleantarget (unreliable with Ninja); use:
cmake --build <builddir> --target buildmaster_clean
- Only components that used
- Automatic per-component post-install git reset
- After a successful
*_install, runsreset --hard+clean -fdonly for that component’s repo - Does not invalidate configure (avoids full reconfigure after every install)
- Removes the need for manual
POST_BUILDreset hooks in consumer projects (e.g. VPX, VMAF)
- After a successful
Static library support
- Portable static archive merging (
create_bundle_static_libraries):- Linux: GNU
ar -M(MRI) - macOS:
libtool -static - Windows:
lib /OUT:
- Linux: GNU
- Optional post-install rename of static libraries to canonical names
Platform support
- Linux, Windows (MSVC) and macOS (x86_64 and Apple Silicon)
- Extra-tool registration (e.g. bundled
pkgconf)
Notes
- Requires CMake ≥ 3.20; Meson and Ninja when using the corresponding backends.
- Stage scripts are generated at parent configure time — change
BUILDMASTER_DEBUG/BUILDMASTER_VERBOSE/BUILDMASTER_FAIL_FAST/BUILDMASTER_CLEAN_RESET_REPOSand re-run CMake to regenerate them. - Designed as a building block for multi-dependency projects (e.g. FFmpeg plugin graphs, multi-bitdepth codecs, database client bundles).