Skip to content

Commit

Permalink
Added an example and improved comment for cpm_add_patches.
Browse files Browse the repository at this point in the history
  • Loading branch information
ScottBailey committed Jun 9, 2024
1 parent 523c14a commit 9347302
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 1 deletion.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,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.
Expand Down
4 changes: 3 additions & 1 deletion cmake/CPM.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -464,7 +464,9 @@ function(cpm_check_git_working_dir_is_clean repoPath gitTag isClean)

endfunction()

# method to add PATCH_COMMAND to CPM_ARGS_UNPARSED_ARGUMENTS for PATCHES files.
# 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)
Expand Down
28 changes: 28 additions & 0 deletions examples/highway/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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 changes: 28 additions & 0 deletions examples/highway/highway.patch
Original file line number Diff line number Diff line change
@@ -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 changes: 27 additions & 0 deletions examples/highway/main.cpp
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit 9347302

Please sign in to comment.