diff --git a/kdevplatform/project/interfaces/ibuildsystemmanager.h b/kdevplatform/project/interfaces/ibuildsystemmanager.h --- a/kdevplatform/project/interfaces/ibuildsystemmanager.h +++ b/kdevplatform/project/interfaces/ibuildsystemmanager.h @@ -125,6 +125,11 @@ * Get the toplevel build directory for the project */ virtual Path buildDirectory(ProjectBaseItem*) const = 0; + + /** + * @returns the extra arguments that will be passed to the compiler when building @p item + */ + virtual QString extraArguments(ProjectBaseItem* item) const = 0; }; } diff --git a/languages/plugins/custom-definesandincludes/definesandincludesmanager.cpp b/languages/plugins/custom-definesandincludes/definesandincludesmanager.cpp --- a/languages/plugins/custom-definesandincludes/definesandincludesmanager.cpp +++ b/languages/plugins/custom-definesandincludes/definesandincludesmanager.cpp @@ -356,6 +356,11 @@ Q_ASSERT(QThread::currentThread() == qApp->thread()); + auto buildManager = item->project()->buildSystemManager(); + if ( buildManager ) { + return buildManager->extraArguments(item); + } + auto cfg = item->project()->projectConfiguration().data(); const auto arguments = findConfigForItem(m_settings->readPaths(cfg), item).parserArguments; return argumentsForPath(item->path(), arguments); diff --git a/projectmanagers/cmake/cmakemanager.h b/projectmanagers/cmake/cmakemanager.h --- a/projectmanagers/cmake/cmakemanager.h +++ b/projectmanagers/cmake/cmakemanager.h @@ -84,6 +84,7 @@ KDevelop::Path::List includeDirectories(KDevelop::ProjectBaseItem *) const override; KDevelop::Path::List frameworkDirectories(KDevelop::ProjectBaseItem *item) const override; QHash defines(KDevelop::ProjectBaseItem *) const override; + QString extraArguments(KDevelop::ProjectBaseItem * item) const override; KDevelop::ProjectTargetItem* createTarget( const QString&, KDevelop::ProjectFolderItem* ) override { return nullptr; } diff --git a/projectmanagers/cmake/cmakemanager.cpp b/projectmanagers/cmake/cmakemanager.cpp --- a/projectmanagers/cmake/cmakemanager.cpp +++ b/projectmanagers/cmake/cmakemanager.cpp @@ -286,6 +286,11 @@ return fileInformation(item).defines; } +QString CMakeManager::extraArguments(KDevelop::ProjectBaseItem* item) const +{ + return fileInformation(item).compileFlags; +} + KDevelop::IProjectBuilder * CMakeManager::builder() const { IPlugin* i = core()->pluginController()->pluginForExtension( QStringLiteral("org.kdevelop.IProjectBuilder"), QStringLiteral("KDevCMakeBuilder")); diff --git a/projectmanagers/cmake/cmakeprojectdata.h b/projectmanagers/cmake/cmakeprojectdata.h --- a/projectmanagers/cmake/cmakeprojectdata.h +++ b/projectmanagers/cmake/cmakeprojectdata.h @@ -39,6 +39,7 @@ { KDevelop::Path::List includes; KDevelop::Path::List frameworkDirectories; + QString compileFlags; QHash defines; }; inline QDebug &operator<<(QDebug debug, const CMakeFile& file) diff --git a/projectmanagers/cmake/cmakeserverimportjob.cpp b/projectmanagers/cmake/cmakeserverimportjob.cpp --- a/projectmanagers/cmake/cmakeserverimportjob.cpp +++ b/projectmanagers/cmake/cmakeserverimportjob.cpp @@ -119,7 +119,9 @@ const auto fileGroup = fileGroupValue.toObject(); CMakeFile file; file.includes = kTransform(fileGroup.value(QStringLiteral("includePath")).toArray(), [](const QJsonValue& val) { return KDevelop::Path(val.toObject().value(QStringLiteral("path")).toString()); }); - file.defines = processDefines(fileGroup.value(QStringLiteral("compileFlags")).toString(), fileGroup.value(QStringLiteral("defines")).toArray()); + + file.compileFlags = fileGroup.value(QStringLiteral("compileFlags")).toString(); + file.defines = processDefines(file.compileFlags, fileGroup.value(QStringLiteral("defines")).toArray()); const auto sourcesArray = fileGroup.value(QStringLiteral("sources")).toArray(); const KDevelop::Path::List sources = kTransform(sourcesArray, [targetDir](const QJsonValue& val) { return KDevelop::Path(targetDir, val.toString()); }); diff --git a/projectmanagers/custom-buildsystem/custombuildsystemplugin.h b/projectmanagers/custom-buildsystem/custombuildsystemplugin.h --- a/projectmanagers/custom-buildsystem/custombuildsystemplugin.h +++ b/projectmanagers/custom-buildsystem/custombuildsystemplugin.h @@ -76,6 +76,7 @@ QHash defines( KDevelop::ProjectBaseItem* ) const override; KDevelop::Path::List includeDirectories( KDevelop::ProjectBaseItem* ) const override; KDevelop::Path::List frameworkDirectories( KDevelop::ProjectBaseItem* ) const override; + QString extraArguments(KDevelop::ProjectBaseItem * item) const override; bool removeFilesFromTargets( const QList& ) override; bool removeTarget( KDevelop::ProjectTargetItem* target ) override; QList targets( KDevelop::ProjectFolderItem* ) const override; diff --git a/projectmanagers/custom-buildsystem/custombuildsystemplugin.cpp b/projectmanagers/custom-buildsystem/custombuildsystemplugin.cpp --- a/projectmanagers/custom-buildsystem/custombuildsystemplugin.cpp +++ b/projectmanagers/custom-buildsystem/custombuildsystemplugin.cpp @@ -141,6 +141,11 @@ return {}; } +QString CustomBuildSystem::extraArguments(KDevelop::ProjectBaseItem*) const +{ + return {}; +} + KJob* CustomBuildSystem::install( KDevelop::ProjectBaseItem* item, const QUrl &installPrefix ) { auto job = new CustomBuildJob( this, item, CustomBuildSystemTool::Install ); diff --git a/projectmanagers/custommake/custommakemanager.h b/projectmanagers/custommake/custommakemanager.h --- a/projectmanagers/custommake/custommakemanager.h +++ b/projectmanagers/custommake/custommakemanager.h @@ -56,6 +56,8 @@ */ QHash defines(KDevelop::ProjectBaseItem*) const override; + QString extraArguments(KDevelop::ProjectBaseItem * item) const override; + /** * Create a new target * diff --git a/projectmanagers/custommake/custommakemanager.cpp b/projectmanagers/custommake/custommakemanager.cpp --- a/projectmanagers/custommake/custommakemanager.cpp +++ b/projectmanagers/custommake/custommakemanager.cpp @@ -151,6 +151,11 @@ return QHash(); } +QString CustomMakeManager::extraArguments(KDevelop::ProjectBaseItem*) const +{ + return {}; +} + ProjectTargetItem* CustomMakeManager::createTarget(const QString& target, KDevelop::ProjectFolderItem *parent) { Q_UNUSED(target) diff --git a/projectmanagers/qmake/qmakemanager.h b/projectmanagers/qmake/qmakemanager.h --- a/projectmanagers/qmake/qmakemanager.h +++ b/projectmanagers/qmake/qmakemanager.h @@ -60,6 +60,7 @@ KDevelop::Path::List includeDirectories(KDevelop::ProjectBaseItem*) const override; KDevelop::Path::List frameworkDirectories(KDevelop::ProjectBaseItem* item) const override; QHash defines(KDevelop::ProjectBaseItem*) const override; + QString extraArguments(KDevelop::ProjectBaseItem * item) const override; bool hasBuildInfo(KDevelop::ProjectBaseItem*) const override; KDevelop::ProjectTargetItem* createTarget( const QString&, KDevelop::ProjectFolderItem* ) override diff --git a/projectmanagers/qmake/qmakemanager.cpp b/projectmanagers/qmake/qmakemanager.cpp --- a/projectmanagers/qmake/qmakemanager.cpp +++ b/projectmanagers/qmake/qmakemanager.cpp @@ -448,6 +448,21 @@ return d; } +QString QMakeProjectManager::extraArguments(KDevelop::ProjectBaseItem* item) const +{ + QMakeFolderItem* folder = findQMakeFolderParent(item); + if (!folder) { + // happens for bad qmake configurations + return {}; + } + + QStringList d; + foreach (QMakeProjectFile* pro, folder->projectFiles()) { + d << pro->extraArguments(); + } + return d.join(QLatin1Char(' ')); +} + bool QMakeProjectManager::hasBuildInfo(KDevelop::ProjectBaseItem* item) const { return findQMakeFolderParent(item); diff --git a/projectmanagers/qmake/qmakeprojectfile.h b/projectmanagers/qmake/qmakeprojectfile.h --- a/projectmanagers/qmake/qmakeprojectfile.h +++ b/projectmanagers/qmake/qmakeprojectfile.h @@ -52,6 +52,7 @@ QStringList filesForTarget( const QString& ) const; QStringList includeDirectories() const; QStringList frameworkDirectories() const; + QStringList extraArguments() const; QStringList targets() const; diff --git a/projectmanagers/qmake/qmakeprojectfile.cpp b/projectmanagers/qmake/qmakeprojectfile.cpp --- a/projectmanagers/qmake/qmakeprojectfile.cpp +++ b/projectmanagers/qmake/qmakeprojectfile.cpp @@ -287,6 +287,25 @@ return fwDirs; } +QStringList QMakeProjectFile::extraArguments() const +{ + const auto variablesToCheck = {QStringLiteral("QMAKE_CFLAGS"), + QStringLiteral("QMAKE_CXXFLAGS"), + QStringLiteral("QMAKE_LFLAGS")}; + const QVector prefixes = { QLatin1String("-F"), QLatin1String("-iframework"), QLatin1String("-I") }; + QStringList args; + foreach (const auto& var, variablesToCheck) { + foreach (const auto& arg, variableValues(var)) { + for (const auto& prefix: prefixes) { + if (arg.startsWith(prefix)) { + args << arg; + } + } + } + } + return args; +} + QStringList QMakeProjectFile::files() const { ifDebug(qCDebug(KDEV_QMAKE) << "Fetching files";)