diff --git a/rapids-cmake/cpm/detail/generate_patch_command.cmake b/rapids-cmake/cpm/detail/generate_patch_command.cmake index 870660815..68544560f 100644 --- a/rapids-cmake/cpm/detail/generate_patch_command.cmake +++ b/rapids-cmake/cpm/detail/generate_patch_command.cmake @@ -1,6 +1,6 @@ # ============================================================================= # cmake-format: off -# SPDX-FileCopyrightText: Copyright (c) 2022-2025, NVIDIA CORPORATION. +# SPDX-FileCopyrightText: Copyright (c) 2022-2026, NVIDIA CORPORATION. # SPDX-License-Identifier: Apache-2.0 # cmake-format: on # ============================================================================= @@ -19,7 +19,7 @@ Applies any relevant patches to the provided CPM package rapids_cpm_generate_patch_command( patch_command build_patch_only) #]=======================================================================] -# cmake-lint: disable=R0915,E1120 +# cmake-lint: disable=R0912,R0915,E1120 function(rapids_cpm_generate_patch_command package_name version patch_command build_patch_only) list(APPEND CMAKE_MESSAGE_CONTEXT "rapids.cpm.generate_patch_command") @@ -28,16 +28,16 @@ function(rapids_cpm_generate_patch_command package_name version patch_command bu include("${rapids-cmake-dir}/cpm/detail/get_default_json.cmake") include("${rapids-cmake-dir}/cpm/detail/get_override_json.cmake") - get_default_json(${package_name} json_data) - get_override_json(${package_name} override_json_data) + get_default_json(${package_name} full_default_json) + get_override_json(${package_name} full_override_json) string(TOLOWER "${package_name}" normalized_pkg_name) get_property(json_path GLOBAL PROPERTY rapids_cpm_${normalized_pkg_name}_json_file) get_property(override_json_path GLOBAL PROPERTY rapids_cpm_${normalized_pkg_name}_override_json_file) - string(JSON json_data ERROR_VARIABLE no_default_patch GET "${json_data}" patches) - string(JSON override_json_data ERROR_VARIABLE no_override_patch GET "${override_json_data}" + string(JSON json_data ERROR_VARIABLE no_default_patch GET "${full_default_json}" patches) + string(JSON override_json_data ERROR_VARIABLE no_override_patch GET "${full_override_json}" patches) if(no_default_patch AND no_override_patch) return() # no patches @@ -59,11 +59,35 @@ function(rapids_cpm_generate_patch_command package_name version patch_command bu endif() endfunction() - # Need Git to apply the patches - find_package(Git REQUIRED) - if(NOT GIT_EXECUTABLE) - message(WARNING "Unable to apply git patches to ${package_name}, git not found") - return() + # Determine if the package uses git or URL (tarball) mode to select the patch tool. An override + # that specifies git fields switches the package to git mode; an override that specifies url + # fields switches it to url mode. Otherwise fall back to the default JSON. + set(use_git_patch TRUE) + if(full_override_json) + string(JSON _v ERROR_VARIABLE no_url GET "${full_override_json}" url) + string(JSON _v ERROR_VARIABLE no_git_url GET "${full_override_json}" git_url) + if(no_url AND no_git_url) + string(JSON _v ERROR_VARIABLE no_url GET "${full_default_json}" url) + endif() + else() + string(JSON _v ERROR_VARIABLE no_url GET "${full_default_json}" url) + endif() + if(NOT no_url) + set(use_git_patch FALSE) + endif() + + if(use_git_patch) + find_package(Git REQUIRED) + if(NOT GIT_EXECUTABLE) + message(WARNING "Unable to apply git patches to ${package_name}, git not found") + return() + endif() + else() + find_package(Patch REQUIRED) + if(NOT Patch_EXECUTABLE) + message(WARNING "Unable to apply patches to ${package_name}, patch not found") + return() + endif() endif() # For each project cache the subset of the json set(patch_files_to_run) diff --git a/rapids-cmake/cpm/detail/pinning_write_file.cmake b/rapids-cmake/cpm/detail/pinning_write_file.cmake index 5168d6f5b..4aef06ae1 100644 --- a/rapids-cmake/cpm/detail/pinning_write_file.cmake +++ b/rapids-cmake/cpm/detail/pinning_write_file.cmake @@ -272,20 +272,26 @@ function(rapids_cpm_pinning_add_json_entry package_name json_var) get_default_json(${package_name} json_data) get_override_json(${package_name} override_json_data) - # Determine if this package uses URL mode (url + url_hash) or git mode (git_url + git_tag) Check - # override first, then default + # Determine if this package uses URL mode (url + url_hash) or git mode (git_url + git_tag). The + # override can switch modes: if the override provides git fields, use git mode regardless of the + # default. If the override provides url fields, use url mode. Only fall back to the default if the + # override doesn't specify either mode. set(is_url_mode FALSE) - string(JSON url_value ERROR_VARIABLE no_url_override GET "${override_json_data}" url) - string(JSON url_hash_value ERROR_VARIABLE no_url_hash_override GET "${override_json_data}" - url_hash) - if(NOT no_url_override AND NOT no_url_hash_override) - set(is_url_mode TRUE) + if(override_json_data) + string(JSON value ERROR_VARIABLE no_git_url GET "${override_json_data}" git_url) + string(JSON value ERROR_VARIABLE no_git_tag GET "${override_json_data}" git_tag) + string(JSON url_value ERROR_VARIABLE no_url GET "${override_json_data}" url) + string(JSON url_hash_value ERROR_VARIABLE no_url_hash GET "${override_json_data}" url_hash) + if(no_url AND no_url_hash AND no_git_url AND no_git_tag) + string(JSON url_value ERROR_VARIABLE no_url GET "${json_data}" url) + string(JSON url_hash_value ERROR_VARIABLE no_url_hash GET "${json_data}" url_hash) + endif() else() string(JSON url_value ERROR_VARIABLE no_url GET "${json_data}" url) string(JSON url_hash_value ERROR_VARIABLE no_url_hash GET "${json_data}" url_hash) - if(NOT no_url AND NOT no_url_hash) - set(is_url_mode TRUE) - endif() + endif() + if(NOT no_url AND NOT no_url_hash) + set(is_url_mode TRUE) endif() rapids_cpm_pinning_extract_source_subdir(${package} source_subdir) diff --git a/rapids-cmake/cpm/patches/command_template.cmake.in b/rapids-cmake/cpm/patches/command_template.cmake.in index a08f7d3c0..b9ee5a813 100644 --- a/rapids-cmake/cpm/patches/command_template.cmake.in +++ b/rapids-cmake/cpm/patches/command_template.cmake.in @@ -5,6 +5,8 @@ set(msg_state) set(error_state) +set(use_git_patch @use_git_patch@) + function(rapids_cpm_run_git_patch file issue require) set(git_command @GIT_EXECUTABLE@) cmake_path(GET file FILENAME file_name) @@ -67,6 +69,48 @@ function(rapids_cpm_run_git_patch file issue require) set(error_state ${error_state} PARENT_SCOPE) endfunction() +function(rapids_cpm_run_patch file issue require) + set(patch_command @Patch_EXECUTABLE@) + cmake_path(GET file FILENAME file_name) + cmake_path(GET file_name EXTENSION LAST_ONLY ext) + string(SUBSTRING "${ext}" 1 -1 ext) + + if(NOT (ext STREQUAL "diff" OR ext STREQUAL "patch") ) + list(APPEND msg_state "rapids-cmake: Unable to apply ${file} as ${ext} is unsupported. Only .diff and .patch are supported") + set(msg_state ${msg_state} PARENT_SCOPE) + return() + endif() + + set(result 1) + execute_process( + COMMAND ${patch_command} -p1 -i ${file} + RESULT_VARIABLE result + ERROR_VARIABLE repo_error_info + ) + if(NOT result EQUAL 0) + # See if the patch was previously applied + execute_process( + COMMAND ${patch_command} -p1 --reverse --dry-run -i ${file} + RESULT_VARIABLE result + ) + endif() + + # Setup where we log error message too + set(error_msg_var msg_state) + if(require) + set(error_msg_var error_state) + endif() + + if(result EQUAL 0) + list(APPEND msg_state "rapids-cmake [@package_name@]: applied ${ext} ${file_name} to fix issue: '${issue}'\n") + else() + list(APPEND ${error_msg_var} "rapids-cmake [@package_name@]: failed to apply ${ext} ${file_name}\n") + list(APPEND ${error_msg_var} "rapids-cmake [@package_name@]: patch output: ${repo_error_info}\n") + endif() + set(msg_state ${msg_state} PARENT_SCOPE) + set(error_state ${error_state} PARENT_SCOPE) +endfunction() + # We want to ensure that any patched files have a timestamp # that is at least 1 second newer compared to the git checkout # This ensures that all of CMake up-to-date install logic @@ -83,7 +127,11 @@ set(required "@patch_required_to_apply@") set(output_file "@log_file@") set(error_file "@err_file@") foreach(file issue require IN ZIP_LISTS files issues required) - rapids_cpm_run_git_patch(${file} ${issue} ${require}) + if(use_git_patch) + rapids_cpm_run_git_patch(${file} ${issue} ${require}) + else() + rapids_cpm_run_patch(${file} ${issue} ${require}) + endif() endforeach() if(msg_state) file(WRITE "${output_file}" ${msg_state}) diff --git a/testing/cpm/CMakeLists.txt b/testing/cpm/CMakeLists.txt index c7f2577e4..654d375a2 100644 --- a/testing/cpm/CMakeLists.txt +++ b/testing/cpm/CMakeLists.txt @@ -19,10 +19,17 @@ add_cmake_config_test(cpm_find-existing-target) add_cmake_config_test(cpm_find-existing-target-to-export-sets) add_cmake_config_test(cpm_find-gtest-no-gmock) add_cmake_config_test(cpm_find-options-escaped) -add_cmake_config_test(cpm_find-patch-command NO_CPM_CACHE) -add_cmake_config_test(cpm_find-patch-command-embedded NO_CPM_CACHE) -add_cmake_config_test(cpm_find-patch-command-required NO_CPM_CACHE) -add_cmake_config_test(cpm_find-patch-command-required-fails NO_CPM_CACHE SHOULD_FAIL +add_cmake_config_test(cpm_find-patch-command-git NO_CPM_CACHE) +add_cmake_config_test(cpm_find-patch-command-tarball NO_CPM_CACHE) +add_cmake_config_test(cpm_find-patch-command-diff-git NO_CPM_CACHE) +add_cmake_config_test(cpm_find-patch-command-diff-tarball NO_CPM_CACHE) +add_cmake_config_test(cpm_find-patch-command-embedded-git NO_CPM_CACHE) +add_cmake_config_test(cpm_find-patch-command-embedded-tarball NO_CPM_CACHE) +add_cmake_config_test(cpm_find-patch-command-required-git NO_CPM_CACHE) +add_cmake_config_test(cpm_find-patch-command-required-tarball NO_CPM_CACHE) +add_cmake_config_test(cpm_find-patch-command-required-fails-git NO_CPM_CACHE SHOULD_FAIL + "rapids-cmake [GTest]: failed to apply patch") +add_cmake_config_test(cpm_find-patch-command-required-fails-tarball NO_CPM_CACHE SHOULD_FAIL "rapids-cmake [GTest]: failed to apply patch") add_cmake_config_test(cpm_find-restore-cpm-vars) add_cmake_config_test(cpm_find-version-explicit-install.cmake) diff --git a/testing/cpm/cpm_find-patch-command-diff-git/CMakeLists.txt b/testing/cpm/cpm_find-patch-command-diff-git/CMakeLists.txt new file mode 100644 index 000000000..d716db6ef --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-diff-git/CMakeLists.txt @@ -0,0 +1,41 @@ +# ============================================================================= +# cmake-format: off +# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. +# SPDX-License-Identifier: Apache-2.0 +# cmake-format: on +# ============================================================================= +cmake_minimum_required(VERSION 3.30.4) +project(rapids-cpm_find-patch-command-project LANGUAGES CXX) + +include(${rapids-cmake-dir}/cpm/init.cmake) +rapids_cpm_init() + +include(${rapids-cmake-dir}/cpm/package_override.cmake) +rapids_cpm_package_override(${CMAKE_CURRENT_SOURCE_DIR}/override.json) + +include("${rapids-cmake-dir}/cpm/detail/package_details.cmake") +rapids_cpm_package_details_internal(GTest version repository tag src_subdir shallow exclude) + +set(deps_dir "${CMAKE_CURRENT_BINARY_DIR}/_gtest_dep") +if(NOT EXISTS "${deps_dir}") + file(MAKE_DIRECTORY "${deps_dir}") + find_package(Git) + execute_process(COMMAND ${GIT_EXECUTABLE} clone --depth 1 --branch "${tag}" "${repository}" + WORKING_DIRECTORY "${deps_dir}") +endif() + +set(gtest_dir "${deps_dir}/googletest") +list(APPEND CMAKE_PREFIX_PATH "${gtest_dir}") + +include(${rapids-cmake-dir}/cpm/gtest.cmake) +rapids_cpm_gtest() + +if(NOT "${GTest_ADDED}") + message(FATAL_ERROR "The found repo was used rather than downloading and patching a new version") +endif() + +# Verify that the file inserted by the .diff patch exists, proving that git apply (in git mode) +# correctly applied a .diff file. +if(NOT EXISTS "${GTest_SOURCE_DIR}/git_file_1.txt") + message(FATAL_ERROR "failed to apply GTest diff patch") +endif() diff --git a/testing/cpm/cpm_find-patch-command-diff-git/override.json b/testing/cpm/cpm_find-patch-command-diff-git/override.json new file mode 100644 index 000000000..63275b8d5 --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-diff-git/override.json @@ -0,0 +1,15 @@ +{ + "packages": { + "GTest": { + "git_url": "https://github.com/google/googletest.git", + "git_tag": "6910c9d9165801d8827d628cb72eb7ea9dd538c5", + "patches": [ + { + "file": "${current_json_dir}/patches/0001-add-file.diff", + "issue": "Add file via diff", + "fixed_in": "" + } + ] + } + } +} diff --git a/testing/cpm/cpm_find-patch-command-diff-git/patches/0001-add-file.diff b/testing/cpm/cpm_find-patch-command-diff-git/patches/0001-add-file.diff new file mode 100644 index 000000000..818436660 --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-diff-git/patches/0001-add-file.diff @@ -0,0 +1,7 @@ +diff --git a/git_file_1.txt b/git_file_1.txt +new file mode 100644 +index 00000000..b242c360 +--- /dev/null ++++ b/git_file_1.txt +@@ -0,0 +1 @@ ++added file diff --git a/testing/cpm/cpm_find-patch-command-diff-tarball/CMakeLists.txt b/testing/cpm/cpm_find-patch-command-diff-tarball/CMakeLists.txt new file mode 100644 index 000000000..e548ccc03 --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-diff-tarball/CMakeLists.txt @@ -0,0 +1,42 @@ +# ============================================================================= +# cmake-format: off +# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. +# SPDX-License-Identifier: Apache-2.0 +# cmake-format: on +# ============================================================================= +cmake_minimum_required(VERSION 3.30.4) +project(rapids-cpm_find-patch-command-project LANGUAGES CXX) + +include(${rapids-cmake-dir}/cpm/init.cmake) +rapids_cpm_init() + +include(${rapids-cmake-dir}/cpm/package_override.cmake) +rapids_cpm_package_override(${CMAKE_CURRENT_SOURCE_DIR}/override.json) + +include("${rapids-cmake-dir}/cpm/detail/package_details.cmake") +rapids_cpm_package_details_internal(GTest version repository tag src_subdir shallow exclude) + +set(deps_dir "${CMAKE_CURRENT_BINARY_DIR}/_gtest_dep") +if(NOT EXISTS "${deps_dir}") + file(MAKE_DIRECTORY "${deps_dir}") + file(DOWNLOAD "${repository}" "${deps_dir}/gtest.tar.gz") + file(ARCHIVE_EXTRACT INPUT "${deps_dir}/gtest.tar.gz" DESTINATION "${deps_dir}") + file(GLOB extracted_dir "${deps_dir}/googletest-*") + file(RENAME "${extracted_dir}" "${deps_dir}/googletest") +endif() + +set(gtest_dir "${deps_dir}/googletest") +list(APPEND CMAKE_PREFIX_PATH "${gtest_dir}") + +include(${rapids-cmake-dir}/cpm/gtest.cmake) +rapids_cpm_gtest() + +if(NOT "${GTest_ADDED}") + message(FATAL_ERROR "The found repo was used rather than downloading and patching a new version") +endif() + +# Verify that the file inserted by the .diff patch exists, proving that patch -p1 (in tarball mode) +# correctly applied a .diff file. +if(NOT EXISTS "${GTest_SOURCE_DIR}/git_file_1.txt") + message(FATAL_ERROR "failed to apply GTest diff patch") +endif() diff --git a/testing/cpm/cpm_find-patch-command-diff-tarball/override.json b/testing/cpm/cpm_find-patch-command-diff-tarball/override.json new file mode 100644 index 000000000..f36d73329 --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-diff-tarball/override.json @@ -0,0 +1,15 @@ +{ + "packages": { + "GTest": { + "url": "https://github.com/google/googletest/archive/6910c9d9165801d8827d628cb72eb7ea9dd538c5.tar.gz", + "url_hash": "SHA256=bde221be7f3841fcbc3971665d77d717116394a42155d988ee6407dfc39f1f09", + "patches": [ + { + "file": "${current_json_dir}/patches/0001-add-file.diff", + "issue": "Add file via diff", + "fixed_in": "" + } + ] + } + } +} diff --git a/testing/cpm/cpm_find-patch-command-diff-tarball/patches/0001-add-file.diff b/testing/cpm/cpm_find-patch-command-diff-tarball/patches/0001-add-file.diff new file mode 100644 index 000000000..818436660 --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-diff-tarball/patches/0001-add-file.diff @@ -0,0 +1,7 @@ +diff --git a/git_file_1.txt b/git_file_1.txt +new file mode 100644 +index 00000000..b242c360 +--- /dev/null ++++ b/git_file_1.txt +@@ -0,0 +1 @@ ++added file diff --git a/testing/cpm/cpm_find-patch-command-embedded/CMakeLists.txt b/testing/cpm/cpm_find-patch-command-embedded-git/CMakeLists.txt similarity index 96% rename from testing/cpm/cpm_find-patch-command-embedded/CMakeLists.txt rename to testing/cpm/cpm_find-patch-command-embedded-git/CMakeLists.txt index 92801767c..bdbc90fc5 100644 --- a/testing/cpm/cpm_find-patch-command-embedded/CMakeLists.txt +++ b/testing/cpm/cpm_find-patch-command-embedded-git/CMakeLists.txt @@ -1,12 +1,18 @@ # ============================================================================= # cmake-format: off -# SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION. +# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. # SPDX-License-Identifier: Apache-2.0 # cmake-format: on # ============================================================================= cmake_minimum_required(VERSION 3.26.4) project(rapids-cpm_find-patch-command-project LANGUAGES CXX) +include(${rapids-cmake-dir}/cpm/init.cmake) +rapids_cpm_init() + +include(${rapids-cmake-dir}/cpm/package_override.cmake) +rapids_cpm_package_override(${CMAKE_CURRENT_SOURCE_DIR}/override.json) + include("${rapids-cmake-dir}/cpm/detail/package_details.cmake") rapids_cpm_package_details_internal(GTest version repository tag src_subdir shallow exclude) @@ -21,12 +27,6 @@ endif() set(gtest_dir "${deps_dir}/googletest") list(APPEND CMAKE_PREFIX_PATH "${gtest_dir}") -include(${rapids-cmake-dir}/cpm/init.cmake) -rapids_cpm_init() - -include(${rapids-cmake-dir}/cpm/package_override.cmake) -rapids_cpm_package_override(${CMAKE_CURRENT_SOURCE_DIR}/override.json) - include(${rapids-cmake-dir}/cpm/gtest.cmake) rapids_cpm_gtest() diff --git a/testing/cpm/cpm_find-patch-command-embedded/override.json b/testing/cpm/cpm_find-patch-command-embedded-git/override.json similarity index 94% rename from testing/cpm/cpm_find-patch-command-embedded/override.json rename to testing/cpm/cpm_find-patch-command-embedded-git/override.json index ce4b1e6b7..622b67ff4 100644 --- a/testing/cpm/cpm_find-patch-command-embedded/override.json +++ b/testing/cpm/cpm_find-patch-command-embedded-git/override.json @@ -1,6 +1,8 @@ { "packages": { "GTest": { + "git_url": "https://github.com/google/googletest.git", + "git_tag": "6910c9d9165801d8827d628cb72eb7ea9dd538c5", "patches": [ { "inline_patch": { diff --git a/testing/cpm/cpm_find-patch-command-embedded-tarball/CMakeLists.txt b/testing/cpm/cpm_find-patch-command-embedded-tarball/CMakeLists.txt new file mode 100644 index 000000000..38713b918 --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-embedded-tarball/CMakeLists.txt @@ -0,0 +1,46 @@ +# ============================================================================= +# cmake-format: off +# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. +# SPDX-License-Identifier: Apache-2.0 +# cmake-format: on +# ============================================================================= +cmake_minimum_required(VERSION 3.26.4) +project(rapids-cpm_find-patch-command-project LANGUAGES CXX) + +include(${rapids-cmake-dir}/cpm/init.cmake) +rapids_cpm_init() + +include(${rapids-cmake-dir}/cpm/package_override.cmake) +rapids_cpm_package_override(${CMAKE_CURRENT_SOURCE_DIR}/override.json) + +include("${rapids-cmake-dir}/cpm/detail/package_details.cmake") +rapids_cpm_package_details_internal(GTest version repository tag src_subdir shallow exclude) + +set(deps_dir "${CMAKE_CURRENT_BINARY_DIR}/_gtest_dep") +if(NOT EXISTS "${deps_dir}") + file(MAKE_DIRECTORY "${deps_dir}") + file(DOWNLOAD "${repository}" "${deps_dir}/gtest.tar.gz") + file(ARCHIVE_EXTRACT INPUT "${deps_dir}/gtest.tar.gz" DESTINATION "${deps_dir}") + file(GLOB extracted_dir "${deps_dir}/googletest-*") + file(RENAME "${extracted_dir}" "${deps_dir}/googletest") +endif() + +set(gtest_dir "${deps_dir}/googletest") +list(APPEND CMAKE_PREFIX_PATH "${gtest_dir}") + +include(${rapids-cmake-dir}/cpm/gtest.cmake) +rapids_cpm_gtest() + +if(NOT "${GTest_ADDED}") + message(FATAL_ERROR "The found repo was used rather than downloading and patching a new version") +endif() + +# Verify that the two files that we inserted into the gtest source tree exist which proves the +# patches in the override are properly applied +if(NOT EXISTS "${GTest_SOURCE_DIR}/git_file_1.txt") + message(FATAL_ERROR "failed to apply gtest first patch") +endif() + +if(NOT EXISTS "${GTest_SOURCE_DIR}/git_file_2.txt") + message(FATAL_ERROR "failed to apply gtest second patch") +endif() diff --git a/testing/cpm/cpm_find-patch-command-embedded-tarball/override.json b/testing/cpm/cpm_find-patch-command-embedded-tarball/override.json new file mode 100644 index 000000000..b89c1508f --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-embedded-tarball/override.json @@ -0,0 +1,66 @@ +{ + "packages": { + "GTest": { + "url": "https://github.com/google/googletest/archive/6910c9d9165801d8827d628cb72eb7ea9dd538c5.tar.gz", + "url_hash": "SHA256=bde221be7f3841fcbc3971665d77d717116394a42155d988ee6407dfc39f1f09", + "patches": [ + { + "inline_patch": { + "type": "patch", + "content": [ + "From deacd3fafd7fcfee954ae3044ae3ab60d36a9f3a Mon Sep 17 00:00:00 2001", + "From: Robert Maynard ", + "Date: Wed, 31 Jan 2024 15:00:47 -0500", + "Subject: [PATCH 1/2] Move GIT SHA1", + "", + "---", + " git_file_1.txt | 1 +", + " 1 file changed, 1 insertion(+)", + " create mode 100644 git_file_1.txt", + "", + "diff --git a/git_file_1.txt b/git_file_1.txt", + "new file mode 100644", + "index 00000000..b242c360", + "--- /dev/null", + "+++ b/git_file_1.txt", + "@@ -0,0 +1 @@", + "+added file", + "--", + "2.43.0", + "" + ] + }, + "issue": "Move git sha1", + "fixed_in": "" + }, + { + "inline_patch": { + "type": "patch", + "content": [ + "From 3588e151030a30661b310a876f7cc450d6ca9201 Mon Sep 17 00:00:00 2001", + "From: Robert Maynard ", + "Date: Wed, 31 Jan 2024 15:01:21 -0500", + "Subject: [PATCH 2/2] Move GIT SHA1 a second time", + "---", + " git_file_2.txt | 1 +", + " 1 file changed, 1 insertion(+)", + " create mode 100644 git_file_2.txt", + "diff --git a/git_file_2.txt b/git_file_2.txt", + "new file mode 100644", + "index 00000000..fa240558", + "--- /dev/null", + "+++ b/git_file_2.txt", + "@@ -0,0 +1 @@", + "+added another file", + "--", + "2.43.0", + "" + ] + }, + "issue": "Move git sha1 a second time", + "fixed_in": "" + } + ] + } + } +} diff --git a/testing/cpm/cpm_find-patch-command-required/CMakeLists.txt b/testing/cpm/cpm_find-patch-command-git/CMakeLists.txt similarity index 96% rename from testing/cpm/cpm_find-patch-command-required/CMakeLists.txt rename to testing/cpm/cpm_find-patch-command-git/CMakeLists.txt index 7dd86b29b..5ef8a0fcd 100644 --- a/testing/cpm/cpm_find-patch-command-required/CMakeLists.txt +++ b/testing/cpm/cpm_find-patch-command-git/CMakeLists.txt @@ -1,12 +1,18 @@ # ============================================================================= # cmake-format: off -# SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION. +# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. # SPDX-License-Identifier: Apache-2.0 # cmake-format: on # ============================================================================= cmake_minimum_required(VERSION 3.30.4) project(rapids-cpm_find-patch-command-project LANGUAGES CXX) +include(${rapids-cmake-dir}/cpm/init.cmake) +rapids_cpm_init() + +include(${rapids-cmake-dir}/cpm/package_override.cmake) +rapids_cpm_package_override(${CMAKE_CURRENT_SOURCE_DIR}/override.json) + include("${rapids-cmake-dir}/cpm/detail/package_details.cmake") rapids_cpm_package_details_internal(GTest version repository tag src_subdir shallow exclude) @@ -21,12 +27,6 @@ endif() set(gtest_dir "${deps_dir}/googletest") list(APPEND CMAKE_PREFIX_PATH "${gtest_dir}") -include(${rapids-cmake-dir}/cpm/init.cmake) -rapids_cpm_init() - -include(${rapids-cmake-dir}/cpm/package_override.cmake) -rapids_cpm_package_override(${CMAKE_CURRENT_SOURCE_DIR}/override.json) - include(${rapids-cmake-dir}/cpm/gtest.cmake) rapids_cpm_gtest() diff --git a/testing/cpm/cpm_find-patch-command/override.json b/testing/cpm/cpm_find-patch-command-git/override.json similarity index 77% rename from testing/cpm/cpm_find-patch-command/override.json rename to testing/cpm/cpm_find-patch-command-git/override.json index 4c2665e57..422c0fb05 100644 --- a/testing/cpm/cpm_find-patch-command/override.json +++ b/testing/cpm/cpm_find-patch-command-git/override.json @@ -1,6 +1,8 @@ { "packages": { "GTest": { + "git_url": "https://github.com/google/googletest.git", + "git_tag": "6910c9d9165801d8827d628cb72eb7ea9dd538c5", "patches": [ { "file": "${current_json_dir}/patches/0001-move-git-sha1.patch", diff --git a/testing/cpm/cpm_find-patch-command-required-fails/patches/0001-move-git-sha1.patch b/testing/cpm/cpm_find-patch-command-git/patches/0001-move-git-sha1.patch similarity index 100% rename from testing/cpm/cpm_find-patch-command-required-fails/patches/0001-move-git-sha1.patch rename to testing/cpm/cpm_find-patch-command-git/patches/0001-move-git-sha1.patch diff --git a/testing/cpm/cpm_find-patch-command-required/patches/0002-move-git-sha1-a-second-time.patch b/testing/cpm/cpm_find-patch-command-git/patches/0002-move-git-sha1-a-second-time.patch similarity index 100% rename from testing/cpm/cpm_find-patch-command-required/patches/0002-move-git-sha1-a-second-time.patch rename to testing/cpm/cpm_find-patch-command-git/patches/0002-move-git-sha1-a-second-time.patch diff --git a/testing/cpm/cpm_find-patch-command-required-fails/CMakeLists.txt b/testing/cpm/cpm_find-patch-command-required-fails-git/CMakeLists.txt similarity index 95% rename from testing/cpm/cpm_find-patch-command-required-fails/CMakeLists.txt rename to testing/cpm/cpm_find-patch-command-required-fails-git/CMakeLists.txt index 10234d19b..e685d699a 100644 --- a/testing/cpm/cpm_find-patch-command-required-fails/CMakeLists.txt +++ b/testing/cpm/cpm_find-patch-command-required-fails-git/CMakeLists.txt @@ -1,12 +1,18 @@ # ============================================================================= # cmake-format: off -# SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION. +# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. # SPDX-License-Identifier: Apache-2.0 # cmake-format: on # ============================================================================= cmake_minimum_required(VERSION 3.30.4) project(rapids-cpm_find-patch-command-project LANGUAGES CXX) +include(${rapids-cmake-dir}/cpm/init.cmake) +rapids_cpm_init() + +include(${rapids-cmake-dir}/cpm/package_override.cmake) +rapids_cpm_package_override(${CMAKE_CURRENT_SOURCE_DIR}/override.json) + include("${rapids-cmake-dir}/cpm/detail/package_details.cmake") rapids_cpm_package_details_internal(GTest version repository tag src_subdir shallow exclude) @@ -21,12 +27,6 @@ endif() set(gtest_dir "${deps_dir}/googletest") list(APPEND CMAKE_PREFIX_PATH "${gtest_dir}") -include(${rapids-cmake-dir}/cpm/init.cmake) -rapids_cpm_init() - -include(${rapids-cmake-dir}/cpm/package_override.cmake) -rapids_cpm_package_override(${CMAKE_CURRENT_SOURCE_DIR}/override.json) - include(${rapids-cmake-dir}/cpm/gtest.cmake) rapids_cpm_gtest() diff --git a/testing/cpm/cpm_find-patch-command-required-fails/override.json b/testing/cpm/cpm_find-patch-command-required-fails-git/override.json similarity index 78% rename from testing/cpm/cpm_find-patch-command-required-fails/override.json rename to testing/cpm/cpm_find-patch-command-required-fails-git/override.json index a03ac8cec..d53d66274 100644 --- a/testing/cpm/cpm_find-patch-command-required-fails/override.json +++ b/testing/cpm/cpm_find-patch-command-required-fails-git/override.json @@ -1,6 +1,8 @@ { "packages": { "GTest": { + "git_url": "https://github.com/google/googletest.git", + "git_tag": "6910c9d9165801d8827d628cb72eb7ea9dd538c5", "patches": [ { "file": "${current_json_dir}/patches/0001-move-git-sha1.patch", diff --git a/testing/cpm/cpm_find-patch-command-required/patches/0001-move-git-sha1.patch b/testing/cpm/cpm_find-patch-command-required-fails-git/patches/0001-move-git-sha1.patch similarity index 100% rename from testing/cpm/cpm_find-patch-command-required/patches/0001-move-git-sha1.patch rename to testing/cpm/cpm_find-patch-command-required-fails-git/patches/0001-move-git-sha1.patch diff --git a/testing/cpm/cpm_find-patch-command-required-fails/patches/0002-bad-git-change.patch b/testing/cpm/cpm_find-patch-command-required-fails-git/patches/0002-bad-git-change.patch similarity index 100% rename from testing/cpm/cpm_find-patch-command-required-fails/patches/0002-bad-git-change.patch rename to testing/cpm/cpm_find-patch-command-required-fails-git/patches/0002-bad-git-change.patch diff --git a/testing/cpm/cpm_find-patch-command-required-fails-tarball/CMakeLists.txt b/testing/cpm/cpm_find-patch-command-required-fails-tarball/CMakeLists.txt new file mode 100644 index 000000000..fa9c18a57 --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-required-fails-tarball/CMakeLists.txt @@ -0,0 +1,36 @@ +# ============================================================================= +# cmake-format: off +# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. +# SPDX-License-Identifier: Apache-2.0 +# cmake-format: on +# ============================================================================= +cmake_minimum_required(VERSION 3.30.4) +project(rapids-cpm_find-patch-command-project LANGUAGES CXX) + +include(${rapids-cmake-dir}/cpm/init.cmake) +rapids_cpm_init() + +include(${rapids-cmake-dir}/cpm/package_override.cmake) +rapids_cpm_package_override(${CMAKE_CURRENT_SOURCE_DIR}/override.json) + +include("${rapids-cmake-dir}/cpm/detail/package_details.cmake") +rapids_cpm_package_details_internal(GTest version repository tag src_subdir shallow exclude) + +set(deps_dir "${CMAKE_CURRENT_BINARY_DIR}/_gtest_dep") +if(NOT EXISTS "${deps_dir}") + file(MAKE_DIRECTORY "${deps_dir}") + file(DOWNLOAD "${repository}" "${deps_dir}/gtest.tar.gz") + file(ARCHIVE_EXTRACT INPUT "${deps_dir}/gtest.tar.gz" DESTINATION "${deps_dir}") + file(GLOB extracted_dir "${deps_dir}/googletest-*") + file(RENAME "${extracted_dir}" "${deps_dir}/googletest") +endif() + +set(gtest_dir "${deps_dir}/googletest") +list(APPEND CMAKE_PREFIX_PATH "${gtest_dir}") + +include(${rapids-cmake-dir}/cpm/gtest.cmake) +rapids_cpm_gtest() + +if(NOT "${GTest_ADDED}") + message(FATAL_ERROR "The found repo was used rather than downloading and patching a new version") +endif() diff --git a/testing/cpm/cpm_find-patch-command-required-fails-tarball/override.json b/testing/cpm/cpm_find-patch-command-required-fails-tarball/override.json new file mode 100644 index 000000000..605ca0ace --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-required-fails-tarball/override.json @@ -0,0 +1,22 @@ +{ + "packages": { + "GTest": { + "url": "https://github.com/google/googletest/archive/6910c9d9165801d8827d628cb72eb7ea9dd538c5.tar.gz", + "url_hash": "SHA256=bde221be7f3841fcbc3971665d77d717116394a42155d988ee6407dfc39f1f09", + "patches": [ + { + "file": "${current_json_dir}/patches/0001-move-git-sha1.patch", + "issue": "Move git sha1", + "fixed_in": "", + "required": false + }, + { + "file": "${current_json_dir}/patches/0002-bad-git-change.patch", + "issue": "Fail to apply git patch", + "fixed_in": "", + "required": true + } + ] + } + } +} diff --git a/testing/cpm/cpm_find-patch-command/patches/0001-move-git-sha1.patch b/testing/cpm/cpm_find-patch-command-required-fails-tarball/patches/0001-move-git-sha1.patch similarity index 100% rename from testing/cpm/cpm_find-patch-command/patches/0001-move-git-sha1.patch rename to testing/cpm/cpm_find-patch-command-required-fails-tarball/patches/0001-move-git-sha1.patch diff --git a/testing/cpm/cpm_find-patch-command-required-fails-tarball/patches/0002-bad-git-change.patch b/testing/cpm/cpm_find-patch-command-required-fails-tarball/patches/0002-bad-git-change.patch new file mode 100644 index 000000000..368639e6e --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-required-fails-tarball/patches/0002-bad-git-change.patch @@ -0,0 +1,264 @@ +From f20491d3366808e5c62dcee2160fc8a9d5e50fa7 Mon Sep 17 00:00:00 2001 +From: Fake +Date: Mon, 30 Sep 2024 12:14:32 -0400 +Subject: [PATCH 1/2] Apply backport that fails + +--- + cpp/src/io/json/nested_json_gpu.cu | 8 +- + cpp/tests/io/json/json_test.cpp | 24 ++++ + cpp/tests/io/json/nested_json_test.cpp | 178 +++++++++++++++++++++++++ + 3 files changed, 207 insertions(+), 3 deletions(-) + +diff --git a/cpp/src/io/json/nested_json_gpu.cu b/cpp/src/io/json/nested_json_gpu.cu +index 1c15e147b1..76816071d8 100644 +--- a/cpp/src/io/json/nested_json_gpu.cu ++++ b/cpp/src/io/json/nested_json_gpu.cu +@@ -618,12 +618,14 @@ struct PdaSymbolToSymbolGroupId { + constexpr auto pda_sgid_lookup_size = + static_cast(sizeof(tos_sg_to_pda_sgid) / sizeof(tos_sg_to_pda_sgid[0])); + // We map the delimiter character to LINE_BREAK symbol group id, and the newline character +- // to OTHER. Note that delimiter cannot be any of opening(closing) brace, bracket, quote, ++ // to WHITE_SPACE. Note that delimiter cannot be any of opening(closing) brace, bracket, quote, + // escape, comma, colon or whitespace characters. ++ auto constexpr newline = '\n'; ++ auto constexpr whitespace = ' '; + auto const symbol_position = + symbol == delimiter +- ? static_cast('\n') +- : (symbol == '\n' ? static_cast(delimiter) : static_cast(symbol)); ++ ? static_cast(newline) ++ : (symbol == newline ? static_cast(whitespace) : static_cast(symbol)); + PdaSymbolGroupIdT symbol_gid = + tos_sg_to_pda_sgid[min(symbol_position, pda_sgid_lookup_size - 1)]; + return stack_idx * static_cast(symbol_group_id::NUM_PDA_INPUT_SGS) + +diff --git a/cpp/tests/io/json/json_test.cpp b/cpp/tests/io/json/json_test.cpp +index 68ec255b39..a094ac7d77 100644 +--- a/cpp/tests/io/json/json_test.cpp ++++ b/cpp/tests/io/json/json_test.cpp +@@ -2575,6 +2575,30 @@ TEST_F(JsonReaderTest, ViableDelimiter) + EXPECT_THROW(json_parser_options.set_delimiter('\t'), std::invalid_argument); + } + ++TEST_F(JsonReaderTest, ViableDelimiterNewlineWS) ++{ ++ // Test input ++ std::string input = R"({"a": ++ 100})"; ++ ++ cudf::io::json_reader_options json_parser_options = ++ cudf::io::json_reader_options::builder(cudf::io::source_info{input.c_str(), input.size()}) ++ .lines(true) ++ .delimiter('\0'); ++ ++ auto result = cudf::io::read_json(json_parser_options); ++ EXPECT_EQ(result.tbl->num_columns(), 1); ++ EXPECT_EQ(result.tbl->num_rows(), 1); ++ ++ EXPECT_EQ(result.tbl->get_column(0).type().id(), cudf::type_id::INT64); ++ ++ EXPECT_EQ(result.metadata.schema_info[0].name, "a"); ++ ++ auto col1_iterator = thrust::constant_iterator(100); ++ CUDF_TEST_EXPECT_COLUMNS_EQUAL(result.tbl->get_column(0), ++ int64_wrapper(col1_iterator, col1_iterator + 1)); ++} ++ + // Test case for dtype prune: + // all paths, only one. + // one present, another not present, nothing present +diff --git a/cpp/tests/io/json/nested_json_test.cpp b/cpp/tests/io/json/nested_json_test.cpp +index 327169ae56..f32aba0e63 100644 +--- a/cpp/tests/io/json/nested_json_test.cpp ++++ b/cpp/tests/io/json/nested_json_test.cpp +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -1196,4 +1197,181 @@ TEST_P(JsonDelimiterParamTest, RecoveringTokenStreamNewlineAndDelimiter) + } + } + ++TEST_P(JsonDelimiterParamTest, RecoveringTokenStreamNewlineAsWSAndDelimiter) ++{ ++ // Test input. Inline comments used to indicate character indexes ++ // 012345678 <= line 0 ++ char const delimiter = GetParam(); ++ ++ /* Input: (Note that \n is considered whitespace according to the JSON spec when it is not used as ++ * a delimiter for JSONL) ++ * {"a":2} ++ * {"a":{"a":{"a":[321{"a":[1]} ++ * ++ * {"b":123} ++ * {"b":123} ++ * {"b"\n:\n\n\n123\n} ++ */ ++ std::string input = R"({"a":2})" ++ "\n"; ++ // starting position 8 (zero indexed) ++ input += R"({"a":)" + std::string(1, delimiter); ++ // starting position 14 (zero indexed) ++ input += R"({"a":{"a":[321)" + std::string(1, delimiter); ++ // starting position 29 (zero indexed) ++ input += R"({"a":[1]})" + std::string("\n\n") + std::string(1, delimiter); ++ // starting position 41 (zero indexed) ++ input += R"({"b":123})" ++ "\n"; ++ // starting position 51 (zero indexed) ++ input += R"({"b":123})" + std::string(1, delimiter); ++ // starting position 61 (zero indexed) ++ input += R"({"b")" + std::string("\n:\n\n\n123\n}"); ++ ++ // Golden token stream sample ++ using token_t = cuio_json::token_t; ++ std::vector> golden_token_stream; ++ if (delimiter != '\n') { ++ golden_token_stream = {// Line 0 (valid) ++ {0, token_t::StructBegin}, ++ {1, token_t::StructMemberBegin}, ++ {1, token_t::FieldNameBegin}, ++ {3, token_t::FieldNameEnd}, ++ {5, token_t::ValueBegin}, ++ {6, token_t::ValueEnd}, ++ {6, token_t::StructMemberEnd}, ++ {6, token_t::StructEnd}, ++ // Line 1 (invalid) ++ {0, token_t::StructBegin}, ++ {0, token_t::StructEnd}, ++ // Line 2 (valid) ++ {29, token_t::StructBegin}, ++ {30, token_t::StructMemberBegin}, ++ {30, token_t::FieldNameBegin}, ++ {32, token_t::FieldNameEnd}, ++ {34, token_t::ListBegin}, ++ {35, token_t::ValueBegin}, ++ {36, token_t::ValueEnd}, ++ {36, token_t::ListEnd}, ++ {37, token_t::StructMemberEnd}, ++ {37, token_t::StructEnd}, ++ // Line 3 (valid) ++ {41, token_t::StructBegin}, ++ {42, token_t::StructMemberBegin}, ++ {42, token_t::FieldNameBegin}, ++ {44, token_t::FieldNameEnd}, ++ {46, token_t::ValueBegin}, ++ {49, token_t::ValueEnd}, ++ {49, token_t::StructMemberEnd}, ++ {49, token_t::StructEnd}, ++ // Line 4 (valid) ++ {61, token_t::StructBegin}, ++ {62, token_t::StructMemberBegin}, ++ {62, token_t::FieldNameBegin}, ++ {64, token_t::FieldNameEnd}, ++ {70, token_t::ValueBegin}, ++ {73, token_t::ValueEnd}, ++ {74, token_t::StructMemberEnd}, ++ {74, token_t::StructEnd}}; ++ } else { ++ /* Input: ++ * {"a":2} ++ * {"a": ++ * {"a":{"a":[321 ++ * {"a":[1]} ++ * ++ * ++ * {"b":123} ++ * {"b":123} ++ * {"b"\n:\n\n\n123\n} ++ */ ++ golden_token_stream = {// Line 0 (valid) ++ {0, token_t::StructBegin}, ++ {1, token_t::StructMemberBegin}, ++ {1, token_t::FieldNameBegin}, ++ {3, token_t::FieldNameEnd}, ++ {5, token_t::ValueBegin}, ++ {6, token_t::ValueEnd}, ++ {6, token_t::StructMemberEnd}, ++ {6, token_t::StructEnd}, ++ // Line 1 (invalid) ++ {0, token_t::StructBegin}, ++ {0, token_t::StructEnd}, ++ // Line 2 (invalid) ++ {0, token_t::StructBegin}, ++ {0, token_t::StructEnd}, ++ // Line 3 (valid) ++ {29, token_t::StructBegin}, ++ {30, token_t::StructMemberBegin}, ++ {30, token_t::FieldNameBegin}, ++ {32, token_t::FieldNameEnd}, ++ {34, token_t::ListBegin}, ++ {35, token_t::ValueBegin}, ++ {36, token_t::ValueEnd}, ++ {36, token_t::ListEnd}, ++ {37, token_t::StructMemberEnd}, ++ {37, token_t::StructEnd}, ++ // Line 4 (valid) ++ {41, token_t::StructBegin}, ++ {42, token_t::StructMemberBegin}, ++ {42, token_t::FieldNameBegin}, ++ {44, token_t::FieldNameEnd}, ++ {46, token_t::ValueBegin}, ++ {49, token_t::ValueEnd}, ++ {49, token_t::StructMemberEnd}, ++ {49, token_t::StructEnd}, ++ // Line 5 (valid) ++ {51, token_t::StructBegin}, ++ {52, token_t::StructMemberBegin}, ++ {52, token_t::FieldNameBegin}, ++ {54, token_t::FieldNameEnd}, ++ {56, token_t::ValueBegin}, ++ {59, token_t::ValueEnd}, ++ {59, token_t::StructMemberEnd}, ++ {59, token_t::StructEnd}, ++ // Line 6 (invalid) ++ {0, token_t::StructBegin}, ++ {0, token_t::StructEnd}, ++ {0, token_t::StructBegin}, ++ {0, token_t::StructEnd}, ++ {0, token_t::StructBegin}, ++ {0, token_t::StructEnd}, ++ {0, token_t::StructBegin}, ++ {0, token_t::StructEnd}}; ++ } ++ ++ auto const stream = cudf::get_default_stream(); ++ ++ // Prepare input & output buffers ++ cudf::string_scalar const d_scalar(input, true, stream); ++ auto const d_input = cudf::device_span{ ++ d_scalar.data(), static_cast(d_scalar.size())}; ++ ++ // Default parsing options ++ cudf::io::json_reader_options const in_opts = ++ cudf::io::json_reader_options::builder(cudf::io::source_info{}) ++ .recovery_mode(cudf::io::json_recovery_mode_t::RECOVER_WITH_NULL) ++ .delimiter(delimiter) ++ .lines(true); ++ ++ // Parse the JSON and get the token stream ++ auto [d_tokens_gpu, d_token_indices_gpu] = cuio_json::detail::get_token_stream( ++ d_input, in_opts, stream, cudf::get_current_device_resource_ref()); ++ // Copy back the number of tokens that were written ++ auto const tokens_gpu = cudf::detail::make_std_vector_async(d_tokens_gpu, stream); ++ auto const token_indices_gpu = cudf::detail::make_std_vector_async(d_token_indices_gpu, stream); ++ ++ stream.synchronize(); ++ // Verify the number of tokens matches ++ ASSERT_EQ(golden_token_stream.size(), tokens_gpu.size()); ++ ASSERT_EQ(golden_token_stream.size(), token_indices_gpu.size()); ++ ++ for (std::size_t i = 0; i < tokens_gpu.size(); i++) { ++ // Ensure the index the tokens are pointing to do match ++ EXPECT_EQ(golden_token_stream[i].first, token_indices_gpu[i]) << "Mismatch at #" << i; ++ // Ensure the token category is correct ++ EXPECT_EQ(golden_token_stream[i].second, tokens_gpu[i]) << "Mismatch at #" << i; ++ } ++} ++ + CUDF_TEST_PROGRAM_MAIN() +-- +2.46.2 diff --git a/testing/cpm/cpm_find-patch-command/CMakeLists.txt b/testing/cpm/cpm_find-patch-command-required-git/CMakeLists.txt similarity index 96% rename from testing/cpm/cpm_find-patch-command/CMakeLists.txt rename to testing/cpm/cpm_find-patch-command-required-git/CMakeLists.txt index 7dd86b29b..5ef8a0fcd 100644 --- a/testing/cpm/cpm_find-patch-command/CMakeLists.txt +++ b/testing/cpm/cpm_find-patch-command-required-git/CMakeLists.txt @@ -1,12 +1,18 @@ # ============================================================================= # cmake-format: off -# SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION. +# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. # SPDX-License-Identifier: Apache-2.0 # cmake-format: on # ============================================================================= cmake_minimum_required(VERSION 3.30.4) project(rapids-cpm_find-patch-command-project LANGUAGES CXX) +include(${rapids-cmake-dir}/cpm/init.cmake) +rapids_cpm_init() + +include(${rapids-cmake-dir}/cpm/package_override.cmake) +rapids_cpm_package_override(${CMAKE_CURRENT_SOURCE_DIR}/override.json) + include("${rapids-cmake-dir}/cpm/detail/package_details.cmake") rapids_cpm_package_details_internal(GTest version repository tag src_subdir shallow exclude) @@ -21,12 +27,6 @@ endif() set(gtest_dir "${deps_dir}/googletest") list(APPEND CMAKE_PREFIX_PATH "${gtest_dir}") -include(${rapids-cmake-dir}/cpm/init.cmake) -rapids_cpm_init() - -include(${rapids-cmake-dir}/cpm/package_override.cmake) -rapids_cpm_package_override(${CMAKE_CURRENT_SOURCE_DIR}/override.json) - include(${rapids-cmake-dir}/cpm/gtest.cmake) rapids_cpm_gtest() diff --git a/testing/cpm/cpm_find-patch-command-required/override.json b/testing/cpm/cpm_find-patch-command-required-git/override.json similarity index 79% rename from testing/cpm/cpm_find-patch-command-required/override.json rename to testing/cpm/cpm_find-patch-command-required-git/override.json index 020c94bb5..d9c0b11e1 100644 --- a/testing/cpm/cpm_find-patch-command-required/override.json +++ b/testing/cpm/cpm_find-patch-command-required-git/override.json @@ -1,6 +1,8 @@ { "packages": { "GTest": { + "git_url": "https://github.com/google/googletest.git", + "git_tag": "6910c9d9165801d8827d628cb72eb7ea9dd538c5", "patches": [ { "file": "${current_json_dir}/patches/0001-move-git-sha1.patch", diff --git a/testing/cpm/cpm_find-patch-command-required-git/patches/0001-move-git-sha1.patch b/testing/cpm/cpm_find-patch-command-required-git/patches/0001-move-git-sha1.patch new file mode 100644 index 000000000..c721f9370 --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-required-git/patches/0001-move-git-sha1.patch @@ -0,0 +1,19 @@ +From deacd3fafd7fcfee954ae3044ae3ab60d36a9f3a Mon Sep 17 00:00:00 2001 +From: Robert Maynard +Date: Wed, 31 Jan 2024 15:00:47 -0500 +Subject: [PATCH 1/2] Move GIT SHA1 + +--- + git_file_1.txt | 1 + + 1 file changed, 1 insertion(+) + create mode 100644 git_file_1.txt + +diff --git a/git_file_1.txt b/git_file_1.txt +new file mode 100644 +index 00000000..b242c360 +--- /dev/null ++++ b/git_file_1.txt +@@ -0,0 +1 @@ ++added file +-- +2.43.0 diff --git a/testing/cpm/cpm_find-patch-command/patches/0002-move-git-sha1-a-second-time.patch b/testing/cpm/cpm_find-patch-command-required-git/patches/0002-move-git-sha1-a-second-time.patch similarity index 100% rename from testing/cpm/cpm_find-patch-command/patches/0002-move-git-sha1-a-second-time.patch rename to testing/cpm/cpm_find-patch-command-required-git/patches/0002-move-git-sha1-a-second-time.patch diff --git a/testing/cpm/cpm_find-patch-command-required-tarball/CMakeLists.txt b/testing/cpm/cpm_find-patch-command-required-tarball/CMakeLists.txt new file mode 100644 index 000000000..64f3acb0c --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-required-tarball/CMakeLists.txt @@ -0,0 +1,46 @@ +# ============================================================================= +# cmake-format: off +# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. +# SPDX-License-Identifier: Apache-2.0 +# cmake-format: on +# ============================================================================= +cmake_minimum_required(VERSION 3.30.4) +project(rapids-cpm_find-patch-command-project LANGUAGES CXX) + +include(${rapids-cmake-dir}/cpm/init.cmake) +rapids_cpm_init() + +include(${rapids-cmake-dir}/cpm/package_override.cmake) +rapids_cpm_package_override(${CMAKE_CURRENT_SOURCE_DIR}/override.json) + +include("${rapids-cmake-dir}/cpm/detail/package_details.cmake") +rapids_cpm_package_details_internal(GTest version repository tag src_subdir shallow exclude) + +set(deps_dir "${CMAKE_CURRENT_BINARY_DIR}/_gtest_dep") +if(NOT EXISTS "${deps_dir}") + file(MAKE_DIRECTORY "${deps_dir}") + file(DOWNLOAD "${repository}" "${deps_dir}/gtest.tar.gz") + file(ARCHIVE_EXTRACT INPUT "${deps_dir}/gtest.tar.gz" DESTINATION "${deps_dir}") + file(GLOB extracted_dir "${deps_dir}/googletest-*") + file(RENAME "${extracted_dir}" "${deps_dir}/googletest") +endif() + +set(gtest_dir "${deps_dir}/googletest") +list(APPEND CMAKE_PREFIX_PATH "${gtest_dir}") + +include(${rapids-cmake-dir}/cpm/gtest.cmake) +rapids_cpm_gtest() + +if(NOT "${GTest_ADDED}") + message(FATAL_ERROR "The found repo was used rather than downloading and patching a new version") +endif() + +# Verify that the two files that we inserted into the GTest source tree exist which proves the +# patches in the override are properly applied +if(NOT EXISTS "${GTest_SOURCE_DIR}/git_file_1.txt") + message(FATAL_ERROR "failed to apply GTest first patch") +endif() + +if(NOT EXISTS "${GTest_SOURCE_DIR}/git_file_2.txt") + message(FATAL_ERROR "failed to apply GTest second patch") +endif() diff --git a/testing/cpm/cpm_find-patch-command-required-tarball/override.json b/testing/cpm/cpm_find-patch-command-required-tarball/override.json new file mode 100644 index 000000000..998ef4362 --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-required-tarball/override.json @@ -0,0 +1,22 @@ +{ + "packages": { + "GTest": { + "url": "https://github.com/google/googletest/archive/6910c9d9165801d8827d628cb72eb7ea9dd538c5.tar.gz", + "url_hash": "SHA256=bde221be7f3841fcbc3971665d77d717116394a42155d988ee6407dfc39f1f09", + "patches": [ + { + "file": "${current_json_dir}/patches/0001-move-git-sha1.patch", + "issue": "Move git sha1", + "fixed_in": "", + "required": true + }, + { + "file": "${current_json_dir}/patches/0002-move-git-sha1-a-second-time.patch", + "issue": "Move git sha1 a second time", + "fixed_in": "", + "required": true + } + ] + } + } +} diff --git a/testing/cpm/cpm_find-patch-command-required-tarball/patches/0001-move-git-sha1.patch b/testing/cpm/cpm_find-patch-command-required-tarball/patches/0001-move-git-sha1.patch new file mode 100644 index 000000000..c721f9370 --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-required-tarball/patches/0001-move-git-sha1.patch @@ -0,0 +1,19 @@ +From deacd3fafd7fcfee954ae3044ae3ab60d36a9f3a Mon Sep 17 00:00:00 2001 +From: Robert Maynard +Date: Wed, 31 Jan 2024 15:00:47 -0500 +Subject: [PATCH 1/2] Move GIT SHA1 + +--- + git_file_1.txt | 1 + + 1 file changed, 1 insertion(+) + create mode 100644 git_file_1.txt + +diff --git a/git_file_1.txt b/git_file_1.txt +new file mode 100644 +index 00000000..b242c360 +--- /dev/null ++++ b/git_file_1.txt +@@ -0,0 +1 @@ ++added file +-- +2.43.0 diff --git a/testing/cpm/cpm_find-patch-command-required-tarball/patches/0002-move-git-sha1-a-second-time.patch b/testing/cpm/cpm_find-patch-command-required-tarball/patches/0002-move-git-sha1-a-second-time.patch new file mode 100644 index 000000000..1986f6d51 --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-required-tarball/patches/0002-move-git-sha1-a-second-time.patch @@ -0,0 +1,19 @@ +From 3588e151030a30661b310a876f7cc450d6ca9201 Mon Sep 17 00:00:00 2001 +From: Robert Maynard +Date: Wed, 31 Jan 2024 15:01:21 -0500 +Subject: [PATCH 2/2] Move GIT SHA1 a second time + +--- + git_file_2.txt | 1 + + 1 file changed, 1 insertion(+) + create mode 100644 git_file_2.txt + +diff --git a/git_file_2.txt b/git_file_2.txt +new file mode 100644 +index 00000000..fa240558 +--- /dev/null ++++ b/git_file_2.txt +@@ -0,0 +1 @@ ++added another file +-- +2.43.0 diff --git a/testing/cpm/cpm_find-patch-command-tarball/CMakeLists.txt b/testing/cpm/cpm_find-patch-command-tarball/CMakeLists.txt new file mode 100644 index 000000000..64f3acb0c --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-tarball/CMakeLists.txt @@ -0,0 +1,46 @@ +# ============================================================================= +# cmake-format: off +# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. +# SPDX-License-Identifier: Apache-2.0 +# cmake-format: on +# ============================================================================= +cmake_minimum_required(VERSION 3.30.4) +project(rapids-cpm_find-patch-command-project LANGUAGES CXX) + +include(${rapids-cmake-dir}/cpm/init.cmake) +rapids_cpm_init() + +include(${rapids-cmake-dir}/cpm/package_override.cmake) +rapids_cpm_package_override(${CMAKE_CURRENT_SOURCE_DIR}/override.json) + +include("${rapids-cmake-dir}/cpm/detail/package_details.cmake") +rapids_cpm_package_details_internal(GTest version repository tag src_subdir shallow exclude) + +set(deps_dir "${CMAKE_CURRENT_BINARY_DIR}/_gtest_dep") +if(NOT EXISTS "${deps_dir}") + file(MAKE_DIRECTORY "${deps_dir}") + file(DOWNLOAD "${repository}" "${deps_dir}/gtest.tar.gz") + file(ARCHIVE_EXTRACT INPUT "${deps_dir}/gtest.tar.gz" DESTINATION "${deps_dir}") + file(GLOB extracted_dir "${deps_dir}/googletest-*") + file(RENAME "${extracted_dir}" "${deps_dir}/googletest") +endif() + +set(gtest_dir "${deps_dir}/googletest") +list(APPEND CMAKE_PREFIX_PATH "${gtest_dir}") + +include(${rapids-cmake-dir}/cpm/gtest.cmake) +rapids_cpm_gtest() + +if(NOT "${GTest_ADDED}") + message(FATAL_ERROR "The found repo was used rather than downloading and patching a new version") +endif() + +# Verify that the two files that we inserted into the GTest source tree exist which proves the +# patches in the override are properly applied +if(NOT EXISTS "${GTest_SOURCE_DIR}/git_file_1.txt") + message(FATAL_ERROR "failed to apply GTest first patch") +endif() + +if(NOT EXISTS "${GTest_SOURCE_DIR}/git_file_2.txt") + message(FATAL_ERROR "failed to apply GTest second patch") +endif() diff --git a/testing/cpm/cpm_find-patch-command-tarball/override.json b/testing/cpm/cpm_find-patch-command-tarball/override.json new file mode 100644 index 000000000..f9eb365e3 --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-tarball/override.json @@ -0,0 +1,20 @@ +{ + "packages": { + "GTest": { + "url": "https://github.com/google/googletest/archive/6910c9d9165801d8827d628cb72eb7ea9dd538c5.tar.gz", + "url_hash": "SHA256=bde221be7f3841fcbc3971665d77d717116394a42155d988ee6407dfc39f1f09", + "patches": [ + { + "file": "${current_json_dir}/patches/0001-move-git-sha1.patch", + "issue": "Move git sha1", + "fixed_in": "" + }, + { + "file": "${current_json_dir}/patches/0002-move-git-sha1-a-second-time.patch", + "issue": "Move git sha1 a second time", + "fixed_in": "" + } + ] + } + } +} diff --git a/testing/cpm/cpm_find-patch-command-tarball/patches/0001-move-git-sha1.patch b/testing/cpm/cpm_find-patch-command-tarball/patches/0001-move-git-sha1.patch new file mode 100644 index 000000000..c721f9370 --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-tarball/patches/0001-move-git-sha1.patch @@ -0,0 +1,19 @@ +From deacd3fafd7fcfee954ae3044ae3ab60d36a9f3a Mon Sep 17 00:00:00 2001 +From: Robert Maynard +Date: Wed, 31 Jan 2024 15:00:47 -0500 +Subject: [PATCH 1/2] Move GIT SHA1 + +--- + git_file_1.txt | 1 + + 1 file changed, 1 insertion(+) + create mode 100644 git_file_1.txt + +diff --git a/git_file_1.txt b/git_file_1.txt +new file mode 100644 +index 00000000..b242c360 +--- /dev/null ++++ b/git_file_1.txt +@@ -0,0 +1 @@ ++added file +-- +2.43.0 diff --git a/testing/cpm/cpm_find-patch-command-tarball/patches/0002-move-git-sha1-a-second-time.patch b/testing/cpm/cpm_find-patch-command-tarball/patches/0002-move-git-sha1-a-second-time.patch new file mode 100644 index 000000000..1986f6d51 --- /dev/null +++ b/testing/cpm/cpm_find-patch-command-tarball/patches/0002-move-git-sha1-a-second-time.patch @@ -0,0 +1,19 @@ +From 3588e151030a30661b310a876f7cc450d6ca9201 Mon Sep 17 00:00:00 2001 +From: Robert Maynard +Date: Wed, 31 Jan 2024 15:01:21 -0500 +Subject: [PATCH 2/2] Move GIT SHA1 a second time + +--- + git_file_2.txt | 1 + + 1 file changed, 1 insertion(+) + create mode 100644 git_file_2.txt + +diff --git a/git_file_2.txt b/git_file_2.txt +new file mode 100644 +index 00000000..fa240558 +--- /dev/null ++++ b/git_file_2.txt +@@ -0,0 +1 @@ ++added another file +-- +2.43.0 diff --git a/testing/cpm/cpm_package_override-multiple-cmake-var.cmake b/testing/cpm/cpm_package_override-multiple-cmake-var.cmake index be3c60145..d416a8db3 100644 --- a/testing/cpm/cpm_package_override-multiple-cmake-var.cmake +++ b/testing/cpm/cpm_package_override-multiple-cmake-var.cmake @@ -1,6 +1,6 @@ # ============================================================================= # cmake-format: off -# SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION. +# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. # SPDX-License-Identifier: Apache-2.0 # cmake-format: on # ============================================================================= @@ -13,10 +13,12 @@ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/override1.json { "packages": { "nvbench": { + "git_url": "https://github.com/NVIDIA/nvbench.git", "git_tag": "my_tag" }, "gtest": { "version": "2.99", + "git_url": "https://github.com/google/googletest.git", "git_tag": "v${version}" } } @@ -32,6 +34,7 @@ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/override2.json }, "GTest": { "version": "3.99", + "git_url": "https://github.com/google/googletest.git", "git_tag": "v${version}" } } diff --git a/testing/cpm/cpm_package_override-multiple.cmake b/testing/cpm/cpm_package_override-multiple.cmake index 10d9483a5..05e0e3765 100644 --- a/testing/cpm/cpm_package_override-multiple.cmake +++ b/testing/cpm/cpm_package_override-multiple.cmake @@ -1,6 +1,6 @@ # ============================================================================= # cmake-format: off -# SPDX-FileCopyrightText: Copyright (c) 2021-2025, NVIDIA CORPORATION. +# SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION. # SPDX-License-Identifier: Apache-2.0 # cmake-format: on # ============================================================================= @@ -24,10 +24,12 @@ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/override1.json { "packages": { "nvbench": { + "git_url": "https://github.com/NVIDIA/nvbench.git", "git_tag": "my_tag" }, "GTest": { "version": "2.99", + "git_url": "https://github.com/google/googletest.git", "git_tag": "v${version}" } } @@ -43,6 +45,7 @@ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/override2.json }, "GTest": { "version": "3.99", + "git_url": "https://github.com/google/googletest.git", "git_tag": "v${version}" } } @@ -57,8 +60,9 @@ rapids_cpm_package_details_internal(nvbench version repository tag src_subdir sh if(NOT version STREQUAL nvbench_version) message(FATAL_ERROR "default version field was removed.") endif() -if(NOT repository STREQUAL nvbench_repository) - message(FATAL_ERROR "default repository field was removed.") +if(NOT repository STREQUAL "https://github.com/NVIDIA/nvbench.git") + message(FATAL_ERROR "custom git_url field was ignored. ${repository} found instead of expected git url" + ) endif() if(NOT tag STREQUAL "my_tag") message(FATAL_ERROR "custom git_tag field was ignored. ${tag} found instead of my_url") diff --git a/testing/cpm/verify_generated_pins/CMakeLists.txt b/testing/cpm/verify_generated_pins/CMakeLists.txt index 442040345..47c82baed 100644 --- a/testing/cpm/verify_generated_pins/CMakeLists.txt +++ b/testing/cpm/verify_generated_pins/CMakeLists.txt @@ -1,6 +1,6 @@ # ============================================================================= # cmake-format: off -# SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION. +# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. # SPDX-License-Identifier: Apache-2.0 # cmake-format: on # ============================================================================= @@ -39,29 +39,54 @@ foreach(proj IN LISTS projects-to-verify) # Verify that each git_tag is now different. rapids_cpm_package_details_internal(${proj} ${proj}_version ${proj}_repository pin_${proj}_tag pin_${proj}_src_dir pin_${proj}_shallow ${proj}_exclude) - # 160 bits for SHA-1, 256 bits for SHA-256 - string(LENGTH "${${proj}_tag}" tag_length) - if(pin_${proj}_tag STREQUAL ${proj}_tag - AND NOT (${proj}_tag MATCHES "^[0-9a-f]+$" AND (tag_length EQUAL 40 OR tag_length EQUAL 64))) - _get_json_data() - message(FATAL_ERROR "pinned ${proj} tag (${pin_${proj}_tag}) should differ compared to baseline ${${proj}_tag}\npinned_versions.json:\n${pinned_versions}\nversions.json:\n${default_versions}" - ) - elseif(NOT pin_${proj}_tag STREQUAL ${proj}_tag - AND (${proj}_tag MATCHES "^[0-9a-f]+$" AND (tag_length EQUAL 40 OR tag_length EQUAL 64))) - _get_json_data() - message(FATAL_ERROR "pinned ${proj} tag (${pin_${proj}_tag}) should be the same as baseline ${${proj}_tag}\npinned_versions.json:\n${pinned_versions}\nversions.json:\n${default_versions}" - ) + + # Determine if this is a URL-mode package (tag is empty, url_hash is set) + set(is_url_mode_${proj} FALSE) + if("${${proj}_tag}" STREQUAL "" AND "${pin_${proj}_tag}" STREQUAL "") + set(is_url_mode_${proj} TRUE) endif() - if(proj IN_LIST projects-with-subdirs AND NOT pin_${proj}_src_dir) - message(FATAL_ERROR "pinned ${proj} should have a `source_subdir` entry") + if(is_url_mode_${proj}) + # For URL-mode packages, verify that the pinned override has url and url_hash fields + get_override_json(${proj} pinned_json_data) + if(NOT pinned_json_data) + message(FATAL_ERROR "${proj} should exist in pinned_versions.json") + endif() + string(JSON url_val ERROR_VARIABLE no_url GET "${pinned_json_data}" url) + string(JSON hash_val ERROR_VARIABLE no_hash GET "${pinned_json_data}" url_hash) + if(no_url) + message(FATAL_ERROR "Pinned ${proj} entry should have 'url' field.\nPinned JSON: ${pinned_json_data}" + ) + endif() + if(no_hash) + message(FATAL_ERROR "Pinned ${proj} entry should have 'url_hash' field.\nPinned JSON: ${pinned_json_data}" + ) + endif() + else() + # 160 bits for SHA-1, 256 bits for SHA-256 + string(LENGTH "${${proj}_tag}" tag_length) + if(pin_${proj}_tag STREQUAL ${proj}_tag + AND NOT (${proj}_tag MATCHES "^[0-9a-f]+$" AND (tag_length EQUAL 40 OR tag_length EQUAL 64))) + _get_json_data() + message(FATAL_ERROR "pinned ${proj} tag (${pin_${proj}_tag}) should differ compared to baseline ${${proj}_tag}\npinned_versions.json:\n${pinned_versions}\nversions.json:\n${default_versions}" + ) + elseif(NOT pin_${proj}_tag STREQUAL ${proj}_tag + AND (${proj}_tag MATCHES "^[0-9a-f]+$" AND (tag_length EQUAL 40 OR tag_length EQUAL 64))) + _get_json_data() + message(FATAL_ERROR "pinned ${proj} tag (${pin_${proj}_tag}) should be the same as baseline ${${proj}_tag}\npinned_versions.json:\n${pinned_versions}\nversions.json:\n${default_versions}" + ) + endif() + + # git_shallow should be false so that clones by SHA1 work + if(pin_${proj}_shallow) + _get_json_data() + message(FATAL_ERROR "pin_${proj}_shallow is expected to be false, but got ${pin_${proj}_shallow}\npinned_versions.json:\n${pinned_versions}\nversions.json:\n${default_versions}" + ) + endif() endif() - # Everything should have shallow marked as false so that clones by SHA1 work - if(pin_${proj}_shallow) - _get_json_data() - message(FATAL_ERROR "pin_${proj}_shallow is expected to be false, but got ${pin_${proj}_shallow}\npinned_versions.json:\n${pinned_versions}\nversions.json:\n${default_versions}" - ) + if(proj IN_LIST projects-with-subdirs AND NOT pin_${proj}_src_dir) + message(FATAL_ERROR "pinned ${proj} should have a `source_subdir` entry") endif() endforeach()