canon-cups-ufr2: fix library patching; use proot to enable cnsetuputil2 (#156090)

dmayle c30f25ff b5420031

Changed files
+50 -7
pkgs
misc
cups
drivers
canon
+50 -7
pkgs/misc/cups/drivers/canon/default.nix
···
{ lib
, stdenv
+
, stdenv_32bit
, fetchurl
, unzip
, autoconf
···
, jbigkit
, glib
, gtk3
+
, gdk-pixbuf
+
, pango
+
, cairo
+
, coreutils
+
, atk
, pkg-config
, gnome2
, libxml2
+
, runtimeShell
+
, proot
, ghostscript
+
, pkgs
, pkgsi686Linux
, zlib
}:
···
let
i686_NIX_GCC = pkgsi686Linux.callPackage ({ gcc }: gcc) { };
+
ld32 =
+
if stdenv.hostPlatform.system == "x86_64-linux" then "${stdenv.cc}/nix-support/dynamic-linker-m32"
+
else if stdenv.hostPlatform.system == "i686-linux" then "${stdenv.cc}/nix-support/dynamic-linker"
+
else throw "Unsupported platform for Canon UFR2 Drivers: ${stdenv.hostPlatform.system}";
+
ld64 = "${stdenv.cc}/nix-support/dynamic-linker";
+
libs = pkgs: lib.makeLibraryPath buildInputs;
version = "5.40";
dl = "6/0100009236/10";
···
sha256 = "sha256:069z6ijmql62mcdyxnzc9mf0dxa6z1107cd0ab4i1adk8kr3d75k";
};
+
buildInputs = [ cups zlib jbigkit glib gtk3 pkg-config gnome2.libglade libxml2 gdk-pixbuf pango cairo atk ];
+
in
-
stdenv.mkDerivation {
+
stdenv.mkDerivation rec {
pname = "canon-cups-ufr2";
inherit version;
src = src_canon;
···
nativeBuildInputs = [ makeWrapper unzip autoconf automake libtool_1_5 ];
-
buildInputs = [ cups zlib jbigkit glib gtk3 pkg-config gnome2.libglade libxml2 ];
+
inherit buildInputs;
installPhase = ''
runHook preInstall
···
cd cnrdrvcups-lb-${version}
./allgen.sh
make install
+
+
mkdir -p $out/share/cups/model
+
install -m 644 ppd/*.ppd $out/share/cups/model/
)
(
cd lib
···
install -m 755 libs64/intel/cnpkbidir $out/bin
install -m 755 libs64/intel/cnpkmoduleufr2r $out/bin
install -m 755 libs64/intel/cnrsdrvufr2 $out/bin
-
install -m 755 libs64/intel/cnsetuputil2 $out/bin
+
install -m 755 libs64/intel/cnsetuputil2 $out/bin/cnsetuputil2
mkdir -p $out/share/cnpkbidir
install -m 644 libs64/intel/cnpkbidir_info* $out/share/cnpkbidir
···
(
cd $out/lib32
ln -sf libcaepcmufr2.so.1.0 libcaepcmufr2.so
+
ln -sf libcaepcmufr2.so.1.0 libcaepcmufr2.so.1
ln -sf libcaiowrapufr2.so.1.0.0 libcaiowrapufr2.so
ln -sf libcaiowrapufr2.so.1.0.0 libcaiowrapufr2.so.1
ln -sf libcanon_slimufr2.so.1.0.0 libcanon_slimufr2.so
ln -sf libcanon_slimufr2.so.1.0.0 libcanon_slimufr2.so.1
ln -sf libufr2filterr.so.1.0.0 libufr2filterr.so
ln -sf libufr2filterr.so.1.0.0 libufr2filterr.so.1
+
+
patchelf --set-rpath "$(cat ${i686_NIX_GCC}/nix-support/orig-cc)/lib:${libs pkgsi686Linux}:${stdenv_32bit.glibc.out}/lib:${pkgsi686Linux.libxml2.out}/lib:$out/lib32" libcanonufr2r.so.1.0.0
+
patchelf --set-rpath "$(cat ${i686_NIX_GCC}/nix-support/orig-cc)/lib:${libs pkgsi686Linux}:${stdenv_32bit.glibc.out}/lib" libcaepcmufr2.so.1.0
+
patchelf --set-rpath "$(cat ${i686_NIX_GCC}/nix-support/orig-cc)/lib:${libs pkgsi686Linux}:${stdenv_32bit.glibc.out}/lib" libColorGearCufr2.so.2.0.0
)
(
cd $out/lib
ln -sf libcaepcmufr2.so.1.0 libcaepcmufr2.so
+
ln -sf libcaepcmufr2.so.1.0 libcaepcmufr2.so.1
ln -sf libcaiowrapufr2.so.1.0.0 libcaiowrapufr2.so
ln -sf libcaiowrapufr2.so.1.0.0 libcaiowrapufr2.so.1
ln -sf libcanon_slimufr2.so.1.0.0 libcanon_slimufr2.so
ln -sf libcanon_slimufr2.so.1.0.0 libcanon_slimufr2.so.1
ln -sf libufr2filterr.so.1.0.0 libufr2filterr.so
ln -sf libufr2filterr.so.1.0.0 libufr2filterr.so.1
+
+
patchelf --set-rpath "$(cat $NIX_CC/nix-support/orig-cc)/lib:${libs pkgs}:${stdenv.cc.cc.lib}/lib64:${stdenv.glibc.out}/lib64:$out/lib" libcanonufr2r.so.1.0.0
+
patchelf --set-rpath "$(cat $NIX_CC/nix-support/orig-cc)/lib:${libs pkgs}:${stdenv.cc.cc.lib}/lib64:${stdenv.glibc.out}/lib64" libcaepcmufr2.so.1.0
+
patchelf --set-rpath "$(cat $NIX_CC/nix-support/orig-cc)/lib:${libs pkgs}:${stdenv.cc.cc.lib}/lib64:${stdenv.glibc.out}/lib64" libColorGearCufr2.so.2.0.0
)
-
# Perhaps patch the lib64 version as well???
-
patchelf --set-rpath "$(cat ${i686_NIX_GCC}/nix-support/orig-cc)/lib" $out/lib32/libColorGearCufr2.so.2.0.0
+
(
+
cd $out/bin
+
patchelf --set-interpreter "$(cat ${ld64})" --set-rpath "${lib.makeLibraryPath buildInputs}:${stdenv.cc.cc.lib}/lib64:${stdenv.glibc.out}/lib64" cnsetuputil2
+
patchelf --set-interpreter "$(cat ${ld64})" --set-rpath "${lib.makeLibraryPath buildInputs}:${stdenv.cc.cc.lib}/lib64:${stdenv.glibc.out}/lib64" cnpdfdrv
+
patchelf --set-interpreter "$(cat ${ld64})" --set-rpath "${lib.makeLibraryPath buildInputs}:${stdenv.cc.cc.lib}/lib64:${stdenv.glibc.out}/lib64:$out/lib" cnpkbidir
+
patchelf --set-interpreter "$(cat ${ld64})" --set-rpath "${lib.makeLibraryPath buildInputs}:${stdenv.cc.cc.lib}/lib64:${stdenv.glibc.out}/lib64:$out/lib" cnrsdrvufr2
+
+
mv cnsetuputil2 cnsetuputil2.wrapped
+
echo "#!${runtimeShell} -e" > cnsetuputil2
+
echo "exec ${proot}/bin/proot -b $out/usr/share/cnsetuputil2:/usr/share/cnsetuputil2 -b ${coreutils}/bin/ls:/bin/ls -b ${cups}/share:/usr/share/cups $out/bin/cnsetuputil2.wrapped" > cnsetuputil2
+
chmod +x cnsetuputil2
+
)
(
cd lib/data/ufr2
···
install -m 644 CnLB* $out/share/caepcm
)
-
mkdir -p $out/share/cups/model
-
install -m 644 cnrdrvcups-lb-${version}/ppd/*.ppd $out/share/cups/model/
+
(
+
cd cnrdrvcups-utility-${version}/data
+
mkdir -p $out/usr/share/cnsetuputil2
+
install -m 644 cnsetuputil* $out/usr/share/cnsetuputil2
+
)
makeWrapper "${ghostscript}/bin/gs" "$out/bin/gs" \
--prefix LD_LIBRARY_PATH ":" "$out/lib" \