Просмотр исходного кода

FindCUDAToolkit: Add CUDA::bin2c target

Kyle Edwards 1 месяц назад
Родитель
Сommit
2d2036c9e9

+ 5 - 0
Help/release/dev/cudatoolkit-bin2c.rst

@@ -0,0 +1,5 @@
+cudatoolkit-bin2c
+-----------------
+
+* The :module:`FindCUDAToolkit` module now creates a ``CUDA::bin2c`` imported
+  target for the :ref:`bin2c <FindCUDAToolkit_bin2c>` utility.

+ 23 - 0
Modules/FindCUDAToolkit.cmake

@@ -524,6 +524,19 @@ Target Created:
 
 
 **Note**: direct usage of this target by consumers should not be necessary.
 **Note**: direct usage of this target by consumers should not be necessary.
 
 
+.. _`FindCUDAToolkit_bin2c`:
+
+bin2c
+"""""
+
+.. versionadded:: 4.3
+
+A utility that converts binary files to C files containing byte arrays.
+
+Target Created:
+
+- ``CUDA::bin2c``
+
 Result Variables
 Result Variables
 ^^^^^^^^^^^^^^^^
 ^^^^^^^^^^^^^^^^
 
 
@@ -1486,6 +1499,16 @@ if(CUDAToolkit_FOUND)
   endif()
   endif()
 
 
   _CUDAToolkit_find_and_add_import_lib(OpenCL)
   _CUDAToolkit_find_and_add_import_lib(OpenCL)
+
+  find_program(CUDA_bin2c_EXECUTABLE
+    NAMES bin2c
+    HINTS ${CUDAToolkit_BIN_DIR}
+    NO_DEFAULT_PATH
+  )
+  if(NOT TARGET CUDA::bin2c AND CUDA_bin2c_EXECUTABLE)
+    add_executable(CUDA::bin2c IMPORTED)
+    set_property(TARGET CUDA::bin2c PROPERTY IMPORTED_LOCATION "${CUDA_bin2c_EXECUTABLE}")
+  endif()
 endif()
 endif()
 
 
 if(_CUDAToolkit_Pop_ROOT_PATH)
 if(_CUDAToolkit_Pop_ROOT_PATH)

+ 19 - 0
Tests/Cuda/Bin2C/CMakeLists.txt

@@ -0,0 +1,19 @@
+cmake_minimum_required(VERSION 4.2)
+project(Bin2C CXX)
+
+# Goal for this example:
+# Validate that we can use CUDAToolkit bin2c
+find_package(CUDAToolkit REQUIRED)
+
+add_executable(generate generate.cpp)
+add_custom_command(
+  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/binary.bin
+  COMMAND generate ${CMAKE_CURRENT_BINARY_DIR}/binary.bin
+  )
+add_custom_command(
+  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/binary.h
+  COMMAND CUDA::bin2c ${CMAKE_CURRENT_BINARY_DIR}/binary.bin > ${CMAKE_CURRENT_BINARY_DIR}/binary.h
+  DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/binary.bin
+  )
+add_executable(CudaBin2C verify.cpp ${CMAKE_CURRENT_BINARY_DIR}/binary.h)
+target_include_directories(CudaBin2C PRIVATE ${CMAKE_CURRENT_BINARY_DIR})

+ 18 - 0
Tests/Cuda/Bin2C/generate.cpp

@@ -0,0 +1,18 @@
+#include <fstream>
+#include <ios>
+
+static unsigned char const contents[] = {
+  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+};
+
+int main(int argc, char** argv)
+{
+  if (argc != 2) {
+    return 1;
+  }
+
+  std::ofstream fout(argv[1], std::ios::out | std::ios::binary);
+  fout.write(reinterpret_cast<char const*>(contents), sizeof(contents));
+
+  return 0;
+}

+ 18 - 0
Tests/Cuda/Bin2C/verify.cpp

@@ -0,0 +1,18 @@
+#include <cstdlib>
+
+#include "binary.h"
+
+int main()
+{
+  if (sizeof(imageBytes) != 8) {
+    return 1;
+  }
+
+  for (size_t i = 0; i < 8; i++) {
+    if (imageBytes[i] != i) {
+      return 1;
+    }
+  }
+
+  return 0;
+}

+ 1 - 0
Tests/Cuda/CMakeLists.txt

@@ -31,3 +31,4 @@ if(CMake_TEST_CUDA AND NOT CMake_TEST_CUDA STREQUAL "Clang")
 endif()
 endif()
 
 
 add_cuda_test_macro(Cuda.WithC CudaWithC)
 add_cuda_test_macro(Cuda.WithC CudaWithC)
+add_cuda_test_macro(Cuda.Bin2C CudaBin2C)