mirror of
https://github.com/cpm-cmake/CPM.cmake.git
synced 2025-11-17 22:58:14 -05:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8b67fe2344 | ||
|
|
d416d9b22c | ||
|
|
76ca48690b | ||
|
|
0370507fed | ||
|
|
c0855c9543 |
2
.github/workflows/test.yaml
vendored
2
.github/workflows/test.yaml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
os: [ubuntu-latest, windows-2022, macos-latest]
|
||||
# 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
|
||||
cmake_version: ['3.16.3', '3.27.5']
|
||||
cmake_version: ['3.16.3', '3.27.5', '3.30.0']
|
||||
exclude:
|
||||
# there seems to be an issue with CMake 3.16 not finding a C++ compiler on windows-2022
|
||||
- os: windows-2022
|
||||
|
||||
@@ -67,6 +67,7 @@ Afterwards, any targets defined in the dependency can be used directly.
|
||||
CPMAddPackage(
|
||||
NAME # The unique name of the dependency (should be the exported target's name)
|
||||
VERSION # The minimum version of the dependency (optional, defaults to 0)
|
||||
PATCHES # Patch files to be applied sequentially using patch and PATCH_OPTIONS (optional)
|
||||
OPTIONS # Configuration options passed to the dependency (optional)
|
||||
DOWNLOAD_ONLY # If set, the project is downloaded, but not configured (optional)
|
||||
[...] # Origin parameters forwarded to FetchContent_Declare, see below
|
||||
@@ -78,6 +79,8 @@ If `GIT_TAG` hasn't been explicitly specified it defaults to `v(VERSION)`, a com
|
||||
On the other hand, if `VERSION` hasn't been explicitly specified, CPM can automatically identify the version from the git tag in some common cases.
|
||||
`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).
|
||||
|
||||
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 `SYSTEM` is set to a truthy value, the SYSTEM directory property of the subdirectory added will be set to true.
|
||||
@@ -190,6 +193,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`.
|
||||
|
||||
@@ -31,6 +31,7 @@ parse:
|
||||
EXCLUDE_FROM_ALL: 1
|
||||
SYSTEM: 1
|
||||
SOURCE_SUBDIR: 1
|
||||
PATCHES: +
|
||||
OPTIONS: +
|
||||
cpmfindpackage:
|
||||
pargs:
|
||||
|
||||
131
cmake/CPM.cmake
131
cmake/CPM.cmake
@@ -391,8 +391,8 @@ function(cpm_parse_add_package_single_arg arg outArgs)
|
||||
# We don't try to parse the version if it's not provided explicitly. cpm_get_version_from_url
|
||||
# should do this at a later point
|
||||
else()
|
||||
# We should never get here. This is an assertion and hitting it means there's a bug in the code
|
||||
# above. A packageType was set, but not handled by this if-else.
|
||||
# We should never get here. This is an assertion and hitting it means there's a problem with the
|
||||
# code above. A packageType was set, but not handled by this if-else.
|
||||
message(FATAL_ERROR "${CPM_INDENT} Unsupported package type '${packageType}' of '${arg}'")
|
||||
endif()
|
||||
|
||||
@@ -464,6 +464,69 @@ function(cpm_check_git_working_dir_is_clean repoPath gitTag isClean)
|
||||
|
||||
endfunction()
|
||||
|
||||
# Add PATCH_COMMAND to CPM_ARGS_UNPARSED_ARGUMENTS. This method consumes a list of files in ARGN
|
||||
# then generates a `PATCH_COMMAND` appropriate for `ExternalProject_Add()`. This command is appended
|
||||
# to the parent scope's `CPM_ARGS_UNPARSED_ARGUMENTS`.
|
||||
function(cpm_add_patches)
|
||||
# Return if no patch files are supplied.
|
||||
if(NOT ARGN)
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Find the patch program.
|
||||
find_program(PATCH_EXECUTABLE patch)
|
||||
if(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` for patch.exe.
|
||||
find_package(Git QUIET)
|
||||
if(GIT_EXECUTABLE)
|
||||
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 ${extra_search_path} DIRECTORY)
|
||||
find_program(PATCH_EXECUTABLE patch HINTS "${extra_search_path}/usr/bin")
|
||||
endif()
|
||||
endif()
|
||||
if(NOT PATCH_EXECUTABLE)
|
||||
message(FATAL_ERROR "Couldn't find `patch` executable to use with PATCHES keyword.")
|
||||
endif()
|
||||
|
||||
# Create a temporary
|
||||
set(temp_list ${CPM_ARGS_UNPARSED_ARGUMENTS})
|
||||
|
||||
# Ensure each file exists (or error out) and add it to the list.
|
||||
set(first_item True)
|
||||
foreach(PATCH_FILE ${ARGN})
|
||||
# Make sure the patch file exists, if we can't find it, try again in the current directory.
|
||||
if(NOT EXISTS "${PATCH_FILE}")
|
||||
if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/${PATCH_FILE}")
|
||||
message(FATAL_ERROR "Couldn't find patch file: '${PATCH_FILE}'")
|
||||
endif()
|
||||
set(PATCH_FILE "${CMAKE_CURRENT_LIST_DIR}/${PATCH_FILE}")
|
||||
endif()
|
||||
|
||||
# Convert to absolute path for use with patch file command.
|
||||
get_filename_component(PATCH_FILE "${PATCH_FILE}" ABSOLUTE)
|
||||
|
||||
# The first patch entry must be preceded by "PATCH_COMMAND" while the following items are
|
||||
# preceded by "&&".
|
||||
if(first_item)
|
||||
set(first_item False)
|
||||
list(APPEND temp_list "PATCH_COMMAND")
|
||||
else()
|
||||
list(APPEND temp_list "&&")
|
||||
endif()
|
||||
# Add the patch command to the list
|
||||
list(APPEND temp_list "${PATCH_EXECUTABLE}" "-p1" "<" "${PATCH_FILE}")
|
||||
endforeach()
|
||||
|
||||
# Move temp out into parent scope.
|
||||
set(CPM_ARGS_UNPARSED_ARGUMENTS
|
||||
${temp_list}
|
||||
PARENT_SCOPE
|
||||
)
|
||||
|
||||
endfunction()
|
||||
|
||||
# method to overwrite internal FetchContent properties, to allow using CPM.cmake to overload
|
||||
# FetchContent calls. As these are internal cmake properties, this method should be used carefully
|
||||
# and may need modification in future CMake versions. Source:
|
||||
@@ -534,9 +597,10 @@ function(CPMAddPackage)
|
||||
GIT_SHALLOW
|
||||
EXCLUDE_FROM_ALL
|
||||
SOURCE_SUBDIR
|
||||
CUSTOM_CACHE_KEY
|
||||
)
|
||||
|
||||
set(multiValueArgs URL OPTIONS DOWNLOAD_COMMAND)
|
||||
set(multiValueArgs URL OPTIONS DOWNLOAD_COMMAND PATCHES)
|
||||
|
||||
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
|
||||
|
||||
@@ -627,6 +691,7 @@ function(CPMAddPackage)
|
||||
SOURCE_DIR "${PACKAGE_SOURCE}"
|
||||
EXCLUDE_FROM_ALL "${CPM_ARGS_EXCLUDE_FROM_ALL}"
|
||||
SYSTEM "${CPM_ARGS_SYSTEM}"
|
||||
PATCHES "${CPM_ARGS_PATCHES}"
|
||||
OPTIONS "${CPM_ARGS_OPTIONS}"
|
||||
SOURCE_SUBDIR "${CPM_ARGS_SOURCE_SUBDIR}"
|
||||
DOWNLOAD_ONLY "${DOWNLOAD_ONLY}"
|
||||
@@ -682,6 +747,8 @@ function(CPMAddPackage)
|
||||
set(CPM_FETCHCONTENT_BASE_DIR ${CMAKE_BINARY_DIR}/_deps)
|
||||
endif()
|
||||
|
||||
cpm_add_patches(${CPM_ARGS_PATCHES})
|
||||
|
||||
if(DEFINED CPM_ARGS_DOWNLOAD_COMMAND)
|
||||
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS DOWNLOAD_COMMAND ${CPM_ARGS_DOWNLOAD_COMMAND})
|
||||
elseif(DEFINED CPM_ARGS_SOURCE_DIR)
|
||||
@@ -704,7 +771,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()
|
||||
@@ -792,14 +862,38 @@ function(CPMAddPackage)
|
||||
)
|
||||
|
||||
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.
|
||||
set(fetchContentDeclareExtraArgs "")
|
||||
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.28.0")
|
||||
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_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)
|
||||
file(LOCK ${download_directory}/../cmake.lock RELEASE)
|
||||
endif()
|
||||
if(${populated})
|
||||
if(${populated} AND ${CMAKE_VERSION} VERSION_LESS "3.28.0")
|
||||
cpm_add_subdirectory(
|
||||
"${CPM_ARGS_NAME}"
|
||||
"${DOWNLOAD_ONLY}"
|
||||
@@ -910,7 +1004,7 @@ function(CPMGetPackageVersion PACKAGE OUTPUT)
|
||||
endfunction()
|
||||
|
||||
# declares a package in FetchContent_Declare
|
||||
function(cpm_declare_fetch PACKAGE VERSION INFO)
|
||||
function(cpm_declare_fetch PACKAGE)
|
||||
if(${CPM_DRY_RUN})
|
||||
cpm_message(STATUS "${CPM_INDENT} Package not declared (dry run)")
|
||||
return()
|
||||
@@ -986,7 +1080,7 @@ endfunction()
|
||||
|
||||
# downloads a previously declared package via FetchContent and exports the variables
|
||||
# `${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}
|
||||
FALSE
|
||||
PARENT_SCOPE
|
||||
@@ -1001,7 +1095,24 @@ function(cpm_fetch_package PACKAGE populated)
|
||||
string(TOLOWER "${PACKAGE}" lower_case_name)
|
||||
|
||||
if(NOT ${lower_case_name}_POPULATED)
|
||||
FetchContent_Populate(${PACKAGE})
|
||||
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.28.0")
|
||||
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})
|
||||
endif()
|
||||
set(${populated}
|
||||
TRUE
|
||||
PARENT_SCOPE
|
||||
|
||||
28
examples/highway/CMakeLists.txt
Normal file
28
examples/highway/CMakeLists.txt
Normal file
@@ -0,0 +1,28 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExamplePatchHighway)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
# Google's highway Includes a SIMD sorting function that is faster than x86-simd-sort for larger
|
||||
# arrays. See: https://github.com/google/highway/blob/master/g3doc/quick_reference.md
|
||||
CPMAddPackage(
|
||||
NAME highway
|
||||
URL https://github.com/google/highway/archive/refs/tags/1.1.0.tar.gz
|
||||
URL_HASH SHA256=354a8b4539b588e70b98ec70844273e3f2741302c4c377bcc4e81b3d1866f7c9
|
||||
PATCHES "highway.patch" # This adds SYSTEM to the includes.
|
||||
OPTIONS "HWY_ENABLE_EXAMPLES OFF" "HWY_ENABLE_INSTALL OFF" "HWY_ENABLE_TESTS OFF"
|
||||
)
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
if(LINUX)
|
||||
# This would cause a float compare error inside the highway header code if the patch is NOT
|
||||
# applied.
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wfloat-equal")
|
||||
endif()
|
||||
|
||||
add_executable(CPMExamplePatchHighway "main.cpp")
|
||||
target_link_libraries(CPMExamplePatchHighway hwy hwy_contrib)
|
||||
28
examples/highway/highway.patch
Normal file
28
examples/highway/highway.patch
Normal file
@@ -0,0 +1,28 @@
|
||||
Common subdirectories: a/.bcr and b/.bcr
|
||||
Common subdirectories: a/.github and b/.github
|
||||
diff -u a/CMakeLists.txt b/CMakeLists.txt
|
||||
--- a/CMakeLists.txt 2024-05-21 12:50:37.738318520 -0500
|
||||
+++ b/CMakeLists.txt 2024-05-21 12:49:59.914226871 -0500
|
||||
@@ -350,7 +350,7 @@
|
||||
target_compile_options(hwy PRIVATE ${HWY_FLAGS})
|
||||
set_property(TARGET hwy PROPERTY POSITION_INDEPENDENT_CODE ON)
|
||||
set_target_properties(hwy PROPERTIES VERSION ${LIBRARY_VERSION} SOVERSION ${LIBRARY_SOVERSION})
|
||||
-target_include_directories(hwy PUBLIC
|
||||
+target_include_directories(hwy SYSTEM PUBLIC
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
||||
target_compile_features(hwy PUBLIC cxx_std_11)
|
||||
@@ -370,7 +370,7 @@
|
||||
target_compile_options(hwy_contrib PRIVATE ${HWY_FLAGS})
|
||||
set_property(TARGET hwy_contrib PROPERTY POSITION_INDEPENDENT_CODE ON)
|
||||
set_target_properties(hwy_contrib PROPERTIES VERSION ${LIBRARY_VERSION} SOVERSION ${LIBRARY_SOVERSION})
|
||||
-target_include_directories(hwy_contrib PUBLIC
|
||||
+target_include_directories(hwy_contrib SYSTEM PUBLIC
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
||||
target_compile_features(hwy_contrib PUBLIC cxx_std_11)
|
||||
Common subdirectories: a/cmake and b/cmake
|
||||
Common subdirectories: a/debian and b/debian
|
||||
Common subdirectories: a/docs and b/docs
|
||||
Common subdirectories: a/g3doc and b/g3doc
|
||||
Common subdirectories: a/hwy and b/hwy
|
||||
27
examples/highway/main.cpp
Normal file
27
examples/highway/main.cpp
Normal file
@@ -0,0 +1,27 @@
|
||||
#include <hwy/contrib/sort/vqsort.h> // hwy::VQSort() for large data sets
|
||||
|
||||
#include <cstdint>
|
||||
#include <random>
|
||||
#include <vector>
|
||||
|
||||
// Use hwy::VQSort to sort larger vectors
|
||||
inline void sort_large(std::vector<double>& v) {
|
||||
hwy::VQSort(v.data(), v.size(), hwy::SortAscending{});
|
||||
}
|
||||
|
||||
int main(int, char**) {
|
||||
std::random_device random_device;
|
||||
std::default_random_engine random_engine(random_device());
|
||||
std::uniform_real_distribution<double> uniform_dist(0.0, 100.0);
|
||||
|
||||
const std::size_t sz = 100000;
|
||||
std::vector<double> v;
|
||||
v.reserve(sz);
|
||||
for (std::size_t i = 0; i < sz; ++i) {
|
||||
v.push_back(uniform_dist(random_engine));
|
||||
}
|
||||
|
||||
sort_large(v);
|
||||
|
||||
return 0;
|
||||
}
|
||||
20
examples/xxHash/CMakeLists.txt
Normal file
20
examples/xxHash/CMakeLists.txt
Normal file
@@ -0,0 +1,20 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMxxHashExample)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
GITHUB_REPOSITORY Cyan4973/xxHash
|
||||
GIT_TAG v0.8.2
|
||||
OPTIONS "XXHASH_BUILD_ENABLE_INLINE_API OFF" "XXHASH_BUILD_XXHSUM OFF"
|
||||
SOURCE_SUBDIR cmake_unofficial
|
||||
)
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMxxHashExample main.cpp)
|
||||
target_compile_features(CPMxxHashExample PRIVATE cxx_std_17)
|
||||
target_link_libraries(CPMxxHashExample xxHash::xxhash)
|
||||
12
examples/xxHash/main.cpp
Normal file
12
examples/xxHash/main.cpp
Normal file
@@ -0,0 +1,12 @@
|
||||
#include <xxh3.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
int main() {
|
||||
std::string example = "Hello World!";
|
||||
XXH64_hash_t hash = XXH3_64bits(example.data(), example.size());
|
||||
|
||||
std::cout << "Hash: " << hash << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
13
test/integration/templates/using-patch-adder/lists.in.cmake
Normal file
13
test/integration/templates/using-patch-adder/lists.in.cmake
Normal file
@@ -0,0 +1,13 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(using-patch-adder)
|
||||
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||
|
||||
include("%{cpm_path}")
|
||||
|
||||
%{packages}
|
||||
|
||||
add_executable(using-patch-adder using-patch-adder.cpp)
|
||||
|
||||
target_link_libraries(using-patch-adder adder)
|
||||
@@ -0,0 +1,12 @@
|
||||
diff --git a/code/adder/adder.hpp b/code/adder/adder.hpp
|
||||
index fdb9324..7c2fa00 100644
|
||||
--- a/code/adder/adder.hpp
|
||||
+++ b/code/adder/adder.hpp
|
||||
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
-namespace adder
|
||||
+namespace patched
|
||||
{
|
||||
int add(int a, int b);
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
diff --git a/code/adder/adder.cpp b/code/adder/adder.cpp
|
||||
index fc6e767..44b1197 100644
|
||||
--- a/code/adder/adder.cpp
|
||||
+++ b/code/adder/adder.cpp
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "adder.hpp"
|
||||
|
||||
-namespace adder
|
||||
+namespace patched
|
||||
{
|
||||
int add(int a, int b)
|
||||
{
|
||||
@@ -0,0 +1,8 @@
|
||||
#include <adder/adder.hpp>
|
||||
#include <cstdio>
|
||||
|
||||
int main() {
|
||||
int sum = patched::add(5, 3);
|
||||
std::printf("%d\n", sum);
|
||||
return 0;
|
||||
}
|
||||
27
test/integration/test_patches_command.rb
Normal file
27
test/integration/test_patches_command.rb
Normal file
@@ -0,0 +1,27 @@
|
||||
require_relative './lib'
|
||||
|
||||
# Tests using a multi-argumenet PATCHES command to fetch and modify a dependency
|
||||
|
||||
class DownloadCommand < IntegrationTest
|
||||
|
||||
def test_fetch_dependency_using_download_command
|
||||
prj = make_project from_template: 'using-patch-adder'
|
||||
|
||||
prj.create_lists_from_default_template package: <<~PACK
|
||||
set(DOWNLOAD_DIR ${CMAKE_BINARY_DIR}/_deps/testpack-adder-src)
|
||||
CPMAddPackage(
|
||||
NAME testpack-adder
|
||||
DOWNLOAD_COMMAND git clone --depth 1 --branch v1.0.0 https://github.com/cpm-cmake/testpack-adder.git ${DOWNLOAD_DIR}
|
||||
OPTIONS "ADDER_BUILD_TESTS OFF" "ADDER_BUILD_EXAMPLES OFF"
|
||||
PATCHES
|
||||
patches/001-test_patches_command.patch
|
||||
patches/002-test_patches_command.patch
|
||||
)
|
||||
PACK
|
||||
|
||||
# configure with unpopulated cache
|
||||
assert_success prj.configure
|
||||
assert_success prj.build
|
||||
end
|
||||
|
||||
end
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user