From d6b1a19b91d8a37cb84d7ddd7df9cc333c1240be Mon Sep 17 00:00:00 2001 From: ruki Date: Fri, 28 Feb 2025 22:47:52 +0800 Subject: rename vcvars_ver to toolset --- xmake/modules/detect/sdks/find_vstudio.lua | 22 +++++++++++----------- xmake/toolchains/clang-cl/check.lua | 2 +- xmake/toolchains/icc/check.lua | 2 +- xmake/toolchains/icx/check.lua | 2 +- xmake/toolchains/ifort/check.lua | 2 +- xmake/toolchains/ifx/check.lua | 2 +- xmake/toolchains/msvc/check.lua | 2 +- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/xmake/modules/detect/sdks/find_vstudio.lua b/xmake/modules/detect/sdks/find_vstudio.lua index 2b78b17c0..d48a7af53 100644 --- a/xmake/modules/detect/sdks/find_vstudio.lua +++ b/xmake/modules/detect/sdks/find_vstudio.lua @@ -234,16 +234,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 opt.vcvars_ver or "") else file:print("call \"%s\" -host_arch=%s -arch=%s -winsdk=%s > nul", vcvarsall, host_arch, arch, opt.sdkver and 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 opt.vcvars_ver 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 +254,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 opt.vcvars_ver 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 @@ -578,7 +578,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 +592,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/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 -- cgit v1.3.1 From d796790592ba9413d7d17877da6fe7806ee410e6 Mon Sep 17 00:00:00 2001 From: ruki Date: Fri, 28 Feb 2025 22:49:12 +0800 Subject: attempt to select latest version --- xmake/modules/detect/sdks/find_vstudio.lua | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/xmake/modules/detect/sdks/find_vstudio.lua b/xmake/modules/detect/sdks/find_vstudio.lua index d48a7af53..501f8d79b 100644 --- a/xmake/modules/detect/sdks/find_vstudio.lua +++ b/xmake/modules/detect/sdks/find_vstudio.lua @@ -211,7 +211,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? @@ -346,6 +346,17 @@ function _load_vcvarsall(vcvarsall, vsver, arch, opt) return variables end +function _load_vcvarsall(vcvarsall, vsver, arch, opt) + opt = opt or {} + local vs_toolset = opt.toolset or opt.vcvars_ver + 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. + print(result) + end + return result +end + -- find vstudio for msvc function _find_vstudio(opt) opt = opt or {} -- cgit v1.3.1 From 0fb17801c211b0ec7d0dc6757b0e604b4f707d36 Mon Sep 17 00:00:00 2001 From: ruki Date: Fri, 28 Feb 2025 11:29:21 +0800 Subject: improve to select latest toolset --- xmake/modules/detect/sdks/find_vstudio.lua | 51 +++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/xmake/modules/detect/sdks/find_vstudio.lua b/xmake/modules/detect/sdks/find_vstudio.lua index 501f8d79b..25af40ff9 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 @@ -235,13 +243,13 @@ function _load_vcvarsall_impl(vcvarsall, vsver, arch, opt) if is_vsdevcmd then if vsver and tonumber(vsver) >= 16 then 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 opt.vcvars_ver or "") + 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.toolset then - file:print("call \"%s\" -arch=%s -winsdk=%s -vcvars_ver=%s > nul", vcvarsall, arch, opt.sdkver or "", opt.toolset or opt.vcvars_ver or "") + 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 or "") end @@ -255,7 +263,7 @@ function _load_vcvarsall_impl(vcvarsall, vsver, arch, opt) arch = host_arch .. "_" .. arch end if opt.toolset then - file:print("call \"%s\" %s %s -vcvars_ver=%s > nul", vcvarsall, arch, opt.sdkver or "", opt.toolset or opt.vcvars_ver or "") + 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 or "") end @@ -346,13 +354,40 @@ function _load_vcvarsall_impl(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. - print(result) + -- 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 -- cgit v1.3.1 From 11b33da5232cde7751c22a6a98fc2367656dd7a7 Mon Sep 17 00:00:00 2001 From: ruki Date: Fri, 28 Feb 2025 11:38:56 +0800 Subject: fix checkinfo --- xmake/modules/detect/sdks/find_vstudio.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xmake/modules/detect/sdks/find_vstudio.lua b/xmake/modules/detect/sdks/find_vstudio.lua index 25af40ff9..c3aca3ad4 100644 --- a/xmake/modules/detect/sdks/find_vstudio.lua +++ b/xmake/modules/detect/sdks/find_vstudio.lua @@ -275,7 +275,7 @@ function _load_vcvarsall_impl(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 -- cgit v1.3.1 From 6ef8012701246b25de35b396a20ab15f5dcaaeb6 Mon Sep 17 00:00:00 2001 From: ruki Date: Fri, 28 Feb 2025 23:00:43 +0800 Subject: update toolset limit --- xmake/modules/private/utils/toolchain.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 -- cgit v1.3.1