فهرست منبع

Autogen: Forward dependencies when both Makefile and DEPFILE are used

Since commit ebc9e448b3 (Autogen: Add depfile support for Makefiles,
2023-09-07, v3.28.0-rc1~101^2~1) CMake does not generate the correct
dependency graph when both `Makefile` and `DEPFILE` are used.
The build of `<target_name>_autogen_timestamp_deps` fails due to
missing dependencies.  To tackle that problem, forward target
dependencies to both `<target_name>_autogen_timestamp_deps` and
`<target_name>_autogen` instead of just `<target_name>_autogen`.

Fixes: #25600
Orkun Tokdemir 1 سال پیش
والد
کامیت
d0bedb2170

+ 10 - 1
Source/cmQtAutoGenInitializer.cxx

@@ -1369,7 +1369,6 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
     std::vector<std::string> dependencies(
       this->AutogenTarget.DependFiles.begin(),
       this->AutogenTarget.DependFiles.end());
-
     if (useDepfile) {
       // Create a custom command that generates a timestamp file and
       // has a depfile assigned. The depfile is created by JobDepFilesMergeT.
@@ -1408,6 +1407,16 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
       cc->SetEscapeOldStyle(false);
       cmTarget* timestampTarget = this->LocalGen->AddUtilityCommand(
         timestampTargetName, true, std::move(cc));
+      auto const isMake =
+        this->GlobalGen->GetName().find("Make") != std::string::npos;
+      if (this->AutogenTarget.DependOrigin && isMake) {
+        for (BT<std::pair<std::string, bool>> const& depName :
+             this->GenTarget->GetUtilities()) {
+          timestampTarget->AddUtility(depName.Value.first, false,
+                                      this->Makefile);
+        }
+      }
+
       this->LocalGen->AddGeneratorTarget(
         cm::make_unique<cmGeneratorTarget>(timestampTarget, this->LocalGen));
 

+ 11 - 0
Tests/QtAutogen/AutogenTimestampDeps/CMakeLists.txt

@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 3.28)
+project(AutogenTimestampDeps)
+include("../AutogenCoreTest.cmake")
+
+set(CMAKE_AUTOMOC ON)
+
+add_custom_target(ProjectInfo
+  COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/UpdateProjectInfo.cmake
+  BYPRODUCTS ${CMAKE_BINARY_DIR}/ProjectInfo.hpp)
+
+add_subdirectory(src)

+ 6 - 0
Tests/QtAutogen/AutogenTimestampDeps/ProjectInfo.hpp.in

@@ -0,0 +1,6 @@
+#ifndef PROJECTINFO_HPP
+#define PROJECTINFO_HPP
+
+extern int VersionMajor;
+
+#endif // PROJECTINFO_HPP

+ 2 - 0
Tests/QtAutogen/AutogenTimestampDeps/cmake/UpdateProjectInfo.cmake

@@ -0,0 +1,2 @@
+
+configure_file(${CMAKE_CURRENT_LIST_DIR}/../ProjectInfo.hpp.in ${CMAKE_BINARY_DIR}/ProjectInfo.hpp @ONLY)

+ 4 - 0
Tests/QtAutogen/AutogenTimestampDeps/src/CMakeLists.txt

@@ -0,0 +1,4 @@
+add_executable(Exe main.cpp ${CMAKE_BINARY_DIR}/ProjectInfo.hpp)
+add_dependencies(Exe ProjectInfo)
+target_include_directories(Exe PRIVATE ${CMAKE_BINARY_DIR})
+target_link_libraries(Exe PRIVATE ${QT_QTCORE_TARGET})

+ 5 - 0
Tests/QtAutogen/AutogenTimestampDeps/src/main.cpp

@@ -0,0 +1,5 @@
+#include "ProjectInfo.hpp"
+int main(int argc, char* argv[])
+{
+  return 0;
+}

+ 1 - 0
Tests/QtAutogen/Tests.cmake

@@ -2,6 +2,7 @@
 ADD_AUTOGEN_TEST(AutogenOriginDependsOff autogenOriginDependsOff)
 ADD_AUTOGEN_TEST(AutogenOriginDependsOn)
 ADD_AUTOGEN_TEST(AutogenTargetDepends)
+ADD_AUTOGEN_TEST(AutogenTimestampDeps)
 ADD_AUTOGEN_TEST(AutoMocGeneratedFile)
 ADD_AUTOGEN_TEST(Complex QtAutogen)
 ADD_AUTOGEN_TEST(GlobalAutogenSystemUseInclude)