diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index 27bb31d1c32..796ec73886f 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -470,6 +470,8 @@ ServerModeReader::Target *ServerModeReader::extractTargetData(const QVariantMap target->fileGroups.append(extractFileGroupData(fgData, srcDir, target)); } + fixTarget(target); + m_targets.append(target); return target; } @@ -548,6 +550,49 @@ void ServerModeReader::extractCacheData(const QVariantMap &data) m_cmakeCache = config; } +void ServerModeReader::fixTarget(ServerModeReader::Target *target) const +{ + QHash languageFallbacks; + + for (const FileGroup *group : Utils::asConst(target->fileGroups)) { + if (group->includePaths.isEmpty() && group->compileFlags.isEmpty() + && group->defines.isEmpty()) + continue; + + const FileGroup *fallback = languageFallbacks.value(group->language); + if (!fallback || fallback->sources.count() < group->sources.count()) + languageFallbacks.insert(group->language, group); + } + + if (!languageFallbacks.value("")) + return; // No empty language groups found, no need to proceed. + + const FileGroup *fallback = languageFallbacks.value("CXX"); + if (!fallback) + fallback = languageFallbacks.value("C"); + if (!fallback) + fallback = languageFallbacks.value(""); + + if (!fallback) + return; + + for (auto it = target->fileGroups.begin(); it != target->fileGroups.end(); ++it) { + if (!(*it)->language.isEmpty()) + continue; + (*it)->language = fallback->language.isEmpty() ? "CXX" : fallback->language; + + if (*it == fallback + || !(*it)->includePaths.isEmpty() || !(*it)->defines.isEmpty() + || !(*it)->compileFlags.isEmpty()) + continue; + + for (const IncludePath *ip : fallback->includePaths) + (*it)->includePaths.append(new IncludePath(*ip)); + (*it)->defines = fallback->defines; + (*it)->compileFlags = fallback->compileFlags; + } +} + QHash ServerModeReader::addCMakeLists(CMakeProjectNode *root, const QList &cmakeLists) { diff --git a/src/plugins/cmakeprojectmanager/servermodereader.h b/src/plugins/cmakeprojectmanager/servermodereader.h index 3b1202c009a..0c3a3c2fd8c 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.h +++ b/src/plugins/cmakeprojectmanager/servermodereader.h @@ -113,6 +113,8 @@ private: void extractCMakeInputsData(const QVariantMap &data); void extractCacheData(const QVariantMap &data); + void fixTarget(Target *target) const; + QHash addCMakeLists(CMakeProjectNode *root, const QList &cmakeLists); void addProjects(const QHash &cmakeListsNodes,