From 4452d41488d8ebd660f129aebb57a87c5dbb4caa Mon Sep 17 00:00:00 2001 From: Ben Boeckel 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 GetPropertyKeys() const; //! Might return a nullptr if the property is not set or invalid -- cgit v0.12