libicui18n.so.36 を動的リンクする ports を総入れ換え2008年03月26日 18時07分23秒

devel/icu を icu-3.8.1 に更新された後に、何故だか compat に移された libicu*.so.36 が無くなることが何度かあった。これが無くなると、sylpheed やその他のかなりのプログラムが動かなくなる。

今までは、ライブラリを restore していたが、何度か続いたので面倒臭くなってきた。そこで、いくつかの問題が。portupgrade -rf devel/icu では既に新しいライブラリを使っている物まで再コンパイルする必要が出てくる。特に何らかの事情で一旦停止した後には再開不可能だ。

そこで、pkg_libchk を使う。pkg_libchk も何回も動かすとかなり時間が掛かるので、結果をファイルに保存する。


$ pkg_libchk | tee /tmp/libs.txt
^MPreparing ...^M^MStarting job 1 of 1132: GeoIP-1.4.4^M^MStarting job 2 of 1132
: GraphicsMagick-1.1.10^M^MStarting job 3 of 1132: Hermes-1.3.3_2       ^M^MStar
ting job 4 of 1132: ImageMagick-6.3.6.9^M^MStarting job 5 of 1132: ORBit-0.5.17_
3     ^M^MStarting job 6 of 1132: ORBit2-2.14.12^M^MStarting job 7 of 1132: Open
EXR-1.6.0 ^M^MORBit2-2.14.12: /usr/local/bin/linc-cleanup-sockets misses libicui
18n.so.36
Starting job 7 of 1132: OpenEXR-1.6.0^M^MORBit2-2.14.12: /usr/local/bin/orbit-id
l-2 misses libicui18n.so.36
Starting job 7 of 1132: OpenEXR-1.6.0^M^MORBit2-2.14.12: /usr/local/lib/libORBit
-2.so.0 misses libicui18n.so.36
Starting job 7 of 1132: OpenEXR-1.6.0^M^MStarting job 8 of 1132: OpenSP-1.5.2 ^M
^MStarting job 9 of 1132: SpecTcl-1.1_4^M^MStarting job 10 of 1132: Terminal-0.2
.8^M^MStarting job 11 of 1132: Thunar-0.9.0  ^M^MStarting job 12 of 1132: Xaw3d-
1.5E_2^M^MStarting job 13 of 1132: a2ps-a4-4.13b_4^M^MStarting job 14 of 1132: a
alib-1.4.r5_4 ^M^MStarting job 15 of 1132: adns-1.4_1    ^M^MStarting job 16 of
1132: adobe-cmaps-20051217_1^M^MStarting job 17 of 1132: akode-2.0.2,,

ファイルを見たら、^M のコントロールコードが見えた。nkf 以外でも改行コードの変換が出来たような気がするが思い出せない。

$ nkf -Lu libs.txt

Preparing ...

Starting job 1 of 1132: GeoIP-1.4.4

Starting job 2 of 1132: GraphicsMagick-1.1.10

Starting job 3 of 1132: Hermes-1.3.3_2       

Starting job 4 of 1132: ImageMagick-6.3.6.9

Starting job 5 of 1132: ORBit-0.5.17_3     

Starting job 6 of 1132: ORBit2-2.14.12

Starting job 7 of 1132: OpenEXR-1.6.0 

ORBit2-2.14.12: /usr/local/bin/linc-cleanup-sockets misses libicui18n.so.36
Starting job 7 of 1132: OpenEXR-1.6.0

ORBit2-2.14.12: /usr/local/bin/orbit-idl-2 misses libicui18n.so.36
Starting job 7 of 1132: OpenEXR-1.6.0

この結果をスクリプトで libcui を使っている物だけを抜き出す。折角なので、awk を使い、libicu*.so.36 を使うものを探しだし、パッケージ名を出力する。大した手間でもないので、重複も消す。


$ nkf -Lu -d libs.txt | awk -F: '/libicu/{if($1 in done)next; print $1; done[$1]=$1}'
RBit2-2.14.12
arts-1.5.8,1
at-spi-1.20.1
bug-buddy-2.20.1
compiz-0.6.2
dasher-4.6.1,1
dbus-glib-0.74
emerald-0.5.2_1
enchant-1.3.0
...

これで、portupgrade を使い更新する。


$ portupgrade -f `nkf -Lu -d libs.txt | awk -F: '/libicu/{if($1 in done)next; print $1; done[$1]=$1}'`

かなりの量があり、途中で一度中断する羽目になったが、無事に終わった。