summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2021-10-16 00:57:59 +0800
committerruki <[email protected]>2021-10-16 00:57:59 +0800
commit934befffcc389d3bd9497e5de1d19407466a28c5 (patch)
tree5a5ea3fd4b79516d4d4a22b67454a0707f206561
parent386f926b5c2651db23afdd59ecb8591382b3598f (diff)
build module batch jobs
-rw-r--r--xmake/modules/private/async/jobpool.lua15
-rw-r--r--xmake/rules/c++/modules/build_modules/clang.lua24
-rw-r--r--xmake/rules/c++/modules/build_modules/gcc.lua26
-rw-r--r--xmake/rules/c++/modules/build_modules/module_parser.lua18
-rw-r--r--xmake/rules/c++/modules/build_modules/msvc.lua26
5 files changed, 94 insertions, 15 deletions
diff --git a/xmake/modules/private/async/jobpool.lua b/xmake/modules/private/async/jobpool.lua
index 299700534..f7eef0c1b 100644
--- a/xmake/modules/private/async/jobpool.lua
+++ b/xmake/modules/private/async/jobpool.lua
@@ -35,8 +35,23 @@ function jobpool:rootjob()
return self._rootjob
end
+-- new run job
+--
+-- e.g.
+-- local job = jobpool:newjob("xxx", function (index, total) end)
+-- jobpool:add(job, rootjob1)
+-- jobpool:add(job, rootjob2)
+-- jobpool:add(job, rootjob3)
+--
+function jobpool:newjob(name, run)
+ return {name = name, run = run}
+end
+
-- add run job to the given job node
--
+-- e.g.
+-- local job = jobpool:addjob("xxx", function (index, total) end, {rootjob = rootjob})
+--
-- @param name the job name
-- @param run the run command/script
-- @param opt the options (rootjob)
diff --git a/xmake/rules/c++/modules/build_modules/clang.lua b/xmake/rules/c++/modules/build_modules/clang.lua
index 7037c0767..06b5aa1db 100644
--- a/xmake/rules/c++/modules/build_modules/clang.lua
+++ b/xmake/rules/c++/modules/build_modules/clang.lua
@@ -21,6 +21,7 @@
-- imports
import("core.tool.compiler")
import("private.action.build.object", {alias = "objectbuilder"})
+import("module_parser")
-- build module files
function build_with_batchjobs(target, batchjobs, sourcebatch, opt)
@@ -51,13 +52,19 @@ function build_with_batchjobs(target, batchjobs, sourcebatch, opt)
table.insert(modulefiles, modulefile)
end
+ -- load moduledeps
+ local moduledeps = module_parser.load(target, sourcebatch, opt)
+
+ -- build moduledeps
+ local moduledeps_files = module_parser.build(moduledeps)
+
-- compile module files to object files
- local rootjob = opt.rootjob
local count = 0
local sourcefiles_total = #sourcebatch.sourcefiles
for i = 1, sourcefiles_total do
local sourcefile = sourcebatch.sourcefiles[i]
- batchjobs:addjob(sourcefile, function (index, total)
+ local moduledep = assert(moduledeps_files[sourcefile], "moduledep(%s) not found!", sourcefile)
+ moduledep.job = batchjobs:newjob(sourcefile, function (index, total)
-- compile module files to *.pcm
local opt2 = table.join(opt, {configs = {force = {cxxflags = {modulesflag,
@@ -88,8 +95,19 @@ function build_with_batchjobs(target, batchjobs, sourcebatch, opt)
end
end
- end, {rootjob = rootjob})
+ end)
end
+ -- build batchjobs
+ local rootjob = opt.rootjob
+ for _, moduledep in pairs(moduledeps) do
+ if moduledep.parents then
+ for _, parent in ipairs(moduledep.parents) do
+ batchjobs:add(moduledep.job, parent.job)
+ end
+ else
+ batchjobs:add(moduledep.job, rootjob)
+ end
+ end
end
diff --git a/xmake/rules/c++/modules/build_modules/gcc.lua b/xmake/rules/c++/modules/build_modules/gcc.lua
index 1fb6b5a10..1264f29c2 100644
--- a/xmake/rules/c++/modules/build_modules/gcc.lua
+++ b/xmake/rules/c++/modules/build_modules/gcc.lua
@@ -44,25 +44,39 @@ function build_with_batchjobs(target, batchjobs, sourcebatch, opt)
table.insert(sourcebatch.dependfiles, target:dependfile(objectfile))
end
- -- TODO load moduledeps
- --local moduledeps = module_parser.load(target, sourcebatch, opt)
- --print(moduledeps)
+ -- load moduledeps
+ local moduledeps = module_parser.load(target, sourcebatch, opt)
+
+ -- build moduledeps
+ local moduledeps_files = module_parser.build(moduledeps)
-- compile module files to object files
- local rootjob = opt.rootjob
for i = 1, #sourcebatch.sourcefiles do
local sourcefile = sourcebatch.sourcefiles[i]
- batchjobs:addjob(sourcefile, function (index, total)
+ local moduledep = assert(moduledeps_files[sourcefile], "moduledep(%s) not found!", sourcefile)
+ moduledep.job = batchjobs:newjob(sourcefile, function (index, total)
local opt2 = table.join(opt, {configs = {force = {cxxflags = {"-x c++"}}}})
opt2.progress = (index * 100) / total
opt2.objectfile = sourcebatch.objectfiles[i]
opt2.dependfile = sourcebatch.dependfiles[i]
opt2.sourcekind = assert(sourcebatch.sourcekind, "%s: sourcekind not found!", sourcefile)
objectbuilder.build_object(target, sourcefile, opt2)
- end, {rootjob = rootjob})
+ end)
end
-- add module flags
target:add("cxxflags", modulesflag)
+
+ -- build batchjobs
+ local rootjob = opt.rootjob
+ for _, moduledep in pairs(moduledeps) do
+ if moduledep.parents then
+ for _, parent in ipairs(moduledep.parents) do
+ batchjobs:add(moduledep.job, parent.job)
+ end
+ else
+ batchjobs:add(moduledep.job, rootjob)
+ end
+ end
end
diff --git a/xmake/rules/c++/modules/build_modules/module_parser.lua b/xmake/rules/c++/modules/build_modules/module_parser.lua
index 5ac4e42e9..17e0f4d24 100644
--- a/xmake/rules/c++/modules/build_modules/module_parser.lua
+++ b/xmake/rules/c++/modules/build_modules/module_parser.lua
@@ -94,3 +94,21 @@ function load(target, sourcebatch, opt)
end
return moduledeps
end
+
+-- build module deps
+function build(moduledeps)
+ local moduledeps_files = {}
+ for _, moduledep in pairs(moduledeps) do
+ if moduledep.deps then
+ for _, depname in ipairs(moduledep.deps) do
+ local dep = moduledeps[depname]
+ if dep then
+ dep.parents = dep.parents or {}
+ table.insert(dep.parents, moduledep)
+ end
+ end
+ end
+ moduledeps_files[moduledep.file] = moduledep
+ end
+ return moduledeps_files
+end
diff --git a/xmake/rules/c++/modules/build_modules/msvc.lua b/xmake/rules/c++/modules/build_modules/msvc.lua
index e40975557..831b5cd88 100644
--- a/xmake/rules/c++/modules/build_modules/msvc.lua
+++ b/xmake/rules/c++/modules/build_modules/msvc.lua
@@ -80,17 +80,19 @@ function build_with_batchjobs(target, batchjobs, sourcebatch, opt)
table.insert(sourcebatch.dependfiles, dependfile)
end
- -- TODO load moduledeps
- --local moduledeps = module_parser.load(target, sourcebatch, opt)
- --print(moduledeps)
+ -- load moduledeps
+ local moduledeps = module_parser.load(target, sourcebatch, opt)
+
+ -- build moduledeps
+ local moduledeps_files = module_parser.build(moduledeps)
-- compile module files to object files
- local rootjob = opt.rootjob
local count = 0
local sourcefiles_total = #sourcebatch.sourcefiles
for i = 1, sourcefiles_total do
local sourcefile = sourcebatch.sourcefiles[i]
- batchjobs:addjob(sourcefile, function (index, total)
+ local moduledep = assert(moduledeps_files[sourcefile], "moduledep(%s) not found!", sourcefile)
+ moduledep.job = batchjobs:newjob(sourcefile, function (index, total)
local opt2 = table.join(opt, {configs = {force = {cxxflags = {interfaceflag,
outputflag .. " " .. os.args(modulefiles[i]), "/TP"}}}})
opt2.progress = (index * 100) / total
@@ -106,7 +108,7 @@ function build_with_batchjobs(target, batchjobs, sourcebatch, opt)
target:add("cxxflags", referenceflag .. " " .. os.args(modulefile))
end
end
- end, {rootjob = rootjob})
+ end)
end
-- add module flags
@@ -114,5 +116,17 @@ function build_with_batchjobs(target, batchjobs, sourcebatch, opt)
if cachedir then
target:add("cxxflags", "/ifcSearchDir " .. os.args(cachedir))
end
+
+ -- build batchjobs
+ local rootjob = opt.rootjob
+ for _, moduledep in pairs(moduledeps) do
+ if moduledep.parents then
+ for _, parent in ipairs(moduledep.parents) do
+ batchjobs:add(moduledep.job, parent.job)
+ end
+ else
+ batchjobs:add(moduledep.job, rootjob)
+ end
+ end
end