2013年12月7日土曜日

FreeBSD の ports 経由の update についてのメモ

 ふと FreeBSD のアップデートをしようと思った。理由は特にない。ほんとに,ふと思い立ったのだった。 私は基本的に ports を使って update をさせている。 updater は portupgrade を使っている。 portupgrade は ruby18 を使っているから portmaster の方がいいという人もいるのだが, とりあえずは問題なく update してくれるので,とりあえずは良しとしている。

 今回,portupgarade を使って ports 経由での update をしたのだが,結構多くのエラーがでたのでまとめておこうと思った。 手順としては,
 1. portsnap fetch update を使って,ports を最新にしておく。
   以前は cvsup だったのだが,最近,portsnap を使いなさい,とどっかに御沙汰があったので portsnap を使うようにしている。

 2. 次に portupgrade -an として,どのアプリケーションが update の対象になっているかを調べる。
   ここで,-a オプションはすべてが対象であり,-n オプションは調べるだけで update の処理は行わない,というもの。
   もし,そのリストに Perl などの基本的なアプリケーションが入っていたら要注意ということになる。

 3. 要注意アプリケーションが update のリストに入っていたら,/usr/ports/UPDATING をチェックした方がいい。
   あなたが前回 update を行った以降のエントリーがあれば,注意した方がいい。
   特に Perl のようにいろいろな所で使われているアプリケーションだと,影響が大きいので注意が必要となる。
   具体的には,Perl のバージョンが上がると,Perl に依存しているアプリケーションすべてを強制的に update しないといけない事がある。

 4. いちいちオプションを選択するのがめんどくさいので,export BATCH=yes (tcsh 系では setenv BATCH yes) としておく。
   既にインストールされているアプリケーションは,同じオプションを指定することになるので,とても便利である。

 5. いよいよ update となる。具体的には portupgrade -a とすればよい。

 さて,今回はこの後がいろいろとあった。通常は問題なく終わることが多いのだが,時々エラーがあって update されなかったものがリストされる。 例えば,以下の様なリストが出る時がある。
        ! devel/dconf (dconf-0.14.1)    (unknown build error)
        * devel/eggdbus (eggdbus-0.6_1) 
ここで,先頭が「!」となっているものはエラーがあって update に失敗したものを表し, 先頭が「*」となっているものはアプリケーションが update されなかった事を示す。 これは主に,依存関係にあるアプリケーションがエラーで update されなかった時に生じる。 多くのアプリケーションが依存しているアプリがエラーを吐くと,その影響で update されないアプリがずらっと並ぶ事もある。
 今回は,help2man-1.43.3,opencv-core-2.3.1_9,p5-Socket,dconf-0.14.1,eggdbus-0.6_1 の update 絡みでエラーが生じた。 個々に記述してみよう。

 a. help2man-1.43.3 の場合
 これは portupgrade -a とした時にエラーが出た。エラーは下記のようなものだった。
configure: error: perl module Locale::gettext required
===>  Script "configure" failed unexpectedly.
Please read UPDATING entry 20130612
(http://svnweb.freebsd.org/ports/head/UPDATING?r1=320405&r2=32067) and
PR/184276 (http://www.freebsd.org/cgi/query-pr.cgi?pr=ports/184276) to fix
your Perl installation if you got the error message "configure: error: perl
module Locale::gettext required".
*** Error code 1

Stop in /usr/ports/misc/help2man.
** Command failed [exit code 1]: /usr/bin/script -qa /tmp/portupgrade20131206-24886-e3fumi env UPGRADE_TOOL=portupgrade UPGRADE_PORT=help2man-1.43.3 UPGRADE_PORT_VER=1.43.3 mak
e
** Fix the problem and try again.
** Listing the failed packages (-:ignored / *:skipped / !:failed)
        ! misc/help2man (help2man-1.43.3)       (configure error)
[1]    24886 exit 1     portupgrade help2man-1.43.3
 これは help2man-1.43.3 を update しようと思ったが,Locale::gettext というモジュールがない,というエラーとなっている。 pkg_info -aI として見てみると,Locale::gettext なるモジュールはインストールされているみたいなのだが,エラーを吐いて止まってしまう。 そこで,ネットでちょっと調べてみると,/usr/ports/devel/p5-Locale-gettext を make deinstall してから,make install clean すればいい,と書いてある記述を見つけた。そこで,おまじないと思って,デ・インストールして,インストールし直してみた。 すると,gettext 自体はエラーなくインストールできた。 それから help2man-1.43.3 を update すると,不思議と難なく update でき,エラーも出なかった。 何が悪いのかなぁ???

 b. opencv-core-2.3.1_9 の場合
 これは ffmpeg 等の update 絡みで出てきた。 ffmpeg を update しようとすると,opencv-core がない,というエラーが出た。 しかし pkg_info -aI で調べると opencv-core というのはちゃんとインストールされていて,「opencv-core-2.3.1_9」がインストールされていると出た。 しかし,ffmpeg の update はうまくいかない…。というよりも,opencv-core の update ができなかった。エラーの表示は
/var/tmp/usr/ports/graphics/opencv-core/work/opencv-2.4.7/modules/core/src/algorithm.cpp:1273: error: expected `}' at end of input
*** Error code 1
となっていた。一瞬 gcc 用のファイルを直接いじるのか?と思って焦ってしまった。 ちなみにこの時点での最新版は「opencv-2.4.7.」だった。
 これに関しては,/usr/ports/UPDATING に記述があった。それによると,ここでも,make deinstall ==> make install clean としなさいと記載があった。 そこで記載通りにすると,これまた不思議なことにちゃんと ffmpeg の update は完了した。

 c. DBI.so の場合
 これは portupgrade -a の後で,web ページを読みだした際に起こった。そのページではデータベース上のデータを cgi を使って読み取って処理していた。 エラーの内容は以下の様なものであった。
 Can't load '/usr/local/lib/perl5/site_perl/5.18/mach/auto/DBI/DBI.so' for module DBI: /usr/local/lib/perl5/site_perl/5.18/mach/auto/DBI/DBI.so: Undefined symbol "PL_phase" at /usr
/local/lib/perl5/5.18/mach/DynaLoader.pm line 190,  line 855., referer: http://www.ltm.kyoto-u.ac.jp/~akira/link/link_am.html
ここでは DBI.so が load できないとか,PL_phase というシンボルが定義されてない,とか書かれている。 これに関しては,/usr/ports/UPDATING に記載があり,Perl に変更があったので,Perl に依存してるアプリケーションはすべて強制的に compile し直しなさい,と書いてあった。具体的処理は以下のようにしなさい,と記述されていた。
  Portupgrade users:
    0) Fix pkgdb.db (for safety):
        pkgdb -Ff

    1) Change the option in lang/perl5.16:
        make -C /usr/ports/lang/perl5.16 config

    2) Reinstall everything that depends on Perl:
        portupgrade -fr lang/perl5.16

  Portmaster users:
    1) Change the option in lang/perl5.16:
        make -C /usr/ports/lang/perl5.16 config

    2) Reinstall everything that depends on Perl:
        portmaster -r perl5-
そこで,指示通りにすると,web ページはうまく働くようになった。

   d. p5-Socket の場合
 これは Perl に依存しているアプリケーションをすべて compile し直している時にエラーとして出てきた。 そこでは p5-Socket モジュールがない,というものだった。 これまた pkg_info -aI とするとインストールはされているのだが,何故かエラーだった。
 これに関しては FreeBSD の問題発生お知らせページみたいな所に記載があった。 そこにあった方法は,make deinstall ==> make install clean としなさい,という事だった。 ここでも make deinstall ==> make install clean とすればうまくいくようになった。

 e. dconf-0.14.1 の場合
 これは dconf の update が含まれている場合に起こった。 エラーの内容は「http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl が load できない」というものだった。 ほんとにそうか?と思って,fetch http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl とすると,普通にダウンロードすることができた。 しかし,何故か dconf-0.14.1 の場合はダメだった。 エラーの記載をよく読むと,Makefile の中の
BUILD_DEPENDS=  vala>=0.18.1:${PORTSDIR}/lang/vala \
                docbook-xsl>=0:${PORTSDIR}/textproc/docbook-xsl
の辺りにエラーがあると出ていた。そこで,docbook.xsl に関係している /usr/ports//textproc/docbook-xsl というのを入れなおしてみた。より具体的には make deinstall ==> make install clean としてみた。 すると,これまたちゃんと dconf を update することができるようになった。

 今回は珍しく多くのエラーが出たが,多くは入れなおすことでうまくいくことが多かった。 何が原因かはよくわからないが,どこかでシステムの初期値が変えられたみたい。 ま,でもなんとかうまくいったので,今回はよしとしよう。

0 件のコメント: