2023/01/31(火) [n年前の日記]
#1 [debian][linux] Debian上でiP4600の公式ドライバをビルドできないか試してみた
Debian Linux 11 bullseye上で、プリンタ Canon iP4600用の公式ドライバをソースからビルドできそうか、途中まで試してみた。あくまで途中まで。昨日メモした内容と少し被るけど一応メモ。
中に入ってた Makefile の内容は以下。
おそらく、以下のディレクトリに入って make を実行する処理になってるのだろう。
しかし、各ディレクトリには Makefile が入ってないので、実行してもエラーになる。代わりに、INSTALL, autogen.sh, configure.in, Makefile.am といったファイルが入ってる。
INSTALL には、各ディレクトリ内でのビルド手順が書いてある。大体は、./autogen.h を実行後、make と make install を実行せよと書かれてる。一部そうではないものもあるけど。おそらく、autogen.h を実行すると Makefile を作ってくれるのではないか。たぶん。
少しコンパイルした感じだと、ビルドには以下が必要になりそう。他に必要なパッケージがあるかもしれないけれど。
各ディレクトリの中に入って試してみた。
libs/, cngpij/, pstocanonij/ の中では autogen.h も実行できたし、Makefile も生成されたので make も実行できたけど…。
backend/ の中では、autogen.h は実行できたものの、make を実行したら cnij_backend_common.c のコンパイルでエラーが出た。ppd_file_t という型が見つからないらしい。
_#838972 - cups-filters: FTBFS: cupsfilters/colord.h:39:44: error: unknown type name 'ppd_file_t' - Debian Bug report logs
#include <cups/ppd.h> を追加すればエラーを回避できるっぽい。cnij_backend_common.c を修正。
この状態なら make が通った。
後は、各ディレクトリの中で、sudo make install を実行すれば、生成したファイルが所定のディレクトリにコピーされていくのだろう。しかし、それをやって、システムが壊れたら怖いな…。
仮想PC上の Debian 11 bullseye 上で作業してみることにした。各ディレクトリ内で、前述の作業をして、sudo make install を実行。
想像だけど、前述の Makefile で作れるのは、ドライバの共通部分だけなのかなという気がする。iP4600に特化した部分は、別のディレクトリ内でビルドしないといけないのではなかろうか。それら別ディレクトリの中では、プリンタの型番を指定して autogen.h を実行するようだし…。
cngpijmon/ の中でコンパイルしてみる。
bjcupsmon_cups.c のコンパイル時に、大量にエラーが出てきた。以下、一例。
ipp_attribute_t とか ipp_t という型がおかしいのだろうか。/usr/include/cups/cups.h の中で、ipp.h を include していて、ipp.h の中で件の型は定義されてるように見えるのだけどな…。
ここで手詰まり。すんなりとはいかないなと。そもそも、どのディレクトリの中身が必要になってくるのか、そこもよく分からない…。
- Canonのサイトから、cnijfilter-common-3.00-1.tar.gz を入手。
- tar zxvf cnijfilter-common-3.00-1.tar.gz で解凍。
- cd cnijfilter-common-3.00 でディレクトリの中に入る。
中に入ってた Makefile の内容は以下。
$ cat Makefile #dirs = libs cngpij cngpijmon ppd pstocanonij dirs = libs cngpij pstocanonij backend scripts=for dir in $(dirs); do\ (cd $$dir; make $$target)|| exit 1;\ done all : $(scripts) clean : target=clean; $(scripts) install : target=install; $(scripts)
おそらく、以下のディレクトリに入って make を実行する処理になってるのだろう。
libs, cngpij, pstocanonij, backend
しかし、各ディレクトリには Makefile が入ってないので、実行してもエラーになる。代わりに、INSTALL, autogen.sh, configure.in, Makefile.am といったファイルが入ってる。
INSTALL には、各ディレクトリ内でのビルド手順が書いてある。大体は、./autogen.h を実行後、make と make install を実行せよと書かれてる。一部そうではないものもあるけど。おそらく、autogen.h を実行すると Makefile を作ってくれるのではないか。たぶん。
少しコンパイルした感じだと、ビルドには以下が必要になりそう。他に必要なパッケージがあるかもしれないけれど。
sudo apt install build-essential autoconf libtool libtool-bin automake libpopt-dev libppd-dev libppd0 sudo apt install libcups2 libcups2-dev libcupsfilters-dev libcupsimage2-dev sudo apt install libpng-dev libpng16-16 libtiff-dev libtiff5 libtiff5-dev
各ディレクトリの中に入って試してみた。
./autogen.h make
libs/, cngpij/, pstocanonij/ の中では autogen.h も実行できたし、Makefile も生成されたので make も実行できたけど…。
backend/ の中では、autogen.h は実行できたものの、make を実行したら cnij_backend_common.c のコンパイルでエラーが出た。ppd_file_t という型が見つからないらしい。
_#838972 - cups-filters: FTBFS: cupsfilters/colord.h:39:44: error: unknown type name 'ppd_file_t' - Debian Bug report logs
#include <cups/ppd.h> を追加すればエラーを回避できるっぽい。cnij_backend_common.c を修正。
$ diff -u src/cnij_backend_common.c.orig src/cnij_backend_common.c --- src/cnij_backend_common.c.orig 2023-01-31 03:23:08.509470935 +0900 +++ src/cnij_backend_common.c 2023-01-31 03:23:52.809932769 +0900 @@ -39,6 +39,7 @@ // CUPS Header #include <cups/cups.h> #include <cups/ipp.h> +#include <cups/ppd.h> // Header file for CANON #include "cnij_backend_common.h"
この状態なら make が通った。
後は、各ディレクトリの中で、sudo make install を実行すれば、生成したファイルが所定のディレクトリにコピーされていくのだろう。しかし、それをやって、システムが壊れたら怖いな…。
仮想PC上の Debian 11 bullseye 上で作業してみることにした。各ディレクトリ内で、前述の作業をして、sudo make install を実行。
想像だけど、前述の Makefile で作れるのは、ドライバの共通部分だけなのかなという気がする。iP4600に特化した部分は、別のディレクトリ内でビルドしないといけないのではなかろうか。それら別ディレクトリの中では、プリンタの型番を指定して autogen.h を実行するようだし…。
cngpijmon/ の中でコンパイルしてみる。
cd cngpijmon ./autogen.sh --program-suffix=ip4600 make
bjcupsmon_cups.c のコンパイル時に、大量にエラーが出てきた。以下、一例。
bjcupsmon_cups.c:224:17: error: invalid use of incomplete typedef ‘ipp_t’ {aka ‘struct _ipp_s’} 224 | if (pResponse->request.status.status_code > IPP_OK_CONFLICT) { | ^
bjcupsmon_cups.c:229:44: error: invalid use of incomplete typedef ‘ipp_attribute_t’ {aka ‘struct _ipp_attribute_s’} 229 | printerState = (ipp_state_t)pAttribute->values[0].integer; |
ipp_attribute_t とか ipp_t という型がおかしいのだろうか。/usr/include/cups/cups.h の中で、ipp.h を include していて、ipp.h の中で件の型は定義されてるように見えるのだけどな…。
ここで手詰まり。すんなりとはいかないなと。そもそも、どのディレクトリの中身が必要になってくるのか、そこもよく分からない…。
[ ツッコむ ]
以上です。