summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-02-28 13:40:56 +0800
committerGitHub <[email protected]>2025-02-28 13:40:56 +0800
commit07a1cc63c0b89c8dae4d863a355c5092d2be9144 (patch)
tree39651d9253d61357f6123a5e9540930fff67eb9b
parentc9bdf5010b4163284ab180f08a227c64ae76ea84 (diff)
parent6ef8012701246b25de35b396a20ab15f5dcaaeb6 (diff)
Merge pull request #6179 from xmake-io/toolset
Improve to select vs toolset
-rw-r--r--xmake/modules/detect/sdks/find_vstudio.lua80
-rw-r--r--xmake/modules/private/utils/toolchain.lua2
-rw-r--r--xmake/toolchains/clang-cl/check.lua2
-rw-r--r--xmake/toolchains/icc/check.lua2
-rw-r--r--xmake/toolchains/icx/check.lua2
-rw-r--r--xmake/toolchains/ifort/check.lua2
-rw-r--r--xmake/toolchains/ifx/check.lua2
-rw-r--r--xmake/toolchains/msvc/check.lua2
8 files changed, 70 insertions, 24 deletions
diff --git a/xmake/modules/detect/sdks/find_vstudio.lua b/xmake/modules/detect/sdks/find_vstudio.lua
index 2b78b17c0..c3aca3ad4 100644
--- a/xmake/modules/detect/sdks/find_vstudio.lua
+++ b/xmake/modules/detect/sdks/find_vstudio.lua
@@ -20,6 +20,7 @@
-- imports
import("core.base.option")
+import("core.base.semver")
import("core.project.config")
import("lib.detect.find_file")
import("lib.detect.find_tool")
@@ -113,9 +114,16 @@ function find_build_tools(opt)
if vs_toolset and os.isdir(path.join(sdkdir, "VC/Tools/MSVC", vs_toolset)) then
VCToolsVersion = vs_toolset
else
- local dir = find_directory("14*", path.join(sdkdir, "VC/Tools/MSVC"))
- if dir then
- VCToolsVersion = path.filename(dir)
+ -- https://github.com/xmake-io/xmake/issues/6159
+ local latest_toolset
+ for _, dir in ipairs(os.dirs(path.join(sdkdir, "VC/Tools/MSVC/*"))) do
+ local toolset = path.filename(dir)
+ if not latest_toolset or semver.compare(toolset, latest_toolset) > 0 then
+ latest_toolset = toolset
+ end
+ end
+ if latest_toolset then
+ VCToolsVersion = latest_toolset
else
return
end
@@ -211,7 +219,7 @@ function find_build_tools(opt)
end
-- load vcvarsall environment variables
-function _load_vcvarsall(vcvarsall, vsver, arch, opt)
+function _load_vcvarsall_impl(vcvarsall, vsver, arch, opt)
opt = opt or {}
-- is VsDevCmd.bat?
@@ -234,16 +242,16 @@ function _load_vcvarsall(vcvarsall, vsver, arch, opt)
local host_arch = os.arch()
if is_vsdevcmd then
if vsver and tonumber(vsver) >= 16 then
- if opt.vcvars_ver then
- file:print("call \"%s\" -host_arch=%s -arch=%s -winsdk=%s -vcvars_ver=%s > nul", vcvarsall, host_arch, arch, opt.sdkver and opt.sdkver or "", opt.vcvars_ver)
+ if opt.toolset then
+ file:print("call \"%s\" -host_arch=%s -arch=%s -winsdk=%s -vcvars_ver=%s > nul", vcvarsall, host_arch, arch, opt.sdkver or "", opt.toolset or "")
else
- file:print("call \"%s\" -host_arch=%s -arch=%s -winsdk=%s > nul", vcvarsall, host_arch, arch, opt.sdkver and opt.sdkver or "")
+ file:print("call \"%s\" -host_arch=%s -arch=%s -winsdk=%s > nul", vcvarsall, host_arch, arch, opt.sdkver or "")
end
else
- if opt.vcvars_ver then
- file:print("call \"%s\" -arch=%s -winsdk=%s -vcvars_ver=%s > nul", vcvarsall, arch, opt.sdkver and opt.sdkver or "", opt.vcvars_ver)
+ if opt.toolset then
+ file:print("call \"%s\" -arch=%s -winsdk=%s -vcvars_ver=%s > nul", vcvarsall, arch, opt.sdkver or "", opt.toolset or "")
else
- file:print("call \"%s\" -arch=%s -winsdk=%s > nul", vcvarsall, arch, opt.sdkver and opt.sdkver or "")
+ file:print("call \"%s\" -arch=%s -winsdk=%s > nul", vcvarsall, arch, opt.sdkver or "")
end
end
else
@@ -254,10 +262,10 @@ function _load_vcvarsall(vcvarsall, vsver, arch, opt)
end
arch = host_arch .. "_" .. arch
end
- if opt.vcvars_ver then
- file:print("call \"%s\" %s %s -vcvars_ver=%s > nul", vcvarsall, arch, opt.sdkver and opt.sdkver or "", opt.vcvars_ver)
+ if opt.toolset then
+ file:print("call \"%s\" %s %s -vcvars_ver=%s > nul", vcvarsall, arch, opt.sdkver or "", opt.toolset or "")
else
- file:print("call \"%s\" %s %s > nul", vcvarsall, arch, opt.sdkver and opt.sdkver or "")
+ file:print("call \"%s\" %s %s > nul", vcvarsall, arch, opt.sdkver or "")
end
end
for idx, var in ipairs(get_vcvars()) do
@@ -267,7 +275,7 @@ function _load_vcvarsall(vcvarsall, vsver, arch, opt)
-- run genvcvars.bat
local outdata, errdata = try {function () return os.iorun(genvcvars_bat) end}
- if errdata and option.get("verbose") and option.get("diagnosis") then
+ if errdata and #errdata > 0 and option.get("verbose") and option.get("diagnosis") then
cprint("${color.warning}checkinfo: ${clear dim}get vcvars error: %s", errdata)
end
if not outdata then
@@ -346,6 +354,44 @@ function _load_vcvarsall(vcvarsall, vsver, arch, opt)
return variables
end
+-- strip toolset version, e.g. 14.16.27023 -> 14.16
+function _strip_toolset_ver(vs_toolset)
+ local version = semver.new(vs_toolset)
+ if version then
+ return version:major() .. "." .. version:minor()
+ end
+ return vs_toolset
+end
+
+function _load_vcvarsall(vcvarsall, vsver, arch, opt)
+ opt = opt or {}
+ local vs_toolset = opt.toolset or opt.vcvars_ver
+ if vs_toolset then
+ opt.toolset = _strip_toolset_ver(vs_toolset)
+ end
+ local result = _load_vcvarsall_impl(vcvarsall, vsver, arch, opt)
+ if result and not vs_toolset then
+ -- if no vs toolset version is specified, we default to the latest version.
+ -- https://github.com/xmake-io/xmake/issues/6159
+ local latest_toolset
+ local VCToolsVersion = result.VCToolsVersion
+ local VCInstallDir = result.VCInstallDir
+ if VCToolsVersion and VCInstallDir then
+ for _, dir in ipairs(os.dirs(path.join(VCInstallDir, "Tools/MSVC/*"))) do
+ local toolset = path.filename(dir)
+ if not latest_toolset or semver.compare(toolset, latest_toolset) > 0 then
+ latest_toolset = toolset
+ end
+ end
+ end
+ if latest_toolset and VCToolsVersion and semver.compare(latest_toolset, VCToolsVersion) > 0 then
+ opt.toolset = _strip_toolset_ver(latest_toolset)
+ result = _load_vcvarsall_impl(vcvarsall, vsver, arch, opt)
+ end
+ end
+ return result
+end
+
-- find vstudio for msvc
function _find_vstudio(opt)
opt = opt or {}
@@ -578,7 +624,7 @@ end
-- find vstudio environment
--
--- @param opt the options, e.g. {vcvars_ver = 14.0, sdkver = "10.0.15063.0"}
+-- @param opt the options, e.g. {toolset = 14.0, sdkver = "10.0.15063.0"}
--
-- @return { 2008 = {version = "9.0", vcvarsall = {x86 = {path = .., lib = .., include = ..}}}
-- , 2017 = {version = "15.0", vcvarsall = {x64 = {path = .., lib = ..}}}}
@@ -592,8 +638,8 @@ function main(opt)
end
local key = "vstudio"
- if opt.vcvars_ver then
- key = key .. opt.vcvars_ver
+ if opt.toolset then
+ key = key .. opt.toolset
end
if opt.sdkver then
key = key .. opt.sdkver
diff --git a/xmake/modules/private/utils/toolchain.lua b/xmake/modules/private/utils/toolchain.lua
index 20314a89b..e6965860f 100644
--- a/xmake/modules/private/utils/toolchain.lua
+++ b/xmake/modules/private/utils/toolchain.lua
@@ -43,7 +43,7 @@ function get_vs_toolset_ver(vs_toolset)
toolset_ver = "v" .. verinfo:major() .. (tostring(verinfo:minor()):sub(1, 1) or "0")
-- @see https://github.com/xmake-io/xmake/pull/5176
- if toolset_ver and toolset_ver == "v144" and verinfo:ge("14.40") and verinfo:lt("14.45") then
+ if toolset_ver and toolset_ver == "v144" and verinfo:ge("14.40") and verinfo:lt("14.50") then
toolset_ver = "v143"
end
end
diff --git a/xmake/toolchains/clang-cl/check.lua b/xmake/toolchains/clang-cl/check.lua
index 4537f01e3..ca0bbfd88 100644
--- a/xmake/toolchains/clang-cl/check.lua
+++ b/xmake/toolchains/clang-cl/check.lua
@@ -49,7 +49,7 @@ function _check_vsenv(toolchain)
-- 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({vcvars_ver = vs_toolset, sdkver = vs_sdkver})
+ local vstudio = find_vstudio({toolset = vs_toolset, sdkver = vs_sdkver})
if vstudio then
-- make order vsver
diff --git a/xmake/toolchains/icc/check.lua b/xmake/toolchains/icc/check.lua
index ece7f1292..de2b30c89 100644
--- a/xmake/toolchains/icc/check.lua
+++ b/xmake/toolchains/icc/check.lua
@@ -41,7 +41,7 @@ function _check_vsenv(toolchain)
-- 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({vcvars_ver = vs_toolset, sdkver = vs_sdkver})
+ local vstudio = find_vstudio({toolset = vs_toolset, sdkver = vs_sdkver})
if vstudio then
-- make order vsver
diff --git a/xmake/toolchains/icx/check.lua b/xmake/toolchains/icx/check.lua
index 30afed6f6..247e1dbfe 100644
--- a/xmake/toolchains/icx/check.lua
+++ b/xmake/toolchains/icx/check.lua
@@ -41,7 +41,7 @@ function _check_vsenv(toolchain)
-- 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({vcvars_ver = vs_toolset, sdkver = vs_sdkver})
+ local vstudio = find_vstudio({toolset = vs_toolset, sdkver = vs_sdkver})
if vstudio then
-- make order vsver
diff --git a/xmake/toolchains/ifort/check.lua b/xmake/toolchains/ifort/check.lua
index 2c8b52c5b..682060f08 100644
--- a/xmake/toolchains/ifort/check.lua
+++ b/xmake/toolchains/ifort/check.lua
@@ -41,7 +41,7 @@ function _check_vsenv(toolchain)
-- 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({vcvars_ver = vs_toolset, sdkver = vs_sdkver})
+ local vstudio = find_vstudio({toolset = vs_toolset, sdkver = vs_sdkver})
if vstudio then
-- make order vsver
diff --git a/xmake/toolchains/ifx/check.lua b/xmake/toolchains/ifx/check.lua
index e4bed2706..02d209c09 100644
--- a/xmake/toolchains/ifx/check.lua
+++ b/xmake/toolchains/ifx/check.lua
@@ -41,7 +41,7 @@ function _check_vsenv(toolchain)
-- 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({vcvars_ver = vs_toolset, sdkver = vs_sdkver})
+ local vstudio = find_vstudio({toolset = vs_toolset, sdkver = vs_sdkver})
if vstudio then
-- make order vsver
diff --git a/xmake/toolchains/msvc/check.lua b/xmake/toolchains/msvc/check.lua
index c40d4a202..c2ed4bbb6 100644
--- a/xmake/toolchains/msvc/check.lua
+++ b/xmake/toolchains/msvc/check.lua
@@ -40,7 +40,7 @@ function _check_vsenv(toolchain)
-- 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({vcvars_ver = vs_toolset, sdkver = vs_sdkver})
+ local vstudio = find_vstudio({toolset = vs_toolset, sdkver = vs_sdkver})
if vstudio then
-- make order vsver