summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2020-05-20 00:30:23 +0800
committerruki <[email protected]>2020-05-19 21:02:23 +0800
commit04493b00d03e87e3c2af7d9f58bb43edb77eb410 (patch)
treeeb0a7b5ecb9369cc1d7b67b8a7c1008492d7e974
parent86598231b463786d3a20bdb267e54f352f3c1b63 (diff)
add cross and llvm toolchains
-rw-r--r--xmake/core/platform/platform.lua3
-rw-r--r--xmake/core/tool/toolchain.lua6
-rw-r--r--xmake/platforms/cross/check.lua160
-rw-r--r--xmake/platforms/cross/load.lua46
-rw-r--r--xmake/platforms/cross/xmake.lua4
-rw-r--r--xmake/toolchains/cross/check.lua41
-rw-r--r--xmake/toolchains/cross/xmake.lua66
-rw-r--r--xmake/toolchains/envs/xmake.lua4
-rw-r--r--xmake/toolchains/llvm/check.lua41
-rw-r--r--xmake/toolchains/llvm/xmake.lua60
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)