summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur LAURENT <[email protected]>2024-02-05 17:30:32 +0100
committerArthur LAURENT <[email protected]>2024-02-05 17:30:32 +0100
commit6739478d0bf6a4aaf0d1a1caf1c6b60532fa07f8 (patch)
tree8e1f4493b63876a0e9c33d0845aa6b7bbefa886b
parentcf0e793a7cee0e1225c307473794245529cbc302 (diff)
fix gcc
-rw-r--r--xmake/rules/c++/modules/modules_support/builder.lua3
-rw-r--r--xmake/rules/c++/modules/modules_support/dependency_scanner.lua10
-rw-r--r--xmake/rules/c++/modules/modules_support/gcc/builder.lua18
-rw-r--r--xmake/rules/c++/modules/xmake.lua10
4 files changed, 16 insertions, 25 deletions
diff --git a/xmake/rules/c++/modules/modules_support/builder.lua b/xmake/rules/c++/modules/modules_support/builder.lua
index af0a0539f..1f014abde 100644
--- a/xmake/rules/c++/modules/modules_support/builder.lua
+++ b/xmake/rules/c++/modules/modules_support/builder.lua
@@ -44,13 +44,12 @@ function _build_modules(target, sourcebatch, modules, opt)
local name, provide, cppfile = compiler_support.get_provided_module(module)
cppfile = cppfile or module.cppfile
- local fileconfig = target:fileconfig(cppfile)
-
local deps = {}
for _, dep in ipairs(table.keys(module.requires or {})) do
table.insert(deps, opt.batchjobs and target:name() .. dep or dep)
end
+ local fileconfig = target:fileconfig(cppfile)
opt.build_module(deps, module, name, provide, objectfile, cppfile, fileconfig)
::CONTINUE::
diff --git a/xmake/rules/c++/modules/modules_support/dependency_scanner.lua b/xmake/rules/c++/modules/modules_support/dependency_scanner.lua
index b5b3fcf5f..0b02292ef 100644
--- a/xmake/rules/c++/modules/modules_support/dependency_scanner.lua
+++ b/xmake/rules/c++/modules/modules_support/dependency_scanner.lua
@@ -396,7 +396,7 @@ function get_all_packages_modules(target, opt)
end
-- topological sort
-function sort_modules_by_dependencies(objectfiles, modules)
+function sort_modules_by_dependencies(target, objectfiles, modules)
local result = {}
local edges = _get_edges(objectfiles, modules)
local dag = graph.new(true)
@@ -422,9 +422,11 @@ function sort_modules_by_dependencies(objectfiles, modules)
local objectfiles_sorted_set = hashset.from(objectfiles_sorted)
for _, objectfile in ipairs(objectfiles) do
if not objectfiles_sorted_set:has(objectfile) then
- -- cull unreferenced named module but add non-module files
- local _, provide, _ = compiler_support.get_provided_module(modules[objectfile])
- if not provide then
+ -- cull unreferenced non-public named module but add non-module files and implementation modules
+ local _, provide, cppfile = compiler_support.get_provided_module(modules[objectfile])
+ local fileconfig = target:fileconfig(cppfile)
+ local public = fileconfig and fileconfig.public
+ if not provide or public then
table.insert(result, objectfile)
end
end
diff --git a/xmake/rules/c++/modules/modules_support/gcc/builder.lua b/xmake/rules/c++/modules/modules_support/gcc/builder.lua
index 17b3aabc5..c4c9871e2 100644
--- a/xmake/rules/c++/modules/modules_support/gcc/builder.lua
+++ b/xmake/rules/c++/modules/modules_support/gcc/builder.lua
@@ -99,24 +99,14 @@ end
function _get_maplines(target, module)
local maplines = {}
- local m_name, m = compiler_support.get_provided_module(module)
+ local m_name, m, cppfile = compiler_support.get_provided_module(module)
if m then
table.insert(maplines, m_name .. " " .. compiler_support.get_bmi_path(m.bmi))
end
for required, _ in table.orderpairs(module.requires) do
- local dep_module
- local dep_target
-
- -- if not in target dep
- if not dep_module then
- dep_module = get_from_target_mapper(target, required)
- if dep_module then
- dep_target = target
- end
- end
-
- assert(dep_module, "module dependency %s required for %s not found", required, m_name)
+ local dep_module = get_from_target_mapper(target, required)
+ assert(dep_module, "module dependency %s required for %s not found", required, m_name or module.cppfile)
local bmifile = dep_module.bmi
local mapline
@@ -136,7 +126,7 @@ function _get_maplines(target, module)
-- append deps
if dep_module.opt and dep_module.opt.deps then
- local deps = _get_maplines(dep_target, { name = dep_module.name, bmi = bmifile, requires = dep_module.opt.deps })
+ local deps = _get_maplines(target, {name = dep_module.name, bmi = bmifile, requires = dep_module.opt.deps})
table.join2(maplines, deps)
end
end
diff --git a/xmake/rules/c++/modules/xmake.lua b/xmake/rules/c++/modules/xmake.lua
index c8385da03..62fb37205 100644
--- a/xmake/rules/c++/modules/xmake.lua
+++ b/xmake/rules/c++/modules/xmake.lua
@@ -98,8 +98,8 @@ rule("c++.build.modules.builder")
compiler_support.patch_sourcebatch(target, sourcebatch, opt)
local modules = dependency_scanner.get_module_dependencies(target, sourcebatch, opt)
- -- avoid linking culled objectfiles
- sourcebatch.objectfiles = dependency_scanner.sort_modules_by_dependencies(sourcebatch.objectfiles, modules)
+ -- avoid building non referenced modules
+ sourcebatch.objectfiles = dependency_scanner.sort_modules_by_dependencies(target, sourcebatch.objectfiles, modules)
-- build modules
builder.build_modules_for_batchjobs(target, batchjobs, sourcebatch, modules, opt)
@@ -153,8 +153,8 @@ rule("c++.build.modules.builder")
compiler_support.patch_sourcebatch(target, sourcebatch, opt)
local modules = dependency_scanner.get_module_dependencies(target, sourcebatch, opt)
- -- avoid linking culled objectfiles
- sourcebatch.objectfiles = dependency_scanner.sort_modules_by_dependencies(sourcebatch.objectfiles, modules)
+ -- avoid building non referenced modules
+ sourcebatch.objectfiles = dependency_scanner.sort_modules_by_dependencies(target, sourcebatch.objectfiles, modules)
-- build headerunits
builder.build_headerunits_for_batchcmds(target, batchcmds, sourcebatch, modules, opt)
@@ -163,7 +163,7 @@ rule("c++.build.modules.builder")
builder.build_modules_for_batchcmds(target, batchcmds, sourcebatch, modules, opt)
-- cull external modules objectfile
- compiler_support.cull_objectfiles(target, modules, sourcebatch)
+ -- compiler_support.cull_objectfiles(target, modules, sourcebatch)
else
-- avoid duplicate linking of object files of non-module programs
sourcebatch.objectfiles = {}