summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2019-06-07 00:26:07 +0800
committerruki <[email protected]>2019-06-06 20:36:42 +0800
commitba1d13c08626e9f007e8fe708244dfd5167a9ddf (patch)
tree9b491f3ade59435bba9b0ee23d26d9ae4f66cf24
parent12671e1c0af4e86d1ee73ccd13ff35defde7dc4b (diff)
add on_link/after_link/before_link for rule and target
-rw-r--r--xmake/actions/build/kinds/binary.lua75
-rw-r--r--xmake/actions/build/kinds/shared.lua75
-rw-r--r--xmake/actions/build/kinds/static.lua75
-rw-r--r--xmake/core/project/rule.lua3
-rw-r--r--xmake/core/project/target.lua3
5 files changed, 213 insertions, 18 deletions
diff --git a/xmake/actions/build/kinds/binary.lua b/xmake/actions/build/kinds/binary.lua
index 133b46289..0193c7c70 100644
--- a/xmake/actions/build/kinds/binary.lua
+++ b/xmake/actions/build/kinds/binary.lua
@@ -26,11 +26,8 @@ import("core.tool.compiler")
import("core.project.depend")
import("object")
--- build target from sources
-function _build_from_objects(target, buildinfo)
-
- -- build objects
- object.build(target, buildinfo)
+-- do link target
+function _do_link_target(target, opt)
-- load linker instance
local linkinst = linker.load(target:targetkind(), target:sourcekinds(), {target = target})
@@ -74,7 +71,7 @@ function _build_from_objects(target, buildinfo)
local verbose = option.get("verbose")
-- trace progress into
- cprintf("${color.build.progress}" .. theme.get("text.build.progress_format") .. ":${clear} ", (buildinfo.targetindex + 1) * 100 / buildinfo.targetcount)
+ cprintf("${color.build.progress}" .. theme.get("text.build.progress_format") .. ":${clear} ", opt.progress)
if verbose then
cprint("${dim color.build.target}linking.$(mode) %s", path.filename(targetfile))
else
@@ -98,6 +95,72 @@ function _build_from_objects(target, buildinfo)
depend.save(dependinfo, dependfile)
end
+-- on link the given target
+function _on_link_target(target, opt)
+
+ -- link target with rules
+ local done = false
+ for _, r in ipairs(target:orderules()) do
+ local on_link = r:script("link")
+ if on_link then
+ on_link(target, opt)
+ done = true
+ end
+ end
+ if done then return end
+
+ -- do link
+ _do_link_target(target, opt)
+end
+
+-- link target
+function _link_target(target, opt)
+
+ -- do before link for target
+ local before_link = target:script("link_before")
+ if before_link then
+ before_link(target, opt)
+ end
+
+ -- do before link for rules
+ for _, r in ipairs(target:orderules()) do
+ local before_link = r:script("link_before")
+ if before_link then
+ before_link(target, opt)
+ end
+ end
+
+ -- on link
+ target:script("link", _on_link_target)(target, table.join(opt, {origin = _do_link_target}))
+
+ -- do after link for target
+ local after_link = target:script("link_after")
+ if after_link then
+ after_link(target, opt)
+ end
+
+ -- do after link for rules
+ for _, r in ipairs(target:orderules()) do
+ local after_link = r:script("link_after")
+ if after_link then
+ after_link(target, opt)
+ end
+ end
+end
+
+-- build target from objects
+function _build_from_objects(target, buildinfo)
+
+ -- build objects
+ object.build(target, buildinfo)
+
+ -- get progress
+ local progress = (buildinfo.targetindex + 1) * 100 / buildinfo.targetcount
+
+ -- link target
+ _link_target(target, {progress = progress})
+end
+
-- build target from sources
function _build_from_sources(target, buildinfo, sourcebatch, sourcekind)
diff --git a/xmake/actions/build/kinds/shared.lua b/xmake/actions/build/kinds/shared.lua
index efca2bf55..683616d7c 100644
--- a/xmake/actions/build/kinds/shared.lua
+++ b/xmake/actions/build/kinds/shared.lua
@@ -26,11 +26,8 @@ import("core.tool.compiler")
import("core.project.depend")
import("object")
--- build target from objects
-function _build_from_objects(target, buildinfo)
-
- -- build objects
- object.build(target, buildinfo)
+-- do link target
+function _do_link_target(target, opt)
-- load linker instance
local linkinst = linker.load(target:targetkind(), target:sourcekinds(), {target = target})
@@ -87,7 +84,7 @@ function _build_from_objects(target, buildinfo)
local verbose = option.get("verbose")
-- trace progress info
- cprintf("${color.build.progress}" .. theme.get("text.build.progress_format") .. ":${clear} ", (buildinfo.targetindex + 1) * 100 / buildinfo.targetcount)
+ cprintf("${color.build.progress}" .. theme.get("text.build.progress_format") .. ":${clear} ", opt.progress)
if verbose then
cprint("${dim color.build.target}linking.$(mode) %s", path.filename(targetfile))
else
@@ -111,6 +108,72 @@ function _build_from_objects(target, buildinfo)
depend.save(dependinfo, dependfile)
end
+-- on link the given target
+function _on_link_target(target, opt)
+
+ -- link target with rules
+ local done = false
+ for _, r in ipairs(target:orderules()) do
+ local on_link = r:script("link")
+ if on_link then
+ on_link(target, opt)
+ done = true
+ end
+ end
+ if done then return end
+
+ -- do link
+ _do_link_target(target, opt)
+end
+
+-- link target
+function _link_target(target, opt)
+
+ -- do before link for target
+ local before_link = target:script("link_before")
+ if before_link then
+ before_link(target, opt)
+ end
+
+ -- do before link for rules
+ for _, r in ipairs(target:orderules()) do
+ local before_link = r:script("link_before")
+ if before_link then
+ before_link(target, opt)
+ end
+ end
+
+ -- on link
+ target:script("link", _on_link_target)(target, table.join(opt, {origin = _do_link_target}))
+
+ -- do after link for target
+ local after_link = target:script("link_after")
+ if after_link then
+ after_link(target, opt)
+ end
+
+ -- do after link for rules
+ for _, r in ipairs(target:orderules()) do
+ local after_link = r:script("link_after")
+ if after_link then
+ after_link(target, opt)
+ end
+ end
+end
+
+-- build target from objects
+function _build_from_objects(target, buildinfo)
+
+ -- build objects
+ object.build(target, buildinfo)
+
+ -- get progress
+ local progress = (buildinfo.targetindex + 1) * 100 / buildinfo.targetcount
+
+ -- link target
+ _link_target(target, {progress = progress})
+end
+
-- build target from sources
function _build_from_sources(target, buildinfo, sourcebatch, sourcekind)
diff --git a/xmake/actions/build/kinds/static.lua b/xmake/actions/build/kinds/static.lua
index f02d2c2df..88eb26bc5 100644
--- a/xmake/actions/build/kinds/static.lua
+++ b/xmake/actions/build/kinds/static.lua
@@ -26,11 +26,8 @@ import("core.tool.compiler")
import("core.project.depend")
import("object")
--- build target from objects
-function _build_from_objects(target, buildinfo)
-
- -- build objects
- object.build(target, buildinfo)
+-- do link target
+function _do_link_target(target, opt)
-- load linker instance
local linkinst = linker.load(target:targetkind(), target:sourcekinds(), {target = target})
@@ -83,7 +80,7 @@ function _build_from_objects(target, buildinfo)
local verbose = option.get("verbose")
-- trace progress info
- cprintf("${color.build.progress}" .. theme.get("text.build.progress_format") .. ":${clear} ", (buildinfo.targetindex + 1) * 100 / buildinfo.targetcount)
+ cprintf("${color.build.progress}" .. theme.get("text.build.progress_format") .. ":${clear} ", opt.progress)
if verbose then
cprint("${dim color.build.target}archiving.$(mode) %s", path.filename(targetfile))
else
@@ -107,6 +104,72 @@ function _build_from_objects(target, buildinfo)
depend.save(dependinfo, dependfile)
end
+-- on link the given target
+function _on_link_target(target, opt)
+
+ -- link target with rules
+ local done = false
+ for _, r in ipairs(target:orderules()) do
+ local on_link = r:script("link")
+ if on_link then
+ on_link(target, opt)
+ done = true
+ end
+ end
+ if done then return end
+
+ -- do link
+ _do_link_target(target, opt)
+end
+
+-- link target
+function _link_target(target, opt)
+
+ -- do before link for target
+ local before_link = target:script("link_before")
+ if before_link then
+ before_link(target, opt)
+ end
+
+ -- do before link for rules
+ for _, r in ipairs(target:orderules()) do
+ local before_link = r:script("link_before")
+ if before_link then
+ before_link(target, opt)
+ end
+ end
+
+ -- on link
+ target:script("link", _on_link_target)(target, table.join(opt, {origin = _do_link_target}))
+
+ -- do after link for target
+ local after_link = target:script("link_after")
+ if after_link then
+ after_link(target, opt)
+ end
+
+ -- do after link for rules
+ for _, r in ipairs(target:orderules()) do
+ local after_link = r:script("link_after")
+ if after_link then
+ after_link(target, opt)
+ end
+ end
+end
+
+-- build target from objects
+function _build_from_objects(target, buildinfo)
+
+ -- build objects
+ object.build(target, buildinfo)
+
+ -- get progress
+ local progress = (buildinfo.targetindex + 1) * 100 / buildinfo.targetcount
+
+ -- link target
+ _link_target(target, {progress = progress})
+end
+
-- build target from sources
function _build_from_sources(target, buildinfo, sourcebatch, sourcekind)
diff --git a/xmake/core/project/rule.lua b/xmake/core/project/rule.lua
index f51cc2a6b..1e03c0d55 100644
--- a/xmake/core/project/rule.lua
+++ b/xmake/core/project/rule.lua
@@ -163,6 +163,7 @@ function rule.apis()
-- rule.on_xxx
"rule.on_run"
, "rule.on_load"
+ , "rule.on_link"
, "rule.on_build"
, "rule.on_build_file"
, "rule.on_build_files"
@@ -173,6 +174,7 @@ function rule.apis()
-- rule.before_xxx
, "rule.before_run"
, "rule.before_load"
+ , "rule.before_link"
, "rule.before_build"
, "rule.before_build_file"
, "rule.before_build_files"
@@ -183,6 +185,7 @@ function rule.apis()
-- rule.after_xxx
, "rule.after_run"
, "rule.after_load"
+ , "rule.after_link"
, "rule.after_build"
, "rule.after_build_file"
, "rule.after_build_files"
diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua
index 44ac0c52c..03fc633af 100644
--- a/xmake/core/project/target.lua
+++ b/xmake/core/project/target.lua
@@ -1577,6 +1577,7 @@ function target.apis()
-- target.on_xxx
"target.on_run"
, "target.on_load"
+ , "target.on_link"
, "target.on_build"
, "target.on_build_file"
, "target.on_build_files"
@@ -1586,6 +1587,7 @@ function target.apis()
, "target.on_uninstall"
-- target.before_xxx
, "target.before_run"
+ , "target.before_link"
, "target.before_build"
, "target.before_build_file"
, "target.before_build_files"
@@ -1595,6 +1597,7 @@ function target.apis()
, "target.before_uninstall"
-- target.after_xxx
, "target.after_run"
+ , "target.after_link"
, "target.after_build"
, "target.after_build_file"
, "target.after_build_files"