gettextをビルドすると、VERSIONファイルに予期しない構文エラーが発生しました。

gettextをビルドすると、VERSIONファイルに予期しない構文エラーが発生しました。

ソースからgettextパッケージをビルドしようとしています。

実行時にmakeエラーが発生します。

make[5]: Entering directory '/source/gettext-0.22/gettext-tools/libgettextpo'
[..........]
libtool: link:  gcc -shared  -fPIC -DPIC  -Wl,--whole-archive ./.libs/libgnu.a -Wl,--no-whole-archive  -lc  -g -O2   -Wl,-soname -Wl,libgettextpo.so.0 -Wl,-version-script -Wl,.libs/libgettextpo.ver -o .libs/libgettextpo.so.0.5.9
/usr/bin/ld:.libs/libgettextpo.ver:2: syntax error in VERSION script
collect2: error: ld returned 1 exit status
make[5]: *** [Makefile:4012: libgettextpo.la] Error 1
make[5]: Leaving directory '/source/gettext-0.22/gettext-tools/libgettextpo'
[............]
make: *** [Makefile:362: all] Error 2

エラーメッセージは、特定のファイルの2行目に構文エラーの種類があることを示唆しているため、上記のファイルを確認し続けました。

root:/source/gettext-0.22# cat gettext-tools/libgettextpo/.libs/libgettextpo.ver
{ global:
local: *; };

=========更新========

〜のようにスチールドライバー.verファイルは "make"コマンドによって自動的に生成されることをお勧めします。これは以下を担当する出力部分です。

libtool: link: /usr/bin/nm -B   ./.libs/libgnu.a | /usr/bin/sed -n -e 's/^.*[    ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[     ][  ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p' | /usr/bin/sed '/ __gnu_lto/d' | /usr/bin/sed 's/.* //' | sort | uniq > .libs/libgettextpo.exp
libtool: link: /usr/bin/grep -E -e "^([^l]|l[^i]|li[^b]|lib[^g]|libg[^e]|libge[^t]|libget[^t]|libgett[^e]|libgette[^x]|libgettex[^t]|libgettext[^p]|libgettextp[^o]|libgettextpo[^_]|libgettextpo_version).*" ".libs/libgettextpo.exp" > ".libs/libgettextpo.expT"
libtool: link: mv -f ".libs/libgettextpo.expT" ".libs/libgettextpo.exp"
libtool: link: echo "{ global:" > .libs/libgettextpo.ver
libtool: link:  cat .libs/libgettextpo.exp | /usr/bin/sed -e "s/\(.*\)/\1;/" >> .libs/libgettextpo.ver
libtool: link:  echo "local: *; };" >> .libs/libgettextpo.ver

ログを正しく理解すると、makeはlibgnu.aファイルからシンボルを抽出し、いくつかの正規表現に基づいてフィルタリングし、最終的なlibgettextpo.verファイルが生成されるlibgettextpo.expファイルに渡します。

libgnu.aファイルが正しいようです。

root:/source/gettext-0.22/gettext-tools/libgettextpo/.libs# nm -B libgnu.a

asnprintf.o:
                 U __stack_chk_fail
0000000000000000 T libgettextpo_asnprintf
                 U libgettextpo_vasnprintf

fopen.o:
                 U __errno_location
                 U __stack_chk_fail
                 U close
                 U fdopen
                 U fopen
0000000000000000 T libgettextpo_rpl_fopen
                 U memcpy
                 U open
                 U strlen

printf-args.o:
0000000000000000 r .LC0
0000000000000000 T libgettextpo_printf_fetchargs
00000000000000c0 r wide_null_string.0

printf-parse.o:
                 U __errno_location
                 U free
0000000000000000 T libgettextpo_printf_parse
                 U malloc
                 U memcpy
                 U realloc

vasnprintf.o:
                 U __errno_location
                 U __stack_chk_fail
                 U abort
                 U free
                 U libgettextpo_printf_fetchargs
                 U libgettextpo_printf_parse
0000000000000000 T libgettextpo_vasnprintf
0000000000000000 t libgettextpo_vasnprintf.cold
                 U malloc
                 U memcpy
                 U realloc
                 U snprintf

しかし、libgettextpo.exp ファイルが空です。
したがって、問題は次の2行にする必要があります。

libtool: link: /usr/bin/nm -B   ./.libs/libgnu.a | /usr/bin/sed -n -e 's/^.*[    ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[     ][  ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p' | /usr/bin/sed '/ __gnu_lto/d' | /usr/bin/sed 's/.* //' | sort | uniq > .libs/libgettextpo.exp
libtool: link: /usr/bin/grep -E -e "^([^l]|l[^i]|li[^b]|lib[^g]|libg[^e]|libge[^t]|libget[^t]|libgett[^e]|libgette[^x]|libgettex[^t]|libgettext[^p]|libgettextp[^o]|libgettextpo[^_]|libgettextpo_version).*" ".libs/libgettextpo.exp" > ".libs/libgettextpo.expT"

この2行で使用されたコマンドが私のシステムに存在することを確認しました。 sort、uniq、/usr/bin/sed が存在します。
また、バージョン2.3より前では、grepは「-e」フラグを使用できないと聞きました。 grepバージョン3.11があります。

========更新 2======== このプロセスを手動で複製しようとした結果、空のファイルを生成するコマンドは次のとおりです。

root:/source/gettext-0.22/gettext-tools/libgettextpo# /usr/bin/grep -E -e "^([^l]|l[^i]|li[^b]|lib[^g]|libg[^e]|libge[^t]|libget[^t]|libgett[^e]|libgette[^x]|libgettex[^t]|libgettext[^p]|libgettextp[^o]|libgettextpo[^_]|libgettextpo_version).*" ".libs/libgettextpo.exp" > ".libs/libgettextpo.expT"

テストの結果、grep -E -e が期待どおりに機能することがわかりました。フィルタリングする前にlibgettextpo.expの内容も確認しましたが、結果は次のとおりです。

libgettextpo_asnprintf
libgettextpo_printf_fetchargs
libgettextpo_printf_parse
libgettextpo_rpl_fopen
libgettextpo_vasnprintf

どちらの文字列も、ビルドプロセス中に指定された正規表現と一致しないことがわかりました。正規表現に一致するものがないため、libgettextpo.expファイルを生成するlibgnu.aファイルに問題がある可能性があります。 libgnu.aのコンパイル方法は次のとおりです。

/bin/sh ../libtool  --tag=CC   --mode=link gcc  -g -O2 -version-info 5:9:5 -rpath /usr/lib    -lc -no-undefined -export-symbols-regex '^([^l]|l[^i]|li[^b]|lib[^g]|libg[^e]|libge[^t]|libget[^t]|libgett[^e]|libgette[^x]|libgettex[^t]|libgettext[^p]|libgettextp[^o]|libgettextpo[^_]|libgettextpo_version).*'     -o libgettextpo.la -rpath /usr/lib gettext-po.lo ../src/str-list.lo ../src/dir-list.lo ../src/message.lo ../src/pos.lo ../src/msgl-ascii.lo ../src/po-error.lo ../src/po-xerror.lo ../src/write-catalog.lo ../src/write-po.lo ../src/open-catalog.lo ../src/po-charset.lo ../src/po-lex.lo ../src/po-gram-gen.lo ../src/read-po.lo ../src/read-catalog-abstract.lo ../src/read-catalog.lo ../src/plural-table.lo ../src/format-c.lo ../src/format-c++-brace.lo ../src/format-python.lo ../src/format-python-brace.lo ../src/format-java.lo ../src/format-java-printf.lo ../src/format-csharp.lo ../src/format-javascript.lo ../src/format-scheme.lo ../src/format-lisp.lo ../src/format-elisp.lo ../src/format-librep.lo ../src/format-ruby.lo ../src/format-sh.lo ../src/format-awk.lo ../src/format-lua.lo ../src/format-pascal.lo ../src/format-smalltalk.lo ../src/format-qt.lo ../src/format-qt-plural.lo ../src/format-kde.lo ../src/format-kde-kuit.lo ../src/format-boost.lo ../src/format-tcl.lo ../src/format-perl.lo ../src/format-perl-brace.lo ../src/format-php.lo ../src/format-gcc-internal.lo ../src/format-gfc-internal.lo ../src/format.lo ../src/plural-exp.lo ../src/plural-eval.lo ../src/msgl-check.lo ../src/sentence.lo  libgnu.la  
libtool: link: rm -fr  .libs/libgettextpo.exp .libs/libgettextpo.ver

関連情報