diff --git a/externals/depot_tools b/externals/depot_tools
index ecad42cb6a..8fecc592a2 160000
--- a/externals/depot_tools
+++ b/externals/depot_tools
@@ -1 +1 @@
-Subproject commit ecad42cb6a9b53bbe98f9a06d37dbfbaf7129881
+Subproject commit 8fecc592a290769242d5098666cee8d29b7f0523
diff --git a/native/linux-clang-cross/build.cake b/native/linux-clang-cross/build.cake
index 2cde7ee54f..f022513fc2 100644
--- a/native/linux-clang-cross/build.cake
+++ b/native/linux-clang-cross/build.cake
@@ -2,31 +2,33 @@ DirectoryPath ROOT_PATH = MakeAbsolute(Directory("../.."));
 
 #load "../../scripts/cake/shared.cake"
 
+string TOOLCHAIN_ARCH = Argument("toolchainArch", EnvironmentVariable("TOOLCHAIN_ARCH"));
+string TOOLCHAIN_ARCH_SHORT = Argument("toolchainArchShort", EnvironmentVariable("TOOLCHAIN_ARCH_SHORT"));
+string TOOLCHAIN_ARCH_TARGET = Argument("toolchainArchTarget", EnvironmentVariable("TOOLCHAIN_ARCH_TARGET"));
+
+Information("Toolchain:");
+Information($"    Arch:                          {TOOLCHAIN_ARCH} ({TOOLCHAIN_ARCH_SHORT})");
+Information($"    Target                         {TOOLCHAIN_ARCH_TARGET}");
+
 if (BUILD_ARCH.Length == 0)
     BUILD_ARCH = new [] { "arm" };
 
 string GetGnArgs(string arch)
 {
-    var (vendor, abi, sysrootarg, linker) = BUILD_VARIANT switch
-    {
-        "alpine" or "alpinenodeps" => ("-alpine", "musl", "'--sysroot=/alpine', ", "'-fuse-ld=lld'"),
-        _ => ("", "gnu", "", ""),
-    };
-    var (toolchainArch, targetArch) = arch switch
+    var (sysrootArg, linker) = BUILD_VARIANT switch
     {
-        "arm" => ($"arm{vendor}-linux-{abi}eabihf", $"armv7a{vendor}-linux-{abi}eabihf"),
-        "arm64" => ($"aarch64{vendor}-linux-{abi}", $"aarch64{vendor}-linux-{abi}"),
-        _ => ($"{arch}{vendor}-linux-{abi}", $"{arch}{vendor}-linux-{abi}"),
+        "alpine" or "alpinenodeps" => ("'--sysroot=/alpine', ", "'-fuse-ld=lld'"),
+        _ => ("", ""),
     };
 
-    var sysroot = $"/usr/{toolchainArch}";
-    var init = $"{sysrootarg} '--target={targetArch}'";
+    var sysroot = $"/usr/{TOOLCHAIN_ARCH}";
+    var init = $"{sysrootArg} '--target={TOOLCHAIN_ARCH_TARGET}'";
     var bin = $"'-B{sysroot}/bin/' ";
     var libs = $"'-L{sysroot}/lib/' ";
     var includes = 
         $"'-I{sysroot}/include', " +
         $"'-I{sysroot}/include/c++/current', " +
-        $"'-I{sysroot}/include/c++/current/{toolchainArch}' ";
+        $"'-I{sysroot}/include/c++/current/{TOOLCHAIN_ARCH}' ";
 
     return
         $"extra_asmflags+=[ {init}, '-no-integrated-as', {bin}, {includes} ] " +
@@ -43,7 +45,6 @@ Task("libSkiaSharp")
         RunCake("../linux/build.cake", "libSkiaSharp", new Dictionary<string, string> {
             { "arch", arch },
             { "gnArgs", GetGnArgs(arch) },
-            { "variant", BUILD_VARIANT },
         });
     }
 });
@@ -56,7 +57,6 @@ Task("libHarfBuzzSharp")
         RunCake("../linux/build.cake", "libHarfBuzzSharp", new Dictionary<string, string> {
             { "arch", arch },
             { "gnArgs", GetGnArgs(arch) },
-            { "variant", BUILD_VARIANT },
         });
     }
 });
diff --git a/native/linux/build.cake b/native/linux/build.cake
index 788ce7d6bb..2c17ec34ac 100644
--- a/native/linux/build.cake
+++ b/native/linux/build.cake
@@ -12,6 +12,9 @@ bool SUPPORT_VULKAN = SUPPORT_VULKAN_VAR == "1" || SUPPORT_VULKAN_VAR.ToLower()
 var VERIFY_EXCLUDED = Argument("verifyExcluded", Argument("verifyexcluded", ""))
     .ToLower().Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
 
+var VERIFY_GLIBC_MAX_VAR = Argument("verifyGlibcMax", Argument("verifyglibcmax", "2.28"));
+var VERIFY_GLIBC_MAX = string.IsNullOrEmpty(VERIFY_GLIBC_MAX_VAR) ? null : System.Version.Parse(VERIFY_GLIBC_MAX_VAR);
+
 string CC = Argument("cc", EnvironmentVariable("CC"));
 string CXX = Argument("cxx", EnvironmentVariable("CXX"));
 string AR = Argument("ar", EnvironmentVariable("AR"));
@@ -31,22 +34,38 @@ if (!string.IsNullOrEmpty(AR))
 
 void CheckDeps(FilePath so)
 {
-    if (VERIFY_EXCLUDED == null || VERIFY_EXCLUDED.Length == 0)
-        return;
-
     Information($"Making sure that there are no dependencies on: {string.Join(", ", VERIFY_EXCLUDED)}");
 
-    RunProcess("readelf", $"-d {so}", out var stdout);
-    Information(String.Join(Environment.NewLine + "    ", stdout));
+    RunProcess("readelf", $"-dV {so}", out var stdoutEnum);
+    var stdout = stdoutEnum.ToArray();
 
-    var needed = stdout
-        .Where(l => l.Contains("(NEEDED)"))
-        .ToList();
+    var needed = MatchRegex(@"\(NEEDED\).+\[(.+)\]", stdout).ToList();
+
+    Information("Dependencies:");
+    foreach (var need in needed) {
+        Information($"    {need}");
+    }
 
     foreach (var exclude in VERIFY_EXCLUDED) {
         if (needed.Any(o => o.Contains(exclude.Trim(), StringComparison.OrdinalIgnoreCase)))
             throw new Exception($"{so} contained a dependency on {exclude}.");
     }
+
+    var glibcs = MatchRegex(@"GLIBC_([\w\.\d]+)", stdout).Distinct().ToList();
+    glibcs.Sort();
+
+    Information("GLIBC:");
+    foreach (var glibc in glibcs) {
+        Information($"    {glibc}");
+    }
+    
+    if (VERIFY_GLIBC_MAX != null) {
+        foreach (var glibc in glibcs) {
+            var version = System.Version.Parse(glibc);
+            if (version > VERIFY_GLIBC_MAX)
+                throw new Exception($"{so} contained a dependency on GLIBC {glibc} which is greater than the expected GLIBC {VERIFY_GLIBC_MAX}.");
+        }
+    }
 }
 
 Task("libSkiaSharp")
@@ -54,6 +73,17 @@ Task("libSkiaSharp")
     .WithCriteria(IsRunningOnLinux())
     .Does(() =>
 {
+    // patch the gclient_paths.py for Python 3.7
+    {
+        var gclient = DEPOT_PATH.CombineWithFilePath("gclient_paths.py");
+        var contents = System.IO.File.ReadAllText(gclient.FullPath);
+        var newContents = contents
+            .Replace("@functools.lru_cache", "@functools.lru_cache()")
+            .Replace("@functools.lru_cache()()", "@functools.lru_cache()");
+        if (contents != newContents)
+            System.IO.File.WriteAllText(gclient.FullPath, newContents);
+    }
+
     foreach (var arch in BUILD_ARCH) {
         if (Skip(arch)) return;
 
diff --git a/scripts/Docker/_clang-cross-common.sh b/scripts/Docker/_clang-cross-common.sh
index ce949db82a..57b32a8314 100755
--- a/scripts/Docker/_clang-cross-common.sh
+++ b/scripts/Docker/_clang-cross-common.sh
@@ -1,42 +1,43 @@
 #!/usr/bin/env bash
 set -ex
 
+# Parameters:
+# $1 - The directory containing the Dockerfile  [ clang-cross/10 | clang-cross ]
+# $2 - The target architecture to build for     [ arm | arm64 | riscv64 | x86 | x64 ]
+# $3 - The ABI                                  [ gnu | musl ]
+# $4 - The variant                              [ "" | alpine ]
+
 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+
+# the directory containing the Dockerfile
 DOCKER_DIR="$1"
 
 # the target architecture to build for
-ARCH="${2:-arm}"
+ARCH="$2"
 
 # the docker image architecture to use
 MACHINE_ARCH="$(uname -m)"
-[ "$MACHINE_ARCH" = "arm64" ] && MACHINE_ARCH=aarch64
-IMAGE_ARCH="${3:-$([[ "$MACHINE_ARCH" == "aarch64" ]] && echo "arm64v8" || echo "amd64")}"
-
-DISTRO_VERSION=$4
-ABI=$5
-VENDOR=$6
-
-case $ARCH in
-  arm)     TOOLCHAIN_ARCH=arm$VENDOR-linux-${ABI}eabihf ; TOOLCHAIN_ARCH_SHORT=armhf   ; TARGET_MACHINE_ARCH=armhf   ;;
-  arm64)   TOOLCHAIN_ARCH=aarch64$VENDOR-linux-$ABI     ; TOOLCHAIN_ARCH_SHORT=arm64   ; TARGET_MACHINE_ARCH=aarch64 ;;
-  riscv64) TOOLCHAIN_ARCH=riscv64$VENDOR-linux-$ABI     ; TOOLCHAIN_ARCH_SHORT=riscv64 ; TARGET_MACHINE_ARCH=riscv64 ;;
-  x86)     TOOLCHAIN_ARCH=i686$VENDOR-linux-$ABI        ; TOOLCHAIN_ARCH_SHORT=i386    ; TARGET_MACHINE_ARCH=x86     ;;
-  x64)     TOOLCHAIN_ARCH=x86-64$VENDOR-linux-$ABI      ; TOOLCHAIN_ARCH_SHORT=amd64   ; TARGET_MACHINE_ARCH=x86_64  ;;
-  *) echo "Unsupported architecture: $ARCH" && exit 1 ;;
+case $MACHINE_ARCH in
+  arm64) IMAGE_ARCH=arm64v8 ; MACHINE_ARCH=aarch64 ;;
+  *)     IMAGE_ARCH=amd64   ;;
 esac
 
-(cd $DIR && docker build --tag skiasharp-linux-$ABI-cross-$ARCH \
-    --build-arg TOOLCHAIN_ARCH=$TOOLCHAIN_ARCH                  \
-    --build-arg TOOLCHAIN_ARCH_SHORT=$TOOLCHAIN_ARCH_SHORT      \
-    --build-arg IMAGE_ARCH=$IMAGE_ARCH                          \
-    --build-arg MACHINE_ARCH=$MACHINE_ARCH                      \
-    --build-arg TARGET_MACHINE_ARCH=$TARGET_MACHINE_ARCH        \
-    --build-arg DISTRO_VERSION=$DISTRO_VERSION                  \
+# the ABI
+ABI=$3
+
+# the variant
+VARIANT=$4
+
+(cd $DIR && 
+  docker build --tag skiasharp-linux-$ABI-cross-$ARCH \
+    --build-arg BUILD_ARCH=$ARCH                      \
+    --build-arg IMAGE_ARCH=$IMAGE_ARCH                \
+    --build-arg MACHINE_ARCH=$MACHINE_ARCH            \
     $DOCKER_DIR)
 
-if [ "$VENDOR" = "-alpine" ]; then vendor=alpine; fi
+[ -n "$VARIANT" ] && VARIANT="--variant=$VARIANT"
 
 (cd $DIR/../.. && 
-    docker run --rm --name skiasharp-linux-$ABI-cross-$ARCH --volume $(pwd):/work skiasharp-linux-$ABI-cross-$ARCH /bin/bash -c "\
-        dotnet tool restore &&
-        dotnet cake --target=externals-linux-clang-cross --configuration=Release --buildarch=$ARCH --variant=$vendor")
+    docker run --rm --name skiasharp-linux-$ABI-cross-$ARCH --volume $(pwd):/work skiasharp-linux-$ABI-cross-$ARCH /bin/bash -c " \
+        dotnet tool restore ; \
+        dotnet cake --target=externals-linux-clang-cross --configuration=Release --buildarch=$ARCH $VARIANT ")
diff --git a/scripts/Docker/alpine/amd64/Dockerfile b/scripts/Docker/alpine/amd64/Dockerfile
index ec6b446d40..d1e0a4d4ca 100644
--- a/scripts/Docker/alpine/amd64/Dockerfile
+++ b/scripts/Docker/alpine/amd64/Dockerfile
@@ -10,7 +10,7 @@ RUN apk add --no-cache \
 
 # Install the .NET SDK
 ARG DOTNET_SDK_VERSION=8.0
-ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT 1
+ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
 RUN wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh \
     && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \
     && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \
diff --git a/scripts/Docker/alpine/arm64v8/Dockerfile b/scripts/Docker/alpine/arm64v8/Dockerfile
index bb90493524..0350af602f 100644
--- a/scripts/Docker/alpine/arm64v8/Dockerfile
+++ b/scripts/Docker/alpine/arm64v8/Dockerfile
@@ -10,7 +10,7 @@ RUN apk add --no-cache \
 
 # Install the .NET SDK
 ARG DOTNET_SDK_VERSION=8.0
-ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT 1
+ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
 RUN wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh \
     && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \
     && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \
diff --git a/scripts/Docker/alpine/clang-cross/Dockerfile b/scripts/Docker/alpine/clang-cross/Dockerfile
index 198beeb7c3..c6ffe4431c 100644
--- a/scripts/Docker/alpine/clang-cross/Dockerfile
+++ b/scripts/Docker/alpine/clang-cross/Dockerfile
@@ -1,43 +1,65 @@
 # Arguments:
 #   IMAGE_ARCH           - the architecture of the image                    [ amd64 | arm64v8 | riscv64 ]
 #   DOTNET_SDK_VERSION   - the version of dotnet for the Cake script        [ 8.0 | * ]
+#   LLVM_VERSION         - the version of the LLVM compiler                 [ 13 | * ]
 #   TOOLCHAIN_VERSION    - the version of the GCC toolchain                 [ 9 | * ]
 #   TOOLCHAIN_ARCH       - the architecture of the GCC toolchain            [ arm-alpine-linux-musleabihf | aarch64-alpine-linux-musl | riscv64-alpine-linux-musl ]
-#   TOOLCHAIN_ARCH_SHORT - the short form architecture of the GCC toolchain [ armhf | arm64 ]
-#   FONTCONFIG_VERSION   - the exact version of libfontconfig1 to use       [ 2.13.1-2 | * ]
 
 ARG IMAGE_ARCH=amd64
 FROM ${IMAGE_ARCH}/debian:12
 
+# Set the architecture-specific variables based on the value of the BUILD_ARCH argument
+ARG BUILD_ARCH=arm64
+RUN case ${BUILD_ARCH} in \
+        arm)     TOOLCHAIN_ARCH=armv7-alpine-linux-musleabihf ; TOOLCHAIN_ARCH_TARGET=armv7-alpine-linux-musleabihf ;; \
+        arm64)   TOOLCHAIN_ARCH=aarch64-alpine-linux-musl     ; TOOLCHAIN_ARCH_TARGET=aarch64-alpine-linux-musl     ;; \
+        riscv64) TOOLCHAIN_ARCH=riscv64-alpine-linux-musl     ; TOOLCHAIN_ARCH_TARGET=riscv64-alpine-linux-musl     ;; \
+        x86)     TOOLCHAIN_ARCH=i586-alpine-linux-musl        ; TOOLCHAIN_ARCH_TARGET=i586-alpine-linux-musl        ;; \
+        x64)     TOOLCHAIN_ARCH=x86_64-alpine-linux-musl      ; TOOLCHAIN_ARCH_TARGET=x86_64-alpine-linux-musl      ;; \
+        *) echo "Unsupported architecture: ${BUILD_ARCH}" && exit 1 ;; \
+    esac \
+    && echo "export TOOLCHAIN_ARCH=${TOOLCHAIN_ARCH}" > /etc/skia-env \
+    && echo "export TOOLCHAIN_ARCH_TARGET=${TOOLCHAIN_ARCH_TARGET}" >> /etc/skia-env
+
 # Install the required packages
+ARG LLVM_VERSION=19
 RUN apt-get update \
     && apt-get install -y \
-        curl python3 git clang-19 lld-19 ninja-build xz-utils curl \
+        curl python3 git clang-${LLVM_VERSION} lld-${LLVM_VERSION} ninja-build xz-utils \
     && rm -rf /var/lib/apt/lists/*
 
 # Install the cross-compilation musl toolchain
-ARG DISTRO_VERSION=3.17
-ARG TOOLCHAIN_ARCH_SHORT=armhf
+# First, obtain apk.static from https://gitlab.alpinelinux.org/alpine/apk-tools/-/releases/v2.12.14
 ARG MACHINE_ARCH=x86_64
-ARG TARGET_MACHINE_ARCH=armhf
-
-# obtain apk.static from gitlab.alpinelinux.org/alpine/apk-tools/-/releases/v2.12.14
-RUN APK_DIR="$(mktemp -d)" && \
-    curl -SLO --create-dirs --output-dir "$APK_DIR" "https://gitlab.alpinelinux.org/api/v4/projects/5/packages/generic/v2.12.14/$MACHINE_ARCH/apk.static" && \
-    chmod +x "$APK_DIR/apk.static" && \
-    "$APK_DIR/apk.static" \
+RUN . /etc/skia-env \
+    && case "${BUILD_ARCH}" in \
+         arm)     APK_ARCH=armv7   ;; \
+         arm64)   APK_ARCH=aarch64 ;; \
+         riscv64) APK_ARCH=riscv64 ;; \
+         x86)     APK_ARCH=x86     ;; \
+         x64)     APK_ARCH=x86_64  ;; \
+         *) echo "Unsupported architecture: ${BUILD_ARCH}" && exit 1 ;; \
+         esac \
+    && case "${BUILD_ARCH}" in \
+         riscv64) DISTRO_VERSION=3.20 ;; \
+         *)       DISTRO_VERSION=3.17 ;; \
+         esac \
+    && APK_DIR="$(mktemp -d)" \
+    && curl -SLO --create-dirs --output-dir "$APK_DIR" "https://gitlab.alpinelinux.org/api/v4/projects/5/packages/generic/v2.12.14/$MACHINE_ARCH/apk.static" \
+    && chmod +x "$APK_DIR/apk.static" \
+    && "$APK_DIR/apk.static" \
         -X "http://dl-cdn.alpinelinux.org/alpine/v$DISTRO_VERSION/main" \
         -X "http://dl-cdn.alpinelinux.org/alpine/v$DISTRO_VERSION/community" \
-        -U --allow-untrusted --root /alpine --arch "$TARGET_MACHINE_ARCH" --initdb add && \
-    "$APK_DIR/apk.static" \
+        -U --allow-untrusted --root /alpine --arch "$APK_ARCH" --initdb add \
+    && "$APK_DIR/apk.static" \
         -X "http://dl-cdn.alpinelinux.org/alpine/v$DISTRO_VERSION/main" \
         -X "http://dl-cdn.alpinelinux.org/alpine/v$DISTRO_VERSION/community" \
-        -U --allow-untrusted --root /alpine --arch "$TARGET_MACHINE_ARCH" --no-scripts \
+        -U --allow-untrusted --root /alpine --arch "$APK_ARCH" --no-scripts \
         add fontconfig-dev build-base linux-headers
 
 # Install the .NET SDK
 ARG DOTNET_SDK_VERSION=8.0
-ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT 1
+ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
 RUN curl https://dot.net/v1/dotnet-install.sh -L -o dotnet-install.sh \
     && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \
     && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \
@@ -45,6 +67,10 @@ RUN curl https://dot.net/v1/dotnet-install.sh -L -o dotnet-install.sh \
     && dotnet help \
     && dotnet --info
 
-ENV CC=clang-19 CXX=clang++-19
+ENV CC=clang-${LLVM_VERSION} CXX=clang++-${LLVM_VERSION}
 
 WORKDIR /work
+
+COPY ./startup.sh /
+RUN chmod +x /startup.sh
+ENTRYPOINT [ "/startup.sh" ]
diff --git a/scripts/Docker/alpine/clang-cross/build-local.sh b/scripts/Docker/alpine/clang-cross/build-local.sh
index 09e2e3273b..591b9d2d64 100755
--- a/scripts/Docker/alpine/clang-cross/build-local.sh
+++ b/scripts/Docker/alpine/clang-cross/build-local.sh
@@ -1,15 +1,11 @@
 #!/usr/bin/env bash
 set -ex
 
+# Parameters:
+# $1 - The target architecture to build for     [ arm | arm64 | riscv64 | x86 | x64 ]
+
 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 
-ARCH=$1
-ALPINE_VERSION=$3
-if [ -z "$ALPINE_VERSION" ]; then
-  case $ARCH in
-    riscv64) ALPINE_VERSION=3.20 ;;
-    *) ALPINE_VERSION=3.17       ;;
-  esac
-fi
+ARCH="${1:-arm}"
 
-$DIR/../../_clang-cross-common.sh "$DIR" "$ARCH" "$2" "$ALPINE_VERSION" "musl" "-alpine"
+$DIR/../../_clang-cross-common.sh "$DIR" "$ARCH" "musl" "alpine"
diff --git a/scripts/Docker/alpine/clang-cross/startup.sh b/scripts/Docker/alpine/clang-cross/startup.sh
new file mode 100644
index 0000000000..512bb431bf
--- /dev/null
+++ b/scripts/Docker/alpine/clang-cross/startup.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+set -e
+
+source /etc/skia-env
+
+exec "$@"
diff --git a/scripts/Docker/debian/amd64/Dockerfile b/scripts/Docker/debian/amd64/Dockerfile
index 4b7a51144e..320ee380b4 100644
--- a/scripts/Docker/debian/amd64/Dockerfile
+++ b/scripts/Docker/debian/amd64/Dockerfile
@@ -1,7 +1,7 @@
 # Arguments:
 #   DOTNET_SDK_VERSION   - the version of dotnet for the Cake script        [ 8.0 | * ]
 
-FROM amd64/debian:11
+FROM amd64/debian:10
 
 # Install the required packages
 RUN apt-get update \
@@ -12,7 +12,7 @@ RUN apt-get update \
 
 # Install the .NET SDK
 ARG DOTNET_SDK_VERSION=8.0
-ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT 1
+ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
 RUN curl https://dot.net/v1/dotnet-install.sh -L -o dotnet-install.sh \
     && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \
     && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \
diff --git a/scripts/Docker/debian/arm64v8/Dockerfile b/scripts/Docker/debian/arm64v8/Dockerfile
index 5a43b8592c..8ed6b69674 100644
--- a/scripts/Docker/debian/arm64v8/Dockerfile
+++ b/scripts/Docker/debian/arm64v8/Dockerfile
@@ -1,7 +1,7 @@
 # Arguments:
 #   DOTNET_SDK_VERSION   - the version of dotnet for the Cake script        [ 8.0 | * ]
 
-FROM arm64v8/debian:11
+FROM arm64v8/debian:10
 
 # Install the required packages
 RUN apt-get update \
@@ -12,7 +12,7 @@ RUN apt-get update \
 
 # Install the .NET SDK
 ARG DOTNET_SDK_VERSION=8.0
-ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT 1
+ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
 RUN curl https://dot.net/v1/dotnet-install.sh -L -o dotnet-install.sh \
     && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \
     && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \
diff --git a/scripts/Docker/debian/clang-cross/10/Dockerfile b/scripts/Docker/debian/clang-cross/10/Dockerfile
new file mode 100644
index 0000000000..4048aeccd0
--- /dev/null
+++ b/scripts/Docker/debian/clang-cross/10/Dockerfile
@@ -0,0 +1,82 @@
+# Arguments:
+#   IMAGE_ARCH           - the architecture of the image                    [ amd64 | arm64v8 | riscv64 ]
+#   DOTNET_SDK_VERSION   - the version of dotnet for the Cake script        [ 8.0 | * ]
+#   LLVM_VERSION         - the version of the LLVM compiler                 [ 13 | * ]
+#   TOOLCHAIN_VERSION    - the version of the GCC toolchain                 [ 9 | * ]
+#   TOOLCHAIN_ARCH       - the architecture of the GCC toolchain            [ arm-linux-gnueabihf | aarch64-linux-gnu | riscv64-linux-gnu ]
+#   TOOLCHAIN_ARCH_SHORT - the short form architecture of the GCC toolchain [ armhf | arm64 | riscv64 ]
+
+ARG IMAGE_ARCH=amd64
+FROM ${IMAGE_ARCH}/debian:10
+
+# Set the architecture-specific variables based on the value of the BUILD_ARCH argument
+ARG BUILD_ARCH=arm64
+RUN case ${BUILD_ARCH} in \
+        arm)     TOOLCHAIN_ARCH=arm-linux-gnueabihf   ; TOOLCHAIN_ARCH_SHORT=armhf   ; TOOLCHAIN_ARCH_TARGET=armv7a-linux-gnueabihf ;; \
+        arm64)   TOOLCHAIN_ARCH=aarch64-linux-gnu     ; TOOLCHAIN_ARCH_SHORT=arm64   ; TOOLCHAIN_ARCH_TARGET=aarch64-linux-gnu      ;; \
+        riscv64) TOOLCHAIN_ARCH=riscv64-linux-gnu     ; TOOLCHAIN_ARCH_SHORT=riscv64 ; TOOLCHAIN_ARCH_TARGET=riscv64-linux-gnu      ;; \
+        x86)     TOOLCHAIN_ARCH=i686-linux-gnu        ; TOOLCHAIN_ARCH_SHORT=i386    ; TOOLCHAIN_ARCH_TARGET=i686-linux-gnu         ;; \
+        x64)     TOOLCHAIN_ARCH=x86-64-linux-gnu      ; TOOLCHAIN_ARCH_SHORT=amd64   ; TOOLCHAIN_ARCH_TARGET=x86_64-linux-gnu       ;; \
+        *) echo "Unsupported architecture: ${BUILD_ARCH}" && exit 1 ;; \
+    esac \
+    && echo "export TOOLCHAIN_ARCH=${TOOLCHAIN_ARCH}" > /etc/skia-env \
+    && echo "export TOOLCHAIN_ARCH_SHORT=${TOOLCHAIN_ARCH_SHORT}" >> /etc/skia-env \
+    && echo "export TOOLCHAIN_ARCH_TARGET=${TOOLCHAIN_ARCH_TARGET}" >> /etc/skia-env
+
+# Install the required packages
+ARG LLVM_VERSION=13
+RUN apt-get update \
+    && apt-get install -y \
+        curl python3 git clang-${LLVM_VERSION} lld-${LLVM_VERSION} ninja-build xz-utils \
+    && rm -rf /var/lib/apt/lists/*
+
+# Install the cross-compilation GCC toolchain
+ARG TOOLCHAIN_VERSION=8
+RUN . /etc/skia-env \
+    && apt-get update \
+    && apt-get install -y \
+       libstdc++-${TOOLCHAIN_VERSION}-dev-${TOOLCHAIN_ARCH_SHORT}-cross \
+       libgcc-${TOOLCHAIN_VERSION}-dev-${TOOLCHAIN_ARCH_SHORT}-cross \
+       binutils-${TOOLCHAIN_ARCH} \
+    && rm -rf /var/lib/apt/lists/*
+
+# Make the script more flexible and use "current" instead of the actual version
+RUN . /etc/skia-env \
+    && TOOLCHAIN_ARCH=$(echo ${TOOLCHAIN_ARCH} | sed 's/x86-64/x86_64/g') \
+    && ln -s /usr/${TOOLCHAIN_ARCH}/include/c++/${TOOLCHAIN_VERSION} /usr/${TOOLCHAIN_ARCH}/include/c++/current \
+    && sed -i "s/\/usr\/${TOOLCHAIN_ARCH}\/lib\///g" /usr/${TOOLCHAIN_ARCH}/lib/libpthread.so \
+    && sed -i "s/\/usr\/${TOOLCHAIN_ARCH}\/lib\///g" /usr/${TOOLCHAIN_ARCH}/lib/libc.so
+
+# Install the cross-compilation skia build dependencies (fontconfig)
+RUN . /etc/skia-env \
+    && mkdir -p /skia-utils/libfontconfig-dev \
+    && cd /skia-utils/libfontconfig-dev \
+    && case "${TOOLCHAIN_ARCH_SHORT}" in \
+         riscv64) FC_VERSION=2.15.0-2.1 ; FC_PKG=libfontconfig-dev  ;; \
+         *)       FC_VERSION=2.13.1-2   ; FC_PKG=libfontconfig1-dev ;; \
+       esac \
+    && curl http://deb.debian.org/debian/pool/main/f/fontconfig/${FC_PKG}_${FC_VERSION}_${TOOLCHAIN_ARCH_SHORT}.deb -L -o libfontconfig-dev.deb \
+    && ar vx libfontconfig-dev.deb \
+    && tar -xJvf data.tar.xz \
+    && rm libfontconfig-dev.deb \
+    && TOOLCHAIN_ARCH=$(echo ${TOOLCHAIN_ARCH} | sed 's/x86-64/x86_64/g') \
+    && cp -R usr/lib/*/* /usr/${TOOLCHAIN_ARCH}/lib/ \
+    && cp -R usr/include/* /usr/${TOOLCHAIN_ARCH}/include/
+
+# Install the .NET SDK
+ARG DOTNET_SDK_VERSION=8.0
+ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
+RUN curl https://dot.net/v1/dotnet-install.sh -L -o dotnet-install.sh \
+    && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \
+    && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \
+    && rm dotnet-install.sh \
+    && dotnet help \
+    && dotnet --info
+
+ENV CC=clang-${LLVM_VERSION} CXX=clang++-${LLVM_VERSION}
+
+WORKDIR /work
+
+COPY ./startup.sh /
+RUN chmod +x /startup.sh
+ENTRYPOINT [ "/startup.sh" ]
diff --git a/scripts/Docker/debian/clang-cross/10/startup.sh b/scripts/Docker/debian/clang-cross/10/startup.sh
new file mode 100644
index 0000000000..512bb431bf
--- /dev/null
+++ b/scripts/Docker/debian/clang-cross/10/startup.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+set -e
+
+source /etc/skia-env
+
+exec "$@"
diff --git a/scripts/Docker/debian/clang-cross/11/Dockerfile b/scripts/Docker/debian/clang-cross/11/Dockerfile
deleted file mode 100644
index fefaa6d40b..0000000000
--- a/scripts/Docker/debian/clang-cross/11/Dockerfile
+++ /dev/null
@@ -1,64 +0,0 @@
-# Arguments:
-#   IMAGE_ARCH           - the architecture of the image                    [ amd64 | arm64v8 ]
-#   DOTNET_SDK_VERSION   - the version of dotnet for the Cake script        [ 8.0 | * ]
-#   TOOLCHAIN_VERSION    - the version of the GCC toolchain                 [ 9 | * ]
-#   TOOLCHAIN_ARCH       - the architecture of the GCC toolchain            [ arm-linux-gnueabihf | aarch64-linux-gnu]
-#   TOOLCHAIN_ARCH_SHORT - the short form architecture of the GCC toolchain [ armhf | arm64 ]
-#   FONTCONFIG_VERSION   - the exact version of libfontconfig1 to use       [ 2.13.1-2 | * ]
-
-ARG IMAGE_ARCH=amd64
-FROM ${IMAGE_ARCH}/debian:11
-
-# Install the required packages
-RUN apt-get update \
-    && apt-get install -y \
-        curl python3 git clang-13 ninja-build xz-utils \
-    && rm -rf /var/lib/apt/lists/*
-
-# Install the cross-compilation GCC toolchain
-ARG TOOLCHAIN_VERSION=9
-ARG TOOLCHAIN_ARCH=arm-linux-gnueabihf
-ARG TOOLCHAIN_ARCH_SHORT=armhf
-RUN apt-get update \
-    && apt-get install -y \
-       libstdc++-${TOOLCHAIN_VERSION}-dev-${TOOLCHAIN_ARCH_SHORT}-cross \
-       libgcc-${TOOLCHAIN_VERSION}-dev-${TOOLCHAIN_ARCH_SHORT}-cross \
-       binutils-${TOOLCHAIN_ARCH} \
-    && rm -rf /var/lib/apt/lists/*
-
-# Make the script more flexible and use "current" instead of the actual version
-RUN ln -s /usr/${TOOLCHAIN_ARCH}/include/c++/${TOOLCHAIN_VERSION} /usr/${TOOLCHAIN_ARCH}/include/c++/current \
-    && sed -i "s/\/usr\/${TOOLCHAIN_ARCH}\/lib\///g" /usr/${TOOLCHAIN_ARCH}/lib/libpthread.so \
-    && sed -i "s/\/usr\/${TOOLCHAIN_ARCH}\/lib\///g" /usr/${TOOLCHAIN_ARCH}/lib/libc.so
-
-# Install the cross-compilation skia build dependencies (fontconfig)
-ARG FONTCONFIG_VERSION=2.13.1-2
-RUN (mkdir -p /skia-utils/libfontconfig1-dev \
-    && cd /skia-utils/libfontconfig1-dev \
-    && curl http://deb.debian.org/debian/pool/main/f/fontconfig/libfontconfig1-dev_${FONTCONFIG_VERSION}_${TOOLCHAIN_ARCH_SHORT}.deb -L -o libfontconfig1-dev.deb \
-    && ar vx libfontconfig1-dev.deb \
-    && tar -xJvf data.tar.xz \
-    && rm libfontconfig1-dev.deb \
-    && cp -R usr/lib/*/* /usr/${TOOLCHAIN_ARCH}/lib/ \
-    && cp -R usr/include/* /usr/${TOOLCHAIN_ARCH}/include/ )
-RUN (mkdir -p /skia-utils/libfontconfig1 \
-    && cd /skia-utils/libfontconfig1 \
-    && curl http://deb.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_${FONTCONFIG_VERSION}_${TOOLCHAIN_ARCH_SHORT}.deb -L -o libfontconfig1.deb \
-    && ar vx libfontconfig1.deb \
-    && tar -xJvf data.tar.xz \
-    && rm libfontconfig1.deb \
-    && cp -R usr/lib/*/* /usr/${TOOLCHAIN_ARCH}/lib/ )
-
-# Install the .NET SDK
-ARG DOTNET_SDK_VERSION=8.0
-ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT 1
-RUN curl https://dot.net/v1/dotnet-install.sh -L -o dotnet-install.sh \
-    && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \
-    && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \
-    && rm dotnet-install.sh \
-    && dotnet help \
-    && dotnet --info
-
-ENV CC=clang-13 CXX=clang++-13
-
-WORKDIR /work
diff --git a/scripts/Docker/debian/clang-cross/12/Dockerfile b/scripts/Docker/debian/clang-cross/12/Dockerfile
index 1a7eb845e5..8625586388 100644
--- a/scripts/Docker/debian/clang-cross/12/Dockerfile
+++ b/scripts/Docker/debian/clang-cross/12/Dockerfile
@@ -1,25 +1,39 @@
 # Arguments:
 #   IMAGE_ARCH           - the architecture of the image                    [ amd64 | arm64v8 | riscv64 ]
 #   DOTNET_SDK_VERSION   - the version of dotnet for the Cake script        [ 8.0 | * ]
-#   TOOLCHAIN_VERSION    - the version of the GCC toolchain                 [ 9 | * ]
+#   LLVM_VERSION         - the version of the LLVM compiler                 [ 19 | * ]
+#   TOOLCHAIN_VERSION    - the version of the GCC toolchain                 [ 12 | * ]
 #   TOOLCHAIN_ARCH       - the architecture of the GCC toolchain            [ arm-linux-gnueabihf | aarch64-linux-gnu | riscv64-linux-gnu ]
-#   TOOLCHAIN_ARCH_SHORT - the short form architecture of the GCC toolchain [ armhf | arm64 ]
-#   FONTCONFIG_VERSION   - the exact version of libfontconfig1 to use       [ 2.13.1-2 | * ]
+#   TOOLCHAIN_ARCH_SHORT - the short form architecture of the GCC toolchain [ armhf | arm64 | riscv64 ]
 
 ARG IMAGE_ARCH=amd64
 FROM ${IMAGE_ARCH}/debian:12
 
+# Set the architecture-specific variables based on the value of the BUILD_ARCH argument
+ARG BUILD_ARCH=arm64
+RUN case ${BUILD_ARCH} in \
+        arm)     TOOLCHAIN_ARCH=arm-linux-gnueabihf   ; TOOLCHAIN_ARCH_SHORT=armhf   ; TOOLCHAIN_ARCH_TARGET=armv7a-linux-gnueabihf ;; \
+        arm64)   TOOLCHAIN_ARCH=aarch64-linux-gnu     ; TOOLCHAIN_ARCH_SHORT=arm64   ; TOOLCHAIN_ARCH_TARGET=aarch64-linux-gnu      ;; \
+        riscv64) TOOLCHAIN_ARCH=riscv64-linux-gnu     ; TOOLCHAIN_ARCH_SHORT=riscv64 ; TOOLCHAIN_ARCH_TARGET=riscv64-linux-gnu      ;; \
+        x86)     TOOLCHAIN_ARCH=i686-linux-gnu        ; TOOLCHAIN_ARCH_SHORT=i386    ; TOOLCHAIN_ARCH_TARGET=i686-linux-gnu         ;; \
+        x64)     TOOLCHAIN_ARCH=x86-64-linux-gnu      ; TOOLCHAIN_ARCH_SHORT=amd64   ; TOOLCHAIN_ARCH_TARGET=x86_64-linux-gnu       ;; \
+        *) echo "Unsupported architecture: ${BUILD_ARCH}" && exit 1 ;; \
+    esac \
+    && echo "export TOOLCHAIN_ARCH=${TOOLCHAIN_ARCH}" > /etc/skia-env \
+    && echo "export TOOLCHAIN_ARCH_SHORT=${TOOLCHAIN_ARCH_SHORT}" >> /etc/skia-env \
+    && echo "export TOOLCHAIN_ARCH_TARGET=${TOOLCHAIN_ARCH_TARGET}" >> /etc/skia-env
+
 # Install the required packages
+ARG LLVM_VERSION=19
 RUN apt-get update \
     && apt-get install -y \
-        curl python3 git clang-19 ninja-build xz-utils \
+        curl python3 git clang-${LLVM_VERSION} ninja-build xz-utils \
     && rm -rf /var/lib/apt/lists/*
 
 # Install the cross-compilation GCC toolchain
 ARG TOOLCHAIN_VERSION=12
-ARG TOOLCHAIN_ARCH=arm-linux-gnueabihf
-ARG TOOLCHAIN_ARCH_SHORT=armhf
-RUN apt-get update \
+RUN . /etc/skia-env \
+    && apt-get update \
     && apt-get install -y \
        libstdc++-${TOOLCHAIN_VERSION}-dev-${TOOLCHAIN_ARCH_SHORT}-cross \
        libgcc-${TOOLCHAIN_VERSION}-dev-${TOOLCHAIN_ARCH_SHORT}-cross \
@@ -27,31 +41,31 @@ RUN apt-get update \
     && rm -rf /var/lib/apt/lists/*
 
 # Make the script more flexible and use "current" instead of the actual version
-RUN ln -s /usr/${TOOLCHAIN_ARCH}/include/c++/${TOOLCHAIN_VERSION} /usr/${TOOLCHAIN_ARCH}/include/c++/current \
-    && sed -i "s/\/usr\/${TOOLCHAIN_ARCH}\/lib\///g" /usr/${TOOLCHAIN_ARCH}/lib/libpthread.so || true \
+RUN . /etc/skia-env \
+    && TOOLCHAIN_ARCH=$(echo ${TOOLCHAIN_ARCH} | sed 's/x86-64/x86_64/g') \
+    && ln -s /usr/${TOOLCHAIN_ARCH}/include/c++/${TOOLCHAIN_VERSION} /usr/${TOOLCHAIN_ARCH}/include/c++/current \
+    && sed -i "s/\/usr\/${TOOLCHAIN_ARCH}\/lib\///g" /usr/${TOOLCHAIN_ARCH}/lib/libpthread.so \
     && sed -i "s/\/usr\/${TOOLCHAIN_ARCH}\/lib\///g" /usr/${TOOLCHAIN_ARCH}/lib/libc.so
 
 # Install the cross-compilation skia build dependencies (fontconfig)
-ARG FONTCONFIG_VERSION=2.15.0-2
-RUN (mkdir -p /skia-utils/libfontconfig1-dev \
-    && cd /skia-utils/libfontconfig1-dev \
-    && curl http://deb.debian.org/debian/pool/main/f/fontconfig/libfontconfig-dev_${FONTCONFIG_VERSION}_${TOOLCHAIN_ARCH_SHORT}.deb -L -o libfontconfig1-dev.deb \
-    && ar vx libfontconfig1-dev.deb \
+RUN . /etc/skia-env \
+    && mkdir -p /skia-utils/libfontconfig-dev \
+    && cd /skia-utils/libfontconfig-dev \
+    && case "${TOOLCHAIN_ARCH_SHORT}" in \
+         riscv64) FC_VERSION=2.15.0-2.1 ; FC_PKG=libfontconfig-dev  ;; \
+         *)       FC_VERSION=2.13.1-2   ; FC_PKG=libfontconfig1-dev ;; \
+       esac \
+    && curl http://deb.debian.org/debian/pool/main/f/fontconfig/${FC_PKG}_${FC_VERSION}_${TOOLCHAIN_ARCH_SHORT}.deb -L -o libfontconfig-dev.deb \
+    && ar vx libfontconfig-dev.deb \
     && tar -xJvf data.tar.xz \
-    && rm libfontconfig1-dev.deb \
+    && rm libfontconfig-dev.deb \
+    && TOOLCHAIN_ARCH=$(echo ${TOOLCHAIN_ARCH} | sed 's/x86-64/x86_64/g') \
     && cp -R usr/lib/*/* /usr/${TOOLCHAIN_ARCH}/lib/ \
-    && cp -R usr/include/* /usr/${TOOLCHAIN_ARCH}/include/ )
-RUN (mkdir -p /skia-utils/libfontconfig1 \
-    && cd /skia-utils/libfontconfig1 \
-    && curl http://deb.debian.org/debian/pool/main/f/fontconfig/libfontconfig1_${FONTCONFIG_VERSION}_${TOOLCHAIN_ARCH_SHORT}.deb -L -o libfontconfig1.deb \
-    && ar vx libfontconfig1.deb \
-    && tar -xJvf data.tar.xz \
-    && rm libfontconfig1.deb \
-    && cp -R usr/lib/*/* /usr/${TOOLCHAIN_ARCH}/lib/ )
+    && cp -R usr/include/* /usr/${TOOLCHAIN_ARCH}/include/
 
 # Install the .NET SDK
 ARG DOTNET_SDK_VERSION=8.0
-ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT 1
+ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
 RUN curl https://dot.net/v1/dotnet-install.sh -L -o dotnet-install.sh \
     && bash dotnet-install.sh --channel ${DOTNET_SDK_VERSION} --install-dir /usr/share/dotnet --verbose \
     && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \
@@ -59,6 +73,10 @@ RUN curl https://dot.net/v1/dotnet-install.sh -L -o dotnet-install.sh \
     && dotnet help \
     && dotnet --info
 
-ENV CC=clang-19 CXX=clang++-19
+ENV CC=clang-${LLVM_VERSION} CXX=clang++-${LLVM_VERSION}
 
 WORKDIR /work
+
+COPY ./startup.sh /
+RUN chmod +x /startup.sh
+ENTRYPOINT [ "/startup.sh" ]
diff --git a/scripts/Docker/debian/clang-cross/12/startup.sh b/scripts/Docker/debian/clang-cross/12/startup.sh
new file mode 100644
index 0000000000..512bb431bf
--- /dev/null
+++ b/scripts/Docker/debian/clang-cross/12/startup.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+set -e
+
+source /etc/skia-env
+
+exec "$@"
diff --git a/scripts/Docker/debian/clang-cross/build-local.sh b/scripts/Docker/debian/clang-cross/build-local.sh
old mode 100755
new mode 100644
index c678b60e66..e1f5249d93
--- a/scripts/Docker/debian/clang-cross/build-local.sh
+++ b/scripts/Docker/debian/clang-cross/build-local.sh
@@ -1,15 +1,13 @@
 #!/usr/bin/env bash
 set -ex
 
+# Parameters:
+# $1 - The target architecture to build for     [ arm | arm64 | riscv64 | x86 | x64 ]
+# $2 - The Debian distro version                [ 10 | 12 ]
+
 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 
-ARCH=$1
-DEBIAN_VERSION=$3
-if [ -z "$DEBIAN_VERSION" ]; then
-  case $ARCH in
-    riscv64) DEBIAN_VERSION=12 ;;
-    *) DEBIAN_VERSION=11       ;;
-  esac
-fi
+ARCH="${1:-arm}"
+DEBIAN_VERSION="${2:-10}"
 
-$DIR/../../_clang-cross-common.sh "$DIR/$DEBIAN_VERSION" "$ARCH" "$2" "$DEBIAN_VERSION" "gnu"
+$DIR/../../_clang-cross-common.sh "$DIR/$DEBIAN_VERSION" "$ARCH" "gnu"
diff --git a/scripts/azure-templates-linux-matrix.yml b/scripts/azure-templates-linux-matrix.yml
index 26681ce2d0..ce581f75a8 100644
--- a/scripts/azure-templates-linux-matrix.yml
+++ b/scripts/azure-templates-linux-matrix.yml
@@ -31,6 +31,6 @@ jobs:
           buildAgent: ${{ parameters.buildAgent }}
           use1ESPipelineTemplates: ${{ parameters.use1ESPipelineTemplates }}
           docker: ${{ item.docker }}
-          dockerArgs: ${{ item.dockerArgs }}
+          dockerArgs: --build-arg BUILD_ARCH=${{ item.arch }} ${{ item.dockerArgs }}
           target: ${{ coalesce(item.target, 'externals-linux') }}
           additionalArgs: --buildarch=${{ item.arch }} --variant=${{ coalesce(item.variant, 'linux') }}${{ build.name }} --gnArgs="\"${{ build.gnArgs }} ${{ item.gnArgs }}\"" ${{ build.additionalArgs }} ${{ item.additionalArgs }}
\ No newline at end of file
diff --git a/scripts/azure-templates-merger.yml b/scripts/azure-templates-merger.yml
index 47b634bcf8..1df451b5db 100644
--- a/scripts/azure-templates-merger.yml
+++ b/scripts/azure-templates-merger.yml
@@ -18,18 +18,11 @@ jobs:
       skipInstall: true
       skipSteps: true
       requiredArtifacts: ${{ parameters.requiredArtifacts }}
-      # preBuildSteps:
-      #   - pwsh: az devops configure --defaults organization=$(System.TeamFoundationCollectionUri) project=$(System.TeamProject) --use-git-aliases true
-      #     displayName: Configure the az CLI tool
-      #   - ${{ each artifact in parameters.matrixArtifacts }}:
-      #     - pwsh: |
-      #         $json=@'
-      #         ${{ artifact.jobs }}
-      #         '@
-      #         .\scripts\download-artifact.ps1 `
-      #           -ArtifactsJson $json `
-      #           -BuildId "$(Build.BuildId)" `
-      #           -OutputDirectory "$(Build.SourcesDirectory)/output"
-      #       env:
-      #         AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
-      #       displayName: Download the pre-built ${{ artifact.name }} artifacts
+      preBuildSteps:
+        - ${{ each artifact in parameters.matrixArtifacts }}:
+          - pwsh: |
+              $json=@'
+              ${{ artifact.jobs }}
+              '@
+              .\scripts\get-artifact-names.ps1 -ArtifactsJson $json
+            displayName: List the pre-built ${{ artifact.name }} artifacts
diff --git a/scripts/azure-templates-stages.yml b/scripts/azure-templates-stages.yml
index aba496d9cb..f49bc35c0c 100644
--- a/scripts/azure-templates-stages.yml
+++ b/scripts/azure-templates-stages.yml
@@ -362,30 +362,15 @@ stages:
             matrix:
               - arch: x64
                 docker: scripts/Docker/debian/amd64
-              - arch: x64
-                variant: alpine
-                docker: scripts/Docker/alpine/amd64
-              - arch: arm
-                docker: scripts/Docker/debian/clang-cross/11
-                target: externals-linux-clang-cross
-              - arch: arm64
-                docker: scripts/Docker/debian/clang-cross/11
-                dockerArgs: --build-arg TOOLCHAIN_ARCH=aarch64-linux-gnu --build-arg TOOLCHAIN_ARCH_SHORT=arm64
-                target: externals-linux-clang-cross
-              - arch: riscv64
-                docker: scripts/Docker/debian/clang-cross/12
-                dockerArgs: --build-arg TOOLCHAIN_ARCH=riscv64-linux-gnu --build-arg TOOLCHAIN_ARCH_SHORT=riscv64 --build-arg DISTRO_VERSION=12
-                target: externals-linux-clang-cross
-              - arch: arm64
-                variant: alpine
-                docker: scripts/Docker/alpine/clang-cross
-                dockerArgs: --build-arg TOOLCHAIN_ARCH=aarch64-alpine-linux-musl --build-arg TOOLCHAIN_ARCH_SHORT=arm64 --build-arg TARGET_MACHINE_ARCH=aarch64
-                target: externals-linux-clang-cross
-              - arch: riscv64
-                variant: alpine
-                docker: scripts/Docker/alpine/clang-cross
-                dockerArgs: --build-arg TOOLCHAIN_ARCH=riscv64-alpine-linux-musl --build-arg TOOLCHAIN_ARCH_SHORT=riscv64 --build-arg TARGET_MACHINE_ARCH=riscv64 --build-arg DISTRO_VERSION=3.20
-                target: externals-linux-clang-cross
+              - ${{ each arch in split('arm,arm64,x86,riscv64', ',') }}: # separate x64 as it fails when cross-compiling
+                - arch: ${{ arch }}
+                  docker: scripts/Docker/debian/clang-cross/10
+                  target: externals-linux-clang-cross
+              - ${{ each arch in split('arm,arm64,x64,riscv64', ',') }}: # removed x86 as it is having issues building
+                - arch: ${{ arch }}
+                  variant: alpine
+                  docker: scripts/Docker/alpine/clang-cross
+                  target: externals-linux-clang-cross
         - template: /scripts/azure-templates-bootstrapper.yml@self # Build Native Tizen (Linux)
           parameters:
             name: native_tizen_linux
@@ -532,6 +517,8 @@ stages:
               - name: native_linux_arm64_alpine_nodeps_linux
               - name: native_linux_arm64_linux
               - name: native_linux_arm64_nodeps_linux
+              - name: native_linux_arm_alpine_linux
+              - name: native_linux_arm_alpine_nodeps_linux
               - name: native_linux_arm_linux
               - name: native_linux_arm_nodeps_linux
               - name: native_linux_riscv64_alpine_linux
@@ -542,6 +529,8 @@ stages:
               - name: native_linux_x64_alpine_nodeps_linux
               - name: native_linux_x64_linux
               - name: native_linux_x64_nodeps_linux
+              - name: native_linux_x86_linux
+              - name: native_linux_x86_nodeps_linux
               # WASM
               - name: native_wasm_2_0_23_linux
               - name: native_wasm_2_0_6_linux
@@ -572,22 +561,6 @@ stages:
             buildPipelineType: ${{ parameters.buildPipelineType }}
             buildAgent: ${{ parameters.buildAgentHost }}
             requiredArtifacts:
-              # Linux
-              - name: native_linux_arm64_linux
-              - name: native_linux_arm64_nodeps_linux
-              - name: native_linux_arm64_alpine_linux
-              - name: native_linux_arm64_alpine_nodeps_linux
-              - name: native_linux_arm_linux
-              - name: native_linux_arm_nodeps_linux
-              - name: native_linux_riscv64_alpine_linux
-              - name: native_linux_riscv64_alpine_nodeps_linux
-              - name: native_linux_riscv64_linux
-              - name: native_linux_riscv64_nodeps_linux
-              - name: native_linux_x64_alpine_linux
-              - name: native_linux_x64_alpine_nodeps_linux
-              - name: native_linux_x64_linux
-              - name: native_linux_x64_nodeps_linux
-              # WASM
               - name: native_wasm_2_0_23_linux
               - name: native_wasm_2_0_6_linux
               - name: native_wasm_3_1_12_linux
@@ -910,7 +883,6 @@ stages:
             requiredArtifacts:
               - name: native_linux_x64_linux
               - name: native_linux_arm64_linux
-              - name: native_linux_riscv64_linux
             postBuildSteps:
               - task: PublishTestResults@2
                 displayName: Publish the .NET Core test results
diff --git a/scripts/cake/shared.cake b/scripts/cake/shared.cake
index fca02d0ae1..c2ab2656d9 100644
--- a/scripts/cake/shared.cake
+++ b/scripts/cake/shared.cake
@@ -105,6 +105,18 @@ string GetRegexValue(string regex, FilePath file)
     }
 }
 
+List<string> MatchRegex(string regex, params string[] lines)
+{
+    var matches = new List<string>();
+    foreach (var line in lines) {
+        var match = Regex.Match(line, regex, RegexOptions.IgnoreCase | RegexOptions.Multiline);
+        if (match.Success) {
+            matches.Add(match.Groups[1].Value.Trim());
+        }
+    }
+    return matches;
+}
+
 void DeleteDir(DirectoryPath dir)
 {
     if (DirectoryExists(dir))
diff --git a/scripts/get-artifact-names.ps1 b/scripts/get-artifact-names.ps1
new file mode 100644
index 0000000000..ced580726a
--- /dev/null
+++ b/scripts/get-artifact-names.ps1
@@ -0,0 +1,26 @@
+Param (
+    [Parameter(Mandatory, ValueFromPipeline)] [string] $ArtifactsJson
+)
+
+Write-Host "Using JSON:"
+Write-Host "============================================================"
+Write-Host $ArtifactsJson
+Write-Host "============================================================"
+Write-Host ""
+
+Write-Host "Looking for artifacts..."
+$json = ConvertFrom-Json $ArtifactsJson
+$objects = $json | Get-Member -MemberType NoteProperty
+$names = $objects | ForEach-Object { $json."$($_.Name)".name }
+
+Write-Host "Found $($names.Count) item[s]:"
+$names | ForEach-Object { Write-Host " - $_" }
+
+$actualNames = $names | Where-Object { $json."$_".result -ne "Skipped" }
+$skippedNames = $names | Where-Object { $actualNames -notcontains $_ }
+
+Write-Host "Final $($actualNames.Count) item[s]:"
+$actualNames | ForEach-Object { Write-Host " - $_" }
+
+Write-Host "Skipping $($skippedNames.Count) item[s]:"
+$skippedNames | ForEach-Object { Write-Host " - $_" }