おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。

RPM で LSB 準拠プリンタドライバのパッケージを作ってみた (その1:能書き&下準備編)

ここまで来るとみなさんにはホントに関心がない話ではありましょうが、まあせっかく調べたので。
つか半ば以上グチでございます。RPM なんて嫌いだ ;><。

前書き - LSB 準拠プリンタドライバのパッケージとは?

Unix/Linux 印刷の標準化団体 OpenPrinting では、各社まちまちであるドライバのパッケージング・インストレーションの方法をまとめる活動をしています。この活動が成功すれば、LSB x.x の上でインストールできて確実に動作する Linux ドライバを作成することができ、またそれを適切なレポジトリにおいて配布することができます。たとえばオープンソースのラスタ系プリンタドライバ Gutenprint は こちらのページ にあるように、RPMDEB のパッケージとして配布されています。
さてこのパッケージ (Distribution Independent Printer Driver on LSB) の作り方が、

Making distribution-independent printer driver packages based on the LSB

に書いてありましたので、まーごちゃごちゃと試してみたわけです。

今回は簡単な例ということでデータファイルのみの例。つまり noarch ということで作ってみます。

おさらい - Linux 印刷シナリオと PPD

Linux の印刷シナリオにおいてはアプリケーションが Postscript を生成するのが普通で、Postscript プリンタの場合はこれをそのまま印刷データとして扱うことになります。

しかし、このブログで繰り返し述べているように、プリンタは単純に印刷するだけではなく、複数部数印刷や両面印刷、高級機になるとパンチやホチキス綴じ *1 などの機能を持ちます。前述の Postscript のデータにはこのような制御系のコマンドがありません。

そこで Linux の標準的な印刷モジュールである CUPS は、各プリントキューに紐づけて PPD *2 を持ち、これによって「ああ、両面ならこのコマンドを出すんだな」「左綴じのパンチならこのコマンドだな」という解釈をして、適切なコマンドを出すことでプリンタに指示を出せるのです。

ん? じゃあ Postscript プリンタ以外は?

という疑問はごもっともかと。

実は CUPS においては PPD にいくつかの拡張が入ってまして、その中で特に重要なのが「cupsFilter」キーワード。
これは前述のように Postscript で印刷パスに流れてきたデータを、適切なフィルタに流し込んでデータを加工する、そのフィルタを指定するキーワードです。

といっても PS を食えるソフトというのは世の中にそんなにあるわけもなく、たいていは Ghostscript というオープンソースの Postscript レンダラを使って、次の三つのパターンでプリンタ向けのデータを作ります。

  • Ghostscript に内蔵されている PCL XL *3 の出力エンジン*4 で出力。
  • Ghostscript が生成する「CUPS Raster」というビットマップ形式を出力して貰い、それを受け取って好きなデータに加工する簡易フィルタを作る。
  • Ghostscript の解析結果を API として受け取り、ベクタレンダリングするフィルタを作る *5

あとの二者はフィルタをかかないといけないパターンなのでアレですが、最初の PCL XL の奴は Ghostscript お任せなのでやっぱり PPD だけでドライバが作れてしまいます。

まとめると、Linux で PPD のみでドライバが作れるのは、

  • Postscript プリンタ向け
  • PCL XL プリンタ向け

ということになります*6

いいかえれば PPD だけで動く上記二つのドライバパッケージは、noarch でできるので入門にちょうど良いのです。

下準備

えっと、これまではくそ真面目に「普段使ってる Debian 系 (つか Ubuntu) でできるように頑張る」「chroot で綺麗な環境を作って、依存関係にモレがないようにする」とかやってきたわけですが、前述のドキュメントを見ると、

  • chroot 環境だといろいろ足りなくて苦労するから nodeps で入れてね
  • Debian 系の場合 Alien した奴があるからそれつかってね。その場合 rpm の依存関係は解決されないから rpmbuild を nodeps で通してね

とか萎え萎えなことが書いてあったので (パッケージの完全性を保証するための仕組みが用意してある Debian 系とはエライ違いだ)、もう chroot もなにもあきらめることにしました。

環境は Fedora 11 x86_64。別に 64 でなくてもよかったのだけど手元にあったので。

LSB の開発環境を作るには、
d:id:naruoga:20090702:1246515994
のとおり。もう慣れれば瞬殺でしょう。つか慣れた。


前回のエントリで足りないのは、/etc/rpm/macros *7
こちらのページの内容をぺったんするか、ファイルがない場合は新規に作っておくってことと、~/.rpmrc に

%_topdir                /home/YOURLOGIN/rpm
%_tmppath               /home/YOURLOGIN/tmp
%distribution           LSB
%vendor                 YOURORGANIZATION
%packager               YOURNAME 

というエントリを作っておくこと。
あ、もちろんエントリを作るだけじゃなくて、上の二つに一致したディレクトリも掘っておかなければダメ。

もっとも、パッケージャに個人のアカウントで名乗っていいかどうかは会社なりなんなりで違うだろうから (ウチの会社もしらない) そこは確認のこと。誰が作業しても同じにするってルールなら ~/.rpmrc じゃなくて /etc/rpm/macros に書いちゃってもいいみたい。

例によって長ーくなっちゃったのでいったん切ります。

*1:ホチキスは商標なので我々はステープルと呼びます。

*2:Postscript Printer Description。Adobe 謹製のプリンタ記述形式。とはいえ Unix 方面ではガンガン独自拡張されている。

*3:泣く子も黙る Hewlett-Packard 社のプリンタ言語。海外のプリンタは PS か PCL XL かどちらかは載っているので問題なし。

*4:伝統的に「ドライバ」というのですがややこしいのでこう呼びます。

*5:OpenPrinting で標準化した企画なので OpenPrinting Vector Printing 略して OPVP という

*6:本当は GS に (旧来の意味での) ドライバがある言語は全部 PPD だけで作ることができるのですが、OpenPrinting 的には非推奨なので忘れましょう。

*7:あるいは macros.lsbprint とか別ファイルにしてもいいみたい。RPM 分からん ><