From cad16c4bee93468c94c2b96ca872a6cd31283764 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 20 Apr 2017 15:57:32 +0200 Subject: [PATCH] CMake: Fix up file group information in server-mode Server-mode reports a filegroup for all the listed headers and will provide that without any information on the files (no language, include paths, etc.). Fix up file groups like these by using the best (with that being the settings that effect the most other files) possible information for these files. CMake has no idea what headers are, so it has no way to provide any better information, so Creator has to fix things up again:-/ Task-number: QTCREATORBUG-17971 Change-Id: Ib5ddab23cf725c7e03717b577cc9f9edc5bbfc61 Reviewed-by: Tim Jenssen --- .../cmakeprojectmanager/servermodereader.cpp | 45 +++++++++++++++++++ .../cmakeprojectmanager/servermodereader.h | 2 + 2 files changed, 47 insertions(+) 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,