summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-06-29 22:02:34 +0800
committerruki <[email protected]>2025-06-29 22:02:34 +0800
commitc6f7c7f4036dc9f7f9ad3aab6071c838e3877610 (patch)
treea11d68e00e0f94036ae969c2d793e73d5a307381
parent10ff4f1d31a0ab7a9f5d130a16eba445ab3e0b02 (diff)
fix build.fence #6586
-rw-r--r--xmake/modules/private/action/build/target.lua38
1 files changed, 27 insertions, 11 deletions
diff --git a/xmake/modules/private/action/build/target.lua b/xmake/modules/private/action/build/target.lua
index c302408ac..438211349 100644
--- a/xmake/modules/private/action/build/target.lua
+++ b/xmake/modules/private/action/build/target.lua
@@ -92,18 +92,11 @@ function _match_sourcebatches(target, filepatterns)
end
end
--- add targetjobs and deps orders
-function _add_targetjobs_orders(jobgraph, target, dep, opt)
+-- add plain orders for targetjobs and deps
+function _add_targetjobs_plain_orders(jobgraph, target, dep, opt)
local jobname, jobname_dep
local job_kind = opt.job_kind
- if dep:policy("build.fence") or dep:policy("build.across_targets_in_parallel") == false then
- jobname = string.format("%s/begin_%s", target:fullname(), job_kind)
- jobname_dep = string.format("%s/end_%s", dep:fullname(), job_kind)
- -- build.across_targets_in_parallel is deprecated
- if dep:policy("build.across_targets_in_parallel") == false then
- wprint("policy(\"build.across_targets_in_parallel\") has been deprecated, please use policy(\"build.fence\") instead of it.")
- end
- elseif job_kind == "build" then
+ if job_kind == "build" then
jobname = target:fullname() .. "/link"
jobname_dep = dep:fullname() .. "/link"
if not jobgraph:has(jobname) then
@@ -118,6 +111,23 @@ function _add_targetjobs_orders(jobgraph, target, dep, opt)
end
end
+-- add deep orders for targetjobs and deps
+function _add_targetjobs_deep_orders(jobgraph, target, dep, opt)
+ local jobname, jobname_dep
+ local job_kind = opt.job_kind
+ if dep:policy("build.fence") or dep:policy("build.across_targets_in_parallel") == false then
+ jobname = string.format("%s/begin_%s", target:fullname(), job_kind)
+ jobname_dep = string.format("%s/end_%s", dep:fullname(), job_kind)
+ -- build.across_targets_in_parallel is deprecated
+ if dep:policy("build.across_targets_in_parallel") == false then
+ wprint("policy(\"build.across_targets_in_parallel\") has been deprecated, please use policy(\"build.fence\") instead of it.")
+ end
+ end
+ if jobname and jobname_dep and jobgraph:has(jobname) and jobgraph:has(jobname_dep) then
+ jobgraph:add_orders(jobname_dep, jobname)
+ end
+end
+
-- add target jobs for the builtin script
function add_targetjobs_for_builtin_script(jobgraph, target, opt)
opt = opt or {}
@@ -352,7 +362,13 @@ function add_targetjobs_and_deps(jobgraph, target, targetrefs, opt)
for _, depname in ipairs(target:get("deps")) do
local dep = project.target(depname, {namespace = target:namespace()})
add_targetjobs_and_deps(jobgraph, dep, targetrefs, opt)
- _add_targetjobs_orders(jobgraph, target, dep, opt)
+ _add_targetjobs_plain_orders(jobgraph, target, dep, opt)
+ end
+
+ -- we need to pass to the whole dependency chain
+ -- @see https://github.com/xmake-io/xmake/issues/6586
+ for _, dep in ipairs(target:orderdeps()) do
+ _add_targetjobs_deep_orders(jobgraph, target, dep, opt)
end
end
end