diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index 707e4373fb..eb1bf9c703 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx @@ -18,6 +18,7 @@ #include "cmCustomCommand.h" // IWYU pragma: keep #include "cmCustomCommandGenerator.h" #include "cmGeneratedFileStream.h" +#include "cmGeneratorExpression.h" #include "cmGeneratorOptions.h" #include "cmGeneratorTarget.h" #include "cmGlobalNinjaGenerator.h" @@ -446,8 +447,10 @@ void cmNinjaNormalTargetGenerator::WriteDeviceLinkRules( this->GetGlobalGenerator()->AddRule(rule); } -void cmNinjaNormalTargetGenerator::WriteLinkRule(bool useResponseFile, - std::string const& config) +void cmNinjaNormalTargetGenerator::WriteLinkRule( + bool useResponseFile, std::string const& config, + std::vector const& preLinkComments, + std::vector const& postBuildComments) { cmStateEnums::TargetType targetType = this->GetGeneratorTarget()->GetType(); @@ -604,9 +607,19 @@ void cmNinjaNormalTargetGenerator::WriteLinkRule(bool useResponseFile, rule.Comment = cmStrCat("Rule for linking ", this->TargetLinkLanguage(config), ' ', this->GetVisibleTypeName(), '.'); - rule.Description = - cmStrCat("Linking ", this->TargetLinkLanguage(config), ' ', - this->GetVisibleTypeName(), " $TARGET_FILE"); + char const* presep = ""; + char const* postsep = ""; + auto prelink = cmJoin(preLinkComments, "; "); + if (!prelink.empty()) { + presep = "; "; + } + auto postbuild = cmJoin(postBuildComments, "; "); + if (!postbuild.empty()) { + postsep = "; "; + } + rule.Description = cmStrCat( + prelink, presep, "Linking ", this->TargetLinkLanguage(config), ' ', + this->GetVisibleTypeName(), " $TARGET_FILE", postsep, postbuild); rule.Restat = "$RESTAT"; this->GetGlobalGenerator()->AddRule(rule); } @@ -1398,12 +1411,19 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement( >->GetPostBuildCommands() }; + std::vector preLinkComments; + std::vector postBuildComments; + std::vector preLinkCmdLines; std::vector postBuildCmdLines; + std::vector* cmdComments[3] = { &preLinkComments, + &preLinkComments, + &postBuildComments }; std::vector* cmdLineLists[3] = { &preLinkCmdLines, &preLinkCmdLines, &postBuildCmdLines }; + cmGeneratorExpression ge(*this->GetLocalGenerator()->GetCMakeInstance()); for (unsigned i = 0; i != 3; ++i) { for (cmCustomCommand const& cc : *cmdLists[i]) { @@ -1413,6 +1433,11 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement( cmCustomCommandGenerator ccg(cc, fileConfig, this->GetLocalGenerator(), true, config); localGen.AppendCustomCommandLines(ccg, *cmdLineLists[i]); + if (cc.GetComment()) { + auto cge = ge.Parse(cc.GetComment()); + cmdComments[i]->emplace_back( + cge->Evaluate(this->GetLocalGenerator(), config)); + } std::vector const& ccByproducts = ccg.GetByproducts(); byproducts.Add(ccByproducts); std::transform( @@ -1566,7 +1591,8 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement( bool usedResponseFile = false; globalGen->WriteBuild(this->GetImplFileStream(fileConfig), linkBuild, commandLineLengthLimit, &usedResponseFile); - this->WriteLinkRule(usedResponseFile, config); + this->WriteLinkRule(usedResponseFile, config, preLinkComments, + postBuildComments); if (symlinkNeeded) { if (targetType == cmStateEnums::EXECUTABLE) { diff --git a/Source/cmNinjaNormalTargetGenerator.h b/Source/cmNinjaNormalTargetGenerator.h index a0193e7205..013e95c16d 100644 --- a/Source/cmNinjaNormalTargetGenerator.h +++ b/Source/cmNinjaNormalTargetGenerator.h @@ -30,7 +30,9 @@ private: char const* GetVisibleTypeName() const; void WriteLanguagesRules(std::string const& config); - void WriteLinkRule(bool useResponseFile, std::string const& config); + void WriteLinkRule(bool useResponseFile, std::string const& config, + std::vector const& preLinkComments, + std::vector const& postBuildComments); void WriteDeviceLinkRules(std::string const& config); void WriteNvidiaDeviceLinkRule(bool useResponseFile, std::string const& config);