summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-03-29 22:41:41 +0800
committerruki <[email protected]>2025-04-08 15:31:56 +0800
commitc167aa90ca9a0000b7933a9df9306d18dee60f5c (patch)
tree239674c88b1c36c00d68573814db00a856440c9b
parent92d6126d1c98c9c58d38f5b173d7248a1e882d20 (diff)
build binary
-rw-r--r--xmake/actions/build/builtin/build_binary.lua127
-rw-r--r--xmake/actions/build/builtin/linkdepfiles.lua (renamed from xmake/actions/build/deprecated/kinds/linkdepfiles.lua)0
-rw-r--r--xmake/actions/build/deprecated/kinds/binary.lua2
-rw-r--r--xmake/actions/build/deprecated/kinds/shared.lua2
-rw-r--r--xmake/actions/build/deprecated/kinds/static.lua2
5 files changed, 128 insertions, 5 deletions
diff --git a/xmake/actions/build/builtin/build_binary.lua b/xmake/actions/build/builtin/build_binary.lua
index 89c24a1e7..7b9b7d7b9 100644
--- a/xmake/actions/build/builtin/build_binary.lua
+++ b/xmake/actions/build/builtin/build_binary.lua
@@ -20,9 +20,132 @@
-- imports
import("core.base.option")
+import("core.theme.theme")
+import("core.tool.linker")
+import("core.tool.compiler")
+import("core.project.depend")
+import("utils.progress")
+import("private.utils.batchcmds")
+import("linkdepfiles", {alias = "get_linkdepfiles"})
import("build_object")
+-- do link target
+function _do_link_target(target, opt)
+ local linkinst = linker.load(target:kind(), target:sourcekinds(), {target = target})
+ local linkflags = linkinst:linkflags({target = target})
+
+ -- need build this target?
+ local depfiles = get_linkdepfiles(target)
+ local dryrun = option.get("dry-run")
+ local depvalues = {linkinst:program(), linkflags}
+ depend.on_changed(function ()
+ local filename = target:filename()
+ if target:namespace() then
+ filename = target:namespace() .. "::" .. filename
+ end
+ progress.show(opt.progress, "${color.build.target}linking.$(mode) %s", filename)
+
+ local targetfile = target:targetfile()
+ local objectfiles = target:objectfiles()
+ local verbose = option.get("verbose")
+ if verbose then
+ -- show the full link command with raw arguments, it will expand @xxx.args for msvc/link on windows
+ print(linkinst:linkcmd(objectfiles, targetfile, {linkflags = linkflags, rawargs = true}))
+ end
+
+ if not dryrun then
+ assert(linkinst:link(objectfiles, targetfile, {linkflags = linkflags}))
+ end
+ end, {dependfile = target:dependfile(),
+ lastmtime = os.mtime(target:targetfile()),
+ changed = target:is_rebuilt() or option.get("linkonly"),
+ values = depvalues, files = depfiles, dryrun = dryrun})
+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
+ local on_linkcmd = r:script("linkcmd")
+ if on_linkcmd then
+ local batchcmds_ = batchcmds.new({target = target})
+ on_linkcmd(target, batchcmds_, {progress = opt.progress})
+ batchcmds_:runcmds({changed = target:is_rebuilt(), dryrun = option.get("dry-run")})
+ 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
+ local before_linkcmd = r:script("linkcmd_before")
+ if before_linkcmd then
+ local batchcmds_ = batchcmds.new({target = target})
+ before_linkcmd(target, batchcmds_, {progress = opt.progress})
+ batchcmds_:runcmds({changed = target:is_rebuilt(), dryrun = option.get("dry-run")})
+ end
+ end
+
+ -- on link
+ target:script("link", _on_link_target)(target, opt)
+
+ -- 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
+ local after_linkcmd = r:script("linkcmd_after")
+ if after_linkcmd then
+ local batchcmds_ = batchcmds.new({target = target})
+ after_linkcmd(target, batchcmds_, {progress = opt.progress})
+ batchcmds_:runcmds({changed = target:is_rebuilt(), dryrun = option.get("dry-run")})
+ end
+ end
+end
+
+
function main(jobgraph, target)
- build_object(jobgraph, target)
- -- TODO add link jobs
+ local objects_group = target:fullname() .. "/objects"
+ local jobsize = jobgraph:size()
+ jobgraph:group(objects_group, function ()
+ build_object(jobgraph, target)
+ end)
+ if jobgraph:size() > jobsize then
+ local linkjob = target:fullname() .. "/link"
+ jobgraph:add(linkjob, function (index, total, opt)
+ _link_target(target, opt)
+ end)
+ jobgraph:add_orders(objects_group, linkjob)
+ end
end
diff --git a/xmake/actions/build/deprecated/kinds/linkdepfiles.lua b/xmake/actions/build/builtin/linkdepfiles.lua
index f96e532fc..f96e532fc 100644
--- a/xmake/actions/build/deprecated/kinds/linkdepfiles.lua
+++ b/xmake/actions/build/builtin/linkdepfiles.lua
diff --git a/xmake/actions/build/deprecated/kinds/binary.lua b/xmake/actions/build/deprecated/kinds/binary.lua
index 3f67232f7..fddc4c8bf 100644
--- a/xmake/actions/build/deprecated/kinds/binary.lua
+++ b/xmake/actions/build/deprecated/kinds/binary.lua
@@ -27,7 +27,7 @@ import("core.project.depend")
import("utils.progress")
import("private.utils.batchcmds")
import("object", {alias = "object_target"})
-import("linkdepfiles", {alias = "get_linkdepfiles"})
+import("..builtin.linkdepfiles", {alias = "get_linkdepfiles"})
-- do link target
function _do_link_target(target, opt)
diff --git a/xmake/actions/build/deprecated/kinds/shared.lua b/xmake/actions/build/deprecated/kinds/shared.lua
index cc7aa010c..2b53e98e8 100644
--- a/xmake/actions/build/deprecated/kinds/shared.lua
+++ b/xmake/actions/build/deprecated/kinds/shared.lua
@@ -27,7 +27,7 @@ import("core.project.depend")
import("utils.progress")
import("private.utils.batchcmds")
import("object", {alias = "object_target"})
-import("linkdepfiles", {alias = "get_linkdepfiles"})
+import("..builtin.linkdepfiles", {alias = "get_linkdepfiles"})
-- do link target
function _do_link_target(target, opt)
diff --git a/xmake/actions/build/deprecated/kinds/static.lua b/xmake/actions/build/deprecated/kinds/static.lua
index abb6c5f72..21fc253b5 100644
--- a/xmake/actions/build/deprecated/kinds/static.lua
+++ b/xmake/actions/build/deprecated/kinds/static.lua
@@ -27,7 +27,7 @@ import("core.project.depend")
import("utils.progress")
import("private.utils.batchcmds")
import("object", {alias = "object_target"})
-import("linkdepfiles", {alias = "get_linkdepfiles"})
+import("..builtin.linkdepfiles", {alias = "get_linkdepfiles"})
-- do link target
function _do_link_target(target, opt)