summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstar9029 <[email protected]>2024-11-18 15:39:31 +0800
committerstar9029 <[email protected]>2024-11-18 15:39:31 +0800
commit968471fe0c02ba62bb4dc7b27bb72397090e7697 (patch)
tree19944e53a1f744460759f02c4362253192e22e43
parente126a59290cf409e064fe970b62ed2aec125c25f (diff)
support clang-cl
-rw-r--r--xmake/toolchains/clang-cl/check.lua55
-rw-r--r--xmake/toolchains/msvc/check.lua2
2 files changed, 47 insertions, 10 deletions
diff --git a/xmake/toolchains/clang-cl/check.lua b/xmake/toolchains/clang-cl/check.lua
index 515c3d639..b416a44ce 100644
--- a/xmake/toolchains/clang-cl/check.lua
+++ b/xmake/toolchains/clang-cl/check.lua
@@ -24,6 +24,15 @@ import("core.project.config")
import("detect.sdks.find_vstudio")
import("lib.detect.find_tool")
+function _find_clang_cl(vcvars)
+ local paths
+ local pathenv = os.getenv("PATH")
+ if pathenv then
+ paths = path.splitenv(pathenv)
+ end
+ return find_tool("clang-cl.exe", {version = true, force = true, paths = paths, envs = vcvars})
+end
+
-- attempt to check vs environment
function _check_vsenv(toolchain)
@@ -69,12 +78,7 @@ function _check_vsenv(toolchain)
-- check compiler
local program
- local paths
- local pathenv = os.getenv("PATH")
- if pathenv then
- paths = path.splitenv(pathenv)
- end
- local tool = find_tool("clang-cl.exe", {version = true, force = true, paths = paths, envs = vcvars})
+ local tool = _find_clang_cl(vcvars)
if tool then
program = tool.program
end
@@ -105,11 +109,39 @@ function _check_vstudio(toolchain)
return vs
end
+function _check_vc_build_tools(toolchain, sdkdir)
+ local opt = {}
+ opt.sdkdir = sdkdir
+ opt.vs_toolset = toolchain:config("vs_toolset") or config.get("vs_toolset")
+ opt.vs_sdkver = toolchain:config("vs_sdkver") or config.get("vs_sdkver")
+
+ local vcvarsall = find_vstudio.find_build_tools(opt)
+ if not vcvarsall then
+ return
+ end
+
+ local vcvars = vcvarsall[toolchain:arch()]
+ if vcvars and vcvars.PATH and vcvars.INCLUDE and vcvars.LIB then
+ -- save vcvars
+ toolchain:config_set("vcvars", vcvars)
+ toolchain:config_set("vcarchs", table.orderkeys(vcvarsall))
+ toolchain:config_set("vs_toolset", vcvars.VCToolsVersion)
+ toolchain:config_set("vs_sdkver", vcvars.WindowsSDKVersion)
+
+ -- check compiler
+ local clang_cl = _find_clang_cl(vcvars)
+ if clang_cl and clang_cl.version then
+ cprint("checking for LLVM Clang C/C++ Compiler (%s) version ... ${color.success}%s", toolchain:arch(), clang_cl.version)
+ end
+ return vcvars
+ end
+end
+
-- main entry
function main(toolchain)
- -- only for windows
- if not is_host("windows") then
+ -- only for windows or linux (msvc-wine)
+ if not is_host("windows", "linux") then
return
end
@@ -118,7 +150,12 @@ function main(toolchain)
local cxx = path.basename(config.get("cxx") or "clang-cl"):lower()
local mrc = path.basename(config.get("mrc") or "rc"):lower()
if cc == "clang-cl" or cxx == "clang-cl" or mrc == "rc" then
- return _check_vstudio(toolchain)
+ local sdkdir = toolchain:sdkdir()
+ if sdkdir then
+ return _check_vc_build_tools(toolchain, sdkdir)
+ else
+ return _check_vstudio(toolchain)
+ end
end
end
diff --git a/xmake/toolchains/msvc/check.lua b/xmake/toolchains/msvc/check.lua
index 37eb45255..3c70d43c0 100644
--- a/xmake/toolchains/msvc/check.lua
+++ b/xmake/toolchains/msvc/check.lua
@@ -141,7 +141,7 @@ function main(toolchain)
local cxx = path.basename(config.get("cxx") or "cl"):lower()
local mrc = path.basename(config.get("mrc") or "rc"):lower()
if cc == "cl" or cxx == "cl" or mrc == "rc" then
- local sdkdir = option.get("sdk") or toolchain:config("sdk") or config.get("sdk")
+ local sdkdir = toolchain:sdkdir()
if sdkdir then
return _check_vc_build_tools(toolchain, sdkdir)
else