forked from qt-creator/qt-creator
CMake: Pass on extra files to code model
Pass on extra files that are not compiled according to CMake (== headers) to the code model, so that it has the information which build system these files are associated with. This helps a bit with the AutoTest plugin, which wants to scan files (incl. headers) for tests and needs information on which build system target will build that test. This patch fixes e.g. Google Test detection for CMake projects -- but *only* if the header files are actually listed in CMakeLists.txt. If that is not the case, then the CMake plugin has no way of knowing which target will build tests. Task-number: QTCREATORBUG-23843 Change-Id: I1117c63dd052ec29a3bce6cce24c3389eedb2df7 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -312,11 +312,10 @@ RawProjectParts generateRawProjectParts(const PreprocessedData &input,
|
|||||||
const FilePath &sourceDirectory)
|
const FilePath &sourceDirectory)
|
||||||
{
|
{
|
||||||
RawProjectParts rpps;
|
RawProjectParts rpps;
|
||||||
|
const QDir sourceDir(sourceDirectory.toString());
|
||||||
|
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
for (const TargetDetails &t : input.targetDetails) {
|
for (const TargetDetails &t : input.targetDetails) {
|
||||||
QDir sourceDir(sourceDirectory.toString());
|
|
||||||
|
|
||||||
bool needPostfix = t.compileGroups.size() > 1;
|
bool needPostfix = t.compileGroups.size() > 1;
|
||||||
int count = 1;
|
int count = 1;
|
||||||
for (const CompileInfo &ci : t.compileGroups) {
|
for (const CompileInfo &ci : t.compileGroups) {
|
||||||
@@ -359,14 +358,15 @@ RawProjectParts generateRawProjectParts(const PreprocessedData &input,
|
|||||||
cxxProjectFlags.commandLineFlags = cProjectFlags.commandLineFlags;
|
cxxProjectFlags.commandLineFlags = cProjectFlags.commandLineFlags;
|
||||||
rpp.setFlagsForCxx(cxxProjectFlags);
|
rpp.setFlagsForCxx(cxxProjectFlags);
|
||||||
|
|
||||||
FilePath precompiled_header
|
FilePath precompiled_header = FilePath::fromString(
|
||||||
= FilePath::fromString(findOrDefault(t.sources, [&ending](const SourceInfo &si) {
|
findOrDefault(t.sources, [&ending](const SourceInfo &si) {
|
||||||
return si.path.endsWith(ending);
|
return si.path.endsWith(ending);
|
||||||
}).path);
|
}).path);
|
||||||
|
|
||||||
rpp.setFiles(transform<QList>(ci.sources, [&t, &sourceDir](const int si) {
|
rpp.setFiles(transform<QList>(ci.sources, [&t, &sourceDir](const int si) {
|
||||||
return sourceDir.absoluteFilePath(t.sources[static_cast<size_t>(si)].path);
|
return sourceDir.absoluteFilePath(t.sources[static_cast<size_t>(si)].path);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
if (!precompiled_header.isEmpty()) {
|
if (!precompiled_header.isEmpty()) {
|
||||||
if (precompiled_header.toFileInfo().isRelative()) {
|
if (precompiled_header.toFileInfo().isRelative()) {
|
||||||
const FilePath parentDir = FilePath::fromString(sourceDir.absolutePath());
|
const FilePath parentDir = FilePath::fromString(sourceDir.absolutePath());
|
||||||
@@ -381,6 +381,22 @@ RawProjectParts generateRawProjectParts(const PreprocessedData &input,
|
|||||||
rpps.append(rpp);
|
rpps.append(rpp);
|
||||||
++count;
|
++count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check sources for more files and associate them with the current target
|
||||||
|
const QStringList extraSources = Utils::transform<QList>(
|
||||||
|
Utils::filtered(t.sources, [](const SourceInfo &si) { return si.compileGroup == -1; }),
|
||||||
|
[&sourceDir](const SourceInfo &si) { return sourceDir.absoluteFilePath(si.path); });
|
||||||
|
if (!extraSources.isEmpty()) {
|
||||||
|
RawProjectPart rpp;
|
||||||
|
rpp.setProjectFileLocation(t.sourceDir.pathAppended("CMakeLists.txt").toString());
|
||||||
|
rpp.setBuildSystemTarget(t.name);
|
||||||
|
rpp.setDisplayName(t.id + "_extra");
|
||||||
|
|
||||||
|
rpp.setFiles(extraSources);
|
||||||
|
|
||||||
|
// This is all the information we have :-/
|
||||||
|
rpps.append(rpp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rpps;
|
return rpps;
|
||||||
|
Reference in New Issue
Block a user