diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index 5dfce4ab883..90d29576093 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -357,13 +357,22 @@ QList BuildDirManager::takeBuildTargets(QString &errorMessage) QTC_ASSERT(!m_isHandlingError, return result); if (m_reader) { - result.append(Utils::filtered(m_reader->takeBuildTargets(errorMessage), - [](const CMakeBuildTarget &bt) { - return bt.title != CMakeBuildStep::allTarget() - && bt.title != CMakeBuildStep::cleanTarget() - && bt.title != CMakeBuildStep::installTarget() - && bt.title != CMakeBuildStep::testTarget(); - })); + QList readerTargets + = Utils::filtered(m_reader->takeBuildTargets(errorMessage), + [](const CMakeBuildTarget &bt) { + return bt.title != CMakeBuildStep::allTarget() + && bt.title != CMakeBuildStep::cleanTarget() + && bt.title != CMakeBuildStep::installTarget() + && bt.title != CMakeBuildStep::testTarget(); + }); + + // Guess at the target definition position when no details are known + for (CMakeBuildTarget &t : readerTargets) { + if (t.definitionFile.isEmpty()) { + t.definitionFile = t.sourceDirectory.pathAppended("CMakeLists.txt"); + } + } + result.append(readerTargets); } return result; } diff --git a/src/plugins/cmakeprojectmanager/cmakebuildtarget.h b/src/plugins/cmakeprojectmanager/cmakebuildtarget.h index d64bd2b9edd..ad941221289 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildtarget.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildtarget.h @@ -53,6 +53,9 @@ public: Utils::FilePath sourceDirectory; Utils::FilePath makeCommand; + Utils::FilePath definitionFile; + int definitionLine = -1; + // code model QList includeFiles; QStringList compilerOptions; diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index 0af8699c74c..d2c354cfaeb 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -194,6 +194,17 @@ QList generateBuildTargets(const PreprocessedData &input, } ct.sourceDirectory = FilePath::fromString( QDir::cleanPath(sourceDir.absoluteFilePath(t.sourceDir.toString()))); + + if (t.backtrace >= 0) { + const BacktraceNode &node = t.backtraceGraph.nodes[static_cast(t.backtrace)]; + const int fileIndex = node.file; + if (fileIndex >= 0) { + ct.definitionFile = FilePath::fromString(QDir::cleanPath(sourceDir.absoluteFilePath( + t.backtraceGraph.files[static_cast(fileIndex)]))); + ct.definitionLine = node.line; + } + } + return ct; }); return result;