summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2020-12-12 00:50:02 +0800
committerruki <[email protected]>2020-12-12 00:50:02 +0800
commitb3b6ab40b913020be95f84430e5b9f8e902d7a9c (patch)
tree5963ba131cbd85c34a8135ef82c6933c92dbbbb3
parent2aefd7286550fd4e207c9a30cbe4b4d898700246 (diff)
improve toolchain
-rw-r--r--xmake/core/project/project.lua30
-rw-r--r--xmake/core/tool/toolchain.lua5
2 files changed, 23 insertions, 12 deletions
diff --git a/xmake/core/project/project.lua b/xmake/core/project/project.lua
index 1a684d8bb..e50731e93 100644
--- a/xmake/core/project/project.lua
+++ b/xmake/core/project/project.lua
@@ -321,7 +321,7 @@ function project._load_rules()
end
-- load toolchains
-function project._load_toolchains()
+function project._load_toolchains(opt)
-- load the project file first if has not been loaded?
local ok, errors = project._load()
@@ -338,7 +338,7 @@ function project._load_toolchains()
-- make toolchain instances
local toolchains = {}
for toolchain_name, toolchain_info in pairs(results) do
- toolchains[toolchain_name] = toolchain.new(toolchain_name, toolchain_info)
+ toolchains[toolchain_name] = toolchain.new(toolchain_name, toolchain_info, opt)
end
return toolchains
end
@@ -437,10 +437,13 @@ function project._load_targets()
if toolchains then
t._TOOLCHAINS = {}
for _, name in ipairs(table.wrap(toolchains)) do
- local toolchain_inst, errors = toolchain.load(name, t:extraconf("toolchains", name))
+ local toolchain_opt = table.copy(t:extraconf("toolchains", name))
+ toolchain_opt.arch = t:arch()
+ toolchain_opt.plat = t:plat()
+ local toolchain_inst, errors = toolchain.load(name, toolchain_opt)
-- attempt to load toolchain from project
if not toolchain_inst then
- toolchain_inst = project.toolchain(name)
+ toolchain_inst = project.toolchain(name, toolchain_opt)
end
if not toolchain_inst then
return nil, errors
@@ -996,20 +999,25 @@ function project.rules()
end
-- get the given toolchain
-function project.toolchain(name)
- return project.toolchains()[name]
+function project.toolchain(name, opt)
+ return project.toolchains(opt)[name]
end
-- get project toolchains
-function project.toolchains()
- if not project._TOOLCHAINS then
- local toolchains, errors = project._load_toolchains()
+function project.toolchains(opt)
+ opt = opt or {}
+ local key = "key_" .. (opt.plat or "") .. "_" .. (opt.arch or "")
+ project._TOOLCHAINS = project._TOOLCHAINS or {}
+ local toolchains = project._TOOLCHAINS[key]
+ if not toolchains then
+ local errors
+ toolchains, errors = project._load_toolchains(opt)
if not toolchains then
os.raise(errors)
end
- project._TOOLCHAINS = toolchains
+ project._TOOLCHAINS[key] = toolchains
end
- return project._TOOLCHAINS
+ return toolchains
end
-- get the given task
diff --git a/xmake/core/tool/toolchain.lua b/xmake/core/tool/toolchain.lua
index cb8ea0827..bc152a3f6 100644
--- a/xmake/core/tool/toolchain.lua
+++ b/xmake/core/tool/toolchain.lua
@@ -328,9 +328,12 @@ function _instance:_checktool(toolkind, toolpath)
end
end
+ -- init cache key
+ local cachekey = "toolchain_" .. self:plat() .. "_" .. self:arch()
+
-- find tool program
local program, toolname
- local tool = find_tool(toolpath, {program = toolpath, paths = self:bindir(), envs = self:get("runenvs")})
+ local tool = find_tool(toolpath, {cachekey = cachekey, program = toolpath, paths = self:bindir(), envs = self:get("runenvs")})
if tool then
program = tool.program
toolname = tool.name