summaryrefslogtreecommitdiffstats
path: root/Source/cmQtAutoGeneratorMocUic.cxx
diff options
context:
space:
mode:
authorSebastian Holtermann <sebholt@xwmw.org>2019-02-05 14:43:27 (GMT)
committerSebastian Holtermann <sebholt@xwmw.org>2019-02-05 14:51:53 (GMT)
commita28caabf453ab41851b75a40a2e49706439f9478 (patch)
treef5f94ccce366f807bd20d718b8360af914dd3e4e /Source/cmQtAutoGeneratorMocUic.cxx
parent1f802295f2e42fd38477f22d7275ebe166a48f10 (diff)
downloadCMake-a28caabf453ab41851b75a40a2e49706439f9478.zip
CMake-a28caabf453ab41851b75a40a2e49706439f9478.tar.gz
CMake-a28caabf453ab41851b75a40a2e49706439f9478.tar.bz2
Autogen: AUTOMOC support for files with the same name but different extensions
This adds support for AUTOMOC to moc header files with the same but different extensions (e.g `obj.h`, `obj.hpp`, `obj.hxx`). If a moc file would appear multiple times in `mocs_compilation.cpp`, a number suffix is appended to the name to make it unique. Closes #14489
Diffstat (limited to 'Source/cmQtAutoGeneratorMocUic.cxx')
-rw-r--r--Source/cmQtAutoGeneratorMocUic.cxx46
1 files changed, 34 insertions, 12 deletions
diff --git a/Source/cmQtAutoGeneratorMocUic.cxx b/Source/cmQtAutoGeneratorMocUic.cxx
index 0ba5224..ddff4cf 100644
--- a/Source/cmQtAutoGeneratorMocUic.cxx
+++ b/Source/cmQtAutoGeneratorMocUic.cxx
@@ -678,19 +678,21 @@ void cmQtAutoGeneratorMocUic::JobMocT::Process(WorkerT& wrk)
BuildFile += '/';
BuildFile += IncludeString;
} else {
- std::string rel = wrk.FileSys().GetFilePathChecksum(SourceFile);
- rel += "/moc_";
- rel += wrk.FileSys().GetFilenameWithoutLastExtension(SourceFile);
- rel += ".cpp";
- // Register relative file path
- wrk.Gen().ParallelMocAutoRegister(rel);
+ // Relative build path
+ std::string relPath = wrk.FileSys().GetFilePathChecksum(SourceFile);
+ relPath += "/moc_";
+ relPath += wrk.FileSys().GetFilenameWithoutLastExtension(SourceFile);
+
+ // Register relative file path with duplication check
+ relPath = wrk.Gen().ParallelMocAutoRegister(relPath);
+
// Absolute build path
if (wrk.Base().MultiConfig) {
BuildFile = wrk.Base().AutogenIncludeDir;
BuildFile += '/';
- BuildFile += rel;
+ BuildFile += relPath;
} else {
- BuildFile = wrk.Base().AbsoluteBuildPath(rel);
+ BuildFile = wrk.Base().AbsoluteBuildPath(relPath);
}
}
@@ -1953,11 +1955,31 @@ bool cmQtAutoGeneratorMocUic::ParallelMocIncluded(
return (MocIncludedFiles_.find(sourceFile) != MocIncludedFiles_.end());
}
-void cmQtAutoGeneratorMocUic::ParallelMocAutoRegister(
- std::string const& mocFile)
+std::string cmQtAutoGeneratorMocUic::ParallelMocAutoRegister(
+ std::string const& baseName)
{
- std::lock_guard<std::mutex> mocLock(JobsMutex_);
- MocAutoFiles_.emplace(mocFile);
+ std::string res;
+ {
+ std::lock_guard<std::mutex> mocLock(JobsMutex_);
+ res = baseName;
+ res += ".cpp";
+ if (MocAutoFiles_.find(res) == MocAutoFiles_.end()) {
+ MocAutoFiles_.emplace(res);
+ } else {
+ // Append number suffix to the file name
+ for (unsigned int ii = 2; ii != 1024; ++ii) {
+ res = baseName;
+ res += '_';
+ res += std::to_string(ii);
+ res += ".cpp";
+ if (MocAutoFiles_.find(res) == MocAutoFiles_.end()) {
+ MocAutoFiles_.emplace(res);
+ break;
+ }
+ }
+ }
+ }
+ return res;
}
void cmQtAutoGeneratorMocUic::ParallelMocAutoUpdated()