diff options
| author | ruki <[email protected]> | 2018-04-12 00:49:03 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2018-04-11 22:54:23 +0800 |
| commit | 67bfa73b2ae4ddfa3f5c001685bdb063a0454ec1 (patch) | |
| tree | e9018f32a1c66073aff796ffc48a010839699929 /xmake/core/project | |
| parent | 6d36e632a581a487f275cd77cf72c52dd67eedef (diff) | |
add orderules and on_load
Diffstat (limited to 'xmake/core/project')
| -rw-r--r-- | xmake/core/project/project.lua | 81 | ||||
| -rw-r--r-- | xmake/core/project/rule.lua | 39 | ||||
| -rw-r--r-- | xmake/core/project/target.lua | 5 |
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) |
