flatpak-builder printed "Building module llvm" on every CI run instead of "Cache hit". The build environment, CRAFTER_BUILD_VERSION included, sat in the manifest's top-level build options, and those are part of every module's cache key; the version changes with each commit, so no module ever hit. Runs still took twelve minutes rather than eighty only because ccache made the LLVM rebuild cheap. The variables only matter to crafter-build's own module, so they move there, and CI rewrites the version on that module. LLVM, the WASI sysroot and wasmtime are now keyed on nothing that changes between commits. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
213 lines
8.6 KiB
YAML
213 lines
8.6 KiB
YAML
# SPDX-License-Identifier: LGPL-3.0-only
|
|
# SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
|
#
|
|
# crafter-build as a Flatpak. The runtime is the Freedesktop *Sdk*, not the
|
|
# Platform: a build tool needs glibc's headers and crt objects, gcc's
|
|
# libgcc_s, cmake, ninja, make, git and python at run time. Everything
|
|
# compiler-shaped is ours and lives under /app: clang, lld, libclang, libc++,
|
|
# compiler-rt (native and wasm32) and the WASI sysroot, all built from one
|
|
# LLVM source tree so the modules crafter-build builds and the compiler that
|
|
# consumes them can never drift apart.
|
|
app-id: net.catcrafts.CrafterBuild
|
|
runtime: org.freedesktop.Sdk
|
|
runtime-version: '26.08'
|
|
sdk: org.freedesktop.Sdk
|
|
command: crafter-build
|
|
finish-args:
|
|
# git dependencies, and the local web server `-r` starts for browser builds
|
|
- --share=network
|
|
- --socket=ssh-auth
|
|
# projects live anywhere; user sysroots too
|
|
- --filesystem=host
|
|
# so `-r` can launch what it built, games included
|
|
- --share=ipc
|
|
- --socket=wayland
|
|
- --socket=fallback-x11
|
|
- --socket=pulseaudio
|
|
- --device=all
|
|
# gdb and friends from the Sdk
|
|
- --allow=devel
|
|
- --env=PATH=/app/bin:/usr/bin
|
|
cleanup:
|
|
- /share/man
|
|
- /share/doc
|
|
modules:
|
|
- name: llvm
|
|
buildsystem: cmake-ninja
|
|
builddir: true
|
|
subdir: llvm
|
|
build-options:
|
|
# flatpak-builder's default CFLAGS carry -g. For all of LLVM that is a
|
|
# 30 GB build tree and a multi-gigabyte .Debug extension, so build
|
|
# without debug info, strip, and skip the split. The hardening flags
|
|
# from the defaults stay.
|
|
no-debuginfo: true
|
|
strip: true
|
|
cflags: -O2 -pipe -fexceptions -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection -fcf-protection
|
|
cflags-override: true
|
|
cxxflags: -O2 -pipe -fexceptions -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection -fcf-protection
|
|
cxxflags-override: true
|
|
config-opts:
|
|
- -DCMAKE_BUILD_TYPE=Release
|
|
- -DLLVM_ENABLE_ASSERTIONS=OFF
|
|
- -DLLVM_ENABLE_PROJECTS=clang;lld
|
|
- -DLLVM_ENABLE_RUNTIMES=compiler-rt;libcxx;libcxxabi;libunwind
|
|
- -DLLVM_TARGETS_TO_BUILD=X86;AArch64;WebAssembly
|
|
# Classic layout: libc++ in lib/ and include/c++/v1, not under a
|
|
# per-target subdirectory, the same shape as a distro install.
|
|
# crafter-build adds -L and an rpath for <prefix>/lib itself, since
|
|
# clang searches only its per-target directory and the system paths.
|
|
- -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF
|
|
# One shared LLVM and one shared clang library instead of a statically
|
|
# linked copy per tool: a fraction of the install size.
|
|
- -DLLVM_BUILD_LLVM_DYLIB=ON
|
|
- -DLLVM_LINK_LLVM_DYLIB=ON
|
|
- -DCLANG_LINK_CLANG_DYLIB=ON
|
|
- -DCLANG_DEFAULT_CXX_STDLIB=libc++
|
|
- -DCLANG_DEFAULT_LINKER=lld
|
|
- -DLIBCXX_INSTALL_MODULES=ON
|
|
- -DLLVM_INCLUDE_TESTS=OFF
|
|
- -DLLVM_INCLUDE_EXAMPLES=OFF
|
|
- -DLLVM_INCLUDE_DOCS=OFF
|
|
- -DLLVM_INCLUDE_BENCHMARKS=OFF
|
|
- -DLLVM_INSTALL_UTILS=OFF
|
|
- -DCLANG_INCLUDE_TESTS=OFF
|
|
- -DCOMPILER_RT_INCLUDE_TESTS=OFF
|
|
# The Sdk links with binutils' ld; two libLLVM-sized links at a time
|
|
# fit the CX53's memory with room to spare.
|
|
- -DLLVM_PARALLEL_LINK_JOBS=2
|
|
cleanup:
|
|
- /include/llvm
|
|
- /include/llvm-c
|
|
- /include/clang
|
|
- /include/clang-tidy
|
|
- /include/lld
|
|
- /lib/cmake
|
|
- /lib/*.a
|
|
- /share/opt-viewer
|
|
- /share/scan-build
|
|
- /share/scan-view
|
|
- /bin/clang-check
|
|
- /bin/clang-extdef-mapping
|
|
- /bin/clang-import-test
|
|
- /bin/clang-linker-wrapper
|
|
- /bin/clang-nvlink-wrapper
|
|
- /bin/clang-offload-bundler
|
|
- /bin/clang-offload-packager
|
|
- /bin/clang-refactor
|
|
- /bin/clang-rename
|
|
- /bin/clang-repl
|
|
- /bin/clang-sycl-linker
|
|
- /bin/diagtool
|
|
- /bin/git-clang-format
|
|
- /bin/hmaptool
|
|
- /bin/llvm-exegesis
|
|
- /bin/scan-build*
|
|
- /bin/scan-view
|
|
sources:
|
|
- type: archive
|
|
url: https://github.com/llvm/llvm-project/releases/download/llvmorg-22.1.8/llvm-project-22.1.8.src.tar.xz
|
|
sha256: 922f1817a0df7b1489272d18134ee0087a8b068828f87ac63b9861b1a9965888
|
|
|
|
- name: wasi-sysroot
|
|
# wasi-sdk's sysroot-only mode, driven by the clang built above:
|
|
# wasi-libc, compiler-rt builtins (installed into our clang's resource
|
|
# dir, where the wasm32 driver looks for them) and libc++ for wasip1 and
|
|
# wasip1-threads. The llvm-project tree is the same tarball as above so
|
|
# the wasm libc++ matches the native one.
|
|
buildsystem: cmake-ninja
|
|
builddir: true
|
|
build-options:
|
|
no-debuginfo: true
|
|
# flatpak-builder's default CFLAGS/LDFLAGS are x86-64 hardening flags
|
|
# (-fcf-protection, -z relro) that the nested wasm32 builds inherit
|
|
# through the environment and clang rejects for that target.
|
|
cflags: ""
|
|
cflags-override: true
|
|
cxxflags: ""
|
|
cxxflags-override: true
|
|
ldflags: ""
|
|
ldflags-override: true
|
|
strip: true
|
|
config-opts:
|
|
- -DCMAKE_TOOLCHAIN_FILE=/run/build/wasi-sysroot/wasi-host-toolchain.cmake
|
|
- -DWASI_SDK_BUILD_TOOLCHAIN=OFF
|
|
- -DWASI_SDK_INSTALL_TO_CLANG_RESOURCE_DIR=ON
|
|
- -DWASI_SDK_TARGETS=wasm32-wasip1;wasm32-wasip1-threads
|
|
- -DWASI_SDK_INCLUDE_TESTS=OFF
|
|
- -DCMAKE_INSTALL_PREFIX=/app
|
|
post-install:
|
|
# wasi-sdk installs into <prefix>/share/wasi-sysroot; crafter-build
|
|
# looks there (Crafter.Build:Toolchain), so nothing to move.
|
|
- test -f /app/share/wasi-sysroot/share/libc++/v1/std.cppm
|
|
sources:
|
|
- type: git
|
|
url: https://github.com/WebAssembly/wasi-sdk.git
|
|
tag: wasi-sdk-34
|
|
disable-submodules: true
|
|
# The compiler-rt sub-build gets the C target but not the ASM target, so
|
|
# its two wasm/*.S stubs come out as host objects when the driving clang
|
|
# does not default to wasm32. Reported upstream; drop once wasi-sdk has it.
|
|
- type: patch
|
|
path: wasi-sdk-asm-target.patch
|
|
- type: git
|
|
url: https://github.com/WebAssembly/wasi-libc.git
|
|
commit: 2e6fb9d8ee0cdf9e431fbcabe8af3115de000a13
|
|
dest: src/wasi-libc
|
|
- type: archive
|
|
url: https://github.com/llvm/llvm-project/releases/download/llvmorg-22.1.8/llvm-project-22.1.8.src.tar.xz
|
|
sha256: 922f1817a0df7b1489272d18134ee0087a8b068828f87ac63b9861b1a9965888
|
|
dest: src/llvm-project
|
|
- type: file
|
|
path: wasi-host-toolchain.cmake
|
|
|
|
- name: wasmtime
|
|
# The runner for wasm32-wasi tests and `-r` on a non-browser wasm build.
|
|
buildsystem: simple
|
|
build-commands:
|
|
- install -Dm755 wasmtime /app/bin/wasmtime
|
|
sources:
|
|
- type: archive
|
|
url: https://github.com/bytecodealliance/wasmtime/releases/download/v49.0.2/wasmtime-v49.0.2-x86_64-linux.tar.xz
|
|
sha256: a4d6e9e3a5a60f527cf7793d674c48930c80c2e8977995b8a275cad3254b9322
|
|
|
|
- name: crafter-build
|
|
buildsystem: simple
|
|
build-options:
|
|
# The self-host build fetches Crafter.Math, Crafter.Asset,
|
|
# Crafter.LintRules and glslang from git; they are unpinned on purpose
|
|
# (sibling repos tracking their default branch, see AGENTS.md).
|
|
build-args:
|
|
- --share=network
|
|
# On this module, not at the top of the manifest: top-level build
|
|
# options are part of every module's cache key, and the version changes
|
|
# with every commit, which made flatpak-builder rebuild LLVM each run.
|
|
env:
|
|
CRAFTER_BUILD_LLVM_DIR: /app
|
|
# The shipped binary runs on any x86_64 from the last decade; user
|
|
# projects still build with -march=native by default.
|
|
CRAFTER_BUILD_MARCH: x86-64-v2
|
|
CRAFTER_BUILD_MTUNE: generic
|
|
# CI replaces this with the version; a local build is a development
|
|
# build.
|
|
CRAFTER_BUILD_VERSION: 0.0.0-dev
|
|
build-commands:
|
|
# Bootstrap by hand, then let the result build itself: only the
|
|
# self-hosted binary has asset support and ThinLTO.
|
|
- ./build.sh
|
|
- ./bin/crafter-build
|
|
- CRAFTER_BUILD_HOME=$PWD/share/crafter-build ./bin/crafter-build test
|
|
- install -Dm755 bin/crafter.build-exe-*/crafter-build /app/bin/crafter-build
|
|
- install -Dm644 bin/crafter.build-lib-*/libcrafter-build.a /app/lib/libcrafter-build.a
|
|
- mkdir -p /app/share && cp -r share/crafter-build /app/share/
|
|
- install -Dm644 LICENSE LICENSE.GPL -t /app/share/licenses/net.catcrafts.CrafterBuild/
|
|
- install -Dm644 packaging/flatpak/net.catcrafts.CrafterBuild.metainfo.xml -t /app/share/metainfo/
|
|
sources:
|
|
- type: dir
|
|
path: ../..
|
|
skip:
|
|
- .git
|
|
- bin
|
|
- build
|
|
- lib/libcrafter-build.a
|
|
- share/crafter-build
|