diff options
author | Brad King <brad.king@kitware.com> | 2018-07-19 11:54:29 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2018-07-19 17:20:28 (GMT) |
commit | 30e27b4110072c1e3ad0492f8115a52ff33f1c37 (patch) | |
tree | 98be54bc1d82ce734edb7a001dca808dc6f3f9fa /Source/cmGlobalXCodeGenerator.cxx | |
parent | e3469a5920b9b4c3175a3acec179492d4387890f (diff) | |
download | CMake-30e27b4110072c1e3ad0492f8115a52ff33f1c37.zip CMake-30e27b4110072c1e3ad0492f8115a52ff33f1c37.tar.gz CMake-30e27b4110072c1e3ad0492f8115a52ff33f1c37.tar.bz2 |
Xcode: Compute global order index for targets
Compute an index for each target in a global ordering such that no
target comes before its dependencies.
Diffstat (limited to 'Source/cmGlobalXCodeGenerator.cxx')
-rw-r--r-- | Source/cmGlobalXCodeGenerator.cxx | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index ca73552..0c59374 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -386,12 +386,46 @@ void cmGlobalXCodeGenerator::AddExtraIDETargets() } } +void cmGlobalXCodeGenerator::ComputeTargetOrder() +{ + size_t index = 0; + auto const& lgens = this->GetLocalGenerators(); + for (cmLocalGenerator* lgen : lgens) { + auto const& targets = lgen->GetGeneratorTargets(); + for (cmGeneratorTarget const* gt : targets) { + this->ComputeTargetOrder(gt, index); + } + } + assert(index == this->TargetOrderIndex.size()); +} + +void cmGlobalXCodeGenerator::ComputeTargetOrder(cmGeneratorTarget const* gt, + size_t& index) +{ + std::map<cmGeneratorTarget const*, size_t>::value_type value(gt, 0); + auto insertion = this->TargetOrderIndex.insert(value); + if (!insertion.second) { + return; + } + auto entry = insertion.first; + + auto& deps = this->GetTargetDirectDepends(gt); + for (auto& d : deps) { + this->ComputeTargetOrder(d, index); + } + + entry->second = index++; +} + void cmGlobalXCodeGenerator::Generate() { this->cmGlobalGenerator::Generate(); if (cmSystemTools::GetErrorOccuredFlag()) { return; } + + this->ComputeTargetOrder(); + for (auto keyVal : this->ProjectMap) { cmLocalGenerator* root = keyVal.second[0]; |