summaryrefslogtreecommitdiff
path: root/xmake/rules/c++/modules/modules_support
diff options
context:
space:
mode:
authorruki <[email protected]>2022-08-08 22:40:44 +0800
committerruki <[email protected]>2022-08-08 22:40:44 +0800
commit1fb045a19472a8d04d24cb41c49a3bf75b2767d2 (patch)
treebd52399f33cb7c2434b0112d83864a420528111a /xmake/rules/c++/modules/modules_support
parenteac8fac2b08d6d2d16b7b9fe091e5594d091027d (diff)
add batchjobs for gcc
Diffstat (limited to 'xmake/rules/c++/modules/modules_support')
-rw-r--r--xmake/rules/c++/modules/modules_support/common.lua32
-rw-r--r--xmake/rules/c++/modules/modules_support/gcc.lua105
2 files changed, 104 insertions, 33 deletions
diff --git a/xmake/rules/c++/modules/modules_support/common.lua b/xmake/rules/c++/modules/modules_support/common.lua
index 34d014238..e9ef0fb62 100644
--- a/xmake/rules/c++/modules/modules_support/common.lua
+++ b/xmake/rules/c++/modules/modules_support/common.lua
@@ -411,20 +411,24 @@ function fallback_generate_dependencies(target, jsonfile, sourcefile)
io.writefile(jsonfile, jsondata)
end
--- generate dependencies
-function generate_dependencies(target, sourcebatch, opt)
- local modules = localcache():get("modules")
- local changed = modules_support(target).generate_dependencies(target, sourcebatch, opt)
- if changed or modules == nil then
- local moduleinfos = load_moduleinfos(target, sourcebatch)
- modules = parse_dependency_data(target, moduleinfos)
- localcache():set("modules", modules)
- localcache():save()
+-- get module dependencies
+function get_module_dependencies(target, sourcebatch, opt)
+ local modules = _g.modules
+ if modules == nil then
+ modules = localcache():get("modules")
+ local changed = modules_support(target).generate_dependencies(target, sourcebatch, opt)
+ if changed or modules == nil then
+ local moduleinfos = load_moduleinfos(target, sourcebatch)
+ modules = parse_dependency_data(target, moduleinfos)
+ localcache():set("modules", modules)
+ localcache():save()
+ end
+ _g.modules = modules
end
return modules
end
--- generate headerunits for batchjobs, TODO
+-- generate headerunits for batchjobs
function generate_headerunits_for_batchjobs(target, batchjobs, sourcebatch, modules, opt)
-- get headerunits info
@@ -435,11 +439,11 @@ function generate_headerunits_for_batchjobs(target, batchjobs, sourcebatch, modu
local headerunits_flags
if stl_headerunits then
headerunits_flags = headerunits_flags or {}
--- table.join2(headerunits_flags, modules_support(target).generate_stl_headerunits_for_batchjobs(target, batchjobs, stl_headerunits, opt))
+ table.join2(headerunits_flags, modules_support(target).generate_stl_headerunits_for_batchjobs(target, batchjobs, stl_headerunits, opt))
end
if headerunits then
headerunits_flags = headerunits_flags or {}
--- table.join2(headerunits_flags, modules_support(target).generate_user_headerunits_for_batchjobs(target, batchjobs, headerunits, opt))
+ table.join2(headerunits_flags, modules_support(target).generate_user_headerunits_for_batchjobs(target, batchjobs, headerunits, opt))
end
return headerunits_flags
end
@@ -463,7 +467,7 @@ function generate_headerunits_for_batchcmds(target, batchcmds, sourcebatch, modu
end
end
--- build modules for batchjobs, TODO
+-- build modules for batchjobs
function build_modules_for_batchjobs(target, batchjobs, sourcebatch, modules, opt)
local objectfiles = sort_modules_by_dependencies(sourcebatch.objectfiles, modules)
-- modules_support(target).build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, opt)
@@ -484,4 +488,4 @@ function append_headerunits_objectfiles(target)
elseif target:is_shared() == "shared" then
target:add("shflags", cache, {force = true})
end
-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 99045cf54..663e4ea07 100644
--- a/xmake/rules/c++/modules/modules_support/gcc.lua
+++ b/xmake/rules/c++/modules/modules_support/gcc.lua
@@ -131,15 +131,15 @@ function generate_dependencies(target, sourcebatch, opt)
progress.show(opt.progress, "${color.build.object}generating.cxx.module.deps %s", sourcefile)
end
- local outdir = path.translate(path.join(cachedir, path.directory(path.relative(sourcefile, projectdir))))
- if not os.isdir(outdir) then
- os.mkdir(outdir)
+ local outputdir = path.translate(path.join(cachedir, path.directory(path.relative(sourcefile, projectdir))))
+ if not os.isdir(outputdir) then
+ os.mkdir(outputdir)
end
- local jsonfile = path.translate(path.join(outdir, path.filename(sourcefile) .. ".json"))
+ local jsonfile = path.translate(path.join(outputdir, path.filename(sourcefile) .. ".json"))
if trtbdflag and depfileflag and depoutputflag then
- local ifile = path.translate(path.join(outdir, path.filename(sourcefile) .. ".i"))
- local dfile = path.translate(path.join(outdir, path.filename(sourcefile) .. ".d"))
+ local ifile = path.translate(path.join(outputdir, path.filename(sourcefile) .. ".i"))
+ local dfile = path.translate(path.join(outputdir, path.filename(sourcefile) .. ".d"))
local args = {sourcefile, "-MD", "-MT", jsonfile, "-MF", dfile, depfileflag .. jsonfile, trtbdflag, depoutputfile .. target:objectfile(sourcefile), "-o", ifile}
os.vrunv(compinst:program(), table.join(compinst:compflags({target = target}), common_args, args), {envs = vcvars})
else
@@ -154,12 +154,34 @@ function generate_dependencies(target, sourcebatch, opt)
return changed
end
+-- generate target stl header units for batchjobs
+function generate_stl_headerunits_for_batchjobs(target, batchjobs, headerunits, opt)
+ local compinst = target:compiler("cxx")
+ local mapper_file = _get_module_mapper()
+ local stlcachedir = common.stlmodules_cachedir(target)
+
+ -- build headerunits
+ local projectdir = os.projectdir()
+ local depmtime = 0
+ for _, headerunit in ipairs(headerunits) do
+ local bmifile = path.join(stlcachedir, headerunit.name .. get_bmi_extension())
+ 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)
+ local args = {"-c", "-x", "c++-system-header", headerunit.name}
+ os.vrunv(compinst:program(), table.join(compinst:compflags({target = target}), args))
+ _add_module_to_mapper(mapper_file, headerunit.path, path.absolute(bmifile, projectdir))
+ end, {dependfile = target:dependfile(bmifile), files = {headerunit.path}})
+ end, {rootjob = opt.rootjob})
+ end
+ end
+end
+
-- generate target stl header units for batchcmds
function generate_stl_headerunits_for_batchcmds(target, batchcmds, headerunits, opt)
local compinst = target:compiler("cxx")
local mapper_file = _get_module_mapper()
-
- -- get cachedirs
local stlcachedir = common.stlmodules_cachedir(target)
-- build headerunits
@@ -172,21 +194,67 @@ function generate_stl_headerunits_for_batchcmds(target, batchcmds, headerunits,
batchcmds:show_progress(opt.progress, "${color.build.object}generating.cxx.headerunit.bmi %s", headerunit.name)
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), args))
end
-
batchcmds:add_depfiles(headerunit.path)
-
_add_module_to_mapper(mapper_file, headerunit.path, path.absolute(bmifile, projectdir))
depmtime = math.max(depmtime, os.mtime(bmifile))
end
batchcmds:set_depmtime(depmtime)
end
+-- generate target user header units for batchjobs
+function generate_user_headerunits_for_batchjobs(target, batchjobs, headerunits, opt)
+ local compinst = target:compiler("cxx")
+ local mapper_file = _get_module_mapper()
+ local cachedir = common.modules_cachedir(target)
+
+ -- build headerunits
+ local projectdir = os.projectdir()
+ local depmtime = 0
+ for _, headerunit in ipairs(headerunits) do
+ local bmifilename = path.basename(objectfile) .. get_bmi_extension()
+ 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)
+ local file = path.relative(headerunit.path, projectdir)
+ local objectfile = target:objectfile(file)
+ local outputdir
+ if headerunit.type == ":quote" then
+ outputdir = path.join(cachedir, path.directory(path.relative(headerunit.path, projectdir)))
+ else
+ outputdir = path.join(cachedir, path.directory(headerunit.path))
+ end
+ local objectdir = path.directory(objectfile)
+ if not os.isdir(objectdir) then
+ os.mkdir(objectdir)
+ end
+ if not os.isdir(outputdir) then
+ os.mkdir(outputdir)
+ end
+
+ -- generate headerunit
+ local args = { "-c" }
+ local headerunit_path
+ if headerunit.type == ":quote" then
+ table.join2(args, { "-I", path.directory(path.relative(headerunit.path, projectdir)), "-x", "c++-user-header", headerunit.name })
+ headerunit_path = path.join(".", path.relative(headerunit.path, projectdir))
+ elseif headerunit.type == ":angle" then
+ table.join2(args, { "-x", "c++-system-header", headerunit.name })
+ -- if path is relative then its a subtarget path
+ headerunit_path = path.is_absolute(headerunit.path) and headerunit.path or path.join(".", headerunit.path)
+ end
+ os.vrunv(compinst:program(), table.join(compinst:compflags({target = target}), args))
+ _add_module_to_mapper(mapper_file, headerunit_path, path.absolute(bmifile, projectdir))
+
+ end, {dependfile = target:dependfile(bmifile), files = {headerunit.path}})
+ end, {rootjob = opt.rootjob})
+ end
+end
+
-- generate target user header units for batchcmds
function generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits, opt)
local compinst = target:compiler("cxx")
local mapper_file = _get_module_mapper()
-
- -- get cachedirs
local cachedir = common.modules_cachedir(target)
-- build headerunits
@@ -195,17 +263,16 @@ function generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits,
for _, headerunit in ipairs(headerunits) do
local file = path.relative(headerunit.path, projectdir)
local objectfile = target:objectfile(file)
-
- local outdir
+ local outputdir
if headerunit.type == ":quote" then
- outdir = path.join(cachedir, path.directory(path.relative(headerunit.path, projectdir)))
+ outputdir = path.join(cachedir, path.directory(path.relative(headerunit.path, projectdir)))
else
- outdir = path.join(cachedir, path.directory(headerunit.path))
+ outputdir = path.join(cachedir, path.directory(headerunit.path))
end
- batchcmds:mkdir(outdir)
+ batchcmds:mkdir(outputdir)
local bmifilename = path.basename(objectfile) .. get_bmi_extension()
- local bmifile = (outdir and path.join(outdir, bmifilename) or bmifilename)
+ local bmifile = (outputdir and path.join(outputdir, bmifilename) or bmifilename)
batchcmds:mkdir(path.directory(objectfile))
local args = { "-c" }
@@ -336,4 +403,4 @@ function get_depoutputflag(target)
_g.depoutputflag = depoutputflag or false
end
return depoutputflag or nil
-end \ No newline at end of file
+end