summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Boeckel <ben.boeckel@kitware.com>2022-06-13 20:38:55 (GMT)
committerBen Boeckel <ben.boeckel@kitware.com>2022-07-06 15:37:51 (GMT)
commitf899563ae45972a3894c78a447d0767e86056b81 (patch)
treef2308b5504611981c4a17511397c0debb8c1a169
parent9ecd3e771b0dbdbfcfa035f5d2b0383a5b739014 (diff)
downloadCMake-f899563ae45972a3894c78a447d0767e86056b81.zip
CMake-f899563ae45972a3894c78a447d0767e86056b81.tar.gz
CMake-f899563ae45972a3894c78a447d0767e86056b81.tar.bz2
cmGlobalNinjaGenerator: verify that private sources stay private
Private source files are not installed or made available, so they must not be required by public module interface units at all.
-rw-r--r--Source/cmGlobalNinjaGenerator.cxx27
1 files changed, 27 insertions, 0 deletions
diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx
index f55e58f..b4d5746 100644
--- a/Source/cmGlobalNinjaGenerator.cxx
+++ b/Source/cmGlobalNinjaGenerator.cxx
@@ -2726,6 +2726,10 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
cmStrCat("${_IMPORT_PREFIX}/", cmEscape(dest)));
};
+ // public/private requirement tracking.
+ std::set<std::string> private_modules;
+ std::map<std::string, std::set<std::string>> public_source_requires;
+
for (cmScanDepInfo const& object : objects) {
// Convert to forward slashes.
auto output_path = object.PrimaryOutput;
@@ -2811,9 +2815,20 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
if (!cmFileSetVisibilityIsForInterface(file_set.Visibility)) {
// Nothing needs to be conveyed about non-`PUBLIC` modules.
+ for (auto const& p : object.Provides) {
+ private_modules.insert(p.LogicalName);
+ }
continue;
}
+ // The module is public. Record what it directly requires.
+ {
+ auto& reqs = public_source_requires[file_set.SourcePath];
+ for (auto const& r : object.Requires) {
+ reqs.insert(r.LogicalName);
+ }
+ }
+
// Write out properties and install rules for any exports.
for (auto const& p : object.Provides) {
bool bmi_dest_is_abs = false;
@@ -2921,6 +2936,18 @@ bool cmGlobalNinjaGenerator::WriteDyndepFile(
for (auto const& exp : exports) {
*exp.first << ")\n";
}
+
+ // Check that public sources only require public modules.
+ for (auto const& pub_reqs : public_source_requires) {
+ for (auto const& req : pub_reqs.second) {
+ if (private_modules.count(req)) {
+ cmSystemTools::Error(cmStrCat(
+ "Public C++ module source `", pub_reqs.first, "` requires the `",
+ req, "` C++ module which is provided by a private source"));
+ result = false;
+ }
+ }
+ }
}
return result;