Additional CUPS drivers can be added via "services.printing.drivers" but
Gutenprint was an exception. It was possible to add a Gutenprint
derivation to that list and it would work at first but unlike the other
drivers Gutenprint requires a script to be run after each update or any
attempt to print something would simply fail and an error would show up
in the jobs queue (http://localhost:631/jobs/):
"The PPD version (5.2.11) is not compatible with Gutenprint 5.2.13.
Please run
`/nix/store/7762kpyhfkcgmr3q81v1bbyy0bjhym80-gutenprint-5.2.13/sbin/cups-genppdupdate'
as administrator."
This is due to state in "/var/lib/cups/ppd" and one would need to run
"/nix/store/.../bin/cups-genppdupdate -p /var/lib/cups/ppd" manually.
The alternative was to enable the following option:
"services.printing.gutenprint" but this had two disadvantages:
1) It is an exception that one could be unaware of or that could
potentially cause some confusion.
2) One couldn't use a customized Gutenprint derivation in
"services.printing.drivers" but would instead have to overwrite
"pkgs.gutenprint".
This new approach simply detects a Gutenprint derivation in
"services.printing.gutenprint" by checking if the meta set of a
derivation contains "isGutenprint = true". Therefore no special
exception for Gutenprint would be required and it could easily be
applied to other drivers if they would require such a script to be run.
Rework gutenprint derivation:
* Convert to regular stdenv.mkDerivation;
* Enable IJS driver;
* Fix cups-genppdupdate;
* Move things around to the proper directories;
* Enable parallel building;
* Clean from old hacks.
This is used to generate ppd files for cups:
$ cups-genppd.5.2 -M | grep p50
canon-cp500
escp2-p50
$ cups-genppd.5.2 -p . escp2-p50
This will create the relevant ppd file in the current directory. This
can then be used by cups after setting services.drivers.drivers =
[pkgs.gutenprint]; and configuring the printer to use this ppd e.g.
via the web interface on http://localhost:631