diff options
-rw-r--r-- | Modules/FetchContent.cmake | 49 | ||||
-rw-r--r-- | Tests/RunCMake/CMP0135/CMP0135-Common.cmake | 37 | ||||
-rw-r--r-- | Tests/RunCMake/CMP0135/CMP0135-NEW-stdout.txt | 3 | ||||
-rw-r--r-- | Tests/RunCMake/CMP0135/CMP0135-OLD-stdout.txt | 3 | ||||
-rw-r--r-- | Tests/RunCMake/CMP0135/CMP0135-WARN-stderr.txt | 11 | ||||
-rw-r--r-- | Tests/RunCMake/CMP0135/CMP0135-WARN-stdout.txt | 3 |
6 files changed, 92 insertions, 14 deletions
diff --git a/Modules/FetchContent.cmake b/Modules/FetchContent.cmake index 5ca296e..83aafa8 100644 --- a/Modules/FetchContent.cmake +++ b/Modules/FetchContent.cmake @@ -1159,9 +1159,12 @@ function(FetchContent_Declare contentName) set(options "") set(oneValueArgs + SVN_REPOSITORY + DOWNLOAD_NO_EXTRACT + DOWNLOAD_EXTRACT_TIMESTAMP + URL BINARY_DIR SOURCE_DIR - SVN_REPOSITORY ) set(multiValueArgs "") @@ -1188,13 +1191,47 @@ function(FetchContent_Declare contentName) string(SHA1 urlSHA ${ARG_SVN_REPOSITORY}) string(SUBSTRING ${urlSHA} 0 7 urlSHA) string(APPEND ARG_SOURCE_DIR "-${urlSHA}") - list(PREPEND ARG_UNPARSED_ARGUMENTS SVN_REPOSITORY "${ARG_SVN_REPOSITORY}") endif() - list(PREPEND ARG_UNPARSED_ARGUMENTS - SOURCE_DIR "${ARG_SOURCE_DIR}" - BINARY_DIR "${ARG_BINARY_DIR}" - ) + # The ExternalProject_Add() call in the sub-build won't see the CMP0135 + # policy setting of our caller. Work out if that policy will be needed and + # explicitly set the relevant option if not already provided. The condition + # here is essentially an abbreviated version of the logic in + # ExternalProject's _ep_add_download_command() function. + if(ARG_URL AND + NOT IS_DIRECTORY "${ARG_URL}" AND + NOT ARG_DOWNLOAD_NO_EXTRACT AND + NOT DEFINED ARG_DOWNLOAD_EXTRACT_TIMESTAMP) + cmake_policy(GET CMP0135 _FETCHCONTENT_CMP0135 + PARENT_SCOPE # undocumented, do not use outside of CMake + ) + if(_FETCHCONTENT_CMP0135 STREQUAL "") + message(AUTHOR_WARNING + "The DOWNLOAD_EXTRACT_TIMESTAMP option was not given and policy " + "CMP0135 is not set. The policy's OLD behavior will be used. " + "When using a URL download, the timestamps of extracted files " + "should preferably be that of the time of extraction, otherwise " + "code that depends on the extracted contents might not be " + "rebuilt if the URL changes. The OLD behavior preserves the " + "timestamps from the archive instead, but this is usually not " + "what you want. Update your project to the NEW behavior or " + "specify the DOWNLOAD_EXTRACT_TIMESTAMP option with a value of " + "true to avoid this robustness issue." + ) + set(ARG_DOWNLOAD_EXTRACT_TIMESTAMP TRUE) + elseif(_FETCHCONTENT_CMP0135 STREQUAL "NEW") + set(ARG_DOWNLOAD_EXTRACT_TIMESTAMP FALSE) + else() + set(ARG_DOWNLOAD_EXTRACT_TIMESTAMP TRUE) + endif() + endif() + + # Add back in the keyword args we pulled out and potentially tweaked/added + foreach(key IN LISTS oneValueArgs) + if(DEFINED ARG_${key}) + list(PREPEND ARG_UNPARSED_ARGUMENTS ${key} "${ARG_${key}}") + endif() + endforeach() set(__argsQuoted) foreach(__item IN LISTS ARG_UNPARSED_ARGUMENTS) diff --git a/Tests/RunCMake/CMP0135/CMP0135-Common.cmake b/Tests/RunCMake/CMP0135/CMP0135-Common.cmake index 4b7cce5..ad60b7c 100644 --- a/Tests/RunCMake/CMP0135/CMP0135-Common.cmake +++ b/Tests/RunCMake/CMP0135/CMP0135-Common.cmake @@ -1,7 +1,8 @@ +#============================================================================== +# ExternalProject +#============================================================================== +set(stamp_dir "${CMAKE_CURRENT_BINARY_DIR}/stamps-ep") include(ExternalProject) - -set(stamp_dir "${CMAKE_CURRENT_BINARY_DIR}/stamps") - ExternalProject_Add(fake_ext_proj # We don't actually do a build, so we never try to download from this URL URL https://example.com/something.zip @@ -12,7 +13,33 @@ ExternalProject_Add(fake_ext_proj set(extraction_script "${stamp_dir}/extract-fake_ext_proj.cmake") file(STRINGS "${extraction_script}" results REGEX "--touch") if("${results}" STREQUAL "") - message(STATUS "Using timestamps from archive") + message(STATUS "ExternalProject: Using timestamps from archive") +else() + message(STATUS "ExternalProject: Using extraction time for the timestamps") +endif() + +#============================================================================== +# FetchContent +#============================================================================== +set(stamp_dir "${CMAKE_CURRENT_BINARY_DIR}/stamps-fc") +set(archive_file ${CMAKE_CURRENT_BINARY_DIR}/test_archive.7z) +file(ARCHIVE_CREATE + OUTPUT ${archive_file} + PATHS ${CMAKE_CURRENT_LIST_DIR} + FORMAT 7zip +) +include(FetchContent) +FetchContent_Declare(fake_fc_proj + URL file://${archive_file} + STAMP_DIR ${stamp_dir} +) +FetchContent_MakeAvailable(fake_fc_proj) + +# Report whether the --touch option was added to the extraction script +set(extraction_script "${stamp_dir}/extract-fake_fc_proj-populate.cmake") +file(STRINGS "${extraction_script}" results REGEX "--touch") +if("${results}" STREQUAL "") + message(STATUS "FetchContent: Using timestamps from archive") else() - message(STATUS "Using extraction time for the timestamps") + message(STATUS "FetchContent: Using extraction time for the timestamps") endif() diff --git a/Tests/RunCMake/CMP0135/CMP0135-NEW-stdout.txt b/Tests/RunCMake/CMP0135/CMP0135-NEW-stdout.txt index bf53c0b..ceef9b8 100644 --- a/Tests/RunCMake/CMP0135/CMP0135-NEW-stdout.txt +++ b/Tests/RunCMake/CMP0135/CMP0135-NEW-stdout.txt @@ -1 +1,2 @@ -Using extraction time for the timestamps +-- ExternalProject: Using extraction time for the timestamps +-- FetchContent: Using extraction time for the timestamps diff --git a/Tests/RunCMake/CMP0135/CMP0135-OLD-stdout.txt b/Tests/RunCMake/CMP0135/CMP0135-OLD-stdout.txt index ee57beb..1288c20 100644 --- a/Tests/RunCMake/CMP0135/CMP0135-OLD-stdout.txt +++ b/Tests/RunCMake/CMP0135/CMP0135-OLD-stdout.txt @@ -1 +1,2 @@ -Using timestamps from archive +-- ExternalProject: Using timestamps from archive +-- FetchContent: Using timestamps from archive diff --git a/Tests/RunCMake/CMP0135/CMP0135-WARN-stderr.txt b/Tests/RunCMake/CMP0135/CMP0135-WARN-stderr.txt index 8ba0027..6bf944e 100644 --- a/Tests/RunCMake/CMP0135/CMP0135-WARN-stderr.txt +++ b/Tests/RunCMake/CMP0135/CMP0135-WARN-stderr.txt @@ -8,3 +8,14 @@ CMake Warning \(dev\) at .*/Modules/ExternalProject.cmake:[0-9]+ \(message\): what you want\. Update your project to the NEW behavior or specify the DOWNLOAD_EXTRACT_TIMESTAMP option with a value of true to avoid this robustness issue\. +.* +CMake Warning \(dev\) at .*/Modules/FetchContent.cmake:[0-9]+ \(message\): + The DOWNLOAD_EXTRACT_TIMESTAMP option was not given and policy CMP0135 is + not set\. The policy's OLD behavior will be used\. When using a URL + download, the timestamps of extracted files should preferably be that of + the time of extraction, otherwise code that depends on the extracted + contents might not be rebuilt if the URL changes\. The OLD behavior + preserves the timestamps from the archive instead, but this is usually not + what you want\. Update your project to the NEW behavior or specify the + DOWNLOAD_EXTRACT_TIMESTAMP option with a value of true to avoid this + robustness issue\. diff --git a/Tests/RunCMake/CMP0135/CMP0135-WARN-stdout.txt b/Tests/RunCMake/CMP0135/CMP0135-WARN-stdout.txt index ee57beb..1288c20 100644 --- a/Tests/RunCMake/CMP0135/CMP0135-WARN-stdout.txt +++ b/Tests/RunCMake/CMP0135/CMP0135-WARN-stdout.txt @@ -1 +1,2 @@ -Using timestamps from archive +-- ExternalProject: Using timestamps from archive +-- FetchContent: Using timestamps from archive |