diff options
| author | ruki <[email protected]> | 2024-05-23 22:57:20 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2024-05-23 22:57:20 +0800 |
| commit | be0da314e2a706fff2d10ef68588275d2a90e638 (patch) | |
| tree | 73c8b43002c56a0a13aa0385b85aef8e901b3855 | |
| parent | 537c5aacf5d0306a3ca786932737991c29e8ecc5 (diff) | |
check vs for ifort/icx
| -rw-r--r-- | xmake/toolchains/icx/check.lua | 85 | ||||
| -rw-r--r-- | xmake/toolchains/icx/load.lua | 37 | ||||
| -rw-r--r-- | xmake/toolchains/ifort/check.lua | 84 | ||||
| -rw-r--r-- | xmake/toolchains/ifort/load.lua | 37 |
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 |
