summaryrefslogtreecommitdiff
path: root/xmake/toolchains/msvc/check.lua
diff options
context:
space:
mode:
Diffstat (limited to 'xmake/toolchains/msvc/check.lua')
-rw-r--r--xmake/toolchains/msvc/check.lua103
1 files changed, 103 insertions, 0 deletions
diff --git a/xmake/toolchains/msvc/check.lua b/xmake/toolchains/msvc/check.lua
new file mode 100644
index 000000000..d4861e16d
--- /dev/null
+++ b/xmake/toolchains/msvc/check.lua
@@ -0,0 +1,103 @@
+--!A cross-toolchain build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015-2020, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file check.lua
+--
+
+-- imports
+import("core.base.option")
+import("core.project.config")
+import("detect.sdks.find_vstudio")
+import("lib.detect.find_tool")
+
+-- attempt to check vs environment
+function _check_vsenv(toolchain)
+
+ -- have been checked?
+ local vs = config.get("vs")
+ if vs and config.get("__vcvarsall") then
+ return vs
+ end
+
+ -- find vstudio
+ local vstudio = find_vstudio({vcvars_ver = config.get("vs_toolset"), sdkver = config.get("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 vsenv = vcvarsall[toolchain:arch()]
+ if vsenv and vsenv.path and vsenv.include and vsenv.lib then
+
+ -- save vsenv
+ config.set("__vcvarsall", vcvarsall)
+
+ -- check compiler
+ local program = nil
+ local tool = find_tool("cl.exe", {force = true, envs = vsenv})
+ 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
+ config.set("vs", vs, {readonly = true, force = true})
+ cprint("checking for the Microsoft Visual Studio (%s) version ... ${color.success}%s", toolchain:arch(), vs)
+ else
+ cprint("checking for the Microsoft Visual Studio (%s) version ... ${color.nothing}${text.nothing}", toolchain:arch())
+ if not (opt and opt.try) then
+ print("please run:")
+ print(" - xmake config --vs=xxx [--vs_toolset=xxx]")
+ print("or - xmake global --vs=xxx")
+ raise()
+ end
+ end
+ return vs
+end
+
+-- main entry
+function main(toolchain)
+ -- @see https://github.com/xmake-io/xmake/pull/679
+ local cc = path.basename(config.get("cc") or "cl"):lower()
+ 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
+ return _check_vstudio(toolchain)
+ end
+end
+