aboutsummaryrefslogtreecommitdiff
path: root/scripts/ue_build_linux/verify_linux_toolchains.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/ue_build_linux/verify_linux_toolchains.sh')
-rwxr-xr-xscripts/ue_build_linux/verify_linux_toolchains.sh121
1 files changed, 121 insertions, 0 deletions
diff --git a/scripts/ue_build_linux/verify_linux_toolchains.sh b/scripts/ue_build_linux/verify_linux_toolchains.sh
new file mode 100755
index 000000000..10fad8a82
--- /dev/null
+++ b/scripts/ue_build_linux/verify_linux_toolchains.sh
@@ -0,0 +1,121 @@
+#!/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 ]