summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-05-31 13:34:04 (GMT)
committerKitware Robot <kwrobot@kitware.com>2023-05-31 13:34:23 (GMT)
commit826825fe34df12e7e9b5d46a9df0011b0c70b1ba (patch)
tree4fa895c4ec10ac9f600f2f6902e61d283d480ea0
parent5b063510f9a60bb775e9554866fce7edc286fb3c (diff)
parent2bb3d9b6448efd2aab4db3e33a16b22a1b1b097f (diff)
downloadCMake-826825fe34df12e7e9b5d46a9df0011b0c70b1ba.zip
CMake-826825fe34df12e7e9b5d46a9df0011b0c70b1ba.tar.gz
CMake-826825fe34df12e7e9b5d46a9df0011b0c70b1ba.tar.bz2
Merge topic 'orkun_24848_19_05_2023'
2bb3d9b644 Autogen: Fix multi-config generated file issue 3bd605f3d0 Autogen: Optimize cmake_autogen execution for CROSS_CONFIG usage f2f21c5752 Improve Const Correctness Acked-by: Kitware Robot <kwrobot@kitware.com> Tested-by: buildbot <buildbot@kitware.com> Merge-request: !8507
-rw-r--r--Source/cmQtAutoGenInitializer.cxx95
-rw-r--r--Tests/RunCMake/Autogen/MocGeneratedFile.cmake15
-rw-r--r--Tests/RunCMake/Autogen/RunCMakeTest.cmake19
3 files changed, 103 insertions, 26 deletions
diff --git a/Source/cmQtAutoGenInitializer.cxx b/Source/cmQtAutoGenInitializer.cxx
index 76bb0cd..2c48e78 100644
--- a/Source/cmQtAutoGenInitializer.cxx
+++ b/Source/cmQtAutoGenInitializer.cxx
@@ -344,7 +344,7 @@ bool cmQtAutoGenInitializer::InitCustomTargets()
// Verbosity
{
- std::string def =
+ std::string const def =
this->Makefile->GetSafeDefinition("CMAKE_AUTOGEN_VERBOSE");
if (!def.empty()) {
unsigned long iVerb = 0;
@@ -546,7 +546,7 @@ bool cmQtAutoGenInitializer::InitCustomTargets()
this->Moc.MacroNames.erase(cmRemoveDuplicates(this->Moc.MacroNames),
this->Moc.MacroNames.end());
{
- cmList filterList = { this->GenTarget->GetSafeProperty(
+ cmList const filterList = { this->GenTarget->GetSafeProperty(
"AUTOMOC_DEPEND_FILTERS") };
if ((filterList.size() % 2) != 0) {
cmSystemTools::Error(
@@ -650,7 +650,7 @@ bool cmQtAutoGenInitializer::InitMoc()
// Moc includes
{
- SearchPathSanitizer sanitizer(this->Makefile);
+ SearchPathSanitizer const sanitizer(this->Makefile);
auto getDirs =
[this, &sanitizer](std::string const& cfg) -> std::vector<std::string> {
// Get the include dirs for this target, without stripping the implicit
@@ -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;
@@ -1037,7 +1055,7 @@ bool cmQtAutoGenInitializer::InitScanFiles()
property = "SKIP_AUTOUIC";
}
std::string files;
- for (MUFile* muf : this->AutogenTarget.FilesGenerated) {
+ for (MUFile const* muf : this->AutogenTarget.FilesGenerated) {
files += cmStrCat(" ", Quoted(muf->FullPath), '\n');
}
this->Makefile->IssueMessage(
@@ -1068,7 +1086,7 @@ bool cmQtAutoGenInitializer::InitScanFiles()
property = "SKIP_AUTOUIC";
}
std::string files;
- for (cmSourceFile* sf : this->AutogenTarget.CMP0100HeadersWarn) {
+ for (cmSourceFile const* sf : this->AutogenTarget.CMP0100HeadersWarn) {
files += cmStrCat(" ", Quoted(sf->GetFullPath()), '\n');
}
this->Makefile->IssueMessage(
@@ -1089,7 +1107,7 @@ bool cmQtAutoGenInitializer::InitScanFiles()
if (!this->Rcc.Qrcs.empty()) {
const bool modernQt = (this->QtVersion.Major >= 5);
// Target rcc options
- cmList optionsTarget{ this->GenTarget->GetSafeProperty(
+ cmList const optionsTarget{ this->GenTarget->GetSafeProperty(
kw.AUTORCC_OPTIONS) };
// Check if file name is unique
@@ -1168,7 +1186,8 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
if (this->Moc.Enabled) {
this->AddGeneratedSource(this->Moc.CompilationFile, this->Moc, true);
if (useNinjaDepfile) {
- if (this->MultiConfig) {
+ if (this->MultiConfig &&
+ !this->Makefile->GetSafeDefinition("CMAKE_CROSS_CONFIGS").empty()) {
// Make all mocs_compilation_<CONFIG>.cpp files byproducts of the
// ${target}_autogen/timestamp custom command.
// We cannot just use Moc.CompilationFileGenex here, because that
@@ -1213,12 +1232,25 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
// instead of fiddling with the include directories
std::vector<std::string> configs;
this->GlobalGen->GetQtAutoGenConfigs(configs);
- bool stdPipesUTF8 = true;
+ bool constexpr stdPipesUTF8 = true;
cmCustomCommandLines commandLines;
- for (auto const& config : configs) {
+ if (this->Makefile->GetSafeDefinition("CMAKE_CROSS_CONFIGS").empty()) {
+ std::string autugenInfoFileconfig;
+ if (this->MultiConfig) {
+ autugenInfoFileconfig = "$<CONFIG>";
+ } else {
+ autugenInfoFileconfig = configs[0];
+ }
commandLines.push_back(cmMakeCommandLine(
{ cmSystemTools::GetCMakeCommand(), "-E", "cmake_autogen",
- this->AutogenTarget.InfoFile, config }));
+ this->AutogenTarget.InfoFile, autugenInfoFileconfig }));
+
+ } else {
+ for (auto const& config : configs) {
+ commandLines.push_back(cmMakeCommandLine(
+ { cmSystemTools::GetCMakeCommand(), "-E", "cmake_autogen",
+ this->AutogenTarget.InfoFile, config }));
+ }
}
// Use PRE_BUILD on demand
@@ -1244,7 +1276,7 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
// Create the autogen target/command
if (usePRE_BUILD) {
// Add additional autogen target dependencies to origin target
- for (cmTarget* depTarget : this->AutogenTarget.DependTargets) {
+ for (cmTarget const* depTarget : this->AutogenTarget.DependTargets) {
this->GenTarget->Target->AddUtility(depTarget->GetName(), false,
this->Makefile);
}
@@ -1724,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(),
@@ -1747,11 +1790,11 @@ bool cmQtAutoGenInitializer::SetupWriteAutogenInfo()
info.SetConfig("MOC_COMPILATION_FILE", this->Moc.CompilationFile);
info.SetConfig("MOC_PREDEFS_FILE", this->Moc.PredefsFile);
- cmStandardLevelResolver resolver{ this->Makefile };
- auto CompileOptionFlag =
+ cmStandardLevelResolver const resolver{ this->Makefile };
+ auto const CompileOptionFlag =
resolver.GetCompileOptionDef(this->GenTarget, "CXX", "");
- auto CompileOptionValue =
+ auto const CompileOptionValue =
this->GenTarget->Makefile->GetSafeDefinition(CompileOptionFlag);
if (!CompileOptionValue.empty()) {
@@ -1995,13 +2038,13 @@ static cmQtAutoGen::IntegerVersion GetMocVersion(
return parseMocVersion(capturedStdOut);
}
-static std::string FindMocExecutableFromMocTarget(cmMakefile* makefile,
+static std::string FindMocExecutableFromMocTarget(cmMakefile const* makefile,
unsigned int qtMajorVersion)
{
std::string result;
const std::string mocTargetName =
"Qt" + std::to_string(qtMajorVersion) + "::moc";
- cmTarget* mocTarget = makefile->FindTargetToUse(mocTargetName);
+ cmTarget const* mocTarget = makefile->FindTargetToUse(mocTargetName);
if (mocTarget) {
result = mocTarget->GetSafeProperty("IMPORTED_LOCATION");
}
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 ()