summaryrefslogtreecommitdiff
path: root/xmake/rules/c++/modules/modules_support/msvc.lua
diff options
context:
space:
mode:
Diffstat (limited to 'xmake/rules/c++/modules/modules_support/msvc.lua')
-rw-r--r--xmake/rules/c++/modules/modules_support/msvc.lua83
1 files changed, 62 insertions, 21 deletions
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