summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-12-20 00:43:54 +0800
committerruki <[email protected]>2025-12-20 00:43:54 +0800
commitd6d9ad8cbdeb62e26db3e2a96d25319f4802e36b (patch)
tree07c344e703a4b40990de830bfdf250ad2d58d743
parent50e52b0aa88b409f65181b8a6607427c8e17a28d (diff)
improve clang target flags
-rw-r--r--xmake/modules/private/utils/toolchain.lua57
-rw-r--r--xmake/toolchains/clang-cl/load.lua21
-rw-r--r--xmake/toolchains/clang/load.lua62
-rw-r--r--xmake/toolchains/llvm/xmake.lua39
4 files changed, 83 insertions, 96 deletions
diff --git a/xmake/modules/private/utils/toolchain.lua b/xmake/modules/private/utils/toolchain.lua
index 29036a2c2..c0cec7f74 100644
--- a/xmake/modules/private/utils/toolchain.lua
+++ b/xmake/modules/private/utils/toolchain.lua
@@ -120,6 +120,63 @@ function _add_vsenv(toolchain, name, curenvs)
end
end
+-- get clang target
+function get_clang_target(toolchain)
+ local target
+ if toolchain:is_plat("windows") then
+ if toolchain:is_arch("x86_64", "x64") then
+ target = "x86_64-pc-windows-msvc"
+ elseif toolchain:is_arch("i386", "x86", "i686") then
+ target = "i686-pc-windows-msvc"
+ elseif toolchain:is_arch("arm64", "aarch64") then
+ target = "aarch64-pc-windows-msvc"
+ elseif toolchain:is_arch("arm64ec") then
+ target = "arm64ec-pc-windows-msvc"
+ elseif toolchain:is_arch("arm.*") then
+ target = "armv7-pc-windows-msvc"
+ end
+ elseif toolchain:is_plat("mingw") then
+ if toolchain:is_arch("x86_64", "x64") then
+ target = "x86_64-w64-windows-gnu"
+ elseif toolchain:is_arch("i386", "x86", "i686") then
+ target = "i686-w64-windows-gnu"
+ elseif toolchain:is_arch("arm64", "aarch64") then
+ target = "aarch64-w64-windows-gnu"
+ elseif toolchain:is_arch("arm.*") then
+ target = "armv7-w64-windows-gnu"
+ end
+ elseif toolchain:is_plat("linux") then
+ if toolchain:is_arch("x86_64", "x64") then
+ target = "x86_64-linux-gnu"
+ elseif toolchain:is_arch("i386", "x86", "i686") then
+ target = "i686-linux-gnu"
+ elseif toolchain:is_arch("arm64", "aarch64", "arm64-v8a") then
+ target = "aarch64-linux-gnu"
+ elseif toolchain:is_arch("arm.*") then
+ target = "armv7-linux-gnu"
+ end
+ elseif toolchain:is_plat("cross") then
+ target = toolchain:cross()
+ if target and target:endswith("-") then
+ target = target:sub(1, -2)
+ end
+ end
+ return target
+end
+
+-- get clang target flags
+function get_clang_target_flags(toolchain)
+ local target = get_clang_target(toolchain)
+ if target then
+ return "--target=" .. target
+ end
+ if toolchain:is_arch("x86_64", "x64") then
+ return "-m64"
+ elseif toolchain:is_arch("i386", "x86") then
+ return "-m32"
+ end
+end
+
-- add vs environments
function add_vsenvs(toolchain, expect_vars)
local curenvs = os.getenvs()
diff --git a/xmake/toolchains/clang-cl/load.lua b/xmake/toolchains/clang-cl/load.lua
index f445c0739..8dab94d4a 100644
--- a/xmake/toolchains/clang-cl/load.lua
+++ b/xmake/toolchains/clang-cl/load.lua
@@ -54,23 +54,10 @@ function main(toolchain)
-- add vs environments
toolchain_utils.add_vsenvs(toolchain)
- local target
- if toolchain:is_arch("x86_64", "x64") then
- target = "x86_64-pc"
- elseif toolchain:is_arch("i386", "x86", "i686") then
- target = "i686-pc"
- elseif toolchain:is_arch("arm64", "aarch64") then
- target = "aarch64"
- elseif toolchain:is_arch("arm64ec") then
- target = "arm64ec"
- elseif toolchain:is_arch("arm") then
- target = "armv7"
- end
-
- target = target .. "-windows-msvc"
- if target then
- toolchain:add("cxflags", "--target=" .. target)
- toolchain:add("mxflags", "--target=" .. target)
+ local flags = toolchain_utils.get_clang_target_flags(toolchain)
+ if flags then
+ toolchain:add("cxflags", flags)
+ toolchain:add("mxflags", flags)
end
end
diff --git a/xmake/toolchains/clang/load.lua b/xmake/toolchains/clang/load.lua
index ba4dbfe94..4b66ef5d6 100644
--- a/xmake/toolchains/clang/load.lua
+++ b/xmake/toolchains/clang/load.lua
@@ -34,38 +34,6 @@ function _load_windows(toolchain, 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"
- elseif toolchain:is_arch("i386", "x86", "i686") then
- target = "i686"
- elseif toolchain:is_arch("arm64", "aarch64", "arm64-v8a") then
- target = "aarch64"
- elseif toolchain:is_arch("arm.*") then
- target = "armv7"
- end
-
- 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
- end
- return target
-end
-
function main(toolchain, suffix)
-- init tools for lto
@@ -74,28 +42,14 @@ function main(toolchain, 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
+ -- add target flags
+ local flags = toolchain_utils.get_clang_target_flags(toolchain)
+ if flags then
+ toolchain:add("cxflags", flags)
+ toolchain:add("mxflags", flags)
+ toolchain:add("asflags", flags)
+ toolchain:add("ldflags", flags)
+ toolchain:add("shflags", flags)
end
-- init windows
diff --git a/xmake/toolchains/llvm/xmake.lua b/xmake/toolchains/llvm/xmake.lua
index 4a89b4f32..fb18f280f 100644
--- a/xmake/toolchains/llvm/xmake.lua
+++ b/xmake/toolchains/llvm/xmake.lua
@@ -58,33 +58,22 @@ toolchain("llvm")
toolchain_utils.add_llvm_runenvs(toolchain)
-- add target flags
- local target
- if toolchain:is_plat("windows") and not is_host("windows") then
- if toolchain:is_arch("i386", "x86") then
- target = "i386-pc-windows-msvc"
- else
- target = "x86_64-pc-windows-msvc"
- end
- elseif toolchain:is_plat("cross") then
- target = toolchain:cross():gsub("(.*)%-$", "%1")
+ local flags = toolchain_utils.get_clang_target_flags(toolchain)
+ if flags then
+ toolchain:add("cxflags", flags)
+ toolchain:add("mxflags", flags)
+ toolchain:add("asflags", flags)
+ toolchain:add("ldflags", flags)
+ toolchain:add("shflags", flags)
end
- local target_flags
+
+ -- add target flags for swift
+ local target = toolchain_utils.get_clang_target(toolchain)
if target then
- target_flags = "--target=" .. target
- elseif toolchain:is_arch("x86_64", "x64") then
- target_flags = "-m64"
- elseif toolchain:is_arch("i386", "x86") then
- target_flags = "-m32"
- end
- if target_flags then
- toolchain:add("cxflags", target_flags)
- toolchain:add("mxflags", target_flags)
- toolchain:add("asflags", target_flags)
- toolchain:add("ldflags", target_flags)
- toolchain:add("shflags", target_flags)
- toolchain:add("scasflags", "--target=" .. target_flags)
- toolchain:add("scldflags", "--target=" .. target_flags)
- toolchain:add("scshflags", "--target=" .. target_flags)
+ local flag = "--target=" .. target
+ toolchain:add("scasflags", flag)
+ toolchain:add("scldflags", flag)
+ toolchain:add("scshflags", flag)
end
-- init flags for platform