summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOrkun Tokdemir <ilhanorkuntokdemir@gmail.com>2023-05-25 15:34:35 (GMT)
committerOrkun Tokdemir <ilhanorkuntokdemir@gmail.com>2023-05-27 10:55:21 (GMT)
commit2bb3d9b6448efd2aab4db3e33a16b22a1b1b097f (patch)
tree39069259af567b047142846e0f9b05b02990115c
parent3bd605f3d06b8ac39f517b5a105c5254ca3ec12b (diff)
downloadCMake-2bb3d9b6448efd2aab4db3e33a16b22a1b1b097f.zip
CMake-2bb3d9b6448efd2aab4db3e33a16b22a1b1b097f.tar.gz
CMake-2bb3d9b6448efd2aab4db3e33a16b22a1b1b097f.tar.bz2
Autogen: Fix multi-config generated file issue
The default config was an empty string when a `multi-config` generator is used. An if check was added for those situations. If a source file has a specific config configuration, it is used with `$<CONFIG>` in the `multi-config` generator usage. Fixes: #24848
-rw-r--r--Source/cmQtAutoGenInitializer.cxx49
-rw-r--r--Tests/RunCMake/Autogen/MocGeneratedFile.cmake15
-rw-r--r--Tests/RunCMake/Autogen/RunCMakeTest.cmake19
3 files changed, 73 insertions, 10 deletions
diff --git a/Source/cmQtAutoGenInitializer.cxx b/Source/cmQtAutoGenInitializer.cxx
index 62d7ffb..2c48e78 100644
--- a/Source/cmQtAutoGenInitializer.cxx
+++ b/Source/cmQtAutoGenInitializer.cxx
@@ -662,8 +662,6 @@ bool cmQtAutoGenInitializer::InitMoc()
return sanitizer(dirs);
};
- // Default configuration include directories
- this->Moc.Includes.Default = getDirs(this->ConfigDefault);
// Other configuration settings
if (this->MultiConfig) {
for (std::string const& cfg : this->ConfigsList) {
@@ -673,6 +671,9 @@ bool cmQtAutoGenInitializer::InitMoc()
}
this->Moc.Includes.Config[cfg] = std::move(dirs);
}
+ } else {
+ // Default configuration include directories
+ this->Moc.Includes.Default = getDirs(this->ConfigDefault);
}
}
@@ -690,8 +691,6 @@ bool cmQtAutoGenInitializer::InitMoc()
return defines;
};
- // Default configuration defines
- this->Moc.Defines.Default = getDefs(this->ConfigDefault);
// Other configuration defines
if (this->MultiConfig) {
for (std::string const& cfg : this->ConfigsList) {
@@ -701,6 +700,9 @@ bool cmQtAutoGenInitializer::InitMoc()
}
this->Moc.Defines.Config[cfg] = std::move(defines);
}
+ } else {
+ // Default configuration defines
+ this->Moc.Defines.Default = getDefs(this->ConfigDefault);
}
}
@@ -1024,8 +1026,24 @@ bool cmQtAutoGenInitializer::InitScanFiles()
if (this->MocOrUicEnabled() && !this->AutogenTarget.FilesGenerated.empty()) {
if (this->CMP0071Accept) {
// Let the autogen target depend on the GENERATED files
- for (MUFile* muf : this->AutogenTarget.FilesGenerated) {
- this->AutogenTarget.DependFiles.insert(muf->FullPath);
+ if (this->MultiConfig &&
+ this->Makefile->GetSafeDefinition("CMAKE_CROSS_CONFIGS").empty()) {
+ for (MUFile const* muf : this->AutogenTarget.FilesGenerated) {
+ if (muf->Configs.empty()) {
+ this->AutogenTarget.DependFiles.insert(muf->FullPath);
+ } else {
+ for (size_t ci : muf->Configs) {
+ std::string const& config = this->ConfigsList[ci];
+ std::string const& pathWithConfig =
+ cmStrCat("$<$<CONFIG:", config, ">:", muf->FullPath, '>');
+ this->AutogenTarget.DependFiles.insert(pathWithConfig);
+ }
+ }
+ }
+ } else {
+ for (MUFile const* muf : this->AutogenTarget.FilesGenerated) {
+ this->AutogenTarget.DependFiles.insert(muf->FullPath);
+ }
}
} else if (this->CMP0071Warn) {
cm::string_view property;
@@ -1738,10 +1756,21 @@ bool cmQtAutoGenInitializer::SetupWriteAutogenInfo()
this->GenTarget, "AUTOMOC_MACRO_NAMES", nullptr, nullptr);
EvaluatedTargetPropertyEntries InterfaceAutoMocMacroNamesEntries;
- AddInterfaceEntries(this->GenTarget, this->ConfigDefault,
- "INTERFACE_AUTOMOC_MACRO_NAMES", "CXX", &dagChecker,
- InterfaceAutoMocMacroNamesEntries,
- IncludeRuntimeInterface::Yes);
+ if (this->MultiConfig) {
+ for (auto const& cfg : this->ConfigsList) {
+ if (!cfg.empty()) {
+ AddInterfaceEntries(this->GenTarget, cfg,
+ "INTERFACE_AUTOMOC_MACRO_NAMES", "CXX",
+ &dagChecker, InterfaceAutoMocMacroNamesEntries,
+ IncludeRuntimeInterface::Yes);
+ }
+ }
+ } else {
+ AddInterfaceEntries(this->GenTarget, this->ConfigDefault,
+ "INTERFACE_AUTOMOC_MACRO_NAMES", "CXX", &dagChecker,
+ InterfaceAutoMocMacroNamesEntries,
+ IncludeRuntimeInterface::Yes);
+ }
for (auto const& entry : InterfaceAutoMocMacroNamesEntries.Entries) {
this->Moc.MacroNames.insert(this->Moc.MacroNames.end(),
diff --git a/Tests/RunCMake/Autogen/MocGeneratedFile.cmake b/Tests/RunCMake/Autogen/MocGeneratedFile.cmake
new file mode 100644
index 0000000..7bb55e9
--- /dev/null
+++ b/Tests/RunCMake/Autogen/MocGeneratedFile.cmake
@@ -0,0 +1,15 @@
+enable_language(CXX)
+
+find_package(Qt${with_qt_version} REQUIRED COMPONENTS Core)
+
+set(CMAKE_AUTOMOC ON)
+
+set(GEN_SRC "class_$<CONFIG>.cpp")
+add_custom_command(
+ OUTPUT "${GEN_SRC}"
+ COMMAND ${CMAKE_COMMAND} -E echo "// cpp src" > "${GEN_SRC}"
+ VERBATIM
+)
+
+add_library(libgen STATIC ${GEN_SRC})
+target_link_libraries(libgen Qt${with_qt_version}::Core)
diff --git a/Tests/RunCMake/Autogen/RunCMakeTest.cmake b/Tests/RunCMake/Autogen/RunCMakeTest.cmake
index 97b64ed..4fe9406 100644
--- a/Tests/RunCMake/Autogen/RunCMakeTest.cmake
+++ b/Tests/RunCMake/Autogen/RunCMakeTest.cmake
@@ -103,4 +103,23 @@ if (DEFINED with_qt_version)
endblock()
endif()
endif()
+
+ if(RunCMake_GENERATOR_IS_MULTI_CONFIG AND NOT RunCMake_GENERATOR MATCHES "Xcode")
+ block()
+ set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/MocGeneratedFile-build)
+ run_cmake(MocGeneratedFile)
+ set(RunCMake_TEST_NO_CLEAN 1)
+ run_cmake_command(MocGeneratedFile-build ${CMAKE_COMMAND} --build . --config Debug --verbose)
+ endblock()
+ if(RunCMake_GENERATOR MATCHES "Ninja Multi-Config")
+ block()
+ set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/MocGeneratedFile-cross-config-build)
+ list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_CROSS_CONFIGS=all)
+ run_cmake(MocGeneratedFile)
+ set(RunCMake_TEST_NO_CLEAN 1)
+ run_cmake_command(MocGeneratedFile-cross-config-build ${CMAKE_COMMAND} --build . --config Release --target libgen:Debug)
+ run_cmake_command(MocGeneratedFile-cross-config-build ${CMAKE_COMMAND} --build . --config Debug --target libgen:Release)
+ endblock()
+ endif()
+ endif()
endif ()