summaryrefslogtreecommitdiff
path: root/xmake/rules
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 /xmake/rules
parent386f926b5c2651db23afdd59ecb8591382b3598f (diff)
build module batch jobs
Diffstat (limited to 'xmake/rules')
-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
4 files changed, 79 insertions, 15 deletions
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