diff options
| author | ruki <[email protected]> | 2021-10-16 00:57:59 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2021-10-16 00:57:59 +0800 |
| commit | 934befffcc389d3bd9497e5de1d19407466a28c5 (patch) | |
| tree | 5a5ea3fd4b79516d4d4a22b67454a0707f206561 | |
| parent | 386f926b5c2651db23afdd59ecb8591382b3598f (diff) | |
build module batch jobs
| -rw-r--r-- | xmake/modules/private/async/jobpool.lua | 15 | ||||
| -rw-r--r-- | xmake/rules/c++/modules/build_modules/clang.lua | 24 | ||||
| -rw-r--r-- | xmake/rules/c++/modules/build_modules/gcc.lua | 26 | ||||
| -rw-r--r-- | xmake/rules/c++/modules/build_modules/module_parser.lua | 18 | ||||
| -rw-r--r-- | xmake/rules/c++/modules/build_modules/msvc.lua | 26 |
5 files changed, 94 insertions, 15 deletions
diff --git a/xmake/modules/private/async/jobpool.lua b/xmake/modules/private/async/jobpool.lua index 299700534..f7eef0c1b 100644 --- a/xmake/modules/private/async/jobpool.lua +++ b/xmake/modules/private/async/jobpool.lua @@ -35,8 +35,23 @@ function jobpool:rootjob() return self._rootjob end +-- new run job +-- +-- e.g. +-- local job = jobpool:newjob("xxx", function (index, total) end) +-- jobpool:add(job, rootjob1) +-- jobpool:add(job, rootjob2) +-- jobpool:add(job, rootjob3) +-- +function jobpool:newjob(name, run) + return {name = name, run = run} +end + -- add run job to the given job node -- +-- e.g. +-- local job = jobpool:addjob("xxx", function (index, total) end, {rootjob = rootjob}) +-- -- @param name the job name -- @param run the run command/script -- @param opt the options (rootjob) diff --git a/xmake/rules/c++/modules/build_modules/clang.lua b/xmake/rules/c++/modules/build_modules/clang.lua index 7037c0767..06b5aa1db 100644 --- a/xmake/rules/c++/modules/build_modules/clang.lua +++ b/xmake/rules/c++/modules/build_modules/clang.lua @@ -21,6 +21,7 @@ -- imports import("core.tool.compiler") import("private.action.build.object", {alias = "objectbuilder"}) +import("module_parser") -- build module files function build_with_batchjobs(target, batchjobs, sourcebatch, opt) @@ -51,13 +52,19 @@ function build_with_batchjobs(target, batchjobs, sourcebatch, opt) table.insert(modulefiles, modulefile) end + -- load moduledeps + local moduledeps = module_parser.load(target, sourcebatch, opt) + + -- build moduledeps + local moduledeps_files = module_parser.build(moduledeps) + -- compile module files to object files - local rootjob = opt.rootjob local count = 0 local sourcefiles_total = #sourcebatch.sourcefiles for i = 1, sourcefiles_total do local sourcefile = sourcebatch.sourcefiles[i] - batchjobs:addjob(sourcefile, function (index, total) + local moduledep = assert(moduledeps_files[sourcefile], "moduledep(%s) not found!", sourcefile) + moduledep.job = batchjobs:newjob(sourcefile, function (index, total) -- compile module files to *.pcm local opt2 = table.join(opt, {configs = {force = {cxxflags = {modulesflag, @@ -88,8 +95,19 @@ function build_with_batchjobs(target, batchjobs, sourcebatch, opt) end end - end, {rootjob = rootjob}) + end) end + -- build batchjobs + local rootjob = opt.rootjob + for _, moduledep in pairs(moduledeps) do + if moduledep.parents then + for _, parent in ipairs(moduledep.parents) do + batchjobs:add(moduledep.job, parent.job) + end + else + batchjobs:add(moduledep.job, rootjob) + end + end end diff --git a/xmake/rules/c++/modules/build_modules/gcc.lua b/xmake/rules/c++/modules/build_modules/gcc.lua index 1fb6b5a10..1264f29c2 100644 --- a/xmake/rules/c++/modules/build_modules/gcc.lua +++ b/xmake/rules/c++/modules/build_modules/gcc.lua @@ -44,25 +44,39 @@ function build_with_batchjobs(target, batchjobs, sourcebatch, opt) table.insert(sourcebatch.dependfiles, target:dependfile(objectfile)) end - -- TODO load moduledeps - --local moduledeps = module_parser.load(target, sourcebatch, opt) - --print(moduledeps) + -- load moduledeps + local moduledeps = module_parser.load(target, sourcebatch, opt) + + -- build moduledeps + local moduledeps_files = module_parser.build(moduledeps) -- compile module files to object files - local rootjob = opt.rootjob for i = 1, #sourcebatch.sourcefiles do local sourcefile = sourcebatch.sourcefiles[i] - batchjobs:addjob(sourcefile, function (index, total) + local moduledep = assert(moduledeps_files[sourcefile], "moduledep(%s) not found!", sourcefile) + moduledep.job = batchjobs:newjob(sourcefile, function (index, total) local opt2 = table.join(opt, {configs = {force = {cxxflags = {"-x c++"}}}}) opt2.progress = (index * 100) / total opt2.objectfile = sourcebatch.objectfiles[i] opt2.dependfile = sourcebatch.dependfiles[i] opt2.sourcekind = assert(sourcebatch.sourcekind, "%s: sourcekind not found!", sourcefile) objectbuilder.build_object(target, sourcefile, opt2) - end, {rootjob = rootjob}) + end) end -- add module flags target:add("cxxflags", modulesflag) + + -- build batchjobs + local rootjob = opt.rootjob + for _, moduledep in pairs(moduledeps) do + if moduledep.parents then + for _, parent in ipairs(moduledep.parents) do + batchjobs:add(moduledep.job, parent.job) + end + else + batchjobs:add(moduledep.job, rootjob) + end + end end diff --git a/xmake/rules/c++/modules/build_modules/module_parser.lua b/xmake/rules/c++/modules/build_modules/module_parser.lua index 5ac4e42e9..17e0f4d24 100644 --- a/xmake/rules/c++/modules/build_modules/module_parser.lua +++ b/xmake/rules/c++/modules/build_modules/module_parser.lua @@ -94,3 +94,21 @@ function load(target, sourcebatch, opt) end return moduledeps end + +-- build module deps +function build(moduledeps) + local moduledeps_files = {} + for _, moduledep in pairs(moduledeps) do + if moduledep.deps then + for _, depname in ipairs(moduledep.deps) do + local dep = moduledeps[depname] + if dep then + dep.parents = dep.parents or {} + table.insert(dep.parents, moduledep) + end + end + end + moduledeps_files[moduledep.file] = moduledep + end + return moduledeps_files +end diff --git a/xmake/rules/c++/modules/build_modules/msvc.lua b/xmake/rules/c++/modules/build_modules/msvc.lua index e40975557..831b5cd88 100644 --- a/xmake/rules/c++/modules/build_modules/msvc.lua +++ b/xmake/rules/c++/modules/build_modules/msvc.lua @@ -80,17 +80,19 @@ function build_with_batchjobs(target, batchjobs, sourcebatch, opt) table.insert(sourcebatch.dependfiles, dependfile) end - -- TODO load moduledeps - --local moduledeps = module_parser.load(target, sourcebatch, opt) - --print(moduledeps) + -- load moduledeps + local moduledeps = module_parser.load(target, sourcebatch, opt) + + -- build moduledeps + local moduledeps_files = module_parser.build(moduledeps) -- compile module files to object files - local rootjob = opt.rootjob local count = 0 local sourcefiles_total = #sourcebatch.sourcefiles for i = 1, sourcefiles_total do local sourcefile = sourcebatch.sourcefiles[i] - batchjobs:addjob(sourcefile, function (index, total) + local moduledep = assert(moduledeps_files[sourcefile], "moduledep(%s) not found!", sourcefile) + moduledep.job = batchjobs:newjob(sourcefile, function (index, total) local opt2 = table.join(opt, {configs = {force = {cxxflags = {interfaceflag, outputflag .. " " .. os.args(modulefiles[i]), "/TP"}}}}) opt2.progress = (index * 100) / total @@ -106,7 +108,7 @@ function build_with_batchjobs(target, batchjobs, sourcebatch, opt) target:add("cxxflags", referenceflag .. " " .. os.args(modulefile)) end end - end, {rootjob = rootjob}) + end) end -- add module flags @@ -114,5 +116,17 @@ function build_with_batchjobs(target, batchjobs, sourcebatch, opt) if cachedir then target:add("cxxflags", "/ifcSearchDir " .. os.args(cachedir)) end + + -- build batchjobs + local rootjob = opt.rootjob + for _, moduledep in pairs(moduledeps) do + if moduledep.parents then + for _, parent in ipairs(moduledep.parents) do + batchjobs:add(moduledep.job, parent.job) + end + else + batchjobs:add(moduledep.job, rootjob) + end + end end |
