diff --git a/Source/cmIncludeDirectoryCommand.cxx b/Source/cmIncludeDirectoryCommand.cxx index d56fe5c92..be8f2775f 100644 --- a/Source/cmIncludeDirectoryCommand.cxx +++ b/Source/cmIncludeDirectoryCommand.cxx @@ -43,15 +43,24 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // cmIncludeDirectoryCommand bool cmIncludeDirectoryCommand::InitialPass(std::vector const& args) { - if(args.size() < 1 ) + if(args.size() < 1 ) { this->SetError("called with incorrect number of arguments"); return false; } - for(std::vector::const_iterator i = args.begin(); - i != args.end(); ++i) + + std::vector::const_iterator i = args.begin(); + + bool before = false; + if ((*i) == "BEFORE") { - m_Makefile->AddIncludeDirectory((*i).c_str()); + before = true; + ++i; + } + + for(; i != args.end(); ++i) + { + m_Makefile->AddIncludeDirectory((*i).c_str(), before); } return true; } diff --git a/Source/cmIncludeDirectoryCommand.h b/Source/cmIncludeDirectoryCommand.h index 579e24a44..d3764c619 100644 --- a/Source/cmIncludeDirectoryCommand.h +++ b/Source/cmIncludeDirectoryCommand.h @@ -92,7 +92,7 @@ public: virtual const char* GetFullDocumentation() { return - "INCLUDE_DIRECTORIES(dir1 dir2 ...)"; + "INCLUDE_DIRECTORIES([BEFORE] dir1 dir2 ...)"; } cmTypeMacro(cmIncludeDirectoryCommand, cmCommand); diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index e1c94da8f..8e40fbc66 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -564,7 +564,7 @@ void cmMakefile::AddSubdirDependency(const char* subdir, m_SubdirDepends[subdir].insert(dependency); } -void cmMakefile::AddIncludeDirectory(const char* inc) +void cmMakefile::AddIncludeDirectory(const char* inc, bool before) { // Don't add an include directory that is already present. Yes, // this linear search results in n^2 behavior, but n won't be @@ -573,7 +573,15 @@ void cmMakefile::AddIncludeDirectory(const char* inc) if(std::find(m_IncludeDirectories.begin(), m_IncludeDirectories.end(), inc) == m_IncludeDirectories.end()) { - m_IncludeDirectories.push_back(inc); + if (before) + { + // WARNING: this *is* expensive (linear time) since it's a vector + m_IncludeDirectories.insert(m_IncludeDirectories.begin(), inc); + } + else + { + m_IncludeDirectories.push_back(inc); + } } } diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 60d028e1f..1de465654 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -218,7 +218,7 @@ public: /** * Add an include directory to the build. */ - void AddIncludeDirectory(const char*); + void AddIncludeDirectory(const char*, bool before = false); /** * Add a variable definition to the build. This variable