From 65047bc7b72ab7772ed0bac260469f621eb15b6e Mon Sep 17 00:00:00 2001 From: patchzyy <64382339+patchzyy@users.noreply.github.com> Date: Fri, 4 Sep 2026 21:12:18 +0200 Subject: [PATCH] Bump LLVM --- .github/workflows/package.yml | 6 +- Launcher/prepare-portable-tools.sh | 117 ++--------------------------- 2 files changed, 9 insertions(+), 114 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 6df88da..742418f 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -42,12 +42,10 @@ jobs: # appimagetool ships as an AppImage itself and needs to self-mount via FUSE to run directly; # GitHub's ubuntu-latest runners don't have libfuse2 preinstalled. - # patchelf: prepare-portable-tools.sh bundles the host libraries the llvm.org binaries link - # against and rewrites their RPATH to find them. - - name: Install dependencies (required by appimagetool, SDL3 build and toolchain bundling) + - name: Install dependencies (required by appimagetool and SDL3 build) run: | sudo apt-get update - sudo apt-get install -y libfuse2 patchelf build-essential git make \ + sudo apt-get install -y libfuse2 build-essential git make \ pkg-config cmake ninja-build gnome-desktop-testing libasound2-dev libpulse-dev \ libaudio-dev libfribidi-dev libjack-dev libsndio-dev libx11-dev libxext-dev \ libxrandr-dev libxcursor-dev libxfixes-dev libxi-dev libxss-dev libxtst-dev \ diff --git a/Launcher/prepare-portable-tools.sh b/Launcher/prepare-portable-tools.sh index 9602345..fe7b42a 100755 --- a/Launcher/prepare-portable-tools.sh +++ b/Launcher/prepare-portable-tools.sh @@ -25,7 +25,7 @@ set -euo pipefail script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) workspace=$(cd "$script_dir/.." && pwd) -llvm_version=22.1.8 +llvm_version=23.1.0 cmake_version=4.3.3 ninja_version=1.13.2 destination="$script_dir/artifacts/portable-tools" @@ -52,13 +52,13 @@ done case "$arch" in x86_64) llvm_release_arch=X64; target_triple=x86_64-unknown-linux-gnu - llvm_release_sha256=df0e1ecf16caf3489a272a5eea4eec9b0d82878f6477fa309504f918a0006384 + llvm_release_sha256=18da30f77f475688a18f7704d23f9f155ae007ed9922dbed6850a9419d9fec8c cmake_release_arch=x86_64 cmake_sha256=927b2368a946c37269c3a66225ab00544e756459cdd0b5d0da438694fb9ff802 ninja_asset=ninja-linux.zip ninja_sha256=5749cbc4e668273514150a80e387a957f933c6ed3f5f11e03fb30955e2bbead6 ;; aarch64) llvm_release_arch=ARM64; target_triple=aarch64-unknown-linux-gnu - llvm_release_sha256=805efad2bb91cb4967fa569e0881d10c0f69c04461cf671cccbae19f547acc34 + llvm_release_sha256=cfb31bfc713ef453248bf5bd026312f838ad6c52c25623e987cb6a340f3050d4 cmake_release_arch=aarch64 cmake_sha256=9ea38356dbd3e32e51029a3e09a0f2f8e117ef4fbcaad7a21ffb36409bbd5cb4 ninja_asset=ninja-linux-aarch64.zip @@ -91,17 +91,11 @@ download_verified() { mv "$tmp" "$dest" } -# lib/bundled is part of the check so a toolchain prepared before runtime-library bundling existed -# is rebuilt rather than reused. -if [[ -x "$toolchain_dir/bin/clang" && -x "$toolchain_dir/bin/ninja" && -x "$toolchain_dir/bin/cmake" && -d "$toolchain_dir/lib/bundled" ]]; then +if [[ -x "$toolchain_dir/bin/clang" && -x "$toolchain_dir/bin/ninja" && -x "$toolchain_dir/bin/cmake" ]]; then echo "prepare-portable-tools.sh: reusing existing toolchain at $toolchain_dir" exit 0 fi -for tool in patchelf ldd strip; do - command -v "$tool" >/dev/null || { echo "prepare-portable-tools.sh: '$tool' is required (apt-get install patchelf binutils libc-bin)" >&2; exit 1; } -done - work="$destination/.building-toolchain-$arch" rm -rf "$work" mkdir -p "$work/bin" "$work/lib/$target_triple" "$work/include/$target_triple/c++/v1" @@ -126,9 +120,9 @@ echo "prepare-portable-tools.sh: pruning to the minimal compile+link toolchain.. # clang: the real driver executable plus the clang/clang++ symlinks CMake/local-build.sh invoke. # Stripped: debug symbols are dead weight for a bundled compiler nobody will debug. -cp -a "$src/bin/clang-22" "$work/bin/" -strip "$work/bin/clang-22" -ln -s clang-22 "$work/bin/clang" +cp -a "$src/bin/clang-23" "$work/bin/" +strip "$work/bin/clang-23" +ln -s clang-23 "$work/bin/clang" ln -s clang "$work/bin/clang++" # lld: linked via -fuse-ld=lld, which clang resolves by looking for ld.lld next to itself first - @@ -190,98 +184,6 @@ echo "prepare-portable-tools.sh: staging ninja $ninja_version..." unzip -oq "$ninja_archive" -d "$work/bin" chmod +x "$work/bin/ninja" -# --- runtime libraries the llvm.org binaries expect the host to provide --- -# -# The official LLVM release binaries are dynamically linked against a few host libraries beyond -# glibc: lld needs libxml2, clang/lld need zlib and zstd, and whatever those pull in. A user's -# distro is not guaranteed to have them under the same soname - libxml2 2.14 renamed -# libxml2.so.2 to libxml2.so.16, so on current Arch/Fedora a fresh install died with -# "ld.lld: error while loading shared libraries: libxml2.so.2". The smoke test below never caught -# it because the build machine has every one of them. So: copy the transitive closure of non-core -# libraries next to the binaries and point the binaries at that directory through an RPATH, the -# way AppImages ship any dynamically linked tool. glibc and its companions stay on the host: they -# exist everywhere, and a bundled copy could only ever be older than the host's own. -bundled_lib_dir="$work/lib/bundled" -mkdir -p "$bundled_lib_dir" - -is_host_provided_lib() { - case "$1" in - linux-vdso*|ld-linux*|libc.so*|libm.so*|libdl.so*|libpthread.so*|librt.so*|libresolv.so*|libutil.so*|\ - libgcc_s.so*|libstdc++.so*) return 0 ;; - *) return 1 ;; - esac -} - -# Prints "soname path" for every dynamically resolved dependency of $1 that the host must not be -# relied on for. ldd already reports the transitive closure, so no recursion is needed. -non_host_deps() { - local line soname path - ldd "$1" 2>/dev/null | while read -r line; do - [[ "$line" == *"=>"* ]] || continue - soname=${line%% =>*}; soname=${soname## } - path=${line#*=> }; path=${path%% (*} - is_host_provided_lib "$soname" && continue - echo "$soname $path" - done -} - -# A dependency the build machine itself lacks cannot be bundled; say so instead of shipping a -# toolchain that is broken everywhere. (Checked separately because a failure inside the -# process-substituted reader above could not stop the script.) -assert_deps_resolved() { - if ldd "$1" 2>/dev/null | grep -q "not found"; then - echo "prepare-portable-tools.sh: $(basename "$1") has dependencies missing on this machine:" >&2 - ldd "$1" | grep "not found" >&2 - exit 1 - fi -} - -# Copies every non-core library $1 needs into lib/bundled, then does the same for each copy, so -# a library's own dependencies (libxml2 -> ICU, ...) are bundled even if ldd's listing for the -# executable did not already spell out the whole closure. The "already bundled" check ends the -# recursion. -bundle_deps_of() { - local file=$1 soname path - assert_deps_resolved "$file" - while read -r soname path; do - [[ -n "$soname" ]] || continue - [[ -e "$bundled_lib_dir/$soname" ]] && continue - cp -L "$path" "$bundled_lib_dir/$soname" - chmod u+w "$bundled_lib_dir/$soname" - # A bundled library must find its own dependencies beside itself: RUNPATH is not - # inherited from the executable that loaded it. - patchelf --set-rpath '$ORIGIN' "$bundled_lib_dir/$soname" - bundle_deps_of "$bundled_lib_dir/$soname" - done < <(non_host_deps "$file") -} - -bundle_runtime_libs() { - local file=$1 existing - bundle_deps_of "$file" - # Prepend, keeping whatever RPATH the release build set (typically $ORIGIN/../lib). - existing=$(patchelf --print-rpath "$file" 2>/dev/null || true) - patchelf --set-rpath "\$ORIGIN/../lib/bundled${existing:+:$existing}" "$file" -} - -echo "prepare-portable-tools.sh: bundling the host runtime libraries the toolchain binaries depend on..." -for binary in "$work/bin/clang-22" "$work/bin/lld" "$work/bin/llvm-ar" "$work/bin/cmake"; do - bundle_runtime_libs "$binary" -done -echo "prepare-portable-tools.sh: bundled $(ls "$bundled_lib_dir" | wc -l) librar(y/ies): $(ls "$bundled_lib_dir" | tr '\n' ' ')" - -# Fail here, on the build machine, if any non-core dependency still resolves to a host path: -# that is exactly the file a user's machine may lack. -for binary in "$work/bin/clang-22" "$work/bin/lld" "$work/bin/llvm-ar" "$work/bin/cmake" "$bundled_lib_dir"/*; do - [[ -f "$binary" ]] || continue - while read -r soname path; do - [[ -n "$soname" ]] || continue - if [[ "$path" != "$bundled_lib_dir/"* ]]; then - echo "prepare-portable-tools.sh: $(basename "$binary") still resolves $soname from the host ($path); bundling failed" >&2 - exit 1 - fi - done < <(non_host_deps "$binary") -done - cat > "$work/LICENSE.txt" <