-
Notifications
You must be signed in to change notification settings - Fork 66
rapids-cmake can generate pinned versions file #530
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
rapids-bot
merged 36 commits into
rapidsai:branch-24.04
from
robertmaynard:fea/generate_pinned_manifest_file
Mar 5, 2024
Merged
Changes from 22 commits
Commits
Show all changes
36 commits
Select commit
Hold shift + click to select a range
a24d84b
All rapids-cmake tests will properly hook into using the rapids-cmake…
robertmaynard cbba2a0
Add rapids_cpm_generate_pinned_versions to support reproducible builds
robertmaynard cfe884b
Ensure we can apply git format-patches always
robertmaynard 0d0111e
add debug code to failing test
robertmaynard f93edc8
Fix logic found by CI
robertmaynard 86f4c2e
Fix docs issues
robertmaynard cb613cf
Fix docs issues
robertmaynard 2a97e9d
Fix docs issues
robertmaynard 51cf575
Refactor internal logic to remove unneeded hooks
robertmaynard 6d65041
Apply suggestions from code review
robertmaynard cf29f15
Correct git captilization
robertmaynard 90b4a98
Remove unneeded files from cpm pin format-patches test
robertmaynard cdea83c
Update testing/export/write_language-multiple-nested-enables/CMakeLis…
robertmaynard e351cdb
Cleaned up how we handle trailing commas
robertmaynard e15e952
Correct style issues found by CI
robertmaynard 5ce2caf
Refactor gpv name to pinning
robertmaynard 9101346
Remove unneeded whitespace from json
robertmaynard 1fc2b4b
Refactor rapids_cpm_pinning_create_and_set_member
robertmaynard dd87f9d
Apply suggestions from code review
robertmaynard 89d93b1
Don't quote boolean types in the json we write
robertmaynard af13b6c
Merge branch 'branch-24.04' into fea/generate_pinned_manifest_file
robertmaynard 22a849c
Apply pre-commit hooks for pretty-format-json.
bdice a6b4cb9
Correct issues found by code review
robertmaynard 7cb161f
Leverage CMake for pretty enough printing
robertmaynard e0a9c47
More corrections found in code review
robertmaynard dc0e01f
Document functions in pinning_write_file.cmake
robertmaynard 6a6a6ef
Update tests to pass in the projects to verify
robertmaynard df1567a
Update tests to pass in the projects to verify
robertmaynard 5a5081b
Remove unneeded variable expansion from tests
robertmaynard 6ad1956
Correctly handle CPM calls that resolve to find_package
robertmaynard 49b4035
Correct style issues found by CI
robertmaynard 7542f30
Add messaging around non source packages
robertmaynard 97a8b45
Correct style issues found by CI
robertmaynard 80ca70c
Correct style issues found by CI
robertmaynard 75e0db8
reduce verbosity of rapids_cpm_generate_pinned_versions messasges
robertmaynard f341f37
Correct style issues found by CI
robertmaynard File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| .. cmake-module:: ../../rapids-cmake/cpm/generate_pinned_versions.cmake |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| #============================================================================= | ||
| # Copyright (c) 2024, NVIDIA CORPORATION. | ||
| # | ||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||
| # you may not use this file except in compliance with the License. | ||
| # You may obtain a copy of the License at | ||
| # | ||
| # http://www.apache.org/licenses/LICENSE-2.0 | ||
| # | ||
| # Unless required by applicable law or agreed to in writing, software | ||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| # See the License for the specific language governing permissions and | ||
| # limitations under the License. | ||
| #============================================================================= | ||
| include_guard(GLOBAL) | ||
|
|
||
| # Make sure we always have CMake 3.23 policies when executing this file since we can be executing in | ||
| # directories of users of rapids-cmake which have a lower minimum cmake version and therefore | ||
| # different policies | ||
| # | ||
| cmake_policy(PUSH) | ||
| cmake_policy(VERSION 3.23) | ||
|
|
||
| # Include the needed functions that write out the the pinned versions file | ||
| include("${rapids-cmake-dir}/cpm/detail/pinning_write_file.cmake") | ||
|
|
||
| # Compute and write out the pinned versions file | ||
| rapids_cpm_pinning_write_file() | ||
|
|
||
| cmake_policy(POP) | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,259 @@ | ||
| #============================================================================= | ||
| # Copyright (c) 2024, NVIDIA CORPORATION. | ||
| # | ||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||
| # you may not use this file except in compliance with the License. | ||
| # You may obtain a copy of the License at | ||
| # | ||
| # http://www.apache.org/licenses/LICENSE-2.0 | ||
| # | ||
| # Unless required by applicable law or agreed to in writing, software | ||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| # See the License for the specific language governing permissions and | ||
| # limitations under the License. | ||
| #============================================================================= | ||
| include_guard(GLOBAL) | ||
|
|
||
| #[=======================================================================[.rst: | ||
| rapids_cpm_pinning_extract_source_git_info | ||
| ------------------------------------------ | ||
|
|
||
| .. versionadded:: v24.04.00 | ||
|
|
||
|
|
||
| #]=======================================================================] | ||
| function(rapids_cpm_pinning_extract_source_git_info package git_url_var git_sha_var) | ||
robertmaynard marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| set(source_dir "${CPM_PACKAGE_${package}_SOURCE_DIR}") | ||
| set(_RAPIDS_URL) | ||
| set(_RAPIDS_SHA) | ||
| if(EXISTS "${source_dir}") | ||
| execute_process(COMMAND ${GIT_EXECUTABLE} ls-remote --get-url | ||
| WORKING_DIRECTORY ${source_dir} | ||
| ERROR_QUIET | ||
| OUTPUT_VARIABLE _RAPIDS_URL | ||
| OUTPUT_STRIP_TRAILING_WHITESPACE) | ||
| # Need to handle when we have applied N patch sets to the git repo and therefore the latest | ||
| # commit is just local | ||
| # | ||
| # Find all commits on our branch back to the common parent ( what we cloned ) | ||
| # | ||
| execute_process(COMMAND ${GIT_EXECUTABLE} show-branch --current --sha1-name | ||
vyasr marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| WORKING_DIRECTORY ${source_dir} | ||
| ERROR_QUIET | ||
| OUTPUT_VARIABLE _rapids_commit_stack | ||
| OUTPUT_STRIP_TRAILING_WHITESPACE) | ||
| # The last entry in the output that has "* [" is our commit | ||
| # | ||
| # Find that line and convert the `* [short-sha1] Commit Message` to a list that is ` * | ||
| # ;short-sha1;Commit Message` and extract the short sha1 | ||
| string(FIND "${_rapids_commit_stack}" "* [" position REVERSE) | ||
| if(position LESS 0) | ||
| # No changes to the repo so use the `HEAD` keyword | ||
| set(short_sha HEAD) | ||
| else() | ||
| string(SUBSTRING "${_rapids_commit_stack}" ${position} -1 _rapids_commit_stack) | ||
| string(REGEX REPLACE "(\\[|\\])" ";" _rapids_commit_stack "${_rapids_commit_stack}") | ||
| list(GET _rapids_commit_stack 1 short_sha) | ||
| endif() | ||
|
|
||
| # Convert from the short sha1 ( could be keyword `HEAD` ) to a full SHA1 | ||
| execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse ${short_sha} | ||
| WORKING_DIRECTORY ${source_dir} | ||
| ERROR_QUIET | ||
| OUTPUT_VARIABLE _RAPIDS_SHA | ||
| OUTPUT_STRIP_TRAILING_WHITESPACE) | ||
| endif() | ||
| # Only set the provided variables if we extracted the information | ||
| if(_RAPIDS_URL) | ||
| set(${git_url_var} "${_RAPIDS_URL}" PARENT_SCOPE) | ||
| endif() | ||
| if(_RAPIDS_SHA) | ||
| set(${git_sha_var} "${_RAPIDS_SHA}" PARENT_SCOPE) | ||
| endif() | ||
vyasr marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| endfunction() | ||
|
|
||
| #[=======================================================================[.rst: | ||
| rapids_cpm_pinning_add_json_entry | ||
| --------------------------------- | ||
|
|
||
| .. versionadded:: v24.04.00 | ||
|
|
||
| #]=======================================================================] | ||
| function(rapids_cpm_pinning_add_json_entry json_var package_name url_var sha_var) | ||
| 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) | ||
|
|
||
| set(url_string) | ||
| set(sha_string) | ||
| if(${url_var}) | ||
| string(CONFIGURE [=["git_url": "${${url_var}}",]=] url_string) | ||
| endif() | ||
| if(${sha_var}) | ||
| string(CONFIGURE [=["git_tag": "${${sha_var}}",]=] sha_string) | ||
| endif() | ||
| # We start with a default template, and only add members that don't exist | ||
vyasr marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| string(CONFIGURE [=[{ | ||
| "version": "${CPM_PACKAGE_${package_name}_VERSION}", | ||
| ${url_string} | ||
| ${sha_string} | ||
| "git_shallow": false, | ||
| "always_download": true | ||
| }]=] | ||
| pinned_json_entry) | ||
|
|
||
| # Insert a json key and value | ||
| # | ||
| function(rapids_cpm_pinning_create_and_set_member json_blob_var key value) | ||
robertmaynard marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| # Identify special values types that shouldn't be treated as a string | ||
| # https://gitlab.kitware.com/cmake/cmake/-/issues/25716 | ||
| if(value MATCHES "(^true$|^false$|^null$|^\\{|^\\[)") | ||
| # value is a json type that doesn't need quotes | ||
| string(JSON json_blob ERROR_VARIABLE err_var SET "${${json_blob_var}}" ${key} ${value}) | ||
| else() | ||
| # We need to quote 'value' so that it is a valid string json element. | ||
| string(JSON json_blob ERROR_VARIABLE err_var SET "${${json_blob_var}}" ${key} "\"${value}\"") | ||
| endif() | ||
| set(${json_blob_var} "${json_blob}" PARENT_SCOPE) | ||
|
|
||
| endfunction() | ||
|
|
||
| foreach(data IN LISTS override_json_data json_data) | ||
| if(NOT data) | ||
| # Need to handle both json_data and the override being empty | ||
| continue() | ||
| endif() | ||
| string(JSON entry_count LENGTH "${data}") | ||
| math(EXPR entry_count "${entry_count} - 1") | ||
| # cmake-lint: disable=E1120 | ||
| foreach(index RANGE ${entry_count}) | ||
| string(JSON member MEMBER "${data}" ${index}) | ||
| string(JSON existing_value ERROR_VARIABLE dont_have GET "${pinned_json_entry}" ${member}) | ||
| if(dont_have) | ||
| string(JSON value GET "${data}" ${member}) | ||
| rapids_cpm_pinning_create_and_set_member(pinned_json_entry ${member} ${value}) | ||
| endif() | ||
| endforeach() | ||
| endforeach() | ||
| set(${json_var} "\"${package_name}\": ${pinned_json_entry}" PARENT_SCOPE) | ||
| endfunction() | ||
|
|
||
| #[=======================================================================[.rst: | ||
| rapids_cpm_pinning_pretty_format_json | ||
| ------------------------------------- | ||
|
|
||
|
|
||
| .. versionadded:: v24.04.00 | ||
|
|
||
| Formats provided JSON to be easily read by humans | ||
| #]=======================================================================] | ||
| function(rapids_cpm_pinning_pretty_format_json _rapids_json_var) | ||
robertmaynard marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| set(pretty_json) | ||
| #[=[ | ||
| - parse each line | ||
| - trim all leading spaces | ||
| - exclusive if line contains "}" or "]" decement indenter | ||
| - print with given indenter | ||
| - exclusive if line contains "{" or "[" increment indenter | ||
| ]=] | ||
| # | ||
| set(indent " ") | ||
| set(indent_len 2) | ||
| set(current_indent "") | ||
| string(REPLACE "\n" ";" input "${${_rapids_json_var}}") | ||
|
|
||
| # Needed due to rules around cmake language list expansion: | ||
| # | ||
| # during evaluation of an Unquoted Argument. In such contexts, a string is divided into list | ||
| # elements by splitting on ; characters not following an unequal number of [ and ] characters | ||
| # | ||
| string(REPLACE "[" "``" input "${input}") | ||
| string(REPLACE "]" "~~" input "${input}") | ||
| foreach(line ${input}) | ||
| string(STRIP "${line}" line) | ||
| set(push_indent) | ||
| set(pop_indent) | ||
| if(line MATCHES "(\\{|``)") | ||
| set(push_indent TRUE) | ||
| endif() | ||
| if(line MATCHES "(\\}|~~)") | ||
| set(pop_indent TRUE) | ||
| endif() | ||
|
|
||
| if(pop_indent AND NOT push_indent) | ||
| string(SUBSTRING "${current_indent}" ${indent_len} -1 current_indent) | ||
| endif() | ||
|
|
||
| string(APPEND pretty_json "${current_indent}${line}\n") | ||
|
|
||
| if(push_indent AND NOT pop_indent) | ||
| string(APPEND current_indent "${indent}") | ||
| endif() | ||
| endforeach() | ||
| string(REPLACE "``" "[" pretty_json "${pretty_json}") | ||
| string(REPLACE "~~" "]" pretty_json "${pretty_json}") | ||
| set(${_rapids_json_var} "${pretty_json}" PARENT_SCOPE) | ||
| endfunction() | ||
|
|
||
| #[=======================================================================[.rst: | ||
| rapids_cpm_pinning_write_file | ||
| ----------------------------- | ||
|
|
||
| .. versionadded:: v24.04.00 | ||
|
|
||
| This function will write out the pinned version info to the provided files when we are in the root | ||
| CMakeLists.txt | ||
| #]=======================================================================] | ||
| function(rapids_cpm_pinning_write_file) | ||
| if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) | ||
| return() | ||
| endif() | ||
robertmaynard marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| find_package(Git QUIET) | ||
robertmaynard marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| set(_rapids_json | ||
| [=[ | ||
| { | ||
| "packages": { | ||
| ]=]) | ||
|
|
||
| list(POP_BACK CPM_PACKAGES last_package) | ||
| foreach(package IN LISTS CPM_PACKAGES last_package) | ||
| # Clear variables so we don't re-use them between packages when one package doesn't have a git | ||
| # url or sha | ||
| set(git_url) | ||
| set(git_sha) | ||
| set(not_last_package TRUE) | ||
| if(package STREQUAL last_package) | ||
| set(not_last_package FALSE) | ||
| endif() | ||
| rapids_cpm_pinning_extract_source_git_info(${package} git_url git_sha) | ||
| rapids_cpm_pinning_add_json_entry(_rapids_entry ${package} git_url git_sha) | ||
| if(not_last_package) | ||
| string(APPEND _rapids_entry [=[, | ||
| ]=]) | ||
| else() | ||
| string(APPEND _rapids_entry [=[ | ||
| ]=]) | ||
| endif() | ||
| string(APPEND _rapids_json "${_rapids_entry}") | ||
| endforeach() | ||
|
|
||
| set(post_amble | ||
| [=[ | ||
| } | ||
| }]=]) | ||
| string(APPEND _rapids_json "${post_amble}") | ||
|
|
||
| rapids_cpm_pinning_pretty_format_json(_rapids_json) | ||
|
|
||
| get_property(write_paths GLOBAL PROPERTY rapids_cpm_generate_pin_files) | ||
| foreach(path IN LISTS write_paths) | ||
| file(WRITE "${path}" "${_rapids_json}") | ||
| endforeach() | ||
|
|
||
| endfunction() | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.