123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- #include "cmIncludeDirectoryCommand.h"
- #include <algorithm>
- #include <set>
- #include "cmMakefile.h"
- #include "cmSystemTools.h"
- class cmExecutionStatus;
- bool cmIncludeDirectoryCommand::InitialPass(
- std::vector<std::string> const& args, cmExecutionStatus&)
- {
- if (args.empty()) {
- 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;
- }
- std::vector<std::string> beforeIncludes;
- std::vector<std::string> afterIncludes;
- std::set<std::string> systemIncludes;
- for (; i != args.end(); ++i) {
- if (*i == "SYSTEM") {
- system = true;
- continue;
- }
- if (i->empty()) {
- this->SetError("given empty-string as include directory.");
- return false;
- }
- std::vector<std::string> includes;
- this->GetIncludes(*i, includes);
- if (before) {
- beforeIncludes.insert(beforeIncludes.end(), includes.begin(),
- includes.end());
- } else {
- afterIncludes.insert(afterIncludes.end(), includes.begin(),
- includes.end());
- }
- if (system) {
- systemIncludes.insert(includes.begin(), includes.end());
- }
- }
- std::reverse(beforeIncludes.begin(), beforeIncludes.end());
- this->Makefile->AddIncludeDirectories(afterIncludes);
- this->Makefile->AddIncludeDirectories(beforeIncludes, before);
- this->Makefile->AddSystemIncludeDirectories(systemIncludes);
- return true;
- }
- static bool StartsWithGeneratorExpression(const std::string& input)
- {
- return input[0] == '$' && input[1] == '<';
- }
- void cmIncludeDirectoryCommand::GetIncludes(const std::string& arg,
- std::vector<std::string>& incs)
- {
-
- std::string::size_type pos = 0;
- std::string::size_type lastPos = 0;
- while ((pos = arg.find('\n', lastPos)) != std::string::npos) {
- if (pos) {
- std::string inc = arg.substr(lastPos, pos);
- this->NormalizeInclude(inc);
- if (!inc.empty()) {
- incs.push_back(std::move(inc));
- }
- }
- lastPos = pos + 1;
- }
- std::string inc = arg.substr(lastPos);
- this->NormalizeInclude(inc);
- if (!inc.empty()) {
- incs.push_back(std::move(inc));
- }
- }
- void cmIncludeDirectoryCommand::NormalizeInclude(std::string& inc)
- {
- std::string::size_type b = inc.find_first_not_of(" \r");
- std::string::size_type e = inc.find_last_not_of(" \r");
- if ((b != std::string::npos) && (e != std::string::npos)) {
- inc.assign(inc, b, 1 + e - b);
- } else {
- inc.clear();
- return;
- }
- if (!cmSystemTools::IsOff(inc.c_str())) {
- cmSystemTools::ConvertToUnixSlashes(inc);
- if (!cmSystemTools::FileIsFullPath(inc)) {
- if (!StartsWithGeneratorExpression(inc)) {
- std::string tmp = this->Makefile->GetCurrentSourceDirectory();
- tmp += "/";
- tmp += inc;
- inc = tmp;
- }
- }
- }
- }
|