From 43953635496f39843b7361b17a949b3199e6513c Mon Sep 17 00:00:00 2001 From: Scott Bailey Date: Tue, 23 Apr 2024 14:22:29 -0500 Subject: [PATCH 1/7] Adding PATCHES keyword. --- README.md | 1 + cmake/CPM.cmake | 73 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 99e756fa..cac7da87 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index ba62fd20..d30570fd 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -464,6 +464,74 @@ 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. +function(cpm_add_patches) + # Return if no patch files are supplied. + if(NOT ARGN) + return() + endif() + + # Provide a small warning. + if(CMAKE_VERSION VERSION_LESS "3.20") + message(AUTHOR_WARNING "Versions of CMake less than 3.20 may need to supply patch files as absolute paths.") + 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) + if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") + cmake_path(GET GIT_EXECUTABLE PARENT_PATH extra_search_path) + cmake_path(GET extra_search_path PARENT_PATH extra_search_path) + else() + 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) + endif() + 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}) + 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 CMake 3.20 (available since March 3rd, 2021) and later, this may + # cause users with older versions of CMake to strictly call out an absolute path. + if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") + cmake_path(ABSOLUTE_PATH PATCH_FILE) + endif() + # 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: @@ -537,7 +605,7 @@ function(CPMAddPackage) CUSTOM_CACHE_KEY ) - set(multiValueArgs URL OPTIONS DOWNLOAD_COMMAND) + set(multiValueArgs URL OPTIONS DOWNLOAD_COMMAND PATCHES) cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") @@ -628,6 +696,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}" @@ -724,6 +793,8 @@ function(CPMAddPackage) file(LOCK ${download_directory}/../cmake.lock) endif() + cpm_add_patches(${CPM_ARGS_PATCHES}) + if(EXISTS ${download_directory}) if(CPM_SOURCE_CACHE) file(LOCK ${download_directory}/../cmake.lock RELEASE) From 779328486b030ac59b083032c5604eda3e143074 Mon Sep 17 00:00:00 2001 From: Scott Bailey Date: Tue, 23 Apr 2024 14:40:55 -0500 Subject: [PATCH 2/7] Formatting fix. --- cmake/CPM.cmake | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index d30570fd..73b2f981 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -473,14 +473,17 @@ function(cpm_add_patches) # Provide a small warning. if(CMAKE_VERSION VERSION_LESS "3.20") - message(AUTHOR_WARNING "Versions of CMake less than 3.20 may need to supply patch files as absolute paths.") + message( + AUTHOR_WARNING + "Versions of CMake less than 3.20 may need to supply patch files as absolute paths." + ) 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. + # 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) if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") @@ -528,7 +531,10 @@ function(cpm_add_patches) endforeach() # Move temp out into parent scope. - set(CPM_ARGS_UNPARSED_ARGUMENTS ${temp_list} PARENT_SCOPE) + set(CPM_ARGS_UNPARSED_ARGUMENTS + ${temp_list} + PARENT_SCOPE + ) endfunction() From 311cd3f46b02be9e41c9a9e4278ce37597174ff6 Mon Sep 17 00:00:00 2001 From: Scott Bailey Date: Tue, 23 Apr 2024 20:44:21 -0500 Subject: [PATCH 3/7] Move cpm_add_patches() outside if/else scopes. --- cmake/CPM.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index 73b2f981..e2946a58 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -758,6 +758,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) @@ -799,8 +801,6 @@ function(CPMAddPackage) file(LOCK ${download_directory}/../cmake.lock) endif() - cpm_add_patches(${CPM_ARGS_PATCHES}) - if(EXISTS ${download_directory}) if(CPM_SOURCE_CACHE) file(LOCK ${download_directory}/../cmake.lock RELEASE) From ceef053562290b56dc5a8c3cae9d9274f4c6e217 Mon Sep 17 00:00:00 2001 From: Scott Bailey Date: Wed, 24 Apr 2024 11:47:49 -0500 Subject: [PATCH 4/7] cmake-format: add PATCHES to CPMAddPackage. --- cmake/.cmake-format-additional_commands-cpm | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/.cmake-format-additional_commands-cpm b/cmake/.cmake-format-additional_commands-cpm index 5dd80256..36f54b0d 100644 --- a/cmake/.cmake-format-additional_commands-cpm +++ b/cmake/.cmake-format-additional_commands-cpm @@ -31,6 +31,7 @@ parse: EXCLUDE_FROM_ALL: 1 SYSTEM: 1 SOURCE_SUBDIR: 1 + PATCHES: + OPTIONS: + cpmfindpackage: pargs: From 5ed5dfe678d27613e62e16db4cac532a7df0c333 Mon Sep 17 00:00:00 2001 From: Scott Bailey Date: Thu, 25 Apr 2024 09:33:22 -0500 Subject: [PATCH 5/7] Integration tests for PATCHES command. --- .../using-patch-adder/lists.in.cmake | 13 +++++++++ .../patches/001-test_patches_command.patch | 12 +++++++++ .../patches/002-test_patches_command.patch | 12 +++++++++ .../using-patch-adder/using-patch-adder.cpp | 8 ++++++ test/integration/test_patches_command.rb | 27 +++++++++++++++++++ 5 files changed, 72 insertions(+) create mode 100644 test/integration/templates/using-patch-adder/lists.in.cmake create mode 100644 test/integration/templates/using-patch-adder/patches/001-test_patches_command.patch create mode 100644 test/integration/templates/using-patch-adder/patches/002-test_patches_command.patch create mode 100644 test/integration/templates/using-patch-adder/using-patch-adder.cpp create mode 100644 test/integration/test_patches_command.rb diff --git a/test/integration/templates/using-patch-adder/lists.in.cmake b/test/integration/templates/using-patch-adder/lists.in.cmake new file mode 100644 index 00000000..83c48d34 --- /dev/null +++ b/test/integration/templates/using-patch-adder/lists.in.cmake @@ -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) diff --git a/test/integration/templates/using-patch-adder/patches/001-test_patches_command.patch b/test/integration/templates/using-patch-adder/patches/001-test_patches_command.patch new file mode 100644 index 00000000..281b1b8b --- /dev/null +++ b/test/integration/templates/using-patch-adder/patches/001-test_patches_command.patch @@ -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); + } diff --git a/test/integration/templates/using-patch-adder/patches/002-test_patches_command.patch b/test/integration/templates/using-patch-adder/patches/002-test_patches_command.patch new file mode 100644 index 00000000..57146fc0 --- /dev/null +++ b/test/integration/templates/using-patch-adder/patches/002-test_patches_command.patch @@ -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) + { diff --git a/test/integration/templates/using-patch-adder/using-patch-adder.cpp b/test/integration/templates/using-patch-adder/using-patch-adder.cpp new file mode 100644 index 00000000..5e6659ad --- /dev/null +++ b/test/integration/templates/using-patch-adder/using-patch-adder.cpp @@ -0,0 +1,8 @@ +#include +#include + +int main() { + int sum = patched::add(5, 3); + std::printf("%d\n", sum); + return 0; +} diff --git a/test/integration/test_patches_command.rb b/test/integration/test_patches_command.rb new file mode 100644 index 00000000..f9555b74 --- /dev/null +++ b/test/integration/test_patches_command.rb @@ -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 From 523c14a1c8b2f9625c0d5c55d2d3deb3c529da74 Mon Sep 17 00:00:00 2001 From: Scott Bailey Date: Mon, 3 Jun 2024 12:56:03 -0500 Subject: [PATCH 6/7] Use get_filename_component() in place of cmake_path() for use with all cmake versions 3.14 and above. --- cmake/CPM.cmake | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index e2946a58..7a8af9e8 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -471,14 +471,6 @@ function(cpm_add_patches) return() endif() - # Provide a small warning. - if(CMAKE_VERSION VERSION_LESS "3.20") - message( - AUTHOR_WARNING - "Versions of CMake less than 3.20 may need to supply patch files as absolute paths." - ) - endif() - # Find the patch program. find_program(PATCH_EXECUTABLE patch) if(WIN32 AND NOT PATCH_EXECUTABLE) @@ -486,14 +478,9 @@ function(cpm_add_patches) # it exists, then search `../../usr/bin` for patch.exe. find_package(Git QUIET) if(GIT_EXECUTABLE) - if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") - cmake_path(GET GIT_EXECUTABLE PARENT_PATH extra_search_path) - cmake_path(GET extra_search_path PARENT_PATH extra_search_path) - else() - 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) - endif() + 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() @@ -507,17 +494,17 @@ function(cpm_add_patches) # 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 CMake 3.20 (available since March 3rd, 2021) and later, this may - # cause users with older versions of CMake to strictly call out an absolute path. - if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") - cmake_path(ABSOLUTE_PATH 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) From 9347302ec99e68171a64210e412e4bea9cdd3741 Mon Sep 17 00:00:00 2001 From: Scott Bailey Date: Sat, 8 Jun 2024 21:20:06 -0500 Subject: [PATCH 7/7] Added an example and improved comment for cpm_add_patches. --- README.md | 2 ++ cmake/CPM.cmake | 4 +++- examples/highway/CMakeLists.txt | 28 ++++++++++++++++++++++++++++ examples/highway/highway.patch | 28 ++++++++++++++++++++++++++++ examples/highway/main.cpp | 27 +++++++++++++++++++++++++++ 5 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 examples/highway/CMakeLists.txt create mode 100644 examples/highway/highway.patch create mode 100644 examples/highway/main.cpp diff --git a/README.md b/README.md index cac7da87..33fbbc89 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index 7a8af9e8..b273c3bb 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -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) diff --git a/examples/highway/CMakeLists.txt b/examples/highway/CMakeLists.txt new file mode 100644 index 00000000..96241dfc --- /dev/null +++ b/examples/highway/CMakeLists.txt @@ -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) diff --git a/examples/highway/highway.patch b/examples/highway/highway.patch new file mode 100644 index 00000000..0b9537e8 --- /dev/null +++ b/examples/highway/highway.patch @@ -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 + $ + $) + 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 + $ + $) + 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 diff --git a/examples/highway/main.cpp b/examples/highway/main.cpp new file mode 100644 index 00000000..c1d5a7af --- /dev/null +++ b/examples/highway/main.cpp @@ -0,0 +1,27 @@ +#include // hwy::VQSort() for large data sets + +#include +#include +#include + +// Use hwy::VQSort to sort larger vectors +inline void sort_large(std::vector& 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 uniform_dist(0.0, 100.0); + + const std::size_t sz = 100000; + std::vector 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; +}