Commit 829f8382 authored by Andy Cedilnik's avatar Andy Cedilnik
Browse files

Add option of watching variables

parent 4d6dba4c
......@@ -20,6 +20,7 @@ cmGlobalGenerator.cxx
cmGlobalUnixMakefileGenerator.cxx
cmLocalGenerator.cxx
cmLocalUnixMakefileGenerator.cxx
cmVariableWatch.cxx
cmake.h
cmakewizard.h
cmMakeDepend.h
......@@ -39,6 +40,7 @@ cmGlobalGenerator.h
cmGlobalUnixMakefileGenerator.h
cmLocalGenerator.h
cmLocalUnixMakefileGenerator.h
cmVariableWatch.h
)
# configure the .h file
......
......@@ -32,6 +32,7 @@ cmTarget.o \
cmCustomCommand.o \
cmCacheManager.o \
cmListFileCache.o \
cmVariableWatch.o \
cmSourceGroup.o
DEPENDS = cmConfigure.h @CMAKE_ROOT_DIR@/Source/*.h
......@@ -56,6 +57,7 @@ cmCommands.o : $(DEPENDS) $(srcdir)/*Command*.cxx
cmTarget.o : $(DEPENDS)
cmCacheManager.o : $(DEPENDS)
cmSourceGroup.o : $(DEPENDS)
cmVariableWatch.o : $(DEPENDS)
cmake: ${OBJS}
......
......@@ -26,6 +26,7 @@
#include "cmCacheManager.h"
#include "cmFunctionBlocker.h"
#include "cmListFileCache.h"
#include "cmVariableWatch.h"
#include "cmake.h"
#include <stdio.h> // required for sprintf
......@@ -558,6 +559,11 @@ void cmMakefile::AddDefinition(const char* name, const char* value)
}
m_Definitions.erase( DefinitionMap::key_type(name));
m_Definitions.insert(DefinitionMap::value_type(name, value));
cmVariableWatch* vv = this->GetVariableWatch();
if ( vv )
{
vv->VariableAccessed(name, cmVariableWatch::VARIABLE_MODIFIED_ACCESS);
}
}
......@@ -582,6 +588,11 @@ void cmMakefile::AddDefinition(const char* name, bool value)
m_Definitions.erase( DefinitionMap::key_type(name));
m_Definitions.insert(DefinitionMap::value_type(name, "OFF"));
}
cmVariableWatch* vv = this->GetVariableWatch();
if ( vv )
{
vv->VariableAccessed(name, cmVariableWatch::VARIABLE_MODIFIED_ACCESS);
}
}
......@@ -594,6 +605,11 @@ void cmMakefile::AddCacheDefinition(const char* name, bool value, const char* do
void cmMakefile::RemoveDefinition(const char* name)
{
m_Definitions.erase(DefinitionMap::key_type(name));
cmVariableWatch* vv = this->GetVariableWatch();
if ( vv )
{
vv->VariableAccessed(name, cmVariableWatch::VARIABLE_REMOVED_ACCESS);
}
}
void cmMakefile::SetProjectName(const char* p)
......@@ -860,7 +876,7 @@ std::string cmMakefile::GetParentListFileName(const char *currentFileName)
void cmMakefile::ExpandVariables()
{
// Now expand varibles in the include and link strings
// Now expand variables in the include and link strings
for(std::vector<std::string>::iterator d = m_IncludeDirectories.begin();
d != m_IncludeDirectories.end(); ++d)
{
......@@ -886,12 +902,29 @@ bool cmMakefile::IsOn(const char* name) const
const char* cmMakefile::GetDefinition(const char* name) const
{
const char* def = 0;
DefinitionMap::const_iterator pos = m_Definitions.find(name);
if(pos != m_Definitions.end())
{
return (*pos).second.c_str();
def = (*pos).second.c_str();
}
else
{
def = this->GetCacheManager()->GetCacheValue(name);
}
return this->GetCacheManager()->GetCacheValue(name);
cmVariableWatch* vv = this->GetVariableWatch();
if ( vv )
{
if ( def )
{
vv->VariableAccessed(name, cmVariableWatch::VARIABLE_READ_ACCESS);
}
else
{
vv->VariableAccessed(name, cmVariableWatch::UNKNOWN_VARIABLE_READ_ACCESS);
}
}
return def;
}
......@@ -1430,6 +1463,25 @@ int cmMakefile::TryCompile(const char *srcdir, const char *bindir,
return ret;
}
cmake *cmMakefile::GetCMakeInstance() const
{
if ( m_LocalGenerator && m_LocalGenerator->GetGlobalGenerator() )
{
return m_LocalGenerator->GetGlobalGenerator()->GetCMakeInstance();
}
return 0;
}
cmVariableWatch *cmMakefile::GetVariableWatch() const
{
if ( this->GetCMakeInstance() &&
this->GetCMakeInstance()->GetVariableWatch() )
{
return this->GetCMakeInstance()->GetVariableWatch();
}
return 0;
}
cmCacheManager *cmMakefile::GetCacheManager() const
{
return m_LocalGenerator->GetGlobalGenerator()->GetCMakeInstance()->GetCacheManager();
......
......@@ -30,6 +30,7 @@ class cmCommand;
class cmLocalGenerator;
class cmMakeDepend;
class cmSourceFile;
class cmVariableWatch;
/** \class cmMakefile
* \brief Process the input CMakeLists.txt file.
......@@ -531,6 +532,8 @@ public:
* given a current CMakeLists file name
*/
cmCacheManager *GetCacheManager() const;
cmake *GetCMakeInstance() const;
cmVariableWatch* GetVariableWatch() const;
//! Determine wether this is a local or global build.
bool GetLocal() const;
......
/*=========================================================================
Program: CMake - Cross-Platform Makefile Generator
Module: $RCSfile$
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#include "cmVariableWatch.h"
cmVariableWatch::cmVariableWatch()
{
}
cmVariableWatch::~cmVariableWatch()
{
}
void cmVariableWatch::AddWatch(const std::string& variable,
WatchMethod method, void* client_data /*=0*/)
{
cmVariableWatch::Pair p;
p.m_Method = method;
p.m_ClientData = client_data;
cmVariableWatch::VectorOfPairs* vp = &m_WatchMap[variable];
cmVariableWatch::VectorOfPairs::size_type cc;
for ( cc = 0; cc < vp->size(); cc ++ )
{
cmVariableWatch::Pair* pair = &(*vp)[cc];
if ( pair->m_Method == method )
{
(*vp)[cc] = p;
return;
}
}
vp->push_back(p);
}
void cmVariableWatch::VariableAccessed(const std::string& variable, int access_type) const
{
cmVariableWatch::StringToVectorOfPairs::const_iterator mit = m_WatchMap.find(variable);
if ( mit != m_WatchMap.end() )
{
const cmVariableWatch::VectorOfPairs* vp = &mit->second;
cmVariableWatch::VectorOfPairs::const_iterator it;
for ( it = vp->begin(); it != vp->end(); it ++ )
{
it->m_Method(variable, access_type, it->m_ClientData);
}
}
}
/*=========================================================================
Program: CMake - Cross-Platform Makefile Generator
Module: $RCSfile$
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef cmVariableWatch_h
#define cmVariableWatch_h
#include "cmStandardIncludes.h"
/** \class cmVariableWatch
* \brief Helper class for watching of variable accesses.
*
* Calls function when variable is accessed
*/
class cmVariableWatch
{
public:
typedef void (WatchMethod)(const std::string& variable, int access_type, void* client_data);
cmVariableWatch();
~cmVariableWatch();
/**
* Add watch to the variable
*/
void AddWatch(const std::string& variable, WatchMethod method, void* client_data=0);
/**
* This method is called when variable is accessed
*/
void VariableAccessed(const std::string& variable, int access_type) const;
/**
* Different access types.
*/
enum
{
VARIABLE_READ_ACCESS,
UNKNOWN_VARIABLE_READ_ACCESS,
VARIABLE_MODIFIED_ACCESS,
VARIABLE_REMOVED_ACCESS,
NO_ACCESS
};
protected:
struct Pair
{
WatchMethod* m_Method;
void* m_ClientData;
Pair() : m_Method(0), m_ClientData(0) {}
};
typedef std::vector< Pair > VectorOfPairs;
typedef std::map<std::string, VectorOfPairs > StringToVectorOfPairs;
StringToVectorOfPairs m_WatchMap;
};
#endif
......@@ -21,6 +21,7 @@
#include "cmLocalGenerator.h"
#include "cmCommands.h"
#include "cmCommand.h"
#include "cmVariableWatch.h"
// include the generator
#if defined(_WIN32) && !defined(__CYGWIN__)
......@@ -62,6 +63,7 @@ cmake::cmake()
m_GlobalGenerator = 0;
m_ProgressCallback = 0;
m_ProgressCallbackClientData = 0;
m_VariableWatch = new cmVariableWatch;
this->AddDefaultCommands();
}
......@@ -79,6 +81,7 @@ cmake::~cmake()
{
delete (*j).second;
}
delete m_VariableWatch;
}
bool cmake::CommandExists(const char* name) const
......
......@@ -45,6 +45,7 @@ class cmLocalGenerator;
class cmCacheManager;
class cmMakefile;
class cmCommand;
class cmVariableWatch;
class cmake
{
......@@ -227,6 +228,10 @@ class cmake
///! this is called by generators to update the progress
void UpdateProgress(const char *msg, float prog);
///! Get the variable watch object
cmVariableWatch* GetVariableWatch() { return m_VariableWatch; }
protected:
typedef std::map<cmStdString, cmCommand*> RegisteredCommandsMap;
RegisteredCommandsMap m_Commands;
......@@ -252,6 +257,8 @@ protected:
*/
int AddCMakePaths(const char *arg0);
cmVariableWatch* m_VariableWatch;
private:
ProgressCallback m_ProgressCallback;
void* m_ProgressCallbackClientData;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment