summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-12-20 00:39:28 +0800
committerruki <[email protected]>2025-12-20 00:39:28 +0800
commit8d574375d0f0a496046987541091dca48fad3f5a (patch)
treecb6529e000f25736d79916083ff1829c684ec1e1
parent3608bf0165ec41d87c93137ae6aaf2eb3c82f86b (diff)
improve clang toolchain
-rw-r--r--xmake/toolchains/clang/load.lua102
-rw-r--r--xmake/toolchains/clang/toolchain_clang.lua30
2 files changed, 75 insertions, 57 deletions
diff --git a/xmake/toolchains/clang/load.lua b/xmake/toolchains/clang/load.lua
index 6e6e5ba6d..3a15f3268 100644
--- a/xmake/toolchains/clang/load.lua
+++ b/xmake/toolchains/clang/load.lua
@@ -52,52 +52,98 @@ function _add_vsenv(toolchain, name, curenvs)
end
end
-function main(toolchain, suffix)
+function _load_windows(toolchain, suffix)
+
+ -- add vs environments
+ local expect_vars = {"PATH", "LIB", "INCLUDE", "LIBPATH"}
+ local curenvs = os.getenvs()
+ for _, name in ipairs(expect_vars) do
+ _add_vsenv(toolchain, name, curenvs)
+ end
+ for _, name in ipairs(find_vstudio.get_vcvars()) do
+ if not table.contains(expect_vars, name:upper()) then
+ _add_vsenv(toolchain, name, curenvs)
+ end
+ end
+
+ if is_host("linux") or project.policy("build.optimization.lto") then
+ toolchain:add("ldflags", "-fuse-ld=lld-link" .. suffix)
+ toolchain:add("shflags", "-fuse-ld=lld-link" .. suffix)
+ end
+end
+
+function _get_target(toolchain)
+ -- TODO
+ -- Perhaps in the future we will improve it and allow setting targets on more platforms.
+ if not toolchain:is_plat("windows", "mingw") then
+ return
+ end
local target
if toolchain:is_arch("x86_64", "x64") then
target = "x86_64"
- march = "-m64"
elseif toolchain:is_arch("i386", "x86", "i686") then
target = "i686"
- march = "-m32"
- elseif toolchain:is_arch("arm64", "aarch64") then
+ elseif toolchain:is_arch("arm64", "aarch64", "arm64-v8a") then
target = "aarch64"
- elseif toolchain:is_arch("arm") then
+ elseif toolchain:is_arch("arm.*") then
target = "armv7"
end
- if toolchain:is_plat("windows") then
- target = target .. "-windows-msvc"
-
- -- add vs environments
- local expect_vars = {"PATH", "LIB", "INCLUDE", "LIBPATH"}
- local curenvs = os.getenvs()
- for _, name in ipairs(expect_vars) do
- _add_vsenv(toolchain, name, curenvs)
- end
- for _, name in ipairs(find_vstudio.get_vcvars()) do
- if not table.contains(expect_vars, name:upper()) then
- _add_vsenv(toolchain, name, curenvs)
- end
- end
-
- if is_host("linux") or project.policy("build.optimization.lto") then
- toolchain:add("ldflags", "-fuse-ld=lld-link" .. suffix)
- toolchain:add("shflags", "-fuse-ld=lld-link" .. suffix)
+ if target then
+ if toolchain:is_plat("windows") then
+ target = target .. "-windows-msvc"
+ elseif toolchain:is_plat("mingw") then
+ target = target .. "-w64-windows-gnu"
+ elseif toolchain:is_plat("linux") then
+ target = target .. "-linux-gnu"
+ else
+ target = nil
end
- elseif toolchain:is_plat("mingw") then
- target = target .. "-w64-windows-gnu"
- elseif toolchain:is_plat("linux") then
- target = target .. "-linux-gnu"
end
+ return target
+end
- toolchain_utils.add_llvm_runenvs(toolchain)
+function main(toolchain, suffix)
+
+ -- init tools for lto
+ if project.policy("build.optimization.lto") then
+ toolchain:set("toolset", "ar", "llvm-ar" .. suffix)
+ toolchain:set("toolset", "ranlib", "llvm-ranlib" .. suffix)
+ end
+ -- init target
+ local target = _get_target(toolchain)
if target then
toolchain:add("cxflags", "--target=" .. target)
+ toolchain:add("mxflags", "--target=" .. target)
toolchain:add("asflags", "--target=" .. target)
toolchain:add("ldflags", "--target=" .. target)
toolchain:add("shflags", "--target=" .. target)
+ else
+ local march
+ if toolchain:is_arch("x86_64", "x64") then
+ march = "-m64"
+ elseif toolchain:is_arch("i386", "x86") then
+ march = "-m32"
+ end
+ if march then
+ toolchain:add("cxflags", march)
+ toolchain:add("mxflags", march)
+ toolchain:add("asflags", march)
+ toolchain:add("ldflags", march)
+ toolchain:add("shflags", march)
+ end
+ end
+
+ -- init windows
+ if toolchain:is_plat("windows") then
+ _load_windows(toolchain, suffix)
end
+
+ -- set llvm runtimes
+ toolchain_utils.set_llvm_runtimes(toolchain)
+
+ -- add llvm runenvs
+ toolchain_utils.add_llvm_runenvs(toolchain)
end
diff --git a/xmake/toolchains/clang/toolchain_clang.lua b/xmake/toolchains/clang/toolchain_clang.lua
index b9713c6ae..d18bdf4b6 100644
--- a/xmake/toolchains/clang/toolchain_clang.lua
+++ b/xmake/toolchains/clang/toolchain_clang.lua
@@ -58,34 +58,6 @@ function toolchain_clang(version)
end)
on_load(function (toolchain)
- import("core.project.project")
- import("private.utils.toolchain", {alias = "toolchain_utils"})
-
- if project.policy("build.optimization.lto") then
- toolchain:set("toolset", "ar", "llvm-ar" .. suffix)
- toolchain:set("toolset", "ranlib", "llvm-ranlib" .. suffix)
- end
-
- local march
- if toolchain:is_arch("x86_64", "x64") then
- march = "-m64"
- elseif toolchain:is_arch("i386", "x86") then
- march = "-m32"
- end
- if march then
- toolchain:add("cxflags", march)
- toolchain:add("mxflags", march)
- toolchain:add("asflags", march)
- toolchain:add("ldflags", march)
- toolchain:add("shflags", march)
- end
-
- toolchain_utils.set_llvm_runtimes(toolchain)
-
- -- load windows configurations
- if toolchain:is_plat("windows", "mingw") then
- local rootdir = path.join(path.directory(os.scriptdir()), "clang")
- import("load", {rootdir = rootdir})(toolchain, suffix)
- end
+ import("load")(toolchain, suffix)
end)
end