#!/usr/bin/env bash # build.sh - Unified build wrapper (Phase 7 + Pool TLS) with discoverable help # # Quick use: # ./build.sh bench_pool_tls_hakmem # Recommended target # ./build.sh help # Show usage/hints/ENV # ./build.sh verify bench_pool_tls_hakmem # Check freshness # # Notes: # - Flags are pinned to avoid drift (see below). You can pass extra make flags via # EXTRA_MAKEFLAGS, e.g. EXTRA_MAKEFLAGS="HAKMEM_DEBUG_VERBOSE=1" ./build.sh # - Arena ENV (Pool TLS): HAKMEM_POOL_TLS_ARENA_MB_INIT/MAX/GROWTH_LEVELS # - See also: docs/BUILDING_QUICKSTART.md set -euo pipefail FLAVOR="release" if [[ $# -gt 0 && ( "$1" == "release" || "$1" == "debug" ) ]]; then FLAVOR="$1"; shift fi TARGET="${1:-bench_mid_large_mt_hakmem}" usage() { cat <<'USAGE' ========================================= HAKMEM Build Script (help) ========================================= Usage: ./build.sh ./build.sh help # Show this help ./build.sh list # Show common targets ./build.sh verify # Verify binary freshness Common targets (curated): - bench_random_mixed_hakmem - bench_pool_tls_hakmem - bench_mid_large_mt_hakmem - larson_hakmem Pinned build flags (by default): POOL_TLS_PHASE1=1 HEADER_CLASSIDX=1 AGGRESSIVE_INLINE=1 PREWARM_TLS=1 POOL_TLS_PREWARM=1 POOL_TLS_BIND_BOX=1 Extra flags (optional): Use environment var EXTRA_MAKEFLAGS, e.g.: EXTRA_MAKEFLAGS="HAKMEM_DEBUG_VERBOSE=1" ./build.sh bench_pool_tls_hakmem EXTRA_MAKEFLAGS="HAKMEM_TINY_SAFE_FREE=1" ./build.sh bench_random_mixed_hakmem Pool TLS Arena ENV (A/B friendly): export HAKMEM_POOL_TLS_ARENA_MB_INIT=2 # default 1 export HAKMEM_POOL_TLS_ARENA_MB_MAX=16 # default 8 export HAKMEM_POOL_TLS_ARENA_GROWTH_LEVELS=4 # default 3 Verify & perf tips: make print-flags ./verify_build.sh perf stat -e cycles,instructions,branches,branch-misses,cache-misses -r 3 -- ./ ... strace -e trace=mmap,madvise,munmap -c ./ ... USAGE } list_targets() { cat <<'LIST' Common build targets: bench_random_mixed_hakmem # Tiny 1T mixed bench_pool_tls_hakmem # Pool TLS (8–52KB) bench_mid_large_mt_hakmem # Mid-Large MT (8–32KB) larson_hakmem # Larson mixed bench_random_mixed_system # glibc baseline bench_pool_tls_system # glibc baseline (PoolTLS workload) bench_mid_large_mt_system # glibc baseline (Mid-Large workload) LIST } if [[ "${TARGET}" == "help" || "${TARGET}" == "-h" || "${TARGET}" == "--help" ]]; then usage exit 0 fi if [[ "${TARGET}" == "list" ]]; then list_targets exit 0 fi if [[ "${TARGET}" == "verify" ]]; then BIN="${2:-}" if [[ -z "${BIN}" ]]; then echo "Usage: ./build.sh verify " >&2 exit 2 fi ./verify_build.sh "${BIN}" exit 0 fi echo "=========================================" echo " HAKMEM Build Script" echo " Flavor: ${FLAVOR}" echo " Target: ${TARGET}" echo " Flags: POOL_TLS_PHASE1=${POOL_TLS_PHASE1:-0} POOL_TLS_PREWARM=${POOL_TLS_PREWARM:-0} POOL_TLS_BIND_BOX=${POOL_TLS_BIND_BOX:-0} DISABLE_MINCORE=${DISABLE_MINCORE:-0} HEADER_CLASSIDX=1 AGGRESSIVE_INLINE=1 PREWARM_TLS=1 ${EXTRA_MAKEFLAGS:-}" echo "=========================================" # Always clean to avoid stale objects when toggling flags make clean >/dev/null 2>&1 || true # Phase 7 + Pool TLS defaults (pinned) + user extras # Default: Target-specific Pool TLS settings # - Mid-Large targets (8-34KB workloads) → Pool TLS ON (critical for performance) # - Tiny targets (≤1KB workloads) → Pool TLS OFF (avoid TLS overhead for short benchmarks) case "${TARGET}" in bench_mid_large_mt_hakmem|bench_pool_tls_hakmem|bench_mid_large_mt_system|bench_pool_tls_system|larson_hakmem|larson_mi|larson_system) POOL_TLS_PHASE1_DEFAULT=${POOL_TLS_PHASE1:-1} # ON for Mid-Large and mixed workloads ;; *) POOL_TLS_PHASE1_DEFAULT=${POOL_TLS_PHASE1:-0} # OFF for Tiny-focused benchmarks ;; esac POOL_TLS_PREWARM_DEFAULT=${POOL_TLS_PREWARM:-0} POOL_TLS_BIND_BOX_DEFAULT=${POOL_TLS_BIND_BOX:-0} DISABLE_MINCORE_DEFAULT=${DISABLE_MINCORE:-0} MAKE_ARGS=( BUILD_FLAVOR=${FLAVOR} \ POOL_TLS_PHASE1=${POOL_TLS_PHASE1_DEFAULT} \ POOL_TLS_PREWARM=${POOL_TLS_PREWARM_DEFAULT} \ POOL_TLS_BIND_BOX=${POOL_TLS_BIND_BOX_DEFAULT} \ DISABLE_MINCORE=${DISABLE_MINCORE_DEFAULT} \ HEADER_CLASSIDX=1 \ AGGRESSIVE_INLINE=1 \ PREWARM_TLS=1 \ ) # Apply debug flavor extras (non-invasive): verbose + safe-free optional if [[ "${FLAVOR}" == "debug" ]]; then MAKE_ARGS+=(HAKMEM_DEBUG_VERBOSE=1) MAKE_ARGS+=(BUILD_RELEASE_DEFAULT=0) # Disable release mode for debug builds # Uncomment to enable extra safety by default for debug runs (may slow hot path) # MAKE_ARGS+=(HAKMEM_TINY_SAFE_FREE=1) else MAKE_ARGS+=(BUILD_RELEASE_DEFAULT=1) # Enable release mode for release builds fi # Append user-provided extras and target if [[ -n "${EXTRA_MAKEFLAGS:-}" ]]; then # shellcheck disable=SC2206 MAKE_ARGS+=(${EXTRA_MAKEFLAGS}) fi MAKE_ARGS+=("${TARGET}") make "${MAKE_ARGS[@]}" echo "" echo "=========================================" echo " ✅ Build successful" echo " Run: ./${TARGET}" echo "-----------------------------------------" # Place artifacts under out// OUTDIR="out/${FLAVOR}" mkdir -p "${OUTDIR}" if [[ -x "./${TARGET}" ]]; then cp -f "./${TARGET}" "${OUTDIR}/${TARGET}" echo " Saved: ${OUTDIR}/${TARGET}" fi echo " Tip: ./build.sh help # flags, ENV, targets" echo "========================================="