diff options
| author | ruki <[email protected]> | 2020-12-12 00:50:02 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2020-12-12 00:50:02 +0800 |
| commit | b3b6ab40b913020be95f84430e5b9f8e902d7a9c (patch) | |
| tree | 5963ba131cbd85c34a8135ef82c6933c92dbbbb3 | |
| parent | 2aefd7286550fd4e207c9a30cbe4b4d898700246 (diff) | |
improve toolchain
| -rw-r--r-- | xmake/core/project/project.lua | 30 | ||||
| -rw-r--r-- | xmake/core/tool/toolchain.lua | 5 |
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 |
