summaryrefslogtreecommitdiff
path: root/xmake/modules
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/modules
parent3fbba4de3674ce636cdb2e3456eff3828f77355a (diff)
improve to check vs envs and clang
Diffstat (limited to 'xmake/modules')
-rw-r--r--xmake/modules/private/utils/toolchain.lua69
1 files changed, 65 insertions, 4 deletions
diff --git a/xmake/modules/private/utils/toolchain.lua b/xmake/modules/private/utils/toolchain.lua
index fe88b4838..28cbc23c0 100644
--- a/xmake/modules/private/utils/toolchain.lua
+++ b/xmake/modules/private/utils/toolchain.lua
@@ -28,6 +28,69 @@ import("core.language.language")
import("lib.detect.find_tool")
import("detect.sdks.find_vstudio")
+-- attempt to check vs environment
+function _check_vsenv(toolchain, check)
+
+ -- 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
+ 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)
+ if check and check(toolchain, vcvars) then
+ return vsver
+ end
+ end
+ end
+ end
+end
+
+-- check the visual studio
+function check_vstudio(toolchain, check)
+ local vs = _check_vsenv(toolchain, check)
+ 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
+end
+
-- check vc build tools sdk
function check_vc_build_tools(toolchain, sdkdir, check)
local opt = {}
@@ -46,11 +109,9 @@ function check_vc_build_tools(toolchain, sdkdir, check)
toolchain:config_set("vcarchs", table.orderkeys(vcvarsall))
toolchain:config_set("vs_toolset", vcvars.VCToolsVersion)
toolchain:config_set("vs_sdkver", vcvars.WindowsSDKVersion)
-
- if check then
- check(vcvars)
+ if check and check(toolchain, vcvars) then
+ return vcvars
end
- return vcvars
end
end