From d56506090fc6663f34b8f1562e1da5ac9b07f11d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gr=C3=A9goire=20KUBLER?= <gregoire.kubler@proton.me>
Date: Fri, 8 Nov 2024 12:30:22 +0100
Subject: [PATCH] fix : pip do not packs cuda* .so files in .whl,
 aidge_backend_cuda pkg wieghs now ~2Mo max

CUDA*  libs are now private deps
Set official version of these libraries
CUDA Toolkit :  12.4
CUDNN : 9
auditwheel repair call has been removed from CIBuildWheel call to forbid it to pack the cuda .so files within the wheel
Closes #32
---
 .gitlab-ci.yml                   |  5 +++--
 CMakeLists.txt                   |  7 ++++---
 README.md                        |  2 ++
 cmake/PybindModuleCreation.cmake | 16 ++++++++++++++--
 pyproject.toml                   |  6 ++++--
 unit_tests/CMakeLists.txt        |  9 ++++++++-
 6 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1c26067..ab168fa 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -40,9 +40,10 @@ release:pip:ubuntu:
       DOCKER_HOST='unix:///var/run/docker.sock'
       ARCH='x86_64'
       CUDNN_VERSION='9'
-      CUDA_MAJOR_VERSION='11'
-      CUDA_MINOR_VERSION='8'
+      CUDA_MAJOR_VERSION='12'
+      CUDA_MINOR_VERSION='4'
       SEARCH_PATH='/home/ubuntu/builds/$CI_RUNNER_SHORT_TOKEN/$CI_CONCURRENT_ID'
+      CIBW_REPAIR_WHEEL_COMMAND=''
 
   parallel:
     matrix:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 85cc727..1bb3095 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -67,7 +67,7 @@ if(NOT $ENV{AIDGE_INSTALL} STREQUAL "")
     list(APPEND ENV{PATH} /usr/local/cuda/bin)
     set(ENV{CUDACXX} /usr/local/cuda/bin/nvcc)
 endif()
-find_package(CUDAToolkit REQUIRED)
+find_package(CUDAToolkit 12 REQUIRED)
 if(NOT DEFINED CMAKE_CUDA_STANDARD)
     set(CMAKE_CUDA_STANDARD 14)
     set(CMAKE_CUDA_STANDARD_REQUIRED ON)
@@ -97,7 +97,7 @@ if (PYBIND)
     # Handles Python + pybind11 headers dependencies
     include(PybindModuleCreation)
     # creates a target of the same name as CMAKE_PROJECT_NAME
-        generate_python_binding(${CMAKE_PROJECT_NAME} ${module_name}) # the python bindings module has the same name as the project.
+    generate_python_binding(${CMAKE_PROJECT_NAME} ${module_name}) # the python bindings module has the same name as the project.
 
     target_link_libraries(${module_name}
         PUBLIC
@@ -110,9 +110,10 @@ endif()
 target_link_libraries(${module_name}
     PUBLIC
         _aidge_core # _ is added because we link the target not the project
-        CUDA::cudart
+    PRIVATE
         CUDA::cublas
         cudnn
+        CUDA::cudart
 )
 
 if( ${ENABLE_ASAN} )
diff --git a/README.md b/README.md
index 09e16ed..835aa2a 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,8 @@ You can find in this folder the library that implements the CUDA operators.
 ## Installation
 
 ### Dependencies
+- [CUDA ToolKit 12.4](https://developer.nvidia.com/cuda-12-4-0-download-archive)
+- [CUDnn9](https://developer.nvidia.com/cudnn-downloads) make sure to install the CUDA 12 compatible version
 - `GCC`
 - `Make`/`Ninja`
 - `CMake`
diff --git a/cmake/PybindModuleCreation.cmake b/cmake/PybindModuleCreation.cmake
index 8f386be..69b5f7d 100644
--- a/cmake/PybindModuleCreation.cmake
+++ b/cmake/PybindModuleCreation.cmake
@@ -20,6 +20,18 @@ function(generate_python_binding pybind_module_name target_to_bind)
     file(GLOB_RECURSE pybind_src_files "python_binding/*.cpp")
 
     pybind11_add_module(${pybind_module_name} MODULE ${pybind_src_files} "NO_EXTRAS") # NO EXTRA recquired for pip install
-    target_include_directories(${pybind_module_name} PUBLIC "python_binding")
-    target_link_libraries(${pybind_module_name} PUBLIC ${target_to_bind})
+    target_include_directories(${pybind_module_name} PRIVATE "python_binding")
+    target_link_libraries(${pybind_module_name} 
+        PRIVATE 
+            ${target_to_bind}
+            CUDA::cublas
+            cudnn
+            CUDA::cudart
+    )
+    set_property(TARGET ${pybind_module_name} PROPERTY POSITION_INDEPENDENT_CODE ON)
+    set_target_properties(${pybind_module_name} PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
+    set_target_properties(${pybind_module_name} PROPERTIES
+        CMAKE_SHARED_LINKER_FLAGS "-Wl,--exclude-libs,ALL"
+    )
+    set_target_properties(${module} PROPERTIES INSTALL_RPATH "")
 endfunction()
diff --git a/pyproject.toml b/pyproject.toml
index 911af05..5fc58b5 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -47,6 +47,8 @@ test-command = "pytest {project}/aidge_backend_cuda/unit_tests"
 #     "cp310-manylinux_x86_64"
 # ]
 
+repair-wheel-command = ""
+
 [tool.cibuildwheel.container-engine]
 # pass command line options to 'docker run'
 name = "docker"
@@ -66,8 +68,8 @@ AIDGE_DEPENDENCIES = "aidge_core aidge_backend_cpu" # format => "dep_1 dep_2 ...
 AIDGE_INSTALL="/AIDGE_INSTALL_CIBUILDWHEEL"
 ARCH="x86_64"
 CUDNN_VERSION="9"
-CUDA_MAJOR_VERSION="11"
-CUDA_MINOR_VERSION="8"
+CUDA_MAJOR_VERSION="12"
+CUDA_MINOR_VERSION="4"
 DOCKER_HOST="unix:///var/run/docker.sock"
 SEARCH_PATH="/home/ubuntu/aidge/aidge" # debug path
 # these two following variables are set within CMakeLists.txt when calling cibuildwheel from CI
diff --git a/unit_tests/CMakeLists.txt b/unit_tests/CMakeLists.txt
index 807adc5..7677257 100644
--- a/unit_tests/CMakeLists.txt
+++ b/unit_tests/CMakeLists.txt
@@ -16,7 +16,14 @@ add_executable(tests${module_name} ${src_files})
 
 target_link_libraries(tests${module_name} PUBLIC ${module_name})
 
-target_link_libraries(tests${module_name} PRIVATE Catch2::Catch2WithMain)
+target_link_libraries(tests${module_name} 
+    PRIVATE
+        Catch2::Catch2WithMain
+        CUDA::cudart
+        cudnn
+        CUDA::cublas
+
+)
 
 list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras)
 include(CTest)
-- 
GitLab