From 0370507fedc6e16b43f69d8eb4add888b2fc1208 Mon Sep 17 00:00:00 2001 From: Gerhard Olsson <6248932+gerhardol@users.noreply.github.com> Date: Mon, 8 Apr 2024 18:24:10 +0200 Subject: [PATCH] Custom cache directory name (#543) * Custom cache directory name Enable setting a custom directory name for cached packages. Required if e.g. patch_command uses external variables or just to set a human readable name. * fixup! review comment CUSTOM_CACHE_DIR -> CUSTOM_CACHE_KEY * run cmake-format --------- Co-authored-by: Olsson Gerhard Co-authored-by: Lars Melchior --- README.md | 3 +++ cmake/CPM.cmake | 6 +++++- test/unit/cache.cmake | 16 ++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d9aa0c7..99e756fa 100644 --- a/README.md +++ b/README.md @@ -190,6 +190,9 @@ Note that passing the variable as a configure option to CMake will always overri You can use `CPM_SOURCE_CACHE` on GitHub Actions workflows [cache](https://github.com/actions/cache) and combine it with ccache, to make your CI faster. See the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/Caching-with-CPM.cmake-and-ccache-on-GitHub-Actions) for more info. +The directory where the version for a project is stored is by default the hash of the arguments to `CPMAddPackage()`. +If for instance the patch command uses external files, the directory name can be set with the argument `CUSTOM_CACHE_KEY`. + ### CPM_DOWNLOAD_ALL If set, CPM will forward all calls to `CPMFindPackage` as `CPMAddPackage`. diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index acbf344b..a01fc256 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -534,6 +534,7 @@ function(CPMAddPackage) GIT_SHALLOW EXCLUDE_FROM_ALL SOURCE_SUBDIR + CUSTOM_CACHE_KEY ) set(multiValueArgs URL OPTIONS DOWNLOAD_COMMAND) @@ -704,7 +705,10 @@ function(CPMAddPackage) string(TOLOWER ${CPM_ARGS_NAME} lower_case_name) set(origin_parameters ${CPM_ARGS_UNPARSED_ARGUMENTS}) list(SORT origin_parameters) - if(CPM_USE_NAMED_CACHE_DIRECTORIES) + if(CPM_ARGS_CUSTOM_CACHE_KEY) + # Application set a custom unique directory name + set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${CPM_ARGS_CUSTOM_CACHE_KEY}) + elseif(CPM_USE_NAMED_CACHE_DIRECTORIES) string(SHA1 origin_hash "${origin_parameters};NEW_CACHE_STRUCTURE_TAG") set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${origin_hash}/${CPM_ARGS_NAME}) else() diff --git a/test/unit/cache.cmake b/test/unit/cache.cmake index dbf1b549..68244245 100644 --- a/test/unit/cache.cmake +++ b/test/unit/cache.cmake @@ -137,3 +137,19 @@ execute_process( assert_equal(${ret} "0") assert_not_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci") + +# Use custom cache directory + +set(FIBONACCI_PACKAGE_ARGS + "CUSTOM_CACHE_KEY my_custom_unique_dir GIT_TAG e9ebf168ca0fffaa4ef8c6fefc6346aaa22f6ed5" +) +set(FIBONACCI_VERSION 1.1) +update_cmake_lists() + +execute_process( + COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND} + "-S${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" RESULT_VARIABLE ret +) + +assert_equal(${ret} "0") +assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci/my_custom_unique_dir")