diff options
| author | ruki <[email protected]> | 2026-04-08 16:46:28 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-04-08 16:46:28 +0800 |
| commit | 3a91a8b27ebc9d40656750615a3606e5fe971fc9 (patch) | |
| tree | 9d76ca97662897854f57b38d09861c6e8449ab73 /tests/projects/c++/modules | |
| parent | ad2ec59e16d975d0fae054649ad360fe85031012 (diff) | |
| parent | 9d962c7502d997218a99ea00491475ca8d568066 (diff) | |
Merge pull request #7449 from Akaps316/codex/fix-modules-private-dep-bmis
fix(c++/modules): avoid leaking private dep flags to rebuilt BMIs
Diffstat (limited to 'tests/projects/c++/modules')
6 files changed, 83 insertions, 0 deletions
diff --git a/tests/projects/c++/modules/reuse_strict_private_defines/src/include/public_config.h b/tests/projects/c++/modules/reuse_strict_private_defines/src/include/public_config.h new file mode 100644 index 000000000..3ceb5dcd5 --- /dev/null +++ b/tests/projects/c++/modules/reuse_strict_private_defines/src/include/public_config.h @@ -0,0 +1,3 @@ +#pragma once + +#define PUBLIC_CONFIG_VALUE 0 diff --git a/tests/projects/c++/modules/reuse_strict_private_defines/src/main.cpp b/tests/projects/c++/modules/reuse_strict_private_defines/src/main.cpp new file mode 100644 index 000000000..5b477f2d6 --- /dev/null +++ b/tests/projects/c++/modules/reuse_strict_private_defines/src/main.cpp @@ -0,0 +1,5 @@ +import mod; + +int main() { + return foo(); +} diff --git a/tests/projects/c++/modules/reuse_strict_private_defines/src/mod.cpp b/tests/projects/c++/modules/reuse_strict_private_defines/src/mod.cpp new file mode 100644 index 000000000..aaf40d855 --- /dev/null +++ b/tests/projects/c++/modules/reuse_strict_private_defines/src/mod.cpp @@ -0,0 +1,9 @@ +module; + +#include <public_config.h> + +module mod; + +int foo() { + return PUBLIC_CONFIG_VALUE; +} diff --git a/tests/projects/c++/modules/reuse_strict_private_defines/src/mod.mpp b/tests/projects/c++/modules/reuse_strict_private_defines/src/mod.mpp new file mode 100644 index 000000000..b55b834a7 --- /dev/null +++ b/tests/projects/c++/modules/reuse_strict_private_defines/src/mod.mpp @@ -0,0 +1,3 @@ +export module mod; + +export int foo(); diff --git a/tests/projects/c++/modules/reuse_strict_private_defines/test.lua b/tests/projects/c++/modules/reuse_strict_private_defines/test.lua new file mode 100644 index 000000000..6e3304b68 --- /dev/null +++ b/tests/projects/c++/modules/reuse_strict_private_defines/test.lua @@ -0,0 +1,47 @@ +inherit(".test_base") +import("utils.ci.is_running", {alias = "ci_is_running"}) + +local CLANG_MIN_VER = is_subhost("windows") and "19" or "17" +local GCC_MIN_VER = "11" +local MSVC_MIN_VER = "14.29" + +local PRIVATE_DEFINE = "PRIVATE_DEP_DEFINE_DO_NOT_PROPAGATE" +local PUBLIC_SYSINCLUDEDIR = path.translate("src/include") + +function _build() + local flags = "" + if ci_is_running() then + flags = "-vD" + end + local leaked = false + local missing_sysincludedir = true + local outdata = try { function () return os.iorun("xmake -rv") end } + if outdata then + for line in outdata:gmatch("[^\r\n]+") do + if line:find("Consumer", 1, true) then + if line:find(PRIVATE_DEFINE, 1, true) then + leaked = true + end + if line:find(PUBLIC_SYSINCLUDEDIR, 1, true) then + missing_sysincludedir = false + end + end + end + if leaked then + raise("Private dependency defines leaked into Consumer module rebuilds under reuse.strict\n%s", outdata) + end + if missing_sysincludedir then + raise("Missing public sysincludedir in Consumer module rebuilds under reuse.strict\n%s", outdata) + end + else + -- maybe build failed, we need to see verbose errors + os.run("xmake " .. flags) + end +end + +function main(_) + local clang_options = {compiler = "clang", version = CLANG_MIN_VER, build = _build} + local gcc_options = {compiler = "gcc", version = GCC_MIN_VER, build = _build} + local msvc_options = {version = MSVC_MIN_VER, build = _build} + run_tests(clang_options, gcc_options, msvc_options) +end diff --git a/tests/projects/c++/modules/reuse_strict_private_defines/xmake.lua b/tests/projects/c++/modules/reuse_strict_private_defines/xmake.lua new file mode 100644 index 000000000..77314cf47 --- /dev/null +++ b/tests/projects/c++/modules/reuse_strict_private_defines/xmake.lua @@ -0,0 +1,16 @@ +add_rules("mode.debug", "mode.release") + +set_languages("c++20") + +target("Producer") + set_kind("static") + add_defines("PRIVATE_DEP_DEFINE_DO_NOT_PROPAGATE") + add_sysincludedirs("src/include", {public = true}) + add_files("src/mod.mpp", {public = true}) + add_files("src/mod.cpp") + +target("Consumer") + set_kind("binary") + set_policy("build.c++.modules.reuse.strict", true) + add_deps("Producer") + add_files("src/main.cpp") |
