diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1c2606707d16cd401e575354a1cbb99a11451ff8..ab168fa457ad6b2fb472ecc8aae883882c956713 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 85cc72750cce2669f4fdeda1594269ab493753a8..1bb3095bd1ae1b02a292bc564612e85f47ec9102 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 09e16ed4f48371ff11093aa69a17c576c2b8d173..835aa2a36f5fe362b297049cb30ac5371f2cea0c 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 8f386bef59ed86dfa366eca5d4fccae24b28d24e..69b5f7d9a3b989387a10b8abb50ae36fc0f31b29 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 911af058463e100bc35453315919ec8bda3f2845..5fc58b565e1769faa17e5bbe7142dbbb624d297f 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 807adc55e8c85f31f5e94013e174bf8cbc5a2320..7677257f324fea7ebb24a96c9088c0ac06cadc54 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)