summaryrefslogtreecommitdiff
path: root/xmake/rules/c++/modules/modules_support/gcc.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2022-08-09 00:27:34 +0800
committerruki <[email protected]>2022-08-08 20:47:14 +0800
commitbd1263aa60a502120e06eb3fd077d69c689dc5d7 (patch)
treed67227fd3de5875639f11174e258cd52095f6c91 /xmake/rules/c++/modules/modules_support/gcc.lua
parent3619f16ac27d39bc77a108244ab6b85f3e404c70 (diff)
build batchjobs modules for gcc
Diffstat (limited to 'xmake/rules/c++/modules/modules_support/gcc.lua')
-rw-r--r--xmake/rules/c++/modules/modules_support/gcc.lua55
1 files changed, 49 insertions, 6 deletions
diff --git a/xmake/rules/c++/modules/modules_support/gcc.lua b/xmake/rules/c++/modules/modules_support/gcc.lua
index 8f3bacf72..e62721cf3 100644
--- a/xmake/rules/c++/modules/modules_support/gcc.lua
+++ b/xmake/rules/c++/modules/modules_support/gcc.lua
@@ -299,10 +299,55 @@ end
-- build module files for batchjobs
function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, opt)
- batchjobs:addjob("TODO", function (index, total)
- -- TODO
- raise("build modules not supported!")
- end, {rootjob = opt.rootjob})
+ local compinst = target:compiler("cxx")
+ local mapper_file = _get_module_mapper()
+ local common_args = {"-x", "c++"}
+ local cachedir = common.modules_cachedir(target)
+
+ -- build modules
+ local projectdir = os.projectdir()
+ local depmtime = 0
+ local provided_modules = {}
+ for _, objectfile in ipairs(objectfiles) do
+ local m = modules[objectfile]
+ if m and m.provides then
+ -- assume there that provides is only one, until we encounter the case
+ local length = 0
+ local name, provide
+ for k, v in pairs(m.provides) do
+ length = length + 1
+ name = k
+ provide = v
+ if length > 1 then
+ raise("multiple provides are not supported now!")
+ end
+ end
+
+ local bmifile = provide.bmi
+ local moduleinfo = table.copy(provide)
+ moduleinfo.job = batchjobs:newjob(provide.sourcefile, function (index, total)
+ depend.on_changed(function()
+ local args = {"-o", objectfile, "-c", provide.sourcefile}
+ progress.show((index * 100) / total, "${color.build.object}generating.cxx.module.bmi %s", name)
+ local objectdir = path.directory(objectfile)
+ if not os.isdir(objectdir) then
+ os.mkdir(objectdir)
+ end
+ os.vrunv(compinst:program(), table.join(compinst:compflags({target = target}), common_args, args))
+ end, {dependfile = target:dependfile(bmifile), files = {provide.sourcefile}})
+ end)
+ if m.requires then
+ moduleinfo.deps = table.keys(m.requires)
+ end
+ moduleinfo.name = name
+ provided_modules[name] = moduleinfo
+ _add_module_to_mapper(mapper_file, name, path.absolute(bmifile, projectdir))
+ target:add("objectfiles", objectfile)
+ end
+ end
+
+ -- build batchjobs for modules
+ common.build_batchjobs_for_modules(provided_modules, batchjobs, opt.rootjob)
end
-- build module files for batchcmds
@@ -310,8 +355,6 @@ function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, op
local compinst = target:compiler("cxx")
local mapper_file = _get_module_mapper()
local common_args = {"-x", "c++"}
-
- -- get cachedirs
local cachedir = common.modules_cachedir(target)
-- build modules