Compare commits

...

13 Commits

Author SHA1 Message Date
Alecto Irene Perez
d9364ce284
Implement #624: Use shorter hashes with CPM_SOURCE_CACHE (#631)
* Add ASSERT_CONTENTS_EQUAL test macro in testing.cmake

Checks if the contents of a file matches the given input

* Use shorter hashes with CPM_SOURCE_CACHE (#624)

Uses shorter hashes with CPM_SOURCE_CACHE. Falls back to a longer hash
if necessary (ie, if there's a collision with an existing hash).

See: https://github.com/cpm-cmake/CPM.cmake/issues/624

* Update integration tests to support shorter hashes

* trigger ci

* run cmake-format

* if already available, use the legacy cache hash

* create temporary file in current binary dir

* add test case for legacy hash

---------

Co-authored-by: Lars Melchior <lars.melchior@gmail.com>
Co-authored-by: Lars Melchior <TheLartians@users.noreply.github.com>
2025-05-18 19:02:47 +02:00
Simon Gene Gottlieb
d7614381ab
feature: allow URI to use shorthand syntax with additional options (#617)
* feature: add URI to use shorthand syntax with additional options

This allows to combine the shorthand syntax with URI and additional arguments:
```
CPMAddPackage(URI "gh:nlohmann/json@3.9.1" OPTIONS "JSON_BUildTests OFF")
```

This is much shorter than the longer syntax way of writing:
```
CPMAddPackage(
  NAME nlohmann_json
  VERSION 3.9.1
  GITHUB_REPOSITORY nlohmann/json
  OPTIONS
    "JSON_BuildTests OFF"
)
```

* fix: use shorthand syntax in examples

* test: add test for shorthand syntax with options

* doc: extend README mentioning shorthand syntax with options

* feat: URI keyword also sets EXCLUDE_FROM AND SYSTEM

* doc: more explicit about the behavior of URI

* doc: adjust README accordingly to PR-Review

* test: fix inline documentation of test_simple

* move URI comment

* added new test for shorthand syntax

* reset simple test

* add that URI must be the first argument

---------

Co-authored-by: Lars Melchior <lars.melchior@gmail.com>
2025-05-03 19:12:08 +02:00
Avus-c
97023e8b97
fix: do not generate module files with DOWNLOAD_ONLY (#654)
Co-authored-by: Avus <48911667+Avus@users.noreply.github.com>
2025-03-12 19:10:52 +01:00
flagarde
0f231080d9
Fetch content (#593)
* Add git_archival mechanism

* fetch_content

* Delete .pre-commit-config.yaml

* Update CPM.cmake

* cmake-format
2025-03-04 17:06:21 +01:00
Patrick Stewart
33efd5f5d2
Fix version filename for find_package redirects (#630)
Co-authored-by: Lars Melchior <TheLartians@users.noreply.github.com>
2025-03-02 22:08:20 +01:00
Lars Melchior
4b3a60fb32
Investigate sol2 CI build issue (#648)
* trigger CI to see if sol2 example is reliably failing

* attempt patch from github comment

* fix patch

* add info to comment on patch

* run fix-format

* simplify patchfile
2025-03-02 21:59:58 +01:00
Rokas Kupstys
cd28d445ae
Fix finding patch executable when cross-compiling on windows. (#627)
`WIN32` checks whether current build context is windows. This is not correct in case of cross-compiling, because we are interested in finding host's tools, not SDK's tools.
2024-12-29 18:15:04 +01:00
Daniel Lemire
2a9e203320
doc: warn users that PATCHES may not work properly when CPM_SOURCE_CACHE is unset. (#580) 2024-12-22 23:25:51 +01:00
Scott B
22381df399
Update boost to 1.86 (#592)
* Update to v1.85.0

* Boost example to 1.86
2024-12-22 22:39:17 +01:00
Avus-c
c3807eb774
circumvent bug in cmake <3.30.3 (#605)
Co-authored-by: Avus <48911667+Avus@users.noreply.github.com>
2024-12-22 13:08:38 +01:00
Patrick Stewart
9ddfe1b6a8
Add find_package overrides that also work in CONFIG mode (#498) (#604) 2024-12-20 16:38:22 +01:00
Scott B
0bc73f41ce
Additional search path for patch.exe (#581)
* Additional search path for patch.exe

* Style
2024-08-02 15:44:55 +02:00
Avus-c
8b67fe2344
replace deprecated calls to FetchContent_Populate (#570)
* replace deprecated calls to FetchContent_Populate

The single argument signature for FetchContent_Populate is deprecated with CMake 3.30.
It was used, in order to call add_subdirectory manually with the EXCLUDE_FROM_ALL and SYSTEM flags.
These have been added to FetchContent_Declare with 3.25 and 3.28.
Calling FetchContent_MakeAvailable will internally call add_subdirectory with EXCLUDE_FROM_ALL and SYSTEM.
There is therefore no need to call this manually.

* fix: OPTIONS passed to CPMAddPackage not set

where previously parsed in cpm_add_subdirectory which is not called
on the new code path.

* refactor: remove an unnecessary else branch

* ci: include cmake 3.30 in test matrix

* fix: forward SOURCE_SUBDIR to FetchContent_Declare

For CMake version <3.28 this is done by calling add_subdirectory manually.
For newer version FetchContent_Declare/MakeAvailable handles this for us.

* fix: only set options if download_only is false

this replicates the old behaviour

* fix: DOWNLOAD_ONLY test

* refactor: always use *_Populate to reduce code paths

* Revert "refactor: always use *_Populate to reduce code paths"

This reverts commit 0e8ca2a0e92d1c2035a64d3d1e365325b1279ef9.

---------

Co-authored-by: Avus <48911667+Avus@users.noreply.github.com>
2024-07-29 11:19:31 +02:00
16 changed files with 493 additions and 64 deletions

3
.git_archival.txt Normal file
View File

@ -0,0 +1,3 @@
node: $Format:%H$
node-date: $Format:%cI$
describe-name: $Format:%(describe:tags=true,match=?[0-9.]*)$

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
.git_archival.txt export-subst

View File

@ -19,7 +19,7 @@ jobs:
os: [ubuntu-latest, windows-2022, macos-latest] os: [ubuntu-latest, windows-2022, macos-latest]
# we want to ensure compatibility with a recent CMake version as well as the lowest officially supported # we want to ensure compatibility with a recent CMake version as well as the lowest officially supported
# legacy version that we define as the default version of the second-latest Ubuntu LTS release currently available # legacy version that we define as the default version of the second-latest Ubuntu LTS release currently available
cmake_version: ['3.16.3', '3.27.5'] cmake_version: ['3.16.3', '3.27.5', '3.30.0']
exclude: exclude:
# there seems to be an issue with CMake 3.16 not finding a C++ compiler on windows-2022 # there seems to be an issue with CMake 3.16 not finding a C++ compiler on windows-2022
- os: windows-2022 - os: windows-2022

28
CMakeLists.txt Normal file
View File

@ -0,0 +1,28 @@
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git/")
find_package(Git REQUIRED)
execute_process(
COMMAND "${GIT_EXECUTABLE}" describe --tags --match=?[0-9.]*
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE DESCRIBE_NAME COMMAND_ERROR_IS_FATAL ANY
)
set(CPM_DEVELOPMENT "-development-version")
else()
file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/.git_archival.txt" DESCRIBE_NAME
REGEX "^describe-name:.*"
)
endif()
string(REGEX MATCH "([0-9\\.]+)" EXTRACTED_CPM_VERSION "${DESCRIBE_NAME}")
project(
CPM.cmake
VERSION "${EXTRACTED_CPM_VERSION}"
DESCRIPTION
"CMake's missing package manager. A small CMake script for setup-free, cross-platform, reproducible dependency management."
HOMEPAGE_URL "https://github.com/cpm-cmake/CPM.cmake"
LANGUAGES NONE
)
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/CPM.cmake")

View File

@ -80,6 +80,7 @@ On the other hand, if `VERSION` hasn't been explicitly specified, CPM can automa
`GIT_TAG` can also be set to a specific commit or a branch name such as `master`, however this isn't recommended, as such packages will only be updated when the cache is cleared. `GIT_TAG` can also be set to a specific commit or a branch name such as `master`, however this isn't recommended, as such packages will only be updated when the cache is cleared.
`PATCHES` takes a list of patch files to apply sequentially. For a basic example, see [Highway](examples/highway/CMakeLists.txt). `PATCHES` takes a list of patch files to apply sequentially. For a basic example, see [Highway](examples/highway/CMakeLists.txt).
We recommend that if you use `PATCHES`, you also set `CPM_SOURCE_CACHE`. See [issue 577](https://github.com/cpm-cmake/CPM.cmake/issues/577).
If an additional optional parameter `EXCLUDE_FROM_ALL` is set to a truthy value, then any targets defined inside the dependency won't be built by default. See the [CMake docs](https://cmake.org/cmake/help/latest/prop_tgt/EXCLUDE_FROM_ALL.html) for details. If an additional optional parameter `EXCLUDE_FROM_ALL` is set to a truthy value, then any targets defined inside the dependency won't be built by default. See the [CMake docs](https://cmake.org/cmake/help/latest/prop_tgt/EXCLUDE_FROM_ALL.html) for details.
@ -87,7 +88,7 @@ If an additional optional parameter `SYSTEM` is set to a truthy value, the SYSTE
See the [add_subdirectory ](https://cmake.org/cmake/help/latest/command/add_subdirectory.html?highlight=add_subdirectory) See the [add_subdirectory ](https://cmake.org/cmake/help/latest/command/add_subdirectory.html?highlight=add_subdirectory)
and [SYSTEM](https://cmake.org/cmake/help/latest/prop_tgt/SYSTEM.html#prop_tgt:SYSTEM) target property for details. and [SYSTEM](https://cmake.org/cmake/help/latest/prop_tgt/SYSTEM.html#prop_tgt:SYSTEM) target property for details.
A single-argument compact syntax is also supported: A shorthand syntax is also supported:
```cmake ```cmake
# A git package from a given uri with a version # A git package from a given uri with a version
@ -111,6 +112,19 @@ CPMAddPackage("https://example.com/my-package-1.2.3.zip#MD5=68e20f674a48be38d60e
CPMAddPackage("https://example.com/my-package.zip@1.2.3") CPMAddPackage("https://example.com/my-package.zip@1.2.3")
``` ```
Additionally, if needed, extra arguments can be provided while using single argument syntax by using the shorthand syntax with the `URI` specifier.
```cmake
CPMAddPackage(
URI "gh:nlohmann/json@3.9.1"
OPTIONS "JSON_BuildTests OFF"
)
```
The `URI` argument must be the first argument to `CPMAddPackage`.
`URI` automatically sets `EXCLUDE_FROM_ALL YES` and `SYSTEM YES`.
If this is not desired, `EXCLUDE_FROM_ALL NO` and `SYSTEM NO` can be set afterwards.
After calling `CPMAddPackage`, the following variables are defined in the local scope, where `<dependency>` is the name of the dependency. After calling `CPMAddPackage`, the following variables are defined in the local scope, where `<dependency>` is the name of the dependency.
- `<dependency>_SOURCE_DIR` is the path to the source of the dependency. - `<dependency>_SOURCE_DIR` is the path to the source of the dependency.
@ -214,6 +228,13 @@ In the case that `find_package` requires additional arguments, the parameter `FI
Note that this does not apply to dependencies that have been defined with a truthy `FORCE` parameter. These will be added as defined. Note that this does not apply to dependencies that have been defined with a truthy `FORCE` parameter. These will be added as defined.
### CPM_DONT_UPDATE_MODULE_PATH
By default, CPM will override any `find_package` commands to use the CPM downloaded version.
This is equivalent to the `OVERRIDE_FIND_PACKAGE` FetchContent option, which has no effect in CPM.
To disable this behaviour set the `CPM_DONT_UPDATE_MODULE_PATH` option.
This will not work for `find_package(CONFIG)` in CMake versions before 3.24.
### CPM_USE_NAMED_CACHE_DIRECTORIES ### CPM_USE_NAMED_CACHE_DIRECTORIES
If set, CPM use additional directory level in cache to improve readability of packages names in IDEs like CLion. It changes cache structure, so all dependencies are downloaded again. There is no problem to mix both structures in one cache directory but then there may be 2 copies of some dependencies. If set, CPM use additional directory level in cache to improve readability of packages names in IDEs like CLion. It changes cache structure, so all dependencies are downloaded again. There is no problem to mix both structures in one cache directory but then there may be 2 copies of some dependencies.
@ -404,11 +425,8 @@ CPMAddPackage("gh:jbeder/yaml-cpp#yaml-cpp-0.6.3@0.6.3")
```cmake ```cmake
CPMAddPackage( CPMAddPackage(
NAME nlohmann_json URI "gh:nlohmann/json@3.9.1"
VERSION 3.9.1 OPTIONS "JSON_BuildTests OFF"
GITHUB_REPOSITORY nlohmann/json
OPTIONS
"JSON_BuildTests OFF"
) )
``` ```
@ -438,8 +456,7 @@ For a working example of using CPM to download and configure the Boost C++ Libra
```cmake ```cmake
# the install option has to be explicitly set to allow installation # the install option has to be explicitly set to allow installation
CPMAddPackage( CPMAddPackage(
GITHUB_REPOSITORY jarro2783/cxxopts URI "gh:jarro2783/cxxopts@2.2.1"
VERSION 2.2.1
OPTIONS "CXXOPTS_BUILD_EXAMPLES NO" "CXXOPTS_BUILD_TESTS NO" "CXXOPTS_ENABLE_INSTALL YES" OPTIONS "CXXOPTS_BUILD_EXAMPLES NO" "CXXOPTS_BUILD_TESTS NO" "CXXOPTS_ENABLE_INSTALL YES"
) )
``` ```
@ -448,9 +465,7 @@ CPMAddPackage(
```cmake ```cmake
CPMAddPackage( CPMAddPackage(
NAME benchmark URI "gh:google/benchmark@1.5.2"
GITHUB_REPOSITORY google/benchmark
VERSION 1.5.2
OPTIONS "BENCHMARK_ENABLE_TESTING Off" OPTIONS "BENCHMARK_ENABLE_TESTING Off"
) )

View File

@ -42,7 +42,11 @@ if(NOT COMMAND cpm_message)
endfunction() endfunction()
endif() endif()
set(CURRENT_CPM_VERSION 1.0.0-development-version) if(DEFINED EXTRACTED_CPM_VERSION)
set(CURRENT_CPM_VERSION "${EXTRACTED_CPM_VERSION}${CPM_DEVELOPMENT}")
else()
set(CURRENT_CPM_VERSION 1.0.0-development-version)
endif()
get_filename_component(CPM_CURRENT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}" REALPATH) get_filename_component(CPM_CURRENT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}" REALPATH)
if(CPM_DIRECTORY) if(CPM_DIRECTORY)
@ -162,7 +166,7 @@ set(CPM_SOURCE_CACHE
CACHE PATH "Directory to download CPM dependencies" CACHE PATH "Directory to download CPM dependencies"
) )
if(NOT CPM_DONT_UPDATE_MODULE_PATH) if(NOT CPM_DONT_UPDATE_MODULE_PATH AND NOT DEFINED CMAKE_FIND_PACKAGE_REDIRECTS_DIR)
set(CPM_MODULE_PATH set(CPM_MODULE_PATH
"${CMAKE_BINARY_DIR}/CPM_modules" "${CMAKE_BINARY_DIR}/CPM_modules"
CACHE INTERNAL "" CACHE INTERNAL ""
@ -198,6 +202,60 @@ function(cpm_package_name_from_git_uri URI RESULT)
endif() endif()
endfunction() endfunction()
# Find the shortest hash that can be used eg, if origin_hash is
# cccb77ae9609d2768ed80dd42cec54f77b1f1455 the following files will be checked, until one is found
# that is either empty (allowing us to assign origin_hash), or whose contents matches ${origin_hash}
#
# * .../cccb.hash
# * .../cccb77ae.hash
# * .../cccb77ae9609.hash
# * .../cccb77ae9609d276.hash
# * etc
#
# We will be able to use a shorter path with very high probability, but in the (rare) event that the
# first couple characters collide, we will check longer and longer substrings.
function(cpm_get_shortest_hash source_cache_dir origin_hash short_hash_output_var)
# for compatibility with caches populated by a previous version of CPM, check if a directory using
# the full hash already exists
if(EXISTS "${source_cache_dir}/${origin_hash}")
set(${short_hash_output_var}
"${origin_hash}"
PARENT_SCOPE
)
return()
endif()
foreach(len RANGE 4 40 4)
string(SUBSTRING "${origin_hash}" 0 ${len} short_hash)
set(hash_lock ${source_cache_dir}/${short_hash}.lock)
set(hash_fp ${source_cache_dir}/${short_hash}.hash)
# Take a lock, so we don't have a race condition with another instance of cmake. We will release
# this lock when we can, however, if there is an error, we want to ensure it gets released on
# it's own on exit from the function.
file(LOCK ${hash_lock} GUARD FUNCTION)
# Load the contents of .../${short_hash}.hash
file(TOUCH ${hash_fp})
file(READ ${hash_fp} hash_fp_contents)
if(hash_fp_contents STREQUAL "")
# Write the origin hash
file(WRITE ${hash_fp} ${origin_hash})
file(LOCK ${hash_lock} RELEASE)
break()
elseif(hash_fp_contents STREQUAL origin_hash)
file(LOCK ${hash_lock} RELEASE)
break()
else()
file(LOCK ${hash_lock} RELEASE)
endif()
endforeach()
set(${short_hash_output_var}
"${short_hash}"
PARENT_SCOPE
)
endfunction()
# Try to infer package name and version from a url # Try to infer package name and version from a url
function(cpm_package_name_and_ver_from_url url outName outVer) function(cpm_package_name_and_ver_from_url url outName outVer)
if(url MATCHES "[/\\?]([a-zA-Z0-9_\\.-]+)\\.(tar|tar\\.gz|tar\\.bz2|zip|ZIP)(\\?|/|$)") if(url MATCHES "[/\\?]([a-zA-Z0-9_\\.-]+)\\.(tar|tar\\.gz|tar\\.bz2|zip|ZIP)(\\?|/|$)")
@ -269,11 +327,26 @@ endfunction()
# finding the system library # finding the system library
function(cpm_create_module_file Name) function(cpm_create_module_file Name)
if(NOT CPM_DONT_UPDATE_MODULE_PATH) if(NOT CPM_DONT_UPDATE_MODULE_PATH)
# erase any previous modules if(DEFINED CMAKE_FIND_PACKAGE_REDIRECTS_DIR)
# Redirect find_package calls to the CPM package. This is what FetchContent does when you set
# OVERRIDE_FIND_PACKAGE. The CMAKE_FIND_PACKAGE_REDIRECTS_DIR works for find_package in CONFIG
# mode, unlike the Find${Name}.cmake fallback. CMAKE_FIND_PACKAGE_REDIRECTS_DIR is not defined
# in script mode, or in CMake < 3.24.
# https://cmake.org/cmake/help/latest/module/FetchContent.html#fetchcontent-find-package-integration-examples
string(TOLOWER ${Name} NameLower)
file(WRITE ${CMAKE_FIND_PACKAGE_REDIRECTS_DIR}/${NameLower}-config.cmake
"include(\"\${CMAKE_CURRENT_LIST_DIR}/${NameLower}-extra.cmake\" OPTIONAL)\n"
"include(\"\${CMAKE_CURRENT_LIST_DIR}/${Name}Extra.cmake\" OPTIONAL)\n"
)
file(WRITE ${CMAKE_FIND_PACKAGE_REDIRECTS_DIR}/${NameLower}-config-version.cmake
"set(PACKAGE_VERSION_COMPATIBLE TRUE)\n" "set(PACKAGE_VERSION_EXACT TRUE)\n"
)
else()
file(WRITE ${CPM_MODULE_PATH}/Find${Name}.cmake file(WRITE ${CPM_MODULE_PATH}/Find${Name}.cmake
"include(\"${CPM_FILE}\")\n${ARGN}\nset(${Name}_FOUND TRUE)" "include(\"${CPM_FILE}\")\n${ARGN}\nset(${Name}_FOUND TRUE)"
) )
endif() endif()
endif()
endfunction() endfunction()
# Find a package locally or fallback to CPMAddPackage # Find a package locally or fallback to CPMAddPackage
@ -475,15 +548,18 @@ function(cpm_add_patches)
# Find the patch program. # Find the patch program.
find_program(PATCH_EXECUTABLE patch) find_program(PATCH_EXECUTABLE patch)
if(WIN32 AND NOT PATCH_EXECUTABLE) if(CMAKE_HOST_WIN32 AND NOT PATCH_EXECUTABLE)
# The Windows git executable is distributed with patch.exe. Find the path to the executable, if # The Windows git executable is distributed with patch.exe. Find the path to the executable, if
# it exists, then search `../../usr/bin` for patch.exe. # it exists, then search `../usr/bin` and `../../usr/bin` for patch.exe.
find_package(Git QUIET) find_package(Git QUIET)
if(GIT_EXECUTABLE) if(GIT_EXECUTABLE)
get_filename_component(extra_search_path ${GIT_EXECUTABLE} DIRECTORY) get_filename_component(extra_search_path ${GIT_EXECUTABLE} DIRECTORY)
get_filename_component(extra_search_path ${extra_search_path} DIRECTORY) get_filename_component(extra_search_path_1up ${extra_search_path} DIRECTORY)
get_filename_component(extra_search_path ${extra_search_path} DIRECTORY) get_filename_component(extra_search_path_2up ${extra_search_path_1up} DIRECTORY)
find_program(PATCH_EXECUTABLE patch HINTS "${extra_search_path}/usr/bin") find_program(
PATCH_EXECUTABLE patch HINTS "${extra_search_path_1up}/usr/bin"
"${extra_search_path_2up}/usr/bin"
)
endif() endif()
endif() endif()
if(NOT PATCH_EXECUTABLE) if(NOT PATCH_EXECUTABLE)
@ -572,14 +648,6 @@ endfunction()
function(CPMAddPackage) function(CPMAddPackage)
cpm_set_policies() cpm_set_policies()
list(LENGTH ARGN argnLength)
if(argnLength EQUAL 1)
cpm_parse_add_package_single_arg("${ARGN}" ARGN)
# The shorthand syntax implies EXCLUDE_FROM_ALL and SYSTEM
set(ARGN "${ARGN};EXCLUDE_FROM_ALL;YES;SYSTEM;YES;")
endif()
set(oneValueArgs set(oneValueArgs
NAME NAME
FORCE FORCE
@ -602,10 +670,26 @@ function(CPMAddPackage)
set(multiValueArgs URL OPTIONS DOWNLOAD_COMMAND PATCHES) set(multiValueArgs URL OPTIONS DOWNLOAD_COMMAND PATCHES)
list(LENGTH ARGN argnLength)
# Parse single shorthand argument
if(argnLength EQUAL 1)
cpm_parse_add_package_single_arg("${ARGN}" ARGN)
# The shorthand syntax implies EXCLUDE_FROM_ALL and SYSTEM
set(ARGN "${ARGN};EXCLUDE_FROM_ALL;YES;SYSTEM;YES;")
# Parse URI shorthand argument
elseif(argnLength GREATER 1 AND "${ARGV0}" STREQUAL "URI")
list(REMOVE_AT ARGN 0 1) # remove "URI gh:<...>@version#tag"
cpm_parse_add_package_single_arg("${ARGV1}" ARGV0)
set(ARGN "${ARGV0};EXCLUDE_FROM_ALL;YES;SYSTEM;YES;${ARGN}")
endif()
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
# 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)
@ -776,9 +860,19 @@ function(CPMAddPackage)
set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${CPM_ARGS_CUSTOM_CACHE_KEY}) set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${CPM_ARGS_CUSTOM_CACHE_KEY})
elseif(CPM_USE_NAMED_CACHE_DIRECTORIES) elseif(CPM_USE_NAMED_CACHE_DIRECTORIES)
string(SHA1 origin_hash "${origin_parameters};NEW_CACHE_STRUCTURE_TAG") string(SHA1 origin_hash "${origin_parameters};NEW_CACHE_STRUCTURE_TAG")
cpm_get_shortest_hash(
"${CPM_SOURCE_CACHE}/${lower_case_name}" # source cache directory
"${origin_hash}" # Input hash
origin_hash # Computed hash
)
set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${origin_hash}/${CPM_ARGS_NAME}) set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${origin_hash}/${CPM_ARGS_NAME})
else() else()
string(SHA1 origin_hash "${origin_parameters}") string(SHA1 origin_hash "${origin_parameters}")
cpm_get_shortest_hash(
"${CPM_SOURCE_CACHE}/${lower_case_name}" # source cache directory
"${origin_hash}" # Input hash
origin_hash # Computed hash
)
set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${origin_hash}) set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${origin_hash})
endif() endif()
# Expand `download_directory` relative path. This is important because EXISTS doesn't work for # Expand `download_directory` relative path. This is important because EXISTS doesn't work for
@ -845,7 +939,9 @@ function(CPMAddPackage)
endif() endif()
endif() endif()
if(NOT "${DOWNLOAD_ONLY}")
cpm_create_module_file(${CPM_ARGS_NAME} "CPMAddPackage(\"${ARGN}\")") cpm_create_module_file(${CPM_ARGS_NAME} "CPMAddPackage(\"${ARGN}\")")
endif()
if(CPM_PACKAGE_LOCK_ENABLED) if(CPM_PACKAGE_LOCK_ENABLED)
if((CPM_ARGS_VERSION AND NOT CPM_ARGS_SOURCE_DIR) OR CPM_INCLUDE_ALL_IN_PACKAGE_LOCK) if((CPM_ARGS_VERSION AND NOT CPM_ARGS_SOURCE_DIR) OR CPM_INCLUDE_ALL_IN_PACKAGE_LOCK)
@ -862,14 +958,39 @@ function(CPMAddPackage)
) )
if(NOT CPM_SKIP_FETCH) if(NOT CPM_SKIP_FETCH)
# CMake 3.28 added EXCLUDE, SYSTEM (3.25), and SOURCE_SUBDIR (3.18) to FetchContent_Declare.
# Calling FetchContent_MakeAvailable will then internally forward these options to
# add_subdirectory. Up until these changes, we had to call FetchContent_Populate and
# add_subdirectory separately, which is no longer necessary and has been deprecated as of 3.30.
# A Bug in CMake prevents us to use the non-deprecated functions until 3.30.3.
set(fetchContentDeclareExtraArgs "")
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.30.3")
if(${CPM_ARGS_EXCLUDE_FROM_ALL})
list(APPEND fetchContentDeclareExtraArgs EXCLUDE_FROM_ALL)
endif()
if(${CPM_ARGS_SYSTEM})
list(APPEND fetchContentDeclareExtraArgs SYSTEM)
endif()
if(DEFINED CPM_ARGS_SOURCE_SUBDIR)
list(APPEND fetchContentDeclareExtraArgs SOURCE_SUBDIR ${CPM_ARGS_SOURCE_SUBDIR})
endif()
# For CMake version <3.28 OPTIONS are parsed in cpm_add_subdirectory
if(CPM_ARGS_OPTIONS AND NOT DOWNLOAD_ONLY)
foreach(OPTION ${CPM_ARGS_OPTIONS})
cpm_parse_option("${OPTION}")
set(${OPTION_KEY} "${OPTION_VALUE}")
endforeach()
endif()
endif()
cpm_declare_fetch( cpm_declare_fetch(
"${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}" "${PACKAGE_INFO}" "${CPM_ARGS_UNPARSED_ARGUMENTS}" "${CPM_ARGS_NAME}" ${fetchContentDeclareExtraArgs} "${CPM_ARGS_UNPARSED_ARGUMENTS}"
) )
cpm_fetch_package("${CPM_ARGS_NAME}" populated)
cpm_fetch_package("${CPM_ARGS_NAME}" ${DOWNLOAD_ONLY} populated ${CPM_ARGS_UNPARSED_ARGUMENTS})
if(CPM_SOURCE_CACHE AND download_directory) if(CPM_SOURCE_CACHE AND download_directory)
file(LOCK ${download_directory}/../cmake.lock RELEASE) file(LOCK ${download_directory}/../cmake.lock RELEASE)
endif() endif()
if(${populated}) if(${populated} AND ${CMAKE_VERSION} VERSION_LESS "3.30.3")
cpm_add_subdirectory( cpm_add_subdirectory(
"${CPM_ARGS_NAME}" "${CPM_ARGS_NAME}"
"${DOWNLOAD_ONLY}" "${DOWNLOAD_ONLY}"
@ -980,7 +1101,7 @@ function(CPMGetPackageVersion PACKAGE OUTPUT)
endfunction() endfunction()
# declares a package in FetchContent_Declare # declares a package in FetchContent_Declare
function(cpm_declare_fetch PACKAGE VERSION INFO) function(cpm_declare_fetch PACKAGE)
if(${CPM_DRY_RUN}) if(${CPM_DRY_RUN})
cpm_message(STATUS "${CPM_INDENT} Package not declared (dry run)") cpm_message(STATUS "${CPM_INDENT} Package not declared (dry run)")
return() return()
@ -1056,7 +1177,7 @@ endfunction()
# downloads a previously declared package via FetchContent and exports the variables # downloads a previously declared package via FetchContent and exports the variables
# `${PACKAGE}_SOURCE_DIR` and `${PACKAGE}_BINARY_DIR` to the parent scope # `${PACKAGE}_SOURCE_DIR` and `${PACKAGE}_BINARY_DIR` to the parent scope
function(cpm_fetch_package PACKAGE populated) function(cpm_fetch_package PACKAGE DOWNLOAD_ONLY populated)
set(${populated} set(${populated}
FALSE FALSE
PARENT_SCOPE PARENT_SCOPE
@ -1071,7 +1192,24 @@ function(cpm_fetch_package PACKAGE populated)
string(TOLOWER "${PACKAGE}" lower_case_name) string(TOLOWER "${PACKAGE}" lower_case_name)
if(NOT ${lower_case_name}_POPULATED) if(NOT ${lower_case_name}_POPULATED)
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.30.3")
if(DOWNLOAD_ONLY)
# MakeAvailable will call add_subdirectory internally which is not what we want when
# DOWNLOAD_ONLY is set. Populate will only download the dependency without adding it to the
# build
FetchContent_Populate(
${PACKAGE}
SOURCE_DIR "${CPM_FETCHCONTENT_BASE_DIR}/${lower_case_name}-src"
BINARY_DIR "${CPM_FETCHCONTENT_BASE_DIR}/${lower_case_name}-build"
SUBBUILD_DIR "${CPM_FETCHCONTENT_BASE_DIR}/${lower_case_name}-subbuild"
${ARGN}
)
else()
FetchContent_MakeAvailable(${PACKAGE})
endif()
else()
FetchContent_Populate(${PACKAGE}) FetchContent_Populate(${PACKAGE})
endif()
set(${populated} set(${populated}
TRUE TRUE
PARENT_SCOPE PARENT_SCOPE

View File

@ -79,3 +79,16 @@ function(ASSERT_NOT_EXISTS file)
message(FATAL_ERROR "assertion failed: file ${file} exists") message(FATAL_ERROR "assertion failed: file ${file} exists")
endif() endif()
endfunction() endfunction()
function(ASSERT_CONTENTS_EQUAL file content)
if(EXISTS ${file})
file(READ ${file} file_content)
if(content STREQUAL file_content)
message(STATUS "test passed: '${file}' exists and contains '${content}'")
else()
message(FATAL_ERROR "assertion failed: file '${file}' does not contain expected content.")
endif()
else()
message(FATAL_ERROR "assertion failed: file '${file} does not exist")
endif()
endfunction()

View File

@ -13,10 +13,12 @@ include(../../cmake/CPM.cmake)
CPMAddPackage( CPMAddPackage(
NAME Boost NAME Boost
VERSION 1.84.0 VERSION 1.86.0 # Versions less than 1.85.0 may need patches for installation targets.
URL https://github.com/boostorg/boost/releases/download/boost-1.84.0/boost-1.84.0.tar.xz URL https://github.com/boostorg/boost/releases/download/boost-1.86.0/boost-1.86.0-cmake.tar.xz
URL_HASH SHA256=2e64e5d79a738d0fa6fb546c6e5c2bd28f88d268a2a080546f74e5ff98f29d0e URL_HASH SHA256=2c5ec5edcdff47ff55e27ed9560b0a0b94b07bd07ed9928b476150e16b0efc57
OPTIONS "BOOST_ENABLE_CMAKE ON" "BOOST_INCLUDE_LIBRARIES container\\\;asio" # Note the escapes! OPTIONS "BOOST_ENABLE_CMAKE ON" "BOOST_SKIP_INSTALL_RULES ON" # Set `OFF` for installation
"BUILD_SHARED_LIBS OFF" "BOOST_INCLUDE_LIBRARIES container\\\;asio" # Note the escapes!
) )
# `Boost::headers` is also valid
target_link_libraries(CPMExampleBoost PRIVATE Boost::asio Boost::container) target_link_libraries(CPMExampleBoost PRIVATE Boost::asio Boost::container)

View File

@ -8,7 +8,7 @@ include(../../cmake/CPM.cmake)
CPMAddPackage( CPMAddPackage(
NAME lua NAME lua
GIT_REPOSITORY https://github.com/lua/lua.git GITHUB_REPOSITORY lua/lua
VERSION 5.3.5 VERSION 5.3.5
DOWNLOAD_ONLY YES DOWNLOAD_ONLY YES
) )
@ -21,7 +21,13 @@ if(lua_ADDED)
target_include_directories(lua SYSTEM PUBLIC $<BUILD_INTERFACE:${lua_SOURCE_DIR}>) target_include_directories(lua SYSTEM PUBLIC $<BUILD_INTERFACE:${lua_SOURCE_DIR}>)
endif() endif()
CPMAddPackage("gh:ThePhD/sol2@3.3.0") CPMAddPackage(
NAME sol2
GITHUB_REPOSITORY ThePhD/sol2
VERSION 3.3.0
# fix for clang 18.1.0, see https://github.com/ThePhD/sol2/issues/1581#issuecomment-2103463524
PATCHES fix_for_clang.patch
)
# ---- Executable ---- # ---- Executable ----

View File

@ -0,0 +1,18 @@
diff -u a/include/sol/function_types_stateless.hpp b/include/types/function_types_stateless.hpp
--- a/include/sol/function_types_stateless.hpp
+++ b/include/sol/function_types_stateless.hpp
@@ -322,7 +322,13 @@ namespace sol { namespace function_detail {
}
template <bool is_yielding, bool no_trampoline>
- static int call(lua_State* L) noexcept(std::is_nothrow_copy_assignable_v<T>) {
+ static int call(lua_State* L)
+#if SOL_IS_ON(SOL_COMPILER_CLANG)
+ // apparent regression in clang 18 - llvm/llvm-project#91362
+#else
+ noexcept(std::is_nothrow_copy_assignable_v<T>)
+#endif
+ {
int nr;
if constexpr (no_trampoline) {
nr = real_call(L);

View File

@ -31,8 +31,10 @@ class Basics < IntegrationTest
assert_same_path File.join(prj.bin_dir, 'cpm-package-lock.cmake'), check_and_get('CPM_PACKAGE_LOCK_FILE') assert_same_path File.join(prj.bin_dir, 'cpm-package-lock.cmake'), check_and_get('CPM_PACKAGE_LOCK_FILE')
assert_equal 'OFF', check_and_get('CPM_DONT_UPDATE_MODULE_PATH', 'BOOL') assert_equal 'OFF', check_and_get('CPM_DONT_UPDATE_MODULE_PATH', 'BOOL')
if @cache.entries['CMAKE_FIND_PACKAGE_REDIRECTS_DIR'].nil?
assert_same_path File.join(prj.bin_dir, 'CPM_modules'), check_and_get('CPM_MODULE_PATH') assert_same_path File.join(prj.bin_dir, 'CPM_modules'), check_and_get('CPM_MODULE_PATH')
end end
end
# Test when env CPM_SOURCE_CACHE is set # Test when env CPM_SOURCE_CACHE is set
def test_env_cpm_source_cache def test_env_cpm_source_cache

View File

@ -0,0 +1,86 @@
require_relative './lib'
class TestShorthandSyntax < IntegrationTest
def get_project_binaries prj
exe_dir = File.join(prj.bin_dir, 'bin')
assert File.directory? exe_dir
return Dir[exe_dir + '/**/*'].filter {
# on multi-configuration generators (like Visual Studio) the executables will be in bin/<Config>
# also filter-out other artifacts like .pdb or .dsym
!File.directory?(_1) && File.stat(_1).executable?
}.map {
# remove .exe extension if any (there will be one on Windows)
File.basename(_1, '.exe')
}.sort
end
def test_create_with_commit_sha
prj = make_project from_template: 'using-adder'
prj.create_lists_from_default_template package:
'CPMAddPackage("gh:cpm-cmake/testpack-adder#cad1cd4b4cdf957c5b59e30bc9a1dd200dbfc716")'
assert_success prj.configure
cache = prj.read_cache
assert_equal 1, cache.packages.size
assert_equal '0', cache.packages['testpack-adder'].ver
assert_success prj.build
exes = get_project_binaries prj
# No adder projects were built as EXCLUDE_FROM_ALL is implicitly set
assert_equal ['using-adder'], exes
end
def test_create_with_version
prj = make_project from_template: 'using-adder'
prj.create_lists_from_default_template package:
'CPMAddPackage("gh:cpm-cmake/testpack-adder@1.0.0")'
assert_success prj.configure
cache = prj.read_cache
assert_equal 1, cache.packages.size
assert_equal '1.0.0', cache.packages['testpack-adder'].ver
assert_success prj.build
exes = get_project_binaries prj
assert_equal ['using-adder'], exes
end
def test_create_with_all
prj = make_project from_template: 'using-adder'
prj.create_lists_from_default_template package:
'CPMAddPackage(
URI "gh:cpm-cmake/testpack-adder@1.0.0"
EXCLUDE_FROM_ALL false
)'
assert_success prj.configure
cache = prj.read_cache
assert_equal cache.packages.size, 1
assert_equal cache.packages['testpack-adder'].ver, '1.0.0'
assert_success prj.build
exes = get_project_binaries prj
assert_equal exes, ['simple', 'test-adding', 'using-adder']
end
def test_create_with_tests_but_without_examples
prj = make_project from_template: 'using-adder'
prj.create_lists_from_default_template package:
'CPMAddPackage(
URI "gh:cpm-cmake/testpack-adder@1.0.0"
OPTIONS "ADDER_BUILD_EXAMPLES OFF" "ADDER_BUILD_TESTS TRUE"
EXCLUDE_FROM_ALL false
)'
assert_success prj.configure
cache = prj.read_cache
assert_equal cache.packages.size, 1
assert_equal cache.packages['testpack-adder'].ver, '1.0.0'
assert_success prj.build
exes = get_project_binaries prj
assert_equal exes, ['test-adding', 'using-adder']
end
end

View File

@ -75,6 +75,17 @@ class SourceCache < IntegrationTest
assert_equal ver, package.ver assert_equal ver, package.ver
expected_parent_dir = File.join(@cache_dir, name.downcase) expected_parent_dir = File.join(@cache_dir, name.downcase)
assert package.src_dir.start_with?(expected_parent_dir), "#{package.src_dir} must be in #{expected_parent_dir}" assert package.src_dir.start_with?(expected_parent_dir), "#{package.src_dir} must be in #{expected_parent_dir}"
assert_equal dir_sha1, File.basename(package.src_dir)
# The hash has been shortened by cpm_get_shortest_hash. The following
# should hold:
# - The short hash should be a prefix of the input hash
# - There should be a file ".../${short_hash}.hash" which matches the full hash
short_hash = File.basename(package.src_dir)
assert dir_sha1.start_with?(short_hash), "short_hash should be a prefix of dir_sha1"
# Check that the full hash is stored in the .hash file
hash_file = "#{package.src_dir}.hash"
assert File.exist?(hash_file), "Hash file #{hash_file} should exist"
assert_equal dir_sha1, File.read(hash_file), "Hash file should contain the full original hash"
end end
end end

View File

@ -0,0 +1,93 @@
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
include(${CPM_PATH}/CPM.cmake)
include(${CPM_PATH}/testing.cmake)
# Random suffix
string(
RANDOM
LENGTH 6
ALPHABET "0123456789abcdef" tmpdir_suffix
)
# Seconds since epoch
string(TIMESTAMP tmpdir_base "%s" UTC)
set(tmp "${CMAKE_CURRENT_BINARY_DIR}/get_shortest_hash-${tmpdir_base}-${tmpdir_suffix}")
if(IS_DIRECTORY ${tmp})
message(FATAL_ERROR "Test directory ${tmp} already exists")
endif()
file(MAKE_DIRECTORY "${tmp}")
# 1. Sanity check: none of these directories should exist yet
assert_not_exists(${tmp}/cccb.hash)
assert_not_exists(${tmp}/cccb77ae.hash)
assert_not_exists(${tmp}/cccb77ae9609.hash)
assert_not_exists(${tmp}/cccb77ae9608.hash)
assert_not_exists(${tmp}/cccb77be.hash)
# 1. The directory is empty, so it should get a 4-character hash
cpm_get_shortest_hash(${tmp} "cccb77ae9609d2768ed80dd42cec54f77b1f1455" hash)
assert_equal(${hash} "cccb")
assert_contents_equal(${tmp}/cccb.hash cccb77ae9609d2768ed80dd42cec54f77b1f1455)
# 1. Calling the function with a new hash that differs subtly should result in more characters being
# used, enough to uniquely identify the hash
cpm_get_shortest_hash(${tmp} "cccb77ae9609d2768ed80dd42cec54f77b1f1456" hash)
assert_equal(${hash} "cccb77ae")
assert_contents_equal(${tmp}/cccb77ae.hash cccb77ae9609d2768ed80dd42cec54f77b1f1456)
cpm_get_shortest_hash(${tmp} "cccb77ae9609d2768ed80dd42cec54f77b1f1457" hash)
assert_equal(${hash} "cccb77ae9609")
assert_contents_equal(${tmp}/cccb77ae9609.hash cccb77ae9609d2768ed80dd42cec54f77b1f1457)
cpm_get_shortest_hash(${tmp} "cccb77ae9608d2768ed80dd42cec54f77b1f1455" hash)
assert_equal(${hash} "cccb77ae9608")
assert_contents_equal(${tmp}/cccb77ae9608.hash cccb77ae9608d2768ed80dd42cec54f77b1f1455)
cpm_get_shortest_hash(${tmp} "cccb77be9609d2768ed80dd42cec54f77b1f1456" hash)
assert_equal(${hash} "cccb77be")
assert_contents_equal(${tmp}/cccb77be.hash cccb77be9609d2768ed80dd42cec54f77b1f1456)
# check that legacy hashs are recognized
file(MAKE_DIRECTORY "${tmp}/cccb77be9609d2768ed80dd42cec54f77b1f1457")
cpm_get_shortest_hash(${tmp} "cccb77be9609d2768ed80dd42cec54f77b1f1457" hash)
assert_equal(${hash} "cccb77be9609d2768ed80dd42cec54f77b1f1457")
# 1. The old file should still exist, and have the same content
assert_contents_equal(${tmp}/cccb.hash cccb77ae9609d2768ed80dd42cec54f77b1f1455)
assert_contents_equal(${tmp}/cccb77ae.hash cccb77ae9609d2768ed80dd42cec54f77b1f1456)
assert_contents_equal(${tmp}/cccb77ae9609.hash cccb77ae9609d2768ed80dd42cec54f77b1f1457)
assert_contents_equal(${tmp}/cccb77ae9608.hash cccb77ae9608d2768ed80dd42cec54f77b1f1455)
assert_contents_equal(${tmp}/cccb77be.hash cccb77be9609d2768ed80dd42cec54f77b1f1456)
# 1. Confirm idempotence: calling any of these function should produce the same hash as before (hash
# lookups work correctly once the .hash files are created)
cpm_get_shortest_hash(${tmp} "cccb77ae9609d2768ed80dd42cec54f77b1f1455" hash)
assert_equal(${hash} "cccb")
assert_contents_equal(${tmp}/cccb.hash cccb77ae9609d2768ed80dd42cec54f77b1f1455)
cpm_get_shortest_hash(${tmp} "cccb77ae9609d2768ed80dd42cec54f77b1f1456" hash)
assert_equal(${hash} "cccb77ae")
assert_contents_equal(${tmp}/cccb77ae.hash cccb77ae9609d2768ed80dd42cec54f77b1f1456)
cpm_get_shortest_hash(${tmp} "cccb77ae9609d2768ed80dd42cec54f77b1f1457" hash)
assert_equal(${hash} "cccb77ae9609")
assert_contents_equal(${tmp}/cccb77ae9609.hash cccb77ae9609d2768ed80dd42cec54f77b1f1457)
cpm_get_shortest_hash(${tmp} "cccb77ae9608d2768ed80dd42cec54f77b1f1455" hash)
assert_equal(${hash} "cccb77ae9608")
assert_contents_equal(${tmp}/cccb77ae9608.hash cccb77ae9608d2768ed80dd42cec54f77b1f1455)
cpm_get_shortest_hash(${tmp} "cccb77be9609d2768ed80dd42cec54f77b1f1456" hash)
assert_equal(${hash} "cccb77be")
assert_contents_equal(${tmp}/cccb77be.hash cccb77be9609d2768ed80dd42cec54f77b1f1456)
# 1. Cleanup - remove the temporary directory that we created
file(REMOVE_RECURSE ${tmp})

View File

@ -8,6 +8,10 @@ option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
# ---- Dependencies ---- # ---- Dependencies ----
if (@TEST_FORCE_MODULE_MODE@)
unset(CMAKE_FIND_PACKAGE_REDIRECTS_DIR CACHE)
endif()
include(@CPM_PATH@/CPM.cmake) include(@CPM_PATH@/CPM.cmake)
CPMAddPackage( CPMAddPackage(
@ -15,21 +19,23 @@ CPMAddPackage(
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency
) )
# ---- check if generated modules override find_package ----
if (@test_check_find_package@)
find_package(@TEST_DEPENDENCY_NAME@ REQUIRED)
endif()
# ---- Call dependency method to validate correct addition of directory ---- # ---- Call dependency method to validate correct addition of directory ----
dependency_function() dependency_function()
# ---- Check parameters ---- # ---- Check newly added ----
include(@CPM_PATH@/testing.cmake) include(@CPM_PATH@/testing.cmake)
ASSERT_TRUTHY(@TEST_DEPENDENCY_NAME@_ADDED) ASSERT_TRUTHY(@TEST_DEPENDENCY_NAME@_ADDED)
# ---- Check if generated modules override find_package ----
if (@TEST_FIND_PACKAGE@)
find_package(@TEST_DEPENDENCY_NAME@ @TEST_FIND_PACKAGE_CONFIG@ REQUIRED)
find_package(@TEST_CANT_FIND_PACKAGE_NAME@ @TEST_FIND_PACKAGE_CONFIG@ QUIET)
ASSERT_FALSY(@TEST_CANT_FIND_PACKAGE_NAME@_FOUND)
endif()
# ---- Check parameters ----
ASSERT_DEFINED(@TEST_DEPENDENCY_NAME@_SOURCE_DIR) ASSERT_DEFINED(@TEST_DEPENDENCY_NAME@_SOURCE_DIR)
ASSERT_DEFINED(@TEST_DEPENDENCY_NAME@_BINARY_DIR) ASSERT_DEFINED(@TEST_DEPENDENCY_NAME@_BINARY_DIR)
ASSERT_EQUAL("${CPM_LAST_PACKAGE_NAME}" "@TEST_DEPENDENCY_NAME@") ASSERT_EQUAL("${CPM_LAST_PACKAGE_NAME}" "@TEST_DEPENDENCY_NAME@")

View File

@ -3,7 +3,8 @@ include(${CPM_PATH}/testing.cmake)
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/modules) set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/modules)
function(init_project_with_dependency TEST_DEPENDENCY_NAME) function(init_project_with_dependency TEST_DEPENDENCY_NAME TEST_CANT_FIND_PACKAGE_NAME)
set(TEST_FIND_PACKAGE ON)
configure_package_config_file( configure_package_config_file(
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/ModuleCMakeLists.txt.in" "${CMAKE_CURRENT_LIST_DIR}/local_dependency/ModuleCMakeLists.txt.in"
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/CMakeLists.txt" "${CMAKE_CURRENT_LIST_DIR}/local_dependency/CMakeLists.txt"
@ -18,11 +19,17 @@ function(init_project_with_dependency TEST_DEPENDENCY_NAME)
assert_equal(${ret} "0") assert_equal(${ret} "0")
endfunction() endfunction()
init_project_with_dependency(A) init_project_with_dependency(A B)
assert_exists(${TEST_BUILD_DIR}/CPM_modules) init_project_with_dependency(B A)
assert_exists(${TEST_BUILD_DIR}/CPM_modules/FindA.cmake)
assert_not_exists(${TEST_BUILD_DIR}/CPM_modules/FindB.cmake)
init_project_with_dependency(B) if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.24.0")
assert_not_exists(${TEST_BUILD_DIR}/CPM_modules/FindA.cmake) set(TEST_FIND_PACKAGE_CONFIG CONFIG)
assert_exists(${TEST_BUILD_DIR}/CPM_modules/FindB.cmake) init_project_with_dependency(A B)
init_project_with_dependency(B A)
# Test the fallback path for CMake <3.24 works
set(TEST_FIND_PACKAGE_CONFIG)
set(TEST_FORCE_MODULE_MODE ON)
init_project_with_dependency(A B)
init_project_with_dependency(B A)
endif()