diff --git a/Source/cmQtAutoGenInitializer.cxx b/Source/cmQtAutoGenInitializer.cxx
index 2894201c9b35513a7342c1319fe11ad03c3bc88e..4dd78e514f5925de07c5c8c4a115043aa96fb601 100644
--- a/Source/cmQtAutoGenInitializer.cxx
+++ b/Source/cmQtAutoGenInitializer.cxx
@@ -1111,11 +1111,30 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
   // Register info file as generated by CMake
   this->Makefile->AddCMakeOutputFile(this->AutogenTarget.InfoFile);
 
+  // Determine whether to use a depfile for the AUTOGEN target.
+  const bool useNinjaDepfile = this->QtVersion >= IntegerVersion(5, 15) &&
+    this->GlobalGen->GetName().find("Ninja") != std::string::npos;
+
   // Files provided by the autogen target
   std::vector<std::string> autogenByproducts;
+  std::vector<std::string> timestampByproducts;
   if (this->Moc.Enabled) {
     this->AddGeneratedSource(this->Moc.CompilationFile, this->Moc, true);
-    autogenByproducts.push_back(this->Moc.CompilationFileGenex);
+    if (useNinjaDepfile) {
+      if (this->MultiConfig) {
+        // Make all mocs_compilation_<CONFIG>.cpp files byproducts of the
+        // ${target}_autogen/timestamp custom command.
+        // We cannot just use Moc.CompilationFileGenex here, because that
+        // custom command runs cmake_autogen for each configuration.
+        for (const auto& p : this->Moc.CompilationFile.Config) {
+          timestampByproducts.push_back(p.second);
+        }
+      } else {
+        timestampByproducts.push_back(this->Moc.CompilationFileGenex);
+      }
+    } else {
+      autogenByproducts.push_back(this->Moc.CompilationFileGenex);
+    }
   }
 
   if (this->Uic.Enabled) {
@@ -1265,8 +1284,6 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
       this->AutogenTarget.DependFiles.begin(),
       this->AutogenTarget.DependFiles.end());
 
-    const bool useNinjaDepfile = this->QtVersion >= IntegerVersion(5, 15) &&
-      this->GlobalGen->GetName().find("Ninja") != std::string::npos;
     if (useNinjaDepfile) {
       // Create a custom command that generates a timestamp file and
       // has a depfile assigned. The depfile is created by JobDepFilesMergeT.
@@ -1327,8 +1344,9 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
       this->AddGeneratedSource(outputFile, this->Moc);
       const std::string no_main_dependency;
       this->LocalGen->AddCustomCommandToOutput(
-        outputFile, dependencies, no_main_dependency, commandLines,
-        autogenComment.c_str(), this->Dir.Work.c_str(),
+        { outputFile }, timestampByproducts, dependencies, no_main_dependency,
+        /*implicit_depends=*/{}, commandLines, autogenComment.c_str(),
+        this->Dir.Work.c_str(),
         /*cmp0116=*/cmPolicies::NEW, /*replace=*/false,
         /*escapeOldStyle=*/false,
         /*uses_terminal=*/false,