ENH: add PROJECT command if there is not one

This commit is contained in:
Bill Hoffman 2002-12-02 15:30:59 -05:00
parent 5d2f83dad5
commit 27110975c2
3 changed files with 53 additions and 9 deletions

View File

@ -39,14 +39,15 @@ void cmListFileCache::ClearCache()
cmListFile* cmListFileCache::GetFileCache(const char* path) cmListFile* cmListFileCache::GetFileCache(const char* path,
bool requireProjectCommand)
{ {
ListFileMap::iterator sl = m_ListFileCache.find(path); ListFileMap::iterator sl = m_ListFileCache.find(path);
if (sl == m_ListFileCache.end()) if (sl == m_ListFileCache.end())
{ {
// if not already in the map, then parse and store the // if not already in the map, then parse and store the
// file // file
if(!this->CacheFile(path)) if(!this->CacheFile(path, requireProjectCommand))
{ {
return 0; return 0;
} }
@ -61,7 +62,7 @@ cmListFile* cmListFileCache::GetFileCache(const char* path)
cmListFile& ret = sl->second; cmListFile& ret = sl->second;
if(cmSystemTools::ModifiedTime(path) > ret.m_ModifiedTime ) if(cmSystemTools::ModifiedTime(path) > ret.m_ModifiedTime )
{ {
if(!this->CacheFile(path)) if(!this->CacheFile(path, requireProjectCommand))
{ {
return 0; return 0;
} }
@ -75,7 +76,7 @@ cmListFile* cmListFileCache::GetFileCache(const char* path)
} }
bool cmListFileCache::CacheFile(const char* path) bool cmListFileCache::CacheFile(const char* path, bool requireProjectCommand)
{ {
if(!cmSystemTools::FileExists(path)) if(!cmSystemTools::FileExists(path))
{ {
@ -106,6 +107,30 @@ bool cmListFileCache::CacheFile(const char* path)
inFile.m_ModifiedTime = 0; inFile.m_ModifiedTime = 0;
} }
} }
if(requireProjectCommand)
{
bool hasProject = false;
// search for a project command
for(std::vector<cmListFileFunction>::iterator i
= inFile.m_Functions.begin();
i != inFile.m_Functions.end(); ++i)
{
if(i->m_Name == "PROJECT")
{
hasProject = true;
break;
}
}
// if no project command is found, add one
if(!hasProject)
{
cmListFileFunction project;
project.m_Name = "PROJECT";
project.m_Arguments.push_back("Project");
inFile.m_Functions.push_back(project);
std::cerr << "adding project command to file " << path << "\n";
}
}
m_ListFileCache[path] = inFile; m_ListFileCache[path] = inFile;
return true; return true;
} }

View File

@ -52,16 +52,18 @@ public:
/** Return the cached version of the given file. /** Return the cached version of the given file.
* If the file is not already in the cache, a cache entry * If the file is not already in the cache, a cache entry
* will be made. If there is an error loading the file, * will be made. If there is an error loading the file,
* NULL is returned. * NULL is returned. If requireProjectCommand is true,
* then a PROJECT(Project) command will be added to the file
* if it does not have a PROJECT command in it.
*/ */
cmListFile* GetFileCache(const char* path); cmListFile* GetFileCache(const char* path, bool requireProjectCommand);
//! Flush cache file out of cache. //! Flush cache file out of cache.
void FlushCache(const char* path); void FlushCache(const char* path);
private: private:
// Cache the file // Cache the file
bool CacheFile(const char* path); bool CacheFile(const char* path, bool requireProjectCommand);
// private data // private data
typedef std::map<cmStdString, cmListFile> ListFileMap; typedef std::map<cmStdString, cmListFile> ListFileMap;
ListFileMap m_ListFileCache; // file name to ListFile map ListFileMap m_ListFileCache; // file name to ListFile map

View File

@ -308,9 +308,26 @@ bool cmMakefile::ReadListFile(const char* filename, const char* external)
{ {
filenametoread= external; filenametoread= external;
} }
// try to see if the list file is the top most
// list file for a project, and if it is, then it
// must have a project command. If there is not
// one, then cmake will provide one via the
// cmListFileCache class.
bool requireProjectCommand = false;
if(!m_Inheriting && !external
&& m_cmCurrentDirectory == m_cmHomeDirectory)
{
if(cmSystemTools::LowerCase(
cmSystemTools::GetFilenameName(filename)) == "cmakelists.txt")
{
requireProjectCommand = true;
std::cerr << "Require project command " << filename << "\n";
}
}
cmListFile* lf = cmListFile* lf =
cmListFileCache::GetInstance()->GetFileCache(filenametoread); cmListFileCache::GetInstance()->GetFileCache(filenametoread,
requireProjectCommand);
if(!lf) if(!lf)
{ {
return false; return false;