diff options
| author | ruki <[email protected]> | 2025-10-09 00:44:20 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-10-09 00:44:20 +0800 |
| commit | b06c58640c6d54f8b93b8d9cb0b6618b5d49b76b (patch) | |
| tree | da85f30e4eb0df4586d783bbf7cb98a0ea9bd342 /xmake/toolchains/msvc/check.lua | |
| parent | 3fbba4de3674ce636cdb2e3456eff3828f77355a (diff) | |
improve to check vs envs and clang
Diffstat (limited to 'xmake/toolchains/msvc/check.lua')
| -rw-r--r-- | xmake/toolchains/msvc/check.lua | 90 |
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 |
