Browse Source

ExternalProject: Fix install on BUILD_ALWAYS+BUILD_BYPRODUCTS with Ninja

The `BUILD_BYPRODUCTS` option causes the ExternalProject's `build` step
in `build.ninja` to have `restat = 1`, so its "always out-of-date"
status caused by `BUILD_ALWAYS` does not propagate to the `install`
step.  Mark the latter step as explicitly always out-of-date too.

Fixes: #23820
Maik Nijhuis 3 years ago
parent
commit
81fd0d6e26
2 changed files with 17 additions and 0 deletions
  1. 14 0
      Modules/ExternalProject.cmake
  2. 3 0
      Tests/RunCMake/ExternalProject/BUILD_ALWAYS.cmake

+ 14 - 0
Modules/ExternalProject.cmake

@@ -3829,6 +3829,19 @@ function(_ep_add_install_command name)
     set(uses_terminal "")
   endif()
 
+  # With BUILD_ALWAYS+BUILD_BYPRODUCTS, Ninja restats the
+  # build step outputs and may not consider this step to
+  # be out-of-date.  Explicitly mark it out-of-date too.
+  get_property(build_always
+    TARGET ${name}
+    PROPERTY _EP_BUILD_ALWAYS
+  )
+  if(build_always)
+    set(always 1)
+  else()
+    set(always 0)
+  endif()
+
   set(__cmdQuoted)
   foreach(__item IN LISTS cmd)
     string(APPEND __cmdQuoted " [==[${__item}]==]")
@@ -3839,6 +3852,7 @@ function(_ep_add_install_command name)
       COMMAND ${__cmdQuoted}
       WORKING_DIRECTORY \${binary_dir}
       DEPENDEES build
+      ALWAYS \${always}
       ${log}
       ${uses_terminal}
     )"

+ 3 - 0
Tests/RunCMake/ExternalProject/BUILD_ALWAYS.cmake

@@ -12,6 +12,9 @@ ExternalProject_Add(always
   DOWNLOAD_COMMAND ""
   CONFIGURE_COMMAND "${CMAKE_COMMAND}" -P ${CMAKE_CURRENT_BINARY_DIR}/always-configure.cmake
   BUILD_COMMAND "${CMAKE_COMMAND}" -P ${CMAKE_CURRENT_BINARY_DIR}/always-build.cmake
+        COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${CMAKE_CURRENT_LIST_FILE}
+                   "${CMAKE_CURRENT_BINARY_DIR}/byproduct.txt"
+  BUILD_BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/byproduct.txt"
   BUILD_ALWAYS 1
   INSTALL_COMMAND "${CMAKE_COMMAND}" -P ${CMAKE_CURRENT_BINARY_DIR}/always-install.cmake
   )