mirror of
https://github.com/cpm-cmake/CPM.cmake.git
synced 2025-11-18 23:27:37 -05:00
Compare commits
7 Commits
v0.38.8
...
lars/prese
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b5cd6f190 | ||
|
|
a49358ef34 | ||
|
|
f4fd660d09 | ||
|
|
5c1ce67e3b | ||
|
|
b847af65c0 | ||
|
|
cbe5144f79 | ||
|
|
b70460aca4 |
@@ -1,6 +1,7 @@
|
|||||||
format:
|
format:
|
||||||
tab_size: 2
|
tab_size: 2
|
||||||
line_width: 100
|
line_width: 100
|
||||||
|
line_ending: auto
|
||||||
dangle_parens: true
|
dangle_parens: true
|
||||||
|
|
||||||
parse:
|
parse:
|
||||||
|
|||||||
@@ -505,6 +505,60 @@ function(cpm_override_fetchcontent contentName)
|
|||||||
set_property(GLOBAL PROPERTY ${propertyName} TRUE)
|
set_property(GLOBAL PROPERTY ${propertyName} TRUE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
# replaces empty arguments with a placeholder to compensate CMake issues with handling empty
|
||||||
|
# arguments
|
||||||
|
function(cpm_encode_empty_arguments args outVar)
|
||||||
|
set(out "")
|
||||||
|
# note: we don't use string replacement for ';;' -> ';__CPM_EMPTY_ARG;' here, as it would
|
||||||
|
# interfere with nested arguments
|
||||||
|
foreach(ARG IN LISTS args)
|
||||||
|
if(NOT out STREQUAL "")
|
||||||
|
string(APPEND out ";")
|
||||||
|
endif()
|
||||||
|
if(ARG STREQUAL "")
|
||||||
|
string(APPEND out "__CPM_EMPTY_ARG")
|
||||||
|
else()
|
||||||
|
# prevent escaped characters from getting resolved early
|
||||||
|
string(REPLACE "\\" "\\\\\\" ARG "${ARG}")
|
||||||
|
string(APPEND out "${ARG}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
set("${outVar}"
|
||||||
|
"${out}"
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(cpm_decode_empty_argument arg outVar)
|
||||||
|
if("${arg}" STREQUAL "__CPM_EMPTY_ARG")
|
||||||
|
set("${outVar}"
|
||||||
|
""
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
set("${outVar}"
|
||||||
|
"${arg}"
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# replaces placeholder arguments from `cpm_encode_empty_arguments` with empty arguments
|
||||||
|
function(cpm_decode_empty_arguments args outVar)
|
||||||
|
set(out "")
|
||||||
|
foreach(ARG IN LISTS args)
|
||||||
|
if(NOT out STREQUAL "")
|
||||||
|
string(APPEND out ";")
|
||||||
|
endif()
|
||||||
|
cpm_decode_empty_argument("${ARG}" ARG)
|
||||||
|
string(APPEND out "${ARG}")
|
||||||
|
endforeach()
|
||||||
|
set("${outVar}"
|
||||||
|
"${out}"
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
# Download and add a package from source
|
# Download and add a package from source
|
||||||
function(CPMAddPackage)
|
function(CPMAddPackage)
|
||||||
cpm_set_policies()
|
cpm_set_policies()
|
||||||
@@ -512,7 +566,6 @@ function(CPMAddPackage)
|
|||||||
list(LENGTH ARGN argnLength)
|
list(LENGTH ARGN argnLength)
|
||||||
if(argnLength EQUAL 1)
|
if(argnLength EQUAL 1)
|
||||||
cpm_parse_add_package_single_arg("${ARGN}" ARGN)
|
cpm_parse_add_package_single_arg("${ARGN}" ARGN)
|
||||||
|
|
||||||
# The shorthand syntax implies EXCLUDE_FROM_ALL and SYSTEM
|
# The shorthand syntax implies EXCLUDE_FROM_ALL and SYSTEM
|
||||||
set(ARGN "${ARGN};EXCLUDE_FROM_ALL;YES;SYSTEM;YES;")
|
set(ARGN "${ARGN};EXCLUDE_FROM_ALL;YES;SYSTEM;YES;")
|
||||||
endif()
|
endif()
|
||||||
@@ -539,10 +592,26 @@ function(CPMAddPackage)
|
|||||||
|
|
||||||
set(multiValueArgs URL OPTIONS)
|
set(multiValueArgs URL OPTIONS)
|
||||||
|
|
||||||
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
|
# Encode arguments for `cmake_parse_arguments`
|
||||||
|
cpm_encode_empty_arguments("${ARGN}" "PARSE_ARGS")
|
||||||
|
|
||||||
|
# Parse arguments
|
||||||
|
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${PARSE_ARGS}")
|
||||||
|
|
||||||
|
# Decode arguments
|
||||||
|
foreach(ARG IN LISTS oneValueArgs)
|
||||||
|
if(DEFINED CPM_ARGS_${ARG})
|
||||||
|
cpm_decode_empty_argument("${CPM_ARGS_${ARG}}" CPM_ARGS_${ARG})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
foreach(ARG IN LISTS multiValueArgs)
|
||||||
|
if(DEFINED CPM_ARGS_${ARG})
|
||||||
|
cpm_decode_empty_arguments("${CPM_ARGS_${ARG}}" CPM_ARGS_${ARG})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
cpm_decode_empty_arguments("${CPM_ARGS_UNPARSED_ARGUMENTS}" CPM_ARGS_UNPARSED_ARGUMENTS)
|
||||||
|
|
||||||
# Set default values for arguments
|
# Set default values for arguments
|
||||||
|
|
||||||
if(NOT DEFINED CPM_ARGS_VERSION)
|
if(NOT DEFINED CPM_ARGS_VERSION)
|
||||||
if(DEFINED CPM_ARGS_GIT_TAG)
|
if(DEFINED CPM_ARGS_GIT_TAG)
|
||||||
cpm_get_version_from_git_tag("${CPM_ARGS_GIT_TAG}" CPM_ARGS_VERSION)
|
cpm_get_version_from_git_tag("${CPM_ARGS_GIT_TAG}" CPM_ARGS_VERSION)
|
||||||
@@ -916,8 +985,7 @@ function(cpm_declare_fetch PACKAGE VERSION INFO)
|
|||||||
cpm_message(STATUS "${CPM_INDENT} Package not declared (dry run)")
|
cpm_message(STATUS "${CPM_INDENT} Package not declared (dry run)")
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
FetchContent_Declare(${PACKAGE} "${ARGN}")
|
||||||
FetchContent_Declare(${PACKAGE} ${ARGN})
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# returns properties for a package previously defined by cpm_declare_fetch
|
# returns properties for a package previously defined by cpm_declare_fetch
|
||||||
@@ -1105,7 +1173,7 @@ function(cpm_prettify_package_arguments OUT_VAR IS_IN_COMMENT)
|
|||||||
GIT_SHALLOW
|
GIT_SHALLOW
|
||||||
)
|
)
|
||||||
set(multiValueArgs OPTIONS)
|
set(multiValueArgs OPTIONS)
|
||||||
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
cmake_parse_arguments(PARSE_ARGV 2 CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}")
|
||||||
|
|
||||||
foreach(oneArgName ${oneValueArgs})
|
foreach(oneArgName ${oneValueArgs})
|
||||||
if(DEFINED CPM_ARGS_${oneArgName})
|
if(DEFINED CPM_ARGS_${oneArgName})
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ To run all tests from the repo root execute:
|
|||||||
$ ruby test/integration/runner.rb
|
$ 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 `<repo-root>/test/integration`, you can run simply `$ ruby runner.rb`.
|
The current working directory doesn't matter. If you are in `<repo-root>/test/integration`, you can run simply `$ ruby runner.rb`.
|
||||||
|
|
||||||
|
|||||||
69
test/unit/forward_arguments.cmake
Normal file
69
test/unit/forward_arguments.cmake
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
include(${CPM_PATH}/CPM.cmake)
|
||||||
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
|
set(input "a;;b;c;;;;def;g;;")
|
||||||
|
cpm_encode_empty_arguments("${input}" encoded)
|
||||||
|
foreach(arg IN LISTS encoded)
|
||||||
|
assert_not_equal("${arg}" "")
|
||||||
|
endforeach()
|
||||||
|
assert_equal("${contains_empty_arg}" "")
|
||||||
|
cpm_decode_empty_arguments("${encoded}" decoded)
|
||||||
|
assert_equal("${decoded}" "${input}")
|
||||||
|
|
||||||
|
# ignore source cache if set
|
||||||
|
set(CPM_SOURCE_CACHE "")
|
||||||
|
|
||||||
|
# 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(CPMAddPackage)
|
||||||
|
set_property(GLOBAL PROPERTY last_cpmaddpackage_argn "${ARGN}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# TEST: CPM Module file shall store all arguments including empty strings
|
||||||
|
include(${CPM_MODULE_PATH}/Findfibonacci.cmake)
|
||||||
|
|
||||||
|
get_property(last_cpmaddpackage_argn GLOBAL PROPERTY last_cpmaddpackage_argn)
|
||||||
|
assert_equal(
|
||||||
|
"${last_cpmaddpackage_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})
|
||||||
@@ -2,6 +2,8 @@ include(CMakePackageConfigHelpers)
|
|||||||
include(${CPM_PATH}/testing.cmake)
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/source_dir)
|
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/source_dir)
|
||||||
|
# clean existing build if it exists
|
||||||
|
file(REMOVE_RECURSE "${TEST_BUILD_DIR}")
|
||||||
|
|
||||||
set(TEST_DEPENDENCY_NAME Dependency)
|
set(TEST_DEPENDENCY_NAME Dependency)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user