diff options
author | Brad King <brad.king@kitware.com> | 2009-02-27 16:23:14 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2009-02-27 16:23:14 (GMT) |
commit | 1d3308156e1fc1646873b22317265c61288e9e42 (patch) | |
tree | ff65855bca8ae897c19ce112d54d654bab2a049c /Source | |
parent | 99b37665c91e91d70576298fef7bab71f794c985 (diff) | |
download | CMake-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.cxx | 4 | ||||
-rw-r--r-- | Source/cmGlobalGenerator.h | 9 | ||||
-rw-r--r-- | Source/cmMakefile.cxx | 15 |
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(); |