diff options
Diffstat (limited to 'Source/cmIncludeDirectoryCommand.cxx')
-rw-r--r-- | Source/cmIncludeDirectoryCommand.cxx | 81 |
1 files changed, 67 insertions, 14 deletions
diff --git a/Source/cmIncludeDirectoryCommand.cxx b/Source/cmIncludeDirectoryCommand.cxx index cf55f29..edccc9b 100644 --- a/Source/cmIncludeDirectoryCommand.cxx +++ b/Source/cmIncludeDirectoryCommand.cxx @@ -64,24 +64,77 @@ bool cmIncludeDirectoryCommand return 0; } } - std::string unixPath = *i; - if (!cmSystemTools::IsOff(unixPath.c_str())) + + 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 seperate 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) { - cmSystemTools::ConvertToUnixSlashes(unixPath); - if(!cmSystemTools::FileIsFullPath(unixPath.c_str())) - { - std::string tmp = this->Makefile->GetStartDirectory(); - tmp += "/"; - tmp += unixPath; - unixPath = tmp; - } + this->AddDirectory(ret.substr(0,pos).c_str(), before, system); } - this->Makefile->AddIncludeDirectory(unixPath.c_str(), before); - if(system) + if (ret.size()-pos-1) { - this->Makefile->AddSystemIncludeDirectory(unixPath.c_str()); + this->AddDirectory(ret.substr(pos+1,ret.size()-pos-1).c_str(), before, system); } + return; + } + + // remove any leading or trailing spaces and \r + pos = ret.size()-1; + while(ret[pos] == ' ' || ret[pos] == '\r') + { + ret.erase(pos); + pos--; + } + pos = 0; + while(ret.size() && ret[pos] == ' ' || ret[pos] == '\r') + { + ret.erase(pos,1); + } + if (!ret.size()) + { + return; + } + + 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()); } - return true; } |