2008年3月8日土曜日

(pkgsrc) Debian GNU/Linuxで、lang/gcc34がビルドできなかった。undefined reference to `libintl_gettext'

先日、pkgsrcでパッケージをあれこれアップデートしてたとき、ちょっと手がすべって、「bmake replace」というコマンドを入力したつもりが、「bmake update」としてしまいました。



昔からこのbmake updateの挙動はおかしいと思ってたんですけど、updateの場合、依存関係のあるパッケージがいっせいに削除されます。



今回は、gcc34などまで、どんどこ削除され、そして、アップデート作業がはじまるのですが、何かをビルドする途中でエラーがでて、・・・なんかぁ、あれこれきれいさっぱり消されただけで終了・・・ということになってしまいました。



そんなこともあろうかと、baculaでバックアップはとってあります。さっさとrestoreしよう…



ない。バックアップがない…



毎月1回のフルダンプが、先月失敗してたみたいで、先々月の分はとっくにexpireされて消えてなくなってました。たしかフルダンプが無いときは、たとえスケジュールではインクリメンタルになっていても、強制的にフルになってたような気がするんですが、あれぇ~どうしたんだろう…?





消えちゃったものは仕方ない。また作ればいい。



ということで、またpkgsrcで、あれこれビルドしはじめました。



ということで、pkgsrc/lang/gcc34をビルドしてるときに、こんなエラー。



stage1/xgcc -Bstage1/ -B/usr/pkg/gcc34/i686-pc-linux-gnu/bin/   -g -O2 -DIN_GCC   -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -pedantic -Wno-long-long -Wold-style-definition     -DHAVE_CONFIG_H  -o cc1 \
        c-parse.o c-lang.o c-pretty-print.o stub-objc.o attribs.o c-errors.o c-lex.o c-pragma.o c-decl.o c-typeck.o c-convert.o c-aux-info.o c-common.o c-opts.o c-format.o c-semantics.o c-incpath.o cppdefault.o c-ppoutput.o c-cppbuiltin.o prefix.o c-objc-common.o c-dump.o c-pch.o libcpp.a  main.o libbackend.a ../libiberty/libiberty.a 
c-decl.o(.text+0x4cfa): In function `grokdeclarator':
/pkgsrc.work/lang/gcc34/work/gcc-3.4.6/gcc/c-decl.c:3188: undefined reference to `libintl_gettext'

c-decl.o(.text+0x6321): In function `finish_struct':
...../WORK/lang/gcc34/work/gcc-3.4.6/gcc/c-decl.c:4996: undefined reference to `libintl_gettext'
c-decl.o(.text+0x633c):...../WORK/lang/gcc34/work/gcc-3.4.6/gcc/c-decl.c:4996: undefined reference to `libintl_gettext'
c-decl.o(.text+0x6750):...../WORK/lang/gcc34/work/gcc-3.4.6/gcc/c-decl.c:4985: undefined reference to `libintl_gettext'
c-decl.o(.text+0x68d7):...../WORK/lang/gcc34/work/gcc-3.4.6/gcc/c-decl.c:4996: undefined reference to `libintl_gettext'
c-typeck.o(.text+0x1ade):...../WORK/lang/gcc34/work/gcc-3.4.6/gcc/c-typeck.c:2676: more undefined references to `libintl_gettext' follow
libbackend.a(intl.o)(.text+0x41): In function `gcc_init_libintl':
...../WORK/lang/gcc34/work/gcc-3.4.6/gcc/intl.c:44: undefined reference to `libintl_bindtextdomain'
libbackend.a(intl.o)(.text+0x4d):...../WORK/lang/gcc34/work/gcc-3.4.6/gcc/intl.c:45: undefined reference to `libintl_textdomain'
collect2: ld returned 1 exit status
make[2]: *** [cc1] Error 1
make[2]: Leaving directory `...../WORK/lang/gcc34/work/obj/gcc'
make[1]: *** [stage2_build] Error 2
make[1]: Leaving directory `...../WORK/lang/gcc34/work/obj/gcc'
make: *** [bootstrap] Error 2
*** Error code 2

Stop.
bmake: stopped in /usr/pkgsrc/lang/gcc34



libintl_gettextというシンボルは、調べてたらlibintlにあるそうなので、libintlがリンクされればいいんですが、リンクされていないみたいです。



プラットフォームは、わけあって、古いDebian GNU/Linux(よく知らないんですがpotatoというものみたい)なんですが、ほかのプラットフォームでも同じエラーがでるのかどうかはわかりません。



エラーが発生したディレクトリ(~/lang/gcc34/work/obj/gcc)のMakefileを見ると、

# How to link with both our special library facilities
# and the system's installed libraries.
LIBS =  $(LIBIBERTY) $(LIBINTL) $(LIBICONV)

とか

# Internationalization library.
LIBINTL =
LIBINTL_DEP =

というのがあるんで、リンクされてそうで、されてなさそうな。う~ん、よくわからない。長いMakefileって、何がどうなってるのか読みにくいですね。まあ、エラーなのでlibintlが入らなかったんでしょう。



とりあえず、こんな風に書き換えてやればいいかな?と思ったのですが、ダメでした。

# How to link with both our special library facilities
# and the system's installed libraries.
LIBS =  $(LIBIBERTY) $(LIBINTL) -L/usr/pkg/lib -lintl $(LIBICONV)

このMakefileがあるディレクトリでそのままgmakeすると、とりあえず通るんですが、このあとの、objファイルのコンペア時にエラーになるので(GCCのビルドでやってる、2回コンパイルして、同じになるかどうか比較する、ってやつだと思う)、ダメでした。



pkgsrcって、表示されている実行中のコマンドがgccとなっていても、素のgccが使われているのではなくて、wrapperスクリプトを通して実行しているので、pkgsrcの元でbmakeでビルドするのと、直接gmakeするのとでは、ビルドのときに実行されるコマンドが違ってしまうみたいです。



というわけで、pkgsrc/lang/gcc34へ戻ってからbmakeすればいいと思ったのですが、ダメ。
うまくいかない。たぶん、「-L/usr/pkg/lib -lintl」というオプションが、wrapperで削除されているっぽいです。



というわけで、Makefileは、/usr/pkg/lib/libintl.a と書いてしまいました。

LIBS =  $(LIBIBERTY) $(LIBINTL) /usr/pkg/lib/libintl.a $(LIBICONV)


とりあえずこれでビルドできたので、まあいいとしておきました。



0 件のコメント:

コメントを投稿