Packaging Brother printer drivers

From ArchWiki
Revision as of 22:16, 4 June 2009 by Louipc (Talk | contribs) (Preparing PKGBUILD)

Jump to: navigation, search

Really short overview of CUPS

Basically CUPS needs two things to handle printers properly: a .ppd file and a filter binary. If you have those two in the right places then you must register the printer in CUPS. You can do this in the CUPS web interface at:

 http://localhost:631/

or using the command line:

 URL=$(lpinfo -v | grep -i 'Brother')	#  if you got more Brother printers you must be more precise in grep
 lpadmin -p HL2030 -E -v $URL -P

Look at this samsung driver. It is quite simple, it doesn't even have automatic printer registration, but shows exactly what I am talking about.

http://aur.archlinux.org/packages.php?ID=16423

About Brother drivers

Three problems with Brother drivers are:

  1. The cups driver is built on top of the lpr driver.
  2. The cups driver package contains a single installation shell script with an embedded *.ppd and a filter. It is executed by rpm during installation. It extracts *.ppd and a filter and performs some installation procedures in a Red-Hat specific way.
  3. It uses paths that are not compliant to Arch Packaging Standards

Preparing PKGBUILD

You can deal with each of the above problems as follows:

  1. Simply extract the lpr driver rpm. You don't have to mimic the lpr driver installation procedure in your PKGBUILD because it is not needed. Cups driver just needs the files in place.
  2. Extract the cups driver rpm. There should be single shell script. If you look in the patch of my HL2030 driver (http://aur.archlinux.org/packages.php?ID=14131) you can see that I have made three kinds of changes in this script:
    1. I have changed the paths.
    2. I have disabled all commands except "cat <<EOF" or "echo > ..." or whatever there is that emits *.ppd or filter to separate file. It was done by wrapping irrelevant instructions by if false; then ... fi.
    3. I have changed target file names for *.ppd and filter so they are emitted to the directory your PKGBUILD is working in (relative path not absolute). Note that paths were changed also in the source of the embedded filter.
  3. This is optional if you don't care about the arch packaging standard. Just change all paths. You can use sed - i believe - on all text files unpacked from both lpr and cups brother drivers. Look at the patch in my HL2030 package to check which files are affected.

Effectively after changes described above you will receive a script that will just emit embedded *.ppd and filter to some known location. All you need to do is to copy them to proper CUPS directories in $stardir/pkg:

 install -m 644 -D ppd_file "$pkgdir/usr/share/cups/model/HL2030.ppd"
 install -m 755 -D wrapper  "$pkgdir/usr/lib/cups/filter/brlpdwrapperHL2030"

Remember also to copy lpr driver files to "$pkgdir"!

Other changes

Below are shows some other changes you may need in your patch.

Change:

 -#PSTOPSFILTER=`which pstops`
 +PSTOPSFILTER='/usr/lib/cups/filter/pstops'

I have just hardcoded path to "pstops", because it won't be find by the algorithm that is present there.

There is also such change:

 +[psconvert2]
 +pstops=/usr/lib/cups/filter/pstops

I cannot tell you what it does because i don't remember. Probably I have encountered some problem during tests and found solution in the net. You also may need it.

Arch64

The driver can be used on Arch64 as long as the 32 bit version of glibc (libc32-glibc) is installed.