summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2020-03-17 23:14:42 +0800
committerruki <[email protected]>2020-03-17 13:28:12 +0800
commit0924c3f19f63006333f05dbf83f6f152d8a1c920 (patch)
tree566c6d179eea0b390dfb1a5ec61372d4e9714957
parentd6d0c6d91c030896f56bca97f8bf380b7b49c2ad (diff)
fix targetdeps for jobpool
-rw-r--r--tests/projects/other/build_deps/xmake.lua51
-rw-r--r--xmake/actions/build/build.lua17
-rw-r--r--xmake/modules/private/async/jobpool.lua98
-rw-r--r--xmake/modules/private/async/runjobs.lua2
4 files changed, 89 insertions, 79 deletions
diff --git a/tests/projects/other/build_deps/xmake.lua b/tests/projects/other/build_deps/xmake.lua
index 8b682a584..87918f7d7 100644
--- a/tests/projects/other/build_deps/xmake.lua
+++ b/tests/projects/other/build_deps/xmake.lua
@@ -8,14 +8,13 @@ target("dep1")
os.rm(target:targetfile())
os.rm(target:dep("dep3"):targetfile())
end)
- before_build(function (target)
- assert(os.isfile(target:dep("dep3"):targetfile()), "dep1: before_build failed!")
+ before_link(function (target)
+ assert(os.isfile(target:dep("dep3"):targetfile()), "dep1: before_link failed!")
end)
- after_build(function (target)
- assert(os.isfile(target:targetfile()), "dep1: after_build failed!")
+ after_link(function (target)
+ assert(os.isfile(target:targetfile()), "dep1: after_link failed!")
end)
- --[[
target("dep2")
set_kind("static")
add_deps("dep3")
@@ -24,12 +23,12 @@ target("dep2")
os.rm(target:targetfile())
os.rm(target:dep("dep3"):targetfile())
end)
- before_build(function (target)
- assert(os.isfile(target:dep("dep3"):targetfile()), "dep2: before_build failed!")
+ before_link(function (target)
+ assert(os.isfile(target:dep("dep3"):targetfile()), "dep2: before_link failed!")
+ end)
+ after_link(function (target)
+ assert(os.isfile(target:targetfile()), "dep2: after_link failed!")
end)
- after_build(function (target)
- assert(os.isfile(target:targetfile()), "dep2: after_build failed!")
- end)]]
target("dep3")
set_kind("static")
@@ -37,11 +36,10 @@ target("dep3")
on_load(function (target)
os.rm(target:targetfile())
end)
- after_build(function (target)
- assert(os.isfile(target:targetfile()), "dep3: after_build failed!")
+ after_link(function (target)
+ assert(os.isfile(target:targetfile()), "dep3: after_link failed!")
end)
- --[[
target("test1")
set_kind("binary")
add_deps("dep1", "dep2")
@@ -52,16 +50,15 @@ target("test1")
os.rm(target:dep("dep2"):targetfile())
os.rm(target:dep("dep3"):targetfile())
end)
- before_build(function (target)
- assert(os.isfile(target:dep("dep1"):targetfile()), "test1: before_build failed!")
- assert(os.isfile(target:dep("dep2"):targetfile()), "test1: before_build failed!")
- assert(os.isfile(target:dep("dep3"):targetfile()), "test1: before_build failed!")
+ before_link(function (target)
+ assert(os.isfile(target:dep("dep1"):targetfile()), "test1: before_link failed!")
+ assert(os.isfile(target:dep("dep2"):targetfile()), "test1: before_link failed!")
+ assert(os.isfile(target:dep("dep3"):targetfile()), "test1: before_link failed!")
+ end)
+ after_link(function (target)
+ assert(os.isfile(target:targetfile()), "test1: after_link failed!")
end)
- after_build(function (target)
- assert(os.isfile(target:targetfile()), "test1: after_build failed!")
- end)]]
- --[[
target("test2")
set_kind("binary")
add_deps("dep1")
@@ -71,10 +68,10 @@ target("test2")
os.rm(target:dep("dep1"):targetfile())
os.rm(target:dep("dep3"):targetfile())
end)
- before_build(function (target)
- assert(os.isfile(target:dep("dep1"):targetfile()), "test2: before_build failed!")
- assert(os.isfile(target:dep("dep3"):targetfile()), "test2: before_build failed!")
+ before_link(function (target)
+ assert(os.isfile(target:dep("dep1"):targetfile()), "test2: before_link failed!")
+ assert(os.isfile(target:dep("dep3"):targetfile()), "test2: before_link failed!")
+ end)
+ after_link(function (target)
+ assert(os.isfile(target:targetfile()), "test2: after_link failed!")
end)
- after_build(function (target)
- assert(os.isfile(target:targetfile()), "test2: after_build failed!")
- end)]]
diff --git a/xmake/actions/build/build.lua b/xmake/actions/build/build.lua
index f079fc99a..bef264ff9 100644
--- a/xmake/actions/build/build.lua
+++ b/xmake/actions/build/build.lua
@@ -156,17 +156,22 @@ function _add_batchjobs_for_target(batchjobs, rootjob, target)
end
end
end, job_build)
- return job_before_build
+ return job_after_build, job_before_build
end
-- add batch jobs for the given target and deps
function _add_batchjobs_for_target_and_deps(batchjobs, rootjob, inserted, target)
- if not inserted[target:name()] then
- local targetjob = _add_batchjobs_for_target(batchjobs, rootjob, target) or rootjob
- for _, depname in ipairs(target:get("deps")) do
- _add_batchjobs_for_target_and_deps(batchjobs, targetjob, inserted, project.target(depname))
+ local targetjob = inserted[target:name()]
+ if targetjob then
+ batchjobs:add(targetjob, rootjob)
+ else
+ local targetjob_root, targetjob_leaf = _add_batchjobs_for_target(batchjobs, rootjob, target)
+ if targetjob_root and targetjob_leaf then
+ inserted[target:name()] = targetjob_root
+ for _, depname in ipairs(target:get("deps")) do
+ _add_batchjobs_for_target_and_deps(batchjobs, targetjob_leaf, inserted, project.target(depname))
+ end
end
- inserted[target:name()] = true
end
end
diff --git a/xmake/modules/private/async/jobpool.lua b/xmake/modules/private/async/jobpool.lua
index 702d1aa89..ca38d397f 100644
--- a/xmake/modules/private/async/jobpool.lua
+++ b/xmake/modules/private/async/jobpool.lua
@@ -43,27 +43,43 @@ end
-- @param rootjob the root job node (optional)
--
function jobpool:addjob(name, run, rootjob)
+ return self:add({name = name, run = run}, rootjob)
+end
+
+-- add job to the given job node
+--
+-- @param job the job
+-- @param rootjob the root job node (optional)
+--
+function jobpool:add(job, rootjob)
-- add job to the root job
rootjob = rootjob or self:rootjob()
- local job = {name = name, run = run, _parent = rootjob}
rootjob._deps = rootjob._deps or dlist:new()
rootjob._deps:push(job)
- self._size = self._size + 1
+
+ -- attach parents node
+ local parents = job._parents
+ if not parents then
+ parents = {}
+ job._parents = parents
+ self._size = self._size + 1 -- @note only update number for new job without parents
+ end
+ table.insert(parents, rootjob)
-- in group? attach the group node
local group = self._group
if group then
job._deps = job._deps or dlist:new()
job._deps:push(group)
- group._parent = group._parent or {}
- table.insert(group._parent, job)
+ group._parents = group._parents or {}
+ table.insert(group._parents, job)
end
return job
end
-- pop job without deps at leaf node
-function jobpool:popjob()
+function jobpool:pop()
-- no jobs?
if self:size() == 0 then
@@ -73,8 +89,8 @@ function jobpool:popjob()
-- init leaf jobs first
local leafjobs = self._leafjobs
if #leafjobs == 0 then
- local groups = {}
- self:_genleafjobs(self:rootjob(), leafjobs, groups)
+ local refs = {}
+ self:_genleafjobs(self:rootjob(), leafjobs, refs)
end
-- pop a job from the leaf jobs
@@ -84,31 +100,26 @@ function jobpool:popjob()
local job = leafjobs[#leafjobs]
table.remove(leafjobs, #leafjobs)
- -- get priority and parent node
+ -- get priority and parents node
local priority = job._priority or 0
- local parent = assert(job._parent, "invalid job without parent node!")
+ local parents = assert(job._parents, "invalid job without parents node!")
- -- is group node? remove it from all parent jobs
- if job.group then
- for _, p in ipairs(parent) do
- p._priority = math.max(p._priority or 0, priority + 1)
- p._deps:remove(job)
- if p._deps:empty() and self._size > 0 then
- table.insert(leafjobs, 1, p)
- end
+ -- update all parents nodes
+ for _, p in ipairs(parents) do
+ p._priority = math.max(p._priority or 0, priority + 1)
+ p._deps:remove(job)
+ if p._deps:empty() and self._size > 0 then
+ table.insert(leafjobs, 1, p)
end
- return self:popjob()
- else
+ end
- -- update jobs size
+ -- is group node?
+ if job.group then
+ -- pop the next real job
+ return self:pop()
+ else
+ -- pop this job
self._size = self._size - 1
-
- -- remove this job from the parent job
- parent._priority = math.max(parent._priority or 0, priority + 1)
- parent._deps:remove(job)
- if parent._deps:empty() and self._size > 0 then
- table.insert(leafjobs, 1, parent)
- end
return job, priority
end
end
@@ -130,23 +141,20 @@ end
function jobpool:group_leave()
local group = self._group
self._group = nil
- if group and group._parent then
+ if group and group._parents then
return group
end
end
-- generate all leaf jobs from the given job
-function jobpool:_genleafjobs(job, leafjobs, groups)
+function jobpool:_genleafjobs(job, leafjobs, refs)
local deps = job._deps
if deps and not deps:empty() then
for dep in deps:items() do
- if dep.group then
- if not groups[dep.name] then
- groups[dep.name] = true
- self:_genleafjobs(dep, leafjobs, groups)
- end
- else
- self:_genleafjobs(dep, leafjobs, groups)
+ local depkey = tostring(dep)
+ if not refs[depkey] then
+ refs[depkey] = true
+ self:_genleafjobs(dep, leafjobs, refs)
end
end
else
@@ -155,18 +163,18 @@ function jobpool:_genleafjobs(job, leafjobs, groups)
end
-- generate jobs tree for the given job
-function jobpool:_gentree(job, groups)
+function jobpool:_gentree(job, refs)
local tree = {job.group and ("group(" .. job.name .. ")") or job.name}
local deps = job._deps
if deps and not deps:empty() then
for dep in deps:items() do
- if dep.group then
- if not groups[dep.name] then
- groups[dep.name] = true
- table.insert(tree, self:_gentree(dep, groups))
- end
+ local depkey = tostring(dep)
+ if refs[depkey] then
+ local depname = dep.group and ("group(" .. dep.name .. ")") or dep.name
+ table.insert(tree, "ref(" .. depname .. ")")
else
- table.insert(tree, self:_gentree(dep, groups))
+ refs[depkey] = true
+ table.insert(tree, self:_gentree(dep, refs))
end
end
end
@@ -185,8 +193,8 @@ end
-- tostring
function jobpool:__tostring()
- local groups = {}
- return string.serialize(self:_gentree(self:rootjob(), groups), {indent = 2})
+ local refs = {}
+ return string.serialize(self:_gentree(self:rootjob(), refs), {indent = 2})
end
-- new a jobpool
diff --git a/xmake/modules/private/async/runjobs.lua b/xmake/modules/private/async/runjobs.lua
index 6ca176789..2b848bde5 100644
--- a/xmake/modules/private/async/runjobs.lua
+++ b/xmake/modules/private/async/runjobs.lua
@@ -157,7 +157,7 @@ function main(name, jobs, opt)
job = job_pending
priority = priority_prev
else
- job, priority = jobs:popjob()
+ job, priority = jobs:pop()
end
if not job then
break