diff options
| author | ruki <[email protected]> | 2020-12-13 22:31:27 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2020-12-13 22:31:27 +0800 |
| commit | 0f7d4ef7bf2c3d9e04fc104defb50e8c7f6583f1 (patch) | |
| tree | 65723a232e796794dc41c4c74d98fa7addc27818 | |
| parent | 38b7c45ae4b1c58d4734ab027fd520d9a397a383 (diff) | |
cache toolchain configs
| -rw-r--r-- | xmake/core/tool/toolchain.lua | 32 | ||||
| -rw-r--r-- | xmake/toolchains/msvc/check.lua | 22 | ||||
| -rw-r--r-- | xmake/toolchains/msvc/load.lua | 31 |
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 |
