From 6528bd3eeda563d7d692c54b2b7035488f5f8974 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 8 Aug 2023 19:21:46 +0200 Subject: [PATCH] CMakePM: Find the right AUTOUIC generated header Amends c4e15769ec43ff46ec08f639c1f09f9fd8872225 When using ui files in static libraries AUTOUIC reports fake header file names. By using the target that includes the source ui file we can find the correct header file name. Change-Id: I1c8e0b81ad2c670be87c3620f98bd0f5cce40cd1 Reviewed-by: Jarek Kobus Reviewed-by: Christian Kandeler --- .../cmakeprojectmanager/cmakebuildsystem.cpp | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 329048b19cc..c5e307cfb70 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -654,15 +654,29 @@ FilePaths CMakeBuildSystem::filesGeneratedFrom(const FilePath &sourceFile) const FilePath generatedFilePath = buildConfiguration()->buildDirectory().resolvePath(relativePath); if (sourceFile.suffix() == "ui") { - const QString generatedFileSuffix = "ui_" + sourceFile.completeBaseName() + ".h"; + const QString generatedFileName = "ui_" + sourceFile.completeBaseName() + ".h"; - // If AUTOUIC reports the generated header file name, use that path - FilePaths generatedFilePaths = this->project()->files([generatedFileSuffix](const Node *n) { - return Project::GeneratedFiles(n) && n->filePath().endsWith(generatedFileSuffix); - }); + auto targetNode = this->project()->nodeForFilePath(sourceFile); + while (!dynamic_cast(targetNode)) + targetNode = targetNode->parentFolderNode(); + + FilePaths generatedFilePaths; + if (targetNode) { + const QString autogenSignature = targetNode->buildKey() + "_autogen/include"; + + // If AUTOUIC reports the generated header file name, use that path + generatedFilePaths = this->project()->files( + [autogenSignature, generatedFileName](const Node *n) { + const FilePath filePath = n->filePath(); + if (!filePath.contains(autogenSignature)) + return false; + + return Project::GeneratedFiles(n) && filePath.endsWith(generatedFileName); + }); + } if (generatedFilePaths.empty()) - generatedFilePaths = {generatedFilePath.pathAppended(generatedFileSuffix)}; + generatedFilePaths = {generatedFilePath.pathAppended(generatedFileName)}; return generatedFilePaths; }