summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2024-05-23 22:57:20 +0800
committerruki <[email protected]>2024-05-23 22:57:20 +0800
commitbe0da314e2a706fff2d10ef68588275d2a90e638 (patch)
tree73c8b43002c56a0a13aa0385b85aef8e901b3855
parent537c5aacf5d0306a3ca786932737991c29e8ecc5 (diff)
check vs for ifort/icx
-rw-r--r--xmake/toolchains/icx/check.lua85
-rw-r--r--xmake/toolchains/icx/load.lua37
-rw-r--r--xmake/toolchains/ifort/check.lua84
-rw-r--r--xmake/toolchains/ifort/load.lua37
4 files changed, 241 insertions, 2 deletions
diff --git a/xmake/toolchains/icx/check.lua b/xmake/toolchains/icx/check.lua
index d22889f14..d2d7b2df9 100644
--- a/xmake/toolchains/icx/check.lua
+++ b/xmake/toolchains/icx/check.lua
@@ -22,8 +22,91 @@
import("core.base.option")
import("core.project.config")
import("detect.sdks.find_icxenv")
+import("detect.sdks.find_vstudio")
import("lib.detect.find_tool")
+-- 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({vcvars_ver = 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", {version = true, force = true, paths = paths, envs = 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, 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)
+ toolchain:configs_save()
+ cprint("checking for Microsoft Visual Studio (%s) version ... ${color.success}%s", toolchain:arch(), vs)
+ if cl and cl.version then
+ cprint("checking for LLVM Clang C/C++ Compiler (%s) version ... ${color.success}%s", toolchain:arch(), cl.version)
+ end
+ else
+ cprint("checking for Microsoft Visual Studio (%s) version ... ${color.nothing}${text.nothing}", toolchain:arch())
+ end
+ return vs
+end
+
+
-- check intel on windows
function _check_intel_on_windows(toolchain)
@@ -44,7 +127,7 @@ function _check_intel_on_windows(toolchain)
cprint("checking for Intel LLVM C/C++ Compiler (%s) ... ${color.success}${text.success}", toolchain:arch())
toolchain:config_set("varsall", icxvarsall)
toolchain:configs_save()
- return true
+ return _check_vstudio(toolchain)
end
end
end
diff --git a/xmake/toolchains/icx/load.lua b/xmake/toolchains/icx/load.lua
index ebe3e8554..74f021c07 100644
--- a/xmake/toolchains/icx/load.lua
+++ b/xmake/toolchains/icx/load.lua
@@ -21,6 +21,31 @@
-- imports
import("core.base.option")
import("core.project.config")
+import("detect.sdks.find_vstudio")
+
+-- add the given vs environment
+function _add_vsenv(toolchain, name, curenvs)
+
+ -- get vcvars
+ local vcvars = toolchain:config("vcvars")
+ if not vcvars then
+ return
+ end
+
+ -- get the paths for the vs environment
+ local new = vcvars[name]
+ if new then
+ -- fix case naming conflict for cmake/msbuild between the new msvc envs and current environment, if we are running xmake in vs prompt.
+ -- @see https://github.com/xmake-io/xmake/issues/4751
+ for k, c in pairs(curenvs) do
+ if name:lower() == k:lower() and name ~= k then
+ name = k
+ break
+ end
+ end
+ toolchain:add("runenvs", name, table.unwrap(path.splitenv(new)))
+ end
+end
-- add the given icx environment
function _add_icxenv(toolchain, name)
@@ -73,6 +98,18 @@ function _load_intel_on_windows(toolchain)
_add_icxenv(toolchain, "LIB")
_add_icxenv(toolchain, "INCLUDE")
_add_icxenv(toolchain, "LIBPATH")
+
+ -- add vs environments
+ local expect_vars = {"PATH", "LIB", "INCLUDE", "LIBPATH"}
+ local curenvs = os.getenvs()
+ for _, name in ipairs(expect_vars) do
+ _add_vsenv(toolchain, name, curenvs)
+ end
+ for _, name in ipairs(find_vstudio.get_vcvars()) do
+ if not table.contains(expect_vars, name:upper()) then
+ _add_vsenv(toolchain, name, curenvs)
+ end
+ end
end
-- load intel on linux
diff --git a/xmake/toolchains/ifort/check.lua b/xmake/toolchains/ifort/check.lua
index 285f5c86c..8ba2a3881 100644
--- a/xmake/toolchains/ifort/check.lua
+++ b/xmake/toolchains/ifort/check.lua
@@ -22,8 +22,90 @@
import("core.base.option")
import("core.project.config")
import("detect.sdks.find_ifortenv")
+import("detect.sdks.find_vstudio")
import("lib.detect.find_tool")
+-- 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({vcvars_ver = 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", {version = true, force = true, paths = paths, envs = 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, 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)
+ toolchain:configs_save()
+ cprint("checking for Microsoft Visual Studio (%s) version ... ${color.success}%s", toolchain:arch(), vs)
+ if cl and cl.version then
+ cprint("checking for LLVM Clang C/C++ Compiler (%s) version ... ${color.success}%s", toolchain:arch(), cl.version)
+ end
+ else
+ cprint("checking for Microsoft Visual Studio (%s) version ... ${color.nothing}${text.nothing}", toolchain:arch())
+ end
+ return vs
+end
+
-- check intel on windows
function _check_intel_on_windows(toolchain)
@@ -44,7 +126,7 @@ function _check_intel_on_windows(toolchain)
cprint("checking for Intel Fortran Compiler (%s) ... ${color.success}${text.success}", toolchain:arch())
toolchain:config_set("varsall", ifortvarsall)
toolchain:configs_save()
- return true
+ return _check_vstudio(toolchain)
end
end
end
diff --git a/xmake/toolchains/ifort/load.lua b/xmake/toolchains/ifort/load.lua
index 2cb212a57..d0333ea77 100644
--- a/xmake/toolchains/ifort/load.lua
+++ b/xmake/toolchains/ifort/load.lua
@@ -21,6 +21,31 @@
-- imports
import("core.base.option")
import("core.project.config")
+import("detect.sdks.find_vstudio")
+
+-- add the given vs environment
+function _add_vsenv(toolchain, name, curenvs)
+
+ -- get vcvars
+ local vcvars = toolchain:config("vcvars")
+ if not vcvars then
+ return
+ end
+
+ -- get the paths for the vs environment
+ local new = vcvars[name]
+ if new then
+ -- fix case naming conflict for cmake/msbuild between the new msvc envs and current environment, if we are running xmake in vs prompt.
+ -- @see https://github.com/xmake-io/xmake/issues/4751
+ for k, c in pairs(curenvs) do
+ if name:lower() == k:lower() and name ~= k then
+ name = k
+ break
+ end
+ end
+ toolchain:add("runenvs", name, table.unwrap(path.splitenv(new)))
+ end
+end
-- add the given ifort environment
function _add_ifortenv(toolchain, name)
@@ -62,6 +87,18 @@ function _load_intel_on_windows(toolchain)
_add_ifortenv(toolchain, "LIB")
_add_ifortenv(toolchain, "INCLUDE")
_add_ifortenv(toolchain, "LIBPATH")
+
+ -- add vs environments
+ local expect_vars = {"PATH", "LIB", "INCLUDE", "LIBPATH"}
+ local curenvs = os.getenvs()
+ for _, name in ipairs(expect_vars) do
+ _add_vsenv(toolchain, name, curenvs)
+ end
+ for _, name in ipairs(find_vstudio.get_vcvars()) do
+ if not table.contains(expect_vars, name:upper()) then
+ _add_vsenv(toolchain, name, curenvs)
+ end
+ end
end
-- load intel on linux