aboutsummaryrefslogtreecommitdiff
path: root/toolchains/ue_clang.lua
blob: 1fdb05ff93931820dd868c6af9d5461dca9120a9 (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
-- 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, "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"))

        -- 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()