summaryrefslogtreecommitdiff
path: root/xmake/scripts/base
diff options
context:
space:
mode:
authorruki <[email protected]>2015-06-04 22:28:15 +0800
committerruki <[email protected]>2015-06-04 22:28:24 +0800
commit44fd11396d7b073e6b5227894c5db02b3585302f (patch)
treed755e4b6bd6c910559a3cb72dd32cd5d0d0e3f7c /xmake/scripts/base
parentf0f9b217ddb81084a411d09a4a23292716b20c46 (diff)
impl auto rebuild and fix some bug
Diffstat (limited to 'xmake/scripts/base')
-rw-r--r--xmake/scripts/base/config.lua62
-rw-r--r--xmake/scripts/base/global.lua21
-rw-r--r--xmake/scripts/base/main.lua53
-rw-r--r--xmake/scripts/base/option.lua29
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)