Browse Source

Merge topic 'ExternalProject-BUILD_ALWAYS-install'

81fd0d6e26 ExternalProject: Fix install on BUILD_ALWAYS+BUILD_BYPRODUCTS with Ninja
d9e88721ad ExternalProject: Add test case for BUILD_ALWAYS

Acked-by: Kitware Robot <[email protected]>
Merge-request: !7546
Brad King 3 years ago
parent
commit
3907c08146

+ 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}
     )"

+ 6 - 0
Tests/RunCMake/ExternalProject/BUILD_ALWAYS-build1-stdout.txt

@@ -0,0 +1,6 @@
+.*-- once: configure
+.*-- once: build
+.*-- once: install
+.*-- always: configure
+.*-- always: build
+.*-- always: install

+ 2 - 0
Tests/RunCMake/ExternalProject/BUILD_ALWAYS-build2-stdout.txt

@@ -0,0 +1,2 @@
+.*-- always: build
+.*-- always: install

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

@@ -0,0 +1,20 @@
+include(ExternalProject)
+
+ExternalProject_Add(once
+  DOWNLOAD_COMMAND ""
+  CONFIGURE_COMMAND "${CMAKE_COMMAND}" -P ${CMAKE_CURRENT_BINARY_DIR}/once-configure.cmake
+  BUILD_COMMAND "${CMAKE_COMMAND}" -P ${CMAKE_CURRENT_BINARY_DIR}/once-build.cmake
+  INSTALL_COMMAND "${CMAKE_COMMAND}" -P ${CMAKE_CURRENT_BINARY_DIR}/once-install.cmake
+  )
+
+ExternalProject_Add(always
+  DEPENDS once
+  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
+  )

+ 22 - 0
Tests/RunCMake/ExternalProject/RunCMakeTest.cmake

@@ -177,6 +177,28 @@ if(doSubstitutionTest)
     __ep_test_with_build(Substitutions)
 endif()
 
+function(__ep_test_BUILD_ALWAYS)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/BUILD_ALWAYS-build)
+  run_cmake(BUILD_ALWAYS)
+  set(RunCMake_TEST_NO_CLEAN 1)
+  file(WRITE "${RunCMake_TEST_BINARY_DIR}/once-configure.cmake" [[message(STATUS "once: configure")]])
+  file(WRITE "${RunCMake_TEST_BINARY_DIR}/once-build.cmake" [[message(STATUS "once: build")]])
+  file(WRITE "${RunCMake_TEST_BINARY_DIR}/once-install.cmake" [[message(STATUS "once: install")]])
+  file(WRITE "${RunCMake_TEST_BINARY_DIR}/always-configure.cmake" [[message(STATUS "always: configure")]])
+  file(WRITE "${RunCMake_TEST_BINARY_DIR}/always-build.cmake" [[message(STATUS "always: build")]])
+  file(WRITE "${RunCMake_TEST_BINARY_DIR}/always-install.cmake" [[message(STATUS "always: install")]])
+  run_cmake_command(BUILD_ALWAYS-build1 ${CMAKE_COMMAND} --build . --target always)
+  file(WRITE "${RunCMake_TEST_BINARY_DIR}/once-configure.cmake" [[message(FATAL_ERROR "once: configure should not run again")]])
+  file(WRITE "${RunCMake_TEST_BINARY_DIR}/once-build.cmake" [[message(FATAL_ERROR "once: build should not run again")]])
+  file(WRITE "${RunCMake_TEST_BINARY_DIR}/once-install.cmake" [[message(FATAL_ERROR "once: install should not run again")]])
+  if(NOT RunCMake_GENERATOR MATCHES "^(Xcode|Visual Studio 9 )")
+    # The Xcode and VS 9 build systems decide to run this every time.
+    file(WRITE "${RunCMake_TEST_BINARY_DIR}/always-configure.cmake" [[message(FATAL_ERROR "always: configure should not run again")]])
+  endif()
+  run_cmake_command(BUILD_ALWAYS-build2 ${CMAKE_COMMAND} --build . --target always)
+endfunction()
+__ep_test_BUILD_ALWAYS()
+
 function(__ep_test_CONFIGURE_HANDLED_BY_BUILD)
   set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CONFIGURE_HANDLED_BY_BUILD-build)
   run_cmake(CONFIGURE_HANDLED_BY_BUILD)