mirror of https://github.com/qt/qtbase.git
Add support for using -isystem in qmake
This commit will make qmake use -isystem automatically for any compilers that declare support for it for any paths that are listed in QMAKE_DEFAULT_INCDIRS. Change-Id: I36fefc6d5bba61671f65669f0ea42704b3c3cf31 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
This commit is contained in:
parent
6f7d370ade
commit
0b144bc76a
|
@ -13,6 +13,7 @@ QMAKE_LINK_SHLIB = $$QMAKE_CXX
|
||||||
CONFIG += clang_pch_style
|
CONFIG += clang_pch_style
|
||||||
QMAKE_PCH_OUTPUT_EXT = .pch
|
QMAKE_PCH_OUTPUT_EXT = .pch
|
||||||
|
|
||||||
|
QMAKE_CFLAGS_ISYSTEM = -isystem
|
||||||
QMAKE_CFLAGS_PRECOMPILE = -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
|
QMAKE_CFLAGS_PRECOMPILE = -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
|
||||||
QMAKE_CFLAGS_USE_PRECOMPILE = -Xclang -include-pch -Xclang ${QMAKE_PCH_OUTPUT}
|
QMAKE_CFLAGS_USE_PRECOMPILE = -Xclang -include-pch -Xclang ${QMAKE_PCH_OUTPUT}
|
||||||
QMAKE_CXXFLAGS_PRECOMPILE = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
|
QMAKE_CXXFLAGS_PRECOMPILE = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
|
||||||
|
|
|
@ -40,6 +40,7 @@ QMAKE_CFLAGS_DEBUG += -g
|
||||||
QMAKE_CFLAGS_SHLIB += -fPIC
|
QMAKE_CFLAGS_SHLIB += -fPIC
|
||||||
QMAKE_CFLAGS_STATIC_LIB += -fPIC
|
QMAKE_CFLAGS_STATIC_LIB += -fPIC
|
||||||
QMAKE_CFLAGS_APP += -fPIE
|
QMAKE_CFLAGS_APP += -fPIE
|
||||||
|
QMAKE_CFLAGS_ISYSTEM = -isystem
|
||||||
QMAKE_CFLAGS_YACC += -Wno-unused -Wno-parentheses
|
QMAKE_CFLAGS_YACC += -Wno-unused -Wno-parentheses
|
||||||
QMAKE_CFLAGS_HIDESYMS += -fvisibility=hidden
|
QMAKE_CFLAGS_HIDESYMS += -fvisibility=hidden
|
||||||
QMAKE_CFLAGS_EXCEPTIONS_OFF += -fno-exceptions
|
QMAKE_CFLAGS_EXCEPTIONS_OFF += -fno-exceptions
|
||||||
|
|
|
@ -45,7 +45,8 @@ defineReplace(mocCmdBase) {
|
||||||
}
|
}
|
||||||
incvar = @$$WIN_INCLUDETEMP
|
incvar = @$$WIN_INCLUDETEMP
|
||||||
} else {
|
} else {
|
||||||
incvar = $(INCPATH)
|
incvar = -I$$QMAKESPEC -I$$_PRO_FILE_PWD_ $$join(INCLUDEPATH, " -I", -I)
|
||||||
|
incvar += $$QMAKE_FRAMEWORKPATH_FLAGS
|
||||||
}
|
}
|
||||||
RET += $$QMAKE_MOC $(DEFINES) $$join(QMAKE_COMPILER_DEFINES, " -D", -D) $$incvar $$join(QMAKE_DEFAULT_INCDIRS, " -I", -I) $$QMAKE_MOC_OPTIONS
|
RET += $$QMAKE_MOC $(DEFINES) $$join(QMAKE_COMPILER_DEFINES, " -D", -D) $$incvar $$join(QMAKE_DEFAULT_INCDIRS, " -I", -I) $$QMAKE_MOC_OPTIONS
|
||||||
return($$RET)
|
return($$RET)
|
||||||
|
|
|
@ -22,6 +22,7 @@ QMAKE_CFLAGS_DEBUG = -O0 -g
|
||||||
QMAKE_CFLAGS_SHLIB = -fPIC -fno-jump-tables
|
QMAKE_CFLAGS_SHLIB = -fPIC -fno-jump-tables
|
||||||
QMAKE_CFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_SHLIB
|
QMAKE_CFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_SHLIB
|
||||||
QMAKE_CFLAGS_YACC =
|
QMAKE_CFLAGS_YACC =
|
||||||
|
QMAKE_CFLAGS_ISYSTEM = -isystem
|
||||||
QMAKE_CFLAGS_THREAD = -D_REENTRANT
|
QMAKE_CFLAGS_THREAD = -D_REENTRANT
|
||||||
|
|
||||||
QMAKE_CFLAGS_SSE2 += -xSSE2
|
QMAKE_CFLAGS_SSE2 += -xSSE2
|
||||||
|
|
|
@ -456,6 +456,8 @@ MakefileGenerator::init()
|
||||||
if (v["QMAKE_LINK_O_FLAG"].isEmpty())
|
if (v["QMAKE_LINK_O_FLAG"].isEmpty())
|
||||||
v["QMAKE_LINK_O_FLAG"].append("-o ");
|
v["QMAKE_LINK_O_FLAG"].append("-o ");
|
||||||
|
|
||||||
|
setSystemIncludes(v["QMAKE_DEFAULT_INCDIRS"]);
|
||||||
|
|
||||||
ProStringList &quc = v["QMAKE_EXTRA_COMPILERS"];
|
ProStringList &quc = v["QMAKE_EXTRA_COMPILERS"];
|
||||||
|
|
||||||
//make sure the COMPILERS are in the correct input/output chain order
|
//make sure the COMPILERS are in the correct input/output chain order
|
||||||
|
|
|
@ -345,6 +345,30 @@ bool QMakeSourceFileInfo::containsSourceFile(const QString &f, SourceFileType ty
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool QMakeSourceFileInfo::isSystemInclude(const QString &name)
|
||||||
|
{
|
||||||
|
if (QDir::isRelativePath(name)) {
|
||||||
|
// if we got a relative path here, it's either an -I flag with a relative path
|
||||||
|
// or an include file we couldn't locate. Either way, conclude it's not
|
||||||
|
// a system include.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < systemIncludes.size(); ++i) {
|
||||||
|
// check if name is located inside the system include dir:
|
||||||
|
QDir systemDir(systemIncludes.at(i));
|
||||||
|
QString relativePath = systemDir.relativeFilePath(name);
|
||||||
|
|
||||||
|
// the relative path might be absolute if we're crossing drives on Windows
|
||||||
|
if (QDir::isAbsolutePath(relativePath) || relativePath.startsWith("../"))
|
||||||
|
continue;
|
||||||
|
debug_msg(5, "File/dir %s is in system dir %s, skipping",
|
||||||
|
qPrintable(name), qPrintable(systemIncludes.at(i)));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
char *QMakeSourceFileInfo::getBuffer(int s) {
|
char *QMakeSourceFileInfo::getBuffer(int s) {
|
||||||
if(!spare_buffer || spare_buffer_size < s)
|
if(!spare_buffer || spare_buffer_size < s)
|
||||||
spare_buffer = (char *)realloc(spare_buffer, spare_buffer_size=s);
|
spare_buffer = (char *)realloc(spare_buffer, spare_buffer_size=s);
|
||||||
|
|
|
@ -78,6 +78,7 @@ private:
|
||||||
SourceFiles *files, *includes;
|
SourceFiles *files, *includes;
|
||||||
bool files_changed;
|
bool files_changed;
|
||||||
QList<QMakeLocalFileName> depdirs;
|
QList<QMakeLocalFileName> depdirs;
|
||||||
|
QStringList systemIncludes;
|
||||||
|
|
||||||
//sleezy buffer code
|
//sleezy buffer code
|
||||||
char *spare_buffer;
|
char *spare_buffer;
|
||||||
|
@ -98,6 +99,7 @@ protected:
|
||||||
virtual QFileInfo findFileInfo(const QMakeLocalFileName &);
|
virtual QFileInfo findFileInfo(const QMakeLocalFileName &);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
QMakeSourceFileInfo(const QString &cachefile="");
|
QMakeSourceFileInfo(const QString &cachefile="");
|
||||||
virtual ~QMakeSourceFileInfo();
|
virtual ~QMakeSourceFileInfo();
|
||||||
|
|
||||||
|
@ -108,11 +110,15 @@ public:
|
||||||
inline void setDependencyMode(DependencyMode mode) { dep_mode = mode; }
|
inline void setDependencyMode(DependencyMode mode) { dep_mode = mode; }
|
||||||
inline DependencyMode dependencyMode() const { return dep_mode; }
|
inline DependencyMode dependencyMode() const { return dep_mode; }
|
||||||
|
|
||||||
|
void setSystemIncludes(const ProStringList &list)
|
||||||
|
{ systemIncludes = list.toQStringList(); }
|
||||||
|
|
||||||
enum SourceFileType { TYPE_UNKNOWN, TYPE_C, TYPE_UI, TYPE_QRC };
|
enum SourceFileType { TYPE_UNKNOWN, TYPE_C, TYPE_UI, TYPE_QRC };
|
||||||
enum SourceFileSeek { SEEK_DEPS=0x01, SEEK_MOCS=0x02 };
|
enum SourceFileSeek { SEEK_DEPS=0x01, SEEK_MOCS=0x02 };
|
||||||
void addSourceFiles(const ProStringList &, uchar seek, SourceFileType type=TYPE_C);
|
void addSourceFiles(const ProStringList &, uchar seek, SourceFileType type=TYPE_C);
|
||||||
void addSourceFile(const QString &, uchar seek, SourceFileType type=TYPE_C);
|
void addSourceFile(const QString &, uchar seek, SourceFileType type=TYPE_C);
|
||||||
bool containsSourceFile(const QString &, SourceFileType type=TYPE_C);
|
bool containsSourceFile(const QString &, SourceFileType type=TYPE_C);
|
||||||
|
bool isSystemInclude(const QString &);
|
||||||
|
|
||||||
int included(const QString &file);
|
int included(const QString &file);
|
||||||
QStringList dependencies(const QString &file);
|
QStringList dependencies(const QString &file);
|
||||||
|
|
|
@ -125,10 +125,16 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
|
||||||
t << " -I" << pwd;
|
t << " -I" << pwd;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
QString isystem = var("QMAKE_CFLAGS_ISYSTEM");
|
||||||
const ProStringList &incs = project->values("INCLUDEPATH");
|
const ProStringList &incs = project->values("INCLUDEPATH");
|
||||||
for(int i = 0; i < incs.size(); ++i) {
|
for(int i = 0; i < incs.size(); ++i) {
|
||||||
ProString inc = escapeFilePath(incs.at(i));
|
ProString inc = escapeFilePath(incs.at(i));
|
||||||
if(!inc.isEmpty())
|
if (inc.isEmpty())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!isystem.isEmpty() && isSystemInclude(inc.toQString()))
|
||||||
|
t << ' ' << isystem << ' ' << inc;
|
||||||
|
else
|
||||||
t << " -I" << inc;
|
t << " -I" << inc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -321,12 +321,18 @@ void MingwMakefileGenerator::writeIncPart(QTextStream &t)
|
||||||
t << "-I" << pwd << " ";
|
t << "-I" << pwd << " ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString isystem = var("QMAKE_CFLAGS_ISYSTEM");
|
||||||
const ProStringList &incs = project->values("INCLUDEPATH");
|
const ProStringList &incs = project->values("INCLUDEPATH");
|
||||||
for (ProStringList::ConstIterator incit = incs.begin(); incit != incs.end(); ++incit) {
|
for (ProStringList::ConstIterator incit = incs.begin(); incit != incs.end(); ++incit) {
|
||||||
QString inc = (*incit).toQString();
|
QString inc = (*incit).toQString();
|
||||||
inc.replace(QRegExp("\\\\$"), "");
|
inc.replace(QRegExp("\\\\$"), "");
|
||||||
inc.replace(QRegExp("\""), "");
|
inc.replace(QRegExp("\""), "");
|
||||||
t << "-I" << quote << inc << quote << " ";
|
|
||||||
|
if (!isystem.isEmpty() && isSystemInclude(inc))
|
||||||
|
t << isystem << ' ';
|
||||||
|
else
|
||||||
|
t << "-I";
|
||||||
|
t << quote << inc << quote << " ";
|
||||||
}
|
}
|
||||||
t << "-I" << quote << specdir() << quote
|
t << "-I" << quote << specdir() << quote
|
||||||
<< endl;
|
<< endl;
|
||||||
|
|
Loading…
Reference in New Issue