2010年12月4日土曜日

FreeBSD で gtk-2.22.1_1 のインストールにはまる

FreeBSDweb serverを動かしているのだが,今回,gtk-2.22.1_1 のインストールができなくて困ってしまった。今回はその顛末を書こう。

 FreeBSDでアプリケーションをインストールにはportsというのを使うと便利にできている。これはLinuxrpmなどと同じようなもので(と勝手に思ってる)依存関係や更新も管理してくれる。なので結構重宝している。具体的には,/usr/ports/の下のアプリケーション名のディレクトリに入り,そこにあるMakefileを使って,make install clean とすれば新規にアプリケーションをインストールでき,また,portupgradeportmaster というコマンドを使うと,アップデートがあれば自動でアップデートを行うことができる。また,/usr/ports/UPDATING というファイルに最新の更新情報が書いてあったりする。また,その ports 自信は cvsup というコマンドで更新できる。

 今回の事の発端は /usr/ports/UPDATING に書いてあった記事だった。その中に以下のような記述があった。gtk というアプリケーションと gtkmm というアプリケーションについての注意事項だった。どうやらバージョンアップして,若干アプリケーションの構成を変えたというもの。構成が変わったので,一度全部消してからインストールし直しなさい,という指示だった。
20101120:
AFFECTS: users of x11-toolkits/gtk20 and x11-toolkits/gtkmm24
AUTHOR: FreeBSD GNOME Team 

In the GNOME 2.32 release. gdk-pixbuf2 has been split off from gtk20,
and atkmm has been split off from gtkmm24. To upgrade please use the
following instructions:

Portmaster users:

# pkg_delete -f gtkmm-2.20¥* gtk-2.20¥*
# portmaster -a

Portupgrade users:

# pkgdb -fF
# pkg_deinstall -fO gtkmm-2.20¥* gtk-2.20¥*
# portupgrade -aOW
このgtkというのは,gnome でグラフィックを担っているアプリケーションらしい。FreeBSDports でいうと,/usr/ports/x11-toolkit/gtk20/ にあるアプリケーションである。pkg_info -aI で調べると,Gimp Toolkit for X11 GUI (current stable version) と書いてあった。gimp 使ってないし,サーバーには Windows マシンから PuTTY でログインしてるので,グラフィックは関係ないと思い,あまり深く考えずに言われるがままに gtk をアップデートすることにした。私はまだ portupgrade を使っているので,下半分の方法に従って作業してみた。すると,pkgdbpkg_deinstall までは問題なくこなしてくれたが,最後の portupgrade というコマンドを実行中にエラーで止まってしまった。アップデート中にエラーで止まることはよくあることで,普通はアップデートが失敗すると以前のバージョンのソフトが復活されてそのまま使える。なので,普段は放置しておく。すると ports が更新されて,いつの間にかアップデートができてしまったりする。

 ところが今回は違っていた。なんと唯一私の使えるエディターである emacs が使えなくなってしまった。unix 系でのエディターと言えば vi がまず思い浮かぶが,とてもクセがあってコマンドや使い方を覚えていない。そこでもっぱら emacs を使っている。ところがその emacs が使えなくなってしまった。そうなると,いろんなファイルをいじる作業もできなくなってしまう。emacs でファイルをいじろうとすると
/usr/local/lib/libgdk-x11-2.0.so がない
というエラーを出して止まってしまう。最初は何が起こっているのかチンプンカンプンだったが,調べてみるとこの libgdk-x11-2.0.so というのが gtk というアプリケーションのライブラリを表していることがわかった。emacs は,どうやらこの gtk と,もう一個似たような gdk というアプリケーションを使っていて,それらを強制的に削除してしまったらしい。通常のアップデートなら,アップデートを失敗すると以前のバージョンのアプリケーションを復活させてくれるのだが,今回は事前に強制削除してからアップデートする,という手順だったので,gtk(と gdkも同時に)が完全に消えてしまった。

 そこで gtk(と gdk)をインストールすべく,locategtk の場所を探した所,/usr/ports/x11-toolkit/gtk..../ というのが見つかった。gtk は何故かバージョン1とバージョン2の両方がインストールされているのだが,libgtk-x11-2.0.so という名前からすると,gtk-2.x の方だと推測されたので,gtk20 というディレクトリだとわかった。そこで,gtk20 をインストールすべく,make install clean を実行してみた。当然 root 権限で行ったのだが…。結果は,というと…,エラーで止まってしまった。何度やっても,cvsup をやってもだめだった。最初は何がなんだかわからなかったが,そのうち,どうも以下のメッセージに問題が含まれているような気がしてきた。
/usr/local/share/gir-1.0/Atk-1.0.gir: Incompatible version 1.0 (supported: 1.2)
はて? Atk ってなんやろ? gir って何やろ?どうやら,Atk-1.0.gir じゃなくて,Atk-1.2.gir が必要,って言ってるみたい。

 そこで girAtkatk で検索してみた。すると,Atk-1.0.gir というのは,どうやら atkgir 用のファイルみたいだった。そこで,atk に問題があると思い,portsatk を探してみると,/usr/ports/accessibility/atk/ というのを見つけた。それによると,atkA GNOME accessibility toolkit (ATK) ということだった。そこで,この atk に対して portupgrade をしてみるが,何もしてくれない。atk のインストールされているバージョンは atk-1.32.0 だった。どうもこれは最新みたいだった。そこで atkports で設定ファイルなどを見てみたが,Atk-1.0 という文字はあるが,Atk-1.2 というのは見当たらなかった。困ってしまった。atk をアップデートするだけならアップデートすればよいのだが,すでに atk は最新になっている。そこで2日ほど,cvsup を実行してから,portupgrade -a をしてみる,というのを何度もやってみたが,全然進展がなかった。

 そこで,ふと,atk を強制的にインストールしなおしてみた。実は今回は3つのシステム(web server 本体とその jail 環境,web とは全く別のシステム)で同じ症状に陥っていた。その中でwebと関係の無いシステムはいろいろやってみていた。そのシステムの中で
portupgrade -f atk-1.32.0
としてみた。これは強制的にアップデートをしろ,というもので,同じバージョンでもアップデートをやり直してくれる。atk のアップデートはうまくできた。その後で,gtk20 をインストールしてみた。すると…,なんとインストールできた。

 最初は atk の強制再インストールが成功の原因とわからなかったので,次に web server 本体でやってみた。web 自体は jail 環境に入ってるので,本体をいじっても web 自体には影響が少ないからだったのだが。そのシステムの中で手順を再現すべくいろいろやってみたが,最終的に
atk-1.32.0 を強制的に再インストールするとうまくいった。
理由はわからないが,何故かそれが原因だった。3つのシステムで同じように解決したので,これが原因と思って間違いないと思う。web server 本体の方では,作戦を替えて portupgrade -f ではなく,/usr/ports/accessibility/atk/make install clean としてみた。これは再インストールが本質的かどうかを知りたかったから。実行すると,既にインストールされてるとエラー表示が出たので
make deinstall と make reinstall を実行した。
すると,gtkgdk もインストールできた。emacs も使えるようになった。ちなみにmake deinstall を実行すると,
===> Deinstalling for accessibility/atk
===> Deinstalling atk-1.32.0
pkg_delete: package 'atk-1.32.0' is required by these other packages
and may not be deinstalled (but I'll delete it anyway):
ImageMagick-6.6.4.10
emacs-23.2_4,2
gconf2-2.28.1_1
gtk-engines2-2.20.1_1
libgsf-1.14.18_1
libnotify-0.4.5_4
librsvg2-2.26.3_1
libxul-1.9.2.12
と出る。ImakeMagick はわかるけど,emacs は予想外やったなぁ。さて,この make deinstall の後,make reinstall をするとうまく強制再インストールができる。

 これでなんとか emacs を使えるようになった。やっぱりエディターが使えないと困るよねぇ。

(追記):2010/12/6 に ports をアップデートしたら,/usr/ports/x11-toolkit/gtk20/ などの gtk 関連が更新されてた。もしかしたら上記の問題は解決されてるかもしれない。
(追記その2):2011/1に別のマシンにFreeBSD 8.1をインストールした。その際にportupgradeしよとすると,やはり gtk-2.22.1_1atk-1.32.0 で引っかかった。うーん,どうやらまだ根本的なところは直ってないみたい。で,同じように gtk のアップデートで引っかかった。今回は atk を強制的に再インストールしただけではうまくいかなかった。どうやったか,というと,perl のバージョンを 5.10 から 5.12 にアップデートしようと思い,/usr/ports/UPDATING に書いてあった指示に従って,最初に pkgdb -Ff を実行した。その際に,gtk がインストールされてない状態だったので,gtk が必要なアプリケーションに対して stale dependency をインストールするかと聞かれた。そこで,よくわからないままインストールしてもらった。それから atk を強制的に再インストールしてから gtk をインストールしたらうまくいった。結局なんでうまくいったのかわからなかった…。困った困った。
(追記その3):再び別のマシンで gtk-2 をアップデートしてみた。今回も atk-1.32.0 でひっかかった。今回は atk-1.32.0portupgrade -f で強制的にアップデートしてもだめだった。そこで,/usr/ports/x11-toolkit/gtk20/ の中の work というディレクトリを全部消し,/var/db/pkg/ の中の gtk-2atk がつくやつを全部消した。それから /usr/ports/accessibility/atk/make deinstall として atk を消してから,再び make install cleanatk をインストールし,その次に /usr/ports/x11-toolkit/gtk20/make install clean としたらうまくいった。今回もなんでうまくいったのかの本質はわかってないが,どうも atk-1.32 を入れなおさないといけない,というのは共通みたい。もしかしたら同じ atk-1.32 と名乗っているけど,元ファイルが違うのかなぁ?でも外部から読み込みはしてなさげやったから,何が違うのかなぁ??

0 件のコメント: