2001-02-12 19:26:25 +00:00
|
|
|
/*=========================================================================
|
|
|
|
|
|
|
|
Program: Insight Segmentation & Registration Toolkit
|
|
|
|
Module: $RCSfile$
|
|
|
|
Language: C++
|
|
|
|
Date: $Date$
|
|
|
|
Version: $Revision$
|
|
|
|
|
|
|
|
|
|
|
|
Copyright (c) 2000 National Library of Medicine
|
|
|
|
All rights reserved.
|
|
|
|
|
|
|
|
See COPYRIGHT.txt for copyright details.
|
|
|
|
|
|
|
|
=========================================================================*/
|
|
|
|
|
|
|
|
#include "cmCacheManager.h"
|
|
|
|
#include "cmSystemTools.h"
|
2001-02-19 20:13:48 +00:00
|
|
|
#include "cmCacheManager.h"
|
|
|
|
#include "cmMakefile.h"
|
2001-02-23 00:24:43 +00:00
|
|
|
#include "cmRegularExpression.h"
|
2001-02-12 19:26:25 +00:00
|
|
|
|
|
|
|
const char* cmCacheManagerTypes[] =
|
|
|
|
{ "BOOL",
|
|
|
|
"PATH",
|
2001-02-19 20:13:48 +00:00
|
|
|
"FILEPATH",
|
2001-02-12 19:26:25 +00:00
|
|
|
"STRING",
|
2001-04-12 19:34:09 +00:00
|
|
|
"INTERNAL",
|
2001-02-12 19:26:25 +00:00
|
|
|
0
|
|
|
|
};
|
|
|
|
|
|
|
|
cmCacheManager::CacheEntryType cmCacheManager::StringToType(const char* s)
|
|
|
|
{
|
|
|
|
int i = 0;
|
|
|
|
while(cmCacheManagerTypes[i])
|
|
|
|
{
|
|
|
|
if(strcmp(s, cmCacheManagerTypes[i]) == 0)
|
|
|
|
{
|
|
|
|
return static_cast<CacheEntryType>(i);
|
|
|
|
}
|
2001-02-19 20:13:48 +00:00
|
|
|
++i;
|
2001-02-12 19:26:25 +00:00
|
|
|
}
|
|
|
|
return STRING;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
cmCacheManager* cmCacheManager::s_Instance = 0;
|
|
|
|
|
|
|
|
cmCacheManager* cmCacheManager::GetInstance()
|
|
|
|
{
|
|
|
|
if(!cmCacheManager::s_Instance)
|
|
|
|
{
|
|
|
|
cmCacheManager::s_Instance = new cmCacheManager;
|
|
|
|
}
|
|
|
|
return cmCacheManager::s_Instance;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2001-02-19 20:13:48 +00:00
|
|
|
bool cmCacheManager::LoadCache(cmMakefile* mf)
|
2001-02-12 19:26:25 +00:00
|
|
|
{
|
2001-04-25 20:09:17 +00:00
|
|
|
return this->LoadCache(mf->GetHomeOutputDirectory());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool cmCacheManager::LoadCache(const char* path)
|
|
|
|
{
|
|
|
|
std::string cacheFile = path;
|
2001-02-19 20:13:48 +00:00
|
|
|
cacheFile += "/CMakeCache.txt";
|
|
|
|
// clear the old cache
|
|
|
|
m_Cache.clear();
|
|
|
|
std::ifstream fin(cacheFile.c_str());
|
2001-02-12 19:26:25 +00:00
|
|
|
if(!fin)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
const int bsize = 4096;
|
|
|
|
char buffer[bsize];
|
2001-02-23 00:24:43 +00:00
|
|
|
// input line is: key:type=value
|
|
|
|
cmRegularExpression reg("(.*):(.*)=(.*)");
|
2001-02-12 19:26:25 +00:00
|
|
|
while(fin)
|
|
|
|
{
|
2001-02-19 20:13:48 +00:00
|
|
|
// Format is key:type=value
|
2001-02-12 19:26:25 +00:00
|
|
|
CacheEntry e;
|
2001-02-23 00:24:43 +00:00
|
|
|
fin.getline(buffer, bsize);
|
|
|
|
// skip blank lines and comment lines
|
|
|
|
if(buffer[0] == '#' || buffer[0] == 0)
|
2001-02-12 19:26:25 +00:00
|
|
|
{
|
2001-02-23 00:24:43 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if(reg.find(buffer))
|
|
|
|
{
|
|
|
|
e.m_Type = cmCacheManager::StringToType(reg.match(2).c_str());
|
|
|
|
e.m_Value = reg.match(3);
|
|
|
|
m_Cache[reg.match(1)] = e;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
cmSystemTools::Error("Parse error in cache file ", cacheFile.c_str());
|
2001-02-12 19:26:25 +00:00
|
|
|
}
|
|
|
|
}
|
2001-02-19 20:13:48 +00:00
|
|
|
return true;
|
2001-02-12 19:26:25 +00:00
|
|
|
}
|
|
|
|
|
2001-04-24 20:49:12 +00:00
|
|
|
bool cmCacheManager::SaveCache(cmMakefile* mf) const
|
2001-02-12 19:26:25 +00:00
|
|
|
{
|
2001-04-25 20:09:17 +00:00
|
|
|
return this->SaveCache(mf->GetHomeOutputDirectory());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool cmCacheManager::SaveCache(const char* path) const
|
|
|
|
{
|
|
|
|
std::string cacheFile = path;
|
2001-02-19 20:13:48 +00:00
|
|
|
cacheFile += "/CMakeCache.txt";
|
2001-02-23 00:24:43 +00:00
|
|
|
std::string tempFile = cacheFile;
|
|
|
|
tempFile += ".tmp";
|
|
|
|
std::ofstream fout(tempFile.c_str());
|
2001-02-12 19:26:25 +00:00
|
|
|
if(!fout)
|
|
|
|
{
|
2001-02-19 20:13:48 +00:00
|
|
|
cmSystemTools::Error("Unable to open cache file for save. ",
|
|
|
|
cacheFile.c_str());
|
2001-02-12 19:26:25 +00:00
|
|
|
return false;
|
|
|
|
}
|
2001-02-23 00:24:43 +00:00
|
|
|
fout << "# This is the CMakeCache file.\n"
|
2001-04-25 20:09:17 +00:00
|
|
|
<< "# For build in directory: " << path << "\n"
|
2001-02-23 00:24:43 +00:00
|
|
|
<< "# You can edit this file to change values found and used by cmake.\n"
|
|
|
|
<< "# If you do not want to change any of the values, simply exit the editor.\n"
|
|
|
|
<< "# If you do want to change a value, simply edit, save, and exit the editor.\n"
|
|
|
|
<< "# The syntax for the file is as follows:\n"
|
|
|
|
<< "# KEY:TYPE=VALUE\n"
|
|
|
|
<< "# KEY is the name of a varible in the cache.\n"
|
|
|
|
<< "# TYPE is a hint to GUI's for the type of VALUE, DO NOT EDIT TYPE!.\n"
|
|
|
|
<< "# VALUE is the current value for the KEY.\n\n";
|
|
|
|
|
2001-04-24 20:49:12 +00:00
|
|
|
for( std::map<std::string, CacheEntry>::const_iterator i = m_Cache.begin();
|
2001-02-12 19:26:25 +00:00
|
|
|
i != m_Cache.end(); ++i)
|
|
|
|
{
|
|
|
|
CacheEntryType t = (*i).second.m_Type;
|
2001-02-19 20:13:48 +00:00
|
|
|
// Format is key:type=value
|
|
|
|
fout << (*i).first.c_str() << ":"
|
|
|
|
<< cmCacheManagerTypes[t] << "="
|
|
|
|
<< (*i).second.m_Value << "\n";
|
2001-02-12 19:26:25 +00:00
|
|
|
}
|
|
|
|
fout << "\n";
|
2001-02-23 00:24:43 +00:00
|
|
|
fout.close();
|
|
|
|
cmSystemTools::CopyFileIfDifferent(tempFile.c_str(),
|
|
|
|
cacheFile.c_str());
|
|
|
|
cmSystemTools::RemoveFile(tempFile.c_str());
|
2001-02-19 20:13:48 +00:00
|
|
|
return true;
|
2001-02-12 19:26:25 +00:00
|
|
|
}
|
|
|
|
|
2001-04-23 20:40:29 +00:00
|
|
|
void cmCacheManager::RemoveCacheEntry(const char* key)
|
|
|
|
{
|
|
|
|
m_Cache.erase(key);
|
|
|
|
}
|
|
|
|
|
2001-02-12 19:26:25 +00:00
|
|
|
void cmCacheManager::AddCacheEntry(const char* key,
|
|
|
|
const char* value,
|
|
|
|
CacheEntryType type)
|
|
|
|
{
|
|
|
|
CacheEntry e;
|
|
|
|
e.m_Value = value;
|
|
|
|
e.m_Type = type;
|
|
|
|
m_Cache[key] = e;
|
|
|
|
}
|
|
|
|
|
2001-04-24 20:49:12 +00:00
|
|
|
cmCacheManager::CacheEntry *cmCacheManager::GetCacheEntry(const char* key)
|
2001-02-12 19:26:25 +00:00
|
|
|
{
|
|
|
|
if(m_Cache.count(key))
|
|
|
|
{
|
2001-04-24 20:49:12 +00:00
|
|
|
return &(m_Cache.find(key)->second);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char* cmCacheManager::GetCacheValue(const char* key) const
|
|
|
|
{
|
|
|
|
if(m_Cache.count(key))
|
|
|
|
{
|
|
|
|
return m_Cache.find(key)->second.m_Value.c_str();
|
2001-02-12 19:26:25 +00:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2001-02-23 00:24:43 +00:00
|
|
|
|
|
|
|
|
2001-04-24 20:49:12 +00:00
|
|
|
bool cmCacheManager::IsOn(const char* key) const
|
2001-04-24 16:40:37 +00:00
|
|
|
{
|
|
|
|
if(!m_Cache.count(key))
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
2001-04-24 20:49:12 +00:00
|
|
|
const std::string &v = m_Cache.find(key)->second.m_Value;
|
2001-04-26 14:49:12 +00:00
|
|
|
return cmSystemTools::IsOn(v.c_str());
|
2001-04-24 16:40:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2001-04-24 20:49:12 +00:00
|
|
|
void cmCacheManager::PrintCache(std::ostream& out) const
|
2001-02-23 00:24:43 +00:00
|
|
|
{
|
|
|
|
out << "=================================================" << std::endl;
|
|
|
|
out << "CMakeCache Contents:" << std::endl;
|
2001-04-24 20:49:12 +00:00
|
|
|
for(std::map<std::string, CacheEntry>::const_iterator i = m_Cache.begin();
|
2001-02-23 00:24:43 +00:00
|
|
|
i != m_Cache.end(); ++i)
|
|
|
|
{
|
|
|
|
out << (*i).first.c_str() << " = " << (*i).second.m_Value.c_str() << std::endl;
|
|
|
|
}
|
|
|
|
out << "\n\n";
|
|
|
|
out << "To change values in the CMakeCache, \nedit CMakeCache.txt in your output directory.\n";
|
|
|
|
out << "=================================================" << std::endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-04-24 16:40:37 +00:00
|
|
|
void cmCacheManager::AddCacheEntry(const char* key, bool v)
|
|
|
|
{
|
|
|
|
if(v)
|
|
|
|
{
|
|
|
|
this->AddCacheEntry(key, "ON", cmCacheManager::BOOL);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
this->AddCacheEntry(key, "OFF", cmCacheManager::BOOL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|