summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2009-02-27 16:23:14 (GMT)
committerBrad King <brad.king@kitware.com>2009-02-27 16:23:14 (GMT)
commit1d3308156e1fc1646873b22317265c61288e9e42 (patch)
treeff65855bca8ae897c19ce112d54d654bab2a049c /Source
parent99b37665c91e91d70576298fef7bab71f794c985 (diff)
downloadCMake-1d3308156e1fc1646873b22317265c61288e9e42.zip
CMake-1d3308156e1fc1646873b22317265c61288e9e42.tar.gz
CMake-1d3308156e1fc1646873b22317265c61288e9e42.tar.bz2
ENH: Enforce unique binary directories
The second argument of add_subdirectory must name a unique binary directory or the build files will clobber each other. This enforces uniqueness with an error message.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmGlobalGenerator.cxx4
-rw-r--r--Source/cmGlobalGenerator.h9
-rw-r--r--Source/cmMakefile.cxx15
3 files changed, 28 insertions, 0 deletions
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
index 4fc26f6..0103a85 100644
--- a/Source/cmGlobalGenerator.cxx
+++ b/Source/cmGlobalGenerator.cxx
@@ -732,18 +732,22 @@ void cmGlobalGenerator::Configure()
this->ProjectMap.clear();
this->RuleHashes.clear();
this->DirectoryContentMap.clear();
+ this->BinaryDirectories.clear();
// start with this directory
cmLocalGenerator *lg = this->CreateLocalGenerator();
this->LocalGenerators.push_back(lg);
// set the Start directories
+ cmMakefile* mf = lg->GetMakefile();
lg->GetMakefile()->SetStartDirectory
(this->CMakeInstance->GetStartDirectory());
lg->GetMakefile()->SetStartOutputDirectory
(this->CMakeInstance->GetStartOutputDirectory());
lg->GetMakefile()->MakeStartDirectoriesCurrent();
+ this->BinaryDirectories.insert(mf->GetStartOutputDirectory());
+
// now do it
lg->Configure();
diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h
index 02e2396..2d8ffb6 100644
--- a/Source/cmGlobalGenerator.h
+++ b/Source/cmGlobalGenerator.h
@@ -253,6 +253,12 @@ public:
void AddRuleHash(const std::vector<std::string>& outputs,
std::string const& content);
+ /** Return whether the given binary directory is unused. */
+ bool BinaryDirectoryIsNew(const char* dir)
+ {
+ return this->BinaryDirectories.insert(dir).second;
+ }
+
protected:
// for a project collect all its targets by following depend
// information, and also collect all the targets
@@ -350,6 +356,9 @@ private:
derived(dc), LoadedFromDisk(dc.LoadedFromDisk) {}
};
std::map<cmStdString, DirectoryContent> DirectoryContentMap;
+
+ // Set of binary directories on disk.
+ std::set<cmStdString> BinaryDirectories;
};
#endif
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 3a8ab2a..d22cebd 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -1536,6 +1536,21 @@ void cmMakefile::AddSubDirectory(const char* srcPath, const char *binPath,
}
}
+ // Make sure the binary directory is unique.
+ cmGlobalGenerator* gg = this->LocalGenerator->GetGlobalGenerator();
+ if(!gg->BinaryDirectoryIsNew(binPath))
+ {
+ cmOStringStream e;
+ e << "The binary directory\n"
+ << " " << binPath << "\n"
+ << "is already used to build another source directory, so it cannot "
+ << "be used to build source directory\n"
+ << " " << srcPath << "\n"
+ << "Specify a unique binary directory name.";
+ this->IssueMessage(cmake::FATAL_ERROR, e.str());
+ return;
+ }
+
// create a new local generator and set its parent
cmLocalGenerator *lg2 =
this->LocalGenerator->GetGlobalGenerator()->CreateLocalGenerator();