ENH: Adding SYSTEM option to INCLUDE_DIRECTORIES command. This addresses bug #3462.
This commit is contained in:
parent
e36eb71913
commit
c11cf31c9b
|
@ -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)
|
||||||
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
|
||||||
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
|
||||||
|
|
||||||
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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:
|
||||||
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)
|
||||||
// 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)
|
||||||
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)
|
||||||
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()
|
||||||
|
|
||||||
// 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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
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:
|
||||||
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.
|
||||||
|
@ -740,6 +746,10 @@ protected:
|
||||||
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)
|
||||||
# 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
|
||||||
${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)
|
||||||
#
|
#
|
||||||
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.
|
||||||
#
|
#
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
#include <testSystemDir.h>
|
||||||
|
|
||||||
|
int main() { return foo(); }
|
|
@ -0,0 +1,2 @@
|
||||||
|
// Purposely leave off the return type to create a warning.
|
||||||
|
foo() { return 0; }
|
|
@ -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
|
||||||
${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)
|
||||||
#
|
#
|
||||||
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.
|
||||||
#
|
#
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
#include <testSystemDir.h>
|
||||||
|
|
||||||
|
int main() { return foo(); }
|
|
@ -0,0 +1,2 @@
|
||||||
|
// Purposely leave off the return type to create a warning.
|
||||||
|
foo() { return 0; }
|
|
@ -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
|
||||||
${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)
|
||||||
#
|
#
|
||||||
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.
|
||||||
#
|
#
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
#include <testSystemDir.h>
|
||||||
|
|
||||||
|
int main() { return foo(); }
|
|
@ -0,0 +1,2 @@
|
||||||
|
// Purposely leave off the return type to create a warning.
|
||||||
|
foo() { return 0; }
|
Loading…
Reference in New Issue