cmGeneratorTarget: Add method to collect all sources for all configs

Multi-config generators like VS and Xcode need to loop over all the
source files first and then handle per-config information within
each one.  Teach cmGeneratorTarget to provide such a view.
This commit is contained in:
Brad King 2017-04-10 16:41:03 -04:00
parent e155fba644
commit 40aa6c059c
2 changed files with 52 additions and 0 deletions

View File

@ -1069,6 +1069,43 @@ void cmGeneratorTarget::ComputeKindedSources(KindedSources& files,
}
}
std::vector<cmGeneratorTarget::AllConfigSource> const&
cmGeneratorTarget::GetAllConfigSources() const
{
if (this->AllConfigSources.empty()) {
this->ComputeAllConfigSources();
}
return this->AllConfigSources;
}
void cmGeneratorTarget::ComputeAllConfigSources() const
{
std::vector<std::string> configs;
this->Makefile->GetConfigurations(configs);
std::map<cmSourceFile const*, size_t> index;
for (size_t ci = 0; ci < configs.size(); ++ci) {
KindedSources const& sources = this->GetKindedSources(configs[ci]);
for (std::vector<cmGeneratorTarget::SourceAndKind>::const_iterator si =
sources.Sources.begin();
si != sources.Sources.end(); ++si) {
std::map<cmSourceFile const*, size_t>::iterator mi =
index.find(si->Source);
if (mi == index.end()) {
AllConfigSource acs;
acs.Source = si->Source;
acs.Kind = si->Kind;
this->AllConfigSources.push_back(acs);
std::map<cmSourceFile const*, size_t>::value_type entry(
si->Source, this->AllConfigSources.size() - 1);
mi = index.insert(entry).first;
}
this->AllConfigSources[mi->second].Configs.push_back(ci);
}
}
}
std::string cmGeneratorTarget::GetCompilePDBName(
const std::string& config) const
{

View File

@ -12,6 +12,7 @@
#include <map>
#include <set>
#include <stddef.h>
#include <string>
#include <utility>
#include <vector>
@ -107,6 +108,17 @@ public:
/** Get all sources needed for a configuration with kinds assigned. */
KindedSources const& GetKindedSources(std::string const& config) const;
struct AllConfigSource
{
cmSourceFile const* Source;
cmGeneratorTarget::SourceKind Kind;
std::vector<size_t> Configs;
};
/** Get all sources needed for all configurations with kinds and
per-source configurations assigned. */
std::vector<AllConfigSource> const& GetAllConfigSources() const;
void GetObjectSources(std::vector<cmSourceFile const*>&,
const std::string& config) const;
const std::string& GetObjectName(cmSourceFile const* file);
@ -731,6 +743,9 @@ private:
void ComputeKindedSources(KindedSources& files,
std::string const& config) const;
mutable std::vector<AllConfigSource> AllConfigSources;
void ComputeAllConfigSources() const;
std::vector<TargetPropertyEntry*> IncludeDirectoriesEntries;
std::vector<TargetPropertyEntry*> CompileOptionsEntries;
std::vector<TargetPropertyEntry*> CompileFeaturesEntries;