diff options
| -rw-r--r-- | xmake/modules/core/tools/clang_cl.lua | 3 | ||||
| -rw-r--r-- | xmake/toolchains/clang-cl/check.lua | 119 | ||||
| -rw-r--r-- | xmake/toolchains/clang-cl/load.lua | 72 | ||||
| -rw-r--r-- | xmake/toolchains/clang-cl/xmake.lua | 45 |
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") |
