summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlapfelix <felix@lapal.me>2024-04-04 23:11:11 (GMT)
committerBrad King <brad.king@kitware.com>2024-04-10 18:33:57 (GMT)
commit1fa2ec1bbd357f3dbc17bd03e2b7f0c17507a38f (patch)
tree542f7747aa980cf2696a1c7005e7eae1e2504db1
parent1a315c55e3c934d1eead9842adaad66c0079ce5e (diff)
downloadCMake-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.cxx28
-rw-r--r--Source/cmGlobalXCodeGenerator.h1
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(