ENH: Added cmData and corresponding DataMap in cmMakefile to allow commands to register arbitrary extra data with the makefile without modifying the cmMakefile class definition.
This commit is contained in:
parent
a12448c19b
commit
a5480276d5
|
@ -0,0 +1,67 @@
|
||||||
|
/*=========================================================================
|
||||||
|
|
||||||
|
Program: Insight Segmentation & Registration Toolkit
|
||||||
|
Module: $RCSfile$
|
||||||
|
Language: C++
|
||||||
|
Date: $Date$
|
||||||
|
Version: $Revision$
|
||||||
|
|
||||||
|
Copyright (c) 2001 Insight Consortium
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
* The name of the Insight Consortium, nor the names of any consortium members,
|
||||||
|
nor of any contributors, may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
* Modified source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS''
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
=========================================================================*/
|
||||||
|
#ifndef cmData_h
|
||||||
|
#define cmData_h
|
||||||
|
|
||||||
|
#include "cmStandardIncludes.h"
|
||||||
|
|
||||||
|
/** \class cmData
|
||||||
|
* \brief Hold extra data on a cmMakefile instance for a command.
|
||||||
|
*
|
||||||
|
* When CMake commands need to store extra information in a cmMakefile
|
||||||
|
* instance, but the information is not needed by the makefile generators,
|
||||||
|
* it can be held in a subclass of cmData. The cmMakefile class has a map
|
||||||
|
* from std::string to cmData*. On its destruction, it destroys all the
|
||||||
|
* extra data through the virtual destructor of cmData.
|
||||||
|
*/
|
||||||
|
class cmData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cmData(const char* name): m_Name(name) {}
|
||||||
|
virtual ~cmData() {}
|
||||||
|
|
||||||
|
const std::string& GetName() const
|
||||||
|
{ return m_Name; }
|
||||||
|
protected:
|
||||||
|
std::string m_Name;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -98,6 +98,14 @@ cmMakefile::~cmMakefile()
|
||||||
{
|
{
|
||||||
delete (*j).second;
|
delete (*j).second;
|
||||||
}
|
}
|
||||||
|
for(DataMap::const_iterator d = m_DataMap.begin();
|
||||||
|
d != m_DataMap.end(); ++d)
|
||||||
|
{
|
||||||
|
if(d->second)
|
||||||
|
{
|
||||||
|
delete d->second;
|
||||||
|
}
|
||||||
|
}
|
||||||
delete m_MakefileGenerator;
|
delete m_MakefileGenerator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -863,3 +871,52 @@ void cmMakefile::SetHomeOutputDirectory(const char* lib)
|
||||||
this->ReadListFile(NULL,fpath.c_str());
|
this->ReadListFile(NULL,fpath.c_str());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register the given cmData instance with its own name.
|
||||||
|
*/
|
||||||
|
void cmMakefile::RegisterData(cmData* data)
|
||||||
|
{
|
||||||
|
std::string name = data->GetName();
|
||||||
|
DataMap::const_iterator d = m_DataMap.find(name);
|
||||||
|
if((d != m_DataMap.end()) && (d->second != NULL) && (d->second != data))
|
||||||
|
{
|
||||||
|
delete d->second;
|
||||||
|
}
|
||||||
|
m_DataMap[name] = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register the given cmData instance with the given name. This can be used
|
||||||
|
* to register a NULL pointer.
|
||||||
|
*/
|
||||||
|
void cmMakefile::RegisterData(const char* name, cmData* data)
|
||||||
|
{
|
||||||
|
DataMap::const_iterator d = m_DataMap.find(name);
|
||||||
|
if((d != m_DataMap.end()) && (d->second != NULL) && (d->second != data))
|
||||||
|
{
|
||||||
|
delete d->second;
|
||||||
|
}
|
||||||
|
m_DataMap[name] = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lookup a cmData instance previously registered with the given name. If
|
||||||
|
* the instance cannot be found, return NULL.
|
||||||
|
*/
|
||||||
|
cmData* cmMakefile::LookupData(const char* name) const
|
||||||
|
{
|
||||||
|
DataMap::const_iterator d = m_DataMap.find(name);
|
||||||
|
if(d != m_DataMap.end())
|
||||||
|
{
|
||||||
|
return d->second;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#define cmMakefile_h
|
#define cmMakefile_h
|
||||||
|
|
||||||
#include "cmStandardIncludes.h"
|
#include "cmStandardIncludes.h"
|
||||||
|
#include "cmData.h"
|
||||||
#include "cmSourceFile.h"
|
#include "cmSourceFile.h"
|
||||||
#include "cmSystemTools.h"
|
#include "cmSystemTools.h"
|
||||||
#include "cmSourceGroup.h"
|
#include "cmSourceGroup.h"
|
||||||
|
@ -475,6 +476,10 @@ public:
|
||||||
cmSourceGroup& FindSourceGroup(const char* source,
|
cmSourceGroup& FindSourceGroup(const char* source,
|
||||||
std::vector<cmSourceGroup> &groups);
|
std::vector<cmSourceGroup> &groups);
|
||||||
|
|
||||||
|
void RegisterData(cmData*);
|
||||||
|
void RegisterData(const char*, cmData*);
|
||||||
|
cmData* LookupData(const char*) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::string m_Prefix;
|
std::string m_Prefix;
|
||||||
std::vector<std::string> m_AuxSourceDirectories; //
|
std::vector<std::string> m_AuxSourceDirectories; //
|
||||||
|
@ -528,6 +533,9 @@ private:
|
||||||
void AddDefaultCommands();
|
void AddDefaultCommands();
|
||||||
void AddDefaultDefinitions();
|
void AddDefaultDefinitions();
|
||||||
std::set<cmFunctionBlocker *> m_FunctionBlockers;
|
std::set<cmFunctionBlocker *> m_FunctionBlockers;
|
||||||
|
|
||||||
|
typedef std::map<std::string, cmData*> DataMap;
|
||||||
|
DataMap m_DataMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue