nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
at devShellTools-shell 311 lines 9.9 kB view raw
1{ 2 stdenv, 3 lib, 4 cacert, 5 curl, 6 runCommandLocal, 7 unzip, 8 appimage-run, 9 addDriverRunpath, 10 dbus, 11 libGLU, 12 xorg, 13 buildFHSEnv, 14 buildFHSEnvChroot, 15 bash, 16 writeText, 17 ocl-icd, 18 xkeyboard_config, 19 glib, 20 libarchive, 21 libxcrypt, 22 python3, 23 aprutil, 24 makeDesktopItem, 25 copyDesktopItems, 26 jq, 27 28 studioVariant ? false, 29 30 common-updater-scripts, 31 writeShellApplication, 32}: 33 34let 35 davinci = ( 36 stdenv.mkDerivation rec { 37 pname = "davinci-resolve${lib.optionalString studioVariant "-studio"}"; 38 version = "20.0"; 39 40 nativeBuildInputs = [ 41 (appimage-run.override { buildFHSEnv = buildFHSEnvChroot; }) 42 addDriverRunpath 43 copyDesktopItems 44 unzip 45 ]; 46 47 # Pretty sure, there are missing dependencies ... 48 buildInputs = [ 49 libGLU 50 xorg.libXxf86vm 51 ]; 52 53 src = 54 runCommandLocal "${pname}-src.zip" 55 rec { 56 outputHashMode = "recursive"; 57 outputHashAlgo = "sha256"; 58 outputHash = 59 if studioVariant then 60 "sha256-q0jfP/DtroK7Dzj/BiB1JmYPihCma/OgcGmQOE/uwGY=" 61 else 62 "sha256-JM/V449KUEXuQmRpyQC2z9DRmID7hJ3Mnt5N6p/HOXA="; 63 64 impureEnvVars = lib.fetchers.proxyImpureEnvVars; 65 66 nativeBuildInputs = [ 67 curl 68 jq 69 ]; 70 71 # ENV VARS 72 SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt"; 73 74 # Get linux.downloadId from HTTP response on https://www.blackmagicdesign.com/products/davinciresolve 75 REFERID = "263d62f31cbb49e0868005059abcb0c9"; 76 DOWNLOADSURL = "https://www.blackmagicdesign.com/api/support/us/downloads.json"; 77 SITEURL = "https://www.blackmagicdesign.com/api/register/us/download"; 78 PRODUCT = "DaVinci Resolve${lib.optionalString studioVariant " Studio"}"; 79 VERSION = version; 80 81 USERAGENT = builtins.concatStringsSep " " [ 82 "User-Agent: Mozilla/5.0 (X11; Linux ${stdenv.hostPlatform.linuxArch})" 83 "AppleWebKit/537.36 (KHTML, like Gecko)" 84 "Chrome/77.0.3865.75" 85 "Safari/537.36" 86 ]; 87 88 REQJSON = builtins.toJSON { 89 "firstname" = "NixOS"; 90 "lastname" = "Linux"; 91 "email" = "someone@nixos.org"; 92 "phone" = "+31 71 452 5670"; 93 "country" = "nl"; 94 "street" = "-"; 95 "state" = "Province of Utrecht"; 96 "city" = "Utrecht"; 97 "product" = PRODUCT; 98 }; 99 100 } 101 '' 102 DOWNLOADID=$( 103 curl --silent --compressed "$DOWNLOADSURL" \ 104 | jq --raw-output '.downloads[] | .urls.Linux?[]? | select(.downloadTitle | test("^'"$PRODUCT $VERSION"'( Update)?$")) | .downloadId' 105 ) 106 echo "downloadid is $DOWNLOADID" 107 test -n "$DOWNLOADID" 108 RESOLVEURL=$(curl \ 109 --silent \ 110 --header 'Host: www.blackmagicdesign.com' \ 111 --header 'Accept: application/json, text/plain, */*' \ 112 --header 'Origin: https://www.blackmagicdesign.com' \ 113 --header "$USERAGENT" \ 114 --header 'Content-Type: application/json;charset=UTF-8' \ 115 --header "Referer: https://www.blackmagicdesign.com/support/download/$REFERID/Linux" \ 116 --header 'Accept-Encoding: gzip, deflate, br' \ 117 --header 'Accept-Language: en-US,en;q=0.9' \ 118 --header 'Authority: www.blackmagicdesign.com' \ 119 --header 'Cookie: _ga=GA1.2.1849503966.1518103294; _gid=GA1.2.953840595.1518103294' \ 120 --data-ascii "$REQJSON" \ 121 --compressed \ 122 "$SITEURL/$DOWNLOADID") 123 echo "resolveurl is $RESOLVEURL" 124 125 curl \ 126 --retry 3 --retry-delay 3 \ 127 --header "Upgrade-Insecure-Requests: 1" \ 128 --header "$USERAGENT" \ 129 --header "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" \ 130 --header "Accept-Language: en-US,en;q=0.9" \ 131 --compressed \ 132 "$RESOLVEURL" \ 133 > $out 134 ''; 135 136 # The unpack phase won't generate a directory 137 sourceRoot = "."; 138 139 installPhase = 140 let 141 appimageName = "DaVinci_Resolve_${lib.optionalString studioVariant "Studio_"}${version}_Linux.run"; 142 in 143 '' 144 runHook preInstall 145 146 export HOME=$PWD/home 147 mkdir -p $HOME 148 149 mkdir -p $out 150 test -e ${lib.escapeShellArg appimageName} 151 appimage-run ${lib.escapeShellArg appimageName} -i -y -n -C $out 152 153 mkdir -p $out/{configs,DolbyVision,easyDCP,Fairlight,GPUCache,logs,Media,"Resolve Disk Database",.crashreport,.license,.LUT} 154 runHook postInstall 155 ''; 156 157 dontStrip = true; 158 159 postFixup = '' 160 for program in $out/bin/*; do 161 isELF "$program" || continue 162 addDriverRunpath "$program" 163 done 164 165 for program in $out/libs/*; do 166 isELF "$program" || continue 167 if [[ "$program" != *"libcudnn_cnn_infer"* ]];then 168 echo $program 169 addDriverRunpath "$program" 170 fi 171 done 172 ln -s $out/libs/libcrypto.so.1.1 $out/libs/libcrypt.so.1 173 ''; 174 175 desktopItems = [ 176 (makeDesktopItem { 177 name = "davinci-resolve${lib.optionalString studioVariant "-studio"}"; 178 desktopName = "Davinci Resolve${lib.optionalString studioVariant " Studio"}"; 179 genericName = "Video Editor"; 180 exec = "davinci-resolve${lib.optionalString studioVariant "-studio"}"; 181 icon = "davinci-resolve${lib.optionalString studioVariant "-studio"}"; 182 comment = "Professional video editing, color, effects and audio post-processing"; 183 categories = [ 184 "AudioVideo" 185 "AudioVideoEditing" 186 "Video" 187 "Graphics" 188 ]; 189 }) 190 ]; 191 } 192 ); 193in 194buildFHSEnv { 195 inherit (davinci) pname version; 196 197 targetPkgs = 198 pkgs: with pkgs; [ 199 alsa-lib 200 aprutil 201 bzip2 202 davinci 203 dbus 204 expat 205 fontconfig 206 freetype 207 glib 208 libGL 209 libGLU 210 libarchive 211 libcap 212 librsvg 213 libtool 214 libuuid 215 libxcrypt # provides libcrypt.so.1 216 libxkbcommon 217 nspr 218 ocl-icd 219 opencl-headers 220 python3 221 python3.pkgs.numpy 222 udev 223 xdg-utils # xdg-open needed to open URLs 224 xorg.libICE 225 xorg.libSM 226 xorg.libX11 227 xorg.libXcomposite 228 xorg.libXcursor 229 xorg.libXdamage 230 xorg.libXext 231 xorg.libXfixes 232 xorg.libXi 233 xorg.libXinerama 234 xorg.libXrandr 235 xorg.libXrender 236 xorg.libXt 237 xorg.libXtst 238 xorg.libXxf86vm 239 xorg.libxcb 240 xorg.xcbutil 241 xorg.xcbutilimage 242 xorg.xcbutilkeysyms 243 xorg.xcbutilrenderutil 244 xorg.xcbutilwm 245 xorg.xkeyboardconfig 246 zlib 247 ]; 248 249 extraPreBwrapCmds = lib.optionalString studioVariant '' 250 mkdir -p ~/.local/share/DaVinciResolve/license || exit 1 251 ''; 252 253 extraBwrapArgs = lib.optionals studioVariant [ 254 "--bind \"$HOME\"/.local/share/DaVinciResolve/license ${davinci}/.license" 255 ]; 256 257 runScript = "${bash}/bin/bash ${writeText "davinci-wrapper" '' 258 export QT_XKB_CONFIG_ROOT="${xkeyboard_config}/share/X11/xkb" 259 export QT_PLUGIN_PATH="${davinci}/libs/plugins:$QT_PLUGIN_PATH" 260 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib:/usr/lib32:${davinci}/libs 261 ${davinci}/bin/resolve 262 ''}"; 263 264 extraInstallCommands = '' 265 mkdir -p $out/share/applications $out/share/icons/hicolor/128x128/apps 266 ln -s ${davinci}/share/applications/*.desktop $out/share/applications/ 267 ln -s ${davinci}/graphics/DV_Resolve.png $out/share/icons/hicolor/128x128/apps/davinci-resolve${lib.optionalString studioVariant "-studio"}.png 268 ''; 269 270 passthru = { 271 inherit davinci; 272 updateScript = lib.getExe (writeShellApplication { 273 name = "update-davinci-resolve"; 274 runtimeInputs = [ 275 curl 276 jq 277 common-updater-scripts 278 ]; 279 text = '' 280 set -o errexit 281 drv=pkgs/by-name/da/davinci-resolve/package.nix 282 currentVersion=${lib.escapeShellArg davinci.version} 283 downloadsJSON="$(curl --fail --silent https://www.blackmagicdesign.com/api/support/us/downloads.json)" 284 285 latestLinuxVersion="$(echo "$downloadsJSON" | jq '[.downloads[] | select(.urls.Linux) | .urls.Linux[] | select(.downloadTitle | test("DaVinci Resolve")) | .downloadTitle]' | grep -oP 'DaVinci Resolve \K\d+\.\d+(\.\d+)?' | sort | tail -n 1)" 286 update-source-version davinci-resolve "$latestLinuxVersion" --source-key=davinci.src 287 288 # Since the standard and studio both use the same version we need to reset it before updating studio 289 sed -i -e "s/""$latestLinuxVersion""/""$currentVersion""/" "$drv" 290 291 latestStudioLinuxVersion="$(echo "$downloadsJSON" | jq '[.downloads[] | select(.urls.Linux) | .urls.Linux[] | select(.downloadTitle | test("DaVinci Resolve")) | .downloadTitle]' | grep -oP 'DaVinci Resolve Studio \K\d+\.\d+(\.\d+)?' | sort | tail -n 1)" 292 update-source-version davinci-resolve-studio "$latestStudioLinuxVersion" --source-key=davinci.src 293 ''; 294 }); 295 }; 296 297 meta = with lib; { 298 description = "Professional video editing, color, effects and audio post-processing"; 299 homepage = "https://www.blackmagicdesign.com/products/davinciresolve"; 300 license = licenses.unfree; 301 maintainers = with maintainers; [ 302 amarshall 303 jshcmpbll 304 orivej 305 XBagon 306 ]; 307 platforms = [ "x86_64-linux" ]; 308 sourceProvenance = with sourceTypes; [ binaryNativeCode ]; 309 mainProgram = "davinci-resolve${lib.optionalString studioVariant "-studio"}"; 310 }; 311}