summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2020-12-13 22:31:27 +0800
committerruki <[email protected]>2020-12-13 22:31:27 +0800
commit0f7d4ef7bf2c3d9e04fc104defb50e8c7f6583f1 (patch)
tree65723a232e796794dc41c4c74d98fa7addc27818
parent38b7c45ae4b1c58d4734ab027fd520d9a397a383 (diff)
cache toolchain configs
-rw-r--r--xmake/core/tool/toolchain.lua32
-rw-r--r--xmake/toolchains/msvc/check.lua22
-rw-r--r--xmake/toolchains/msvc/load.lua31
3 files changed, 40 insertions, 45 deletions
diff --git a/xmake/core/tool/toolchain.lua b/xmake/core/tool/toolchain.lua
index 0accd5eb4..4eaa525b0 100644
--- a/xmake/core/tool/toolchain.lua
+++ b/xmake/core/tool/toolchain.lua
@@ -36,11 +36,16 @@ local sandbox = require("sandbox/sandbox")
local sandbox_module = require("sandbox/modules/import/core/sandbox/module")
-- new an instance
-function _instance.new(name, info, configs)
- local instance = table.inherit(_instance)
- instance._NAME = name
- instance._INFO = info
- instance._CONFIGS = configs
+function _instance.new(name, info, cachekey, configs)
+ local instance = table.inherit(_instance)
+ instance._NAME = name
+ instance._INFO = info
+ instance._CACHE = require("sandbox/modules/import/lib/detect/cache")
+ instance._CACHEKEY = cachekey
+ instance._CONFIGS = instance._CACHE.load(cachekey) or {}
+ for k, v in pairs(configs) do
+ instance._CONFIGS[k] = v
+ end
return instance
end
@@ -191,17 +196,26 @@ function _instance:sdkdir()
return config.get("sdk") or self:info():get("sdkdir")
end
+-- get cachekey
+function _instance:cachekey()
+ return self._CACHEKEY
+end
+
-- get user config from `set_toolchains("", {configs = {vs = "2018"}})`
function _instance:config(name)
- return self._CONFIGS and self._CONFIGS[name]
+ return self._CONFIGS[name]
end
-- set user config
function _instance:config_set(name, data)
- self._CONFIGS = self._CONFIGS or {}
self._CONFIGS[name] = data
end
+-- save user configs
+function _instance:configs_save()
+ self._CACHE.save(self:cachekey(), self._CONFIGS)
+end
+
-- do check, we only check it once for all architectures
function _instance:check()
local checkok = true
@@ -488,7 +502,7 @@ function toolchain.load(name, opt)
end
-- save instance to the cache
- local instance = _instance.new(name, result, opt)
+ local instance = _instance.new(name, result, cachekey, opt)
toolchain._TOOLCHAINS[cachekey] = instance
return instance
end
@@ -509,7 +523,7 @@ function toolchain.load_withinfo(name, info, opt)
end
-- save instance to the cache
- local instance = _instance.new(name, info, opt)
+ local instance = _instance.new(name, info, cachekey, opt)
toolchain._TOOLCHAINS[cachekey] = instance
return instance
end
diff --git a/xmake/toolchains/msvc/check.lua b/xmake/toolchains/msvc/check.lua
index 33cfc6298..f0fd5f2f6 100644
--- a/xmake/toolchains/msvc/check.lua
+++ b/xmake/toolchains/msvc/check.lua
@@ -28,13 +28,16 @@ import("lib.detect.find_tool")
function _check_vsenv(toolchain)
-- have been checked?
- local vs = config.get("vs")
- if vs and config.get("__vcvarsall") then
+ local vs = toolchain:config("vs") or config.get("vs")
+ local vcvars = toolchain:config("vcvars")
+ if vs and vcvars then
return vs
end
-- find vstudio
- local vstudio = find_vstudio({vcvars_ver = config.get("vs_toolset"), sdkver = config.get("vs_sdkver")})
+ local vs_toolset = toolchain:config("vs_toolset") or config.get("vs_toolset")
+ local vs_sdkver = toolchain:config("vs_sdkver") or config.get("vs_sdkver")
+ local vstudio = find_vstudio({vcvars_ver = vs_toolset, sdkver = vs_sdkver})
if vstudio then
-- make order vsver
@@ -52,15 +55,15 @@ function _check_vsenv(toolchain)
-- get vcvarsall
for _, vsver in ipairs(vsvers) do
local vcvarsall = (vstudio[vsver] or {}).vcvarsall or {}
- local vsenv = vcvarsall[toolchain:arch()]
- if vsenv and vsenv.PATH and vsenv.INCLUDE and vsenv.LIB then
+ local vcvars = vcvarsall[toolchain:arch()]
+ if vcvars and vcvars.PATH and vcvars.INCLUDE and vcvars.LIB then
- -- save vsenv
- config.set("__vcvarsall", vcvarsall)
+ -- save vcvars
+ toolchain:config_set("vcvars", vcvars)
-- check compiler
local program = nil
- local tool = find_tool("cl.exe", {force = true, envs = vsenv})
+ local tool = find_tool("cl.exe", {force = true, envs = vcvars})
if tool then
program = tool.program
end
@@ -76,7 +79,8 @@ end
function _check_vstudio(toolchain)
local vs = _check_vsenv(toolchain)
if vs then
- config.set("vs", vs, {readonly = true, force = true})
+ toolchain:config_set("vs", vs)
+ toolchain:configs_save()
cprint("checking for Microsoft Visual Studio (%s) version ... ${color.success}%s", toolchain:arch(), vs)
else
cprint("checking for Microsoft Visual Studio (%s) version ... ${color.nothing}${text.nothing}", toolchain:arch())
diff --git a/xmake/toolchains/msvc/load.lua b/xmake/toolchains/msvc/load.lua
index 3e6dd39d5..95ebe0cf1 100644
--- a/xmake/toolchains/msvc/load.lua
+++ b/xmake/toolchains/msvc/load.lua
@@ -26,37 +26,14 @@ import("detect.sdks.find_vstudio")
-- add the given vs environment
function _add_vsenv(toolchain, name)
- -- get vcvarsall
- local vcvarsall = config.get("__vcvarsall")
- if not vcvarsall then
+ -- get vcvars
+ local vcvars = toolchain:config("vcvars")
+ if not vcvars then
return
end
- -- get vs environment for the current arch
- local arch = toolchain:arch()
- local vsenv = vcvarsall[arch] or {}
-
- -- switch vstudio environment if vs_sdkver has been changed
- local switch_vsenv = false
- local vs = config.get("vs")
- local vs_sdkver = config.get("vs_sdkver")
- if vs and vs_sdkver and vsenv.WindowsSDKVersion and vs_sdkver ~= vsenv.WindowsSDKVersion then
- switch_vsenv = true
- end
- if switch_vsenv then
- -- find vstudio
- local vstudio = find_vstudio({vcvars_ver = config.get("vs_toolset"), sdkver = vs_sdkver})
- if vstudio then
- vcvarsall = (vstudio[vs] or {}).vcvarsall or {}
- vsenv = vcvarsall[arch] or {}
- if vsenv and vsenv.PATH and vsenv.INCLUDE and vsenv.LIB then
- config.set("__vcvarsall", vcvarsall)
- end
- end
- end
-
-- get the paths for the vs environment
- local new = vsenv[name]
+ local new = vcvars[name]
if new then
toolchain:add("runenvs", name:upper(), path.splitenv(new))
end