Compare commits

..

8 Commits

Author SHA1 Message Date
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
11 changed files with 135 additions and 34 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

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.
`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.
@@ -214,6 +215,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.
### 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
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.

View File

@@ -42,7 +42,11 @@ if(NOT COMMAND cpm_message)
endfunction()
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)
if(CPM_DIRECTORY)
@@ -162,7 +166,7 @@ set(CPM_SOURCE_CACHE
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
"${CMAKE_BINARY_DIR}/CPM_modules"
CACHE INTERNAL ""
@@ -269,10 +273,25 @@ endfunction()
# finding the system library
function(cpm_create_module_file Name)
if(NOT CPM_DONT_UPDATE_MODULE_PATH)
# erase any previous modules
file(WRITE ${CPM_MODULE_PATH}/Find${Name}.cmake
"include(\"${CPM_FILE}\")\n${ARGN}\nset(${Name}_FOUND TRUE)"
)
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
"include(\"${CPM_FILE}\")\n${ARGN}\nset(${Name}_FOUND TRUE)"
)
endif()
endif()
endfunction()
@@ -475,7 +494,7 @@ function(cpm_add_patches)
# Find the patch program.
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
# it exists, then search `../usr/bin` and `../../usr/bin` for patch.exe.
find_package(Git QUIET)
@@ -869,8 +888,9 @@ function(CPMAddPackage)
# 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.28.0")
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.30.3")
if(${CPM_ARGS_EXCLUDE_FROM_ALL})
list(APPEND fetchContentDeclareExtraArgs EXCLUDE_FROM_ALL)
endif()
@@ -896,7 +916,7 @@ function(CPMAddPackage)
if(CPM_SOURCE_CACHE AND download_directory)
file(LOCK ${download_directory}/../cmake.lock RELEASE)
endif()
if(${populated} AND ${CMAKE_VERSION} VERSION_LESS "3.28.0")
if(${populated} AND ${CMAKE_VERSION} VERSION_LESS "3.30.3")
cpm_add_subdirectory(
"${CPM_ARGS_NAME}"
"${DOWNLOAD_ONLY}"
@@ -1098,7 +1118,7 @@ function(cpm_fetch_package PACKAGE DOWNLOAD_ONLY populated)
string(TOLOWER "${PACKAGE}" lower_case_name)
if(NOT ${lower_case_name}_POPULATED)
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.28.0")
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

View File

@@ -13,10 +13,12 @@ include(../../cmake/CPM.cmake)
CPMAddPackage(
NAME Boost
VERSION 1.84.0
URL https://github.com/boostorg/boost/releases/download/boost-1.84.0/boost-1.84.0.tar.xz
URL_HASH SHA256=2e64e5d79a738d0fa6fb546c6e5c2bd28f88d268a2a080546f74e5ff98f29d0e
OPTIONS "BOOST_ENABLE_CMAKE ON" "BOOST_INCLUDE_LIBRARIES container\\\;asio" # Note the escapes!
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.86.0/boost-1.86.0-cmake.tar.xz
URL_HASH SHA256=2c5ec5edcdff47ff55e27ed9560b0a0b94b07bd07ed9928b476150e16b0efc57
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)

View File

@@ -8,7 +8,7 @@ include(../../cmake/CPM.cmake)
CPMAddPackage(
NAME lua
GIT_REPOSITORY https://github.com/lua/lua.git
GITHUB_REPOSITORY lua/lua
VERSION 5.3.5
DOWNLOAD_ONLY YES
)
@@ -21,7 +21,13 @@ if(lua_ADDED)
target_include_directories(lua SYSTEM PUBLIC $<BUILD_INTERFACE:${lua_SOURCE_DIR}>)
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 ----

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,7 +31,9 @@ class Basics < IntegrationTest
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_same_path File.join(prj.bin_dir, 'CPM_modules'), check_and_get('CPM_MODULE_PATH')
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')
end
end
# Test when env CPM_SOURCE_CACHE is set

View File

@@ -8,6 +8,10 @@ option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
# ---- Dependencies ----
if (@TEST_FORCE_MODULE_MODE@)
unset(CMAKE_FIND_PACKAGE_REDIRECTS_DIR CACHE)
endif()
include(@CPM_PATH@/CPM.cmake)
CPMAddPackage(
@@ -15,21 +19,23 @@ CPMAddPackage(
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 ----
dependency_function()
# ---- Check parameters ----
# ---- Check newly added ----
include(@CPM_PATH@/testing.cmake)
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@_BINARY_DIR)
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)
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(
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/ModuleCMakeLists.txt.in"
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/CMakeLists.txt"
@@ -18,11 +19,17 @@ function(init_project_with_dependency TEST_DEPENDENCY_NAME)
assert_equal(${ret} "0")
endfunction()
init_project_with_dependency(A)
assert_exists(${TEST_BUILD_DIR}/CPM_modules)
assert_exists(${TEST_BUILD_DIR}/CPM_modules/FindA.cmake)
assert_not_exists(${TEST_BUILD_DIR}/CPM_modules/FindB.cmake)
init_project_with_dependency(A B)
init_project_with_dependency(B A)
init_project_with_dependency(B)
assert_not_exists(${TEST_BUILD_DIR}/CPM_modules/FindA.cmake)
assert_exists(${TEST_BUILD_DIR}/CPM_modules/FindB.cmake)
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.24.0")
set(TEST_FIND_PACKAGE_CONFIG CONFIG)
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()