summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-02-28 13:40:40 +0800
committerGitHub <[email protected]>2025-02-28 13:40:40 +0800
commitc9bdf5010b4163284ab180f08a227c64ae76ea84 (patch)
tree135322c489816e467a881f234daba3a53939064b
parente0d9a3988fb8a77bbe05dab59ed3042eb7373f4b (diff)
parenta8c1996b0b3722fa7e1669230d09187b718774dc (diff)
Merge pull request #6177 from star-hengxing/clang
Improve clang toolcahin for building package with lto
-rw-r--r--xmake/rules/c++/build_optimization/config.lua14
-rw-r--r--xmake/toolchains/clang-cl/load.lua13
-rw-r--r--xmake/toolchains/clang/xmake.lua7
3 files changed, 28 insertions, 6 deletions
diff --git a/xmake/rules/c++/build_optimization/config.lua b/xmake/rules/c++/build_optimization/config.lua
index 4324bcf76..f5bff67fc 100644
--- a/xmake/rules/c++/build_optimization/config.lua
+++ b/xmake/rules/c++/build_optimization/config.lua
@@ -58,9 +58,17 @@ function _add_lto_optimization(target, sourcekind)
end
end
- if cc == "clang_cl" and ld == "link" then
- wprint([[clang-cl + msvc link unsupported lto, please use `set_toolset("ld", "lld-link")`]])
- target:set("toolset", "ld", "lld-link")
+ local program, ar = target:tool("ar")
+ if cc == "clang_cl" then
+ if ld == "link" then
+ wprint([[Unsupported toolset(%s) for lto, please use `set_toolset("ld", "lld-link")`]], ld)
+ target:set("toolset", "ld", "lld-link")
+ target:set("toolset", "sh", "lld-link")
+ end
+ if ar ~= "llvm-ar" and ar ~= "llvm_ar" then
+ wprint([[Unsupported toolset(%s) for lto, please use `set_toolset("ar", "llvm-ar")`]], ar)
+ target:set("toolset", "ar", "llvm-ar")
+ end
end
end
diff --git a/xmake/toolchains/clang-cl/load.lua b/xmake/toolchains/clang-cl/load.lua
index 49333675e..f8848064f 100644
--- a/xmake/toolchains/clang-cl/load.lua
+++ b/xmake/toolchains/clang-cl/load.lua
@@ -22,6 +22,7 @@
import("core.base.option")
import("core.project.config")
import("detect.sdks.find_vstudio")
+import("core.project.project")
-- add the given vs environment
function _add_vsenv(toolchain, name, curenvs)
@@ -59,9 +60,15 @@ function main(toolchain)
else
toolchain:set("toolset", "as", "ml.exe")
end
- toolchain:set("toolset", "ld", "link.exe")
- toolchain:set("toolset", "sh", "link.exe")
- toolchain:set("toolset", "ar", "link.exe")
+ if project.policy("build.optimization.lto") then
+ toolchain:set("toolset", "ld", "lld-link")
+ toolchain:set("toolset", "sh", "lld-link")
+ toolchain:set("toolset", "ar", "llvm-ar")
+ else
+ toolchain:set("toolset", "ld", "link.exe")
+ toolchain:set("toolset", "sh", "link.exe")
+ toolchain:set("toolset", "ar", "link.exe")
+ end
-- add vs environments
local expect_vars = {"PATH", "LIB", "INCLUDE", "LIBPATH"}
diff --git a/xmake/toolchains/clang/xmake.lua b/xmake/toolchains/clang/xmake.lua
index ea9406e5c..829413278 100644
--- a/xmake/toolchains/clang/xmake.lua
+++ b/xmake/toolchains/clang/xmake.lua
@@ -56,6 +56,13 @@ toolchain("clang" .. suffix)
end)
on_load(function (toolchain)
+ import("core.project.project")
+
+ 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"