#!/usr/bin/env bash # # Verify that the project builds on Linux with gcc, ue-clang, clang-19 and clang-20. # Each toolchain gets a clean slate (build dirs + xmake caches wiped). # # Usage: # ./scripts/verify_linux_toolchains.sh # build all four # ./scripts/verify_linux_toolchains.sh gcc clang-19 # build only specific ones # ./scripts/verify_linux_toolchains.sh --clean # also wipe ~/.xmake package cache # # Installing toolchains (Ubuntu 24.04): # - gcc: sudo apt install build-essential # - ue-clang: use scripts/ue_build_linux/get_ue_toolchain.sh # - clang-19: sudo apt install clang-19 # - clang-20: sudo apt install clang-20 set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' PASSED=() FAILED=() declare -A TIMINGS CLEAN_XMAKE_HOME=false clean_build_state() { echo -e "${YELLOW}Cleaning build state...${NC}" rm -rf "$PROJECT_DIR/.xmake" "$PROJECT_DIR/build" if [ "$CLEAN_XMAKE_HOME" = true ]; then rm -rf ~/.xmake fi } build_toolchain() { local NAME="$1" shift local CONFIG_ARGS=("$@") echo "" echo "============================================================" echo -e "${YELLOW}Building with: ${NAME}${NC}" echo " xmake config args: ${CONFIG_ARGS[*]}" echo "============================================================" clean_build_state local START_TIME=$SECONDS if ! (cd "$PROJECT_DIR" && xmake config -y -m debug "${CONFIG_ARGS[@]}"); then TIMINGS[$NAME]=$(( SECONDS - START_TIME )) echo -e "${RED}FAILED: ${NAME} (config, ${TIMINGS[$NAME]}s)${NC}" FAILED+=("$NAME") return 1 fi if ! (cd "$PROJECT_DIR" && xmake -y -j"$(nproc)"); then TIMINGS[$NAME]=$(( SECONDS - START_TIME )) echo -e "${RED}FAILED: ${NAME} (build, ${TIMINGS[$NAME]}s)${NC}" FAILED+=("$NAME") return 1 fi TIMINGS[$NAME]=$(( SECONDS - START_TIME )) echo -e "${GREEN}PASSED: ${NAME} (${TIMINGS[$NAME]}s)${NC}" PASSED+=("$NAME") } # Available toolchain configurations declare -A TOOLCHAINS TOOLCHAINS[gcc]="--toolchain=gcc" TOOLCHAINS[ue-clang]="--toolchain=ue-clang" TOOLCHAINS[clang-19]="--toolchain=clang-19" TOOLCHAINS[clang-20]="--toolchain=clang-20" # Parse arguments SELECTED=() for ARG in "$@"; do if [ "$ARG" = "--clean" ]; then CLEAN_XMAKE_HOME=true else SELECTED+=("$ARG") fi done if [ ${#SELECTED[@]} -eq 0 ]; then SELECTED=(gcc ue-clang clang-19 clang-20) fi TOTAL_START=$SECONDS for TC in "${SELECTED[@]}"; do if [ -z "${TOOLCHAINS[$TC]+x}" ]; then echo -e "${RED}Unknown toolchain: ${TC}${NC}" echo "Available: ${!TOOLCHAINS[*]}" exit 1 fi # shellcheck disable=SC2086 build_toolchain "$TC" ${TOOLCHAINS[$TC]} || true done TOTAL_ELAPSED=$(( SECONDS - TOTAL_START )) echo "" echo "============================================================" echo "Results (${TOTAL_ELAPSED}s total):" echo "============================================================" for TC in "${PASSED[@]}"; do echo -e " ${GREEN}PASS${NC} ${TC} (${TIMINGS[$TC]}s)" done for TC in "${FAILED[@]}"; do echo -e " ${RED}FAIL${NC} ${TC} (${TIMINGS[$TC]}s)" done [ ${#FAILED[@]} -eq 0 ]