summaryrefslogtreecommitdiff
path: root/xmake/rules/c++/modules/modules_support
diff options
context:
space:
mode:
authorArthur LAURENT <[email protected]>2022-12-02 23:47:45 +0100
committerArthur LAURENT <[email protected]>2022-12-03 00:05:16 +0100
commit919115f8faab05b6915dbe336720e2d7cbc42671 (patch)
tree9ae46cbf5ba1efc629cbcc5f9b0eeecbe31d918b /xmake/rules/c++/modules/modules_support
parent09113b27d3b5749b09716e8e0ec6c766b4662bd5 (diff)
minor refactor and improvements to C++ module build
Diffstat (limited to 'xmake/rules/c++/modules/modules_support')
-rw-r--r--xmake/rules/c++/modules/modules_support/clang.lua18
-rw-r--r--xmake/rules/c++/modules/modules_support/common.lua3
-rw-r--r--xmake/rules/c++/modules/modules_support/gcc.lua52
-rw-r--r--xmake/rules/c++/modules/modules_support/msvc.lua69
4 files changed, 36 insertions, 106 deletions
diff --git a/xmake/rules/c++/modules/modules_support/clang.lua b/xmake/rules/c++/modules/modules_support/clang.lua
index ad32931de..69419b4e2 100644
--- a/xmake/rules/c++/modules/modules_support/clang.lua
+++ b/xmake/rules/c++/modules/modules_support/clang.lua
@@ -154,7 +154,7 @@ function _build_modulefile(target, sourcefile, opt)
local flags = table.join({"-x", "c++"}, requiresflags or {}, compflags)
-- trace
- progress.show(opt.progress, "${color.build.object}build.cxx.module %s", sourcefile)
+ progress.show(opt.progress, "${color.build.object}compiling.module.$(mode) %s", sourcefile)
vprint(compinst:compcmd(sourcefile, objectfile, {compflags = flags, rawargs = true}))
if not dryrun then
@@ -193,7 +193,7 @@ function _build_interfacemodulefile(target, sourcefile, opt)
local objflags = table.join(compflags, common_args, requiresflags or {})
-- trace
- progress.show(opt.progress, "${color.build.object}generating.cxx.module.bmi %s", opt.name)
+ progress.show(opt.progress, "${color.build.object}compiling.module.$(mode) %s", opt.name)
vprint(compinst:compcmd(sourcefile, bmifile, {compflags = bmiflags, rawargs = true}))
vprint(compinst:compcmd(bmifile, objectfile, {compflags = objflags, rawargs = true}))
@@ -243,7 +243,7 @@ function generate_dependencies(target, sourcebatch, opt)
local dependfile = target:dependfile(sourcefile)
depend.on_changed(function()
if opt.progress then
- progress.show(opt.progress, "${color.build.object}generating.cxx.module.deps %s", sourcefile)
+ progress.show(opt.progress, "${color.build.object}generating.module.deps %s", sourcefile)
end
local outputdir = path.translate(path.join(cachedir, path.directory(path.relative(sourcefile, projectdir))))
@@ -311,7 +311,7 @@ function generate_stl_headerunits_for_batchjobs(target, batchjobs, headerunits,
-- don't build same header unit at the same time
if not common.memcache():get2(headerunit.name, "building") then
common.memcache():set2(headerunit.name, "building", true)
- progress.show((index * 100) / total, "${color.build.object}generating.cxx.headerunit.bmi %s", headerunit.name)
+ progress.show((index * 100) / total, "${color.build.object}compiling.headerunit.$(mode) %s", headerunit.name)
local args = {modulecachepathflag .. stlcachedir, "-c", "-o", bmifile, "-x", "c++-system-header", headerunit.name}
os.vrunv(compinst:program(), table.join(compinst:compflags({target = target}), args))
end
@@ -344,7 +344,7 @@ function generate_stl_headerunits_for_batchcmds(target, batchcmds, headerunits,
local args = {
path(stlcachedir, function (p) return modulecachepathflag .. p end),
"-c", "-o", path(bmifile), "-x", "c++-system-header", headerunit.name}
- batchcmds:show_progress(opt.progress, "${color.build.object}generating.cxx.headerunit.bmi %s", headerunit.name)
+ batchcmds:show_progress(opt.progress, "${color.build.object}compiling.headerunit.$(mode) %s", headerunit.name)
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), args))
end
-- libc++ have a builtin module mapper
@@ -387,7 +387,7 @@ function generate_user_headerunits_for_batchjobs(target, batchjobs, headerunits,
local bmifile = (outputdir and path.join(outputdir, bmifilename) or bmifilename)
batchjobs:addjob(headerunit.name, function (index, total)
depend.on_changed(function()
- progress.show((index * 100) / total, "${color.build.object}generating.cxx.headerunit.bmi %s", headerunit.name)
+ progress.show((index * 100) / total, "${color.build.object}compiling.headerunit.$(mode) %s", headerunit.name)
local objectdir = path.directory(objectfile)
if not os.isdir(objectdir) then
os.mkdir(objectdir)
@@ -446,7 +446,7 @@ function generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits,
table.join2(args, {"-x", "c++-system-header", headerunit.name})
end
- batchcmds:show_progress(opt.progress, "${color.build.object}generating.cxx.headerunit.bmi %s", headerunit.name)
+ batchcmds:show_progress(opt.progress, "${color.build.object}compiling.headerunit.$(mode) %s", headerunit.name)
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), args))
batchcmds:add_depfiles(headerunit.path)
@@ -576,7 +576,7 @@ function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, op
if module.requires then
requiresflags = get_requiresflags(target, module.requires)
end
- batchcmds:show_progress(opt.progress, "${color.build.object}generating.cxx.module.bmi %s", name)
+ batchcmds:show_progress(opt.progress, "${color.build.object}compiling.module.$(mode) %s", name)
batchcmds:mkdir(path.directory(objectfile))
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), common_args, requiresflags or {}, args))
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), common_args, requiresflags or {}, path(bmifile), {"-c", "-o", path(objectfile)}))
@@ -591,7 +591,7 @@ function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, op
if common.has_module_extension(module.cppfile) then
local flags = {"-o", path(objectfile), "-c", path(module.cppfile)}
- batchcmds:show_progress(opt.progress, "${color.build.object}build.cxx.module %s", module.cppfile)
+ batchcmds:show_progress(opt.progress, "${color.build.object}compiling.module.$(mode) %s", module.cppfile)
batchcmds:mkdir(path.directory(objectfile))
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), requiresflags or {}, flags))
batchcmds:add_depfiles(module.cppfile)
diff --git a/xmake/rules/c++/modules/modules_support/common.lua b/xmake/rules/c++/modules/modules_support/common.lua
index b21613f61..6401f1f5b 100644
--- a/xmake/rules/c++/modules/modules_support/common.lua
+++ b/xmake/rules/c++/modules/modules_support/common.lua
@@ -229,7 +229,8 @@ function _parse_dependencies_data(target, moduleinfos)
name = name:replace(":", "-")
m.provides[provide["logical-name"]] = {
bmi = path.join(cachedir, name),
- sourcefile = moduleinfo.sourcefile
+ sourcefile = moduleinfo.sourcefile,
+ interface = provide["is-interface"]
}
end
end
diff --git a/xmake/rules/c++/modules/modules_support/gcc.lua b/xmake/rules/c++/modules/modules_support/gcc.lua
index 476bc6487..cbdf9b1bf 100644
--- a/xmake/rules/c++/modules/modules_support/gcc.lua
+++ b/xmake/rules/c++/modules/modules_support/gcc.lua
@@ -111,40 +111,7 @@ function _build_modulefile(target, sourcefile, opt)
end
-- trace
- progress.show(opt.progress, "${color.build.object}build.cxx.module %s", sourcefile)
- vprint(compinst:compcmd(sourcefile, objectfile, {compflags = compflags, rawargs = true}))
-
- if not dryrun then
-
- -- do compile
- dependinfo.files = {}
- assert(compinst:compile(sourcefile, objectfile, {dependinfo = dependinfo, compflags = compflags}))
-
- -- update files and values to the dependent file
- dependinfo.values = depvalues
- table.join2(dependinfo.files, sourcefile)
- depend.save(dependinfo, dependfile)
- end
-end
-
--- build interface module file
-function _build_interfacemodulefile(target, sourcefile, opt)
- local objectfile = opt.objectfile
- local dependfile = opt.dependfile
- local compinst = compiler.load("cxx", {target = target})
- local compflags = table.join("-x", "c++", compinst:compflags({target = target}))
- local dependinfo = option.get("rebuild") and {} or (depend.load(dependfile) or {})
-
- -- need build this object?
- local dryrun = option.get("dry-run")
- local depvalues = {compinst:program(), compflags}
- local lastmtime = os.isfile(objectfile) and os.mtime(dependfile) or 0
- if not dryrun and not depend.is_changed(dependinfo, {lastmtime = lastmtime, values = depvalues}) then
- return
- end
-
- -- trace
- progress.show(opt.progress, "${color.build.object}generating.cxx.module.bmi %s", opt.name)
+ progress.show(opt.progress, "${color.build.object}compiling.module.$(mode) %s", opt.name)
vprint(compinst:compcmd(sourcefile, objectfile, {compflags = compflags, rawargs = true}))
if not dryrun then
@@ -197,7 +164,7 @@ function generate_dependencies(target, sourcebatch, opt)
local dependfile = target:dependfile(sourcefile)
depend.on_changed(function()
if opt.progress then
- progress.show(opt.progress, "${color.build.object}generating.cxx.module.deps %s", sourcefile)
+ progress.show(opt.progress, "${color.build.object}generating.module.deps %s", sourcefile)
end
local outputdir = path.translate(path.join(cachedir, path.directory(path.relative(sourcefile, projectdir))))
@@ -264,7 +231,7 @@ function generate_stl_headerunits_for_batchjobs(target, batchjobs, headerunits,
if not os.isfile(bmifile) then
batchjobs:addjob(headerunit.name, function (index, total)
depend.on_changed(function()
- progress.show((index * 100) / total, "${color.build.object}generating.cxx.headerunit.bmi %s", headerunit.name)
+ progress.show((index * 100) / total, "${color.build.object}compiling.headerunit.$(mode) %s", headerunit.name)
local args = {"-c", "-x", "c++-system-header", headerunit.name}
local flags = table.join(compinst:compflags({target = target}), args)
-- we need to support reading and writing mapperfile in parallel, otherwise it will be broken
@@ -302,7 +269,7 @@ function generate_stl_headerunits_for_batchcmds(target, batchcmds, headerunits,
local bmifile = path.join(stlcachedir, headerunit.name .. get_bmi_extension())
if not os.isfile(bmifile) then
local args = {"-c", "-x", "c++-system-header", headerunit.name}
- batchcmds:show_progress(opt.progress, "${color.build.object}generating.cxx.headerunit.bmi %s", headerunit.name)
+ batchcmds:show_progress(opt.progress, "${color.build.object}compiling.headerunit.$(mode) %s", headerunit.name)
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), args))
end
batchcmds:add_depfiles(headerunit.path)
@@ -340,7 +307,7 @@ function generate_user_headerunits_for_batchjobs(target, batchjobs, headerunits,
end
batchjobs:addjob(headerunit.name, function (index, total)
depend.on_changed(function()
- progress.show((index * 100) / total, "${color.build.object}generating.cxx.headerunit.bmi %s", headerunit.name)
+ progress.show((index * 100) / total, "${color.build.object}compiling.headerunit.$(mode) %s", headerunit.name)
local objectdir = path.directory(objectfile)
if not os.isdir(objectdir) then
os.mkdir(objectdir)
@@ -399,7 +366,7 @@ function generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits,
headerunit_path = path.is_absolute(headerunit.path) and headerunit.path or path.join(".", headerunit.path)
end
- batchcmds:show_progress(opt.progress, "${color.build.object}generating.cxx.headerunit.bmi %s", headerunit.name)
+ batchcmds:show_progress(opt.progress, "${color.build.object}compiling.headerunit.$(mode) %s", headerunit.name)
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), args))
batchcmds:add_depfiles(headerunit.path)
@@ -436,7 +403,7 @@ function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, op
local bmifile = provide.bmi
local moduleinfo = table.copy(provide)
moduleinfo.job = batchjobs:newjob(provide.sourcefile, function (index, total)
- _build_interfacemodulefile(target, provide.sourcefile, {
+ _build_modulefile(target, provide.sourcefile, {
objectfile = objectfile,
dependfile = target:dependfile(bmifile),
name = name,
@@ -458,6 +425,7 @@ function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, op
_build_modulefile(target, m.cppfile, {
objectfile = objectfile,
dependfile = target:dependfile(objectfile),
+ name = m.cppfile,
progress = (index * 100) / total})
target:add("objectfiles", objectfile)
end)
@@ -498,7 +466,7 @@ function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, op
local bmifile = provide.bmi
local args = {"-o", path(objectfile), "-c", path(provide.sourcefile)}
- batchcmds:show_progress(opt.progress, "${color.build.object}generating.cxx.module.bmi %s", name)
+ batchcmds:show_progress(opt.progress, "${color.build.object}compiling.module.$(mode) %s", name)
batchcmds:mkdir(path.directory(objectfile))
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), common_args, args))
batchcmds:add_depfiles(provide.sourcefile)
@@ -507,7 +475,7 @@ function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, op
depmtime = math.max(depmtime, os.mtime(bmifile))
elseif common.has_module_extension(m.cppfile) then
local args = {"-o", path(objectfile), "-c", path(m.cppfile)}
- batchcmds:show_progress(opt.progress, "${color.build.object}build.cxx.module %s", m.cppfile)
+ batchcmds:show_progress(opt.progress, "${color.build.object}compiling.module.$(mode) %s", m.cppfile)
batchcmds:mkdir(path.directory(objectfile))
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), args))
batchcmds:add_depfiles(m.cppfile)
diff --git a/xmake/rules/c++/modules/modules_support/msvc.lua b/xmake/rules/c++/modules/modules_support/msvc.lua
index 092e23c24..d3c35e7c8 100644
--- a/xmake/rules/c++/modules/modules_support/msvc.lua
+++ b/xmake/rules/c++/modules/modules_support/msvc.lua
@@ -101,51 +101,10 @@ function _build_modulefile(target, sourcefile, opt)
end
-- init flags
- local requiresflags = opt.requiresflags
- local flags = table.join("-TP", requiresflags or {}, compflags)
+ local flags = table.join("-TP", compflags, opt.flags or {})
-- trace
- progress.show(opt.progress, "${color.build.object}build.cxx.module %s", sourcefile)
- vprint(compinst:compcmd(sourcefile, objectfile, {compflags = flags, rawargs = true}))
-
- if not dryrun then
-
- -- do compile
- dependinfo.files = {}
- assert(compinst:compile(sourcefile, objectfile, {dependinfo = dependinfo, compflags = flags}))
-
- -- update files and values to the dependent file
- dependinfo.values = depvalues
- table.join2(dependinfo.files, sourcefile)
- depend.save(dependinfo, dependfile)
- end
-end
-
--- build interface module file
-function _build_interfacemodulefile(target, sourcefile, opt)
- local objectfile = opt.objectfile
- local dependfile = opt.dependfile
- local compinst = compiler.load("cxx", {target = target})
- local compflags = compinst:compflags({target = target})
- local dependinfo = option.get("rebuild") and {} or (depend.load(dependfile) or {})
-
- -- need build this object?
- local dryrun = option.get("dry-run")
- local depvalues = {compinst:program(), compflags}
- local lastmtime = os.isfile(objectfile) and os.mtime(dependfile) or 0
- if not dryrun and not depend.is_changed(dependinfo, {lastmtime = lastmtime, values = depvalues}) then
- return
- end
-
- -- init flags
- local requiresflags = opt.requiresflags
- local interfaceflag = opt.interfaceflag
- local ifcoutputflag = opt.ifcoutputflag
- local bmifile = opt.bmifile
- local flags = table.join("-TP", requiresflags or {}, interfaceflag, ifcoutputflag, bmifile, compflags)
-
- -- trace
- progress.show(opt.progress, "${color.build.object}generating.cxx.module.bmi %s", opt.name)
+ progress.show(opt.progress, "${color.build.object}compiling.module.$(mode) %s", opt.name)
vprint(compinst:compcmd(sourcefile, objectfile, {compflags = flags, rawargs = true}))
if not dryrun then
@@ -217,7 +176,7 @@ function generate_dependencies(target, sourcebatch, opt)
local dependfile = target:dependfile(sourcefile)
depend.on_changed(function ()
if opt.progress then
- progress.show(opt.progress, "${color.build.object}generating.cxx.module.deps %s", sourcefile)
+ progress.show(opt.progress, "${color.build.object}generating.module.deps %s", sourcefile)
end
local outputdir = path.join(cachedir, path.directory(path.relative(sourcefile, projectdir)))
if not os.isdir(outputdir) then
@@ -276,7 +235,7 @@ function generate_headerunit_for_batchjob(target, name, flags, objectfile, index
if not common.memcache():get2(name, "generating") then
local common_flags = {"-TP", "-c"}
common.memcache():set2(name, "generating", true)
- progress.show((index * 100) / total, "${color.build.object}generating.cxx.headerunit.bmi %s", name)
+ progress.show((index * 100) / total, "${color.build.object}compiling.headerunit.$(mode) %s", name)
_compile(target, table.join(common_flags, flags))
_add_objectfile_to_link_arguments(target, objectfile)
end
@@ -287,7 +246,7 @@ function generate_headerunit_for_batchcmds(target, name, flags, objectfile, batc
local compinst = target:compiler("cxx")
local msvc = target:toolchain("msvc")
local common_flags = {"-TP", "-c"}
- batchcmds:show_progress(opt.progress, "${color.build.object}generating.cxx.headerunit.bmi %s", name)
+ batchcmds:show_progress(opt.progress, "${color.build.object}compiling.headerunit.$(mode) %s", name)
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), common_flags, flags), {envs = msvc:runenvs()})
_add_objectfile_to_link_arguments(target, objectfile)
end
@@ -508,14 +467,15 @@ function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, op
requiresflags = get_requiresflags(target, module.requires, {expand = true})
end
- _build_interfacemodulefile(target, provide.sourcefile, {
+ local flags = {ifcoutputflag, bmifile}
+ table.join2(flags, requiresflags or {})
+ table.join2(flags, provide.interface and interfaceflag or {})
+
+ _build_modulefile(target, provide.sourcefile, {
objectfile = objectfile,
dependfile = target:dependfile(bmifile),
name = name,
- bmifile = bmifile,
- requiresflags = requiresflags,
- interfaceflag = interfaceflag,
- ifcoutputflag = ifcoutputflag,
+ flags = flags,
progress = (index * 100) / total})
_add_module_to_mapper(target, referenceflag, name, name, objectfile, bmifile, requiresflags)
@@ -541,7 +501,8 @@ function build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, op
_build_modulefile(target, module.cppfile, {
objectfile = objectfile,
dependfile = target:dependfile(objectfile),
- requiresflags = requiresflags,
+ name = module.cppfile,
+ flags = requiresflags or {},
progress = (index * 100) / total})
target:add("objectfiles", objectfile)
elseif requiresflags then
@@ -597,7 +558,7 @@ function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, op
ifcoutputflag,
path(bmifile),
path(provide.sourcefile)}
- batchcmds:show_progress(opt.progress, "${color.build.object}generating.cxx.module.bmi %s", name)
+ batchcmds:show_progress(opt.progress, "${color.build.object}compiling.module.$(mode) %s", name)
batchcmds:mkdir(path.directory(objectfile))
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), common_flags, requiresflags or {}, flags), {envs = msvc:runenvs()})
batchcmds:add_depfiles(provide.sourcefile)
@@ -614,7 +575,7 @@ function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, op
local flags = {"-c",
path(objectfile, function (p) return "-Fo" .. p end),
path(module.cppfile)}
- batchcmds:show_progress(opt.progress, "${color.build.object}build.cxx.module %s", module.cppfile)
+ batchcmds:show_progress(opt.progress, "${color.build.object}compiling.module.$(mode) %s", module.cppfile)
batchcmds:mkdir(path.directory(objectfile))
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), requiresflags or {}, flags), {envs = msvc:runenvs()})
batchcmds:add_depfiles(module.cppfile)