diff options
author | lapfelix <felix@lapal.me> | 2024-04-04 23:11:11 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2024-04-10 18:33:57 (GMT) |
commit | 1fa2ec1bbd357f3dbc17bd03e2b7f0c17507a38f (patch) | |
tree | 542f7747aa980cf2696a1c7005e7eae1e2504db1 | |
parent | 1a315c55e3c934d1eead9842adaad66c0079ce5e (diff) | |
download | CMake-1fa2ec1bbd357f3dbc17bd03e2b7f0c17507a38f.zip CMake-1fa2ec1bbd357f3dbc17bd03e2b7f0c17507a38f.tar.gz CMake-1fa2ec1bbd357f3dbc17bd03e2b7f0c17507a38f.tar.bz2 |
Xcode: Use deterministic object ids for targets
When a CMake-generated Xcode project is included in another Xcode project,
the used targets' object ids are kept as `remoteGlobalIDString`.
Make the ids deterministic and somewhat independent of the build
tree location.
-rw-r--r-- | Source/cmGlobalXCodeGenerator.cxx | 28 | ||||
-rw-r--r-- | Source/cmGlobalXCodeGenerator.h | 1 |
2 files changed, 26 insertions, 3 deletions
diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 8462a1a..7dd5ffa 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -3115,8 +3115,12 @@ cmXCodeObject* cmGlobalXCodeGenerator::CreateUtilityTarget( "shellScript", this->CreateString("# shell script goes here\nexit 0")); shellBuildPhase->AddAttribute("showEnvVarsInLog", this->CreateString("0")); - cmXCodeObject* target = - this->CreateObject(cmXCodeObject::PBXAggregateTarget); + std::string targetBinaryPath = cmStrCat( + gtgt->Makefile->GetCurrentBinaryDirectory(), '/', gtgt->GetName()); + + cmXCodeObject* target = this->CreateObject( + cmXCodeObject::PBXAggregateTarget, + cmStrCat("PBXAggregateTarget:", gtgt->GetName(), ":", targetBinaryPath)); target->SetComment(gtgt->GetName()); cmXCodeObject* buildPhases = this->CreateObject(cmXCodeObject::OBJECT_LIST); std::vector<cmXCodeObject*> emptyContentVector; @@ -3340,7 +3344,14 @@ cmXCodeObject* cmGlobalXCodeGenerator::CreateXCodeTarget( if (!gtgt->IsInBuildSystem()) { return nullptr; } - cmXCodeObject* target = this->CreateObject(cmXCodeObject::PBXNativeTarget); + + std::string targetBinaryPath = this->RelativeToRootBinary(cmStrCat( + gtgt->Makefile->GetCurrentBinaryDirectory(), '/', gtgt->GetName())); + + cmXCodeObject* target = this->CreateObject( + cmXCodeObject::PBXNativeTarget, + cmStrCat("PBXNativeTarget:", gtgt->GetName(), ":", targetBinaryPath)); + target->AddAttribute("buildPhases", buildPhases); cmXCodeObject* buildRules = this->CreateObject(cmXCodeObject::OBJECT_LIST); target->AddAttribute("buildRules", buildRules); @@ -5130,6 +5141,17 @@ std::string cmGlobalXCodeGenerator::RelativeToSource(const std::string& p) return p; } +std::string cmGlobalXCodeGenerator::RelativeToRootBinary(const std::string& p) +{ + std::string binaryDirectory = + this->CurrentRootGenerator->GetCurrentBinaryDirectory(); + if (cmSystemTools::IsSubDirectory(p, binaryDirectory)) { + binaryDirectory = cmSystemTools::ForceToRelativePath(binaryDirectory, p); + } + + return binaryDirectory; +} + std::string cmGlobalXCodeGenerator::RelativeToBinary(const std::string& p) { return this->CurrentRootGenerator->MaybeRelativeToCurBinDir(p); diff --git a/Source/cmGlobalXCodeGenerator.h b/Source/cmGlobalXCodeGenerator.h index 12a5cad..2375e95 100644 --- a/Source/cmGlobalXCodeGenerator.h +++ b/Source/cmGlobalXCodeGenerator.h @@ -161,6 +161,7 @@ private: bool CreateGroups(std::vector<cmLocalGenerator*>& generators); std::string XCodeEscapePath(const std::string& p); std::string RelativeToSource(const std::string& p); + std::string RelativeToRootBinary(const std::string& p); std::string RelativeToBinary(const std::string& p); std::string ConvertToRelativeForMake(std::string const& p); void CreateCustomCommands( |