diff options
| author | Akaps316 <[email protected]> | 2026-04-03 18:47:28 +0530 |
|---|---|---|
| committer | Akaps316 <[email protected]> | 2026-04-03 20:56:23 +0530 |
| commit | 5271c90286fa0fc80fda695bb399516bb8c6b4b4 (patch) | |
| tree | 6b0e17c2c7df0a7c87f8d52524619f1f2a7d4f74 /tests/projects/c++/modules | |
| parent | 39fd35ea9d5d14079e4669b85423d488c9097cd4 (diff) | |
fix(c++/modules): avoid leaking private dep flags to rebuilt BMIs
Only inherit interface-visible defines/undefines/includedirs when
collecting module fileconfigs from dependency targets.
This fixes consumer-side BMI rebuilds under
build.c++.modules.reuse.strict picking up private producer flags.
Add a regression test for strict module reuse with a shared dependency.
Diffstat (limited to 'tests/projects/c++/modules')
6 files changed, 68 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..478993dfb --- /dev/null +++ b/tests/projects/c++/modules/reuse_strict_private_defines/src/mod.cpp @@ -0,0 +1,7 @@ +#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..bd9b241cd --- /dev/null +++ b/tests/projects/c++/modules/reuse_strict_private_defines/test.lua @@ -0,0 +1,34 @@ +inherit(".test_base") + +local PRIVATE_DEFINE = "PRIVATE_DEP_DEFINE_DO_NOT_PROPAGATE" +local PUBLIC_SYSINCLUDEDIR = path.translate(path.absolute("src/include")) + +function _build() + local outdata = os.iorun("xmake -r -vD") + local leaked = false + local missing_sysincludedir = true + 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 + os.run("xmake -vD") +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..aba5cc895 --- /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("cxx20") + +target("Producer") + set_kind("shared") + 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") |
