Merge topic 'ninja-multi-cross-configs'

b7a2baf38c Ninja Multi-Config: Add variable to control configs used in cross-config build

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !4269
This commit is contained in:
Brad King
2020-01-24 20:02:13 +00:00
committed by Kitware Robot
21 changed files with 455 additions and 14 deletions
+52 -10
View File
@@ -1200,8 +1200,7 @@ void cmGlobalNinjaGenerator::WriteTargetAliases(std::ostream& os)
build.Outputs.front() = ta.first;
build.ExplicitDeps.clear();
if (ta.second.Config == "all") {
for (auto const& config :
ta.second.GeneratorTarget->Makefile->GetGeneratorConfigs()) {
for (auto const& config : this->GetCrossConfigs("")) {
this->AppendTargetOutputs(ta.second.GeneratorTarget,
build.ExplicitDeps, config);
}
@@ -1209,7 +1208,9 @@ void cmGlobalNinjaGenerator::WriteTargetAliases(std::ostream& os)
this->AppendTargetOutputs(ta.second.GeneratorTarget, build.ExplicitDeps,
ta.second.Config);
}
this->WriteBuild(this->EnableCrossConfigBuild()
this->WriteBuild(this->EnableCrossConfigBuild() &&
(ta.second.Config == "all" ||
this->GetCrossConfigs("").count(ta.second.Config))
? os
: *this->GetImplFileStream(ta.second.Config),
build);
@@ -1310,9 +1311,11 @@ void cmGlobalNinjaGenerator::WriteFolderTargets(std::ostream& os)
}
}
// Write target
this->WriteBuild(
this->EnableCrossConfigBuild() ? os : *this->GetImplFileStream(config),
build);
this->WriteBuild(this->EnableCrossConfigBuild() &&
this->GetCrossConfigs("").count(config)
? os
: *this->GetImplFileStream(config),
build);
}
// Add shortcut target
@@ -1339,7 +1342,7 @@ void cmGlobalNinjaGenerator::WriteFolderTargets(std::ostream& os)
// Add target for all configs
if (this->EnableCrossConfigBuild()) {
build.ExplicitDeps.clear();
for (auto const& config : configs) {
for (auto const& config : this->GetCrossConfigs("")) {
build.ExplicitDeps.push_back(this->BuildAlias(
this->ConvertToNinjaPath(currentBinaryDir + "/all"), config));
}
@@ -1794,11 +1797,19 @@ void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
build.ExplicitDeps.clear();
if (additionalFiles) {
build.ExplicitDeps.push_back(
this->NinjaOutputPath(this->GetAdditionalCleanTargetName()));
for (auto const& config : this->GetCrossConfigs("")) {
build.ExplicitDeps.push_back(this->BuildAlias(
this->NinjaOutputPath(this->GetAdditionalCleanTargetName()),
config));
}
}
build.Variables["TARGETS"] = "";
std::vector<std::string> byproducts;
for (auto const& config : this->GetCrossConfigs("")) {
byproducts.push_back(
this->BuildAlias(GetByproductsForCleanTargetName(), config));
}
build.Variables["TARGETS"] = cmJoin(byproducts, " ");
for (auto const& fileConfig : configs) {
build.Variables["FILE_ARG"] = cmStrCat(
@@ -2368,6 +2379,15 @@ void cmGlobalNinjaGenerator::AppendDirectoryForConfig(
}
}
std::set<std::string> cmGlobalNinjaGenerator::GetCrossConfigs(
const std::string& /*fileConfig*/) const
{
std::set<std::string> result;
result.insert(
this->Makefiles.front()->GetSafeDefinition("CMAKE_BUILD_TYPE"));
return result;
}
const char* cmGlobalNinjaMultiGenerator::NINJA_COMMON_FILE =
"CMakeFiles/common.ninja";
const char* cmGlobalNinjaMultiGenerator::NINJA_FILE_EXTENSION = ".ninja";
@@ -2534,3 +2554,25 @@ const char* cmGlobalNinjaMultiGenerator::GetDefaultBuildAlias() const
return this->GetDefaultBuildType();
}
std::set<std::string> cmGlobalNinjaMultiGenerator::GetCrossConfigs(
const std::string& fileConfig) const
{
std::vector<std::string> configs;
if (this->EnableCrossConfigBuild()) {
auto configsValue = this->Makefiles.front()->GetSafeDefinition(
"CMAKE_NINJA_MULTI_CROSS_CONFIGS");
if (!configsValue.empty()) {
cmExpandList(configsValue, configs);
} else {
configs = this->Makefiles.front()->GetGeneratorConfigs();
}
}
std::set<std::string> result(configs.cbegin(), configs.cend());
if (!fileConfig.empty()) {
result.insert(fileConfig);
}
return result;
}
+6
View File
@@ -412,6 +412,9 @@ public:
virtual const char* GetDefaultBuildAlias() const { return nullptr; }
virtual std::set<std::string> GetCrossConfigs(
const std::string& fileConfig) const;
protected:
void Generate() override;
@@ -623,6 +626,9 @@ public:
const char* GetDefaultBuildAlias() const override;
std::set<std::string> GetCrossConfigs(
const std::string& fileConfig) const override;
protected:
bool OpenBuildFileStreams() override;
void CloseBuildFileStreams() override;
+6 -4
View File
@@ -72,8 +72,9 @@ void cmNinjaNormalTargetGenerator::Generate(const std::string& config)
// Write the build statements
bool firstForConfig = true;
for (auto const& fileConfig : this->GetConfigNames()) {
if (fileConfig != config &&
!this->GetGlobalGenerator()->EnableCrossConfigBuild()) {
if (!this->GetGlobalGenerator()
->GetCrossConfigs(fileConfig)
.count(config)) {
continue;
}
this->WriteObjectBuildStatements(config, fileConfig, firstForConfig);
@@ -85,8 +86,9 @@ void cmNinjaNormalTargetGenerator::Generate(const std::string& config)
} else {
firstForConfig = true;
for (auto const& fileConfig : this->GetConfigNames()) {
if (fileConfig != config &&
!this->GetGlobalGenerator()->EnableCrossConfigBuild()) {
if (!this->GetGlobalGenerator()
->GetCrossConfigs(fileConfig)
.count(config)) {
continue;
}
// If this target has cuda language link inputs, and we need to do