summaryrefslogtreecommitdiff
path: root/xmake/rules/c++/modules/msvc/builder.lua
diff options
context:
space:
mode:
authorArthur LAURENT <[email protected]>2025-05-05 17:13:25 +0200
committerArthur LAURENT <[email protected]>2025-05-09 15:56:33 +0200
commit5d6d36e0db45d90dfa7f0cdf2937d989de683833 (patch)
tree2d1fbb82ee8d38921af1863fd3ce968f7c5cea75 /xmake/rules/c++/modules/msvc/builder.lua
parentd88bd9c5ace6c64981420569fb886f7c646135c0 (diff)
(C++ module support) improve jobgraph support
Diffstat (limited to 'xmake/rules/c++/modules/msvc/builder.lua')
-rw-r--r--xmake/rules/c++/modules/msvc/builder.lua472
1 files changed, 136 insertions, 336 deletions
diff --git a/xmake/rules/c++/modules/msvc/builder.lua b/xmake/rules/c++/modules/msvc/builder.lua
index ceb3aa4bc..eca44fb2d 100644
--- a/xmake/rules/c++/modules/msvc/builder.lua
+++ b/xmake/rules/c++/modules/msvc/builder.lua
@@ -29,78 +29,62 @@ import("core.project.config")
import("core.project.depend")
import("private.tools.vstool")
import("support")
+import(".mapper")
import(".builder", {inherit = true})
-- get flags for building a module
-function _make_modulebuildflags(target, provide, bmifile, opt)
+function _make_modulebuildflags(target, module, opt)
local ifcoutputflag = support.get_ifcoutputflag(target)
local ifconlyflag = support.get_ifconlyflag(target)
local interfaceflag = support.get_interfaceflag(target)
local internalpartitionflag = support.get_internalpartitionflag(target)
- local ifconly = (not opt.build_objectfile and ifconlyflag)
+
+ local bmionly = opt and opt.bmionly
local flags
- if provide then -- named module
- flags = table.join({"-TP", ifcoutputflag, path(bmifile), provide.interface and interfaceflag or internalpartitionflag}, ifconly or {})
+ if module.interface or module.implementation then -- named module
+ flags = table.join("-TP", module.interface and interfaceflag or internalpartitionflag, bmionly and ifconlyflag or {}, ifcoutputflag, path(module.bmifile))
else
flags = {"-TP"}
end
return flags
end
-function _compile_one_step(target, bmifile, sourcefile, objectfile, provide, opt)
- local ifcoutputflag = support.get_ifcoutputflag(target)
- local interfaceflag = support.get_interfaceflag(target)
- local internalpartitionflag = support.get_internalpartitionflag(target)
+
+function _compile_one_step(target, module, opt)
-- get flags
- local flags = {"-TP"}
- if provide then
- table.join2(flags, ifcoutputflag, path(bmifile), provide.interface and interfaceflag or internalpartitionflag)
- end
+ local flags = _make_modulebuildflags(target, module)
if opt and opt.batchcmds then
- _batchcmds_compile(opt.batchcmds, target, flags, sourcefile, objectfile)
+ _batchcmds_compile(opt.batchcmds, target, flags, module.sourcefile, module.objectfile)
else
- _compile(target, flags, sourcefile, objectfile)
+ _compile(target, flags, module.sourcefile, module.objectfile)
end
end
-function _compile_bmi_step(target, bmifile, sourcefile, objectfile, provide, opt)
- local ifcoutputflag = support.get_ifcoutputflag(target)
- local interfaceflag = support.get_interfaceflag(target)
+function _compile_bmi_step(target, module, opt)
local ifconlyflag = support.get_ifconlyflag(target)
-
if not ifconlyflag then
- _compile_one_step(target, bmifile, sourcefile, objectfile, provide, opt)
+ _compile_one_step(target, module, opt)
else
- local flags = {"-TP", ifcoutputflag, path(bmifile), interfaceflag, ifconlyflag}
+ local flags = _make_modulebuildflags(target, module, {bmionly = true})
if opt and opt.batchcmds then
- _batchcmds_compile(opt.batchcmds, target, flags, sourcefile, bmifile)
+ _batchcmds_compile(opt.batchcmds, target, flags, module.sourcefile, module.objectfile)
else
- _compile(target, flags, sourcefile, bmifile)
+ _compile(target, flags, module.sourcefile, module.objectfile)
end
end
end
-function _compile_objectfile_step(target, bmifile, sourcefile, objectfile, provide, opt)
- local ifconlyflag = support.get_ifconlyflag(target)
- local interfaceflag = support.get_interfaceflag(target)
- local internalpartitionflag = support.get_internalpartitionflag(target)
-
- local flags = {"-TP", (provide and provide.interface) and interfaceflag or internalpartitionflag}
- if not ifconlyflag then
- _compile_one_step(target, bmifile, sourcefile, objectfile, provide, opt)
+function _compile_objectfile_step(target, module, opt)
+ local flags = _make_modulebuildflags(target, module)
+ if opt and opt.batchcmds then
+ _batchcmds_compile(opt.batchcmds, target, flags, module.sourcefile, module.objectfile)
else
- if opt and opt.batchcmds then
- _batchcmds_compile(opt.batchcmds, target, flags, sourcefile, objectfile)
- else
- _compile(target, flags, sourcefile, objectfile)
- end
+ _compile(target, flags, module.sourcefile, module.objectfile)
end
end
-
-- get flags for building a headerunit
-function _make_headerunitflags(target, headerunit, bmifile)
-
+function _make_headerunitflags(target, headerunit, headertype)
-- get flags
local exportheaderflag = support.get_exportheaderflag(target)
local headernameflag = support.get_headernameflag(target)
@@ -108,41 +92,34 @@ function _make_headerunitflags(target, headerunit, bmifile)
local ifconlyflag = support.get_ifconlyflag(target)
assert(headernameflag and exportheaderflag, "compiler(msvc): does not support c++ header units!")
- local local_directory = (headerunit.type == ":quote") and {"-I" .. path.directory(headerunit.path)} or {}
- local flags = table.join(local_directory, {"-TP",
- exportheaderflag,
- headernameflag .. headerunit.type,
- headerunit.type == ":angle" and headerunit.name or headerunit.path,
- ifcoutputflag,
- bmifile}, ifconlyflag or {})
+ local flags = {"-TP",
+ exportheaderflag,
+ ifcoutputflag,
+ headerunit.bmifile,
+ ifconlyflag or {},
+ headernameflag .. headertype} -- keep it at last flag
return flags
end
-- do compile
-function _compile(target, flags, sourcefile, outputfile, headerunit)
-
+function _compile(target, flags, sourcefile, outputfile)
local dryrun = option.get("dry-run")
local compinst = target:compiler("cxx")
- local compflags = compinst:compflags({sourcefile = sourcefile, target = target})
- local flags = table.join(compflags or {}, flags)
+ local compflags = compinst:compflags({sourcefile = sourcefile, target = target, sourcekind = "cxx"})
+ flags = table.join(compflags or {}, flags or {})
-- trace
if option.get("verbose") then
- if headerunit then
- print(os.args(compinst:program(), flags))
+ if not outputfile then
+ print(os.args(table.join(compinst:program(), flags, sourcefile)))
else
- print(compinst:compcmd(sourcefile, outputfile, {target = target, compflags = flags, rawargs = true}))
+ print(compinst:compcmd(sourcefile, outputfile, {target = target, compflags = flags, sourcekind = "cxx", rawargs = true}))
end
end
-- do compile
if not dryrun then
- if headerunit then
- local msvc = target:toolchain("msvc")
- os.vrunv(compinst:program(), flags, {envs = msvc:runenvs()})
- else
- assert(compinst:compile(sourcefile, outputfile, {target = target, compflags = flags}))
- end
+ assert(compinst:compile(sourcefile, outputfile or target:objectfile(sourcefile), {target = target, compflags = flags}))
end
end
@@ -151,9 +128,9 @@ end
function _batchcmds_compile(batchcmds, target, flags, sourcefile, outputfile)
opt = opt or {}
local compinst = target:compiler("cxx")
- local compflags = compinst:compflags({sourcefile = sourcefile, target = target})
- flags = table.join(compflags or {}, flags)
- batchcmds:compile(sourcefile, outputfile, {sourcekind = "cxx", compflags = flags})
+ local compflags = compinst:compflags({sourcefile = sourcefile, target = target, sourcekind = "cxx"})
+ flags = table.join("/c", compflags or {}, outputfile and "-Fo" .. outputfile or {}, flags or {}, sourcefile or {})
+ batchcmds:compilev(flags, {compiler = compinst, sourcekind = "cxx"})
end
-- get module requires flags
@@ -161,41 +138,40 @@ end
-- /reference Foo=build/.gens/Foo/rules/modules/cache/Foo.ifc
-- /headerUnit:angle glm/mat4x4.hpp=Users\arthu\AppData\Local\.xmake\packages\g\glm\0.9.9+8\91454f3ee0be416cb9c7452970a2300f\include\glm\mat4x4.hpp.ifc
--
-function _get_requiresflags(target, module, opt)
+function _get_requiresflags(target, module)
local referenceflag = support.get_referenceflag(target)
local headerunitflag = support.get_headerunitflag(target)
- local name = module.name
+ local name = module.name or module.sourcefile
local cachekey = target:fullname() .. name
local requires, requires_changed = is_dependencies_changed(target, module)
local requiresflags = support.memcache():get2(cachekey, "requiresflags")
if not requiresflags or requires_changed then
local deps_flags = {}
- for required in requires:orderitems() do
- local dep_module = get_from_target_mapper(target, required)
+ for required, dep in pairs(module.deps) do
+ if dep.headerunit then
+ required = required .. dep.key
+ end
+ local dep_module = mapper.get(target, required)
assert(dep_module, "module dependency %s required for %s not found <%s>", required, name, target:fullname())
- local mapflag
- local bmifile = dep_module.bmi
-- aliased headerunit
- if dep_module.aliasof then
- local aliased = get_from_target_mapper(target, dep_module.aliasof)
- bmifile = aliased.bmi
- mapflag = {headerunitflag .. aliased.headerunit.type, required .. "=" .. bmifile}
- -- headerunit
- elseif dep_module.headerunit then
- mapflag = {headerunitflag .. dep_module.headerunit.type, required .. "=" .. bmifile}
- -- named module
+ local mapflag
+ if dep_module.headerunit then
+ local type = dep_module.method == "include-angle" and ":angle" or ":quote"
+ mapflag = {headerunitflag .. type}
+ table.insert(deps_flags, {headerunitflag, dep_module.sourcefile .. "=" .. dep_module.bmifile})
else
- mapflag = {referenceflag, required .. "=" .. bmifile}
+ mapflag = {referenceflag}
end
+ table.insert(mapflag, dep_module.name .. "=" .. dep_module.bmifile)
table.insert(deps_flags, mapflag)
-- append deps
- if dep_module.opt and dep_module.opt.deps then
- local deps = _get_requiresflags(target, { name = dep_module.name or dep_module.sourcefile, bmi = bmifile, requires = dep_module.opt.deps })
+ if dep_module.deps then
+ local deps = _get_requiresflags(target, dep_module)
table.join2(deps_flags, deps)
end
end
@@ -203,6 +179,7 @@ function _get_requiresflags(target, module, opt)
-- remove duplicates
requiresflags = {}
local contains = {}
+ table.sort(deps_flags, function(a, b) return a[2] > b[2] end)
for _, map in ipairs(deps_flags) do
local name = map[2]:split("=")[1]
if name and not contains[name] then
@@ -216,297 +193,120 @@ function _get_requiresflags(target, module, opt)
return requiresflags
end
-function _append_requires_flags(target, module, name, cppfile, bmifile, opt)
- local cxxflags = {}
- local requiresflags = _get_requiresflags(target, {name = (name or cppfile), bmi = bmifile, requires = module.requires})
- for _, flag in ipairs(requiresflags) do
- -- we need to wrap flag to support flag with space
- if type(flag) == "string" and flag:find(" ", 1, true) then
- table.insert(cxxflags, {flag})
- else
- table.insert(cxxflags, flag)
- end
- end
- target:fileconfig_add(cppfile, {force = {cxxflags = cxxflags}})
+function _append_requires_flags(target, module)
+ local requiresflags = _get_requiresflags(target, module)
+ target:fileconfig_add(module.sourcefile, {force = {cxxflags = requiresflags}})
end
--- populate module map
-function populate_module_map(target, modules)
- for _, module in pairs(modules) do
- local name, provide, cppfile = support.get_provided_module(module)
- if provide then
- local bmifile = support.get_bmi_path(provide.bmi)
- add_module_to_target_mapper(target, name, cppfile, bmifile, {deps = module.requires})
+function append_requires_flags(target, built_modules)
+ -- append requires flags
+ for _, sourcefile in ipairs(built_modules) do
+ local module = mapper.get(target, sourcefile)
+ if module.deps then
+ _append_requires_flags(target, module)
end
end
end
--- get defines for a module
-function get_module_required_defines(target, sourcefile)
- local compinst = compiler.load("cxx", {target = target})
- local compflags = compinst:compflags({sourcefile = sourcefile, target = target})
- local defines
- for _, flag in ipairs(compflags) do
- if flag:startswith("-D") or flag:startswith("/D") then
- defines = defines or {}
- table.insert(defines, flag:sub(3))
- end
- end
- return defines
-end
+-- build module file for batchjobs / jobgraph
+function make_module_job(target, module, opt)
--- build module file for batchjobs
-function make_module_buildjobs(target, batchjobs, job_name, deps, opt)
- local name, provide, _ = support.get_provided_module(opt.module)
- local bmifile = provide and support.get_bmi_path(provide.bmi)
local dryrun = option.get("dry-run")
- return {
- name = job_name,
- deps = table.join(target:fullname() .. "/module/populate_module_map", deps),
- sourcefile = opt.cppfile,
- job = batchjobs:newjob(target:fullname() .. "/module/" .. (name or opt.cppfile), function(index, total, jobopt)
+ -- generate and append module mapper file
+ local build = should_build(target, module)
+ local bmi = opt and opt.bmi
+ local objectfile = opt and opt.objectfile
- local mapped_bmi
- if provide and support.memcache():get2(target:fullname() .. name, "reuse") then
- mapped_bmi = get_from_target_mapper(target, name).bmi
+ if build then
+ if not dryrun then
+ local objectdir = path.directory(module.objectfile)
+ if not os.isdir(objectdir) then
+ os.mkdir(objectdir)
end
-
- local build, dependinfo
- local dependfile = target:dependfile(bmifile or opt.objectfile)
- if provide or support.has_module_extension(opt.cppfile) then
- build, dependinfo = should_build(target, opt.cppfile, bmifile, {name = name, objectfile = opt.objectfile, requires = opt.module.requires})
-
- -- needed to detect rebuild of dependencies
- if provide and build then
- mark_build(target, name)
+ if module.bmifile then
+ local bmidir = path.directory(module.bmifile)
+ if not os.isdir(bmidir) then
+ os.mkdir(bmidir)
end
end
-
- -- append requires flags
- if opt.module.requires then
- _append_requires_flags(target, opt.module, name, opt.cppfile, bmifile, opt)
- end
-
- -- for cpp file we need to check after appendings the flags
- if build == nil then
- build, dependinfo = should_build(target, opt.cppfile, bmifile, {name = name, objectfile = opt.objectfile, requires = opt.module.requires})
- end
-
- if build then
- -- compile if it's a named module
- if provide or support.has_module_extension(opt.cppfile) then
- if not dryrun then
- local objectdir = path.directory(opt.objectfile)
- if not os.isdir(objectdir) then
- os.mkdir(objectdir)
- end
- end
-
- local fileconfig = target:fileconfig(opt.cppfile)
- local public = fileconfig and fileconfig.public
- local external = fileconfig and fileconfig.external
- local from_moduleonly = external and external.moduleonly
- local bmifile = mapped_bmi or bmifile
- if external and not from_moduleonly then
- if not mapped_bmi then
- progress.show(jobopt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.bmi.$(mode) %s", target:fullname(), name or opt.cppfile)
- _compile_bmi_step(target, bmifile, opt.cppfile, opt.objectfile, provide)
- end
- else
- progress.show(jobopt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.module.$(mode) %s", target:fullname(), name or opt.cppfile)
- _compile_one_step(target, bmifile, opt.cppfile, opt.objectfile, provide)
- end
- else
- os.tryrm(opt.objectfile) -- force rebuild for .cpp files
- end
- depend.save(dependinfo, dependfile)
- end
- end)}
-end
-
--- build module file for jobgraph
-function make_module_jobgraph(target, jobgraph, opt)
- local name, provide, _ = support.get_provided_module(opt.module)
- local bmifile = provide and support.get_bmi_path(provide.bmi)
- local dryrun = option.get("dry-run")
-
- local jobname = target:fullname() .. "/module/" .. (name or opt.cppfile)
- jobgraph:add(jobname, function(index, total, jobopt)
- local mapped_bmi
- if provide and support.memcache():get2(target:fullname() .. name, "reuse") then
- mapped_bmi = get_from_target_mapper(target, name).bmi
- end
-
- local build, dependinfo
- local dependfile = target:dependfile(bmifile or opt.objectfile)
- if provide or support.has_module_extension(opt.cppfile) then
- build, dependinfo = should_build(target, opt.cppfile, bmifile, {name = name, objectfile = opt.objectfile, requires = opt.module.requires})
-
- -- needed to detect rebuild of dependencies
- if provide and build then
- mark_build(target, name)
- end
- end
-
- -- append requires flags
- if opt.module.requires then
- _append_requires_flags(target, opt.module, name, opt.cppfile, bmifile, opt)
end
- -- for cpp file we need to check after appendings the flags
- if build == nil then
- build, dependinfo = should_build(target, opt.cppfile, bmifile, {name = name, objectfile = opt.objectfile, requires = opt.module.requires})
- end
-
- if build then
- -- compile if it's a named module
- if provide or support.has_module_extension(opt.cppfile) then
- if not dryrun then
- local objectdir = path.directory(opt.objectfile)
- if not os.isdir(objectdir) then
- os.mkdir(objectdir)
- end
- end
-
- local fileconfig = target:fileconfig(opt.cppfile)
- local public = fileconfig and fileconfig.public
- local external = fileconfig and fileconfig.external
- local from_moduleonly = external and external.moduleonly
- local bmifile = mapped_bmi or bmifile
- if external and not from_moduleonly then
- if not mapped_bmi then
- progress.show(jobopt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.bmi.$(mode) %s", target:fullname(), name or opt.cppfile)
- _compile_bmi_step(target, bmifile, opt.cppfile, opt.objectfile, provide)
- end
- else
- progress.show(jobopt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.module.$(mode) %s", target:fullname(), name or opt.cppfile)
- _compile_one_step(target, bmifile, opt.cppfile, opt.objectfile, provide)
- end
+ if bmi and objectfile then
+ progress.show(opt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.module.$(mode) %s", target:fullname(), module.name)
+ _compile_one_step(target, module)
+ elseif bmi then
+ progress.show(opt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.module.bmi.$(mode) %s", target:fullname(), module.name)
+ _compile_bmi_step(target, module)
+ else
+ if module.interface or module.implementation then
+ progress.show(opt.progress, "compiling.$(mode) %s", module.sourcefile)
+ _compile_objectfile_step(target, module)
else
- os.tryrm(opt.objectfile) -- force rebuild for .cpp files
+ os.tryrm(module.objectfile) -- force rebuild for .cpp files
end
- depend.save(dependinfo, dependfile)
end
- end)
+ end
end
-- build module file for batchcmds
-function make_module_buildcmds(target, batchcmds, opt)
-
- local name, provide, _ = support.get_provided_module(opt.module)
- local bmifile = provide and support.get_bmi_path(provide.bmi)
+function make_module_buildcmds(target, batchcmds, module, opt)
- local mapped_bmi
- if provide and support.memcache():get2(target:fullname() .. name, "reuse") then
- mapped_bmi = get_from_target_mapper(target, name).bmi
- end
+ -- generate and append module mapper file
+ local build = should_build(target, module)
+ local bmi = opt and opt.bmi
+ local objectfile = opt and opt.objectfile
- -- append requires flags
- if opt.module.requires then
- _append_requires_flags(target, opt.module, name, opt.cppfile, bmifile, opt)
- end
-
- -- compile if it's a named module
- if provide or support.has_module_extension(opt.cppfile) then
- batchcmds:mkdir(path.directory(opt.objectfile))
-
- local fileconfig = target:fileconfig(opt.cppfile)
- local public = fileconfig and fileconfig.public
- local external = fileconfig and fileconfig.external
- local from_moduleonly = external and external.moduleonly
- local bmifile = mapped_bmi or bmifile
- if external and not from_moduleonly then
- if not mapped_bmi then
- batchcmds:show_progress(opt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.bmi.$(mode) %s", target:fullname(), name or opt.cppfile)
- _compile_bmi_step(target, bmifile, opt.cppfile, provide, {batchcmds = batchcmds})
- end
+ if build then
+ local objectdir = path.directory(module.objectfile)
+ batchcmds:mkdir(objectdir)
+ if module.bmifile then
+ local bmidir = path.directory(module.bmifile)
+ batchcmds:mkdir(bmidir)
+ end
+ if bmi and objectfile then
+ batchcmds:show_progress(opt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.module.$(mode) %s", target:fullname(), module.name)
+ _compile_one_step(target, module, {batchcmds = batchcmds})
+ elseif bmi then
+ batchcmds:show_progress(opt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.module.bmi.$(mode) %s", target:fullname(), module.name)
+ _compile_bmi_step(target, module, {batchcmds = batchcmds})
else
- batchcmds:show_progress(opt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.module.$(mode) %s", target:fullname(), name or opt.cppfile)
- _compile_one_step(target, bmifile, opt.cppfile, opt.objectfile, provide, {batchcmds = batchcmds})
+ if module.interface or module.implementation then
+ batchcmds:show_progress(opt.progress, "compiling.$(mode) %s", module.sourcefile)
+ _compile_objectfile_step(target, module, {batchcmds = batchcmds})
+ else
+ batchcmds:rm(module.objectfile) -- force rebuild for .cpp files
+ end
end
- else
- batchcmds:rm(opt.objectfile) -- force rebuild for .cpp files
- end
- batchcmds:add_depfiles(opt.cppfile)
- return os.mtime(opt.objectfile)
-end
-
--- build headerunit file for batchjobs
-function make_headerunit_buildjobs(target, job_name, batchjobs, headerunit, bmifile, outputdir, opt)
- local already_exists = add_headerunit_to_target_mapper(target, headerunit, bmifile)
- if not already_exists then
- return {
- name = job_name,
- sourcefile = headerunit.path,
- job = batchjobs:newjob(job_name, function(index, total, jobopt)
- if not os.isdir(outputdir) then
- os.mkdir(outputdir)
- end
-
- local compinst = compiler.load("cxx", {target = target})
- local compflags = compinst:compflags({sourcefile = headerunit.path, target = target})
-
- local dependfile = target:dependfile(bmifile)
- local dependinfo = depend.load(dependfile) or {}
- dependinfo.files = {}
- local depvalues = {compinst:program(), compflags}
-
- local name = headerunit.unique and headerunit.name or headerunit.path
-
- if opt.build then
- progress.show(jobopt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.headerunit.$(mode) %s", target:fullname(), headerunit.name)
- _compile(target, _make_headerunitflags(target, headerunit, bmifile), name, target:objectfile(headerunit.path), true)
- end
-
- table.insert(dependinfo.files, headerunit.path)
- dependinfo.values = depvalues
- depend.save(dependinfo, dependfile)
- end)}
end
+ batchcmds:add_depfiles(module.sourcefile)
+ return os.mtime(module.objectfile)
end
--- build headerunit file for jobgraph
-function make_headerunit_jobgraph(target, job_name, jobgraph, headerunit, bmifile, outputdir, opt)
- local already_exists = add_headerunit_to_target_mapper(target, headerunit, bmifile)
- if not already_exists then
- jobgraph:add(job_name, function(index, total, jobopt)
- if not os.isdir(outputdir) then
- os.mkdir(outputdir)
- end
-
- local compinst = compiler.load("cxx", {target = target})
- local compflags = compinst:compflags({sourcefile = headerunit.path, target = target})
-
- local dependfile = target:dependfile(bmifile)
- local dependinfo = depend.load(dependfile) or {}
- dependinfo.files = {}
- local depvalues = {compinst:program(), compflags}
-
- local name = headerunit.unique and headerunit.name or headerunit.path
-
- if opt.build then
- progress.show(jobopt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.headerunit.$(mode) %s", target:fullname(), headerunit.name)
- _compile(target, _make_headerunitflags(target, headerunit, bmifile), name, target:objectfile(headerunit.path), true)
- end
-
- table.insert(dependinfo.files, headerunit.path)
- dependinfo.values = depvalues
- depend.save(dependinfo, dependfile)
- end)
+-- build headerunit file for batchjobs / jobgraph
+function make_headerunit_job(target, headerunit, opt)
+ local build = should_build(target, headerunit)
+ if build then
+ local name = headerunit.unique and path.filename(headerunit.name) or headerunit.name
+ local headertype = (headerunit.method == "include-angle") and ":angle" or ":quote"
+ progress.show(opt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.headerunit.$(mode) %s", target:fullname(), name)
+ _compile(target, _make_headerunitflags(target, headerunit, headertype), (headertype == ":angle") and headerunit.name or headerunit.sourcefile)
end
end
-- build headerunit file for batchcmds
-function make_headerunit_buildcmds(target, batchcmds, headerunit, bmifile, outputdir, opt)
- batchcmds:mkdir(outputdir)
- add_headerunit_to_target_mapper(target, headerunit, bmifile)
+function make_headerunit_buildcmds(target, batchcmds, headerunit, opt)
+ local compinst = compiler.load("cxx", {target = target})
+ local compflags = compinst:compflags({sourcefile = headerunit.sourcefile, target = target, sourcekind = "cxx"})
+ local depvalues = {compinst:program(), compflags}
- if opt.build then
- local name = headerunit.unique and headerunit.name or headerunit.path
+ local build = should_build(target, headerunit)
+ if build then
+ local name = headerunit.unique and path.filename(headerunit.name) or headerunit.name
+ local headertype = (headerunit.method == "include-angle") and ":angle" or ":quote"
batchcmds:show_progress(opt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.headerunit.$(mode) %s", target:fullname(), name)
- _batchcmds_compile(batchcmds, target, _make_headerunitflags(target, headerunit, bmifile), target:objectfile(headerunit.path))
+ _batchcmds_compile(batchcmds, target, _make_headerunitflags(target, headerunit, headertype), (headertype == ":angle") and headerunit.name or headerunit.sourcefile)
+ batchcmds:add_depfiles(headerunit.sourcefile)
end
- batchcmds:add_depfiles(headerunit.path)
- return os.mtime(bmifile)
+ batchcmds:add_depvalues(depvalues)
end