From 4452d41488d8ebd660f129aebb57a87c5dbb4caa Mon Sep 17 00:00:00 2001
From: Ben Boeckel <ben.boeckel@kitware.com>
Date: Mon, 29 Apr 2024 17:23:08 -0400
Subject: cmGeneratorTarget: add method to get a filesystem-safe export name

C++ module support puts the export name in a filename. Export names with
`:` in them are not valid filenames on Windows. Add a method to escape
names as necessary.

See: #25828
---
 Source/cmGeneratorTarget.cxx | 10 ++++++++++
 Source/cmGeneratorTarget.h   |  1 +
 2 files changed, 11 insertions(+)

diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index 94bb8e1..5196e4e 100644
--- a/Source/cmGeneratorTarget.cxx
+++ b/Source/cmGeneratorTarget.cxx
@@ -367,6 +367,16 @@ std::string cmGeneratorTarget::GetExportName() const
   return this->GetName();
 }
 
+std::string cmGeneratorTarget::GetFilesystemExportName() const
+{
+  auto fs_safe = this->GetExportName();
+  // First escape any `_` characters to avoid collisions.
+  cmSystemTools::ReplaceString(fs_safe, "_", "__");
+  // Escape other characters that are not generally filesystem-safe.
+  cmSystemTools::ReplaceString(fs_safe, ":", "_c");
+  return fs_safe;
+}
+
 cmValue cmGeneratorTarget::GetProperty(const std::string& prop) const
 {
   if (cmValue result =
diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h
index 736aab0..7cd7f43 100644
--- a/Source/cmGeneratorTarget.h
+++ b/Source/cmGeneratorTarget.h
@@ -99,6 +99,7 @@ public:
   cmStateEnums::TargetType GetType() const;
   const std::string& GetName() const;
   std::string GetExportName() const;
+  std::string GetFilesystemExportName() const;
 
   std::vector<std::string> GetPropertyKeys() const;
   //! Might return a nullptr if the property is not set or invalid
-- 
cgit v0.12


From 142a85f9c17ae8266168eb8eb2e1c9dfb76f876e Mon Sep 17 00:00:00 2001
From: Ben Boeckel <ben.boeckel@kitware.com>
Date: Mon, 29 Apr 2024 17:24:23 -0400
Subject: cxxmodules: use filesystem-safe export names in filenames

Also add tests.

Fixes: #25828
---
 Source/cmDyndepCollation.cxx                       | 10 ++-
 Source/cmExportBuildFileGenerator.cxx              |  4 +-
 Source/cmExportInstallFileGenerator.cxx            |  4 +-
 ...NinjaDependInfoExportFilesystemSafe-check.cmake | 39 ++++++++++
 .../NinjaDependInfoExportFilesystemSafe.cmake      | 84 ++++++++++++++++++++++
 Tests/RunCMake/CXXModules/RunCMakeTest.cmake       |  1 +
 .../expect/NinjaDependInfoExport-private.json      |  4 ++
 .../expect/NinjaDependInfoExport-public.json       |  4 ++
 ...injaDependInfoExportFilesystemSafe-private.json | 83 +++++++++++++++++++++
 ...NinjaDependInfoExportFilesystemSafe-public.json | 83 +++++++++++++++++++++
 10 files changed, 310 insertions(+), 6 deletions(-)
 create mode 100644 Tests/RunCMake/CXXModules/NinjaDependInfoExportFilesystemSafe-check.cmake
 create mode 100644 Tests/RunCMake/CXXModules/NinjaDependInfoExportFilesystemSafe.cmake
 create mode 100644 Tests/RunCMake/CXXModules/expect/NinjaDependInfoExportFilesystemSafe-private.json
 create mode 100644 Tests/RunCMake/CXXModules/expect/NinjaDependInfoExportFilesystemSafe-public.json

diff --git a/Source/cmDyndepCollation.cxx b/Source/cmDyndepCollation.cxx
index 2ce0f54..79cf4f5 100644
--- a/Source/cmDyndepCollation.cxx
+++ b/Source/cmDyndepCollation.cxx
@@ -207,6 +207,7 @@ Json::Value CollationInformationExports(cmGeneratorTarget const* gt)
 {
   Json::Value tdi_exports = Json::arrayValue;
   std::string export_name = gt->GetExportName();
+  std::string fs_export_name = gt->GetFilesystemExportName();
 
   auto const& all_install_exports = gt->GetGlobalGenerator()->GetExportSets();
   for (auto const& exp : all_install_exports) {
@@ -232,6 +233,7 @@ Json::Value CollationInformationExports(cmGeneratorTarget const* gt)
 
       tdi_export_info["namespace"] = ns;
       tdi_export_info["export-name"] = export_name;
+      tdi_export_info["filesystem-export-name"] = fs_export_name;
       tdi_export_info["destination"] = dest;
       tdi_export_info["cxx-module-info-dir"] = cxxm_dir;
       tdi_export_info["export-prefix"] = export_prefix;
@@ -266,6 +268,7 @@ Json::Value CollationInformationExports(cmGeneratorTarget const* gt)
 
     tdi_export_info["namespace"] = ns;
     tdi_export_info["export-name"] = export_name;
+    tdi_export_info["filesystem-export-name"] = fs_export_name;
     tdi_export_info["destination"] = dest;
     tdi_export_info["cxx-module-info-dir"] = cxxm_dir;
     tdi_export_info["export-prefix"] = export_prefix;
@@ -313,6 +316,7 @@ struct CxxModuleBmiInstall
 struct CxxModuleExport
 {
   std::string Name;
+  std::string FilesystemName;
   std::string Destination;
   std::string Prefix;
   std::string CxxModuleInfoDir;
@@ -350,6 +354,7 @@ cmDyndepCollation::ParseExportInfo(Json::Value const& tdi)
       CxxModuleExport exp;
       exp.Install = tdi_export["install"].asBool();
       exp.Name = tdi_export["export-name"].asString();
+      exp.FilesystemName = tdi_export["filesystem-export-name"].asString();
       exp.Destination = tdi_export["destination"].asString();
       exp.Prefix = tdi_export["export-prefix"].asString();
       exp.CxxModuleInfoDir = tdi_export["cxx-module-info-dir"].asString();
@@ -424,8 +429,9 @@ bool cmDyndepCollation::WriteDyndepMetadata(
 
     std::string const export_dir =
       cmStrCat(exp.Prefix, '/', exp.CxxModuleInfoDir, '/');
-    std::string const property_file_path = cmStrCat(
-      export_dir, "target-", exp.Name, '-', export_info.Config, ".cmake");
+    std::string const property_file_path =
+      cmStrCat(export_dir, "target-", exp.FilesystemName, '-',
+               export_info.Config, ".cmake");
     properties = cm::make_unique<cmGeneratedFileStream>(property_file_path);
 
     // Set up the preamble.
diff --git a/Source/cmExportBuildFileGenerator.cxx b/Source/cmExportBuildFileGenerator.cxx
index 1a22445..081e01d 100644
--- a/Source/cmExportBuildFileGenerator.cxx
+++ b/Source/cmExportBuildFileGenerator.cxx
@@ -571,8 +571,8 @@ bool cmExportBuildFileGenerator::GenerateImportCxxModuleConfigTargetInclusion(
       continue;
     }
 
-    os << "include(\"${CMAKE_CURRENT_LIST_DIR}/target-" << tgt->GetExportName()
-       << '-' << config << ".cmake\")\n";
+    os << "include(\"${CMAKE_CURRENT_LIST_DIR}/target-"
+       << tgt->GetFilesystemExportName() << '-' << config << ".cmake\")\n";
   }
 
   return true;
diff --git a/Source/cmExportInstallFileGenerator.cxx b/Source/cmExportInstallFileGenerator.cxx
index 348b12b..173dc18 100644
--- a/Source/cmExportInstallFileGenerator.cxx
+++ b/Source/cmExportInstallFileGenerator.cxx
@@ -774,8 +774,8 @@ bool cmExportInstallFileGenerator::
       continue;
     }
 
-    auto prop_filename = cmStrCat("target-", tgt->GetExportName(), '-',
-                                  filename_config, ".cmake");
+    auto prop_filename = cmStrCat("target-", tgt->GetFilesystemExportName(),
+                                  '-', filename_config, ".cmake");
     prop_files.emplace_back(cmStrCat(dest, prop_filename));
     os << "include(\"${CMAKE_CURRENT_LIST_DIR}/" << prop_filename << "\")\n";
   }
diff --git a/Tests/RunCMake/CXXModules/NinjaDependInfoExportFilesystemSafe-check.cmake b/Tests/RunCMake/CXXModules/NinjaDependInfoExportFilesystemSafe-check.cmake
new file mode 100644
index 0000000..d08aef7
--- /dev/null
+++ b/Tests/RunCMake/CXXModules/NinjaDependInfoExportFilesystemSafe-check.cmake
@@ -0,0 +1,39 @@
+include("${CMAKE_CURRENT_LIST_DIR}/check-json.cmake")
+
+if (RunCMake_GENERATOR_IS_MULTI_CONFIG)
+  set(have_file 0)
+  foreach (CXXModules_config IN ITEMS Release Debug RelWithDebInfo MinSizeRel)
+    if (NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/ninja-exports-public.dir/${CXXModules_config}/CXXDependInfo.json")
+      continue ()
+    endif ()
+    set(have_file 1)
+
+    set(CMAKE_BUILD_TYPE "${CXXModules_config}")
+
+    file(READ "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/ninja-exports-public.dir/${CXXModules_config}/CXXDependInfo.json" actual_contents)
+    file(READ "${CMAKE_CURRENT_LIST_DIR}/expect/NinjaDependInfoExportFilesystemSafe-public.json" expect_contents)
+    check_json("${actual_contents}" "${expect_contents}")
+
+    file(READ "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/ninja-exports-private.dir/${CXXModules_config}/CXXDependInfo.json" actual_contents)
+    file(READ "${CMAKE_CURRENT_LIST_DIR}/expect/NinjaDependInfoExportFilesystemSafe-private.json" expect_contents)
+    check_json("${actual_contents}" "${expect_contents}")
+  endforeach ()
+
+  if (NOT have_file)
+    list(APPEND RunCMake_TEST_FAILED
+      "No recognized build configurations found.")
+  endif ()
+else ()
+  set(CXXModules_config "${CXXModules_default_build_type}")
+  set(CMAKE_BUILD_TYPE "${CXXModules_default_build_type}")
+
+  file(READ "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/ninja-exports-public.dir/CXXDependInfo.json" actual_contents)
+  file(READ "${CMAKE_CURRENT_LIST_DIR}/expect/NinjaDependInfoExportFilesystemSafe-public.json" expect_contents)
+  check_json("${actual_contents}" "${expect_contents}")
+
+  file(READ "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/ninja-exports-private.dir/CXXDependInfo.json" actual_contents)
+  file(READ "${CMAKE_CURRENT_LIST_DIR}/expect/NinjaDependInfoExportFilesystemSafe-private.json" expect_contents)
+  check_json("${actual_contents}" "${expect_contents}")
+endif ()
+
+string(REPLACE ";" "\n  " RunCMake_TEST_FAILED "${RunCMake_TEST_FAILED}")
diff --git a/Tests/RunCMake/CXXModules/NinjaDependInfoExportFilesystemSafe.cmake b/Tests/RunCMake/CXXModules/NinjaDependInfoExportFilesystemSafe.cmake
new file mode 100644
index 0000000..890b5e4
--- /dev/null
+++ b/Tests/RunCMake/CXXModules/NinjaDependInfoExportFilesystemSafe.cmake
@@ -0,0 +1,84 @@
+# Fake out that we have dyndep; we only need to generate, not actually build
+# here.
+set(CMAKE_CXX_SCANDEP_SOURCE "")
+
+enable_language(CXX)
+
+if (NOT CMAKE_GENERATOR MATCHES "Ninja")
+  message(FATAL_ERROR
+    "This test requires a 'Ninja' generator to be used.")
+endif ()
+
+add_library(ninja-exports-public)
+target_sources(ninja-exports-public
+  PRIVATE
+    sources/module-impl.cxx
+    sources/module-internal-part-impl.cxx
+    sources/module-part-impl.cxx
+    sources/module-use.cxx
+  PUBLIC
+    FILE_SET modules TYPE CXX_MODULES
+    BASE_DIRS
+      "${CMAKE_CURRENT_SOURCE_DIR}/sources"
+    FILES
+      sources/module.cxx
+      sources/module-part.cxx
+    FILE_SET internal_partitions TYPE CXX_MODULES FILES
+      sources/module-internal-part.cxx)
+target_compile_features(ninja-exports-public
+  PRIVATE
+    cxx_std_20)
+set_property(TARGET ninja-exports-public
+  PROPERTY EXPORT_NAME "with::public_")
+
+install(TARGETS ninja-exports-public
+  EXPORT exp
+  FILE_SET modules
+    DESTINATION "lib/cxx"
+    COMPONENT "modules"
+  FILE_SET internal_partitions
+    DESTINATION "lib/cxx/internals"
+    COMPONENT "modules-internal")
+
+add_library(ninja-exports-private)
+target_sources(ninja-exports-private
+  PRIVATE
+    sources/module-impl.cxx
+    sources/module-internal-part-impl.cxx
+    sources/module-part-impl.cxx
+    sources/module-use.cxx
+  PRIVATE
+    FILE_SET modules TYPE CXX_MODULES
+    BASE_DIRS
+      "${CMAKE_CURRENT_SOURCE_DIR}/sources"
+    FILES
+      sources/module.cxx
+      sources/module-part.cxx
+    FILE_SET internal_partitions TYPE CXX_MODULES FILES
+      sources/module-internal-part.cxx)
+target_compile_features(ninja-exports-private
+  PRIVATE
+    cxx_std_20)
+set_property(TARGET ninja-exports-private
+  PROPERTY EXPORT_NAME "with::private_")
+
+install(TARGETS ninja-exports-private
+  EXPORT exp)
+
+# Test multiple build exports.
+export(EXPORT exp
+  FILE "${CMAKE_BINARY_DIR}/lib/cmake/export1/export1-targets.cmake"
+  NAMESPACE export1::
+  CXX_MODULES_DIRECTORY "cxx-modules")
+export(EXPORT exp
+  FILE "${CMAKE_BINARY_DIR}/lib/cmake/export2/export2-targets.cmake"
+  CXX_MODULES_DIRECTORY "cxx-modules")
+
+# Test multiple install exports.
+install(EXPORT exp
+  DESTINATION "lib/cmake/export1"
+  NAMESPACE export1::
+  CXX_MODULES_DIRECTORY "cxx-modules")
+install(EXPORT exp
+  DESTINATION "lib/cmake/export2"
+  CXX_MODULES_DIRECTORY "cxx-modules")
diff --git a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake
index 14829a1..9dd26e1 100644
--- a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake
+++ b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake
@@ -95,6 +95,7 @@ run_cmake(ExportInstallCxxModules)
 if (RunCMake_GENERATOR MATCHES "Ninja")
   run_cmake(NinjaDependInfoFileSet)
   run_cmake(NinjaDependInfoExport)
+  run_cmake(NinjaDependInfoExportFilesystemSafe)
   run_cmake(NinjaDependInfoBMIInstall)
   run_cmake(NinjaForceResponseFile) # issue#25367
 elseif (RunCMake_GENERATOR MATCHES "Visual Studio")
diff --git a/Tests/RunCMake/CXXModules/expect/NinjaDependInfoExport-private.json b/Tests/RunCMake/CXXModules/expect/NinjaDependInfoExport-private.json
index 61f8f64..71b2b66 100644
--- a/Tests/RunCMake/CXXModules/expect/NinjaDependInfoExport-private.json
+++ b/Tests/RunCMake/CXXModules/expect/NinjaDependInfoExport-private.json
@@ -43,6 +43,7 @@
       "destination" : "lib/cmake/export1",
       "export-name" : "with-private",
       "export-prefix" : "<BINARY_DIR>/CMakeFiles/Export/d2e2673818fd2bd8c45c0e3ed0e38fcd",
+      "filesystem-export-name" : "with-private",
       "install" : true,
       "namespace" : "export1::"
     },
@@ -51,6 +52,7 @@
       "destination" : "lib/cmake/export2",
       "export-name" : "with-private",
       "export-prefix" : "<BINARY_DIR>/CMakeFiles/Export/28cd47cb4c96ad5cadaa3fb1b0201ae8",
+      "filesystem-export-name" : "with-private",
       "install" : true,
       "namespace" : ""
     },
@@ -59,6 +61,7 @@
       "destination" : "<BINARY_DIR>/lib/cmake/export1",
       "export-name" : "with-private",
       "export-prefix" : "<BINARY_DIR>/lib/cmake/export1",
+      "filesystem-export-name" : "with-private",
       "install" : false,
       "namespace" : "export1::"
     },
@@ -67,6 +70,7 @@
       "destination" : "<BINARY_DIR>/lib/cmake/export2",
       "export-name" : "with-private",
       "export-prefix" : "<BINARY_DIR>/lib/cmake/export2",
+      "filesystem-export-name" : "with-private",
       "install" : false,
       "namespace" : ""
     }
diff --git a/Tests/RunCMake/CXXModules/expect/NinjaDependInfoExport-public.json b/Tests/RunCMake/CXXModules/expect/NinjaDependInfoExport-public.json
index d0263b0..a9cde99 100644
--- a/Tests/RunCMake/CXXModules/expect/NinjaDependInfoExport-public.json
+++ b/Tests/RunCMake/CXXModules/expect/NinjaDependInfoExport-public.json
@@ -43,6 +43,7 @@
       "destination" : "lib/cmake/export1",
       "export-name" : "with-public",
       "export-prefix" : "<BINARY_DIR>/CMakeFiles/Export/d2e2673818fd2bd8c45c0e3ed0e38fcd",
+      "filesystem-export-name" : "with-public",
       "install" : true,
       "namespace" : "export1::"
     },
@@ -51,6 +52,7 @@
       "destination" : "lib/cmake/export2",
       "export-name" : "with-public",
       "export-prefix" : "<BINARY_DIR>/CMakeFiles/Export/28cd47cb4c96ad5cadaa3fb1b0201ae8",
+      "filesystem-export-name" : "with-public",
       "install" : true,
       "namespace" : ""
     },
@@ -59,6 +61,7 @@
       "destination" : "<BINARY_DIR>/lib/cmake/export1",
       "export-name" : "with-public",
       "export-prefix" : "<BINARY_DIR>/lib/cmake/export1",
+      "filesystem-export-name" : "with-public",
       "install" : false,
       "namespace" : "export1::"
     },
@@ -67,6 +70,7 @@
       "destination" : "<BINARY_DIR>/lib/cmake/export2",
       "export-name" : "with-public",
       "export-prefix" : "<BINARY_DIR>/lib/cmake/export2",
+      "filesystem-export-name" : "with-public",
       "install" : false,
       "namespace" : ""
     }
diff --git a/Tests/RunCMake/CXXModules/expect/NinjaDependInfoExportFilesystemSafe-private.json b/Tests/RunCMake/CXXModules/expect/NinjaDependInfoExportFilesystemSafe-private.json
new file mode 100644
index 0000000..7905c53
--- /dev/null
+++ b/Tests/RunCMake/CXXModules/expect/NinjaDependInfoExportFilesystemSafe-private.json
@@ -0,0 +1,83 @@
+{
+  "bmi-installation": null,
+  "compiler-id": "<IGNORE>",
+  "compiler-frontend-variant": "<IGNORE>",
+  "compiler-simulate-id": "<IGNORE>",
+  "config": "<CONFIG>",
+  "cxx-modules": {
+    "CMakeFiles/ninja-exports-private.dir<CONFIG_DIR>/sources/module-internal-part.cxx<OBJEXT>": {
+      "bmi-only": false,
+      "destination": null,
+      "name": "internal_partitions",
+      "relative-directory": "sources",
+      "source": "<SOURCE_DIR>/sources/module-internal-part.cxx",
+      "type": "CXX_MODULES",
+      "visibility": "PRIVATE"
+    },
+    "CMakeFiles/ninja-exports-private.dir<CONFIG_DIR>/sources/module-part.cxx<OBJEXT>": {
+      "bmi-only": false,
+      "destination": null,
+      "name": "modules",
+      "relative-directory": "",
+      "source": "<SOURCE_DIR>/sources/module-part.cxx",
+      "type": "CXX_MODULES",
+      "visibility": "PRIVATE"
+    },
+    "CMakeFiles/ninja-exports-private.dir<CONFIG_DIR>/sources/module.cxx<OBJEXT>": {
+      "bmi-only": false,
+      "destination": null,
+      "name": "modules",
+      "relative-directory": "",
+      "source": "<SOURCE_DIR>/sources/module.cxx",
+      "type": "CXX_MODULES",
+      "visibility": "PRIVATE"
+    }
+  },
+  "dir-cur-bld": "<BINARY_DIR>",
+  "dir-cur-src": "<SOURCE_DIR>",
+  "dir-top-bld": "<BINARY_DIR>",
+  "dir-top-src": "<SOURCE_DIR>",
+  "exports": [
+    {
+      "cxx-module-info-dir" : "cxx-modules",
+      "destination" : "lib/cmake/export1",
+      "export-name" : "with::private_",
+      "export-prefix" : "<BINARY_DIR>/CMakeFiles/Export/d2e2673818fd2bd8c45c0e3ed0e38fcd",
+      "filesystem-export-name" : "with_c_cprivate__",
+      "install" : true,
+      "namespace" : "export1::"
+    },
+    {
+      "cxx-module-info-dir" : "cxx-modules",
+      "destination" : "lib/cmake/export2",
+      "export-name" : "with::private_",
+      "filesystem-export-name" : "with_c_cprivate__",
+      "export-prefix" : "<BINARY_DIR>/CMakeFiles/Export/28cd47cb4c96ad5cadaa3fb1b0201ae8",
+      "install" : true,
+      "namespace" : ""
+    },
+    {
+      "cxx-module-info-dir" : "cxx-modules",
+      "destination" : "<BINARY_DIR>/lib/cmake/export1",
+      "export-name" : "with::private_",
+      "export-prefix" : "<BINARY_DIR>/lib/cmake/export1",
+      "filesystem-export-name" : "with_c_cprivate__",
+      "install" : false,
+      "namespace" : "export1::"
+    },
+    {
+      "cxx-module-info-dir" : "cxx-modules",
+      "destination" : "<BINARY_DIR>/lib/cmake/export2",
+      "export-name" : "with::private_",
+      "export-prefix" : "<BINARY_DIR>/lib/cmake/export2",
+      "filesystem-export-name" : "with_c_cprivate__",
+      "install" : false,
+      "namespace" : ""
+    }
+  ],
+  "include-dirs": [],
+  "language": "CXX",
+  "forward-modules-from-target-dirs": [],
+  "linked-target-dirs": [],
+  "module-dir": "<BINARY_DIR>/CMakeFiles/ninja-exports-private.dir<CONFIG_DIR>"
+}
diff --git a/Tests/RunCMake/CXXModules/expect/NinjaDependInfoExportFilesystemSafe-public.json b/Tests/RunCMake/CXXModules/expect/NinjaDependInfoExportFilesystemSafe-public.json
new file mode 100644
index 0000000..1734590
--- /dev/null
+++ b/Tests/RunCMake/CXXModules/expect/NinjaDependInfoExportFilesystemSafe-public.json
@@ -0,0 +1,83 @@
+{
+  "bmi-installation": null,
+  "compiler-id": "<IGNORE>",
+  "compiler-frontend-variant": "<IGNORE>",
+  "compiler-simulate-id": "<IGNORE>",
+  "config": "<CONFIG>",
+  "cxx-modules": {
+    "CMakeFiles/ninja-exports-public.dir<CONFIG_DIR>/sources/module-internal-part.cxx<OBJEXT>": {
+      "bmi-only": false,
+      "destination": "lib/cxx/internals",
+      "name": "internal_partitions",
+      "relative-directory": "sources",
+      "source": "<SOURCE_DIR>/sources/module-internal-part.cxx",
+      "type": "CXX_MODULES",
+      "visibility": "PUBLIC"
+    },
+    "CMakeFiles/ninja-exports-public.dir<CONFIG_DIR>/sources/module-part.cxx<OBJEXT>": {
+      "bmi-only": false,
+      "destination": "lib/cxx",
+      "name": "modules",
+      "relative-directory": "",
+      "source": "<SOURCE_DIR>/sources/module-part.cxx",
+      "type": "CXX_MODULES",
+      "visibility": "PUBLIC"
+    },
+    "CMakeFiles/ninja-exports-public.dir<CONFIG_DIR>/sources/module.cxx<OBJEXT>": {
+      "bmi-only": false,
+      "destination": "lib/cxx",
+      "name": "modules",
+      "relative-directory": "",
+      "source": "<SOURCE_DIR>/sources/module.cxx",
+      "type": "CXX_MODULES",
+      "visibility": "PUBLIC"
+    }
+  },
+  "dir-cur-bld": "<BINARY_DIR>",
+  "dir-cur-src": "<SOURCE_DIR>",
+  "dir-top-bld": "<BINARY_DIR>",
+  "dir-top-src": "<SOURCE_DIR>",
+  "exports": [
+    {
+      "cxx-module-info-dir" : "cxx-modules",
+      "destination" : "lib/cmake/export1",
+      "export-name" : "with::public_",
+      "export-prefix" : "<BINARY_DIR>/CMakeFiles/Export/d2e2673818fd2bd8c45c0e3ed0e38fcd",
+      "filesystem-export-name" : "with_c_cpublic__",
+      "install" : true,
+      "namespace" : "export1::"
+    },
+    {
+      "cxx-module-info-dir" : "cxx-modules",
+      "destination" : "lib/cmake/export2",
+      "export-name" : "with::public_",
+      "export-prefix" : "<BINARY_DIR>/CMakeFiles/Export/28cd47cb4c96ad5cadaa3fb1b0201ae8",
+      "filesystem-export-name" : "with_c_cpublic__",
+      "install" : true,
+      "namespace" : ""
+    },
+    {
+      "cxx-module-info-dir" : "cxx-modules",
+      "destination" : "<BINARY_DIR>/lib/cmake/export1",
+      "export-name" : "with::public_",
+      "export-prefix" : "<BINARY_DIR>/lib/cmake/export1",
+      "filesystem-export-name" : "with_c_cpublic__",
+      "install" : false,
+      "namespace" : "export1::"
+    },
+    {
+      "cxx-module-info-dir" : "cxx-modules",
+      "destination" : "<BINARY_DIR>/lib/cmake/export2",
+      "export-name" : "with::public_",
+      "export-prefix" : "<BINARY_DIR>/lib/cmake/export2",
+      "filesystem-export-name" : "with_c_cpublic__",
+      "install" : false,
+      "namespace" : ""
+    }
+  ],
+  "include-dirs": [],
+  "language": "CXX",
+  "forward-modules-from-target-dirs": [],
+  "linked-target-dirs": [],
+  "module-dir": "<BINARY_DIR>/CMakeFiles/ninja-exports-public.dir<CONFIG_DIR>"
+}
-- 
cgit v0.12