summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-10-09 00:39:41 +0800
committerruki <[email protected]>2025-10-09 00:39:41 +0800
commit3fbba4de3674ce636cdb2e3456eff3828f77355a (patch)
tree9227eec9e32877dfd7e942ae767228696f2d44cc
parent888f5c3b5452b2b8c6c47e89028c4449a238e31f (diff)
improve to check msvc
-rw-r--r--xmake/modules/private/utils/toolchain.lua32
-rw-r--r--xmake/toolchains/clang-cl/check.lua39
-rw-r--r--xmake/toolchains/clang/check.lua50
-rw-r--r--xmake/toolchains/msvc/check.lua38
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