summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorJosiah Bills <josiah@adoniram.net>2022-05-21 12:33:22 -0400
committerJoerg Bornemann <joerg.bornemann@qt.io>2022-06-28 17:26:28 +0200
commit10668f26c9f058aacc2cef057f542f22fcd6eb71 (patch)
tree481c351f5eff1970abc681d5a983076c94cb7b95 /Source
parentc97fd9f06576722d760a172110f250f4672a3855 (diff)
downloadcmake-10668f26c9f058aacc2cef057f542f22fcd6eb71.tar.gz
AUTOUIC: Fix internal paths of generated ui_foo.h files
For every file foo.ui we generate a ui_foo.h file in ${target}_autogen/include or ${target}_autogen/include_$<CONFIG> in the multi-config case. Even .ui files in subdirectories are handled this way. That means, .ui files with the same base name will conflict in a target. However, for .ui files in subdirectories we added generated sources with the nonexistent path ${target}_autogen/include/subdir/ui_foo.h. This patch fixes that. Also, CMake will now yield an error if a target has multiple .ui files with the same base name. Fixes #23523
Diffstat (limited to 'Source')
-rw-r--r--Source/cmQtAutoGenInitializer.cxx28
1 files changed, 16 insertions, 12 deletions
diff --git a/Source/cmQtAutoGenInitializer.cxx b/Source/cmQtAutoGenInitializer.cxx
index a47b3c03a7..c3ea4dbb9b 100644
--- a/Source/cmQtAutoGenInitializer.cxx
+++ b/Source/cmQtAutoGenInitializer.cxx
@@ -906,6 +906,7 @@ bool cmQtAutoGenInitializer::InitScanFiles()
// The reason is that their file names might be discovered from source files
// at generation time.
if (this->MocOrUicEnabled()) {
+ std::unordered_set<std::string> addedFiles;
for (const auto& sf : this->Makefile->GetSourceFiles()) {
// sf->GetExtension() is only valid after sf->ResolveFullPath() ...
// Since we're iterating over source files that might be not in the
@@ -947,25 +948,28 @@ bool cmQtAutoGenInitializer::InitScanFiles()
cmExpandedList(uicOpts));
}
- auto uiHeaderRelativePath = cmSystemTools::RelativePath(
- this->LocalGen->GetCurrentSourceDirectory(),
- cmSystemTools::GetFilenamePath(fullPath));
+ auto uiHeaderFileName = cmStrCat(
+ "ui_"_s, cmSystemTools::GetFilenameWithoutLastExtension(fullPath),
+ ".h"_s);
- // Avoid creating a path containing adjacent slashes
- if (!uiHeaderRelativePath.empty() &&
- uiHeaderRelativePath.back() != '/') {
- uiHeaderRelativePath += '/';
+ // .ui files with the same base name will conflict. Yield an error.
+ {
+ auto insertResult = addedFiles.insert(uiHeaderFileName);
+ if (!insertResult.second) {
+ this->Makefile->IssueMessage(
+ MessageType::FATAL_ERROR,
+ cmStrCat("More than one .ui file with the name "_s,
+ cmSystemTools::GetFilenameName(fullPath),
+ " was found in the sources for target "_s,
+ this->GenTarget->GetName(), "."));
+ }
}
- auto uiHeaderFilePath = cmStrCat(
- '/', uiHeaderRelativePath, "ui_"_s,
- cmSystemTools::GetFilenameWithoutLastExtension(fullPath), ".h"_s);
-
ConfigString uiHeader;
std::string uiHeaderGenex;
this->ConfigFileNamesAndGenex(
uiHeader, uiHeaderGenex, cmStrCat(this->Dir.Build, "/include"_s),
- uiHeaderFilePath);
+ cmStrCat("/"_s, uiHeaderFileName));
this->Uic.UiHeaders.emplace_back(
std::make_pair(uiHeader, uiHeaderGenex));