summaryrefslogtreecommitdiff
path: root/xmake/core/project
diff options
context:
space:
mode:
authorruki <[email protected]>2018-04-12 00:49:03 +0800
committerruki <[email protected]>2018-04-11 22:54:23 +0800
commit67bfa73b2ae4ddfa3f5c001685bdb063a0454ec1 (patch)
treee9018f32a1c66073aff796ffc48a010839699929 /xmake/core/project
parent6d36e632a581a487f275cd77cf72c52dd67eedef (diff)
add orderules and on_load
Diffstat (limited to 'xmake/core/project')
-rw-r--r--xmake/core/project/project.lua81
-rw-r--r--xmake/core/project/rule.lua39
-rw-r--r--xmake/core/project/target.lua5
3 files changed, 97 insertions, 28 deletions
diff --git a/xmake/core/project/project.lua b/xmake/core/project/project.lua
index 6793f9ab7..5e9fe6895 100644
--- a/xmake/core/project/project.lua
+++ b/xmake/core/project/project.lua
@@ -330,17 +330,25 @@ function project.get(name)
end
end
--- load deps for option and target
-function project._load_deps(target, targets, deps, orderdeps)
+-- load deps for instance: .e.g option, target and rule
+--
+-- .e.g
+--
+-- a.deps = b
+-- b.deps = c
+--
+-- orderdeps: c -> b -> a
+--
+function project._load_deps(instance, instances, deps, orderdeps)
- -- get dep targets
- for _, dep in ipairs(table.wrap(target:get("deps"))) do
- local deptarget = targets[dep]
- if deptarget then
- project._load_deps(deptarget, targets, deps, orderdeps)
+ -- get dep instances
+ for _, dep in ipairs(table.wrap(instance:get("deps"))) do
+ local depinst = instances[dep]
+ if depinst then
+ project._load_deps(depinst, instances, deps, orderdeps)
if not deps[dep] then
- deps[dep] = deptarget
- table.insert(orderdeps, deptarget)
+ deps[dep] = depinst
+ table.insert(orderdeps, depinst)
end
end
end
@@ -391,17 +399,37 @@ function project._load_targets()
end
-- load and attach target deps and rules
- for _, target in pairs(targets) do
+ for _, t in pairs(targets) do
-- load deps
- target._DEPS = target._DEPS or {}
- target._ORDERDEPS = target._ORDERDEPS or {}
- project._load_deps(target, targets, target._DEPS, target._ORDERDEPS)
+ t._DEPS = t._DEPS or {}
+ t._ORDERDEPS = t._ORDERDEPS or {}
+ project._load_deps(t, targets, t._DEPS, t._ORDERDEPS)
-- load rules
- target._RULES = target._RULES or {}
- for _, rulename in ipairs(table.wrap(target:get("rules"))) do
- target._RULES[rulename] = project.rule(rulename) or rule.rule(name)
+ --
+ -- .e.g
+ --
+ -- a.deps = b
+ -- b.deps = c
+ --
+ -- orderules: c -> b -> a
+ --
+ t._RULES = t._RULES or {}
+ t._ORDERULES = t._ORDERULES or {}
+ for _, rulename in ipairs(table.wrap(t:get("rules"))) do
+ local r = project.rule(rulename) or rule.rule(name)
+ if r then
+ t._RULES[rulename] = r
+ for _, deprule in ipairs(r:orderdeps()) do
+ local name = deprule:name()
+ if not t._RULES[name] then
+ t._RULES[name] = deprule
+ table.insert(t._ORDERULES, deprule)
+ end
+ end
+ table.insert(t._ORDERULES, r)
+ end
end
end
@@ -410,14 +438,29 @@ function project._load_targets()
-- on load for each target
local ok = true
- for _, target in pairs(targets) do
- local on_load = target:script("load")
+ for _, t in pairs(targets) do
+
+ -- do load for target
+ local on_load = t:script("load")
if on_load then
- ok, errors = sandbox.load(on_load, target)
+ ok, errors = sandbox.load(on_load, t)
if not ok then
break
end
end
+
+ -- do load with target rules
+ if ok then
+ for _, r in pairs(t:orderules()) do
+ ok, errors = r:do_load(t)
+ if not ok then
+ break
+ end
+ end
+ if not ok then
+ break
+ end
+ end
end
-- leave toolchains environment
diff --git a/xmake/core/project/rule.lua b/xmake/core/project/rule.lua
index 83d116cfc..ab9fd09ec 100644
--- a/xmake/core/project/rule.lua
+++ b/xmake/core/project/rule.lua
@@ -120,6 +120,14 @@ function rule._load(filepath)
end
-- load deps
+--
+-- .e.g
+--
+-- a.deps = b
+-- b.deps = c
+--
+-- orderdeps: c -> b -> a
+--
function rule._load_deps(self, rules, deps, orderdeps)
-- get dep rules
@@ -235,20 +243,33 @@ function rule:orderdeps()
return self._ORDERDEPS
end
--- build source files
-function rule:build_files(target, sourcefiles)
+-- do load
+function rule:do_load(target)
+
+ -- on_load?
+ local on_load = self:script("load")
+ if on_load then
+ return sandbox.load(on_load, target)
+ end
+
+ -- ok
+ return true
+end
+
+-- do build source files
+function rule:do_build_files(target, sourcefiles)
- -- build files?
- local build_files = self:script("build_files")
- if build_files then
- return sandbox.load(build_files, target, sourcefiles)
+ -- on_build_files?
+ local on_build_files = self:script("build_files")
+ if on_build_files then
+ return sandbox.load(on_build_files, target, sourcefiles)
else
- local build_file = self:script("build_file")
- if not build_file then
+ local on_build_file = self:script("build_file")
+ if not on_build_file then
return false, string.format("rule(%s): on_build_file() script not found!", self:name())
end
for _, sourcefile in ipairs(table.wrap(sourcefiles)) do
- local ok, errors = sandbox.load(build_file, target, sourcefile)
+ local ok, errors = sandbox.load(on_build_file, target, sourcefile)
if not ok then
return false, errors
end
diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua
index 0a0731ae9..4ecd7ef24 100644
--- a/xmake/core/project/target.lua
+++ b/xmake/core/project/target.lua
@@ -281,6 +281,11 @@ function target:rules()
return self._RULES
end
+-- get target order rules
+function target:orderules()
+ return self._ORDERULES
+end
+
-- get target rule from the given source extension
function target:rule(extension)