diff options
author | Brad King <brad.king@kitware.com> | 2006-10-05 12:55:59 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2006-10-05 12:55:59 (GMT) |
commit | c11cf31c9b70b21ba171bb2682ea5304e8d00de8 (patch) | |
tree | 3d6aaf2ef210a0a725346db4b708240d06edc06f /Source | |
parent | e36eb719135b8c5ce6ff317614df5e0d961718f2 (diff) | |
download | CMake-c11cf31c9b70b21ba171bb2682ea5304e8d00de8.zip CMake-c11cf31c9b70b21ba171bb2682ea5304e8d00de8.tar.gz CMake-c11cf31c9b70b21ba171bb2682ea5304e8d00de8.tar.bz2 |
ENH: Adding SYSTEM option to INCLUDE_DIRECTORIES command. This addresses bug #3462.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmIncludeDirectoryCommand.cxx | 10 | ||||
-rw-r--r-- | Source/cmIncludeDirectoryCommand.h | 7 | ||||
-rw-r--r-- | Source/cmLocalGenerator.cxx | 21 | ||||
-rw-r--r-- | Source/cmMakefile.cxx | 15 | ||||
-rw-r--r-- | Source/cmMakefile.h | 12 |
5 files changed, 61 insertions, 4 deletions
diff --git a/Source/cmIncludeDirectoryCommand.cxx b/Source/cmIncludeDirectoryCommand.cxx index 193b3cc..a34b116 100644 --- a/Source/cmIncludeDirectoryCommand.cxx +++ b/Source/cmIncludeDirectoryCommand.cxx @@ -28,6 +28,7 @@ bool cmIncludeDirectoryCommand std::vector<std::string>::const_iterator i = args.begin(); bool before = this->Makefile->IsOn("CMAKE_INCLUDE_DIRECTORIES_BEFORE"); + bool system = false; if ((*i) == "BEFORE") { @@ -42,6 +43,11 @@ bool cmIncludeDirectoryCommand for(; i != args.end(); ++i) { + if(*i == "SYSTEM") + { + system = true; + continue; + } if(i->size() == 0) { cmSystemTools::Error @@ -60,6 +66,10 @@ bool cmIncludeDirectoryCommand } } this->Makefile->AddIncludeDirectory(unixPath.c_str(), before); + if(system) + { + this->Makefile->AddSystemIncludeDirectory(unixPath.c_str()); + } } return true; } diff --git a/Source/cmIncludeDirectoryCommand.h b/Source/cmIncludeDirectoryCommand.h index a22bc0e..9247bbb 100644 --- a/Source/cmIncludeDirectoryCommand.h +++ b/Source/cmIncludeDirectoryCommand.h @@ -61,13 +61,16 @@ public: virtual const char* GetFullDocumentation() { return - " INCLUDE_DIRECTORIES([AFTER|BEFORE] dir1 dir2 ...)\n" + " INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)\n" "Add the given directories to those searched by the compiler for " "include files. By default the directories are appended onto " "the current list of directories. This default behavior can be " "changed by setting CMAKE_INCLUDE_DIRECTORIES_BEFORE to ON. " "By using BEFORE or AFTER you can select between appending and " - "prepending, independent from the default. "; + "prepending, independent from the default. " + "If the SYSTEM option is given the compiler will be told that the " + "directories are meant as system include directories on some " + "platforms."; } cmTypeMacro(cmIncludeDirectoryCommand, cmCommand); diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 3436d6f..890e905 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -1044,6 +1044,17 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang) // given once i.e. -classpath a:b:c repeatFlag = false; } + + // Support special system include flag if it is available and the + // normal flag is repeated for each directory. + std::string sysFlagVar = "CMAKE_INCLUDE_SYSTEM_FLAG_"; + sysFlagVar += lang; + const char* sysIncludeFlag = 0; + if(repeatFlag) + { + sysIncludeFlag = this->Makefile->GetDefinition(sysFlagVar.c_str()); + } + bool flagUsed = false; std::set<cmStdString> emitted; for(i = includes.begin(); i != includes.end(); ++i) @@ -1066,7 +1077,15 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang) std::string include = *i; if(!flagUsed || repeatFlag) { - includeFlags << includeFlag; + if(sysIncludeFlag && + this->Makefile->IsSystemIncludeDirectory(i->c_str())) + { + includeFlags << sysIncludeFlag; + } + else + { + includeFlags << includeFlag; + } flagUsed = true; } std::string includePath = this->ConvertToOutputForExisting(i->c_str()); diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 226f5d5..88f55dd 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -106,6 +106,7 @@ cmMakefile::cmMakefile(const cmMakefile& mf) this->Tests = mf.Tests; this->IncludeDirectories = mf.IncludeDirectories; this->LinkDirectories = mf.LinkDirectories; + this->SystemIncludeDirectories = mf.SystemIncludeDirectories; this->ListFiles = mf.ListFiles; this->OutputFiles = mf.OutputFiles; this->LinkLibraries = mf.LinkLibraries; @@ -1025,6 +1026,7 @@ void cmMakefile::InitializeFromParent() // copy include paths this->IncludeDirectories = parent->IncludeDirectories; + this->SystemIncludeDirectories = parent->SystemIncludeDirectories; // define flags this->DefineFlags = parent->DefineFlags; @@ -1150,6 +1152,19 @@ void cmMakefile::AddIncludeDirectory(const char* inc, bool before) } } +//---------------------------------------------------------------------------- +void cmMakefile::AddSystemIncludeDirectory(const char* dir) +{ + this->SystemIncludeDirectories.insert(dir); +} + +//---------------------------------------------------------------------------- +bool cmMakefile::IsSystemIncludeDirectory(const char* dir) +{ + return (this->SystemIncludeDirectories.find(dir) != + this->SystemIncludeDirectories.end()); +} + void cmMakefile::AddDefinition(const char* name, const char* value) { if (!value ) diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 942858e..df38504 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -441,6 +441,12 @@ public: this->IncludeDirectories = vec; } + /** + * Mark include directories as system directories. + */ + void AddSystemIncludeDirectory(const char* dir); + bool IsSystemIncludeDirectory(const char* dir); + /** Expand out any arguements in the vector that have ; separated * strings into multiple arguements. A new vector is created * containing the expanded versions of all arguments in argsIn. @@ -739,7 +745,11 @@ protected: // dependency, so they must be vectors (not set). std::vector<std::string> IncludeDirectories; std::vector<std::string> LinkDirectories; - + + // The set of include directories that are marked as system include + // directories. + std::set<cmStdString> SystemIncludeDirectories; + std::vector<std::string> ListFiles; // list of command files loaded std::vector<std::string> OutputFiles; // list of command files loaded |