diff --git a/plugins/clang/clangparsejob.cpp b/plugins/clang/clangparsejob.cpp --- a/plugins/clang/clangparsejob.cpp +++ b/plugins/clang/clangparsejob.cpp @@ -172,6 +172,10 @@ m_environment.addFrameworkDirectories(IDefinesAndIncludesManager::manager()->frameworkDirectories(file)); m_environment.addDefines(IDefinesAndIncludesManager::manager()->defines(file)); m_environment.setParserSettings(ClangSettingsManager::self()->parserSettings(file)); + if (hasBuildSystemInfo) { + // Assume the builder invokes the compiler in the build directory. + m_environment.setWorkingDirectory(file->project()->buildSystemManager()->buildDirectory(file)); + } } else { m_environment.addIncludes(IDefinesAndIncludesManager::manager()->includes(tuUrl.str())); m_environment.addFrameworkDirectories(IDefinesAndIncludesManager::manager()->frameworkDirectories(tuUrl.str())); diff --git a/plugins/clang/duchain/clangparsingenvironment.h b/plugins/clang/duchain/clangparsingenvironment.h --- a/plugins/clang/duchain/clangparsingenvironment.h +++ b/plugins/clang/duchain/clangparsingenvironment.h @@ -84,6 +84,9 @@ void setPchInclude(const KDevelop::Path& path); KDevelop::Path pchInclude() const; + void setWorkingDirectory(const KDevelop::Path& path); + KDevelop::Path workingDirectory() const; + void setTranslationUnitUrl(const KDevelop::IndexedString& url); KDevelop::IndexedString translationUnitUrl() const; @@ -123,6 +126,7 @@ // NOTE: As elements in QHash stored in an unordered sequence, we're using QMap instead QMap m_defines; KDevelop::Path m_pchInclude; + KDevelop::Path m_workingDirectory; KDevelop::IndexedString m_tuUrl; Quality m_quality = Unknown; ParserSettings m_parserSettings; diff --git a/plugins/clang/duchain/clangparsingenvironment.cpp b/plugins/clang/duchain/clangparsingenvironment.cpp --- a/plugins/clang/duchain/clangparsingenvironment.cpp +++ b/plugins/clang/duchain/clangparsingenvironment.cpp @@ -103,6 +103,16 @@ return m_pchInclude; } +void ClangParsingEnvironment::setWorkingDirectory(const Path& path) +{ + m_workingDirectory = path; +} + +Path ClangParsingEnvironment::workingDirectory() const +{ + return m_workingDirectory; +} + void ClangParsingEnvironment::setTranslationUnitUrl(const IndexedString& url) { m_tuUrl = url; diff --git a/plugins/clang/duchain/parsesession.cpp b/plugins/clang/duchain/parsesession.cpp --- a/plugins/clang/duchain/parsesession.cpp +++ b/plugins/clang/duchain/parsesession.cpp @@ -283,6 +283,13 @@ smartArgs << writeDefinesFile(environment.defines()); clangArguments << "-imacros" << smartArgs.last().constData(); + if (!environment.workingDirectory().isEmpty()) { + QByteArray workingDirectory = environment.workingDirectory().toLocalFile().toUtf8(); + workingDirectory.prepend("-working-directory"); + smartArgs << workingDirectory; + clangArguments << workingDirectory.constData(); + } + // append extra args from environment variable static const auto extraArgs = ::extraArgs(); for (const QByteArray& arg : extraArgs) {