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