diff options
author | Craig Scott <craig.scott@crascit.com> | 2024-06-07 07:51:38 (GMT) |
---|---|---|
committer | Craig Scott <craig.scott@crascit.com> | 2024-06-07 08:12:12 (GMT) |
commit | 9299cbbdb496a265931ef291bd028001df166489 (patch) | |
tree | bf67eed9ce1e29a331404c851bc47715048555ac | |
parent | e82e2c38c1ce4fef2962c6b5ee1de0ca90f3aa60 (diff) | |
download | CMake-9299cbbdb496a265931ef291bd028001df166489.zip CMake-9299cbbdb496a265931ef291bd028001df166489.tar.gz CMake-9299cbbdb496a265931ef291bd028001df166489.tar.bz2 |
FetchContent: Force cmake --fresh to re-execute direct population steps
Issue: #25468
-rw-r--r-- | Help/manual/cmake.1.rst | 12 | ||||
-rw-r--r-- | Help/policy/CMP0168.rst | 8 | ||||
-rw-r--r-- | Help/release/3.30.rst | 7 | ||||
-rw-r--r-- | Modules/FetchContent.cmake | 17 | ||||
-rw-r--r-- | Tests/RunCMake/FetchContent/RunCMakeTest.cmake | 8 |
5 files changed, 43 insertions, 9 deletions
diff --git a/Help/manual/cmake.1.rst b/Help/manual/cmake.1.rst index afabb75..48a9219 100644 --- a/Help/manual/cmake.1.rst +++ b/Help/manual/cmake.1.rst @@ -213,6 +213,13 @@ Options This removes any existing ``CMakeCache.txt`` file and associated ``CMakeFiles/`` directory, and recreates them from scratch. + .. versionchanged:: 3.30 + + For dependencies previously populated by :module:`FetchContent` with the + ``NEW`` setting for policy :policy:`CMP0168`, their stamp and script files + from any previous run will be removed. The download, update, and patch + steps will therefore be forced to re-execute. + .. option:: -L[A][H] List non-advanced cached variables. @@ -1381,9 +1388,8 @@ The options are: .. option:: --fresh - Perform a fresh configuration of the build tree. - This removes any existing ``CMakeCache.txt`` file and associated - ``CMakeFiles/`` directory, and recreates them from scratch. + Perform a fresh configuration of the build tree, which has the same effect + as :option:`cmake --fresh`. View Help ========= diff --git a/Help/policy/CMP0168.rst b/Help/policy/CMP0168.rst index 8317351..cab40b9 100644 --- a/Help/policy/CMP0168.rst +++ b/Help/policy/CMP0168.rst @@ -31,6 +31,11 @@ The ``NEW`` behavior has the following characteristics: * The ``PREFIX``, ``TMP_DIR``, ``STAMP_DIR``, ``LOG_DIR``, and ``DOWNLOAD_DIR`` options and their associated directory properties are ignored. The :module:`FetchContent` module controls those locations internally. +* :option:`cmake --fresh` will remove the stamp and script files used for + tracking and populating the dependency. This will force the dependency's + download, update, and patch steps to be re-executed. The directory used for + downloads is not affected by :option:`cmake --fresh`, so any previously + downloaded files for the ``URL`` download method can still be re-used. The ``OLD`` behavior has the following characteristics: @@ -44,6 +49,9 @@ The ``OLD`` behavior has the following characteristics: update, or patch steps are supported. * If the ``QUIET`` option is used, or the :variable:`FETCHCONTENT_QUIET` variable is set to true, warnings will not be shown in the output. +* :option:`cmake --fresh` has no effect on the dependency's stamp or script + files. Previously executed steps will only re-run if details about the + dependency have changed. There's a reasonably good chance that users can set the :variable:`CMAKE_POLICY_DEFAULT_CMP0168 <CMAKE_POLICY_DEFAULT_CMP<NNNN>>` diff --git a/Help/release/3.30.rst b/Help/release/3.30.rst index 8c8bb85..dc0d573 100644 --- a/Help/release/3.30.rst +++ b/Help/release/3.30.rst @@ -224,9 +224,10 @@ Other Changes * :module:`FetchContent` now prefers to populate content directly rather than using a separate sub-build. This may significantly improve configure times on some systems (Windows especially, but also on macOS when using - the Xcode generator). Policy :policy:`CMP0168` provides backward - compatibility for those projects that still rely on using a sub-build for - content population. + the Xcode generator). :option:`cmake --fresh` also forces the download, + update, and patch steps of directly populated dependencies to be re-executed. + Policy :policy:`CMP0168` provides backward compatibility for those projects + that still rely on using a sub-build for content population. * When :variable:`FETCHCONTENT_FULLY_DISCONNECTED` is set to true, :command:`FetchContent_MakeAvailable` and the single-argument form of diff --git a/Modules/FetchContent.cmake b/Modules/FetchContent.cmake index 96374c9..8488c12 100644 --- a/Modules/FetchContent.cmake +++ b/Modules/FetchContent.cmake @@ -1653,9 +1653,19 @@ function(__FetchContent_populateDirect) # extensive customization options it supports either. Note that # _EP_SOURCE_DIR and _EP_BINARY_DIR are always included in the saved args, # so we must not set them here. - set(_EP_STAMP_DIR "${FETCHCONTENT_BASE_DIR}/${contentNameLower}-stamp") - set(_EP_TMP_DIR "${FETCHCONTENT_BASE_DIR}/${contentNameLower}-tmp") - set(_EP_DOWNLOAD_DIR "${_EP_TMP_DIR}") + if(cmake_role STREQUAL "PROJECT") + # Put these under CMakeFiles so that they are removed by "cmake --fresh", + # which will cause the steps to re-run. + set(_EP_STAMP_DIR "${CMAKE_BINARY_DIR}/CMakeFiles/fc-stamp/${contentNameLower}") + set(_EP_TMP_DIR "${CMAKE_BINARY_DIR}/CMakeFiles/fc-tmp/${contentNameLower}") + else() + # We have no CMakeFiles in script mode, so keep everything together. + set(_EP_STAMP_DIR "${FETCHCONTENT_BASE_DIR}/${contentNameLower}-stamp") + set(_EP_TMP_DIR "${FETCHCONTENT_BASE_DIR}/${contentNameLower}-tmp") + endif() + # Always put downloaded things under FETCHCONTENT_BASE_DIR so that we can + # reuse previously downloaded content, even after a "cmake --fresh". + set(_EP_DOWNLOAD_DIR "${FETCHCONTENT_BASE_DIR}/${contentNameLower}-tmp") # If CMAKE_DISABLE_SOURCE_CHANGES is set to true and _EP_SOURCE_DIR is an # existing directory in our source tree, calling file(MAKE_DIRECTORY) on it @@ -1667,6 +1677,7 @@ function(__FetchContent_populateDirect) "${_EP_BINARY_DIR}" "${_EP_STAMP_DIR}" "${_EP_TMP_DIR}" + "${_EP_DOWNLOAD_DIR}" ) # We take over the stamp files and use our own for detecting whether each diff --git a/Tests/RunCMake/FetchContent/RunCMakeTest.cmake b/Tests/RunCMake/FetchContent/RunCMakeTest.cmake index c0c32f3..9eb40b9 100644 --- a/Tests/RunCMake/FetchContent/RunCMakeTest.cmake +++ b/Tests/RunCMake/FetchContent/RunCMakeTest.cmake @@ -17,6 +17,14 @@ run_cmake_with_options(VarPassthroughs -D CMP0168=OLD) run_cmake_with_cmp0168(DirectIgnoresDetails) run_cmake_with_cmp0168(FirstDetailsWin) +block(SCOPE_FOR VARIABLES) + # Reuse this test to also verify that "cmake --fresh" re-executes the steps + # when using the direct mode + set(RunCMake_TEST_NO_CLEAN 1) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/FirstDetailsWin-direct-build) + set(RunCMake_TEST_VARIANT_DESCRIPTION "-direct-fresh") + run_cmake_with_options(FirstDetailsWin -D CMP0168=NEW --fresh) +endblock() run_cmake_with_cmp0168(DownloadTwice) run_cmake_with_cmp0168(DownloadFile) run_cmake_with_cmp0168(IgnoreToolchainFile) |