diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 0ff2158ba5..71a23f2b8f 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -61,6 +61,7 @@ #include "cmValue.h" #include "cmVersion.h" #include "cmWorkingDirectory.h" +#include "cmXcFramework.h" #include "cmake.h" #if !defined(CMAKE_BOOTSTRAP) @@ -2002,6 +2003,7 @@ void cmGlobalGenerator::ClearGeneratorMembers() this->ProjectMap.clear(); this->RuleHashes.clear(); this->DirectoryContentMap.clear(); + this->XcFrameworkPListContentMap.clear(); this->BinaryDirectories.clear(); this->GeneratedFiles.clear(); this->RuntimeDependencySets.clear(); @@ -3967,3 +3969,20 @@ bool cmGlobalGenerator::ShouldWarnExperimental(cm::string_view featureName, .emplace(cmStrCat(featureName, '-', featureUuid)) .second; } + +cm::optional cmGlobalGenerator::GetXcFrameworkPListContent( + std::string const& path) const +{ + cm::optional result; + auto i = this->XcFrameworkPListContentMap.find(path); + if (i != this->XcFrameworkPListContentMap.end()) { + result = i->second; + } + return result; +} + +void cmGlobalGenerator::SetXcFrameworkPListContent( + std::string const& path, cmXcFrameworkPlist const& content) +{ + this->XcFrameworkPListContentMap.emplace(path, content); +} diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index ad3d35039d..ddfcfa388d 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -32,6 +32,7 @@ #include "cmTarget.h" #include "cmTargetDepend.h" #include "cmValue.h" +#include "cmXcFramework.h" #if !defined(CMAKE_BOOTSTRAP) # include @@ -693,6 +694,11 @@ public: bool ShouldWarnExperimental(cm::string_view featureName, cm::string_view featureUuid); + cm::optional GetXcFrameworkPListContent( + std::string const& path) const; + void SetXcFrameworkPListContent(std::string const& path, + cmXcFrameworkPlist const& content); + protected: // for a project collect all its targets by following depend // information, and also collect all the targets @@ -914,6 +920,9 @@ private: }; std::map DirectoryContentMap; + // Cache parsed PList files + std::map XcFrameworkPListContentMap; + // Set of binary directories on disk. std::set BinaryDirectories; diff --git a/Source/cmXcFramework.cxx b/Source/cmXcFramework.cxx index a133aa4d17..2dbba9ea39 100644 --- a/Source/cmXcFramework.cxx +++ b/Source/cmXcFramework.cxx @@ -9,6 +9,7 @@ #include +#include "cmGlobalGenerator.h" #include "cmJSONHelpers.h" #include "cmJSONState.h" #include "cmMakefile.h" @@ -124,6 +125,12 @@ cm::optional cmParseXcFrameworkPlist( std::string const& xcframeworkPath, cmMakefile const& mf, cmListFileBacktrace const& bt) { + cmGlobalGenerator* gen = mf.GetGlobalGenerator(); + if (cm::optional cached = + gen->GetXcFrameworkPListContent(xcframeworkPath)) { + return cached; + } + std::string plistPath = cmStrCat(xcframeworkPath, "/Info.plist"); auto value = cmParsePlist(plistPath); @@ -162,6 +169,7 @@ cm::optional cmParseXcFrameworkPlist( return cm::nullopt; } plist.Path = plistPath; + gen->SetXcFrameworkPListContent(xcframeworkPath, plist); return cm::optional(plist); } diff --git a/Source/cmXcFramework.h b/Source/cmXcFramework.h index a54fb2909c..59835323f9 100644 --- a/Source/cmXcFramework.h +++ b/Source/cmXcFramework.h @@ -47,6 +47,10 @@ struct cmXcFrameworkPlist cmListFileBacktrace const& bt = cmListFileBacktrace{}) const; }; +/** + * Parses Plist file of .xcframework. + * Expects normalized path as input + */ cm::optional cmParseXcFrameworkPlist( std::string const& xcframeworkPath, cmMakefile const& mf, cmListFileBacktrace const& bt = cmListFileBacktrace{});