2009年7月24日金曜日

(FreeBSD) portsのdevel/gettextは、textproc/libcrocoに依存していないようで、実は依存してる

FreeBSDでportsでインストールしたソフトウェアのうち、不要なものをどんどこアンインストールしていったら、gettext関係のコマンドが動かなくなりました。



% ldd /usr/local/bin/msgfmt
/usr/local/bin/msgfmt:
        libgettextsrc-0.17.so => /usr/local/lib/libgettextsrc-0.17.so (0x48085000)
        libgettextlib-0.17.so => /usr/local/lib/libgettextlib-0.17.so (0x480b7000)
        libcroco-0.6.so.3 => /usr/local/lib/libcroco-0.6.so.3 (0x4818a000)
        libxml2.so.5 => /usr/local/lib/libxml2.so.5 (0x481bb000)
        libz.so.3 => /lib/libz.so.3 (0x482d3000)
        libm.so.4 => /lib/libm.so.4 (0x482e4000)
        libglib-2.0.so.0 => /usr/local/lib/libglib-2.0.so.0 (0x482fa000)
        libintl.so.8 => /usr/local/lib/libintl.so.8 (0x4839e000)
        libpcre.so.0 => /usr/local/lib/libpcre.so.0 (0x483a7000)
        libncurses.so.6 => /lib/libncurses.so.6 (0x483d6000)
        libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x48413000)
        libc.so.6 => /lib/libc.so.6 (0x4850a000)



ということになっているので、gettextはlibcrocoに依存しているのでした。libcrocoをアンインストールしちゃったので、ダメになった、と。



しかし、portsのdevel/gettextを見ても、libcrocoへの依存関係はどこにも指定されていませんし、pkg_infoで見ても



% pkg_info -r gettext-0.17_1
Information for gettext-0.17_1:



Depends on:
Dependency: libiconv-1.13.1



ということなので、ports的には依存関係はない、とされています。そのため、libcrocoをあっさりとpkg_deleteできてしまうのです。ところが、gettextが共有ライブラリlibcrocoをリンクしている!



gettextのconfigureスクリプトをながめていると



  • libcrocoがインストール済みだった場合は、そのインストール済みのlibcrocoを使う


  • libcrocoがインストールされていない場合は、gettextの配布パッケージ内にあるlibcrocoを使う


という挙動になっているようです。



gettextのconfigureは、このへんのファイルがあるかどうかで、判断しているようです。



% ls -l /usr/local/include/libcroco-0.6/libcroco/libcroco-config.h
-r--r--r--  1 root  wheel  258  2 16 13:20 /usr/local/include/libcroco-0.6/libcroco/libcroco-config.h



gettextのconfig.logでは、こんな感じ。



configure:30907: result: yes
configure:30795: checking libcroco-0.6/libcroco/libcroco-config.h usability
configure:30812: cc -std=gnu99 -c -O2 -fno-strict-aliasing -pipe -I/usr/local/in
clude conftest.c >&5
configure:30818: $? = 0
configure:30832: result: yes
configure:30836: checking libcroco-0.6/libcroco/libcroco-config.h presence
configure:30851: cc -E -I/usr/local/include conftest.c
configure:30857: $? = 0
configure:30871: result: yes
configure:30899: checking for libcroco-0.6/libcroco/libcroco-config.h
configure:30907: result: yes



生成されたMakefileをgrepしてみました。



% grep croco Makefile
        $(top_srcdir)/gnulib-m4/libcroco.m4 \
INCCROCO = -I///usr/local/include/libcroco-0.6/libcroco
LIBCROCO = /usr/local/lib/libcroco-0.6.so /usr/local/lib/libglib-2.0.so /usr/local/lib/libintl.so /usr/local/lib/libpcre.so /usr/local/lib/libxml2.so -lz /usr/local/lib/libiconv.so -lm -Wl,-rpath -Wl,/usr/local/lib
LTLIBCROCO = -L/usr/local/lib -lcroco-0.6 -L/usr/local/lib -lglib-2.0 -L/usr/local/lib -lintl -L/usr/local/lib -lpcre -L/usr/local/lib -lxml2 -lz -L/usr/local/lib -liconv -lm -R/usr/local/lib



というわけで、

ports/devel/gettext/Makefileに、libcrocoへの依存関係を追加したほうがいいんじゃない?



と思ったのですが



% pkg_info -r libcroco-0.6.2
Information for libcroco-0.6.2:



Depends on:
Dependency: python25-2.5.2_3
Dependency: perl-5.8.9_3
Dependency: pkg-config-0.23_1
Dependency: pcre-7.9
Dependency: libiconv-1.13.1
Dependency: libxml2-2.7.3
Dependency: gettext-0.17_1
Dependency: glib-2.20.4
Dependency: gamin-0.1.10_3
Dependency: gio-fam-backend-2.20.4



というように、libcroroがgettextに依存しているため、依存関係のループができてしまいます。



gettextの配布パッケージ内のファイルを適当にgrepしてみますと



configure:  --with-included-libcroco  use the libcroco included here



なんてのが出てくるので、gettextをconfigureするときに、--with-included-libcroco を追加すればよさそうです。



ほかにも方法があるかもしれませんが、/usr/ports/devel/gettext/Makefile の中の



CONFIGURE_ARGS= --disable-csharp --disable-threads --disable-openmp





CONFIGURE_ARGS= --disable-csharp --disable-threads --disable-openmp --with-included-libcroco



にすると、うまいこといきました。



% ldd /usr/local/bin/msgfmt
/usr/local/bin/msgfmt:
        libgettextsrc-0.17.so => /usr/local/lib/libgettextsrc-0.17.so (0x48085000)
        libgettextlib-0.17.so => /usr/local/lib/libgettextlib-0.17.so (0x480b7000)
        libglib-2.0.so.0 => /usr/local/lib/libglib-2.0.so.0 (0x481b8000)
        libintl.so.8 => /usr/local/lib/libintl.so.8 (0x4825c000)
        libpcre.so.0 => /usr/local/lib/libpcre.so.0 (0x48265000)
        libncurses.so.6 => /lib/libncurses.so.6 (0x4829d000)
        libiconv.so.3 => /usr/local/lib/libiconv.so.3 (0x482da000)
        libc.so.6 => /lib/libc.so.6 (0x483d1000)



/usr/local/lib/libcroco.soのほうは、libxml2とかもリンクしているのに、gettextに付属のlibcrocoではlibxml2は出てこないので、何か違いが生じるのかもしれませんが・・・





Makefileを書き換えずに



make CONFIGURE_ARGS+="--with-included-libcroco"



でもうまくいくんじゃないかと思ったんですが、infoファイルをインストールする最中に、エラーが出てしまいました。



どうやら、configureのオプションに、「--infodir=/usr/local/info/」など、いろいろ追加されなければいけないのに、make CONFIGURE_ARGS+=~で実行してしまうと、そういったportsが裏でコッソリ追加してるオプションが付かなくなってしまい、それでエラーになるようです。



え~?そうなの??
なんか勘違いしてるかも。



0 件のコメント:

コメントを投稿