Skip to content

Add build jobgraph support #6209

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 127 commits into from
Apr 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
127 commits
Select commit Hold shift + click to select a range
3d00c91
add on_prepare stages
waruqi Mar 11, 2025
a1d0e9c
add missing target config
waruqi Mar 11, 2025
3a813e0
add prepare stub
waruqi Mar 12, 2025
00ebba3
add jobgraph stub
waruqi Mar 13, 2025
1621db0
add jobgraph.new
waruqi Mar 18, 2025
6785ce5
improve runjobs tests
waruqi Mar 19, 2025
f8346ab
improve jobgraph tests
waruqi Mar 19, 2025
08fade0
add build job queue stub
waruqi Mar 19, 2025
a588ee1
fix runjobs
waruqi Mar 19, 2025
bc4f146
add deps for jobgraph
waruqi Mar 19, 2025
79522ad
rename to dag
waruqi Mar 19, 2025
30ca6c1
build job queue
waruqi Mar 19, 2025
2277ac8
improve graph
waruqi Mar 20, 2025
8954ac2
check cirular dependencies
waruqi Mar 20, 2025
5b57870
add job deps
waruqi Mar 20, 2025
a278d3b
improve to find cycle
waruqi Mar 20, 2025
ce5fb20
use kahn algorithm for graph by default
waruqi Mar 21, 2025
0662b04
use list as queue
waruqi Mar 21, 2025
7e94921
remove dfs
waruqi Mar 21, 2025
741da62
add queue and improve graph
waruqi Mar 21, 2025
43ea0c1
add partial topo test
waruqi Mar 21, 2025
0938948
improve tests
waruqi Mar 21, 2025
53d1244
get parital single node
waruqi Mar 21, 2025
5d6d739
improve jobgraph
waruqi Mar 21, 2025
33a9637
init partial topo sort
waruqi Mar 21, 2025
f1a16a6
fix remove node
waruqi Mar 21, 2025
d579a1c
check pending count
waruqi Mar 21, 2025
ed3c482
optimize partial topo
waruqi Mar 21, 2025
63ed185
optimize remove node
waruqi Mar 21, 2025
4a8219c
update comments
waruqi Mar 21, 2025
172dbb8
improve tests
waruqi Mar 21, 2025
a260aa4
add group
waruqi Mar 21, 2025
d31fc3e
support for job group
waruqi Mar 22, 2025
5904d09
update comment
waruqi Mar 22, 2025
25c2b87
recompute nodes for dirty graph
waruqi Mar 22, 2025
9b3f6f8
fix remove vertex
waruqi Mar 23, 2025
b8b96a0
prepare files
waruqi Mar 23, 2025
812d8ec
fix build files
waruqi Mar 23, 2025
502f7b6
add target_utils
waruqi Mar 24, 2025
0a01105
pass target roots as args
waruqi Mar 24, 2025
085bc68
walk prepare targets
waruqi Mar 25, 2025
05605de
add preparecmd apis
waruqi Mar 26, 2025
ac5adea
add runjobs for target utils
waruqi Mar 26, 2025
01733ea
use dynamic script
waruqi Mar 26, 2025
4fee5fe
fix jobgraph for isolated vertex
waruqi Mar 26, 2025
78db72c
add stage jobs for target
waruqi Mar 26, 2025
37c593a
improve jobs
waruqi Mar 26, 2025
881671b
fix instances list
waruqi Mar 26, 2025
8beb073
rename add_deps to add_orders
waruqi Mar 27, 2025
e10063b
bind target envs
waruqi Mar 27, 2025
e12ddee
add script job
waruqi Mar 27, 2025
f55ca39
add jobgraph:group
waruqi Mar 27, 2025
987ab86
fix test
waruqi Mar 27, 2025
6582a3e
add builtin jobs
waruqi Mar 27, 2025
7e60e47
mark as jobbatch as deprecated
waruqi Mar 27, 2025
43c58c1
add builtin actions
waruqi Mar 27, 2025
b45bad5
prepare sourcefiles
waruqi Mar 27, 2025
d7473e4
improve to prepare files
waruqi Mar 27, 2025
e7a426b
pass distcc
waruqi Mar 28, 2025
b894911
rename targetjobs
waruqi Mar 28, 2025
6be0431
add filejobs stub
waruqi Mar 28, 2025
fec05b2
match sourcebatches
waruqi Mar 28, 2025
2cf6a82
do prepare files
waruqi Mar 28, 2025
e1891c9
improve script opt
waruqi Mar 28, 2025
6e96705
add prepare_file
waruqi Mar 28, 2025
ec6334f
update comment
waruqi Mar 28, 2025
e4867e2
remove builtin files
waruqi Mar 28, 2025
386cf48
prepare files
waruqi Mar 28, 2025
a101830
fix nil target
waruqi Mar 28, 2025
b8b1f38
build binary stub
waruqi Mar 28, 2025
4b47fa9
improve to build object to support jobgraph
waruqi Mar 29, 2025
92d6126
enable more build.object to jobgraph
waruqi Mar 29, 2025
c167aa9
build binary
waruqi Mar 29, 2025
4cebb90
move linkdepfiles
waruqi Mar 29, 2025
b0c4c94
add link objects
waruqi Mar 29, 2025
2e6cc42
fix add_filejobs
waruqi Mar 29, 2025
b644fa4
enable jobgraph for verilator
waruqi Mar 29, 2025
736e327
improve protobuf
waruqi Mar 29, 2025
bfb940f
fix cmd scripts
waruqi Mar 30, 2025
147ef59
fix rule batches
waruqi Mar 31, 2025
1b735b3
improve c++modules for jobgraph
waruqi Mar 31, 2025
8b0ba84
use target:fullname()
waruqi Mar 31, 2025
c0867ff
fix build modules
waruqi Mar 31, 2025
5301489
fix custom on_xxx in target
waruqi Mar 31, 2025
f4706b4
fix script name
waruqi Mar 31, 2025
e52e6ad
check to add job
waruqi Mar 31, 2025
f210044
fix file job name
waruqi Apr 1, 2025
38695f0
add target deps orders
waruqi Apr 2, 2025
c3632af
add build.fence
waruqi Apr 2, 2025
c8c9786
fix job name
waruqi Apr 3, 2025
00db196
add file rule
waruqi Apr 3, 2025
9adc294
fix link deps
waruqi Apr 3, 2025
15d9e01
dump jobgraph
waruqi Apr 3, 2025
c6b6ae7
fix job name
waruqi Apr 3, 2025
1839ec9
sort target rules
waruqi Apr 4, 2025
e6a81c6
rename to add_orders
waruqi Apr 5, 2025
529f59f
sort file rules
waruqi Apr 5, 2025
ca185a3
update order opt
waruqi Apr 5, 2025
8f6a313
fix headerunit
waruqi Apr 5, 2025
365603a
fix build rust
waruqi Apr 5, 2025
406b9d0
fix framework and bundle links
waruqi Apr 6, 2025
99f68b5
remove unused prepare jobs
waruqi Apr 6, 2025
da54002
fix generate deps
waruqi Apr 6, 2025
54227eb
fix progress
waruqi Apr 6, 2025
3b2e44e
fix bin2c order
waruqi Apr 6, 2025
43c3b86
add modules with pch test
waruqi Apr 6, 2025
6d86718
enable jobgraph for pch
waruqi Apr 6, 2025
d88716e
fix pch
waruqi Apr 6, 2025
162f554
fix pcheader for objc
waruqi Apr 6, 2025
b2d2727
disable module and pch for gcc
waruqi Apr 6, 2025
72870df
Delete tests/projects/c++/modules/hello_with_pch/test.lua
waruqi Apr 6, 2025
c091d7b
remove across_targets_in_parallel policy
waruqi Apr 7, 2025
279801b
add warings tip
waruqi Apr 7, 2025
3ebc4d1
improve build.fence wrap
waruqi Apr 7, 2025
07ac1c4
fix distcc
waruqi Apr 7, 2025
6fc28a7
move target files
waruqi Apr 7, 2025
f72d519
prepare targets in cmakelists generator
waruqi Apr 7, 2025
abd58c9
prepare targets for more generators
waruqi Apr 7, 2025
bd6f305
improve verilator rules
waruqi Apr 7, 2025
117ae68
compatible with order deps
waruqi Apr 8, 2025
7b4ba90
fix target_utils
waruqi Apr 9, 2025
811f877
rename to target_buildutils
waruqi Apr 9, 2025
77d90d2
improve target_cmds
waruqi Apr 9, 2025
4109abc
ignore rules and stages
waruqi Apr 9, 2025
95e69ee
fix link jobs
waruqi Apr 9, 2025
260f071
improve makefile generator
waruqi Apr 9, 2025
699e40f
move rule_group to deprecated
waruqi Apr 9, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions tests/apis/rules_inject_deps/xmake.lua
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
rule("cppfront")
set_extensions(".cpp2")
on_load(function (target)
local rule = target:rule("c++.build"):clone()
rule:add("deps", "cppfront", {order = true})
target:rule_add(rule)
end)
add_orders("cppfront", "c++.build")
on_build_file(function (target, sourcefile, opt)
print("build cppfront file")
local objectfile = target:objectfile(sourcefile:gsub("cpp2", "cpp"))
Expand Down
20 changes: 18 additions & 2 deletions tests/apis/rules_order/xmake.lua
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@

rule("markdown")
add_deps("man", {order = true})
set_extensions(".md", ".markdown")
add_orders("man", "markdown")

before_build(function (target)
print("before_build: markdown")
end)
after_build(function (target)
print("after_build: markdown")
end)

before_build_file(function (target, sourcefile)
print("before_build_file: %s", sourcefile)
end)
Expand All @@ -14,6 +22,14 @@ rule("markdown")

rule("man")
set_extensions(".man")

before_build(function (target)
print("before_build: man")
end)
after_build(function (target)
print("after_build: man")
end)

before_build_file(function (target, sourcefile)
print("before_build_file: %s", sourcefile)
end)
Expand All @@ -26,7 +42,7 @@ rule("man")

target("test")
set_kind("binary")
add_rules("markdown")
add_rules("markdown", "man")
add_files("src/*.c")
add_files("src/*.md")
add_files("src/*.man")
Expand Down
19 changes: 19 additions & 0 deletions tests/modules/async/run_callback.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import("core.base.scheduler")
import("async.runjobs")

function _jobfunc(index, total, opt)
print("%s: run job (%d/%d)", scheduler.co_running(), index, total)
local dt = os.mclock()
os.sleep(1000)
dt = os.mclock() - dt
print("%s: run job (%d/%d) end, progress: %s, dt: %d ms", scheduler.co_running(), index, total, opt.progress, dt)
end

function main()
print("==================================== test callback ====================================")
local t = os.mclock()
runjobs("test", _jobfunc, {total = 100, comax = 6, timeout = 1000, timer = function (running_jobs_indices)
print("%s: timeout (%d ms), running: %s", scheduler.co_running(), os.mclock() - t, table.concat(running_jobs_indices, ","))
end})
end

53 changes: 53 additions & 0 deletions tests/modules/async/run_jobgraph.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import("core.base.scheduler")
import("async.jobgraph")
import("async.runjobs")

function _jobfunc(index, total, opt)
print("%s: run job (%d/%d)", scheduler.co_running(), index, total)
local dt = os.mclock()
os.sleep(1000)
dt = os.mclock() - dt
print("%s: run job (%d/%d) end, progress: %s, dt: %d ms", scheduler.co_running(), index, total, opt.progress, dt)
end

function _test_basic()
print("==================================== test basic ====================================")
local jobs = jobgraph.new()
jobs:add("job/root", _jobfunc)
for i = 1, 3 do
jobs:add("job/" .. i, _jobfunc)
for j = 1, 50 do
jobs:add("job/" .. i .. "/" .. j, _jobfunc)
jobs:add_orders("job/" .. i .. "/" .. j, "job/" .. i, "job/root")
end
end
t = os.mclock()
runjobs("test", jobs, {comax = 6, timeout = 1000, timer = function (running_jobs_indices)
print("%s: timeout (%d ms), running: %s", scheduler.co_running(), os.mclock() - t, table.concat(running_jobs_indices, ","))
end})
end

function _test_group()
print("==================================== test group ====================================")
local jobs = jobgraph.new()
jobs:add("job/root", _jobfunc)
for i = 1, 3 do
jobs:add("job/" .. i, _jobfunc, {groups = "bar"})
jobs:group("foo", function ()
for j = 1, 50 do
jobs:add("job/" .. i .. "/" .. j, _jobfunc)
end
end)
end
jobs:add_orders("foo", "bar", "job/root")
t = os.mclock()
runjobs("test", jobs, {comax = 6, timeout = 1000, timer = function (running_jobs_indices)
print("%s: timeout (%d ms), running: %s", scheduler.co_running(), os.mclock() - t, table.concat(running_jobs_indices, ","))
end})
end

function main()
_test_basic()
_test_group()
end

28 changes: 28 additions & 0 deletions tests/modules/async/run_jobpool.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import("core.base.scheduler")
import("private.async.jobpool")
import("async.runjobs")

function _jobfunc(index, total, opt)
print("%s: run job (%d/%d)", scheduler.co_running(), index, total)
local dt = os.mclock()
os.sleep(1000)
dt = os.mclock() - dt
print("%s: run job (%d/%d) end, progress: %s, dt: %d ms", scheduler.co_running(), index, total, opt.progress, dt)
end

function main()
print("==================================== test jobpool ====================================")
local jobs = jobpool.new()
local root = jobs:addjob("job/root", _jobfunc)
for i = 1, 3 do
local job = jobs:addjob("job/" .. i, _jobfunc, {rootjob = root})
for j = 1, 50 do
jobs:addjob("job/" .. i .. "/" .. j, _jobfunc, {rootjob = job})
end
end
t = os.mclock()
runjobs("test", jobs, {comax = 6, timeout = 1000, timer = function (running_jobs_indices)
print("%s: timeout (%d ms), running: %s", scheduler.co_running(), os.mclock() - t, table.concat(running_jobs_indices, ","))
end})
end

141 changes: 138 additions & 3 deletions tests/modules/graph/test.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import("core.base.graph")

function test_topological_sort(t)
function test_topo_sort(t)
local edges = {
{0, 5},
{0, 2},
Expand All @@ -18,7 +18,7 @@ function test_topological_sort(t)
for _, e in ipairs(edges) do
dag:add_edge(e[1], e[2])
end
local order_path = dag:topological_sort()
local order_path = dag:topo_sort()
local orders = {}
for i, v in ipairs(order_path) do
orders[v] = i
Expand All @@ -28,7 +28,7 @@ function test_topological_sort(t)
end

dag = dag:reverse()
order_path = dag:topological_sort()
order_path = dag:topo_sort()
orders = {}
for i, v in ipairs(order_path) do
orders[v] = i
Expand All @@ -38,6 +38,138 @@ function test_topological_sort(t)
end
end

function test_paritail_topo_sort(t)
local function partiail_topo_sort(dag)
dag:partial_topo_sort_reset()

local node, has_cycle
local order_vertices = {}
while true do
node, has_cycle = dag:partial_topo_sort_next()
if node then
table.insert(order_vertices, node)
dag:partial_topo_sort_remove(node)
else
if has_cycle then
raise("has cycle!")
end
break
end
end

return order_vertices, has_cycle
end

local edges = {
{0, 5},
{0, 2},
{0, 1},
{3, 6},
{3, 5},
{3, 4},
{5, 4},
{6, 4},
{6, 0},
{3, 2},
{1, 4},
{2, 9},
}
local dag = graph.new(true)
for _, e in ipairs(edges) do
dag:add_edge(e[1], e[2])
end
local order_path = partiail_topo_sort(dag)
local orders = {}
for i, v in ipairs(order_path) do
orders[v] = i
end
for _, e in ipairs(edges) do
t:require(orders[e[1]] < orders[e[2]])
end

dag = dag:reverse()
order_path = partiail_topo_sort(dag)
orders = {}
for i, v in ipairs(order_path) do
orders[v] = i
end
for _, e in ipairs(edges) do
t:require(orders[e[1]] > orders[e[2]])
end
end

function test_paritail_topo_sort_dynamic(t)
local function partiail_topo_sort(dag)
dag:partial_topo_sort_reset()

local node, has_cycle
local order_vertices = {}
local dynamic_adjust = false
while true do
node, has_cycle = dag:partial_topo_sort_next()
if node then
if not dynamic_adjust then
dag:add_edge(1, 4)
dag:remove_vertex(6)
end
table.insert(order_vertices, node)
dag:partial_topo_sort_remove(node)
if not dynamic_adjust then
dag:add_edge(2, 9)
dynamic_adjust = true
end
else
if has_cycle then
raise("has cycle!")
end
break
end
end

assert(#order_vertices == #dag:vertices(), "vertices count not matched, %d != %d", #order_vertices, #dag:vertices())
return order_vertices, has_cycle
end

local edges = {
{0, 5},
{0, 2},
{0, 1},
{3, 6},
{3, 5},
{3, 4},
{5, 4},
{6, 4},
{6, 0},
{3, 2},
}
local dag = graph.new(true)
for _, e in ipairs(edges) do
dag:add_edge(e[1], e[2])
end
local order_path = partiail_topo_sort(dag)
local orders = {}
for i, v in ipairs(order_path) do
orders[v] = i
end
edges = {
{0, 5},
{0, 2},
{0, 1},
-- {3, 6},
{3, 5},
{3, 4},
{5, 4},
-- {6, 4},
-- {6, 0},
{3, 2},
{1, 4},
{2, 9}
}
for _, e in ipairs(edges) do
t:require(orders[e[1]] < orders[e[2]])
end
end

function test_find_cycle(t)
local edges = {
{9, 1},
Expand All @@ -52,5 +184,8 @@ function test_find_cycle(t)
end
local cycle = dag:find_cycle()
t:are_equal(cycle, {1, 6, 0})

local _, has_cycle = dag:topo_sort()
t:require(has_cycle)
end

35 changes: 35 additions & 0 deletions tests/modules/queue/test.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import("core.base.queue")

function test_push(t)
local d = queue.new()
d:push(1)
d:push(2)
d:push(3)
d:push(4)
d:push(5)
t:are_equal(d:first(), 1)
t:are_equal(d:last(), 5)
local idx = 1
for item in d:items() do
t:are_equal(item, idx)
idx = idx + 1
end
end

function test_pop(t)
local d = queue.new()
d:push(1)
d:push(2)
d:push(3)
d:push(4)
d:push(5)
d:pop()
t:are_equal(d:first(), 2)
t:are_equal(d:last(), 5)
local idx = 2
for item in d:items() do
t:are_equal(item, idx)
idx = idx + 1
end
end

Loading
Loading