From a74dad3bd3e5e4bbf09764a0b6bdedfe842442a7 Mon Sep 17 00:00:00 2001 From: Daniel Pfeifer Date: Wed, 28 Dec 2016 23:15:41 +0100 Subject: cmMakefile: decouple FinalAction from cmCommand --- Source/cmMakefile.cxx | 25 ++++++++++++++++++++++--- Source/cmMakefile.h | 13 ++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 501ea69..a350789 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -355,6 +355,20 @@ private: cmMakefile* Makefile; }; +class cmFinalPassAction +{ +public: + cmFinalPassAction(std::unique_ptr command) + : Command(std::move(command)) + { + } + + void operator()(cmMakefile&) { this->Command->FinalPass(); } + +private: + std::shared_ptr Command; +}; + bool cmMakefile::ExecuteCommand(const cmListFileFunction& lff, cmExecutionStatus& status) { @@ -417,7 +431,7 @@ bool cmMakefile::ExecuteCommand(const cmListFileFunction& lff, } } else if (pcmd->HasFinalPass()) { // use the command - this->FinalPassCommands.push_back(std::move(pcmd)); + this->AddFinalAction(cmFinalPassAction(std::move(pcmd))); } } } else { @@ -768,6 +782,11 @@ struct file_not_persistent }; } +void cmMakefile::AddFinalAction(FinalAction action) +{ + this->FinalActions.push_back(std::move(action)); +} + void cmMakefile::FinalPass() { // do all the variable expansions here @@ -775,8 +794,8 @@ void cmMakefile::FinalPass() // give all the commands a chance to do something // after the file has been parsed before generation - for (auto& command : this->FinalPassCommands) { - command->FinalPass(); + for (FinalAction& action : this->FinalActions) { + action(*this); } // go through all configured files and see which ones still exist. diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 1b4ead7..166a697 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -7,6 +7,7 @@ #include "cmsys/RegularExpression.hxx" #include +#include #include #include #include @@ -30,7 +31,6 @@ # include "cmSourceGroup.h" #endif -class cmCommand; class cmCompiledGeneratorExpression; class cmCustomCommandLines; class cmExecutionStatus; @@ -125,6 +125,13 @@ public: bool EnforceUniqueName(std::string const& name, std::string& msg, bool isCustom = false) const; + using FinalAction = std::function; + + /** + * Register an action that is executed during FinalPass + */ + void AddFinalAction(FinalAction action); + /** * Perform FinalPass, Library dependency analysis etc before output of the * makefile. @@ -132,7 +139,7 @@ public: void ConfigureFinalPass(); /** - * run the final pass on all commands. + * run all FinalActions. */ void FinalPass(); @@ -937,7 +944,7 @@ protected: size_t ObjectLibrariesSourceGroupIndex; #endif - std::vector> FinalPassCommands; + std::vector FinalActions; cmGlobalGenerator* GlobalGenerator; bool IsFunctionBlocked(const cmListFileFunction& lff, cmExecutionStatus& status); -- cgit v0.12