1{ 2 deviceNameStrategy, 3 glibc, 4 jq, 5 lib, 6 mounts, 7 nvidia-container-toolkit, 8 nvidia-driver, 9 runtimeShell, 10 writeScriptBin, 11}: 12let 13 mkMount = 14 { 15 hostPath, 16 containerPath, 17 mountOptions, 18 }: 19 { 20 inherit hostPath containerPath; 21 options = mountOptions; 22 }; 23 mountToCommand = 24 mount: 25 "additionalMount \"${mount.hostPath}\" \"${mount.containerPath}\" '${builtins.toJSON mount.mountOptions}'"; 26 mountsToCommands = 27 mounts: 28 if (builtins.length mounts) == 0 then 29 "cat" 30 else 31 (lib.strings.concatMapStringsSep " | \\\n" mountToCommand mounts); 32in 33writeScriptBin "nvidia-cdi-generator" '' 34 #! ${runtimeShell} 35 36 function cdiGenerate { 37 ${lib.getExe' nvidia-container-toolkit "nvidia-ctk"} cdi generate \ 38 --format json \ 39 --device-name-strategy ${deviceNameStrategy} \ 40 --ldconfig-path ${lib.getExe' glibc "ldconfig"} \ 41 --library-search-path ${lib.getLib nvidia-driver}/lib \ 42 --nvidia-cdi-hook-path ${lib.getExe' nvidia-container-toolkit.tools "nvidia-cdi-hook"} 43 } 44 45 function additionalMount { 46 local hostPath="$1" 47 local containerPath="$2" 48 local mountOptions="$3" 49 if [ -e "$hostPath" ]; then 50 ${lib.getExe jq} ".containerEdits.mounts[.containerEdits.mounts | length] = { \"hostPath\": \"$hostPath\", \"containerPath\": \"$containerPath\", \"options\": $mountOptions }" 51 else 52 echo "Mount $hostPath ignored: could not find path in the host machine" >&2 53 cat 54 fi 55 } 56 57 cdiGenerate | 58 ${mountsToCommands mounts} > $RUNTIME_DIRECTORY/nvidia-container-toolkit.json 59''