blob: 10fad8a82b2d68d0d9856d4e4813bab5c5834cc3 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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 ]
|