|
|
@@ -293,7 +293,7 @@ void cmGlobalNinjaGenerator::WriteCustomCommandBuild(
|
|
|
if (config.empty()) {
|
|
|
this->WriteBuild(*this->GetCommonFileStream(), build);
|
|
|
} else {
|
|
|
- this->WriteBuild(*this->GetConfigFileStream(config), build);
|
|
|
+ this->WriteBuild(*this->GetImplFileStream(config), build);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -324,7 +324,7 @@ void cmGlobalNinjaGenerator::WriteMacOSXContentBuild(std::string input,
|
|
|
cmNinjaBuild build("COPY_OSX_CONTENT");
|
|
|
build.Outputs.push_back(std::move(output));
|
|
|
build.ExplicitDeps.push_back(std::move(input));
|
|
|
- this->WriteBuild(*this->GetConfigFileStream(config), build);
|
|
|
+ this->WriteBuild(*this->GetImplFileStream(config), build);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -518,6 +518,7 @@ void cmGlobalNinjaGenerator::Generate()
|
|
|
if (cmSystemTools::GetErrorOccuredFlag()) {
|
|
|
this->RulesFileStream->setstate(std::ios::failbit);
|
|
|
for (auto const& config : this->Makefiles[0]->GetGeneratorConfigs()) {
|
|
|
+ this->GetImplFileStream(config)->setstate(std::ios::failbit);
|
|
|
this->GetConfigFileStream(config)->setstate(std::ios::failbit);
|
|
|
}
|
|
|
this->GetCommonFileStream()->setstate(std::ios::failbit);
|
|
|
@@ -527,10 +528,6 @@ void cmGlobalNinjaGenerator::Generate()
|
|
|
this->CloseRulesFileStream();
|
|
|
this->CloseBuildFileStreams();
|
|
|
|
|
|
- if (!this->WriteDefaultBuildFile()) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
auto run_ninja_tool = [this](std::vector<char const*> const& args) {
|
|
|
std::vector<std::string> command;
|
|
|
command.push_back(this->NinjaCommand);
|
|
|
@@ -1208,7 +1205,7 @@ void cmGlobalNinjaGenerator::WriteTargetAliases(std::ostream& os)
|
|
|
}
|
|
|
this->WriteBuild(this->EnableCrossConfigBuild()
|
|
|
? os
|
|
|
- : *this->GetConfigFileStream(ta.second.Config),
|
|
|
+ : *this->GetImplFileStream(ta.second.Config),
|
|
|
build);
|
|
|
}
|
|
|
|
|
|
@@ -1233,6 +1230,29 @@ void cmGlobalNinjaGenerator::WriteTargetAliases(std::ostream& os)
|
|
|
this->WriteBuild(*this->GetConfigFileStream(config), build);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ auto const* defaultConfig = this->GetDefaultBuildType();
|
|
|
+ if (defaultConfig) {
|
|
|
+ std::string config = defaultConfig;
|
|
|
+ for (auto const& ta : this->Configs[config].TargetAliases) {
|
|
|
+ // Don't write ambiguous aliases.
|
|
|
+ if (!ta.second.GeneratorTarget) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Don't write alias if there is a already a custom command with
|
|
|
+ // matching output
|
|
|
+ if (this->HasCustomCommandOutput(ta.first)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ build.Outputs.front() = ta.first;
|
|
|
+ build.ExplicitDeps.clear();
|
|
|
+ this->AppendTargetOutputs(ta.second.GeneratorTarget,
|
|
|
+ build.ExplicitDeps, config);
|
|
|
+ this->WriteBuild(*this->GetDefaultFileStream(), build);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1276,10 +1296,9 @@ void cmGlobalNinjaGenerator::WriteFolderTargets(std::ostream& os)
|
|
|
}
|
|
|
}
|
|
|
// Write target
|
|
|
- this->WriteBuild(this->EnableCrossConfigBuild()
|
|
|
- ? os
|
|
|
- : *this->GetConfigFileStream(config),
|
|
|
- build);
|
|
|
+ this->WriteBuild(
|
|
|
+ this->EnableCrossConfigBuild() ? os : *this->GetImplFileStream(config),
|
|
|
+ build);
|
|
|
}
|
|
|
|
|
|
// Add shortcut target
|
|
|
@@ -1291,6 +1310,16 @@ void cmGlobalNinjaGenerator::WriteFolderTargets(std::ostream& os)
|
|
|
this->ConvertToNinjaPath(currentBinaryDir + "/all");
|
|
|
this->WriteBuild(*this->GetConfigFileStream(config), build);
|
|
|
}
|
|
|
+
|
|
|
+ auto const* defaultConfig = this->GetDefaultBuildType();
|
|
|
+ if (defaultConfig) {
|
|
|
+ std::string config = defaultConfig;
|
|
|
+ build.ExplicitDeps = { this->BuildAlias(
|
|
|
+ this->ConvertToNinjaPath(currentBinaryDir + "/all"), config) };
|
|
|
+ build.Outputs.front() =
|
|
|
+ this->ConvertToNinjaPath(currentBinaryDir + "/all");
|
|
|
+ this->WriteBuild(*this->GetDefaultFileStream(), build);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Add target for all configs
|
|
|
@@ -1442,6 +1471,10 @@ void cmGlobalNinjaGenerator::WriteBuiltinTargets(std::ostream& os)
|
|
|
for (auto const& config : this->Makefiles[0]->GetGeneratorConfigs()) {
|
|
|
this->WriteTargetDefault(*this->GetConfigFileStream(config));
|
|
|
}
|
|
|
+
|
|
|
+ if (this->GetDefaultBuildType()) {
|
|
|
+ this->WriteTargetDefault(*this->GetDefaultFileStream());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void cmGlobalNinjaGenerator::WriteTargetDefault(std::ostream& os)
|
|
|
@@ -1734,9 +1767,10 @@ void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
|
|
|
}
|
|
|
if (this->IsMultiConfig()) {
|
|
|
build.Variables["FILE_ARG"] = cmStrCat(
|
|
|
- "-f ", cmGlobalNinjaMultiGenerator::GetNinjaFilename(fileConfig));
|
|
|
+ "-f ",
|
|
|
+ cmGlobalNinjaMultiGenerator::GetNinjaImplFilename(fileConfig));
|
|
|
}
|
|
|
- this->WriteBuild(*this->GetConfigFileStream(fileConfig), build);
|
|
|
+ this->WriteBuild(*this->GetImplFileStream(fileConfig), build);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1754,8 +1788,9 @@ void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
|
|
|
|
|
|
for (auto const& fileConfig : configs) {
|
|
|
build.Variables["FILE_ARG"] = cmStrCat(
|
|
|
- "-f ", cmGlobalNinjaMultiGenerator::GetNinjaFilename(fileConfig));
|
|
|
- this->WriteBuild(*this->GetConfigFileStream(fileConfig), build);
|
|
|
+ "-f ",
|
|
|
+ cmGlobalNinjaMultiGenerator::GetNinjaImplFilename(fileConfig));
|
|
|
+ this->WriteBuild(*this->GetImplFileStream(fileConfig), build);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -1771,6 +1806,14 @@ void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
|
|
|
this->NinjaOutputPath(this->GetCleanTargetName()), config);
|
|
|
this->WriteBuild(*this->GetConfigFileStream(config), build);
|
|
|
}
|
|
|
+
|
|
|
+ auto const* defaultConfig = this->GetDefaultBuildType();
|
|
|
+ if (defaultConfig) {
|
|
|
+ std::string config = defaultConfig;
|
|
|
+ build.ExplicitDeps.front() = this->BuildAlias(
|
|
|
+ this->NinjaOutputPath(this->GetCleanTargetName()), config);
|
|
|
+ this->WriteBuild(*this->GetDefaultFileStream(), build);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Write byproducts
|
|
|
@@ -2343,21 +2386,45 @@ bool cmGlobalNinjaMultiGenerator::OpenBuildFileStreams()
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ auto const* defaultConfig = this->GetDefaultBuildType();
|
|
|
+ if (defaultConfig) {
|
|
|
+ if (!this->OpenFileStream(this->DefaultFileStream, NINJA_BUILD_FILE)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ *this->DefaultFileStream
|
|
|
+ << "# This file is a convenience file generated by\n"
|
|
|
+ << "# CMAKE_NINJA_MULTI_DEFAULT_BUILD_TYPE.\n\n"
|
|
|
+ << "include " << GetNinjaImplFilename(defaultConfig) << "\n\n";
|
|
|
+ }
|
|
|
+
|
|
|
// Write a comment about this file.
|
|
|
*this->CommonFileStream
|
|
|
<< "# This file contains build statements common to all "
|
|
|
"configurations.\n\n";
|
|
|
|
|
|
for (auto const& config : this->Makefiles[0]->GetGeneratorConfigs()) {
|
|
|
- if (!this->OpenFileStream(this->ConfigFileStreams[config],
|
|
|
- GetNinjaFilename(config))) {
|
|
|
+ // Open impl file.
|
|
|
+ if (!this->OpenFileStream(this->ImplFileStreams[config],
|
|
|
+ GetNinjaImplFilename(config))) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
// Write a comment about this file.
|
|
|
- *this->ConfigFileStreams[config]
|
|
|
+ *this->ImplFileStreams[config]
|
|
|
<< "# This file contains build statements specific to the \"" << config
|
|
|
<< "\"\n# configuration.\n\n";
|
|
|
+
|
|
|
+ // Open config file.
|
|
|
+ if (!this->OpenFileStream(this->ConfigFileStreams[config],
|
|
|
+ GetNinjaConfigFilename(config))) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Write a comment about this file.
|
|
|
+ *this->ConfigFileStreams[config]
|
|
|
+ << "# This file contains aliases specific to the \"" << config
|
|
|
+ << "\"\n# configuration.\n\n"
|
|
|
+ << "include " << GetNinjaImplFilename(config) << "\n\n";
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
@@ -2371,7 +2438,17 @@ void cmGlobalNinjaMultiGenerator::CloseBuildFileStreams()
|
|
|
cmSystemTools::Error("Common file stream was not open.");
|
|
|
}
|
|
|
|
|
|
+ if (this->DefaultFileStream) {
|
|
|
+ this->DefaultFileStream.reset();
|
|
|
+ } // No error if it wasn't open
|
|
|
+
|
|
|
for (auto const& config : this->Makefiles[0]->GetGeneratorConfigs()) {
|
|
|
+ if (this->ImplFileStreams[config]) {
|
|
|
+ this->ImplFileStreams[config].reset();
|
|
|
+ } else {
|
|
|
+ cmSystemTools::Error(
|
|
|
+ cmStrCat("Impl file stream for \"", config, "\" was not open."));
|
|
|
+ }
|
|
|
if (this->ConfigFileStreams[config]) {
|
|
|
this->ConfigFileStreams[config].reset();
|
|
|
} else {
|
|
|
@@ -2385,10 +2462,17 @@ void cmGlobalNinjaMultiGenerator::AppendNinjaFileArgument(
|
|
|
GeneratedMakeCommand& command, const std::string& config) const
|
|
|
{
|
|
|
command.Add("-f");
|
|
|
- command.Add(GetNinjaFilename(config));
|
|
|
+ command.Add(GetNinjaConfigFilename(config));
|
|
|
+}
|
|
|
+
|
|
|
+std::string cmGlobalNinjaMultiGenerator::GetNinjaImplFilename(
|
|
|
+ const std::string& config)
|
|
|
+{
|
|
|
+ return cmStrCat("CMakeFiles/impl-", config,
|
|
|
+ cmGlobalNinjaMultiGenerator::NINJA_FILE_EXTENSION);
|
|
|
}
|
|
|
|
|
|
-std::string cmGlobalNinjaMultiGenerator::GetNinjaFilename(
|
|
|
+std::string cmGlobalNinjaMultiGenerator::GetNinjaConfigFilename(
|
|
|
const std::string& config)
|
|
|
{
|
|
|
return cmStrCat("build-", config,
|
|
|
@@ -2399,7 +2483,8 @@ void cmGlobalNinjaMultiGenerator::AddRebuildManifestOutputs(
|
|
|
cmNinjaDeps& outputs) const
|
|
|
{
|
|
|
for (auto const& config : this->Makefiles.front()->GetGeneratorConfigs()) {
|
|
|
- outputs.push_back(this->NinjaOutputPath(GetNinjaFilename(config)));
|
|
|
+ outputs.push_back(this->NinjaOutputPath(GetNinjaImplFilename(config)));
|
|
|
+ outputs.push_back(this->NinjaOutputPath(GetNinjaConfigFilename(config)));
|
|
|
}
|
|
|
if (this->Makefiles.front()->GetDefinition(
|
|
|
"CMAKE_NINJA_MULTI_DEFAULT_BUILD_TYPE")) {
|
|
|
@@ -2417,20 +2502,8 @@ void cmGlobalNinjaMultiGenerator::GetQtAutoGenConfigs(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-bool cmGlobalNinjaMultiGenerator::WriteDefaultBuildFile()
|
|
|
+const char* cmGlobalNinjaMultiGenerator::GetDefaultBuildType() const
|
|
|
{
|
|
|
- auto const* defaultConfig = this->Makefiles.front()->GetDefinition(
|
|
|
+ return this->Makefiles.front()->GetDefinition(
|
|
|
"CMAKE_NINJA_MULTI_DEFAULT_BUILD_TYPE");
|
|
|
- if (defaultConfig) {
|
|
|
- std::unique_ptr<cmGeneratedFileStream> defaultStream;
|
|
|
- if (!this->OpenFileStream(defaultStream, NINJA_BUILD_FILE)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
- *defaultStream << "# This file is a convenience file generated by\n"
|
|
|
- << "# CMAKE_NINJA_MULTI_DEFAULT_BUILD_TYPE.\n\n"
|
|
|
- << "include " << this->GetNinjaFilename(defaultConfig)
|
|
|
- << "\n";
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
}
|