summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-11-06 09:20:52 +0800
committerGitHub <[email protected]>2025-11-06 09:20:52 +0800
commit169c7ddce5a07c82b5aa60fbc6fcb37e4593fb7d (patch)
tree2f2b90ec77ff0cf6093f2e534e69d9e9eda116dc
parentc5d08dcde1187fbf3903d51d63af8e15e28650c1 (diff)
parentce723897432dad8d8f94ddf831e3a8d7db6e2700 (diff)
Merge pull request #6993 from Arthapz/fix-xmake_tests_modules
Fix xmake tests modules
-rw-r--r--tests/projects/c++/modules/test_dependency_scanner.lua2
-rw-r--r--tests/projects/c++/modules/test_xmake_test.lua22
-rw-r--r--tests/projects/c++/modules/xmake_tests1/src/foo.cppm3
-rw-r--r--tests/projects/c++/modules/xmake_tests1/src/main.cpp3
-rw-r--r--tests/projects/c++/modules/xmake_tests1/test.lua1
-rw-r--r--tests/projects/c++/modules/xmake_tests1/xmake.lua15
-rw-r--r--tests/projects/c++/modules/xmake_tests2/src/foo.cppm3
-rw-r--r--tests/projects/c++/modules/xmake_tests2/src/main.cpp3
-rw-r--r--tests/projects/c++/modules/xmake_tests2/test.lua1
-rw-r--r--tests/projects/c++/modules/xmake_tests2/xmake.lua21
-rw-r--r--xmake/rules/c++/modules/builder.lua11
-rw-r--r--xmake/rules/c++/modules/scanner.lua13
12 files changed, 84 insertions, 14 deletions
diff --git a/tests/projects/c++/modules/test_dependency_scanner.lua b/tests/projects/c++/modules/test_dependency_scanner.lua
index 406ac76f4..450a53084 100644
--- a/tests/projects/c++/modules/test_dependency_scanner.lua
+++ b/tests/projects/c++/modules/test_dependency_scanner.lua
@@ -8,7 +8,7 @@ MSVC_MIN_VER = "14.29"
function _build(platform, toolchain_name, runtimes, policies, flags)
local flags = ""
if ci_is_running() then
- flags = "-vD"
+ flags = "-vD"
end
os.exec("xmake f" .. platform .. "--toolchain=" .. toolchain_name .. runtimes .. "-c --yes " .. policies .. " --foo=n" .. " " .. flags)
local outdata
diff --git a/tests/projects/c++/modules/test_xmake_test.lua b/tests/projects/c++/modules/test_xmake_test.lua
new file mode 100644
index 000000000..2d0b0a2d1
--- /dev/null
+++ b/tests/projects/c++/modules/test_xmake_test.lua
@@ -0,0 +1,22 @@
+inherit("test_base")
+import("utils.ci.is_running", {alias = "ci_is_running"})
+
+CLANG_MIN_VER = is_subhost("windows") and "19" or "17"
+GCC_MIN_VER = "11"
+MSVC_MIN_VER = "14.29"
+
+function run_xmake_test(...)
+ local flags = ""
+ if ci_is_running() then
+ flags = "-vD"
+ end
+ local outdata, errdata = os.iorun("xmake test " .. flags)
+ assert(outdata, errdata)
+end
+
+function main(t)
+ local clang_options = {compiler = "clang", version = CLANG_MIN_VER, after_build = run_xmake_test}
+ local gcc_options = {compiler = "gcc", version = GCC_MIN_VER, after_build = run_xmake_test}
+ local msvc_options = {version = MSVC_MIN_VER, after_build = run_xmake_test}
+ run_tests(clang_options, gcc_options, msvc_options)
+end
diff --git a/tests/projects/c++/modules/xmake_tests1/src/foo.cppm b/tests/projects/c++/modules/xmake_tests1/src/foo.cppm
new file mode 100644
index 000000000..d0cb72703
--- /dev/null
+++ b/tests/projects/c++/modules/xmake_tests1/src/foo.cppm
@@ -0,0 +1,3 @@
+export module Foo;
+
+export inline int foo() { return 0; }
diff --git a/tests/projects/c++/modules/xmake_tests1/src/main.cpp b/tests/projects/c++/modules/xmake_tests1/src/main.cpp
new file mode 100644
index 000000000..7a7488a3b
--- /dev/null
+++ b/tests/projects/c++/modules/xmake_tests1/src/main.cpp
@@ -0,0 +1,3 @@
+import Foo;
+
+int main() { return foo(); }
diff --git a/tests/projects/c++/modules/xmake_tests1/test.lua b/tests/projects/c++/modules/xmake_tests1/test.lua
new file mode 100644
index 000000000..25ca8a7a3
--- /dev/null
+++ b/tests/projects/c++/modules/xmake_tests1/test.lua
@@ -0,0 +1 @@
+inherit(".test_xmake_test")
diff --git a/tests/projects/c++/modules/xmake_tests1/xmake.lua b/tests/projects/c++/modules/xmake_tests1/xmake.lua
new file mode 100644
index 000000000..64198ec69
--- /dev/null
+++ b/tests/projects/c++/modules/xmake_tests1/xmake.lua
@@ -0,0 +1,15 @@
+add_rules('mode.debug', 'mode.release')
+ set_languages('c++23')
+ set_policy('build.c++.modules.std', false)
+
+target('module_dep')
+ set_kind('moduleonly')
+ add_files('src/*.cppm')
+
+target('module_target')
+ set_kind('moduleonly')
+ add_files('src/*.cppm')
+
+add_deps('module_dep')
+ add_tests('test', { kind = 'binary', files = 'src/main.cpp', build_should_pass = true })
+ add_tests('test2', { kind = 'binary', files = 'src/main.cpp', build_should_pass = true })
diff --git a/tests/projects/c++/modules/xmake_tests2/src/foo.cppm b/tests/projects/c++/modules/xmake_tests2/src/foo.cppm
new file mode 100644
index 000000000..d0cb72703
--- /dev/null
+++ b/tests/projects/c++/modules/xmake_tests2/src/foo.cppm
@@ -0,0 +1,3 @@
+export module Foo;
+
+export inline int foo() { return 0; }
diff --git a/tests/projects/c++/modules/xmake_tests2/src/main.cpp b/tests/projects/c++/modules/xmake_tests2/src/main.cpp
new file mode 100644
index 000000000..7a7488a3b
--- /dev/null
+++ b/tests/projects/c++/modules/xmake_tests2/src/main.cpp
@@ -0,0 +1,3 @@
+import Foo;
+
+int main() { return foo(); }
diff --git a/tests/projects/c++/modules/xmake_tests2/test.lua b/tests/projects/c++/modules/xmake_tests2/test.lua
new file mode 100644
index 000000000..25ca8a7a3
--- /dev/null
+++ b/tests/projects/c++/modules/xmake_tests2/test.lua
@@ -0,0 +1 @@
+inherit(".test_xmake_test")
diff --git a/tests/projects/c++/modules/xmake_tests2/xmake.lua b/tests/projects/c++/modules/xmake_tests2/xmake.lua
new file mode 100644
index 000000000..e5326b36d
--- /dev/null
+++ b/tests/projects/c++/modules/xmake_tests2/xmake.lua
@@ -0,0 +1,21 @@
+add_rules("mode.debug", "mode.release")
+set_languages("c++23")
+set_policy("build.c++.modules.std", false)
+
+target("module_dep")
+ set_kind("moduleonly")
+ add_files("src/*.cppm")
+
+target("module_target1")
+ set_kind("moduleonly")
+ add_files("src/*.cppm")
+
+ add_deps("module_dep")
+ add_tests("tests", {kind = "binary", files = "src/main.cpp", build_should_pass = true})
+
+target("module_target2")
+ set_kind("moduleonly")
+ add_files("src/*.cppm")
+
+ add_deps("module_dep")
+ add_tests("tests", {kind = "binary", files = "src/main.cpp", build_should_pass = true})
diff --git a/xmake/rules/c++/modules/builder.lua b/xmake/rules/c++/modules/builder.lua
index a1c93a35f..87cd143f0 100644
--- a/xmake/rules/c++/modules/builder.lua
+++ b/xmake/rules/c++/modules/builder.lua
@@ -121,13 +121,15 @@ function _get_jobdeps(target, module, jobgraph, buildfilejob)
return jobdeps
end
-function _get_saved_jobdeps_for(buildfilejob)
+function _get_saved_jobdeps_for(jobgraph, buildfilejob)
local memcache = support.memcache()
local dependent_jobs = memcache:get2("dependent_jobs", buildfilejob)
local jobdeps = {}
for _, dependent_job in ipairs(dependent_jobs) do
- jobdeps[dependent_job] = jobdeps[dependent_job] or {}
- table.insert(jobdeps[dependent_job], buildfilejob)
+ if jobgraph:has(dependent_job) then
+ jobdeps[dependent_job] = jobdeps[dependent_job] or {}
+ table.insert(jobdeps[dependent_job], buildfilejob)
+ end
end
return jobdeps
end
@@ -266,7 +268,7 @@ function build_modules_for_jobgraph(target, jobgraph, built_modules)
-- insert saved jobdeps
for _, buildfilejob in ipairs(buildfilejobs) do
- table.join2(jobdeps, _get_saved_jobdeps_for(buildfilejob))
+ table.join2(jobdeps, _get_saved_jobdeps_for(jobgraph, buildfilejob))
end
-- apply jobdeps
@@ -756,4 +758,3 @@ function build_objectfiles(target, jobgraph, _, opt)
profiler.leave(target:fullname(), "c++ modules", "builder", "objectfiles")
end
end
-
diff --git a/xmake/rules/c++/modules/scanner.lua b/xmake/rules/c++/modules/scanner.lua
index 818e37aa2..3c7a04aa4 100644
--- a/xmake/rules/c++/modules/scanner.lua
+++ b/xmake/rules/c++/modules/scanner.lua
@@ -234,7 +234,6 @@ function _get_packages_for(target)
for name, dep in pairs(target:orderdeps()) do
local dep_packages = _get_packages_for(dep)
for pkgname, package in pairs(dep_packages) do
- -- print(package)
packages[pkgname] = {pkg = package.pkg, from_dep = package.from_dep or dep, from_package = true}
end
end
@@ -377,13 +376,13 @@ function _patch_sourcebatch(target, sourcebatch)
local localcache = support.localcache()
local reuse = target:policy("build.c++.modules.reuse") or
- target:policy("build.c++.modules.tryreuse")
+ target:policy("build.c++.modules.tryreuse")
local reused = {}
for sourcefile, fileconfig in pairs(from_depmodules) do
if reuse and fileconfig.from_dep then
local nocheck = target:policy("build.c++.modules.reuse.nocheck")
local strict = target:policy("build.c++.modules.reuse.strict") or
- target:policy("build.c++.modules.tryreuse.discriminate_on_defines")
+ target:policy("build.c++.modules.tryreuse.discriminate_on_defines")
local dep = target:dep(fileconfig.from_dep)
assert(dep, "dep target <%s> for <%s> not found", fileconfig.from_dep, target:fullname())
local can_reuse = nocheck or _are_flags_compatible(target, dep, sourcefile, {strict = strict})
@@ -415,7 +414,7 @@ function _patch_sourcebatch(target, sourcebatch)
end
table.sort(sourcebatch.sourcefiles)
- memcache:set2(target:fullname(), "cached_sourcebatch", sourcebatch)
+ memcache:set2(target:fullname(), "cached_sourcebatch", table.clone(sourcebatch))
local keys = #sourcebatch.sourcefiles > 0 and table.concat(sourcebatch.sourcefiles) or "_"
local sum = hash.strhash64(keys)
@@ -566,7 +565,7 @@ function _schedule_module_dependencies_scan(target, jobgraph, sourcebatch)
modules[name].alias = true
end
end
- end)
+ end)
local reused, from = support.is_reused(target, sourcefile)
if reused then
local scanfilejob = get_scanfilejob_for(from, sourcefile)
@@ -886,9 +885,7 @@ function after_scan(target)
local sourcebatches = target:sourcebatches()
local sourcebatch_builder = sourcebatches and sourcebatches["c++.build.modules.builder"]
local sourcebatch_scanner = sourcebatches and sourcebatches["c++.build.modules.scanner"]
- if sourcebatch_scanner then
- sourcebatch_scanner.sourcefiles = {}
- end
+ support.memcache():set2(target:fullname(), "jobdeps", nil)
if sourcebatch_builder then
sourcebatch_builder.sourcefiles = {}
sourcebatch_builder.dependfiles = {}