summary refs log tree commit diff
path: root/pkgs/misc
diff options
context:
space:
mode:
authorDoron Behar <doron.behar@gmail.com>2022-11-06 22:25:55 +0000
committerGitHub <noreply@github.com>2022-11-06 22:25:55 +0000
commitc568890eb8092999ecc1c762945e3bdc4621d7ef (patch)
treea107475342c15ed6eaedbe1fa82d4f42539978f3 /pkgs/misc
parentb8a57555e58b438459d86d24d4dccba1ca55b33d (diff)
parent0d36fdc66bb40f9471e63d41c4f2246da1e8e5ea (diff)
Merge pull request #133537 from Yarny0/foomatic-db
foomatic-db ppd files
Diffstat (limited to 'pkgs/misc')
-rw-r--r--pkgs/misc/cups/drivers/cups-drv-rastertosag-gdi/default.nix9
-rw-r--r--pkgs/misc/cups/drivers/foomatic-db-engine/default.nix94
-rw-r--r--pkgs/misc/cups/drivers/foomatic-db-nonfree/default.nix86
-rw-r--r--pkgs/misc/cups/drivers/foomatic-db-ppds/default.nix122
-rw-r--r--pkgs/misc/cups/drivers/foomatic-db/default.nix102
-rw-r--r--pkgs/misc/cups/drivers/kyocera/default.nix21
-rw-r--r--pkgs/misc/cups/drivers/samsung/1.00.36/default.nix3
-rw-r--r--pkgs/misc/cups/drivers/samsung/1.00.37.nix3
-rw-r--r--pkgs/misc/cups/drivers/samsung/4.01.17.nix27
9 files changed, 452 insertions, 15 deletions
diff --git a/pkgs/misc/cups/drivers/cups-drv-rastertosag-gdi/default.nix b/pkgs/misc/cups/drivers/cups-drv-rastertosag-gdi/default.nix
index d491436554593..4f1ad6c9911e5 100644
--- a/pkgs/misc/cups/drivers/cups-drv-rastertosag-gdi/default.nix
+++ b/pkgs/misc/cups/drivers/cups-drv-rastertosag-gdi/default.nix
@@ -3,6 +3,7 @@
 , fetchpatch
 , cups
 , python3Packages
+, patchPpdFilesHook
 }:
 
 python3Packages.buildPythonApplication rec {
@@ -20,9 +21,9 @@ python3Packages.buildPythonApplication rec {
     })
   ];
   format = "other";
-  nativeBuildInputs = [ (lib.getBin cups) ];
+  nativeBuildInputs = [ (lib.getBin cups) patchPpdFilesHook ];
   # The source image also brings pre-built ppd files,
-  # be we prefer to generate from source where possible, so
+  # but we prefer to generate from source where possible, so
   # the following line generates ppd files from the drv file.
   postBuild = ''
     ppdc -v -d . -I "${cups}/share/cups/ppdc" rastertosag-gdi.drv
@@ -35,6 +36,10 @@ python3Packages.buildPythonApplication rec {
     ln -vst "${placeholder "out"}/lib/cups/filter/" "${placeholder "out"}/bin/rastertosag-gdi"
     runHook postInstall
   '';
+  ppdFileCommands = [ "rastertosag-gdi" ];
+  postFixup = ''
+    gzip -9nv "${placeholder "out"}/share/cups/model/rastertosag-gdi"/*.ppd
+  '';
   meta = {
     description = "CUPS driver for Ricoh Aficio SP 1000S and SP 1100S printers";
     downloadPage = "https://www.openprinting.org/download/printing/rastertosag-gdi/";
diff --git a/pkgs/misc/cups/drivers/foomatic-db-engine/default.nix b/pkgs/misc/cups/drivers/foomatic-db-engine/default.nix
new file mode 100644
index 0000000000000..b5e107ebf37f4
--- /dev/null
+++ b/pkgs/misc/cups/drivers/foomatic-db-engine/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, perlPackages
+, fetchFromGitHub
+, withCupsAccess ? false  # needed to access local cups server
+, cups
+, cups-filters
+, curl
+, withSocketAccess ? false  # needed to access network printers
+, netcat-gnu
+, withSMBAccess ? false  # needed to access SMB-connected printers
+, samba
+, autoconf
+, automake
+, file
+, makeWrapper
+}:
+
+perlPackages.buildPerlPackage {
+  pname = "foomatic-db-engine";
+  version = "unstable-2022-05-03";
+
+  src = fetchFromGitHub {
+    # there is also a daily snapshot at the `downloadPage`,
+    # but it gets deleted quickly and would provoke 404 errors
+    owner = "OpenPrinting";
+    repo = "foomatic-db-engine";
+    rev = "2e6f14b54748fa121a4d2e3d480010e10b070c5a";
+    hash = "sha256-m7FQTxWmawbtm24h8UqznGKXgX41JhOtyyFMRwEhm5k=";
+  };
+
+  outputs = [ "out" ];
+
+  propagatedBuildInputs = [
+    perlPackages.Clone
+    perlPackages.DBI
+    perlPackages.XMLLibXML
+  ];
+
+  buildInputs =
+       # provide some "cups-*" commands to `foomatic-{configure,printjob}`
+       # so that they can manage a local cups server (add queues, add jobs...)
+       lib.optionals withCupsAccess [ cups cups-filters curl ]
+       # the commands `foomatic-{configure,getpjloptions}` need
+       # netcat if they are used to query or alter a network
+       # printer via AppSocket/HP JetDirect protocol
+    ++ lib.optional withSocketAccess netcat-gnu
+       # `foomatic-configure` can be used to access printers that are
+       # shared via the SMB protocol, but it needs the `smbclient` binary
+    ++ lib.optional withSMBAccess samba
+  ;
+
+  nativeBuildInputs = [ autoconf automake file makeWrapper ];
+
+  # sed-substitute indirection is more robust against
+  # characters in paths that might need escaping
+  prePatch = ''
+    sed -Ei 's|^(S?BINSEARCHPATH=).+$|\1"@PATH@"|g' configure.ac
+    substituteInPlace configure.ac --subst-var PATH
+    touch Makefile.PL  # `buildPerlPackage` fails unless this exists
+  '';
+
+  preConfigure = ''
+    ./make_configure
+  '';
+
+  configureFlags = [
+    "--sysconfdir=${placeholder "out"}/etc"
+    "LIBDIR=${placeholder "out"}/share/foomatic"
+    "PERLPREFIX=${placeholder "out"}"
+  ];
+
+  postFixup = ''
+    for bin in "${placeholder "out"}/bin"/*; do
+      test '!' -L "$bin" || continue  # skip symlink
+      wrapProgram "$bin" --set PERL5LIB "$PERL5LIB"
+    done
+  '';
+
+  doCheck = false;  # no tests, would fail
+
+  meta = {
+    description = "OpenPrinting printer support database engine";
+    downloadPage = "https://www.openprinting.org/download/foomatic/";
+    homepage = "https://openprinting.github.io/projects/02-foomatic/";
+    license = lib.licenses.gpl2Only;
+    maintainers = [ lib.maintainers.yarny ];
+    longDescription = ''
+      Foomatic's database engine generates PPD files
+      from the data in Foomatic's XML database.
+      It also contains scripts to directly
+      generate print queues and handle jobs.
+    '';
+  };
+}
diff --git a/pkgs/misc/cups/drivers/foomatic-db-nonfree/default.nix b/pkgs/misc/cups/drivers/foomatic-db-nonfree/default.nix
new file mode 100644
index 0000000000000..1c38ae38b98a8
--- /dev/null
+++ b/pkgs/misc/cups/drivers/foomatic-db-nonfree/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, autoconf
+, automake
+, perl
+}:
+
+stdenv.mkDerivation {
+  pname = "foomatic-db-nonfree";
+  version = "unstable-2015-06-05";
+
+  src = fetchFromGitHub {
+    # there is also a daily snapshot at the `downloadPage`,
+    # but it gets deleted quickly and would provoke 404 errors
+    owner = "OpenPrinting";
+    repo = "foomatic-db-nonfree";
+    rev = "6ddae02ac89240c019f8b5026cfe70e30fd2b3db";
+    hash = "sha256-cRZH0CXg03FEqUJdxaNnPVXjf8+ct86PjhL59WQbw60=";
+  };
+
+  nativeBuildInputs = [ autoconf automake perl ];
+
+  # sed-substitute indirection is more robust against
+  # characters in paths that might need escaping
+  postPatch = ''
+    sed -Ei -e 's|^(S?BINSEARCHPATH=).+$|\1"@PATH@"|g'  \
+      -e 's|^(DATASEARCHPATH=).+$|\1"@DATA@"|g' configure.ac
+    substituteInPlace configure.ac  \
+      --subst-var PATH  \
+      --subst-var-by DATA "${placeholder "out"}/share"
+  '';
+
+  preConfigure = ''
+    mkdir -p "${placeholder "out"}/share/foomatic/db/source"
+    ./make_configure
+  '';
+
+  # make ppd files available to cups,
+  # use a package-specific subdirectory to avoid
+  # conflicts with other ppd-containing packages
+  postInstall = ''
+    if ! [[ -d "${placeholder "out"}/share/foomatic/db/source/PPD" ]]; then
+        echo "failed to create share/foomatic/db/source/PPD"
+        exit 1
+    fi
+    mkdir -p "${placeholder "out"}/share/cups/model"
+    ln -s "${placeholder "out"}/share/foomatic/db/source/PPD"  \
+      "${placeholder "out"}/share/cups/model/foomatic-db-nonfree"
+  '';
+
+  # we might patch ppd file commands with `patchPpdFilesHook`,
+  # but the only command "rastertophaser6100" isn't packaged yet
+
+  # compress ppd files
+  postFixup = ''
+    echo 'compressing ppd files'
+    find -H "${placeholder "out"}/share/cups/model/foomatic-db-nonfree" -type f -iname '*.ppd' -print0  \
+      | xargs -0r -n 64 -P "$NIX_BUILD_CORES" gzip -9n
+  '';
+
+  meta = {
+    description = "OpenPrinting printer support database (unfree content)";
+    downloadPage = "https://www.openprinting.org/download/foomatic/";
+    homepage = "https://openprinting.github.io/projects/02-foomatic/";
+    license = lib.licenses.unfree;
+    maintainers = [ lib.maintainers.yarny ];
+    # list printer manufacturers here so people
+    # searching for ppd files can find this package
+    longDescription = ''
+      The collected knowledge about printers,
+      drivers, and driver options in XML files,
+      used by `foomatic-db-engine` to generate PPD files.
+      This is a package of PPD and Foomatic XML files
+      that may have restrictions that keep them
+      from being used on a variety of machines
+      for licensing and other non-technical reasons.
+      The XML files in this package enable `foomatic-db-ppds`
+      to create about 120 additional PPD files, for printer from
+      Dell, Genicom, Lexmark, Oce, Tektronix and Xerox.
+      Besides the XML files, this package contains
+      about 130 PPD files, for printers from
+      Dell, Genicom, Lexmark, Oce and Xerox.
+    '';
+  };
+}
diff --git a/pkgs/misc/cups/drivers/foomatic-db-ppds/default.nix b/pkgs/misc/cups/drivers/foomatic-db-ppds/default.nix
new file mode 100644
index 0000000000000..bdc1e0a9b5feb
--- /dev/null
+++ b/pkgs/misc/cups/drivers/foomatic-db-ppds/default.nix
@@ -0,0 +1,122 @@
+{ lib
+, foomatic-db
+, foomatic-db-nonfree
+, buildEnv
+, foomatic-db-engine
+, stdenv
+, cups-filters
+, ghostscript
+, netpbm
+, perl
+, psutils
+, patchPpdFilesHook
+, withNonfreeDb ? false  # include foomatic-db-nonfree ppd files
+}:
+
+let
+  foomatic-db-packages = [ foomatic-db ] ++
+    lib.lists.optional withNonfreeDb foomatic-db-nonfree;
+
+  foomatic-db-combined = buildEnv {
+    name = "foomatic-db-combined";
+    paths = foomatic-db-packages;
+    pathsToLink = [ "/share/foomatic" ];
+    # `foomatic-db-combined` is a nativeBuildInput of `foomatic-db-ppds`.
+    # The setup hook defined here helps scripts in
+    # `foomatic-db-engine` to find the database.
+    postBuild = ''
+      mkdir -p "${placeholder "out"}"/{etc/cups,nix-support}
+      cat  >> "${placeholder "out"}/nix-support/setup-hook"  << eof
+      export FOOMATICDB="${placeholder "out"}/share/foomatic"
+      eof
+    '';
+  };
+
+  # the effective license is `free` if all database
+  # packages have free licenses, `unfree` otherwise
+  isFree = lib.trivial.pipe foomatic-db-packages [
+    (lib.lists.map (lib.attrsets.attrByPath [ "meta" "license" ] lib.licenses.unfree))
+    (lib.lists.all (lib.attrsets.attrByPath [ "free" ] true))
+  ];
+in
+
+stdenv.mkDerivation {
+  pname = "foomatic-db-ppds";
+  # the effective version is simply the
+  # highest version of all database packages
+  version = lib.trivial.pipe foomatic-db-packages [
+    (lib.lists.map (lib.attrsets.getAttr "version"))
+    (lib.lists.sort lib.strings.versionOlder)
+    lib.lists.reverseList
+    lib.lists.head
+  ];
+
+  buildInputs = [
+    cups-filters
+    ghostscript
+    netpbm
+    perl
+    psutils
+  ];
+
+  nativeBuildInputs = [
+    foomatic-db-combined
+    foomatic-db-engine
+    patchPpdFilesHook
+  ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p "${placeholder "out"}/share/cups/model"
+    foomatic-compiledb -j "$NIX_BUILD_CORES" -d "${placeholder "out"}/share/cups/model/foomatic-db-ppds"
+    runHook postInstall
+  '';
+
+  # Comments indicate the respective
+  # package the command is contained in.
+  ppdFileCommands = [
+    "cat" "echo"  # coreutils
+    "foomatic-rip"  # cups-filters or foomatic-filters
+    "gs"  # ghostscript
+    "pnmflip" "pnmgamma" "pnmnoraw"  # netpbm
+    "perl"  # perl
+    "psresize"  # psutils
+    # These commands aren't packaged yet.
+    # ppd files using these likely won't work.
+    #"c2050" "c2070" "cjet" "lm1100"
+    #"pbm2l2030" "pbm2lwxl" "rastertophaser6100"
+  ];
+
+  # compress ppd files
+  postFixup = ''
+    echo 'compressing ppd files'
+    find -H "${placeholder "out"}/share/cups/model/foomatic-db-ppds" -type f -iname '*.ppd' -print0  \
+      | xargs -0r -n 64 -P "$NIX_BUILD_CORES" gzip -9n
+  '';
+
+  meta = {
+    description = "OpenPrinting ppd files";
+    homepage = "https://openprinting.github.io/projects/02-foomatic/";
+    license = if isFree then lib.licenses.free else lib.licenses.unfree;
+    maintainers = [ lib.maintainers.yarny ];
+    # list printer manufacturers here so people
+    # searching for ppd files can find this package
+    longDescription = ''
+      All PPD files available in
+      OpenPrinting's Foomatic database.
+      This package contains about 8,800 PPD files,
+      for printers from
+      Alps, Anitech, Apollo, Apple, Avery, Brother, Canon,
+      Citizen, CItoh, Compaq, DEC, Dell, Dymo-CoStar, Epson,
+      Fujitsu, FujiXerox, Generic, Genicom, Gestetner,
+      Heidelberg, Hitachi, HP, IBM, Imagen, Imagistics,
+      InfoPrint, Infotec, Kodak, KONICAMINOLTA, Kyocera, Lanier,
+      Lexmark, Minolta, MinoltaQMS, Mitsubishi, NEC, NRG, Oce,
+      Oki, Olivetti, Panasonic, PCPI, Pentax, QMS, Raven, Ricoh,
+      Samsung, Savin, Seiko, Sharp, SiPix, Sony, Star, Tally,
+      Tektronix, TexasInstruments, Toshiba, Xante and Xerox.
+    '';
+  };
+}
diff --git a/pkgs/misc/cups/drivers/foomatic-db/default.nix b/pkgs/misc/cups/drivers/foomatic-db/default.nix
new file mode 100644
index 0000000000000..dd76fb1ee05b4
--- /dev/null
+++ b/pkgs/misc/cups/drivers/foomatic-db/default.nix
@@ -0,0 +1,102 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cups
+, cups-filters
+, ghostscript
+, gnused
+, perl
+, autoconf
+, automake
+, patchPpdFilesHook
+}:
+
+stdenv.mkDerivation {
+  pname = "foomatic-db";
+  version = "unstable-2022-10-03";
+
+  src = fetchFromGitHub {
+    # there is also a daily snapshot at the `downloadPage`,
+    # but it gets deleted quickly and would provoke 404 errors
+    owner = "OpenPrinting";
+    repo = "foomatic-db";
+    rev = "2a3c4d1bf7eadc42f936ce8989c1dd2973ea9669";
+    hash = "sha256-in0/j1nAQvM0NowBIBx3jj5WVMPIfZAeAk1SkuA3tjA=";
+  };
+
+  buildInputs = [ cups cups-filters ghostscript gnused perl ];
+
+  nativeBuildInputs = [ autoconf automake patchPpdFilesHook perl ];
+
+  # sed-substitute indirection is more robust
+  # against characters in paths that might need escaping
+  postPatch = ''
+    sed -Ei -e 's|^(S?BINSEARCHPATH=).+$|\1"@PATH@"|g'  \
+      -e 's|^(DATASEARCHPATH=).+$|\1"@DATA@"|g' configure.ac
+    substituteInPlace configure.ac  \
+      --subst-var PATH  \
+      --subst-var-by DATA "${placeholder "out"}/share"
+  '';
+
+  preConfigure = ''
+    mkdir -p "${placeholder "out"}/share/foomatic/db/source"
+    ./make_configure
+  '';
+
+  # don't let the intaller gzip ppd files as we would
+  # have to unzip them later in order to patch them
+  configureFlags = [ "--disable-gzip-ppds" ];
+
+  # make ppd files available to cups,
+  # use a package-specific subdirectory to avoid
+  # conflicts with other ppd-containing packages
+  postInstall = ''
+    if ! [[ -d "${placeholder "out"}/share/foomatic/db/source/PPD" ]]; then
+        echo "failed to create share/foomatic/db/source/PPD"
+        exit 1
+    fi
+    mkdir -p "${placeholder "out"}/share/cups/model"
+    ln -s "${placeholder "out"}/share/foomatic/db/source/PPD"  \
+      "${placeholder "out"}/share/cups/model/foomatic-db"
+  '';
+
+  # Comments indicate the respective
+  # package the command is contained in.
+  ppdFileCommands = [
+    "cat" "date" "printf"  # coreutils
+    "rastertohp"  # cups
+    "foomatic-rip"  # cups-filters or foomatic-filters
+    "gs"  # ghostscript
+    "sed"  # gnused
+    "perl"  # perl
+  ];
+
+  # compress ppd files
+  postFixup = ''
+    echo 'compressing ppd files'
+    find -H "${placeholder "out"}/share/cups/model/foomatic-db" -type f -iname '*.ppd' -print0  \
+      | xargs -0r -n 64 -P "$NIX_BUILD_CORES" gzip -9n
+  '';
+
+  meta = {
+    description = "OpenPrinting printer support database (free content)";
+    downloadPage = "https://www.openprinting.org/download/foomatic/";
+    homepage = "https://openprinting.github.io/projects/02-foomatic/";
+    license = lib.licenses.free;  # mostly GPL and MIT, see README in source dir
+    maintainers = [ lib.maintainers.yarny ];
+    # list printer manufacturers here so people
+    # searching for ppd files can find this package
+    longDescription = ''
+      The collected knowledge about printers,
+      drivers, and driver options in XML files,
+      used by `foomatic-db-engine` to generate PPD files.
+      PPD files generated from the XML files in this package
+      are contained in the package 'foomatic-db-ppds'.
+      Besides the XML files, this package contains
+      about 6,600 PPD files, for printers from
+      Brother, Canon, Epson, Gestetner, HP, InfoPrint,
+      Infotec, KONICA_MINOLTA, Kyocera, Lanier, Lexmark, NRG,
+      Oce, Oki, Ricoh, Samsung, Savin, Sharp, Toshiba and Utax.
+    '';
+  };
+}
diff --git a/pkgs/misc/cups/drivers/kyocera/default.nix b/pkgs/misc/cups/drivers/kyocera/default.nix
index 28b2a1281761e..0a560e3188f63 100644
--- a/pkgs/misc/cups/drivers/kyocera/default.nix
+++ b/pkgs/misc/cups/drivers/kyocera/default.nix
@@ -1,4 +1,9 @@
-{ stdenv, lib, fetchzip, cups }:
+{ lib
+, stdenv
+, cups
+, fetchzip
+, patchPpdFilesHook
+}:
 
 let
   platform =
@@ -23,7 +28,11 @@ stdenv.mkDerivation {
     sha256 = "0z1pbgidkibv4j21z0ys8cq1lafc6687syqa07qij2qd8zp15wiz";
   };
 
+  nativeBuildInputs = [ patchPpdFilesHook ];
+
   installPhase = ''
+    runHook preInstall
+
     tar -xvf ${platform}/Global/English.tar.gz
     install -Dm755 English/rastertokpsl $out/lib/cups/filter/rastertokpsl
     patchelf \
@@ -33,13 +42,13 @@ stdenv.mkDerivation {
 
     mkdir -p $out/share/cups/model/Kyocera
     cd English
-    for i in *.ppd; do
-      sed -i $i -e \
-        "s,/usr/lib/cups/filter/rastertokpsl,$out/lib/cups/filter/rastertokpsl,g"
-      cp $i $out/share/cups/model/Kyocera
-    done;
+    cp *.ppd $out/share/cups/model/Kyocera
+
+    runHook postInstall
   '';
 
+  ppdFileCommands = [ "rastertokpsl" ];
+
   meta = with lib; {
     description = "CUPS drivers for several Kyocera FS-{1020,1025,1040,1060,1120,1125} printers";
     homepage = "https://www.kyoceradocumentsolutions.ru/index/service_support/download_center.false.driver.FS1040._.EN.html#";
diff --git a/pkgs/misc/cups/drivers/samsung/1.00.36/default.nix b/pkgs/misc/cups/drivers/samsung/1.00.36/default.nix
index fac3dfccba620..47700265231f2 100644
--- a/pkgs/misc/cups/drivers/samsung/1.00.36/default.nix
+++ b/pkgs/misc/cups/drivers/samsung/1.00.36/default.nix
@@ -23,6 +23,7 @@ in stdenv.mkDerivation rec {
   ];
 
   installPhase = ''
+    runHook preInstall
 
     mkdir -p $out/bin
     cp -R ${arch}/{gettext,pstosecps,rastertospl,smfpnetdiscovery,usbresetter} $out/bin
@@ -82,6 +83,8 @@ in stdenv.mkDerivation rec {
     cd $out/share/cups
     ln -s ../ppd .
     ln -s ppd model
+
+    runHook postInstall
   '';
 
   preFixup = ''
diff --git a/pkgs/misc/cups/drivers/samsung/1.00.37.nix b/pkgs/misc/cups/drivers/samsung/1.00.37.nix
index 0aab52eac5dac..59a210e6f534e 100644
--- a/pkgs/misc/cups/drivers/samsung/1.00.37.nix
+++ b/pkgs/misc/cups/drivers/samsung/1.00.37.nix
@@ -22,6 +22,7 @@ in stdenv.mkDerivation rec {
   ];
 
   installPhase = ''
+    runHook preInstall
 
     mkdir -p $out/bin
     cp -R ${arch}/{gettext,pstosecps,rastertospl,smfpnetdiscovery,usbresetter} $out/bin
@@ -65,6 +66,8 @@ in stdenv.mkDerivation rec {
     cd $out/share/cups
     ln -s ../ppd .
     ln -s ppd model
+
+    runHook postInstall
   '';
 
   preFixup = ''
diff --git a/pkgs/misc/cups/drivers/samsung/4.01.17.nix b/pkgs/misc/cups/drivers/samsung/4.01.17.nix
index 12cfcde82f76a..3347030174783 100644
--- a/pkgs/misc/cups/drivers/samsung/4.01.17.nix
+++ b/pkgs/misc/cups/drivers/samsung/4.01.17.nix
@@ -11,7 +11,13 @@
 # }
 # (This advice was tested on the 1st November 2016.)
 
-{ lib, stdenv, fetchurl, cups, libusb-compat-0_1 }:
+{ lib
+, stdenv
+, cups
+, libusb-compat-0_1
+, fetchurl
+, patchPpdFilesHook
+}:
 
 # Do not bump lightly! Visit <http://www.bchemnet.com/suldr/supported.html>
 # to see what will break when upgrading. Consider a new versioned attribute.
@@ -28,10 +34,14 @@ in stdenv.mkDerivation rec {
     sha256 = "1vv3pzvqpg1dq3xjr8161x2yp3v7ca75vil56ranhw5pkjwq66x0";
   };
 
+  nativeBuildInputs = [ patchPpdFilesHook ];
+
   dontPatchELF = true;
   dontStrip = true;
 
   installPhase = ''
+    runHook preInstall
+
     cd Linux/${installationPath}
     mkdir -p $out/lib/cups/{backend,filter}
     install -Dm755 mfp $out/lib/cups/backend/
@@ -63,15 +73,18 @@ in stdenv.mkDerivation rec {
     mkdir -p $out/share/cups/model/samsung
     cd -
     cd ../noarch/at_opt/share/ppd
-    for i in *.ppd; do
-      sed -i $i -e \
-        "s,pstosecps,$out/lib/cups/filter/pstosecps,g; \
-         s,pstospl,$out/lib/cups/filter/pstospl,g; \
-         s,rastertospl,$out/lib/cups/filter/rastertospl,g"
-    done;
     cp -r ./* $out/share/cups/model/samsung
+
+    runHook postInstall
   '';
 
+  ppdFileCommands = [
+    "pstosecps"
+    "pstospl"
+    "pstosplc"
+    "rastertospl"
+  ];
+
   meta = with lib; {
     description = "Samsung's Linux printing drivers; includes binaries without source code";
     homepage = "http://www.samsung.com/";