BUG: Make sure all source files are found before generating.

- Previously this was done implicitly by the check for a target
    link language which checked all source full paths.
  - The recent change to support computing a link language without
    finding all the source files skipped the implicit check.
  - This change adds an explicit check to find all source files.
This commit is contained in:
Brad King 2008-05-12 17:43:45 -04:00
parent 96525cf3c3
commit 771bdb7ef8
4 changed files with 56 additions and 0 deletions

View File

@ -764,6 +764,12 @@ void cmGlobalGenerator::Generate()
return;
}
// Check that all targets are valid.
if(!this->CheckTargets())
{
return;
}
// For each existing cmLocalGenerator
unsigned int i;
@ -850,6 +856,34 @@ void cmGlobalGenerator::Generate()
this->CMakeInstance->UpdateProgress("Generating done", -1);
}
//----------------------------------------------------------------------------
bool cmGlobalGenerator::CheckTargets()
{
// Make sure all targets can find their source files.
for(unsigned int i=0; i < this->LocalGenerators.size(); ++i)
{
cmTargets& targets =
this->LocalGenerators[i]->GetMakefile()->GetTargets();
for(cmTargets::iterator ti = targets.begin();
ti != targets.end(); ++ti)
{
cmTarget& target = ti->second;
if(target.GetType() == cmTarget::EXECUTABLE ||
target.GetType() == cmTarget::STATIC_LIBRARY ||
target.GetType() == cmTarget::SHARED_LIBRARY ||
target.GetType() == cmTarget::MODULE_LIBRARY ||
target.GetType() == cmTarget::UTILITY)
{
if(!target.FindSourceFiles())
{
return false;
}
}
}
}
return true;
}
void cmGlobalGenerator::CheckLocalGenerators()
{
std::map<cmStdString, cmStdString> notFoundMap;

View File

@ -260,6 +260,8 @@ protected:
virtual bool CheckALLOW_DUPLICATE_CUSTOM_TARGETS();
bool CheckTargets();
// Fill the ProjectMap, this must be called after LocalGenerators
// has been populated.
void FillProjectMap();

View File

@ -1005,6 +1005,21 @@ void cmTarget::TraceDependencies(const char* vsProjectFile)
tracer.Trace();
}
//----------------------------------------------------------------------------
bool cmTarget::FindSourceFiles()
{
for(std::vector<cmSourceFile*>::const_iterator
si = this->SourceFiles.begin();
si != this->SourceFiles.end(); ++si)
{
if((*si)->GetFullPath().empty())
{
return false;
}
}
return true;
}
//----------------------------------------------------------------------------
void cmTarget::AddSources(std::vector<std::string> const& srcs)
{

View File

@ -271,6 +271,11 @@ public:
*/
void TraceDependencies(const char* vsProjectFile);
/**
* Make sure the full path to all source files is known.
*/
bool FindSourceFiles();
///! Return the prefered linker language for this target
const char* GetLinkerLanguage(cmGlobalGenerator*);