summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-09-30 00:58:53 +0800
committerruki <[email protected]>2022-09-30 00:58:53 +0800
commitecaa179804da7c2de6f2c479ec850619a7e85aa8 (patch)
treeef952e939af76250ff4be6acd555fcc708ca3229
parenteef4865d1df048921dd06541dd9038f457af9e90 (diff)
add clang-cl toolchain
-rw-r--r--xmake/modules/core/tools/clang_cl.lua3
-rw-r--r--xmake/toolchains/clang-cl/check.lua119
-rw-r--r--xmake/toolchains/clang-cl/load.lua72
-rw-r--r--xmake/toolchains/clang-cl/xmake.lua45
4 files changed, 238 insertions, 1 deletions
diff --git a/xmake/modules/core/tools/clang_cl.lua b/xmake/modules/core/tools/clang_cl.lua
index 46daa2df3..b4b7211e1 100644
--- a/xmake/modules/core/tools/clang_cl.lua
+++ b/xmake/modules/core/tools/clang_cl.lua
@@ -128,7 +128,8 @@ function compile(self, sourcefile, objectfile, dependinfo, flags)
end
-- do compile
- return os.iorunv(compargv(self, sourcefile, objectfile, compflags))
+ local program, argv = compargv(self, sourcefile, objectfile, compflags)
+ return os.iorunv(program, argv, {envs = self:runenvs()})
end,
catch
{
diff --git a/xmake/toolchains/clang-cl/check.lua b/xmake/toolchains/clang-cl/check.lua
new file mode 100644
index 000000000..7f683f2c8
--- /dev/null
+++ b/xmake/toolchains/clang-cl/check.lua
@@ -0,0 +1,119 @@
+--!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-present, 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 = 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 = nil
+ local tool = find_tool("clang-cl.exe", {version = true, force = true, 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, 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)
+ toolchain:configs_save()
+ 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
+end
+
+-- main entry
+function main(toolchain)
+
+ -- only for windows
+ if not is_host("windows") then
+ return
+ end
+
+ -- @see https://github.com/xmake-io/xmake/pull/679
+ local cc = path.basename(config.get("cc") or "clang-cl"):lower()
+ 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
+ return _check_vstudio(toolchain)
+ end
+end
+
diff --git a/xmake/toolchains/clang-cl/load.lua b/xmake/toolchains/clang-cl/load.lua
new file mode 100644
index 000000000..b2db0761e
--- /dev/null
+++ b/xmake/toolchains/clang-cl/load.lua
@@ -0,0 +1,72 @@
+--!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-present, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file load.lua
+--
+
+-- imports
+import("core.base.option")
+import("core.project.config")
+import("detect.sdks.find_vstudio")
+
+-- add the given vs environment
+function _add_vsenv(toolchain, name)
+
+ -- 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
+ toolchain:add("runenvs", name, table.unwrap(path.splitenv(new)))
+ end
+end
+
+-- main entry
+function main(toolchain)
+
+ -- set toolset
+ toolchain:set("toolset", "cc", "clang-cl.exe")
+ toolchain:set("toolset", "cxx", "clang-cl.exe")
+ toolchain:set("toolset", "mrc", "rc.exe")
+ if toolchain:is_arch("x64") then
+ toolchain:set("toolset", "as", "ml64.exe")
+ else
+ toolchain:set("toolset", "as", "ml.exe")
+ end
+ toolchain:set("toolset", "ld", "link.exe")
+ toolchain:set("toolset", "sh", "link.exe")
+ toolchain:set("toolset", "ar", "link.exe")
+
+ -- add vs environments
+ local expect_vars = {"PATH", "LIB", "INCLUDE", "LIBPATH"}
+ for _, name in ipairs(expect_vars) do
+ _add_vsenv(toolchain, name)
+ end
+ for _, name in ipairs(find_vstudio.get_vcvars()) do
+ if not table.contains(expect_vars, name:upper()) then
+ _add_vsenv(toolchain, name)
+ end
+ end
+
+ -- add some default flags
+ toolchain:add("clang_cl.cxxflags", "/EHsc")
+end
+
diff --git a/xmake/toolchains/clang-cl/xmake.lua b/xmake/toolchains/clang-cl/xmake.lua
new file mode 100644
index 000000000..79ca6dc6e
--- /dev/null
+++ b/xmake/toolchains/clang-cl/xmake.lua
@@ -0,0 +1,45 @@
+--!A cross-platform 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-present, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file xmake.lua
+--
+
+-- clang-cl toolchain
+--
+-- @param vs the vs version
+--
+-- @code
+-- target("test")
+-- ...
+-- set_toolchains("clang-cl")
+-- set_toolchains("clang-cl", {vs = "2019"})
+-- @endcode
+--
+toolchain("clang-cl")
+
+ -- set homepage
+ set_homepage("https://visualstudio.microsoft.com")
+ set_description("LLVM Clang C/C++ Compiler compatible with msvc")
+
+ -- mark as standalone toolchain
+ set_kind("standalone")
+
+ -- check toolchain
+ on_check("check")
+
+ -- load toolchain
+ on_load("load")