diff options
| author | ruki <[email protected]> | 2019-06-07 00:26:07 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2019-06-06 20:36:42 +0800 |
| commit | ba1d13c08626e9f007e8fe708244dfd5167a9ddf (patch) | |
| tree | 9b491f3ade59435bba9b0ee23d26d9ae4f66cf24 | |
| parent | 12671e1c0af4e86d1ee73ccd13ff35defde7dc4b (diff) | |
add on_link/after_link/before_link for rule and target
| -rw-r--r-- | xmake/actions/build/kinds/binary.lua | 75 | ||||
| -rw-r--r-- | xmake/actions/build/kinds/shared.lua | 75 | ||||
| -rw-r--r-- | xmake/actions/build/kinds/static.lua | 75 | ||||
| -rw-r--r-- | xmake/core/project/rule.lua | 3 | ||||
| -rw-r--r-- | xmake/core/project/target.lua | 3 |
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" |
