diff options
author | Brad King <brad.king@kitware.com> | 2015-01-20 14:19:55 (GMT) |
---|---|---|
committer | CMake Topic Stage <kwrobot@kitware.com> | 2015-01-20 14:19:55 (GMT) |
commit | 4970ac3d5fe1b0bc3519753fe50e4397c074353e (patch) | |
tree | ca766158e80f5d808fa1858407ffab9754d9dc1b /Source | |
parent | cf17d41535962f4b94ac45a3d5870c59b63641d1 (diff) | |
parent | 9e0176e2b37b93f34718b6333edd73302b5c5350 (diff) | |
download | CMake-4970ac3d5fe1b0bc3519753fe50e4397c074353e.zip CMake-4970ac3d5fe1b0bc3519753fe50e4397c074353e.tar.gz CMake-4970ac3d5fe1b0bc3519753fe50e4397c074353e.tar.bz2 |
Merge topic 'xcode-target-sort'
9e0176e2 Xcode: Sort targets deterministically and with ALL_BUILD first (#15346)
c0ff542c Xcode: Fix early termination on per-config source file error
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmGlobalXCodeGenerator.cxx | 62 | ||||
-rw-r--r-- | Source/cmGlobalXCodeGenerator.h | 6 |
2 files changed, 54 insertions, 14 deletions
diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 8831a8b..b6c428b 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -969,16 +969,40 @@ struct cmSourceFilePathCompare }; //---------------------------------------------------------------------------- -void +struct cmCompareTargets +{ + bool operator () (std::string const& a, std::string const& b) const + { + if (a == "ALL_BUILD") + { + return true; + } + if (b == "ALL_BUILD") + { + return false; + } + return strcmp(a.c_str(), b.c_str()) < 0; + } +}; + +//---------------------------------------------------------------------------- +bool cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen, std::vector<cmXCodeObject*>& targets) { this->SetCurrentLocalGenerator(gen); cmTargets &tgts = this->CurrentMakefile->GetTargets(); + typedef std::map<std::string, cmTarget*, cmCompareTargets> cmSortedTargets; + cmSortedTargets sortedTargets; for(cmTargets::iterator l = tgts.begin(); l != tgts.end(); l++) { - cmTarget& cmtarget = l->second; + sortedTargets[l->first] = &l->second; + } + for(cmSortedTargets::iterator l = sortedTargets.begin(); + l != sortedTargets.end(); l++) + { + cmTarget& cmtarget = *l->second; cmGeneratorTarget* gtgt = this->GetGeneratorTarget(&cmtarget); // make sure ALL_BUILD, INSTALL, etc are only done once @@ -995,7 +1019,12 @@ cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen, if(cmtarget.GetType() == cmTarget::UTILITY || cmtarget.GetType() == cmTarget::GLOBAL_TARGET) { - targets.push_back(this->CreateUtilityTarget(cmtarget)); + cmXCodeObject* t = this->CreateUtilityTarget(cmtarget); + if (!t) + { + return false; + } + targets.push_back(t); continue; } @@ -1003,7 +1032,7 @@ cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen, std::vector<cmSourceFile*> classes; if (!cmtarget.GetConfigCommonSourceFiles(classes)) { - return; + return false; } std::sort(classes.begin(), classes.end(), cmSourceFilePathCompare()); @@ -1230,6 +1259,7 @@ cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen, targets.push_back(this->CreateXCodeTarget(cmtarget, buildPhases)); } + return true; } //---------------------------------------------------------------------------- @@ -2906,7 +2936,7 @@ void cmGlobalXCodeGenerator } //---------------------------------------------------------------------------- -void cmGlobalXCodeGenerator::CreateGroups(cmLocalGenerator* root, +bool cmGlobalXCodeGenerator::CreateGroups(cmLocalGenerator* root, std::vector<cmLocalGenerator*>& generators) { @@ -2949,7 +2979,7 @@ void cmGlobalXCodeGenerator::CreateGroups(cmLocalGenerator* root, std::vector<cmSourceFile*> classes; if (!cmtarget.GetConfigCommonSourceFiles(classes)) { - return; + return false; } // Put cmSourceFile instances in proper groups: for(std::vector<cmSourceFile*>::const_iterator s = classes.begin(); @@ -2982,6 +3012,7 @@ void cmGlobalXCodeGenerator::CreateGroups(cmLocalGenerator* root, } } } + return true; } cmXCodeObject *cmGlobalXCodeGenerator @@ -3102,7 +3133,7 @@ cmXCodeObject* cmGlobalXCodeGenerator } //---------------------------------------------------------------------------- -void cmGlobalXCodeGenerator +bool cmGlobalXCodeGenerator ::CreateXCodeObjects(cmLocalGenerator* root, std::vector<cmLocalGenerator*>& generators) @@ -3183,7 +3214,10 @@ void cmGlobalXCodeGenerator this->MainGroupChildren->AddObject(resourcesGroup); // now create the cmake groups - this->CreateGroups(root, generators); + if (!this->CreateGroups(root, generators)) + { + return false; + } cmXCodeObject* productGroup = this->CreateObject(cmXCodeObject::PBXGroup); productGroup->AddAttribute("name", this->CreateString("Products")); @@ -3383,7 +3417,10 @@ void cmGlobalXCodeGenerator { if(!this->IsExcluded(root, *i)) { - this->CreateXCodeTargets(*i, targets); + if (!this->CreateXCodeTargets(*i, targets)) + { + return false; + } } } // loop over all targets and add link and depend info @@ -3412,6 +3449,7 @@ void cmGlobalXCodeGenerator } } this->RootObject->AddAttribute("targets", allTargets); + return true; } //---------------------------------------------------------------------------- @@ -3598,8 +3636,10 @@ cmGlobalXCodeGenerator::OutputXCodeProject(cmLocalGenerator* root, } } - this->CreateXCodeObjects(root, - generators); + if (!this->CreateXCodeObjects(root, generators)) + { + return; + } std::string xcodeDir = root->GetMakefile()->GetStartOutputDirectory(); xcodeDir += "/"; xcodeDir += root->GetMakefile()->GetProjectName(); diff --git a/Source/cmGlobalXCodeGenerator.h b/Source/cmGlobalXCodeGenerator.h index f38435e..a39c8c7 100644 --- a/Source/cmGlobalXCodeGenerator.h +++ b/Source/cmGlobalXCodeGenerator.h @@ -91,7 +91,7 @@ private: cmSourceGroup* sg); cmXCodeObject* CreatePBXGroup(cmXCodeObject *parent, std::string name); - void CreateGroups(cmLocalGenerator* root, + bool CreateGroups(cmLocalGenerator* root, std::vector<cmLocalGenerator*>& generators); std::string XCodeEscapePath(const char* p); @@ -150,7 +150,7 @@ private: std::string ExtractFlag(const char* flag, std::string& flags); // delete all objects in the this->XCodeObjects vector. void ClearXCodeObjects(); - void CreateXCodeObjects(cmLocalGenerator* root, + bool CreateXCodeObjects(cmLocalGenerator* root, std::vector<cmLocalGenerator*>& generators); void OutputXCodeProject(cmLocalGenerator* root, std::vector<cmLocalGenerator*>& generators); @@ -169,7 +169,7 @@ private: cmXCodeObject* CreateXCodeSourceFile(cmLocalGenerator* gen, cmSourceFile* sf, cmTarget& cmtarget); - void CreateXCodeTargets(cmLocalGenerator* gen, + bool CreateXCodeTargets(cmLocalGenerator* gen, std::vector<cmXCodeObject*>&); bool IsHeaderFile(cmSourceFile*); void AddDependTarget(cmXCodeObject* target, |