summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2008-05-12 21:43:45 (GMT)
committerBrad King <brad.king@kitware.com>2008-05-12 21:43:45 (GMT)
commit771bdb7ef84b99f29b87c5424a78daf1d49c9dc7 (patch)
treed441dabefe0a3e05aee18941277bc39498035e8f
parent96525cf3c36650e2257f37a63d61a1244e4aa486 (diff)
downloadCMake-771bdb7ef84b99f29b87c5424a78daf1d49c9dc7.zip
CMake-771bdb7ef84b99f29b87c5424a78daf1d49c9dc7.tar.gz
CMake-771bdb7ef84b99f29b87c5424a78daf1d49c9dc7.tar.bz2
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.
-rw-r--r--Source/cmGlobalGenerator.cxx34
-rw-r--r--Source/cmGlobalGenerator.h2
-rw-r--r--Source/cmTarget.cxx15
-rw-r--r--Source/cmTarget.h5
4 files changed, 56 insertions, 0 deletions
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
index b589332..dce60ff 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<cmStdString, cmStdString> notFoundMap;
diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h
index 8ea408e..7991a33 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 1bf3061..70ba7ea 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -1006,6 +1006,21 @@ void cmTarget::TraceDependencies(const char* vsProjectFile)
}
//----------------------------------------------------------------------------
+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)
{
for(std::vector<std::string>::const_iterator i = srcs.begin();
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index 2bb0f00..af94876 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*);