diff options
| author | ruki <[email protected]> | 2016-03-15 11:53:09 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2016-03-15 11:53:09 +0800 |
| commit | bc40eac3e633a4120313e95abb54da103fc48c39 (patch) | |
| tree | 25efc1557fdd45617b1bbb6d11bacc6244cec198 /xmake/core/project/config.lua | |
| parent | 27ee91d65fe054439195781808da6cb57316238e (diff) | |
load config for task
Diffstat (limited to 'xmake/core/project/config.lua')
| -rw-r--r-- | xmake/core/project/config.lua | 339 |
1 files changed, 48 insertions, 291 deletions
diff --git a/xmake/core/project/config.lua b/xmake/core/project/config.lua index e1bb9a961..35748ee78 100644 --- a/xmake/core/project/config.lua +++ b/xmake/core/project/config.lua @@ -20,7 +20,7 @@ -- @file config.lua -- --- define module: config +-- define module local config = config or {} -- load modules @@ -31,33 +31,41 @@ local utils = require("base/utils") local option = require("base/option") local global = require("project/global") --- make configure for the current target +-- get the configure file +function config._file() + + -- get it + return path.join(config.directory(), "/xmake.conf") +end + +-- make configure function config._make(configs) -- init current target configure local current = {} + --[[ -- get configs from the default configure if configs._DEFAULTS then for k, v in pairs(configs._DEFAULTS) do if type(v) ~= "string" or v ~= "auto" then current[k] = v end end end + ]] - -- get configs from the global configure - if global._CURRENT then - for k, v in pairs(global._CURRENT) do - current[k] = v - end + -- make current configure from the global configure + for k, v in pairs(global.options()) do + current[k] = v end - -- get configs from all targets + -- make current configure from the project configure for k, v in pairs(configs) do if type(k) == "string" and not k:find("^_%u+") then current[k] = v end end + --[[ -- get configs from the current target if configs._TARGETS and current.target ~= "all" then @@ -70,319 +78,68 @@ function config._make(configs) current[k] = v end end - end + end]] - -- ok? + -- ok return current end --- get the configure file -function config._file() - - -- get it - return path.join(config.directory(), "xmake.conf") -end - --- need configure? -function config._need(name) - return name and name ~= "target" and name ~= "file" and name ~= "project" and name ~= "verbose" and name ~= "clean" -end - --- get the current target scope -function config._target() - - -- check - local configs = config._CONFIGS - assert(configs) - - -- the target name - local name = option.get("target") - assert(name and type(name) == "string") - - -- for all targets? - if name == "all" then - return configs - elseif configs._TARGETS then - -- get it - return configs._TARGETS[name] - end -end - --- get the given configure from the current -function config.get(name) - - -- the configure has been not loaded - if not config._CURRENT then return end - - -- get it - return config._CURRENT[name] -end - --- set the given configure to the current -function config.set(name, value) +-- clean the project configure +function config.clean() -- check - assert(config._CURRENT and name) + assert(config._CURRENT and config._CONFIGS) - -- get the current target - local target = config._target() - assert(target) + -- clean it + config._CURRENT = {} + config._CONFIGS = {} - -- set it to the current target configure for saving to file - target[name] = value - - -- set it to the current configure - config._CURRENT[name] = value -end - --- the given configure need probe automatically -function config.auto(name) - - -- the configs - local configs = config._CONFIGS - assert(configs) - - -- need probe it automatically? - if configs._DEFAULTS then - local value = configs._DEFAULTS[name] - if value then - if type(value) == "string" and value == "auto" then - return true - end + -- save it + if os.isfile(config._file()) then + local ok, errors = os.rm(config._file()) + if not ok then + return false, errors end end - -- need not probe it if have been setted manually - if config._CURRENT and nil ~= config._CURRENT[name] then - return false - end - - -- attempt to probe it if not exists + -- ok return true end -- get the configure directory function config.directory() - -- the directory - local dir = path.join(xmake._PROJECT_DIR, ".xmake") - - -- create it directly first if not exists - if not os.isdir(dir) then - assert(os.mkdir(dir)) - end - -- get it - return dir -end - --- save xmake.conf -function config.save() - - -- the configs - local configs = config._CONFIGS - assert(configs) - - -- save to the configure file - return io.save(config._file(), configs) + return path.join(xmake._PROJECT_DIR, ".xmake") end +-- TODO: reconfig, rebuild, defaults, targets +-- load the project configure function config.load() - -- the options - local options = option.options() - assert(options) - - -- check - assert(option._MENU) - assert(option._MENU.config) - - -- the target name - local name = option.get("target") - if not name then - return "no given target name!" - end - - -- does not clean the cached configure? - if not option.get("clean") then - - -- load and execute the xmake.xconf - local filepath = config._file() - if os.isfile(filepath) then - - -- load the configure file - local configs, errors = io.load(filepath) - - -- exists local configures? - if configs then - - -- save configs - config._CONFIGS = configs - - -- make the current target configs - local current = config._make(configs) + -- load configure from the file first + local filepath = config._file() + if os.isfile(filepath) then - -- clear configs and mark as "rebuild" and "reconfig" if the host has been changed - if (current and current.host ~= xmake._HOST) then + -- load configs + local configs, errors = io.load(filepath) - -- clear configs and mark as "rebuild" - config._CONFIGS = { __rebuild = true } - - -- mark as "reconfig" if the current action is not "config" - if option.task() ~= "config" then - config._RECONFIG = true - end - end - - -- clear configs and mark as "rebuild" if the plat has been changed - if current and current.plat and options.plat and current.plat ~= options.plat then - - -- clear configs and mark as "rebuild" - config._CONFIGS = { __rebuild = true } - end - - -- mark as "rebuild" if the arch has been changed - if current and current.arch and options.arch and current.arch ~= options.arch then - - -- mark as "rebuild" - config._CONFIGS.__rebuild = true - end - - -- mark as "rebuild" if the mode has been changed - if current and current.mode and options.mode and current.mode ~= options.mode then - - -- mark as "rebuild" - config._CONFIGS.__rebuild = true - end - elseif errors then - -- error - utils.error(errors) - end - end - end - - -- init configs if not exists - if not config._CONFIGS then - -- clear configs and mark as "rebuild" - config._CONFIGS = { __rebuild = true } - - -- mark as "reconfig" if the current action is not "config" - if option.task() ~= "config" then - config._RECONFIG = true - end - end - - -- the configs - local configs = config._CONFIGS - - -- mark as "rebuild" if clean the cached configure - if option.get("clean") then - configs.__rebuild = true - end - - -- init the defaults - local defaults = nil - if not configs._DEFAULTS then - if config._RECONFIG then defaults = option.defaults("config") - elseif option.task() == "config" then defaults = option.defaults() + -- error? + if not configs and errors then + utils.error(errors) end - if defaults then - for k, v in pairs(defaults) do - - -- check - assert(type(k) == "string") - - -- skip some options - if config._need(k) then - -- save the default option - configs._DEFAULTS = configs._DEFAULTS or {} - configs._DEFAULTS[k] = v - end - end - end - end - defaults = configs._DEFAULTS - - -- init targets - configs._TARGETS = configs._TARGETS or {} - if name ~= "all" then - configs._TARGETS[name] = configs._TARGETS[name] or {} + -- save configs + config._CONFIGS = configs end - -- get the current target scope - local target = config._target() - assert(target and type(target) == "table") - - -- merge option.options() to target - if option.task() == "config" then - for k, v in pairs(options) do - - -- check - assert(type(k) == "string") + -- init configs + config._CONFIGS = config._CONFIGS or {} - -- skip some options - if not k:startswith("_") and config._need(k) then - - -- save the option to the target - target[k] = v - - -- remove it from the defaults, because we have setted it manually - if defaults then defaults[k] = nil end - end - end - end - - -- make the current config - config._CURRENT = config._make(config._CONFIGS) -end - --- clear up and remove all auto values -function config.clearup() - - -- clear up the current configure - local current = config._CURRENT - if current then - for k, v in pairs(current) do - if type(v) == "string" and v == "auto" then - current[k] = nil - end - end - end - - -- clear up the current target configure - local target = config._target() - if target then - for k, v in pairs(target) do - if type(v) == "string" and v == "auto" then - target[k] = nil - end - end - end - -end - --- reload configure -function config.reload() - - -- clear the old configure - config._CURRENT = nil - config._CONFIGS = nil - - -- load it - return config.load() -end - --- dump the current configure -function config.dump() - - -- check - assert(config._CURRENT) + -- make the current configs + config._CURRENT = config._make(global._CONFIGS) - -- dump - utils.dump(config._CURRENT, "__%w*", "configure") - end --- return module: config +-- return module return config |
