diff options
| author | ruki <[email protected]> | 2020-05-26 00:34:08 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2020-05-25 21:24:53 +0800 |
| commit | 97b53dfcb67c898f40fae06b6b939e4dac32a3a0 (patch) | |
| tree | c91bfc82592938ae27e2a72ec38737b33cd3988a | |
| parent | 05b37be8865ff1af2051766a835e7576a6780e55 (diff) | |
add set_toolchains for target
| -rw-r--r-- | tests/apis/set_toolchains/src/interface.cpp | 6 | ||||
| -rw-r--r-- | tests/apis/set_toolchains/src/interface.h | 16 | ||||
| -rw-r--r-- | tests/apis/set_toolchains/src/test.cpp | 10 | ||||
| -rw-r--r-- | tests/apis/set_toolchains/xmake.lua | 35 | ||||
| -rw-r--r-- | xmake/core/project/project.lua | 19 | ||||
| -rw-r--r-- | xmake/core/project/target.lua | 62 | ||||
| -rw-r--r-- | xmake/core/tool/compiler.lua | 12 | ||||
| -rw-r--r-- | xmake/core/tool/linker.lua | 12 | ||||
| -rw-r--r-- | xmake/core/tool/tool.lua | 6 |
9 files changed, 156 insertions, 22 deletions
diff --git a/tests/apis/set_toolchains/src/interface.cpp b/tests/apis/set_toolchains/src/interface.cpp new file mode 100644 index 000000000..598d07560 --- /dev/null +++ b/tests/apis/set_toolchains/src/interface.cpp @@ -0,0 +1,6 @@ +#include "interface.h" + +int add(int a, int b) +{ + return a + b; +} diff --git a/tests/apis/set_toolchains/src/interface.h b/tests/apis/set_toolchains/src/interface.h new file mode 100644 index 000000000..4a41e9597 --- /dev/null +++ b/tests/apis/set_toolchains/src/interface.h @@ -0,0 +1,16 @@ +#ifdef __cplusplus +extern "C" { +#endif + +/*! calculate add(a, b) + * + * @param a the first argument + * @param b the second argument + * + * @return the result + */ +int add(int a, int b); + +#ifdef __cplusplus +} +#endif diff --git a/tests/apis/set_toolchains/src/test.cpp b/tests/apis/set_toolchains/src/test.cpp new file mode 100644 index 000000000..72e03272b --- /dev/null +++ b/tests/apis/set_toolchains/src/test.cpp @@ -0,0 +1,10 @@ +#include "interface.h" +#include <iostream> + +using namespace std; + +int main(int argc, char** argv) +{ + cout << "add(1, 2) = " << add(1, 2) << endl; + return 0; +} diff --git a/tests/apis/set_toolchains/xmake.lua b/tests/apis/set_toolchains/xmake.lua new file mode 100644 index 000000000..4057322d8 --- /dev/null +++ b/tests/apis/set_toolchains/xmake.lua @@ -0,0 +1,35 @@ +-- define toolchain +toolchain("myclang") + + -- mark as standalone toolchain + set_kind("standalone") + + -- set toolsets + set_toolsets("cc", "clang") + set_toolsets("cxx", "clang", "clang++") + set_toolsets("ld", "clang++", "clang") + set_toolsets("sh", "clang++", "clang") + set_toolsets("ar", "ar") + set_toolsets("ex", "ar") + set_toolsets("strip", "strip") + set_toolsets("mm", "clang") + set_toolsets("mxx", "clang", "clang++") + set_toolsets("as", "clang") + + add_defines("MYCLANG") + +toolchain_end() + +add_rules("mode.debug", "mode.release") + +target("test") + set_kind("static") + add_files("src/interface.cpp") + +target("demo") + set_kind("binary") + add_deps("test") + add_files("src/test.cpp") + set_toolchains("myclang") + + diff --git a/xmake/core/project/project.lua b/xmake/core/project/project.lua index 1c97bdfd4..be492e662 100644 --- a/xmake/core/project/project.lua +++ b/xmake/core/project/project.lua @@ -429,7 +429,7 @@ function project._load_targets() end end - -- laod packages + -- load packages t._PACKAGES = t._PACKAGES or {} for _, packagename in ipairs(table.wrap(t:get("packages"))) do local p = requires[packagename] @@ -437,6 +437,23 @@ function project._load_targets() table.insert(t._PACKAGES, p) end end + + -- load toolchains + local toolchains = t:get("toolchains") + if toolchains then + t._TOOLCHAINS = {} + for _, name in ipairs(table.wrap(toolchains)) do + local toolchain_inst, errors = toolchain.load(name) + -- attempt to load toolchain from project + if not toolchain_inst then + toolchain_inst = project.toolchain(name) + end + if not toolchain_inst then + return nil, errors + end + table.insert(t._TOOLCHAINS, toolchain_inst) + end + end end -- enter toolchains environment diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index 9a519cbed..a397f7adc 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -1650,6 +1650,67 @@ function _instance:pcoutputfile(langkind) end end +-- get the toolchains +function _instance:toolchains() + local toolchains = self._TOOLCHAINS + if toolchains == nil then + local instance, errors = platform.load() + if not instance then + os.raise(errors) + end + toolchains = instance:toolchains() + self._TOOLCHAINS = toolchains + end + return toolchains +end + +-- get the program and name of the given tool kind +function _instance:tool(toolkind) + + -- init tools + local tools = self._TOOLS + if not tools then + tools = {} + self._TOOLS = tools + end + + -- get tool program + local program, toolname + local toolinfo = tools[toolkind] + if toolinfo == nil then + toolinfo = {} + + -- get program from set_toolchain/set_tools (deprecated) + program = self:get("toolchain." .. toolkind) + if not program then + local tools = self:get("tools") -- TODO: deprecated + if tools then + program = tools[toolkind] + end + end + + -- get program from target/toolchains + if not program then + local toolchains = self:toolchains() + for idx, toolchain_inst in ipairs(toolchains) do + program, toolname = toolchain_inst:tool(toolkind) + if program then + break + end + end + end + if program then + toolinfo[1] = program + toolinfo[2] = toolname + end + tools[toolkind] = toolinfo + else + program = toolinfo[1] + toolname = toolinfo[2] + end + return program, toolname +end + -- get target apis function target.apis() @@ -1671,6 +1732,7 @@ function target.apis() , "target.set_warnings" , "target.set_optimize" , "target.set_languages" + , "target.set_toolchains" -- target.add_xxx , "target.add_deps" , "target.add_rules" diff --git a/xmake/core/tool/compiler.lua b/xmake/core/tool/compiler.lua index 27c81879c..1f0d7d6d6 100644 --- a/xmake/core/tool/compiler.lua +++ b/xmake/core/tool/compiler.lua @@ -71,19 +71,13 @@ end function compiler._load_tool(sourcekind, target) -- get program from target - local program = nil + local program, toolname if target then - program = target:get("toolchain." .. sourcekind) - if not program then - local tools = target:get("tools") -- TODO: deprecated - if tools then - program = tools[sourcekind] - end - end + program, toolname = target:tool(sourcekind) end -- load the compiler tool from the source kind - local result, errors = tool.load(sourcekind, program) + local result, errors = tool.load(sourcekind, program, toolname) if not result then return nil, errors end diff --git a/xmake/core/tool/linker.lua b/xmake/core/tool/linker.lua index b3f91a904..bbb088e7c 100644 --- a/xmake/core/tool/linker.lua +++ b/xmake/core/tool/linker.lua @@ -78,19 +78,13 @@ function linker._load_tool(targetkind, sourcekinds, target) for _, _linkerinfo in ipairs(linkerinfos) do -- get program from target - local program = nil + local program, toolname if target then - program = target:get("toolchain." .. _linkerinfo.linkerkind) - if not program then - local tools = target:get("tools") -- TODO: deprecated - if tools then - program = tools[_linkerinfo.linkerkind] - end - end + program, toolname = target:tool(_linkerinfo.linkerkind) end -- load the linker tool from the linker kind (with cache) - linkertool, errors = tool.load(_linkerinfo.linkerkind, program) + linkertool, errors = tool.load(_linkerinfo.linkerkind, program, toolname) if linkertool then linkerinfo = _linkerinfo linkerinfo.program = program diff --git a/xmake/core/tool/tool.lua b/xmake/core/tool/tool.lua index 70c6e62f8..9e6dec6d4 100644 --- a/xmake/core/tool/tool.lua +++ b/xmake/core/tool/tool.lua @@ -130,9 +130,10 @@ end -- load the given tool from the given kind -- -- @param kind the tool kind e.g. cc, cxx, mm, mxx, as, ar, ld, sh, .. --- @param program the tool program, e.g. /xxx/arm-linux-gcc, [email protected] +-- @param program the tool program, e.g. /xxx/arm-linux-gcc, [email protected], (optional) +-- @param toolname gcc, clang, .. (optional) -- -function tool.load(kind, program) +function tool.load(kind, program, toolname) -- init key local key = kind .. (program or "") .. (config.get("arch") or os.arch()) @@ -144,7 +145,6 @@ function tool.load(kind, program) end -- contain toolname? parse it, e.g. '[email protected]' - local toolname = nil if program then local pos = program:find('@', 1, true) if pos then |
