diff options
Diffstat (limited to 'src/plugins/cpptools/compileroptionsbuilder.cpp')
-rw-r--r-- | src/plugins/cpptools/compileroptionsbuilder.cpp | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/plugins/cpptools/compileroptionsbuilder.cpp b/src/plugins/cpptools/compileroptionsbuilder.cpp index 26a133824a..9c6c7d1841 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.cpp +++ b/src/plugins/cpptools/compileroptionsbuilder.cpp @@ -27,8 +27,10 @@ #include <coreplugin/icore.h> +#include <projectexplorer/project.h> #include <projectexplorer/projectexplorerconstants.h> +#include <utils/fileutils.h> #include <utils/qtcassert.h> #include <utils/qtcfallthrough.h> @@ -37,6 +39,8 @@ namespace CppTools { +static constexpr char SYSTEM_INCLUDE_PREFIX[] = "-isystem"; + CompilerOptionsBuilder::CompilerOptionsBuilder(const ProjectPart &projectPart, const QString &clangVersion, const QString &clangResourceDirectory) @@ -119,10 +123,23 @@ void CompilerOptionsBuilder::enableExceptions() add(QLatin1String("-fexceptions")); } +static Utils::FileName absoluteDirectory(const QString &filePath) +{ + return Utils::FileName::fromString(QFileInfo(filePath + '/').absolutePath()); +} + +static Utils::FileName projectTopLevelDirectory(const ProjectPart &projectPart) +{ + if (!projectPart.project) + return Utils::FileName(); + return projectPart.project->projectDirectory(); +} + void CompilerOptionsBuilder::addHeaderPathOptions() { typedef ProjectPartHeaderPath HeaderPath; const QString defaultPrefix = includeDirOption(); + const Utils::FileName projectDirectory = projectTopLevelDirectory(m_projectPart); QStringList result; @@ -134,6 +151,7 @@ void CompilerOptionsBuilder::addHeaderPathOptions() continue; QString prefix; + Utils::FileName path; switch (headerPath.type) { case HeaderPath::FrameworkPath: prefix = QLatin1String("-F"); @@ -141,7 +159,11 @@ void CompilerOptionsBuilder::addHeaderPathOptions() default: // This shouldn't happen, but let's be nice..: // intentional fall-through: case HeaderPath::IncludePath: - prefix = defaultPrefix; + path = absoluteDirectory(headerPath.path); + if (path == projectDirectory || path.isChildOf(projectDirectory)) + prefix = defaultPrefix; + else + prefix = SYSTEM_INCLUDE_PREFIX; break; } @@ -409,7 +431,7 @@ void CompilerOptionsBuilder::addDefineFunctionMacrosMsvc() QString CompilerOptionsBuilder::includeDirOption() const { - return QLatin1String("-isystem"); + return QLatin1String("-I"); } QByteArray CompilerOptionsBuilder::macroOption(const ProjectExplorer::Macro ¯o) const @@ -506,7 +528,7 @@ void CompilerOptionsBuilder::addPredefinedHeaderPathsOptions() void CompilerOptionsBuilder::addClangIncludeFolder() { QTC_CHECK(!m_clangVersion.isEmpty()); - add(includeDirOption()); + add(SYSTEM_INCLUDE_PREFIX); add(clangIncludeDirectory()); } |