aboutsummaryrefslogtreecommitdiff
path: root/toolchains/ue_clang.lua
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2026-03-04 14:00:34 +0100
committerGitHub Enterprise <[email protected]>2026-03-04 14:00:34 +0100
commit794f093057c58c4909a0653edb54fdf869560596 (patch)
treea730072e40f7eb60c7761ffb44c939aa1ad981bb /toolchains/ue_clang.lua
parentIterateChunks callback is multithreaded - make sure AttachmentsSize can handl... (diff)
downloadzen-794f093057c58c4909a0653edb54fdf869560596.tar.xz
zen-794f093057c58c4909a0653edb54fdf869560596.zip
native xmake toolchain definition for UE-clang (#805)
This change is meant to provide a smoother experience when working on Linux. After this change, the toolchain setup process is now simply ```bash $ scripts/ue_build_linux/get_ue_toolchain.sh ``` and then at config time the toolchain is automatically detected if you downloaded it to the default location or have the `UE_TOOLCHAIN_DIR` environment variable set ```bash xmake config --mode=debug ``` Compared to the old script-based approach this configures the toolchain more precisely, avoiding leakage into unrelated build processes such as when a package manager decides to build something like Ninja locally etc.
Diffstat (limited to 'toolchains/ue_clang.lua')
-rw-r--r--toolchains/ue_clang.lua60
1 files changed, 60 insertions, 0 deletions
diff --git a/toolchains/ue_clang.lua b/toolchains/ue_clang.lua
new file mode 100644
index 000000000..8a1efcc04
--- /dev/null
+++ b/toolchains/ue_clang.lua
@@ -0,0 +1,60 @@
+-- Copyright Epic Games, Inc. All Rights Reserved.
+
+-- Custom toolchain for building with the Unreal Engine Linux clang toolchain.
+--
+-- Usage:
+-- xmake config --toolchain=ue-clang [--sdk=/path/to/ue-toolchain]
+--
+-- If --sdk is not given, the toolchain is resolved in order:
+-- 1. $UE_TOOLCHAIN_DIR environment variable
+-- 2. ~/.ue-toolchain (default get_ue_toolchain.sh download location)
+
+toolchain("ue-clang")
+ set_kind("standalone")
+
+ on_load(function (toolchain)
+ -- Resolve SDK directory: --sdk flag > $UE_TOOLCHAIN_DIR > ~/.ue-toolchain
+ local sdkdir = toolchain:sdkdir()
+ if not sdkdir or sdkdir == "" then
+ sdkdir = os.getenv("UE_TOOLCHAIN_DIR")
+ end
+ if not sdkdir or sdkdir == "" then
+ local default_path = path.join(os.getenv("HOME"), ".ue-toolchain")
+ if os.isdir(default_path) then
+ sdkdir = default_path
+ end
+ end
+ if not sdkdir or sdkdir == "" then
+ return
+ end
+
+ toolchain:config_set("sdkdir", sdkdir)
+
+ local bindir = path.join(sdkdir, "bin")
+
+ -- Compiler and linker tools
+ toolchain:set("toolset", "cc", path.join(bindir, "clang"))
+ toolchain:set("toolset", "cxx", path.join(bindir, "clang++"))
+ toolchain:set("toolset", "ld", path.join(bindir, "clang++"))
+ toolchain:set("toolset", "sh", path.join(bindir, "clang++"))
+ toolchain:set("toolset", "ar", path.join(bindir, "llvm-ar"))
+ toolchain:set("toolset", "strip", path.join(bindir, "llvm-strip"))
+ toolchain:set("toolset", "objcopy", path.join(bindir, "llvm-objcopy"))
+ toolchain:set("toolset", "as", path.join(bindir, "clang"))
+ toolchain:set("toolset", "ranlib", path.join(bindir, "llvm-ranlib"))
+
+ -- Sysroot and stdlib flags for both C and C++
+ local sysroot_flag = "--sysroot=" .. sdkdir
+ toolchain:add("cxflags", sysroot_flag, {force = true})
+ toolchain:add("cxflags", "-stdlib=libc++", {force = true})
+
+ -- Linker flags: sysroot and stdlib selection only.
+ -- Static libc++ overrides are applied at project level (xmake.lua) so they
+ -- don't leak into cmake package builds (e.g. sentry-native/crashpad).
+ toolchain:add("ldflags", sysroot_flag, {force = true})
+ toolchain:add("ldflags", "-stdlib=libc++", {force = true})
+
+ toolchain:add("shflags", sysroot_flag, {force = true})
+ toolchain:add("shflags", "-stdlib=libc++", {force = true})
+ end)
+toolchain_end()