nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
at devShellTools-shell 113 lines 3.0 kB view raw
1{ 2 stdenv, 3 lib, 4 fetchurl, 5 callPackage, 6 patchelf, 7 makeWrapper, 8 libusb-compat-0_1, 9}: 10let 11 myPatchElf = file: '' 12 patchelf --set-interpreter \ 13 ${stdenv.cc.libc}/lib/ld-linux${lib.optionalString stdenv.hostPlatform.is64bit "-x86-64"}.so.2 \ 14 ${file} 15 ''; 16 17 udevRules = callPackage ./udev_rules_type1.nix { }; 18 19in 20stdenv.mkDerivation rec { 21 pname = "brscan4"; 22 version = "0.4.10-1"; 23 src = 24 { 25 "i686-linux" = fetchurl { 26 url = "http://download.brother.com/welcome/dlf006646/${pname}-${version}.i386.deb"; 27 sha256 = "sha256-ymIAg+rfSYP5uzsAM1hUYZacJ0PXmKEoljNtb0pgGMw="; 28 }; 29 "x86_64-linux" = fetchurl { 30 url = "https://download.brother.com/welcome/dlf006645/${pname}-${version}.amd64.deb"; 31 sha256 = "sha256-Gpr5456MCNpyam3g2qPo7S3aEZFMaUGR8bu7YmRY8xk="; 32 }; 33 } 34 ."${stdenv.hostPlatform.system}" or (throw "unsupported system ${stdenv.hostPlatform.system}"); 35 36 unpackPhase = '' 37 ar x $src 38 tar xfvz data.tar.gz 39 ''; 40 41 nativeBuildInputs = [ 42 makeWrapper 43 patchelf 44 udevRules 45 ]; 46 buildInputs = [ libusb-compat-0_1 ]; 47 dontBuild = true; 48 49 postPatch = '' 50 ${myPatchElf "opt/brother/scanner/brscan4/brsaneconfig4"} 51 52 RPATH=${libusb-compat-0_1.out}/lib 53 for a in usr/lib64/sane/*.so*; do 54 if ! test -L $a; then 55 patchelf --set-rpath $RPATH $a 56 fi 57 done 58 ''; 59 60 installPhase = '' 61 runHook preInstall 62 PATH_TO_BRSCAN4="opt/brother/scanner/brscan4" 63 mkdir -p $out/$PATH_TO_BRSCAN4 64 cp -rp $PATH_TO_BRSCAN4/* $out/$PATH_TO_BRSCAN4 65 mkdir -p $out/lib/sane 66 cp -rp usr/lib${lib.optionalString stdenv.hostPlatform.is64bit "64"}/sane/* $out/lib/sane 67 68 # Symbolic links were absolute. Fix them so that they point to $out. 69 pushd "$out/lib/sane" > /dev/null 70 for a in *.so*; do 71 if test -L $a; then 72 fixedTargetFileName="$(basename $(readlink $a))" 73 unlink "$a" 74 ln -s -T "$fixedTargetFileName" "$a" 75 fi 76 done 77 popd > /dev/null 78 79 # Generate an LD_PRELOAD wrapper to redirect execvp(), open() and open64() 80 # calls to `/opt/brother/scanner/brscan4`. 81 preload=$out/libexec/brother/scanner/brscan4/libpreload.so 82 mkdir -p $(dirname $preload) 83 gcc -shared ${./preload.c} -o $preload -ldl -DOUT=\"$out\" -fPIC 84 85 makeWrapper \ 86 "$out/$PATH_TO_BRSCAN4/brsaneconfig4" \ 87 "$out/bin/brsaneconfig4" \ 88 --set LD_PRELOAD $preload 89 90 mkdir -p $out/etc/sane.d 91 echo "brother4" > $out/etc/sane.d/dll.conf 92 93 mkdir -p $out/etc/udev/rules.d 94 cp -p ${udevRules}/etc/udev/rules.d/*.rules \ 95 $out/etc/udev/rules.d 96 runHook postInstall 97 ''; 98 99 dontStrip = true; 100 dontPatchELF = true; 101 102 meta = { 103 description = "Brother brscan4 sane backend driver"; 104 homepage = "http://www.brother.com"; 105 platforms = [ 106 "i686-linux" 107 "x86_64-linux" 108 ]; 109 sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ]; 110 license = lib.licenses.unfree; 111 maintainers = with lib.maintainers; [ jraygauthier ]; 112 }; 113}