diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index b5893327c..dce60ff8e 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -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 notFoundMap; diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index 8ea408e61..7991a3386 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -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(); diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 1bf306124..70ba7ea02 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -1005,6 +1005,21 @@ void cmTarget::TraceDependencies(const char* vsProjectFile) tracer.Trace(); } +//---------------------------------------------------------------------------- +bool cmTarget::FindSourceFiles() +{ + for(std::vector::const_iterator + si = this->SourceFiles.begin(); + si != this->SourceFiles.end(); ++si) + { + if((*si)->GetFullPath().empty()) + { + return false; + } + } + return true; +} + //---------------------------------------------------------------------------- void cmTarget::AddSources(std::vector const& srcs) { diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 2bb0f003d..af94876cb 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -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*);