summaryrefslogtreecommitdiff
path: root/xmake/actions/build/kinds/binary.lua
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 /xmake/actions/build/kinds/binary.lua
parent12671e1c0af4e86d1ee73ccd13ff35defde7dc4b (diff)
add on_link/after_link/before_link for rule and target
Diffstat (limited to 'xmake/actions/build/kinds/binary.lua')
-rw-r--r--xmake/actions/build/kinds/binary.lua75
1 files changed, 69 insertions, 6 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)