diff options
Diffstat (limited to 'Source/cmIncludeDirectoryCommand.cxx')
-rw-r--r-- | Source/cmIncludeDirectoryCommand.cxx | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/Source/cmIncludeDirectoryCommand.cxx b/Source/cmIncludeDirectoryCommand.cxx new file mode 100644 index 000000000..9e6f4b6ef --- /dev/null +++ b/Source/cmIncludeDirectoryCommand.cxx @@ -0,0 +1,120 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ +#include "cmIncludeDirectoryCommand.h" + +// cmIncludeDirectoryCommand +bool cmIncludeDirectoryCommand +::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &) +{ + if(args.size() < 1 ) + { + return true; + } + + std::vector<std::string>::const_iterator i = args.begin(); + + bool before = this->Makefile->IsOn("CMAKE_INCLUDE_DIRECTORIES_BEFORE"); + bool system = false; + + if ((*i) == "BEFORE") + { + before = true; + ++i; + } + else if ((*i) == "AFTER") + { + before = false; + ++i; + } + + for(; i != args.end(); ++i) + { + if(*i == "SYSTEM") + { + system = true; + continue; + } + if(i->size() == 0) + { + this->SetError("given empty-string as include directory."); + return false; + } + + this->AddDirectory(i->c_str(),before,system); + + } + return true; +} + +// do a lot of cleanup on the arguments because this is one place where folks +// sometimes take the output of a program and pass it directly into this +// command not thinking that a single argument could be filled with spaces +// and newlines etc liek below: +// +// " /foo/bar +// /boo/hoo /dingle/berry " +// +// ideally that should be three separate arguments but when sucking the +// output from a program and passing it into a command the cleanup doesn't +// always happen +// +void cmIncludeDirectoryCommand::AddDirectory(const char *i, + bool before, + bool system) +{ + // break apart any line feed arguments + std::string ret = i; + std::string::size_type pos = 0; + if((pos = ret.find('\n', pos)) != std::string::npos) + { + if (pos) + { + this->AddDirectory(ret.substr(0,pos).c_str(), before, system); + } + if (ret.size()-pos-1) + { + this->AddDirectory(ret.substr(pos+1,ret.size()-pos-1).c_str(), + before, system); + } + return; + } + + // remove any leading or trailing spaces and \r + std::string::size_type b = ret.find_first_not_of(" \r"); + std::string::size_type e = ret.find_last_not_of(" \r"); + if ((b!=ret.npos) && (e!=ret.npos)) + { + ret.assign(ret, b, 1+e-b); // copy the remaining substring + } + else + { + return; // if we get here, we had only whitespace in the string + } + + if (!cmSystemTools::IsOff(ret.c_str())) + { + cmSystemTools::ConvertToUnixSlashes(ret); + if(!cmSystemTools::FileIsFullPath(ret.c_str())) + { + std::string tmp = this->Makefile->GetStartDirectory(); + tmp += "/"; + tmp += ret; + ret = tmp; + } + } + this->Makefile->AddIncludeDirectory(ret.c_str(), before); + if(system) + { + this->Makefile->AddSystemIncludeDirectory(ret.c_str()); + } +} + |