summaryrefslogtreecommitdiff
path: root/xmake/rules/c++/modules
diff options
context:
space:
mode:
authorArthur LAURENT <[email protected]>2024-02-03 19:45:17 +0100
committerArthur LAURENT <[email protected]>2024-02-03 20:20:53 +0100
commita393c0a2d41c22514769ec270818a599c2b9008f (patch)
treeb6efddc99f18f59645e6225d1cc1f717dc05a06b /xmake/rules/c++/modules
parent48be7cd276d22c5cc16058fe328741c7ebd471d1 (diff)
fix recompilation of .cpp files
Diffstat (limited to 'xmake/rules/c++/modules')
-rw-r--r--xmake/rules/c++/modules/modules_support/builder.lua37
-rw-r--r--xmake/rules/c++/modules/modules_support/clang/builder.lua74
-rw-r--r--xmake/rules/c++/modules/modules_support/gcc/builder.lua24
-rw-r--r--xmake/rules/c++/modules/modules_support/msvc/builder.lua52
4 files changed, 120 insertions, 67 deletions
diff --git a/xmake/rules/c++/modules/modules_support/builder.lua b/xmake/rules/c++/modules/modules_support/builder.lua
index 741009af5..a4bbc9c7f 100644
--- a/xmake/rules/c++/modules/modules_support/builder.lua
+++ b/xmake/rules/c++/modules/modules_support/builder.lua
@@ -47,24 +47,17 @@ function _build_modules(target, sourcebatch, modules, opt)
local fileconfig = target:fileconfig(cppfile)
local bmifile = provide and compiler_support.get_bmi_path(provide.bmi)
- local build = _should_build(target, cppfile, bmifile, {objectfile = objectfile, requires = module.requires})
-
-- add objectfile if module is not from external dep
if not (fileconfig and fileconfig.external) then
target:add("objectfiles", objectfile)
end
- -- needed to detect rebuild of dependencies
- if provide and build then
- _mark_build(target, name)
- end
-
local deps = {}
for _, dep in ipairs(table.keys(module.requires or {})) do
table.insert(deps, opt.batchjobs and target:name() .. dep or dep)
end
- opt.build_module(deps, build, module, name, provide, objectfile, cppfile, fileconfig)
+ opt.build_module(deps, module, name, provide, objectfile, cppfile, fileconfig)
::CONTINUE::
end
@@ -112,23 +105,21 @@ function _should_build(target, sourcefile, bmifile, opt)
end
end
- -- or rebuild it if the file changed for headerunit and namedmodules
+ -- or rebuild it if the file changed
local objectfile = opt.objectfile
- if compiler_support.has_module_extension(sourcefile) or (opt and opt.headerunit) then
- local dryrun = option.get("dry-run")
- local compinst = compiler.load("cxx", {target = target})
- local compflags = compinst:compflags({sourcefile = sourcefile, target = target})
+ local dryrun = option.get("dry-run")
+ local compinst = compiler.load("cxx", {target = target})
+ local compflags = compinst:compflags({sourcefile = sourcefile, target = target})
- local dependfile = target:dependfile(bmifile or objectfile)
- local dependinfo = target:is_rebuilt() and {} or (depend.load(dependfile) or {})
+ local dependfile = target:dependfile(bmifile or objectfile)
+ local dependinfo = target:is_rebuilt() and {} or (depend.load(dependfile) or {})
- -- need build this object?
- local depvalues = {compinst:program(), compflags}
- local lastmtime = os.isfile(bmifile or objectfile) and os.mtime(dependfile) or 0
+ -- need build this object?
+ local depvalues = {compinst:program(), compflags}
+ local lastmtime = os.isfile(bmifile or objectfile) and os.mtime(dependfile) or 0
- if dryrun or depend.is_changed(dependinfo, {lastmtime = lastmtime, values = depvalues}) then
- return true
- end
+ if dryrun or depend.is_changed(dependinfo, {lastmtime = lastmtime, values = depvalues}) then
+ return true
end
return false
@@ -207,10 +198,10 @@ function build_modules_for_batchjobs(target, batchjobs, sourcebatch, modules, op
local modulesjobs = {}
_build_modules(target, sourcebatch, modules, table.join(opt, {
- build_module = function(deps, build, module, name, provide, objectfile, cppfile, fileconfig)
+ build_module = function(deps, module, name, provide, objectfile, cppfile, fileconfig)
local job_name = name and target:name() .. name or cppfile
- modulesjobs[job_name] = _builder(target).make_module_buildjobs(target, batchjobs, job_name, deps, {build = build, module = module, objectfile = objectfile, cppfile = cppfile})
+ modulesjobs[job_name] = _builder(target).make_module_buildjobs(target, batchjobs, job_name, deps, _should_build, _mark_build, {module = module, objectfile = objectfile, cppfile = cppfile})
if provide and fileconfig and fileconfig.public then
batchjobs:addjob(name .. "_metafile", function(index, total)
diff --git a/xmake/rules/c++/modules/modules_support/clang/builder.lua b/xmake/rules/c++/modules/modules_support/clang/builder.lua
index 86b3d1a37..8b1cdf827 100644
--- a/xmake/rules/c++/modules/modules_support/clang/builder.lua
+++ b/xmake/rules/c++/modules/modules_support/clang/builder.lua
@@ -190,7 +190,7 @@ function get_module_required_defines(target, sourcefile)
end
-- build module file for batchjobs
-function make_module_buildjobs(target, batchjobs, job_name, deps, opt)
+function make_module_buildjobs(target, batchjobs, job_name, deps, should_build, mark_build, opt)
local name, provide, _ = compiler_support.get_provided_module(opt.module)
local bmifile = provide and compiler_support.get_bmi_path(provide.bmi)
@@ -210,31 +210,42 @@ function make_module_buildjobs(target, batchjobs, job_name, deps, opt)
_append_requires_flags(target, opt.module, name, opt.cppfile, bmifile, opt)
end
+ local build = should_build(target, opt.cppfile, bmifile, {objectfile = opt.objectfile, requires = opt.module.requires})
+
+ -- needed to detect rebuild of dependencies
+ if provide and build then
+ mark_build(target, name)
+ end
+
local dependfile = target:dependfile(bmifile or opt.objectfile)
local dependinfo = depend.load(dependfile) or {}
dependinfo.files = {}
local depvalues = {compinst:program(), compflags}
- -- compile if it's a named module
- if opt.build and (provide or compiler_support.has_module_extension(opt.cppfile)) then
- progress.show((index * 100) / total, "${color.build.target}<%s> ${clear}${color.build.object}compiling.module.$(mode) %s", target:name(), name or opt.cppfile)
+ if build then
+ -- compile if it's a named module
+ if provide or compiler_support.has_module_extension(opt.cppfile) then
+ progress.show((index * 100) / total, "${color.build.target}<%s> ${clear}${color.build.object}compiling.module.$(mode) %s", target:name(), name or opt.cppfile)
- if not dryrun then
- local objectdir = path.directory(opt.objectfile)
- if not os.isdir(objectdir) then
- os.mkdir(objectdir)
+ if not dryrun then
+ local objectdir = path.directory(opt.objectfile)
+ if not os.isdir(objectdir) then
+ os.mkdir(objectdir)
+ end
end
- end
- local fileconfig = target:fileconfig(opt.cppfile)
- local external = fileconfig and fileconfig.external
+ local fileconfig = target:fileconfig(opt.cppfile)
+ local external = fileconfig and fileconfig.external
- local precompile, first_step, second_step = _make_modulebuildflags(target, provide, bmifile, {sourcefile = opt.cppfile, external = external, name = name})
+ local precompile, first_step, second_step = _make_modulebuildflags(target, provide, bmifile, {sourcefile = opt.cppfile, external = external, name = name})
- _compile(target, first_step, opt.cppfile, precompile and bmifile or opt.objectfile)
+ _compile(target, first_step, opt.cppfile, precompile and bmifile or opt.objectfile)
- if second_step then
- _compile(target, second_step, opt.cppfile, opt.objectfile, {bmifile = bmifile})
+ if second_step then
+ _compile(target, second_step, opt.cppfile, opt.objectfile, {bmifile = bmifile})
+ end
+ else
+ os.tryrm(opt.objectfile) -- force rebuild for .cpp files
end
end
@@ -245,7 +256,7 @@ function make_module_buildjobs(target, batchjobs, job_name, deps, opt)
end
-- build module file for batchcmds
-function make_module_buildcmds(target, batchcmds, opt)
+function make_module_buildcmds(target, batchcmds, should_build, mark_build, opt)
local name, provide, _ = compiler_support.get_provided_module(opt.module)
local bmifile = provide and compiler_support.get_bmi_path(provide.bmi)
@@ -255,19 +266,30 @@ function make_module_buildcmds(target, batchcmds, opt)
_append_requires_flags(target, opt.module, name, opt.cppfile, bmifile, opt)
end
- -- compile if it's a named module
- if opt.build and (provide or compiler_support.has_module_extension(opt.cppfile)) then
- batchcmds:show_progress(opt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.module.$(mode) %s", target:name(), name or opt.cppfile)
- batchcmds:mkdir(path.directory(opt.objectfile))
+ local build = should_build(target, opt.cppfile, bmifile, {objectfile = opt.objectfile, requires = opt.module.requires})
- local fileconfig = target:fileconfig(opt.cppfile)
- local external = fileconfig and fileconfig.external
+ -- needed to detect rebuild of dependencies
+ if provide and build then
+ mark_build(target, name)
+ end
+
+ if build then
+ -- compile if it's a named module
+ if provide or compiler_support.has_module_extension(opt.cppfile) then
+ batchcmds:show_progress(opt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.module.$(mode) %s", target:name(), name or opt.cppfile)
+ batchcmds:mkdir(path.directory(opt.objectfile))
+
+ local fileconfig = target:fileconfig(opt.cppfile)
+ local external = fileconfig and fileconfig.external
- local precompile, first_step, second_step = _make_modulebuildflags(target, provide, bmifile, {batchcmds = true, sourcefile = opt.cppfile, external = external, name = name})
- _batchcmds_compile(batchcmds, target, first_step, opt.cppfile, precompile and bmifile or opt.objectfile)
+ local precompile, first_step, second_step = _make_modulebuildflags(target, provide, bmifile, {batchcmds = true, sourcefile = opt.cppfile, external = external, name = name})
+ _batchcmds_compile(batchcmds, target, first_step, opt.cppfile, precompile and bmifile or opt.objectfile)
- if second_step then
- _batchcmds_compile(batchcmds, target, second_step, opt.cppfile, opt.objectfile, {bmifile = bmifile})
+ if second_step then
+ _batchcmds_compile(batchcmds, target, second_step, opt.cppfile, opt.objectfile, {bmifile = bmifile})
+ end
+ else
+ batchcmds:rm(opt.objectfile) -- force rebuild for .cpp files
end
end
batchcmds:add_depfiles(opt.cppfile)
diff --git a/xmake/rules/c++/modules/modules_support/gcc/builder.lua b/xmake/rules/c++/modules/modules_support/gcc/builder.lua
index 2f763744a..c90fe743e 100644
--- a/xmake/rules/c++/modules/modules_support/gcc/builder.lua
+++ b/xmake/rules/c++/modules/modules_support/gcc/builder.lua
@@ -207,7 +207,7 @@ function get_module_required_defines(target, sourcefile)
end
-- build module file for batchjobs
-function make_module_buildjobs(target, batchjobs, job_name, deps, opt)
+function make_module_buildjobs(target, batchjobs, job_name, deps, should_build, mark_build, opt)
local name, provide, _ = compiler_support.get_provided_module(opt.module)
local bmifile = provide and compiler_support.get_bmi_path(provide.bmi)
@@ -229,6 +229,13 @@ function make_module_buildjobs(target, batchjobs, job_name, deps, opt)
target:fileconfig_add(opt.cppfile, {force = {cxxflags = {module_mapperflag .. module_mapper}}})
end
+ local build = should_build(target, opt.cppfile, bmifile, {objectfile = opt.objectfile, requires = opt.module.requires})
+
+ -- needed to detect rebuild of dependencies
+ if provide and build then
+ mark_build(target, name)
+ end
+
local dependfile = target:dependfile(bmifile or opt.objectfile)
local dependinfo = depend.load(dependfile) or {}
dependinfo.files = {}
@@ -245,6 +252,8 @@ function make_module_buildjobs(target, batchjobs, job_name, deps, opt)
local flags = _make_modulebuildflags(target, opt)
_compile(target, flags, opt.cppfile, opt.objectfile)
os.tryrm(module_mapper)
+ else
+ os.tryrm(opt.objectfile) -- force rebuild for .cpp files
end
end
table.insert(dependinfo.files, opt.cppfile)
@@ -254,7 +263,7 @@ function make_module_buildjobs(target, batchjobs, job_name, deps, opt)
end
-- build module file for batchcmds
-function make_module_buildcmds(target, batchcmds, opt)
+function make_module_buildcmds(target, batchcmds, should_build, mark_build, opt)
local name, provide, _ = compiler_support.get_provided_module(opt.module)
local module_mapperflag = compiler_support.get_modulemapperflag(target)
@@ -266,7 +275,14 @@ function make_module_buildcmds(target, batchcmds, opt)
target:fileconfig_add(opt.cppfile, {force = {cxxflags = {module_mapperflag .. module_mapper}}})
end
- if opt.build then
+ local build = should_build(target, opt.cppfile, bmifile, {objectfile = opt.objectfile, requires = opt.module.requires})
+
+ -- needed to detect rebuild of dependencies
+ if provide and build then
+ mark_build(target, name)
+ end
+
+ if build then
-- compile if it's a named module
if provide or compiler_support.has_module_extension(opt.cppfile) then
batchcmds:show_progress(opt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.module.$(mode) %s", target:name(), name or opt.cppfile)
@@ -275,6 +291,8 @@ function make_module_buildcmds(target, batchcmds, opt)
end
batchcmds:mkdir(path.directory(opt.objectfile))
_batchcmds_compile(batchcmds, target, _make_modulebuildflags(target, {batchcmds = true, sourcefile = opt.cppfile}), opt.cppfile, opt.objectfile)
+ else
+ batchcmds:rm(opt.objectfile) -- force rebuild for .cpp files
end
end
batchcmds:add_depfiles(opt.cppfile)
diff --git a/xmake/rules/c++/modules/modules_support/msvc/builder.lua b/xmake/rules/c++/modules/modules_support/msvc/builder.lua
index 019235837..925f0fa35 100644
--- a/xmake/rules/c++/modules/modules_support/msvc/builder.lua
+++ b/xmake/rules/c++/modules/modules_support/msvc/builder.lua
@@ -207,7 +207,7 @@ function get_module_required_defines(target, sourcefile)
end
-- build module file for batchjobs
-function make_module_buildjobs(target, batchjobs, job_name, deps, opt)
+function make_module_buildjobs(target, batchjobs, job_name, deps, should_build, mark_build, opt)
local name, provide, _ = compiler_support.get_provided_module(opt.module)
local bmifile = provide and compiler_support.get_bmi_path(provide.bmi)
@@ -227,27 +227,39 @@ function make_module_buildjobs(target, batchjobs, job_name, deps, opt)
_append_requires_flags(target, opt.module, name, opt.cppfile, bmifile, opt)
end
+ local build = should_build(target, opt.cppfile, bmifile, {objectfile = opt.objectfile, requires = opt.module.requires})
+
+ -- needed to detect rebuild of dependencies
+ if provide and build then
+ mark_build(target, name)
+ end
+
+
local dependfile = target:dependfile(bmifile or opt.objectfile)
local dependinfo = depend.load(dependfile) or {}
dependinfo.files = {}
local depvalues = {compinst:program(), compflags}
- -- compile if it's a named module
- if opt.build and (provide or compiler_support.has_module_extension(opt.cppfile)) then
- progress.show((index * 100) / total, "${color.build.target}<%s> ${clear}${color.build.object}compiling.module.$(mode) %s", target:name(), name or opt.cppfile)
+ if build then
+ -- compile if it's a named module
+ if provide or compiler_support.has_module_extension(opt.cppfile) then
+ progress.show((index * 100) / total, "${color.build.target}<%s> ${clear}${color.build.object}compiling.module.$(mode) %s", target:name(), name or opt.cppfile)
- if not dryrun then
- local objectdir = path.directory(opt.objectfile)
- if not os.isdir(objectdir) then
- os.mkdir(objectdir)
+ if not dryrun then
+ local objectdir = path.directory(opt.objectfile)
+ if not os.isdir(objectdir) then
+ os.mkdir(objectdir)
+ end
end
- end
- local fileconfig = target:fileconfig(opt.cppfile)
- local external = fileconfig and fileconfig.external
- local flags = _make_modulebuildflags(target, provide, bmifile, {external = external})
+ local fileconfig = target:fileconfig(opt.cppfile)
+ local external = fileconfig and fileconfig.external
+ local flags = _make_modulebuildflags(target, provide, bmifile, {external = external})
- _compile(target, flags, opt.cppfile, opt.objectfile)
+ _compile(target, flags, opt.cppfile, opt.objectfile)
+ else
+ os.tryrm(opt.objectfile) -- force rebuild for .cpp files
+ end
end
table.insert(dependinfo.files, opt.cppfile)
@@ -257,7 +269,7 @@ function make_module_buildjobs(target, batchjobs, job_name, deps, opt)
end
-- build module file for batchcmds
-function make_module_buildcmds(target, batchcmds, opt)
+function make_module_buildcmds(target, batchcmds, should_build, mark_build, opt)
local name, provide, _ = compiler_support.get_provided_module(opt.module)
local bmifile = provide and compiler_support.get_bmi_path(provide.bmi)
@@ -267,7 +279,15 @@ function make_module_buildcmds(target, batchcmds, opt)
_append_requires_flags(target, opt.module, name, opt.cppfile, bmifile, opt)
end
- if opt.build then
+ local build = should_build(target, opt.cppfile, bmifile, {objectfile = opt.objectfile, requires = opt.module.requires})
+
+ -- needed to detect rebuild of dependencies
+ if provide and build then
+ mark_build(target, name)
+ end
+
+ if build then
+ -- compile if it's a named module
if provide or compiler_support.has_module_extension(opt.cppfile) then
batchcmds:show_progress(opt.progress, "${color.build.target}<%s> ${clear}${color.build.object}compiling.module.$(mode) %s", target:name(), name or opt.cppfile)
batchcmds:mkdir(path.directory(opt.objectfile))
@@ -276,6 +296,8 @@ function make_module_buildcmds(target, batchcmds, opt)
local external = fileconfig and fileconfig.external
local flags = _make_modulebuildflags(target, provide, bmifile, opt.cppfile, opt.objectfile, {batchcmds = true, external = external})
_batchcmds_compile(batchcmds, target, flags, opt.cppfile, objectfile)
+ else
+ batchcmds:rm(opt.objectfile) -- force rebuild for .cpp files
end
end
batchcmds:add_depfiles(opt.cppfile)