Skip to content

Commit

Permalink
proprietary_binary now supports cuda toolkit version placeholders (#377)
Browse files Browse the repository at this point in the history
This will allow rapids_cpm to customize download urls based on the CUDA Toolkit version.

Authors:
  - Robert Maynard (https://github.com/robertmaynard)

Approvers:
  - Vyas Ramasubramani (https://github.com/vyasr)

URL: #377
  • Loading branch information
robertmaynard authored Feb 27, 2023
1 parent 7db9ade commit c992589
Show file tree
Hide file tree
Showing 9 changed files with 222 additions and 28 deletions.
2 changes: 2 additions & 0 deletions docs/packages/rapids_cpm_versions.rst
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@ as needed.
Supports the following placeholders:
- ``${rapids-cmake-version}`` will be evaluated to 'major.minor' of the current rapids-cmake cal-ver value.
- ``${version}`` will be evaluated to the contents of the ``version`` field.
- ``${cuda-toolkit-version}`` will be evaluated to 'major.minor' of the current CUDA Toolkit version.
- ``${cuda-toolkit-version-major}`` will be evaluated to 'major' of the current CUDA Toolkit version.

If this field exists in the default package, the value will be ignored when an override file
entry exists for the package. This ensures that the git url or `proprietary_binary` entry in the override will be used.
Expand Down
46 changes: 46 additions & 0 deletions rapids-cmake/cpm/detail/download_proprietary_binary.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#=============================================================================
# Copyright (c) 2023, 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:
download_proprietary_binary
-------------------
.. versionadded:: v23.04.00
Download the associated proprietary binary from the providied URL and make
it part of the project with `FetchContent_MakeAvailable`
#]=======================================================================]
function(rapids_cpm_download_proprietary_binary package_name url)
list(APPEND CMAKE_MESSAGE_CONTEXT "rapids.cpm.rapids_cpm_download_proprietary_binary")

# download and extract the binaries since they don't exist on the machine
include(FetchContent)
set(pkg_name "${package_name}_proprietary_binary")

if(POLICY CMP0135)
cmake_policy(SET CMP0135 NEW)
set(CMAKE_POLICY_DEFAULT_CMP0135 NEW)
endif()

FetchContent_Declare(${pkg_name} URL ${url})
FetchContent_MakeAvailable(${pkg_name})

# Tell the subsequent rapids_cpm_find where to search so that it uses this binary
set(${package_name}_ROOT "${${pkg_name}_SOURCE_DIR}" PARENT_SCOPE)
set(${package_name}_proprietary_binary ON PARENT_SCOPE)
endfunction()
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#=============================================================================
# Copyright (c) 2022, NVIDIA CORPORATION.
# Copyright (c) 2023, NVIDIA CORPORATION.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand All @@ -16,22 +16,21 @@
include_guard(GLOBAL)

#[=======================================================================[.rst:
get_proprietary_binary
rapids_cpm_get_proprietary_binary_url
-------------------
.. versionadded:: v22.06.00
.. versionadded:: v23.04.00
Download the associated proprietary binary for the given project based on
the current CPU target architecture ( x86_64, aarch64, etc )
Generated the url for the associated proprietary binary for the given project based
on the current CPU target architecture ( x86_64, aarch64, etc )
.. note::
if override => the proprietary entry only in the override will be evaluated
if no override => the proprietary entry only in the default will be evaluated
#]=======================================================================]
function(rapids_cpm_get_proprietary_binary package_name version)
list(APPEND CMAKE_MESSAGE_CONTEXT "rapids.cpm.rapids_cpm_get_proprietary_binary")
function(rapids_cpm_get_proprietary_binary_url package_name version url_var)
list(APPEND CMAKE_MESSAGE_CONTEXT "rapids.cpm.rapids_cpm_get_proprietary_binary_url")

include("${rapids-cmake-dir}/cpm/detail/get_default_json.cmake")
include("${rapids-cmake-dir}/cpm/detail/get_override_json.cmake")
Expand Down Expand Up @@ -61,25 +60,18 @@ function(rapids_cpm_get_proprietary_binary package_name version)
include("${rapids-cmake-dir}/rapids-version.cmake")
endif()

# Determine the CUDA Toolkit version so that we properly evaluate the placeholders in
# `proprietary_binary`
if(proprietary_binary MATCHES "{cuda-toolkit-version")
find_package(CUDAToolkit REQUIRED)
set(cuda-toolkit-version ${CUDAToolkit_VERSION_MAJOR}.${CUDAToolkit_VERSION_MINOR})
set(cuda-toolkit-version-major ${CUDAToolkit_VERSION_MAJOR})
endif()

# Evaluate any magic placeholders in the proprietary_binary value including the
# `rapids-cmake-version` value
cmake_language(EVAL CODE "set(proprietary_binary ${proprietary_binary})")

if(proprietary_binary)
# download and extract the binaries since they don't exist on the machine
include(FetchContent)
set(pkg_name "${package_name}_proprietary_binary")

if(POLICY CMP0135)
cmake_policy(SET CMP0135 NEW)
set(CMAKE_POLICY_DEFAULT_CMP0135 NEW)
endif()

FetchContent_Declare(${pkg_name} URL ${proprietary_binary})
FetchContent_MakeAvailable(${pkg_name})

# Tell the subsequent rapids_cpm_find where to search so that it uses this binary
set(${package_name}_ROOT "${${pkg_name}_SOURCE_DIR}" PARENT_SCOPE)
set(${package_name}_proprietary_binary ON PARENT_SCOPE)
endif()
# Tell the caller what the URL will be for this binary
set(${url_var} "${proprietary_binary}" PARENT_SCOPE)
endfunction()
8 changes: 6 additions & 2 deletions rapids-cmake/cpm/nvcomp.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,12 @@ function(rapids_cpm_nvcomp)
# first see if we have a proprietary pre-built binary listed in versions.json and it if requested.
set(nvcomp_proprietary_binary OFF) # will be set to true by rapids_cpm_get_proprietary_binary
if(_RAPIDS_USE_PROPRIETARY_BINARY)
include("${rapids-cmake-dir}/cpm/detail/get_proprietary_binary.cmake")
rapids_cpm_get_proprietary_binary(nvcomp ${version})
include("${rapids-cmake-dir}/cpm/detail/get_proprietary_binary_url.cmake")
include("${rapids-cmake-dir}/cpm/detail/download_proprietary_binary.cmake")
rapids_cpm_get_proprietary_binary_url(nvcomp ${version} nvcomp_url)
if(nvcomp_url)
rapids_cpm_download_proprietary_binary(nvcomp ${nvcomp_url})
endif()

# Record the nvcomp_DIR so that if USE_PROPRIETARY_BINARY is disabled we can safely clear the
# nvcomp_DIR value
Expand Down
4 changes: 4 additions & 0 deletions testing/cpm/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,10 @@ add_cmake_config_test( cpm_nvcomp-simple.cmake )
add_cmake_config_test( cpm_nvcomp-invalid-arch.cmake )
add_cmake_config_test( cpm_nvcomp-override-clears-proprietary_binary.cmake )

add_cmake_config_test( cpm_proprietary-url-ctk-version-find-ctk.cmake )
add_cmake_config_test( cpm_proprietary-url-ctk-version.cmake )
add_cmake_config_test( cpm_proprietary-url-no-ctk-parsing.cmake )

add_cmake_config_test( cpm_rmm-export.cmake )
add_cmake_config_test( cpm_rmm-simple.cmake )

Expand Down
50 changes: 50 additions & 0 deletions testing/cpm/cpm_proprietary-url-ctk-version-find-ctk.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#=============================================================================
# Copyright (c) 2023, 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(${rapids-cmake-dir}/cpm/init.cmake)
include(${rapids-cmake-dir}/cpm/package_override.cmake)
include(${rapids-cmake-dir}/cpm/detail/get_proprietary_binary_url.cmake)
include(${rapids-cmake-dir}/cpm/detail/package_details.cmake)

rapids_cpm_init()

# Need to write out an override file with a proprietary blob url
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/override.json
[=[
{
"packages" : {
"test_binary" : {
"version" : "2.6.1",
"proprietary_binary" : {
"x86_64-linux" : "https://fake.url.com/${version}/${cuda-toolkit-version}/x86_64_${cuda-toolkit-version-major}.tgz",
"aarch64-linux" : "https://fake.url.com/${version}/${cuda-toolkit-version}/aarch64_${cuda-toolkit-version-major}.tgz",
}
}
}
}
]=])
rapids_cpm_package_override(${CMAKE_CURRENT_BINARY_DIR}/override.json)

# Verify that the placeholders are evaluated correctly from `enable_language(CUDA)`
rapids_cpm_package_details(test_binary version repository tag shallow exclude)
rapids_cpm_get_proprietary_binary_url(test_binary ${version} url)

find_package(CUDAToolkit)
set(CTK_VER ${CUDAToolkit_VERSION_MAJOR}.${CUDAToolkit_VERSION_MINOR})
set(CTK_VER_M ${CUDAToolkit_VERSION_MAJOR})
set(valid_url "https://fake.url.com/2.6.1/${CTK_VER}/${CMAKE_SYSTEM_PROCESSOR}_${CTK_VER_M}.tgz")
if(NOT valid_url STREQUAL url)
message(FATAL_ERROR "Expected: ${valid_url} got: ${url}")
endif()
50 changes: 50 additions & 0 deletions testing/cpm/cpm_proprietary-url-ctk-version.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#=============================================================================
# Copyright (c) 2023, 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(${rapids-cmake-dir}/cpm/init.cmake)
include(${rapids-cmake-dir}/cpm/package_override.cmake)
include(${rapids-cmake-dir}/cpm/detail/get_proprietary_binary_url.cmake)
include(${rapids-cmake-dir}/cpm/detail/package_details.cmake)

rapids_cpm_init()

# Need to write out an override file with a proprietary blob url
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/override.json
[=[
{
"packages" : {
"test_binary" : {
"version" : "2.6.1",
"proprietary_binary" : {
"x86_64-linux" : "https://fake.url.com/${version}/${cuda-toolkit-version}/x86_64_${cuda-toolkit-version-major}.tgz",
"aarch64-linux" : "https://fake.url.com/${version}/${cuda-toolkit-version}/aarch64_${cuda-toolkit-version-major}.tgz",
}
}
}
}
]=])
rapids_cpm_package_override(${CMAKE_CURRENT_BINARY_DIR}/override.json)

# Verify that the placeholders are evaluated correctly from `find_package(CUDAToolkit)`
find_package(CUDAToolkit REQUIRED)
rapids_cpm_package_details(test_binary version repository tag shallow exclude)
rapids_cpm_get_proprietary_binary_url(test_binary ${version} url)

set(CTK_VER ${CUDAToolkit_VERSION_MAJOR}.${CUDAToolkit_VERSION_MINOR})
set(CTK_VER_M ${CUDAToolkit_VERSION_MAJOR})
set(valid_url "https://fake.url.com/2.6.1/${CTK_VER}/${CMAKE_SYSTEM_PROCESSOR}_${CTK_VER_M}.tgz")
if(NOT valid_url STREQUAL url)
message(FATAL_ERROR "Expected: ${valid_url} got: ${url}")
endif()
46 changes: 46 additions & 0 deletions testing/cpm/cpm_proprietary-url-no-ctk-parsing.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#=============================================================================
# Copyright (c) 2023, 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(${rapids-cmake-dir}/cpm/init.cmake)
include(${rapids-cmake-dir}/cpm/package_override.cmake)
include(${rapids-cmake-dir}/cpm/detail/get_proprietary_binary_url.cmake)
include(${rapids-cmake-dir}/cpm/detail/package_details.cmake)

rapids_cpm_init()

# Need to write out an override file with a proprietary blob url
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/override.json
[=[
{
"packages" : {
"test_binary" : {
"version" : "2.6.1",
"proprietary_binary" : {
"x86_64-linux" : "https://fake.url.com/x86_${version}.tgz",
"aarch64-linux" : "https://fake.url.com/aarch_${version}.tgz",
}
}
}
}
]=])
rapids_cpm_package_override(${CMAKE_CURRENT_BINARY_DIR}/override.json)

rapids_cpm_package_details(test_binary version repository tag shallow exclude)
rapids_cpm_get_proprietary_binary_url(test_binary ${version} nvcomp_url)

# Verify that we didn't go searching for the CUDAToolkit
if(TARGET CUDA::cudart_static OR TARGET CUDA::cudart)
message(FATAL_ERROR "test_binary didn't use the cuda toolkit placeholder, but searching for it still occurred")
endif()
2 changes: 1 addition & 1 deletion testing/utils/project_template.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,5 @@ add_subdirectory(${rapids-cmake_SOURCE_DIR} ${rapids-cmake_BINARY_DIR})

# We need to enable at least one language so that we get properly
# generated system search paths.
project(@test_name@ LANGUAGES CXX)
project(@test_name_stem@ LANGUAGES CXX)
include("@test_cmake_file@")

0 comments on commit c992589

Please sign in to comment.