diff options
author | Attila Krasznahorkay <Attila.Krasznahorkay@cern.ch> | 2016-03-22 12:18:42 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2016-03-22 20:04:15 (GMT) |
commit | b1e1aa1e6a2aa4c0da9d39f2e9f2a80d093f1dc7 (patch) | |
tree | a2500bf04a20c81fe90a5ace8c62ffb362163c23 /Source/cmLocalUnixMakefileGenerator3.cxx | |
parent | 208524b822f7f6ccbe0414452cd9b050263565bc (diff) | |
download | CMake-b1e1aa1e6a2aa4c0da9d39f2e9f2a80d093f1dc7.zip CMake-b1e1aa1e6a2aa4c0da9d39f2e9f2a80d093f1dc7.tar.gz CMake-b1e1aa1e6a2aa4c0da9d39f2e9f2a80d093f1dc7.tar.bz2 |
Makefile: Optionally scan only source and build trees for dependencies
Add a `CMAKE_DEPENDS_IN_PROJECT_ONLY` variable to activate the behavior.
Diffstat (limited to 'Source/cmLocalUnixMakefileGenerator3.cxx')
-rw-r--r-- | Source/cmLocalUnixMakefileGenerator3.cxx | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/Source/cmLocalUnixMakefileGenerator3.cxx b/Source/cmLocalUnixMakefileGenerator3.cxx index 62fea3d..afdff33 100644 --- a/Source/cmLocalUnixMakefileGenerator3.cxx +++ b/Source/cmLocalUnixMakefileGenerator3.cxx @@ -34,6 +34,7 @@ #include <cmsys/Terminal.h> #include <queue> +#include <algorithm> //---------------------------------------------------------------------------- // Escape special characters in Makefile dependency lines @@ -1971,6 +1972,57 @@ void cmLocalUnixMakefileGenerator3::ClearDependencies(cmMakefile* mf, } +namespace +{ + // Helper predicate for removing absolute paths that don't point to the + // source or binary directory. It is used when CMAKE_DEPENDS_IN_PROJECT_ONLY + // is set ON, to only consider in-project dependencies during the build. + class NotInProjectDir + { + public: + // Constructor with the source and binary directory's path + NotInProjectDir(const std::string& sourceDir, + const std::string& binaryDir) + : SourceDir(sourceDir), BinaryDir(binaryDir) {} + + // Operator evaluating the predicate + bool operator()(const std::string& path) const + { + // Keep all relative paths: + if(!cmSystemTools::FileIsFullPath(path)) + { + return false; + } + // If it's an absolute path, check if it starts with the source + // direcotory: + return (!(IsInDirectory(SourceDir, path)|| + IsInDirectory(BinaryDir, path))); + } + + private: + // Helper function used by the predicate + static bool IsInDirectory(const std::string& baseDir, + const std::string& testDir) + { + // First check if the test directory "starts with" the base directory: + if (testDir.find(baseDir) != 0) + { + return false; + } + // If it does, then check that it's either the same string, or that the + // next character is a slash: + return ((testDir.size() == baseDir.size())|| + (testDir[baseDir.size()] == '/')); + } + + // The path to the source directory + std::string SourceDir; + // The path to the binary directory + std::string BinaryDir; + }; +} + + void cmLocalUnixMakefileGenerator3 ::WriteDependLanguageInfo(std::ostream& cmakefileStream, cmGeneratorTarget* target) @@ -2058,6 +2110,15 @@ void cmLocalUnixMakefileGenerator3 this->Makefile->GetSafeDefinition("CMAKE_BUILD_TYPE"); this->GetIncludeDirectories(includes, target, l->first, config); + if(this->Makefile->IsOn("CMAKE_DEPENDS_IN_PROJECT_ONLY")) + { + const char* sourceDir = this->GetState()->GetSourceDirectory(); + const char* binaryDir = this->GetState()->GetBinaryDirectory(); + std::vector<std::string>::iterator itr = + std::remove_if(includes.begin(), includes.end(), + ::NotInProjectDir(sourceDir, binaryDir)); + includes.erase(itr, includes.end()); + } for(std::vector<std::string>::iterator i = includes.begin(); i != includes.end(); ++i) { |