mirror of
https://github.com/reactos/CMake.git
synced 2025-02-07 20:38:49 +00:00
cmVariableWatchCommand: Port away from FinalPass
This commit is contained in:
parent
360d415592
commit
fbee46e262
@ -3,6 +3,7 @@
|
||||
#include "cmVariableWatchCommand.h"
|
||||
|
||||
#include <sstream>
|
||||
#include <utility>
|
||||
|
||||
#include "cmExecutionStatus.h"
|
||||
#include "cmListFileCache.h"
|
||||
@ -84,15 +85,39 @@ static void deleteVariableWatchCallbackData(void* client_data)
|
||||
delete data;
|
||||
}
|
||||
|
||||
cmVariableWatchCommand::cmVariableWatchCommand() = default;
|
||||
|
||||
cmVariableWatchCommand::~cmVariableWatchCommand()
|
||||
/** This command does not really have a final pass but it needs to
|
||||
stay alive since it owns variable watch callback information. */
|
||||
class FinalAction
|
||||
{
|
||||
for (std::string const& wv : this->WatchedVariables) {
|
||||
this->Makefile->GetCMakeInstance()->GetVariableWatch()->RemoveWatch(
|
||||
wv, cmVariableWatchCommandVariableAccessed);
|
||||
public:
|
||||
FinalAction(cmMakefile* makefile, std::string variable)
|
||||
: Action(std::make_shared<Impl>(makefile, std::move(variable)))
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
void operator()(cmMakefile&) const {}
|
||||
|
||||
private:
|
||||
struct Impl
|
||||
{
|
||||
Impl(cmMakefile* makefile, std::string variable)
|
||||
: Makefile(makefile)
|
||||
, Variable(std::move(variable))
|
||||
{
|
||||
}
|
||||
|
||||
~Impl()
|
||||
{
|
||||
this->Makefile->GetCMakeInstance()->GetVariableWatch()->RemoveWatch(
|
||||
this->Variable, cmVariableWatchCommandVariableAccessed);
|
||||
}
|
||||
|
||||
cmMakefile* Makefile;
|
||||
std::string Variable;
|
||||
};
|
||||
|
||||
std::shared_ptr<Impl const> Action;
|
||||
};
|
||||
|
||||
bool cmVariableWatchCommand::InitialPass(std::vector<std::string> const& args,
|
||||
cmExecutionStatus&)
|
||||
@ -118,7 +143,6 @@ bool cmVariableWatchCommand::InitialPass(std::vector<std::string> const& args,
|
||||
data->InCallback = false;
|
||||
data->Command = command;
|
||||
|
||||
this->WatchedVariables.insert(variable);
|
||||
if (!this->Makefile->GetCMakeInstance()->GetVariableWatch()->AddWatch(
|
||||
variable, cmVariableWatchCommandVariableAccessed, data,
|
||||
deleteVariableWatchCallbackData)) {
|
||||
@ -126,5 +150,6 @@ bool cmVariableWatchCommand::InitialPass(std::vector<std::string> const& args,
|
||||
return false;
|
||||
}
|
||||
|
||||
this->Makefile->AddFinalAction(FinalAction(this->Makefile, variable));
|
||||
return true;
|
||||
}
|
||||
|
@ -5,7 +5,6 @@
|
||||
|
||||
#include "cmConfigure.h" // IWYU pragma: keep
|
||||
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
@ -30,25 +29,12 @@ public:
|
||||
return cm::make_unique<cmVariableWatchCommand>();
|
||||
}
|
||||
|
||||
//! Default constructor
|
||||
cmVariableWatchCommand();
|
||||
|
||||
//! Destructor.
|
||||
~cmVariableWatchCommand() override;
|
||||
|
||||
/**
|
||||
* This is called when the command is first encountered in
|
||||
* the CMakeLists.txt file.
|
||||
*/
|
||||
bool InitialPass(std::vector<std::string> const& args,
|
||||
cmExecutionStatus& status) override;
|
||||
|
||||
/** This command does not really have a final pass but it needs to
|
||||
stay alive since it owns variable watch callback information. */
|
||||
bool HasFinalPass() const override { return true; }
|
||||
|
||||
protected:
|
||||
std::set<std::string> WatchedVariables;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user