Prechádzať zdrojové kódy

Merge topic 'externalproject_download_dir'

b8b87489 ExternalProject: Support substituting <DOWNLOAD_DIR>

Acked-by: Kitware Robot <[email protected]>
Merge-request: !1537
Brad King 8 rokov pred
rodič
commit
e1a09cfbd1

+ 5 - 0
Help/release/dev/ExternalProject-DOWNLOAD_DIR.rst

@@ -0,0 +1,5 @@
+ExternalProject
+---------------
+
+* The :module:`ExternalProject` module learnt to substitute ``<DOWNLOAD_DIR>``
+  in comments, commands, working directory and byproducts.

+ 4 - 3
Modules/ExternalProject.cmake

@@ -714,8 +714,9 @@ control needed to implement such step-level capabilities.
   The command line, comment, working directory and byproducts of every
   The command line, comment, working directory and byproducts of every
   standard and custom step are processed to replace the tokens
   standard and custom step are processed to replace the tokens
   ``<SOURCE_DIR>``, ``<SOURCE_SUBDIR>``, ``<BINARY_DIR>``, ``<INSTALL_DIR>``
   ``<SOURCE_DIR>``, ``<SOURCE_SUBDIR>``, ``<BINARY_DIR>``, ``<INSTALL_DIR>``
-  and ``<TMP_DIR>`` with their corresponding property values defined in the
-  original call to :command:`ExternalProject_Add`.
+  ``<TMP_DIR>``, ``<DOWNLOAD_DIR>`` and ``<DOWNLOADED_FILE>`` with their
+  corresponding property values defined in the original call to
+  :command:`ExternalProject_Add`.
 
 
 .. command:: ExternalProject_Add_StepTargets
 .. command:: ExternalProject_Add_StepTargets
 
 
@@ -1665,7 +1666,7 @@ macro(_ep_replace_location_tags target_name)
   set(vars ${ARGN})
   set(vars ${ARGN})
   foreach(var ${vars})
   foreach(var ${vars})
     if(${var})
     if(${var})
-      foreach(dir SOURCE_DIR SOURCE_SUBDIR BINARY_DIR INSTALL_DIR TMP_DIR DOWNLOADED_FILE)
+      foreach(dir SOURCE_DIR SOURCE_SUBDIR BINARY_DIR INSTALL_DIR TMP_DIR DOWNLOAD_DIR DOWNLOADED_FILE)
         get_property(val TARGET ${target_name} PROPERTY _EP_${dir})
         get_property(val TARGET ${target_name} PROPERTY _EP_${dir})
         string(REPLACE "<${dir}>" "${val}" ${var} "${${var}}")
         string(REPLACE "<${dir}>" "${val}" ${var} "${${var}}")
       endforeach()
       endforeach()

+ 28 - 7
Tests/RunCMake/ExternalProject/RunCMakeTest.cmake

@@ -15,10 +15,31 @@ run_cmake(UsesTerminal)
 
 
 # Run both cmake and build steps. We always do a clean before the
 # Run both cmake and build steps. We always do a clean before the
 # build to ensure that the download step re-runs each time.
 # build to ensure that the download step re-runs each time.
-set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/MultiCommand-build)
-set(RunCMake_TEST_NO_CLEAN 1)
-file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
-file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
-run_cmake(MultiCommand)
-run_cmake_command(MultiCommand-clean ${CMAKE_COMMAND} --build . --target clean)
-run_cmake_command(MultiCommand-build ${CMAKE_COMMAND} --build .)
+function(__ep_test_with_build testName)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${testName}-build)
+  set(RunCMake_TEST_NO_CLEAN 1)
+  file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
+  file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
+  run_cmake(${testName})
+  run_cmake_command(${testName}-clean ${CMAKE_COMMAND} --build . --target clean)
+  run_cmake_command(${testName}-build ${CMAKE_COMMAND} --build .)
+endfunction()
+
+__ep_test_with_build(MultiCommand)
+
+# We can't test the substitution when using the old MSYS due to
+# make/sh mangling the paths (substitution is performed correctly,
+# but the mangling means we can't reliably test the output).
+# There is no such issue when using the newer MSYS though. Therefore,
+# we need to bypass the substitution test if using old MSYS.
+# See merge request 1537 for discussion.
+set(doSubstitutionTest YES)
+if(RunCMake_GENERATOR STREQUAL "MSYS Makefiles")
+  execute_process(COMMAND uname OUTPUT_VARIABLE uname)
+  if(uname MATCHES "^MINGW32_NT")
+      set(doSubstitutionTest NO)
+  endif()
+endif()
+if(doSubstitutionTest)
+    __ep_test_with_build(Substitutions)
+endif()

+ 7 - 0
Tests/RunCMake/ExternalProject/Substitutions-build-stdout.txt

@@ -0,0 +1,7 @@
+.*Download dir  = .*/xxxx_dwn
+.*Download file = .*/zzzz_tmp.txt
+.*Source dir    = .*/xxxx_src
+.*Source subdir = /yyyy_subdir
+.*Binary dir    = .*/xxxx_bin
+.*Install dir   = .*/xxxx_install
+.*Tmp dir       = .*/xxxx_tmp

+ 25 - 0
Tests/RunCMake/ExternalProject/Substitutions.cmake

@@ -0,0 +1,25 @@
+include(ExternalProject)
+
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/zzzz_tmp.txt "Dummy file")
+file(MD5   ${CMAKE_CURRENT_BINARY_DIR}/zzzz_tmp.txt md5hash)
+ExternalProject_Add(Subst
+    URL           file://${CMAKE_CURRENT_BINARY_DIR}/zzzz_tmp.txt
+    URL_HASH      MD5=${md5hash}
+    DOWNLOAD_NO_EXTRACT ON
+    DOWNLOAD_DIR  ${CMAKE_CURRENT_BINARY_DIR}/xxxx_dwn
+    SOURCE_DIR    ${CMAKE_CURRENT_BINARY_DIR}/xxxx_src
+    SOURCE_SUBDIR yyyy_subdir
+    BINARY_DIR    ${CMAKE_CURRENT_BINARY_DIR}/xxxx_bin
+    INSTALL_DIR   ${CMAKE_CURRENT_BINARY_DIR}/xxxx_install
+    TMP_DIR       ${CMAKE_CURRENT_BINARY_DIR}/xxxx_tmp
+    CONFIGURE_COMMAND ${CMAKE_COMMAND} -E echo "Download dir  = <DOWNLOAD_DIR>"
+              COMMAND ${CMAKE_COMMAND} -E echo "Download file = <DOWNLOADED_FILE>"
+              COMMAND ${CMAKE_COMMAND} -E echo "Source dir    = <SOURCE_DIR>"
+              COMMAND ${CMAKE_COMMAND} -E echo "Source subdir = <SOURCE_SUBDIR>"
+              COMMAND ${CMAKE_COMMAND} -E echo "Binary dir    = <BINARY_DIR>"
+              COMMAND ${CMAKE_COMMAND} -E echo "Install dir   = <INSTALL_DIR>"
+              COMMAND ${CMAKE_COMMAND} -E echo "Tmp dir       = <TMP_DIR>"
+    BUILD_COMMAND ""
+    INSTALL_COMMAND ""
+    TEST_COMMAND ""
+)