summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2021-01-19 00:42:52 +0800
committerruki <[email protected]>2021-01-19 00:42:52 +0800
commitabd2bcb586035ac27358e7c6f31f446284ae36be (patch)
tree6fd96f66e45df1ae191858660b78c6248949c37e
parent3ce4a0366dc45361ee2ed1881391589cdf1b5c26 (diff)
add rule kind
-rw-r--r--xmake/actions/build/main.lua28
-rw-r--r--xmake/core/project/project.lua17
-rw-r--r--xmake/core/project/rule.lua11
3 files changed, 48 insertions, 8 deletions
diff --git a/xmake/actions/build/main.lua b/xmake/actions/build/main.lua
index 253f4a45d..ac703d79b 100644
--- a/xmake/actions/build/main.lua
+++ b/xmake/actions/build/main.lua
@@ -22,6 +22,7 @@
import("core.base.option")
import("core.base.global")
import("core.base.task")
+import("core.project.rule")
import("core.project.config")
import("core.project.project")
import("core.platform.platform")
@@ -79,6 +80,19 @@ function _try_build()
end
end
+-- do global project rules
+function _do_project_rules(scriptname, opt)
+ for _, rulename in ipairs(project.get("target.rules")) do
+ local r = project.rule(rulename) or rule.rule(rulename)
+ if r and r:kind() == "project" then
+ local buildscript = r:script(scriptname)
+ if buildscript then
+ buildscript(opt)
+ end
+ end
+ end
+end
+
-- main
function main()
@@ -105,10 +119,14 @@ function main()
-- clean up temporary files once a day
cleaner.cleanup()
- -- build it
try
{
function ()
+
+ -- do rules before building
+ _do_project_rules("build_before")
+
+ -- do build
local sourcefiles = option.get("files")
if sourcefiles then
build_files(targetname, sourcefiles)
@@ -120,6 +138,11 @@ function main()
catch
{
function (errors)
+
+ -- do rules after building
+ _do_project_rules("build_after", {errors = errors})
+
+ -- raise
if errors then
raise(errors)
elseif targetname then
@@ -131,6 +154,9 @@ function main()
}
}
+ -- do rules after building
+ _do_project_rules("build_after")
+
-- unlock the whole project
project.unlock()
diff --git a/xmake/core/project/project.lua b/xmake/core/project/project.lua
index 60ba7a0ea..bb96c79f0 100644
--- a/xmake/core/project/project.lua
+++ b/xmake/core/project/project.lua
@@ -462,15 +462,18 @@ function project._load_targets()
for _, rulename in ipairs(rulenames) do
local r = project.rule(rulename) or rule.rule(rulename)
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)
+ -- only add target rules
+ if r:kind() == "target" 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
- table.insert(t._ORDERULES, r)
else
return nil, string.format("unknown rule(%s) in target(%s)!", rulename, t:name())
end
diff --git a/xmake/core/project/rule.lua b/xmake/core/project/rule.lua
index 7b984a3f4..53c1a9854 100644
--- a/xmake/core/project/rule.lua
+++ b/xmake/core/project/rule.lua
@@ -155,6 +155,7 @@ function rule.apis()
-- rule.set_xxx
"rule.set_extensions"
, "rule.set_sourcekinds"
+ , "rule.set_kind"
-- rule.add_xxx
, "rule.add_deps"
, "rule.add_imports"
@@ -221,6 +222,16 @@ function rule:name()
return self._NAME
end
+-- get the rule kind
+--
+-- current supported kind:
+-- - target: default, only for each target
+-- - project: global rule, for whole project
+--
+function rule:kind()
+ return self:get("kind") or "target"
+end
+
-- get the given dependent rule
function rule:dep(name)
local deps = self:deps()