ttt

getttyent

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

2009-07-23 23:27:18 | デジタル・インターネット

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が裏でコッソリ追加してるオプションが付かなくなってしまい、それでエラーになるようです。

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