aboutsummaryrefslogtreecommitdiff
path: root/scripts/ue_build_linux/verify_linux_toolchains.sh
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 ]