diff options
| author | ruki <[email protected]> | 2015-06-04 22:28:15 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2015-06-04 22:28:24 +0800 |
| commit | 44fd11396d7b073e6b5227894c5db02b3585302f (patch) | |
| tree | d755e4b6bd6c910559a3cb72dd32cd5d0d0e3f7c /xmake/scripts/base | |
| parent | f0f9b217ddb81084a411d09a4a23292716b20c46 (diff) | |
impl auto rebuild and fix some bug
Diffstat (limited to 'xmake/scripts/base')
| -rw-r--r-- | xmake/scripts/base/config.lua | 62 | ||||
| -rw-r--r-- | xmake/scripts/base/global.lua | 21 | ||||
| -rw-r--r-- | xmake/scripts/base/main.lua | 53 | ||||
| -rw-r--r-- | xmake/scripts/base/option.lua | 29 |
4 files changed, 115 insertions, 50 deletions
diff --git a/xmake/scripts/base/config.lua b/xmake/scripts/base/config.lua index 6c8a22f58..41db332c4 100644 --- a/xmake/scripts/base/config.lua +++ b/xmake/scripts/base/config.lua @@ -230,8 +230,12 @@ end function config.set(name, value) -- check - assert(config._CURRENT) - assert(name and value and type(value) ~= "table") + assert(config._CURRENT and name) + + -- invalid value + if value and type(value) == "table" then + assert(false) + end -- get the current target local target = config._target() @@ -326,17 +330,38 @@ function config.loadxconf() -- save configs config._CONFIGS = newenv._CONFIGS - -- clear configs if the host has been changed + -- clear configs and mark as "rebuild" and "reconfig" if the host has been changed local target = config._target() if target and target.host ~= xmake._HOST then - -- clear configs - config._CONFIGS = {} + + -- clear configs and mark as "rebuild" + config._CONFIGS = { __rebuild = true } + + -- mark as "reconfig" if the current action is not "config" + if options._ACTION ~= "config" then + config._RECONFIG = true + end end - -- clear configs if the plat has been changed + -- clear configs and mark as "rebuild" if the plat has been changed if target and target.plat and options.plat and target.plat ~= options.plat then - -- clear configs - config._CONFIGS = {} + + -- clear configs and mark as "rebuild" + config._CONFIGS = { __rebuild = true } + end + + -- mark as "rebuild" if the arch has been changed + if target and target.arch and options.arch and target.arch ~= options.arch then + + -- mark as "rebuild" + config._CONFIGS.__rebuild = true + end + + -- mark as "rebuild" if the mode has been changed + if target and target.mode and options.mode and target.mode ~= options.mode then + + -- mark as "rebuild" + config._CONFIGS.__rebuild = true end elseif errors then -- error @@ -377,18 +402,21 @@ function config.loadxconf() end end - -- merge xmake._OPTIONS._DEFAULTS to target - for k, v in pairs(options._DEFAULTS) do + -- merge the default configure options to target + local defaults = option.defaults("config") + if defaults then + for k, v in pairs(defaults) do - -- check - assert(type(k) == "string") + -- check + assert(type(k) == "string") - -- skip some options - if config._need(k) then + -- skip some options + if config._need(k) then - -- save the default option to the target - if not target[k] then - target[k] = v + -- save the default option to the target + if not target[k] then + target[k] = v + end end end end diff --git a/xmake/scripts/base/global.lua b/xmake/scripts/base/global.lua index 2b3582a23..5b2f774f5 100644 --- a/xmake/scripts/base/global.lua +++ b/xmake/scripts/base/global.lua @@ -269,18 +269,21 @@ function global.loadxconf() end end - -- merge xmake._OPTIONS._DEFAULTS to the global configure - for k, v in pairs(options._DEFAULTS) do + -- merge the default global configure options to the global configure + local defaults = option.defaults("global") + if defaults then + for k, v in pairs(defaults) do - -- check - assert(type(k) == "string") + -- check + assert(type(k) == "string") - -- need configure it? - if global._need(k) then + -- need configure it? + if global._need(k) then - -- save the default option - if not configs[k] then - configs[k] = v + -- save the default option + if not configs[k] then + configs[k] = v + end end end end diff --git a/xmake/scripts/base/main.lua b/xmake/scripts/base/main.lua index 2624c8d53..2bd243ac4 100644 --- a/xmake/scripts/base/main.lua +++ b/xmake/scripts/base/main.lua @@ -425,13 +425,30 @@ function main._prepare_project() -- load xmake.xconf file first local errors = config.loadxconf() - if not errors then - -- load xmake.xproj file - errors = project.loadxproj(options.file) + if errors then return errors end + + -- xmake config or marked as "reconfig"? + if options._ACTION == "config" or config._RECONFIG then + + -- wrap the configure for more convenient to get and set values + local config_wrapped = {} + setmetatable(config_wrapped, + { + __index = function(tbl, key) + return config.get(key) + end, + __newindex = function(tbl, key, val) + config.set(key, val) + end + }) + + -- probe the current platform configure + platform.probe(config_wrapped, false) + end - -- ok? - return errors + -- load xmake.xproj file + return project.loadxproj(options.file) end -- done help @@ -527,25 +544,6 @@ function main._done_option() return false end - -- xmake config? - if options._ACTION == "config" then - - -- wrap the global configure for more convenient to get and set values - local config_wrapped = {} - setmetatable(config_wrapped, - { - __index = function(tbl, key) - return config.get(key) - end, - __newindex = function(tbl, key, val) - config.set(key, val) - end - }) - - -- probe the current platform configure - platform.probe(config_wrapped, false) - end - -- make the current platform configure if not platform.make() then -- error @@ -566,6 +564,13 @@ function main._done_option() -- dump platform platform.dump() + -- reconfig it first if marked as "reconfig" + if config._RECONFIG and not action.done("config") then + -- error + utils.error("reconfig failed for the changed host!") + return false + end + -- done action return action.done(options._ACTION or "build") end diff --git a/xmake/scripts/base/option.lua b/xmake/scripts/base/option.lua index cdf82adb5..820ba4e6a 100644 --- a/xmake/scripts/base/option.lua +++ b/xmake/scripts/base/option.lua @@ -402,6 +402,35 @@ function option.find(argv, name, shortname) end end +-- get all default options from the given action +function option.defaults(action) + + -- make defaults + local defaults = {} + + -- init the default value + for _, o in ipairs(option._MENU[action or "main"].options) do + + -- key=value? + if o[3] == "kv" then + + -- the key + local key = o[2] or o[1] + assert(key) + + -- save the default value + defaults[key] = o[4] + -- value with name? + elseif o[3] == "v" and o[2] then + -- save the default value + defaults[o[2]] = o[4] + end + end + + -- ok? + return defaults +end + -- print the menu function option.print_menu(action) |
