Commit c11cf31c authored by Brad King's avatar Brad King

ENH: Adding SYSTEM option to INCLUDE_DIRECTORIES command. This addresses bug #3462.

parent e36eb719
...@@ -6,6 +6,7 @@ IF(CMAKE_COMPILER_IS_GNUCC) ...@@ -6,6 +6,7 @@ IF(CMAKE_COMPILER_IS_GNUCC)
SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O2 -g") SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O2 -g")
SET (CMAKE_C_CREATE_PREPROCESSED_SOURCE "<CMAKE_C_COMPILER> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>") SET (CMAKE_C_CREATE_PREPROCESSED_SOURCE "<CMAKE_C_COMPILER> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
SET (CMAKE_C_CREATE_ASSEMBLY_SOURCE "<CMAKE_C_COMPILER> <FLAGS> -S <SOURCE> -o <ASSEMBLY_SOURCE>") SET (CMAKE_C_CREATE_ASSEMBLY_SOURCE "<CMAKE_C_COMPILER> <FLAGS> -S <SOURCE> -o <ASSEMBLY_SOURCE>")
SET (CMAKE_INCLUDE_SYSTEM_FLAG_C "-isystem ")
ENDIF(CMAKE_COMPILER_IS_GNUCC) ENDIF(CMAKE_COMPILER_IS_GNUCC)
IF(CMAKE_COMPILER_IS_GNUCXX) IF(CMAKE_COMPILER_IS_GNUCXX)
...@@ -16,5 +17,6 @@ IF(CMAKE_COMPILER_IS_GNUCXX) ...@@ -16,5 +17,6 @@ IF(CMAKE_COMPILER_IS_GNUCXX)
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g") SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g")
SET (CMAKE_CXX_CREATE_PREPROCESSED_SOURCE "<CMAKE_CXX_COMPILER> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>") SET (CMAKE_CXX_CREATE_PREPROCESSED_SOURCE "<CMAKE_CXX_COMPILER> <FLAGS> -E <SOURCE> > <PREPROCESSED_SOURCE>")
SET (CMAKE_CXX_CREATE_ASSEMBLY_SOURCE "<CMAKE_CXX_COMPILER> <FLAGS> -S <SOURCE> -o <ASSEMBLY_SOURCE>") SET (CMAKE_CXX_CREATE_ASSEMBLY_SOURCE "<CMAKE_CXX_COMPILER> <FLAGS> -S <SOURCE> -o <ASSEMBLY_SOURCE>")
SET (CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem ")
ENDIF(CMAKE_COMPILER_IS_GNUCXX) ENDIF(CMAKE_COMPILER_IS_GNUCXX)
...@@ -28,6 +28,7 @@ bool cmIncludeDirectoryCommand ...@@ -28,6 +28,7 @@ bool cmIncludeDirectoryCommand
std::vector<std::string>::const_iterator i = args.begin(); std::vector<std::string>::const_iterator i = args.begin();
bool before = this->Makefile->IsOn("CMAKE_INCLUDE_DIRECTORIES_BEFORE"); bool before = this->Makefile->IsOn("CMAKE_INCLUDE_DIRECTORIES_BEFORE");
bool system = false;
if ((*i) == "BEFORE") if ((*i) == "BEFORE")
{ {
...@@ -42,6 +43,11 @@ bool cmIncludeDirectoryCommand ...@@ -42,6 +43,11 @@ bool cmIncludeDirectoryCommand
for(; i != args.end(); ++i) for(; i != args.end(); ++i)
{ {
if(*i == "SYSTEM")
{
system = true;
continue;
}
if(i->size() == 0) if(i->size() == 0)
{ {
cmSystemTools::Error cmSystemTools::Error
...@@ -60,6 +66,10 @@ bool cmIncludeDirectoryCommand ...@@ -60,6 +66,10 @@ bool cmIncludeDirectoryCommand
} }
} }
this->Makefile->AddIncludeDirectory(unixPath.c_str(), before); this->Makefile->AddIncludeDirectory(unixPath.c_str(), before);
if(system)
{
this->Makefile->AddSystemIncludeDirectory(unixPath.c_str());
}
} }
return true; return true;
} }
......
...@@ -61,13 +61,16 @@ public: ...@@ -61,13 +61,16 @@ public:
virtual const char* GetFullDocumentation() virtual const char* GetFullDocumentation()
{ {
return 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 " "Add the given directories to those searched by the compiler for "
"include files. By default the directories are appended onto " "include files. By default the directories are appended onto "
"the current list of directories. This default behavior can be " "the current list of directories. This default behavior can be "
"changed by setting CMAKE_INCLUDE_DIRECTORIES_BEFORE to ON. " "changed by setting CMAKE_INCLUDE_DIRECTORIES_BEFORE to ON. "
"By using BEFORE or AFTER you can select between appending and " "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); cmTypeMacro(cmIncludeDirectoryCommand, cmCommand);
......
...@@ -1044,6 +1044,17 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang) ...@@ -1044,6 +1044,17 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
// given once i.e. -classpath a:b:c // given once i.e. -classpath a:b:c
repeatFlag = false; 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; bool flagUsed = false;
std::set<cmStdString> emitted; std::set<cmStdString> emitted;
for(i = includes.begin(); i != includes.end(); ++i) for(i = includes.begin(); i != includes.end(); ++i)
...@@ -1066,7 +1077,15 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang) ...@@ -1066,7 +1077,15 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
std::string include = *i; std::string include = *i;
if(!flagUsed || repeatFlag) if(!flagUsed || repeatFlag)
{ {
includeFlags << includeFlag; if(sysIncludeFlag &&
this->Makefile->IsSystemIncludeDirectory(i->c_str()))
{
includeFlags << sysIncludeFlag;
}
else
{
includeFlags << includeFlag;
}
flagUsed = true; flagUsed = true;
} }
std::string includePath = this->ConvertToOutputForExisting(i->c_str()); std::string includePath = this->ConvertToOutputForExisting(i->c_str());
......
...@@ -106,6 +106,7 @@ cmMakefile::cmMakefile(const cmMakefile& mf) ...@@ -106,6 +106,7 @@ cmMakefile::cmMakefile(const cmMakefile& mf)
this->Tests = mf.Tests; this->Tests = mf.Tests;
this->IncludeDirectories = mf.IncludeDirectories; this->IncludeDirectories = mf.IncludeDirectories;
this->LinkDirectories = mf.LinkDirectories; this->LinkDirectories = mf.LinkDirectories;
this->SystemIncludeDirectories = mf.SystemIncludeDirectories;
this->ListFiles = mf.ListFiles; this->ListFiles = mf.ListFiles;
this->OutputFiles = mf.OutputFiles; this->OutputFiles = mf.OutputFiles;
this->LinkLibraries = mf.LinkLibraries; this->LinkLibraries = mf.LinkLibraries;
...@@ -1025,6 +1026,7 @@ void cmMakefile::InitializeFromParent() ...@@ -1025,6 +1026,7 @@ void cmMakefile::InitializeFromParent()
// copy include paths // copy include paths
this->IncludeDirectories = parent->IncludeDirectories; this->IncludeDirectories = parent->IncludeDirectories;
this->SystemIncludeDirectories = parent->SystemIncludeDirectories;
// define flags // define flags
this->DefineFlags = parent->DefineFlags; this->DefineFlags = parent->DefineFlags;
...@@ -1150,6 +1152,19 @@ void cmMakefile::AddIncludeDirectory(const char* inc, bool before) ...@@ -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) void cmMakefile::AddDefinition(const char* name, const char* value)
{ {
if (!value ) if (!value )
......
...@@ -441,6 +441,12 @@ public: ...@@ -441,6 +441,12 @@ public:
this->IncludeDirectories = vec; 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 /** Expand out any arguements in the vector that have ; separated
* strings into multiple arguements. A new vector is created * strings into multiple arguements. A new vector is created
* containing the expanded versions of all arguments in argsIn. * containing the expanded versions of all arguments in argsIn.
...@@ -739,7 +745,11 @@ protected: ...@@ -739,7 +745,11 @@ protected:
// dependency, so they must be vectors (not set). // dependency, so they must be vectors (not set).
std::vector<std::string> IncludeDirectories; std::vector<std::string> IncludeDirectories;
std::vector<std::string> LinkDirectories; 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> ListFiles; // list of command files loaded
std::vector<std::string> OutputFiles; // list of command files loaded std::vector<std::string> OutputFiles; // list of command files loaded
......
...@@ -91,8 +91,8 @@ ENDIF(${fooCACHE_TEST_VAR2} MATCHES bar) ...@@ -91,8 +91,8 @@ ENDIF(${fooCACHE_TEST_VAR2} MATCHES bar)
# Specify include and lib dirs # Specify include and lib dirs
# (BEFORE is for coverage) # (BEFORE is for coverage)
# #
INCLUDE_DIRECTORIES(SYSTEM Library)
INCLUDE_DIRECTORIES( INCLUDE_DIRECTORIES(
Library
${Complex_SOURCE_DIR}/../../Source ${Complex_SOURCE_DIR}/../../Source
${Complex_BINARY_DIR}/../../Source ${Complex_BINARY_DIR}/../../Source
) )
...@@ -101,7 +101,7 @@ INCLUDE_DIRECTORIES(BEFORE ...@@ -101,7 +101,7 @@ INCLUDE_DIRECTORIES(BEFORE
${Complex_BINARY_DIR} ${Complex_BINARY_DIR}
) )
INCLUDE_REGULAR_EXPRESSION("^(cmTest|file|sharedFile).*$" "^cmMissing") INCLUDE_REGULAR_EXPRESSION("^(cmTest|file|sharedFile|test).*$" "^cmMissing")
LINK_DIRECTORIES( LINK_DIRECTORIES(
${Complex_BINARY_DIR}/Library ${Complex_BINARY_DIR}/Library
......
...@@ -118,6 +118,11 @@ ADD_DEPENDENCIES(notInAllCustom notInAllExe) ...@@ -118,6 +118,11 @@ ADD_DEPENDENCIES(notInAllCustom notInAllExe)
# #
ADD_SUBDIRECTORY(Temp) ADD_SUBDIRECTORY(Temp)
IF(CMAKE_COMPILER_IS_GNUCXX)
ADD_EXECUTABLE(testSystemDir testSystemDir.cxx)
SET_TARGET_PROPERTIES(testSystemDir PROPERTIES COMPILE_FLAGS "-Werror")
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
# #
# Extra coverage.Not used. # Extra coverage.Not used.
# #
......
#include <testSystemDir.h>
int main() { return foo(); }
// Purposely leave off the return type to create a warning.
foo() { return 0; }
...@@ -91,8 +91,8 @@ ENDIF(${fooCACHE_TEST_VAR2} MATCHES bar) ...@@ -91,8 +91,8 @@ ENDIF(${fooCACHE_TEST_VAR2} MATCHES bar)
# Specify include and lib dirs # Specify include and lib dirs
# (BEFORE is for coverage) # (BEFORE is for coverage)
# #
INCLUDE_DIRECTORIES(SYSTEM Library)
INCLUDE_DIRECTORIES( INCLUDE_DIRECTORIES(
Library
${Complex_SOURCE_DIR}/../../Source ${Complex_SOURCE_DIR}/../../Source
${Complex_BINARY_DIR}/../../Source ${Complex_BINARY_DIR}/../../Source
) )
...@@ -101,7 +101,7 @@ INCLUDE_DIRECTORIES(BEFORE ...@@ -101,7 +101,7 @@ INCLUDE_DIRECTORIES(BEFORE
${Complex_BINARY_DIR} ${Complex_BINARY_DIR}
) )
INCLUDE_REGULAR_EXPRESSION("^(cmTest|file|sharedFile).*$" "^cmMissing") INCLUDE_REGULAR_EXPRESSION("^(cmTest|file|sharedFile|test).*$" "^cmMissing")
LINK_DIRECTORIES( LINK_DIRECTORIES(
${Complex_BINARY_DIR}/Library ${Complex_BINARY_DIR}/Library
......
...@@ -118,6 +118,11 @@ ADD_DEPENDENCIES(notInAllCustom notInAllExe) ...@@ -118,6 +118,11 @@ ADD_DEPENDENCIES(notInAllCustom notInAllExe)
# #
ADD_SUBDIRECTORY(Temp) ADD_SUBDIRECTORY(Temp)
IF(CMAKE_COMPILER_IS_GNUCXX)
ADD_EXECUTABLE(testSystemDir testSystemDir.cxx)
SET_TARGET_PROPERTIES(testSystemDir PROPERTIES COMPILE_FLAGS "-Werror")
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
# #
# Extra coverage.Not used. # Extra coverage.Not used.
# #
......
#include <testSystemDir.h>
int main() { return foo(); }
// Purposely leave off the return type to create a warning.
foo() { return 0; }
...@@ -91,8 +91,8 @@ ENDIF(${fooCACHE_TEST_VAR2} MATCHES bar) ...@@ -91,8 +91,8 @@ ENDIF(${fooCACHE_TEST_VAR2} MATCHES bar)
# Specify include and lib dirs # Specify include and lib dirs
# (BEFORE is for coverage) # (BEFORE is for coverage)
# #
INCLUDE_DIRECTORIES(SYSTEM Library)
INCLUDE_DIRECTORIES( INCLUDE_DIRECTORIES(
Library
${Complex_SOURCE_DIR}/../../Source ${Complex_SOURCE_DIR}/../../Source
${Complex_BINARY_DIR}/../../Source ${Complex_BINARY_DIR}/../../Source
) )
...@@ -101,7 +101,7 @@ INCLUDE_DIRECTORIES(BEFORE ...@@ -101,7 +101,7 @@ INCLUDE_DIRECTORIES(BEFORE
${Complex_BINARY_DIR} ${Complex_BINARY_DIR}
) )
INCLUDE_REGULAR_EXPRESSION("^(cmTest|file|sharedFile).*$" "^cmMissing") INCLUDE_REGULAR_EXPRESSION("^(cmTest|file|sharedFile|test).*$" "^cmMissing")
LINK_DIRECTORIES( LINK_DIRECTORIES(
${Complex_BINARY_DIR}/Library ${Complex_BINARY_DIR}/Library
......
...@@ -118,6 +118,11 @@ ADD_DEPENDENCIES(notInAllCustom notInAllExe) ...@@ -118,6 +118,11 @@ ADD_DEPENDENCIES(notInAllCustom notInAllExe)
# #
ADD_SUBDIRECTORY(Temp) ADD_SUBDIRECTORY(Temp)
IF(CMAKE_COMPILER_IS_GNUCXX)
ADD_EXECUTABLE(testSystemDir testSystemDir.cxx)
SET_TARGET_PROPERTIES(testSystemDir PROPERTIES COMPILE_FLAGS "-Werror")
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
# #
# Extra coverage.Not used. # Extra coverage.Not used.
# #
......
#include <testSystemDir.h>
int main() { return foo(); }
// Purposely leave off the return type to create a warning.
foo() { return 0; }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment