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 | |
| parent | 3fbba4de3674ce636cdb2e3456eff3828f77355a (diff) | |
improve to check vs envs and clang
| -rw-r--r-- | xmake/modules/private/utils/toolchain.lua | 69 | ||||
| -rw-r--r-- | xmake/toolchains/clang-cl/check.lua | 97 | ||||
| -rw-r--r-- | xmake/toolchains/clang/check.lua | 47 | ||||
| -rw-r--r-- | xmake/toolchains/icc/check.lua | 81 | ||||
| -rw-r--r-- | xmake/toolchains/icx/check.lua | 81 | ||||
| -rw-r--r-- | xmake/toolchains/ifort/check.lua | 81 | ||||
| -rw-r--r-- | xmake/toolchains/ifx/check.lua | 81 | ||||
| -rw-r--r-- | xmake/toolchains/msvc/check.lua | 90 |
8 files changed, 132 insertions, 495 deletions
diff --git a/xmake/modules/private/utils/toolchain.lua b/xmake/modules/private/utils/toolchain.lua index fe88b4838..28cbc23c0 100644 --- a/xmake/modules/private/utils/toolchain.lua +++ b/xmake/modules/private/utils/toolchain.lua @@ -28,6 +28,69 @@ import("core.language.language") import("lib.detect.find_tool") import("detect.sdks.find_vstudio") +-- attempt to check vs environment +function _check_vsenv(toolchain, check) + + -- 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 + 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 and check(toolchain, vcvars) then + return vsver + end + end + end + end +end + +-- check the visual studio +function check_vstudio(toolchain, check) + local vs = _check_vsenv(toolchain, check) + 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 +end + -- check vc build tools sdk function check_vc_build_tools(toolchain, sdkdir, check) local opt = {} @@ -46,11 +109,9 @@ function check_vc_build_tools(toolchain, sdkdir, check) 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) + if check and check(toolchain, vcvars) then + return vcvars end - return vcvars end end diff --git a/xmake/toolchains/clang-cl/check.lua b/xmake/toolchains/clang-cl/check.lua index 8b180afa5..2f9a2f22a 100644 --- a/xmake/toolchains/clang-cl/check.lua +++ b/xmake/toolchains/clang-cl/check.lua @@ -21,92 +21,20 @@ -- 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"}) -function _find_clang_cl(vcvars) +function _check_clang_cl(toolchain, vcvars) local paths local pathenv = os.getenv("PATH") if pathenv then paths = path.splitenv(pathenv) end - return find_tool("clang-cl", {version = true, force = true, paths = paths, envs = vcvars}) -end - --- attempt to check vs environment -function _check_vsenv(toolchain) - - -- has 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 + local result = find_tool("clang-cl", {force = true, paths = paths, envs = vcvars}) + if result then + cprint("checking for LLVM Clang C/C++ Compiler (%s) ... ${color.success}", toolchain:arch()) 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 - local tool = _find_clang_cl(vcvars) - if tool then - program = tool.program - end - if program then - return vsver, tool - end - end - end - end -end - --- check the visual studio -function _check_vstudio(toolchain) - local vs, clang_cl = _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) - 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 - else - cprint("checking for Microsoft Visual Studio (%s) version ... ${color.nothing}${text.nothing}", toolchain:arch()) - end - return vs + return result end function main(toolchain) @@ -121,29 +49,20 @@ 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 toolchain_utils.check_vc_build_tools(toolchain, sdkdir, check) + return toolchain_utils.check_vc_build_tools(toolchain, sdkdir, _check_clang_cl) 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 = toolchain_utils.check_vc_build_tools(toolchain, installdir, check) + local result = toolchain_utils.check_vc_build_tools(toolchain, installdir, _check_clang_cl) if result then return result end end end - - -- find it from system - return _check_vstudio(toolchain) + return toolchain_utils.check_vstudio(toolchain, _check_clang_cl) end end end diff --git a/xmake/toolchains/clang/check.lua b/xmake/toolchains/clang/check.lua index d396a486c..e331f7cf6 100644 --- a/xmake/toolchains/clang/check.lua +++ b/xmake/toolchains/clang/check.lua @@ -20,8 +20,22 @@ -- imports import("core.project.config") +import("lib.detect.find_tool") imports("private.utils.toolchain", {alias = "toolchain_utils"}) +function _check_clang(toolchain, vcvars, suffix) + local paths + local pathenv = os.getenv("PATH") + if pathenv then + paths = path.splitenv(pathenv) + end + local result = find_tool("clang" .. suffix, {force = true, paths = paths, envs = vcvars}) + if result then + cprint("checking for LLVM Clang C/C++ Compiler (%s) ... ${color.success}", toolchain:arch()) + end + return result +end + function main(toolchain, suffix) -- only for windows or linux (msvc-wine) @@ -29,19 +43,28 @@ function main(toolchain, suffix) return end - local sdkdir = toolchain:sdkdir() - if sdkdir then - 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) + -- @see https://github.com/xmake-io/xmake/pull/679 + local cc = path.basename(config.get("cc") or "clang"):lower() + local cxx = path.basename(config.get("cxx") or "clang++"):lower() + if cc == "clang" or cxx == "clang" or cxx == "clang++" then + local check = function (toolchain, vcvars) + return _check_clang(toolchain, vcvars, suffix) + end + local sdkdir = toolchain:sdkdir() + if sdkdir then + return toolchain_utils.check_vc_build_tools(toolchain, sdkdir, _check_clang) + else + 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_clang) + if result then + return result + end + end end + return toolchain_utils.check_vstudio(toolchain, _check_clang) end - return toolchain_utils.check_vc_build_tools(toolchain, sdkdir, check) end end + diff --git a/xmake/toolchains/icc/check.lua b/xmake/toolchains/icc/check.lua index a88e309af..8dfc95800 100644 --- a/xmake/toolchains/icc/check.lua +++ b/xmake/toolchains/icc/check.lua @@ -22,84 +22,11 @@ import("core.base.option") import("core.project.config") import("detect.sdks.find_iccenv") -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) - - -- has 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 - local paths - local pathenv = os.getenv("PATH") - if pathenv then - paths = path.splitenv(pathenv) - end - local tool = find_tool("cl.exe", {force = true, paths = paths, envs = vcvars}) - if tool then - program = tool.program - end - if program then - return vsver - end - end - end - 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 +function _check_cl(toolchain, vcvars) + return find_tool("cl.exe", {force = true, envs = vcvars}) end -- check intel on windows @@ -121,7 +48,7 @@ function _check_intel_on_windows(toolchain) if tool then cprint("checking for Intel C/C++ Compiler (%s) ... ${color.success}${text.success}", toolchain:arch()) toolchain:config_set("varsall", iclvarsall) - return _check_vstudio(toolchain) + return toolchain_utils.check_vstudio(toolchain, _check_cl) end end end diff --git a/xmake/toolchains/icx/check.lua b/xmake/toolchains/icx/check.lua index 29fc56a7c..b44b3ef50 100644 --- a/xmake/toolchains/icx/check.lua +++ b/xmake/toolchains/icx/check.lua @@ -22,84 +22,11 @@ import("core.base.option") import("core.project.config") import("detect.sdks.find_icxenv") -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) - - -- has 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 - local paths - local pathenv = os.getenv("PATH") - if pathenv then - paths = path.splitenv(pathenv) - end - local tool = find_tool("cl.exe", {force = true, paths = paths, envs = vcvars}) - if tool then - program = tool.program - end - if program then - return vsver - end - end - end - 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 +function _check_cl(toolchain, vcvars) + return find_tool("cl.exe", {force = true, envs = vcvars}) end -- check intel on windows @@ -121,7 +48,7 @@ function _check_intel_on_windows(toolchain) if tool then cprint("checking for Intel LLVM C/C++ Compiler (%s) ... ${color.success}${text.success}", toolchain:arch()) toolchain:config_set("varsall", icxvarsall) - return _check_vstudio(toolchain) + return toolchain_utils.check_vstudio(toolchain, _check_cl) end end end diff --git a/xmake/toolchains/ifort/check.lua b/xmake/toolchains/ifort/check.lua index e9dd5c133..c64ee1aa0 100644 --- a/xmake/toolchains/ifort/check.lua +++ b/xmake/toolchains/ifort/check.lua @@ -22,84 +22,11 @@ import("core.base.option") import("core.project.config") import("detect.sdks.find_ifortenv") -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) - - -- has 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 - local paths - local pathenv = os.getenv("PATH") - if pathenv then - paths = path.splitenv(pathenv) - end - local tool = find_tool("cl.exe", {force = true, paths = paths, envs = vcvars}) - if tool then - program = tool.program - end - if program then - return vsver - end - end - end - 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 +function _check_cl(toolchain, vcvars) + return find_tool("cl.exe", {force = true, envs = vcvars}) end -- check intel on windows @@ -121,7 +48,7 @@ function _check_intel_on_windows(toolchain) if tool then cprint("checking for Intel Fortran Compiler (%s) ... ${color.success}${text.success}", toolchain:arch()) toolchain:config_set("varsall", ifortvarsall) - return _check_vstudio(toolchain) + return toolchain_utils.check_vstudio(toolchain, _check_cl) end end end diff --git a/xmake/toolchains/ifx/check.lua b/xmake/toolchains/ifx/check.lua index 7a10a5865..c34526da5 100644 --- a/xmake/toolchains/ifx/check.lua +++ b/xmake/toolchains/ifx/check.lua @@ -22,84 +22,11 @@ import("core.base.option") import("core.project.config") import("detect.sdks.find_ifxenv") -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) - - -- has 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 - local paths - local pathenv = os.getenv("PATH") - if pathenv then - paths = path.splitenv(pathenv) - end - local tool = find_tool("cl.exe", {force = true, paths = paths, envs = vcvars}) - if tool then - program = tool.program - end - if program then - return vsver, - end - end - end - 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 +function _check_cl(toolchain, vcvars) + return find_tool("cl.exe", {force = true, envs = vcvars}) end -- check intel on windows @@ -121,7 +48,7 @@ function _check_intel_on_windows(toolchain) if tool then cprint("checking for Intel LLVM Fortran Compiler (%s) ... ${color.success}${text.success}", toolchain:arch()) toolchain:config_set("varsall", ifxvarsall) - return _check_vstudio(toolchain) + return toolchain_utils.check_vstudio(toolchain, _check_cl) end end end 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 |
