#!/usr/bin/env bash # brintOS LLVM build — the wasm32-hwjs toolchain (see BRINTOS.md). # # Builds clang + lld + opt + llvm-config + libLLVM at the brintOS pin with the # dylib + plugin flags the hwjs-cc coroutine pass requires, plus the LLVM # binutils the kernel and distro builds invoke (llvm-ar/nm/link/objcopy/strip/ # objdump/readelf/ranlib — Kbuild's LLVM=1 and the wasmld merge need them). # Output lands in ./build/bin, which hwjs-cc/toolchain/find-llvm.sh discovers # automatically. # # Usage: # ./build-brintos.sh # configure + build (uses all cores) # ./build-brintos.sh -j 8 # cap parallelism # BUILD_DIR=/tmp/llvm ./build-brintos.sh set -euo pipefail HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BUILD_DIR="${BUILD_DIR:-$HERE/build}" JOBS="" while [ $# -gt 0 ]; do case "$1" in -j) JOBS="$2"; shift ;; -j*) JOBS="${1#-j}" ;; -h|--help) sed -n '2,12p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//'; exit 0 ;; *) echo "build-brintos.sh: unknown argument '$1'" >&2; exit 2 ;; esac shift done for tool in cmake ninja; do command -v "$tool" >/dev/null 2>&1 || { echo "build-brintos.sh: FATAL: '$tool' not found on PATH." >&2; exit 1; } done echo "brintOS LLVM: configuring (build dir: $BUILD_DIR)" cmake -G Ninja -S "$HERE/llvm" -B "$BUILD_DIR" \ -DCMAKE_BUILD_TYPE=Release \ -DLLVM_ENABLE_PROJECTS="clang;lld" \ -DLLVM_TARGETS_TO_BUILD="X86;WebAssembly" \ -DLLVM_ENABLE_ASSERTIONS=OFF \ -DLLVM_BUILD_LLVM_DYLIB=ON \ -DLLVM_LINK_LLVM_DYLIB=ON \ -DLLVM_ENABLE_PLUGINS=ON \ -DCLANG_PLUGIN_SUPPORT=ON \ -DLLVM_INCLUDE_TESTS=OFF \ -DLLVM_INCLUDE_BENCHMARKS=OFF \ -DLLVM_INCLUDE_EXAMPLES=OFF \ -DLLVM_OPTIMIZED_TABLEGEN=ON \ -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ # The binutils list is load-bearing: the wasm32 kernel build pins AR/NM/OBJCOPY # to this build's bin (and Kbuild's LLVM=1 derives STRIP/OBJDUMP/READELF), and # hwjs-cc's wasmld drives llvm-link. A default `ninja clang lld` build does NOT # produce these, so a fresh clone's `make kernel` would die at the first # OBJCOPY step (reported as ticket: "make kernel stops at modules.builtin.modinfo"). BINUTILS="llvm-ar llvm-nm llvm-ranlib llvm-link llvm-objcopy llvm-strip llvm-objdump llvm-readelf" echo "brintOS LLVM: building clang lld opt llvm-config $BINUTILS (+ libLLVM dylib)" # shellcheck disable=SC2086 # BINUTILS is a deliberate word-split target list ninja -C "$BUILD_DIR" ${JOBS:+-j "$JOBS"} clang lld opt llvm-config $BINUTILS # Loud verification: every tool downstream builds invoke must exist now, or # the failure surfaces here instead of deep inside a kernel/distro build. for t in clang wasm-ld opt llvm-config $BINUTILS; do [ -x "$BUILD_DIR/bin/$t" ] || { echo "build-brintos.sh: FATAL: '$t' missing from $BUILD_DIR/bin after build." >&2; exit 1; } done echo echo "brintOS LLVM: done." echo " bin: $BUILD_DIR/bin" "$BUILD_DIR/bin/clang" --version | head -1 || true echo "hwjs-cc will discover this automatically; or point at it explicitly:" echo " export WASMLD_HWJS_LLVM_BIN=$BUILD_DIR/bin"