diff options
| author | ruki <[email protected]> | 2025-10-09 00:39:41 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-10-09 00:39:41 +0800 |
| commit | 3fbba4de3674ce636cdb2e3456eff3828f77355a (patch) | |
| tree | 9227eec9e32877dfd7e942ae767228696f2d44cc | |
| parent | 888f5c3b5452b2b8c6c47e89028c4449a238e31f (diff) | |
improve to check msvc
| -rw-r--r-- | xmake/modules/private/utils/toolchain.lua | 32 | ||||
| -rw-r--r-- | xmake/toolchains/clang-cl/check.lua | 39 | ||||
| -rw-r--r-- | xmake/toolchains/clang/check.lua | 50 | ||||
| -rw-r--r-- | xmake/toolchains/msvc/check.lua | 38 |
4 files changed, 64 insertions, 95 deletions
diff --git a/xmake/modules/private/utils/toolchain.lua b/xmake/modules/private/utils/toolchain.lua index da2e9febf..fe88b4838 100644 --- a/xmake/modules/private/utils/toolchain.lua +++ b/xmake/modules/private/utils/toolchain.lua @@ -17,10 +17,42 @@ -- @author ruki -- @file toolchain.lua -- + +-- imports +import("core.base.option") +import("core.project.config") import("core.base.semver") import("core.tool.linker") import("core.tool.compiler") import("core.language.language") +import("lib.detect.find_tool") +import("detect.sdks.find_vstudio") + +-- check vc build tools sdk +function check_vc_build_tools(toolchain, sdkdir, check) + 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 + 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 then + check(vcvars) + end + return vcvars + end +end -- is the compatible with the host? function is_compatible_with_host(name) diff --git a/xmake/toolchains/clang-cl/check.lua b/xmake/toolchains/clang-cl/check.lua index 8925e9ee2..8b180afa5 100644 --- a/xmake/toolchains/clang-cl/check.lua +++ b/xmake/toolchains/clang-cl/check.lua @@ -23,6 +23,7 @@ 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"}) function _find_clang_cl(vcvars) local paths @@ -108,34 +109,6 @@ 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 - function main(toolchain) -- only for windows or linux (msvc-wine) @@ -148,15 +121,21 @@ 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 + local check = function (vcvars) + 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 + end local sdkdir = toolchain:sdkdir() if sdkdir then - return _check_vc_build_tools(toolchain, sdkdir) + return toolchain_utils.check_vc_build_tools(toolchain, sdkdir, check) else -- find it from packages for _, package in ipairs(toolchain:packages()) do local installdir = package:installdir() if installdir and os.isdir(installdir) then - local result = _check_vc_build_tools(toolchain, installdir) + local result = toolchain_utils.check_vc_build_tools(toolchain, installdir, check) if result then return result end diff --git a/xmake/toolchains/clang/check.lua b/xmake/toolchains/clang/check.lua index febb0bbd3..d396a486c 100644 --- a/xmake/toolchains/clang/check.lua +++ b/xmake/toolchains/clang/check.lua @@ -18,42 +18,9 @@ -- @file xmake.lua -- -import("detect.sdks.find_vstudio") -import("lib.detect.find_tool") +-- imports import("core.project.config") - -function _check_vc_build_tools(toolchain, sdkdir, suffix) - 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 paths - local pathenv = os.getenv("PATH") - if pathenv then - paths = path.splitenv(pathenv) - end - local clang = find_tool("clang" .. suffix, {version = true, force = true, paths = paths, envs = vcvars}) - if clang and clang.version then - cprint("checking for LLVM Clang C/C++ Compiler (%s) version ... ${color.success}%s", toolchain:arch(), clang.version) - end - return vcvars - end -end +imports("private.utils.toolchain", {alias = "toolchain_utils"}) function main(toolchain, suffix) @@ -64,6 +31,17 @@ function main(toolchain, suffix) local sdkdir = toolchain:sdkdir() if sdkdir then - return _check_vc_build_tools(toolchain, sdkdir, suffix) + local check = function (vcvars) + local paths + local pathenv = os.getenv("PATH") + if pathenv then + paths = path.splitenv(pathenv) + end + local clang = find_tool("clang" .. suffix, {version = true, force = true, paths = paths, envs = vcvars}) + if clang and clang.version then + cprint("checking for LLVM Clang C/C++ Compiler (%s) version ... ${color.success}%s", toolchain:arch(), clang.version) + end + end + return toolchain_utils.check_vc_build_tools(toolchain, sdkdir, check) end end diff --git a/xmake/toolchains/msvc/check.lua b/xmake/toolchains/msvc/check.lua index 37f38b53c..c6b6dabd4 100644 --- a/xmake/toolchains/msvc/check.lua +++ b/xmake/toolchains/msvc/check.lua @@ -23,6 +23,7 @@ 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) @@ -96,33 +97,6 @@ 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 - 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 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 - return vcvars - end -end - function main(toolchain) -- only for windows or linux (msvc-wine) @@ -135,16 +109,22 @@ 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 = _check_vc_build_tools(toolchain, sdkdir) + sdkdir = toolchain_utils.check_vc_build_tools(toolchain, sdkdir, check) 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 = _check_vc_build_tools(toolchain, installdir) + local result = toolchain_utils.check_vc_build_tools(toolchain, installdir, check) if result then return result end |
