diff options
| author | ruki <[email protected]> | 2020-05-20 00:30:23 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2020-05-19 21:02:23 +0800 |
| commit | 04493b00d03e87e3c2af7d9f58bb43edb77eb410 (patch) | |
| tree | eb0a7b5ecb9369cc1d7b67b8a7c1008492d7e974 | |
| parent | 86598231b463786d3a20bdb267e54f352f3c1b63 (diff) | |
add cross and llvm toolchains
| -rw-r--r-- | xmake/core/platform/platform.lua | 3 | ||||
| -rw-r--r-- | xmake/core/tool/toolchain.lua | 6 | ||||
| -rw-r--r-- | xmake/platforms/cross/check.lua | 160 | ||||
| -rw-r--r-- | xmake/platforms/cross/load.lua | 46 | ||||
| -rw-r--r-- | xmake/platforms/cross/xmake.lua | 4 | ||||
| -rw-r--r-- | xmake/toolchains/cross/check.lua | 41 | ||||
| -rw-r--r-- | xmake/toolchains/cross/xmake.lua | 66 | ||||
| -rw-r--r-- | xmake/toolchains/envs/xmake.lua | 4 | ||||
| -rw-r--r-- | xmake/toolchains/llvm/check.lua | 41 | ||||
| -rw-r--r-- | xmake/toolchains/llvm/xmake.lua | 60 |
10 files changed, 229 insertions, 202 deletions
diff --git a/xmake/core/platform/platform.lua b/xmake/core/platform/platform.lua index 3e3b537d1..1ca688636 100644 --- a/xmake/core/platform/platform.lua +++ b/xmake/core/platform/platform.lua @@ -110,8 +110,7 @@ function _instance:toolchains() local names = {} if config.get("toolchain") then table.insert(names, config.get("toolchain")) - end - if self._INFO:get("toolchains") then + elseif self._INFO:get("toolchains") then table.join2(names, self._INFO:get("toolchains")) end toolchains = {} diff --git a/xmake/core/tool/toolchain.lua b/xmake/core/tool/toolchain.lua index 032445b3d..78da9ea7f 100644 --- a/xmake/core/tool/toolchain.lua +++ b/xmake/core/tool/toolchain.lua @@ -100,6 +100,11 @@ function _instance:bindir() return config.get("bin") or self:get("bindir") end +-- get the sdk directory +function _instance:sdkdir() + return config.get("sdk") or self:get("sdkdir") +end + -- do load function _instance:_load() if not self._LOADED then @@ -267,6 +272,7 @@ function toolchain._apis() values = { "toolchain.set_bindir" + , "toolchain.set_sdkdir" } , keyvalues = { diff --git a/xmake/platforms/cross/check.lua b/xmake/platforms/cross/check.lua index 833dcb921..0c95f43c9 100644 --- a/xmake/platforms/cross/check.lua +++ b/xmake/platforms/cross/check.lua @@ -20,11 +20,6 @@ -- imports import("core.project.config") -import("core.base.singleton") -import("detect.sdks.find_cross_toolchain") -import("private.platform.toolchain") -import("private.platform.check_arch") -import("private.platform.check_toolchain") -- check the architecture function _check_arch() @@ -36,154 +31,19 @@ function _check_arch() end end --- check the cross toolchain -function _check_cross_toolchain() - -- find cross toolchain - local cross_toolchain = find_cross_toolchain(config.get("sdk") or config.get("bin"), {bindir = config.get("bin"), cross = config.get("cross")}) - if cross_toolchain then - config.set("cross", cross_toolchain.cross, {readonly = true, force = true}) - config.set("bin", cross_toolchain.bindir, {readonly = true, force = true}) - - -- TODO add to environment module - -- add bin search library for loading some dependent .dll files windows - if cross_toolchain.bindir and is_host("windows") then - os.addenv("PATH", cross_toolchain.bindir) - end - end -end - --- get llvm toolchains -function _toolchains_llvm() - - -- init toolchains - local cc = toolchain("the c compiler") - local cxx = toolchain("the c++ compiler") - local cpp = toolchain("the c preprocessor") - local ld = toolchain("the linker") - local sh = toolchain("the shared library linker") - local ar = toolchain("the static library archiver") - local ex = toolchain("the static library extractor") - local strip = toolchain("the symbols stripper") - local ranlib = toolchain("the static library index generator") - local as = toolchain("the assember") - local toolchains = {cc = cc, cxx = cxx, cpp = cpp, as = as, ld = ld, sh = sh, ar = ar, ex = ex, ranlib = ranlib, strip = strip} - - -- init the c compiler - cc:add("$(env CC)", "clang") - - -- init the c preprocessor - cpp:add("$(env CPP)", "clang -E") - - -- init the c++ compiler - cxx:add("$(env CXX)", "clang", "clang++") - - -- init the assember - as:add("$(env AS)", "clang") - - -- init the linker - ld:add("$(env LD)", "$(env CXX)", "clang++", "clang") - - -- init the shared library linker - sh:add("$(env SH)", "$(env CXX)", "clang++", "clang") - - -- init the static library archiver - ar:add("$(env AR)", "llvm-ar") - - -- init the static library extractor - ex:add("$(env AR)", "llvm-ar") - - -- init the static library index generator - ranlib:add("$(env RANLIB)", "llvm-ranlib") - - -- init the symbols stripper - strip:add("$(env STRIP)", "llvm-strip") - return toolchains -end - --- get toolchains -function _toolchains() - - -- get cross prefix - local cross = config.get("cross") or "" - - -- for llvm toolchains? - if cross == "" and config.get("toolchain") == "llvm" then - return _toolchains_llvm() - end - - -- init toolchains - local cc = toolchain("the c compiler") - local cxx = toolchain("the c++ compiler") - local cpp = toolchain("the c preprocessor") - local ld = toolchain("the linker") - local sh = toolchain("the shared library linker") - local ar = toolchain("the static library archiver") - local ex = toolchain("the static library extractor") - local strip = toolchain("the symbols stripper") - local ranlib = toolchain("the static library index generator") - local as = toolchain("the assember") - local toolchains = {cc = cc, cxx = cxx, cpp = cpp, as = as, ld = ld, sh = sh, ar = ar, ex = ex, ranlib = ranlib, strip = strip} - - -- init the c compiler - cc:add("$(env CC)", {name = "gcc", cross = cross}, {name = "clang", cross = cross}) - - -- init the c preprocessor - cpp:add("$(env CPP)", {name = "gcc -E", cross = cross}, {name = "clang -E", cross = cross}) - - -- init the c++ compiler - cxx:add("$(env CXX)") - cxx:add({name = "gcc", cross = cross}) - cxx:add({name = "clang", cross = cross}) - cxx:add({name = "g++", cross = cross}) - cxx:add({name = "clang++", cross = cross}) - - -- init the assember - as:add("$(env AS)", {name = "gcc", cross = cross}, {name = "clang", cross = cross}) - - -- init the linker - ld:add("$(env LD)", "$(env CXX)") - ld:add({name = "g++", cross = cross}) - ld:add({name = "gcc", cross = cross}) - ld:add({name = "clang++", cross = cross}) - ld:add({name = "clang", cross = cross}) - - -- init the shared library linker - sh:add("$(env SH)", "$(env CXX)") - sh:add({name = "g++", cross = cross}) - sh:add({name = "gcc", cross = cross}) - sh:add({name = "clang++", cross = cross}) - sh:add({name = "clang", cross = cross}) - - -- init the static library archiver - ar:add("$(env AR)", {name = "ar", cross = cross}) - - -- init the static library extractor - ex:add("$(env AR)", {name = "ar", cross = cross}) - - -- init the static library index generator - ranlib:add("$(env RANLIB)", {name = "ranlib", cross = cross}) - - -- init the symbols stripper - strip:add("$(env STRIP)", {name = "strip", cross = cross}) - return toolchains -end - -- check it -function main(platform, name) - - -- only check the given config name? - if name then - local toolchain = singleton.get("cross.toolchains", _toolchains)[name] - if toolchain then - check_toolchain(config, name, toolchain) - end - else +function main(platform) - -- check arch - _check_arch() + -- check arch + _check_arch() - -- check cross toolchain - _check_cross_toolchain() + -- check toolchains + local toolchains = platform:toolchains() + for idx, toolchain in irpairs(toolchains) do + if not toolchain:check() then + table.remove(toolchains, idx) + end end + assert(#toolchains > 0, "toolchains not found!") end diff --git a/xmake/platforms/cross/load.lua b/xmake/platforms/cross/load.lua deleted file mode 100644 index 2bc56f971..000000000 --- a/xmake/platforms/cross/load.lua +++ /dev/null @@ -1,46 +0,0 @@ ---!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-2020, TBOOX Open Source Group. --- --- @author ruki --- @file load.lua --- - --- imports -import("core.project.config") - --- load it -function main(platform) - - -- init linkdirs and includedirs - local sdkdir = config.get("sdk") - if sdkdir then - local includedir = path.join(sdkdir, "include") - if os.isdir(includedir) then - platform:add("includedirs", includedir) - end - local linkdir = path.join(sdkdir, "lib") - if os.isdir(linkdir) then - platform:add("linkdirs", linkdir) - end - end - - -- add bin search library for loading some dependent .dll files windows - local bindir = config.get("bin") - if bindir and is_host("windows") then - os.addenv("PATH", bindir) - end -end - diff --git a/xmake/platforms/cross/xmake.lua b/xmake/platforms/cross/xmake.lua index a76dde03c..e46f2fb06 100644 --- a/xmake/platforms/cross/xmake.lua +++ b/xmake/platforms/cross/xmake.lua @@ -33,7 +33,7 @@ platform("cross") -- on check on_check("check") - -- on load - on_load("load") + -- set toolchains + set_toolchains("envs", "cross") diff --git a/xmake/toolchains/cross/check.lua b/xmake/toolchains/cross/check.lua new file mode 100644 index 000000000..6a5bd874d --- /dev/null +++ b/xmake/toolchains/cross/check.lua @@ -0,0 +1,41 @@ +--!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.project.config") +import("detect.sdks.find_cross_toolchain") + +-- check the cross toolchain +function main(toolchain) + + -- find cross toolchain + local cross_toolchain = find_cross_toolchain(config.get("sdk") or config.get("bin"), {bindir = config.get("bin"), cross = config.get("cross")}) + if cross_toolchain then + config.set("cross", cross_toolchain.cross, {readonly = true, force = true}) + config.set("bin", cross_toolchain.bindir, {readonly = true, force = true}) + else + -- failed + cprint("${bright color.error}cross toolchain not found, please run:") + cprint(" - xmake config --sdk=xxx") + cprint("or - xmake global --sdk=xxx") + raise() + end + return cross_toolchain +end diff --git a/xmake/toolchains/cross/xmake.lua b/xmake/toolchains/cross/xmake.lua new file mode 100644 index 000000000..78be10f98 --- /dev/null +++ b/xmake/toolchains/cross/xmake.lua @@ -0,0 +1,66 @@ +--!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-2020, TBOOX Open Source Group. +-- +-- @author ruki +-- @file xmake.lua +-- + +-- define toolchain +toolchain("cross") + + -- check toolchain + on_check("check") + + -- on load + on_load(function (toolchain) + + -- imports + import("core.project.config") + + -- get cross prefix + local cross = config.get("cross") or "" + + -- set toolsets + toolchain:set("toolsets", "cc", cross .. "gcc", cross .. "clang") + toolchain:set("toolsets", "cxx", cross .. "gcc", cross .. "clang", cross .. "g++", cross .. "clang++") + toolchain:set("toolsets", "cpp", cross .. "gcc -E", cross .. "clang -E") + toolchain:set("toolsets", "as", cross .. "gcc", cross .. "clang") + toolchain:set("toolsets", "ld", cross .. "g++", cross .. "gcc", cross .. "clang++", cross .. "clang") + toolchain:set("toolsets", "sh", cross .. "g++", cross .. "gcc", cross .. "clang++", cross .. "clang") + toolchain:set("toolsets", "ar", cross .. "ar") + toolchain:set("toolsets", "ex", cross .. "ar") + toolchain:set("toolsets", "ranlib", cross .. "ranlib") + toolchain:set("toolsets", "strip", cross .. "strip") + + -- init linkdirs and includedirs + local sdkdir = toolchain:sdkdir() + if sdkdir then + local includedir = path.join(sdkdir, "include") + if os.isdir(includedir) then + toolchain:add("includedirs", includedir) + end + local linkdir = path.join(sdkdir, "lib") + if os.isdir(linkdir) then + toolchain:add("linkdirs", linkdir) + end + end + + -- add bin search library for loading some dependent .dll files windows + local bindir = toolchain:bindir() + if bindir and is_host("windows") then + os.addenv("PATH", bindir) + end + end) diff --git a/xmake/toolchains/envs/xmake.lua b/xmake/toolchains/envs/xmake.lua index 899802b8e..f5dda488b 100644 --- a/xmake/toolchains/envs/xmake.lua +++ b/xmake/toolchains/envs/xmake.lua @@ -24,8 +24,8 @@ toolchain("envs") -- set toolsets set_toolsets("cc", "$(env CC)") set_toolsets("cxx", "$(env CXX)") - set_toolsets("ld", "$(env LD)") - set_toolsets("sh", "$(env SH)") + set_toolsets("ld", "$(env LD)", "$(env CXX)") + set_toolsets("sh", "$(env SH)", "$(env LD)", "$(env CXX)") set_toolsets("ar", "$(env AR)") set_toolsets("ex", "$(env EX)", "$(env AR)") set_toolsets("strip", "$(env STRIP)") diff --git a/xmake/toolchains/llvm/check.lua b/xmake/toolchains/llvm/check.lua new file mode 100644 index 000000000..6a5bd874d --- /dev/null +++ b/xmake/toolchains/llvm/check.lua @@ -0,0 +1,41 @@ +--!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.project.config") +import("detect.sdks.find_cross_toolchain") + +-- check the cross toolchain +function main(toolchain) + + -- find cross toolchain + local cross_toolchain = find_cross_toolchain(config.get("sdk") or config.get("bin"), {bindir = config.get("bin"), cross = config.get("cross")}) + if cross_toolchain then + config.set("cross", cross_toolchain.cross, {readonly = true, force = true}) + config.set("bin", cross_toolchain.bindir, {readonly = true, force = true}) + else + -- failed + cprint("${bright color.error}cross toolchain not found, please run:") + cprint(" - xmake config --sdk=xxx") + cprint("or - xmake global --sdk=xxx") + raise() + end + return cross_toolchain +end diff --git a/xmake/toolchains/llvm/xmake.lua b/xmake/toolchains/llvm/xmake.lua new file mode 100644 index 000000000..d04234809 --- /dev/null +++ b/xmake/toolchains/llvm/xmake.lua @@ -0,0 +1,60 @@ +--!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-2020, TBOOX Open Source Group. +-- +-- @author ruki +-- @file xmake.lua +-- + +-- define toolchain +toolchain("llvm") + + -- check toolchain + on_check("check") + + -- on load + on_load(function (toolchain) + + -- set toolsets + toolchain:set("toolsets", "cc", "clang") + toolchain:set("toolsets", "cxx", "clang", "clang++") + toolchain:set("toolsets", "cpp", "clang -E") + toolchain:set("toolsets", "as", "clang") + toolchain:set("toolsets", "ld", "clang++", "clang") + toolchain:set("toolsets", "sh", "clang++", "clang") + toolchain:set("toolsets", "ar", "llvm-ar") + toolchain:set("toolsets", "ex", "llvm-ar") + toolchain:set("toolsets", "ranlib", "llvm-ranlib") + toolchain:set("toolsets", "strip", "llvm-strip") + + -- init linkdirs and includedirs + local sdkdir = toolchain:sdkdir() + if sdkdir then + local includedir = path.join(sdkdir, "include") + if os.isdir(includedir) then + toolchain:add("includedirs", includedir) + end + local linkdir = path.join(sdkdir, "lib") + if os.isdir(linkdir) then + toolchain:add("linkdirs", linkdir) + end + end + + -- add bin search library for loading some dependent .dll files windows + local bindir = toolchain:bindir() + if bindir and is_host("windows") then + os.addenv("PATH", bindir) + end + end) |
