From 794f093057c58c4909a0653edb54fdf869560596 Mon Sep 17 00:00:00 2001 From: Stefan Boberg Date: Wed, 4 Mar 2026 14:00:34 +0100 Subject: 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. --- toolchains/ue_clang.lua | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ toolchains/xmake.lua | 3 +++ 2 files changed, 63 insertions(+) create mode 100644 toolchains/ue_clang.lua create mode 100644 toolchains/xmake.lua (limited to 'toolchains') 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() diff --git a/toolchains/xmake.lua b/toolchains/xmake.lua new file mode 100644 index 000000000..2817a1586 --- /dev/null +++ b/toolchains/xmake.lua @@ -0,0 +1,3 @@ +-- Copyright Epic Games, Inc. All Rights Reserved. + +includes("ue_clang.lua") -- cgit v1.2.3 From 2f0d60cb431ffefecf3e0a383528691be74af21b Mon Sep 17 00:00:00 2001 From: Stefan Boberg Date: Thu, 5 Mar 2026 14:31:27 +0100 Subject: oidctoken tool package (#810) * added OidcToken binary to the build process. The binary is mirrored from p4 and is placed next to the output of the build process. It is also placed in the release zip archives. * also fixed issue with Linux symbol stripping which was introduced in toolchain changes yesterday --- toolchains/ue_clang.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'toolchains') diff --git a/toolchains/ue_clang.lua b/toolchains/ue_clang.lua index 8a1efcc04..1fdb05ff9 100644 --- a/toolchains/ue_clang.lua +++ b/toolchains/ue_clang.lua @@ -38,7 +38,7 @@ toolchain("ue-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", "strip", path.join(bindir, "x86_64-unknown-linux-gnu-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")) -- cgit v1.2.3