summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Boeckel <ben.boeckel@kitware.com>2024-04-29 17:23:08 -0400
committerBen Boeckel <ben.boeckel@kitware.com>2024-04-29 17:23:08 -0400
commit4452d41488d8ebd660f129aebb57a87c5dbb4caa (patch)
tree738ba46ecdc86e7be7c9c304d6836e86f2feabb1
parentb5602e7254c8ce4a6f732c017d784cd80559e5aa (diff)
downloadcmake-4452d41488d8ebd660f129aebb57a87c5dbb4caa.tar.gz
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
-rw-r--r--Source/cmGeneratorTarget.cxx10
-rw-r--r--Source/cmGeneratorTarget.h1
2 files changed, 11 insertions, 0 deletions
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index 94bb8e1295..5196e4e424 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 736aab0079..7cd7f431f7 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