summaryrefslogtreecommitdiff
path: root/xmake/rules/c++/modules
diff options
context:
space:
mode:
authorruki <[email protected]>2022-08-09 00:31:34 +0800
committerruki <[email protected]>2022-08-09 00:31:34 +0800
commita7754666add7c76fe8a255e6c84800fa0cb44320 (patch)
tree34ba9788ebd1deb038c543cbee51bd6e02ed6427 /xmake/rules/c++/modules
parentbd1263aa60a502120e06eb3fd077d69c689dc5d7 (diff)
build batchjobs for clang/msvc
Diffstat (limited to 'xmake/rules/c++/modules')
-rw-r--r--xmake/rules/c++/modules/modules_support/clang.lua77
-rw-r--r--xmake/rules/c++/modules/modules_support/gcc.lua3
-rw-r--r--xmake/rules/c++/modules/modules_support/msvc.lua83
3 files changed, 121 insertions, 42 deletions
diff --git a/xmake/rules/c++/modules/modules_support/clang.lua b/xmake/rules/c++/modules/modules_support/clang.lua
index bff8cb7cb..f11350764 100644
--- a/xmake/rules/c++/modules/modules_support/clang.lua
+++ b/xmake/rules/c++/modules/modules_support/clang.lua
@@ -198,8 +198,6 @@ function generate_stl_headerunits_for_batchcmds(target, batchcmds, headerunits,
-- get cachedirs
local stlcachedir = common.stlmodules_cachedir(target)
-
- -- get headerunits flags
local modulecachepathflag = get_modulecachepathflag(target)
local modulefileflag = get_modulefileflag(target)
@@ -230,8 +228,6 @@ function generate_user_headerunits_for_batchjobs(target, batchjobs, headerunits,
-- get cachedirs
local cachedir = common.modules_cachedir(target)
-
- -- get headerunits flags
local modulecachepathflag = get_modulecachepathflag(target)
local emitmoduleflag = get_emitmoduleflag(target)
local modulefileflag = get_modulefileflag(target)
@@ -285,8 +281,6 @@ function generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits,
-- get cachedirs
local cachedir = common.modules_cachedir(target)
-
- -- get headerunits flags
local modulecachepathflag = get_modulecachepathflag(target)
local emitmoduleflag = get_emitmoduleflag(target)
local modulefileflag = get_modulefileflag(target)
@@ -329,14 +323,67 @@ function generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits,
batchcmds:set_depmtime(depmtime)
end
+-- build module files for batchjobs
+function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, opt)
+ local compinst = target:compiler("cxx")
+ local cachedir = common.modules_cachedir(target)
+ local modulecachepathflag = get_modulecachepathflag(target)
+ local emitmoduleinterfaceflag = get_emitmoduleinterfaceflag(target)
+
+ -- append module mapper flags
+ local cache = common.localcache():get("mapflags") or {}
+ target:add("cxxflags", cache, {force = true})
+
+ -- build modules
+ local common_args = {modulecachepathflag .. cachedir}
+ 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()
+ 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
+ local args = {emitmoduleinterfaceflag, "-c", "-x", "c++-module", "--precompile", provide.sourcefile, "-o", bmifile}
+ os.vrunv(compinst:program(), table.join(compinst:compflags({target = target}), common_args, args))
+ os.vrunv(compinst:program(), table.join(compinst:compflags({target = target}), common_args, {bmifile}, {"-c", "-o", objectfile}))
+ 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(target, name, bmifile)
+ 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
function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, opt)
local compinst = target:compiler("cxx")
-
- -- get cachedirs
local cachedir = common.modules_cachedir(target)
-
- -- get modules flags
local modulecachepathflag = get_modulecachepathflag(target)
local emitmoduleinterfaceflag = get_emitmoduleinterfaceflag(target)
@@ -379,14 +426,6 @@ function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, op
batchcmds:set_depmtime(depmtime)
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})
-end
-
function get_bmi_extension()
return ".pcm"
end
@@ -524,4 +563,4 @@ function has_headerunitsupport(target)
_g.support_headerunits = support_headerunits or false
end
return support_headerunits or nil
-end \ No newline at end of file
+end
diff --git a/xmake/rules/c++/modules/modules_support/gcc.lua b/xmake/rules/c++/modules/modules_support/gcc.lua
index e62721cf3..a37346bad 100644
--- a/xmake/rules/c++/modules/modules_support/gcc.lua
+++ b/xmake/rules/c++/modules/modules_support/gcc.lua
@@ -306,7 +306,6 @@ function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, op
-- build modules
local projectdir = os.projectdir()
- local depmtime = 0
local provided_modules = {}
for _, objectfile in ipairs(objectfiles) do
local m = modules[objectfile]
@@ -327,12 +326,12 @@ function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, op
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
+ local args = {"-o", objectfile, "-c", provide.sourcefile}
os.vrunv(compinst:program(), table.join(compinst:compflags({target = target}), common_args, args))
end, {dependfile = target:dependfile(bmifile), files = {provide.sourcefile}})
end)
diff --git a/xmake/rules/c++/modules/modules_support/msvc.lua b/xmake/rules/c++/modules/modules_support/msvc.lua
index 7cf1c63b1..64ca0dae3 100644
--- a/xmake/rules/c++/modules/modules_support/msvc.lua
+++ b/xmake/rules/c++/modules/modules_support/msvc.lua
@@ -155,6 +155,7 @@ function generate_stl_headerunits_for_batchjobs(target, batchjobs, headerunits,
local compinst = target:compiler("cxx")
local toolchain = target:toolchain("msvc")
local vcvars = toolchain:config("vcvars")
+ local stlcachedir = common.stlmodules_cachedir(target)
-- get flags
local exportheaderflag = get_exportheaderflag(target)
@@ -163,9 +164,6 @@ function generate_stl_headerunits_for_batchjobs(target, batchjobs, headerunits,
local ifcoutputflag = get_ifcoutputflag(target)
assert(headerunitflag and headernameflag and exportheaderflag, "compiler(msvc): does not support c++ header units!")
- -- get cachedirs
- local stlcachedir = common.stlmodules_cachedir(target)
-
-- build headerunits
local common_args = {"-TP", exportheaderflag, "-c"}
for _, headerunit in ipairs(headerunits) do
@@ -190,6 +188,7 @@ function generate_stl_headerunits_for_batchcmds(target, batchcmds, headerunits,
local compinst = target:compiler("cxx")
local toolchain = target:toolchain("msvc")
local vcvars = toolchain:config("vcvars")
+ local stlcachedir = common.stlmodules_cachedir(target)
-- get flags
local exportheaderflag = get_exportheaderflag(target)
@@ -198,9 +197,6 @@ function generate_stl_headerunits_for_batchcmds(target, batchcmds, headerunits,
local ifcoutputflag = get_ifcoutputflag(target)
assert(headerunitflag and headernameflag and exportheaderflag, "compiler(msvc): does not support c++ header units!")
- -- get cachedirs
- local stlcachedir = common.stlmodules_cachedir(target)
-
-- build headerunits
local common_args = {"-TP", exportheaderflag, "-c"}
local depmtime = 0
@@ -226,6 +222,7 @@ function generate_user_headerunits_for_batchjobs(target, batchjobs, headerunits,
local compinst = target:compiler("cxx")
local toolchain = target:toolchain("msvc")
local vcvars = toolchain:config("vcvars")
+ local cachedir = common.modules_cachedir(target)
-- get flags
local exportheaderflag = get_exportheaderflag(target)
@@ -234,9 +231,6 @@ function generate_user_headerunits_for_batchjobs(target, batchjobs, headerunits,
local ifcoutputflag = get_ifcoutputflag(target)
assert(headerunitflag and headernameflag and exportheaderflag, "compiler(msvc): does not support c++ header units!")
- -- get cachedirs
- local cachedir = common.modules_cachedir(target)
-
-- build headerunits
local common_args = {"-TP", exportheaderflag, "-c"}
local projectdir = os.projectdir()
@@ -279,6 +273,7 @@ function generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits,
local compinst = target:compiler("cxx")
local toolchain = target:toolchain("msvc")
local vcvars = toolchain:config("vcvars")
+ local cachedir = common.modules_cachedir(target)
-- get flags
local exportheaderflag = get_exportheaderflag(target)
@@ -287,9 +282,6 @@ function generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits,
local ifcoutputflag = get_ifcoutputflag(target)
assert(headerunitflag and headernameflag and exportheaderflag, "compiler(msvc): does not support c++ header units!")
- -- get cachedirs
- local cachedir = common.modules_cachedir(target)
-
-- build headerunits
local common_args = {"-TP", exportheaderflag, "-c"}
local projectdir = os.projectdir()
@@ -326,10 +318,63 @@ 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 toolchain = target:toolchain("msvc")
+ local vcvars = toolchain:config("vcvars")
+ local cachedir = common.modules_cachedir(target)
+
+ -- get flags
+ local ifcoutputflag = get_ifcoutputflag(target)
+ local interfaceflag = get_interfaceflag(target)
+ local referenceflag = get_referenceflag(target)
+
+ -- append module mapper flags
+ local cache = common.localcache():get("mapflags") or {}
+ target:add("cxxflags", cache, {force = true})
+
+ -- build modules
+ local common_args = {"-TP"}
+ 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()
+ 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
+ local args = {"-c", "-Fo" .. objectfile, interfaceflag, ifcoutputflag, bmifile, provide.sourcefile}
+ os.vrunv(compinst:program(), table.join(compinst:compflags({target = target}), common_args, args), {envs = vcvars})
+ 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(referenceflag, name .. "=" .. path.filename(bmifile))
+ 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
@@ -337,8 +382,6 @@ function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, op
local compinst = target:compiler("cxx")
local toolchain = target:toolchain("msvc")
local vcvars = toolchain:config("vcvars")
-
- -- get cachedirs
local cachedir = common.modules_cachedir(target)
-- get flags
@@ -375,9 +418,7 @@ function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, op
batchcmds:mkdir(path.directory(objectfile))
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), common_args, args), {envs = vcvars})
batchcmds:add_depfiles(provide.sourcefile)
-
_add_module_to_mapper(referenceflag, name .. "=" .. path.filename(bmifile))
-
target:add("objectfiles", objectfile)
depmtime = math.max(depmtime, os.mtime(bmifile))
end
@@ -526,4 +567,4 @@ function get_scandependenciesflag(target)
_g.scandependenciesflag = scandependenciesflag or false
end
return scandependenciesflag or nil
-end \ No newline at end of file
+end