diff options
| author | ruki <[email protected]> | 2020-03-17 23:14:42 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2020-03-17 13:28:12 +0800 |
| commit | 0924c3f19f63006333f05dbf83f6f152d8a1c920 (patch) | |
| tree | 566c6d179eea0b390dfb1a5ec61372d4e9714957 | |
| parent | d6d0c6d91c030896f56bca97f8bf380b7b49c2ad (diff) | |
fix targetdeps for jobpool
| -rw-r--r-- | tests/projects/other/build_deps/xmake.lua | 51 | ||||
| -rw-r--r-- | xmake/actions/build/build.lua | 17 | ||||
| -rw-r--r-- | xmake/modules/private/async/jobpool.lua | 98 | ||||
| -rw-r--r-- | xmake/modules/private/async/runjobs.lua | 2 |
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 |
