#!/usr/bin/env bash # Build the C runner (and its vendored libequix/hashx) under several compiler / # optimization-flag combinations, registering each as its own benchmark impl so # the harness can compare performance across compiler flags. # # Each variant -> build/variants//equix_runner and a manifest at # adapters/generated/equix-c-.manifest.toml (impl name "equix-c-"). # Then: python -m equix_bench run --config configs/compiler_flags.toml --out results/ set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$ROOT" NPROC="$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)" have() { command -v "$1" >/dev/null 2>&1; } git submodule update --init --recursive >/dev/null 2>&1 || true EQUIX_COMMIT="$(git -C vendored/equix rev-parse --short HEAD 2>/dev/null || echo unknown)" OUT="adapters/generated" mkdir -p "$OUT" build/variants # name | compiler | CFLAGS (-DNDEBUG kept so all variants match Release semantics) VARIANTS=( "gcc-o0|gcc|-O0 -DNDEBUG" "gcc-o2|gcc|-O2 -DNDEBUG" "gcc-o3|gcc|-O3 -DNDEBUG" "gcc-o3-native|gcc|-O3 -march=native -DNDEBUG" "gcc-o3-lto|gcc|-O3 -flto -DNDEBUG" "clang-o3|clang|-O3 -DNDEBUG" "clang-o3-native|clang|-O3 -march=native -DNDEBUG" ) built=() for entry in "${VARIANTS[@]}"; do IFS='|' read -r name cc flags <<<"$entry" if ! have "$cc"; then echo "skip $name ($cc not found)"; continue; fi bdir="build/variants/$name" # A copied/moved repo carries a CMake cache with old absolute paths; clean it. if [ -f "$bdir/CMakeCache.txt" ]; then recorded="$(sed -n 's/^CMAKE_CACHEFILE_DIR:INTERNAL=//p' "$bdir/CMakeCache.txt" | head -1)" if [ -n "$recorded" ] && [ "$recorded" != "$(cd "$bdir" && pwd)" ]; then rm -rf "$bdir" fi fi echo "==> building $name ($cc $flags)" if ! cmake -S runners/c -B "$bdir" \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_POLICY_VERSION_MINIMUM=3.10 \ -DCMAKE_C_COMPILER="$cc" \ -DCMAKE_C_FLAGS_RELEASE="$flags" \ -DEQUIX_C_COMMIT="$EQUIX_COMMIT" \ -DEQUIX_C_VERSION="1.0.0-$name" >/dev/null 2>"build/variants/$name.log"; then echo " configure FAILED for $name (see build/variants/$name.log)"; continue fi if ! cmake --build "$bdir" -j"$NPROC" --target equix_runner >>"build/variants/$name.log" 2>&1; then echo " build FAILED for $name (see build/variants/$name.log)"; continue fi cat > "$OUT/equix-c-$name.manifest.toml" <