2016年4月4日月曜日

FreeBSD の ports で,/usr/ports/print/cups のインストールエラー

追記) ここでは根本的な解決方法は示されていません。 あくまで対処療法です。もし根本治療がわかればお教えくださると助かります。
 2016/3 月頃から,cups-2.0.3 から cups-2.1.3 の portupgrade -a がうまくいかなくなった。 2016/3 月末になんとか cups-2.1.3 をインストールすることができたので,ここにメモしておこう。 ただし,根本的な解決にはなっていない。今後,ports が改善されることを期待しよう。

 発端は,ports を更新した事に始まる。FreeBSD の ports は,
# portsnap fetch update
コマンドで最新の状態にできる。

 更新内容は /usr/ports/UPDATING に記載がある。
その中に 2016/3/11 付で,cups-base, cups-client, cups-image に関する記載があった。 それまで cups-base, cups-client, cups-image に分かれていたパッケージを,cups という1個のパッケージにした,というものだった。 当初,全然気にせずに,そのまま
export BATCH=yes
portupgrade -a
を実行した。 その際,幾つかのアプリケーションがアップデートされなかった。 結果を見ると,cups 関連のアプリケーションがエラーでインストールが止まり,その影響で関連するアプリケーションのインストールが実行されていなかった。

 結果の中でエラーで止まったものがあれば,とりあえず単独で対応するアプリケーションだけを portupgrade かけてみる。 時々,単独で portupgrade するとうまくいくものもあるが,今回の cups はうまくいかなかった。 この cups は,印刷を司っているアプリケーションのため,このアップデートがうまくいかないと,ImageMagick やら TeXlivegnuplot などが更新されなかった。更新はすぐにしなくていいものもあるが,多くは何らかのバグフィックスをしているので,できれば更新したいと思った。 そこでなんとか cups を更新しよう,とごそごそいじってみた。

 まずはエラーを見てみた。すると下記のようなエラーで止まっていた。
Installing data files in test...
gmake[2]: ディレクトリ '/usr/ports/print/cups/work/cups-2.1.3/test' に入ります
echo Installing sample ipptool files in /usr/ports/print/cups/work/stage/usr/local/share/cups/ipptool...
Installing sample ipptool files in /usr/ports/print/cups/work/stage/usr/local/share/cups/ipptool...
/usr/ports/print/cups/work/cups-2.1.3/install-sh -d -m 755 /usr/ports/print/cups/work/stage/usr/local/share/cups/ipptool
for file in color.jpg document-a4.pdf document-a4.ps document-letter.pdf document-letter.ps gray.jpg onepage-a4.pdf onepage-a4.ps
onepage-letter.pdf onepage-letter.ps testfile.jpg testfile.pcl testfile.pdf testfile.ps testfile.txt;
do /usr/ports/print/cups/work/cups-2.1.3/install-sh -c -m 444 -z $file /usr/ports/print/cups/work/stage/usr/local/share/cups/ipptool; done
gzip: /usr/bin/gzip has 3 other links -- skipping
gzip: /usr/bin/gzip has 3 other links -- skipping
...
(上記2行と同じものがさらに13行あったので,省略)
...
Makefile:118: ターゲット 'install-data' のレシピで失敗しました
gmake[2]: *** [install-data] エラー 1
gmake[2]: ディレクトリ '/usr/ports/print/cups/work/cups-2.1.3/test' から出ます
Makefile:182: ターゲット 'install-data' のレシピで失敗しました
gmake[1]: *** [install-data] エラー 1
gmake[1]: ディレクトリ '/usr/ports/print/cups/work/cups-2.1.3' から出ます
*** Error code 2

Stop.
make: stopped in /usr/ports/print/cups
 これを見ても,最初は何のエラーなのかさっぱりちんぷんかんぷんだった…,いつものように。

とりあえず何かが悪いはず,と思って,最初に調べたのが gzip だった。 gzip が警告を吐いているので,gzip のオプション(.zshenv 内で GZIP='-v9N'を指定している)が悪いのか,とも思った。 しかし,その設定を変更しても特に進展はなかった。 そのうちファイルにリンクが複数あるという警告,というのがわかったが,どういう事を意味しているのかいまいちわからなかった…。

ちなみに,gzip の古いマニュアルページ(http://www.freebsd.org/cgi/man.cgi?query=gzip&sektion=1&manpath=FreeBSD+6.2-RELEASE)によると,
-- has xx other links: unchanged
   The  input file has links; it is left unchanged.
   See ln(1) for more information. Use the -f flag to force compression ofmultiply-linked files.
と出た。しかし,これって圧縮の時のエラーみたい。今回は圧縮よりは解凍で問題が起こってるような気がしているのだが…。
念の為に,.zshenv ないの GZIP 環境変数に '-f' を追加したがうまくいかなかった。指定の仕方が悪かったのかなぁ?
追記:これは,マニュアル用のファイルを圧縮しておくための処理中に起こったエラーでした)

 そして,数日が経ち,ふと気づいたのが(最初から気づかないとあかんやん…),エラーメッセージにある
Makefile:118: ターゲット 'install-data' のレシピで失敗しました
という文だった。 install-data のレシビ?? どうもどこかにあるshell スクリプトの処理でうまくいっていないみたいだった。 じゃあ,そのスクリプトは?というと,行の最初に書いてある Makefile というスクリプトの中にあるみたいだった。

 よし,これで原因箇所がわかる,と思ったが,今度はその Makefile というスクリプトがどこにあるかがわからなかった。 これも上記のエラーメッセージの最初に書いてあった(エラーメッセージの一部を切り取っているので,実際のエラーメッセージでは先頭ではない)。 そこに
gmake[2]: ディレクトリ '/usr/ports/print/cups/work/cups-2.1.3/test' に入ります
と書いてある。 つまり,エラーが起こった時点で,処理スクリプトは「/usr/ports/print/cups/work/cups-2.1.3/test/」というディレクトリの中にいた事になる。 エラーを起こした状態だと,/usr/ports/print/cups/work/ が残っている。 この work ディレクトリは make clean すると消されてしまうので,make clean してしまうとディレクトリがなくなるので注意が必要である。 その中の /usr/ports/print/cups/work/cups-2.1.3/ にインストールスクリプトやファイルが入っていた。 そして,その中の
/usr/ports/print/cups/work/cups-2.1.3/test/Makefile
というのでエラーが起こっている,というのがやっと判明した。

 さらにエラーメッセージを見ていると,どうも ipptool というテスト用のオプションのインストール中にエラーが起こっているみたい。 しかし,make config で ipptool はチェック外したのになぁ…。 どうやらサンプルファイルを,一度 /usr/ports/print/cups/work/stage/usr/local/share/cups/ipptool/ にインストールするみたいなのだが,そこでエラーを起こしてる。

 スクリプトで言うと,/usr/ports/print/cups/work/cups-2.1.3/test/Makefile の117行目から始まる「install-data」ルーチンがエラーの元みたいだった。 そこでは,あるグループのファイルは圧縮して,別のグループのファイルは圧縮せずにそのまま,/usr/ports/print/cups/work/stage/usr/local/share/cups/ipptool/ にコピーしているみたい。その中の圧縮してからコピーするグループのファイルは,color.jpg document-a4.pdf document-a4.ps document-letter.pdf document-letter.ps gray.jpg onepage-a4.pdf onepage-a4.ps onepage-letter.pdf onepage-letter.ps testfile.jpg testfile.pcl testfile.pdf testfile.ps testfile.txt; の15個だった。コピーするスクリプトは,/usr/ports/print/cups/work/cups-2.1.3/install-sh であり,-c -m 444 -z などのオプションによって,単純なコピーか,圧縮するか,パーミッションはどうするか,を指定できるみたい。

 そこで,とりあえず手動で1個ずつスクリプトを起動するとうまくファイルがコピーされたが,その後もう一度最初からインストールを行うと,やはりエラーを起こし,エラー表示は全く変わらなかった。 仕方ないので,/usr/ports/print/cups/work/cups-2.1.3/test/Makefile の121行~123行をコメントアウトして,再びインストール作業をさせてみた。 以下がコメントアウトした様子(当初,全部をコメントアウトしていたが,圧縮してコピーしている部分の3行のみでいいことがわかったので,3行のみコメントアウトしている)。
install-data:
       echo Installing sample ipptool files in $(DATADIR)/ipptool...
       $(INSTALL_DIR) -m 755 $(DATADIR)/ipptool
#       for file in $(DATAFILES); do \
#               $(INSTALL_COMPDATA) $$file $(DATADIR)/ipptool; \
#       done
       for file in $(TESTFILES); do \
               $(INSTALL_DATA) $$file $(DATADIR)/ipptool; \
       done
すると,上記のエラーはなくなり,別のコンパイルエラーでスクリプトは終了した。 それは,cups をインストールしようと思うと,古い cups-client などとかぶるので,それらを消せ,というエラーだった。 そこで,cups-base-2.0.3_3, cups-client-2.0.3_2, cups-image-2.0.3_2 の3個を pkg delete した。 実際には,cups-client の pkg delete の際に cups-image もdelete されたが…。 (註: これは「pkg delete -f cups.xxxxxx」のように「-f」オプションを付ければ避けれる)

その後のインストール作業では,何もなかったかのように処理が進み,無事 cups のインストールが終了してしまった…。
あの苦労はなんやったん?という感じだった。 一方で,cups の pkg delete の際に,関連する他のアプリケーション(ImageMagickTeXlive関連など…)が一緒にdelete されてしまった…。 そこで,ImageMagickgnuplotTeXlive などを入れなおした。すると,これらも問題なくインストールできた。

 一応,cups のテスト用のサンプルファイルがインストールされてないことになっているが,今の場合は特に問題は起こっていない。 これで無事解決となった。 未だにトラブルの根本原因はわかっていないのだが,いずれにせよこれでインストールができ,他のアプリケーションのアップデートもできたのでよかったよかった。

追記) 上記の後で,いろいろいじっていると,少し状況がわかってきた。
 どうやら,問題は gzip で起こっているみたいだった。 上記の圧縮してコピーする際に使う「install-sh」というスクリプトで,gzip を使う部分でエラーを起こしていた。 具体的には
$gzipprog -9 <"$1" >"$2"
という66行目が問題だった。

 この行を真似したものを手動で起動するとそれらしく働くのに,portupgrade や make install とするとうまくいかなかった。 もしかしたら,環境の設定が悪いのかもしれない。 そこで,以下のように最初の左向き(?)のリダイレクトをやめてみた。
$gzipprog -9 -c "$1" >"$2"
 すると,それらしく動くようになった。

リダイレクトがある場合とない場合の挙動の違いがいまいちわかってないが,とりあえずうまくいくことはわかった。 ちなみに,圧縮されたものがコピーされるはずだが,コピーされた後のファイル名に .gz が付加されてないのはいいのかなぁ? まぁ,どうせ,ipptool はインストールしないので,マニュアルページに ipptool 関連の項目はコピーされないんだけどね…。


 一応,対処方法を書いておこう。
対処方法 1
  (1) 「# pkg delete -f cups-2.1.3_2」 のようにして,古いバージョンの cups のみを消しておく(「-f」オプションがないと依存性で他のも消される)
  (2) 「# cd /usr/ports/print/cups/」としてから,「# make install」としてインストールに挑戦する(この時点で make clean をしてはいけない)
  (3) 上記のエラーで止まったら,「/usr/ports/print/cups/work/cups-release-x.x.x/test」の中の「Makefile」をいじる。
    いじる箇所は,121行~123行付近の3行(上に書いたとこ)。ここで「install-data:」というのは残した方がよさげ。
  (4) そして,/usr/ports/print/cups/ で 「# make install」とすればインストールできるはず。
  (5) 最後に,/usr/ports/print/cups/ で 「# make clean」とすれば,作業ファイルを消してくれる。

対処方法 2
以下は追記に書いたパターン。
 上記,対処方法1の(3)で,Makefile の代わりに,/usr/ports/print/cups/work/cups-release-x.x.x/install-sh を変更する。 変更点は 66行目の
$gzipprog -9 <"$1" >"$2"
を,下記のように変更するというもの。
$gzipprog -9 -c "$1" >"$2"
 こちらの方が変更箇所は少ないし,一応コピーもされるみたい。


 ちなみに,cups-client を pkg delete した際に一緒に削除されてしまったアプリケーションは以下の様な感じだった。
註: これは「pkg delete -f cups.xxxxxx」のように「-f」オプションを付ければ避けれる)
        cups-client-2.0.3_2
        gtk2-2.24.29_2
        cups-image-2.0.3_2
        wx28-gtk2-2.8.12_6
        wx28-gtk2-common-2.8.12_6
        gconf2-3.2.6_4
        ghostscript9-base-9.06_12
        gnuplot-5.0.3
        texlive-base-20150521_7
        ImageMagick-nox11-6.9.3.4,1
        texlive-full-20150521
        texlive-texmf-20150523_3
        ja-tex-ptex-3.6_1
        tex-xetex-0.99992_3
        texlive-docs-20150523
        tex-xdvik-22.87_4
        tex-dvipsk-5.995_1
        tex-luatex-0.80.0_4
        tex-formats-20150521_2
        tex-jadetex-3.13_3
        tex-xmltex-1.9_2
        tex-aleph-1.15.2.1.r.4_3
        tex-dvipdfmx-20150315_1

0 件のコメント: