summaryrefslogtreecommitdiff
path: root/xmake/toolchains/msvc/check.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2025-10-09 00:44:20 +0800
committerruki <[email protected]>2025-10-09 00:44:20 +0800
commitb06c58640c6d54f8b93b8d9cb0b6618b5d49b76b (patch)
treeda85f30e4eb0df4586d783bbf7cb98a0ea9bd342 /xmake/toolchains/msvc/check.lua
parent3fbba4de3674ce636cdb2e3456eff3828f77355a (diff)
improve to check vs envs and clang
Diffstat (limited to 'xmake/toolchains/msvc/check.lua')
-rw-r--r--xmake/toolchains/msvc/check.lua90
1 files changed, 8 insertions, 82 deletions
diff --git a/xmake/toolchains/msvc/check.lua b/xmake/toolchains/msvc/check.lua
index c6b6dabd4..a3642eff8 100644
--- a/xmake/toolchains/msvc/check.lua
+++ b/xmake/toolchains/msvc/check.lua
@@ -21,80 +21,15 @@
-- imports
import("core.base.option")
import("core.project.config")
-import("detect.sdks.find_vstudio")
import("lib.detect.find_tool")
imports("private.utils.toolchain", {alias = "toolchain_utils"})
--- attempt to check vs environment
-function _check_vsenv(toolchain)
-
- -- have been checked?
- local vs = toolchain:config("vs") or config.get("vs")
- if vs then
- vs = tostring(vs)
- end
- local vcvars = toolchain:config("vcvars")
- if vs and vcvars then
- return vs
- end
-
- -- find vstudio
- local vs_toolset = toolchain:config("vs_toolset") or config.get("vs_toolset")
- local vs_sdkver = toolchain:config("vs_sdkver") or config.get("vs_sdkver")
- local vstudio = find_vstudio({toolset = vs_toolset, sdkver = vs_sdkver})
- if vstudio then
-
- -- make order vsver
- local vsvers = {}
- for vsver, _ in pairs(vstudio) do
- if not vs or vs ~= vsver then
- table.insert(vsvers, vsver)
- end
- end
- table.sort(vsvers, function (a, b) return tonumber(a) > tonumber(b) end)
- if vs then
- table.insert(vsvers, 1, vs)
- end
-
- -- get vcvarsall
- for _, vsver in ipairs(vsvers) do
- local vcvarsall = (vstudio[vsver] or {}).vcvarsall or {}
- 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 program = nil
- local tool = find_tool("cl.exe", {force = true, envs = vcvars})
- if tool then
- program = tool.program
- end
- if program then
- return vsver
- end
- end
- end
+function _check_cl(toolchain, vcvars)
+ local cl = find_tool("cl.exe", {force = true, envs = vcvars})
+ if cl then
+ cprint("checking for Microsoft C/C++ Compiler (%s) ... ${color.success}", toolchain:arch())
end
-end
-
--- check the visual studio
-function _check_vstudio(toolchain)
- local vs = _check_vsenv(toolchain)
- if vs then
- if toolchain:is_global() then
- config.set("vs", vs, {force = true, readonly = true})
- end
- toolchain:config_set("vs", vs)
- cprint("checking for Microsoft Visual Studio (%s) version ... ${color.success}%s", toolchain:arch(), vs)
- else
- cprint("checking for Microsoft Visual Studio (%s) version ... ${color.nothing}${text.nothing}", toolchain:arch())
- end
- return vs
+ return cl
end
function main(toolchain)
@@ -109,30 +44,21 @@ 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 check = function(vcvars)
- local cl = find_tool("cl.exe", {force = true, envs = vcvars})
- if cl then
- cprint("checking for Microsoft C/C++ Compiler (%s) ... ${color.success}", toolchain:arch())
- end
- end
local sdkdir = toolchain:sdkdir()
if sdkdir then
- sdkdir = toolchain_utils.check_vc_build_tools(toolchain, sdkdir, check)
+ sdkdir = toolchain_utils.check_vc_build_tools(toolchain, sdkdir, _check_cl)
end
if not sdkdir then
- -- find it from packages
for _, package in ipairs(toolchain:packages()) do
local installdir = package:installdir()
if installdir and os.isdir(installdir) then
- local result = toolchain_utils.check_vc_build_tools(toolchain, installdir, check)
+ local result = toolchain_utils.check_vc_build_tools(toolchain, installdir, _check_cl)
if result then
return result
end
end
end
-
- -- find it from system
- sdkdir = _check_vstudio(toolchain)
+ sdkdir = toolchain_utils.check_vstudio(toolchain, _check_cl)
end
return sdkdir
end