From b70460aca4444ed04b0da6bded98b5123ae14bd4 Mon Sep 17 00:00:00 2001 From: Craig Hutchinson Date: Thu, 23 Mar 2023 20:13:38 +0000 Subject: [PATCH 1/5] Test forwarding of arguments to `FetchCOntent_Declare` --- test/unit/forward_arguments.cmake | 58 +++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 test/unit/forward_arguments.cmake diff --git a/test/unit/forward_arguments.cmake b/test/unit/forward_arguments.cmake new file mode 100644 index 00000000..90580f4c --- /dev/null +++ b/test/unit/forward_arguments.cmake @@ -0,0 +1,58 @@ +cmake_minimum_required(VERSION 3.14 FATAL_ERROR) + +include(${CPM_PATH}/CPM.cmake) +include(${CPM_PATH}/testing.cmake) + +# Intercept underlying `FetchContent_Declare` +function(FetchContent_Declare) + set_property(GLOBAL PROPERTY last_FetchContent_Declare_ARGN "${ARGN}") +endfunction() +cpm_declare_fetch(PACKAGE VERSION INFO EMPTY "" ANOTHER) + +# TEST:`cpm_declare_fetch` shall forward empty arguments +get_property(last_FetchContent_Declare_ARGN GLOBAL PROPERTY last_FetchContent_Declare_ARGN) +assert_equal("${last_FetchContent_Declare_ARGN}" "PACKAGE;EMPTY;;ANOTHER") + +# TEST:`CPMDeclarePackage` shall store all including empty +CPMDeclarePackage(FOO EMPTY "" ANOTHER) +assert_equal("${CPM_DECLARATION_FOO}" "EMPTY;;ANOTHER") + +# Stub the actual fetch +set(fibonacci_POPULATED YES) +set(fibonacci_SOURCE_DIR ".") +set(fibonacci_BINARY_DIR ".") +macro(FetchContent_GetProperties) + +endmacro() + +# TEST:`CPMAddPackage` shall call `FetchContent_declare` with unmodified arguments including any +# Empty-string arguments +CPMAddPackage( + NAME fibonacci + GIT_REPOSITORY https://github.com/cpm-cmake/testpack-fibonacci.git + VERSION 1.2.3 EMPTY_OPTION "" COMMAND_WITH_EMPTY_ARG foo "" bar +) +get_property(last_FetchContent_Declare_ARGN GLOBAL PROPERTY last_FetchContent_Declare_ARGN) +assert_equal( + "${last_FetchContent_Declare_ARGN}" + "fibonacci;EMPTY_OPTION;;COMMAND_WITH_EMPTY_ARG;foo;;bar;GIT_REPOSITORY;https://github.com/cpm-cmake/testpack-fibonacci.git;GIT_TAG;v1.2.3" +) + +# Intercept underlying `cpm_add_package_multi_arg` +function(cpm_add_package_multi_arg) + set_property(GLOBAL PROPERTY last_cpm_add_package_multi_arg_ARGN "${ARGN}") +endfunction() + +# TEST: CPM Module file shall store all arguments including empty strings +include(${CPM_MODULE_PATH}/Findfibonacci.cmake) +get_property( + last_cpm_add_package_multi_arg_ARGN GLOBAL PROPERTY last_cpm_add_package_multi_arg_ARGN +) +assert_equal( + "${last_cpm_add_package_multi_arg_ARGN}" + "NAME;fibonacci;GIT_REPOSITORY;https://github.com/cpm-cmake/testpack-fibonacci.git;VERSION;1.2.3;EMPTY_OPTION;;COMMAND_WITH_EMPTY_ARG;foo;;bar" +) + +# remove generated files +file(REMOVE_RECURSE ${CPM_MODULE_PATH}) +file(REMOVE ${CPM_PACKAGE_LOCK_FILE}) From cbe5144f792285ee46915537ef13e2051a0737a2 Mon Sep 17 00:00:00 2001 From: Craig Hutchinson Date: Tue, 7 Mar 2023 15:15:55 +0000 Subject: [PATCH 2/5] Preserving forwarding of empty string arguments Also: - Support cmake-format on Windows by using auto lione-ending --- .cmake-format | 1 + cmake/CPM.cmake | 47 +++++++++++++++++++++++++++++++++++++---------- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/.cmake-format b/.cmake-format index 24850af3..a52417dc 100644 --- a/.cmake-format +++ b/.cmake-format @@ -1,6 +1,7 @@ format: tab_size: 2 line_width: 100 + line_ending: auto dangle_parens: true parse: diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index 92953b8c..fba0b847 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -506,16 +506,37 @@ function(cpm_override_fetchcontent contentName) endfunction() # Download and add a package from source -function(CPMAddPackage) +macro(CPMAddPackage) + set(__ARGN "${ARGN}") + list(LENGTH __ARGN __ARGN_Length) + if(__ARGN_Length EQUAL 1) + cpm_add_package_single_arg(${ARGN}) + else() + # Forward preserving empty string arguments + # (https://gitlab.kitware.com/cmake/cmake/-/merge_requests/4729) + set(__ARGN_Quoted) + foreach(__ARG IN LISTS __ARGN) + string(APPEND __ARGN_Quoted " [==[${__ARG}]==]") + endforeach() + cmake_language(EVAL CODE "cpm_add_package_multi_arg( ${__ARGN_Quoted} )") + endif() +endmacro() + +macro(cpm_add_package_single_arg arg) cpm_set_policies() + cpm_parse_add_package_single_arg("${arg}" __ARGN_multi) - list(LENGTH ARGN argnLength) - if(argnLength EQUAL 1) - cpm_parse_add_package_single_arg("${ARGN}" ARGN) + # The shorthand syntax implies EXCLUDE_FROM_ALL + list(APPEND __ARGN_multi + EXCLUDE_FROM_ALL YES + SYSTEM YES + ) - # The shorthand syntax implies EXCLUDE_FROM_ALL and SYSTEM - set(ARGN "${ARGN};EXCLUDE_FROM_ALL;YES;SYSTEM;YES;") - endif() + cpm_add_package_multi_arg(${__ARGN_multi}) # Forward function arguments to CPMAddPackage() +endmacro() + +function(cpm_add_package_multi_arg) + cpm_set_policies() set(oneValueArgs NAME @@ -539,7 +560,7 @@ function(CPMAddPackage) set(multiValueArgs URL OPTIONS) - cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") + cmake_parse_arguments(PARSE_ARGV 0 CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}") # Set default values for arguments @@ -917,7 +938,13 @@ function(cpm_declare_fetch PACKAGE VERSION INFO) return() endif() - FetchContent_Declare(${PACKAGE} ${ARGN}) + # Forward preserving empty string arguments + # (https://gitlab.kitware.com/cmake/cmake/-/merge_requests/4729) + set(__argsQuoted) + foreach(__item IN LISTS ARGN) + string(APPEND __argsQuoted " [==[${__item}]==]") + endforeach() + cmake_language(EVAL CODE "FetchContent_Declare(${PACKAGE} ${__argsQuoted} )") endfunction() # returns properties for a package previously defined by cpm_declare_fetch @@ -1105,7 +1132,7 @@ function(cpm_prettify_package_arguments OUT_VAR IS_IN_COMMENT) GIT_SHALLOW ) set(multiValueArgs OPTIONS) - cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + cmake_parse_arguments(PARSE_ARGV 2 CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}") foreach(oneArgName ${oneValueArgs}) if(DEFINED CPM_ARGS_${oneArgName}) From b847af65c034127bd71c42f40db7f22d39180d25 Mon Sep 17 00:00:00 2001 From: Craig Hutchinson Date: Wed, 8 Mar 2023 10:05:04 +0000 Subject: [PATCH 3/5] Support EVAL CODE on CMake <3.18 --- cmake/CPM.cmake | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index fba0b847..076d357d 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -505,6 +505,16 @@ function(cpm_override_fetchcontent contentName) set_property(GLOBAL PROPERTY ${propertyName} TRUE) endfunction() +macro(cpm_cmake_eval) + set(__ARGN "${ARGN}") + if(COMMAND cmake_language) + cmake_language(EVAL CODE "${__ARGN}") + else() + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/eval.cmake "${__ARGN}") + include(${CMAKE_CURRENT_BINARY_DIR}/eval.cmake) + endif() +endmacro() + # Download and add a package from source macro(CPMAddPackage) set(__ARGN "${ARGN}") @@ -518,7 +528,7 @@ macro(CPMAddPackage) foreach(__ARG IN LISTS __ARGN) string(APPEND __ARGN_Quoted " [==[${__ARG}]==]") endforeach() - cmake_language(EVAL CODE "cpm_add_package_multi_arg( ${__ARGN_Quoted} )") + cpm_cmake_eval("cpm_add_package_multi_arg( ${__ARGN_Quoted} )") endif() endmacro() @@ -944,7 +954,7 @@ function(cpm_declare_fetch PACKAGE VERSION INFO) foreach(__item IN LISTS ARGN) string(APPEND __argsQuoted " [==[${__item}]==]") endforeach() - cmake_language(EVAL CODE "FetchContent_Declare(${PACKAGE} ${__argsQuoted} )") + cpm_cmake_eval("FetchContent_Declare(${PACKAGE} ${__argsQuoted} )") endfunction() # returns properties for a package previously defined by cpm_declare_fetch From 5c1ce67e3b20c96bd34f61b3eec8b72b4b9676c0 Mon Sep 17 00:00:00 2001 From: Craig Hutchinson Date: Wed, 8 Mar 2023 10:36:11 +0000 Subject: [PATCH 4/5] Fix docs typo --- test/integration/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/README.md b/test/integration/README.md index 59a68a6d..9715edfe 100644 --- a/test/integration/README.md +++ b/test/integration/README.md @@ -12,7 +12,7 @@ To run all tests from the repo root execute: $ ruby test/integration/runner.rb ``` -The runner will run all tests and generate a report of the exeuction. +The runner will run all tests and generate a report of the execution. The current working directory doesn't matter. If you are in `/test/integration`, you can run simply `$ ruby runner.rb`. From f4fd660d09cad08a04a84de116ea8b30d0faa5da Mon Sep 17 00:00:00 2001 From: Craig Hutchinson Date: Tue, 21 Mar 2023 09:37:20 +0000 Subject: [PATCH 5/5] Maintain key-value CMake formatting --- cmake/CPM.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index 076d357d..68da0897 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -537,10 +537,12 @@ macro(cpm_add_package_single_arg arg) cpm_parse_add_package_single_arg("${arg}" __ARGN_multi) # The shorthand syntax implies EXCLUDE_FROM_ALL + # cmake-format: off list(APPEND __ARGN_multi EXCLUDE_FROM_ALL YES SYSTEM YES ) + # cmake-format: on cpm_add_package_multi_arg(${__ARGN_multi}) # Forward function arguments to CPMAddPackage() endmacro()