Interix 6.1 (SUA Windows7) で texinfo のビルドがうまくいかない原因を調査しました。
下記の2つの関数が見つからないためです。
mbsinit
mbrtowc
m4-1.4.15 でも上記の関数が使用さてれいますがビルドが成功します。
- Fedora 14 (Linux)の場合
configure の結果
checking for mbsinit... yes
checking for mbrtowc... yes
make の結果
rm -f libm4.a
ar cru libm4.a gl_avltree_oset.o c-ctype.o c-stack.o clean-temp.o execute.o exitfail.o fatal-signal.o fd-safer-flag.o dup-safer-flag.o freadahead.o freading.o gl_linkedhash_list.o gl_list.o localcharset.o lock.o malloca.o memchr2.o gl_oset.o pipe.o pipe2.o pipe2-safer.o printf-frexp.o printf-frexpl.o progname.o threadlib.o tls.o tmpdir.o verror.o version-etc.o version-etc-fsf.o wait-process.o xalloc-die.o gl_xlist.o xmalloca.o gl_xoset.o xprintf.o xstrndup.o xvasprintf.o xasprintf.o asnprintf.o asprintf.o basename.o basename-lgpl.o cloexec.o close-stream.o closein.o closeout.o dirname.o dirname-lgpl.o dup-safer.o fcntl.o fd-safer.o fflush.o filenamecat.o filenamecat-lgpl.o fopen-safer.o fpurge.o fseeko.o isnanl.o mkstemp-safer.o pipe-safer.o printf-args.o printf-parse.o quotearg.o regex.o stripslash.o strstr.o tempname.o vasnprintf.o vasprintf.o xmalloc.o
ranlib libm4.a
..........
gcc -std=gnu99 -g -O2 -o m4 m4.o builtin.o debug.o eval.o format.o freeze.o input.o macro.o output.o path.o symtab.o ../lib/libm4.a - Interix 6.1 の結果
configure の結果
checking for mbsinit... no
checking for mbrtowc... no
make の結果
gcc -std=gnu99 -I. -D_ALL_SOURCE -O -MT mbrtowc.o -MD -MP -MF .deps/mbrtowc.Tpo -c -o mbrtowc.o mbrtowc.c
mv -f .deps/mbrtowc.Tpo .deps/mbrtowc.Po
gcc -std=gnu99 -I. -D_ALL_SOURCE -O -MT mbsinit.o -MD -MP -MF .deps/mbsinit.Tpo -c -o mbsinit.o mbsinit.c
mv -f .deps/mbsinit.Tpo .deps/mbsinit.Po
.....
rm -f libm4.a
ar cru libm4.a gl_avltree_oset.o c-ctype.o c-stack.o clean-temp.o execute.o exitfail.o fatal-signal.o fd-safer-flag.o dup-safer-flag.o freadahead.o freading.o gl_linkedhash_list.o gl_list.o localcharset.o lock.o malloca.o memchr2.o gl_oset.o pipe.o pipe2.o pipe2-safer.o printf-frexp.o printf-frexpl.o progname.o threadlib.o tls.o tmpdir.o verror.o version-etc.o version-etc-fsf.o wait-process.o xalloc-die.o gl_xlist.o xmalloca.o gl_xoset.o xprintf.o xstrndup.o xvasprintf.o xasprintf.o asnprintf.o asprintf.o basename.o basename-lgpl.o btowc.o cloexec.o close-stream.o closein.o closeout.o dirname.o dirname-lgpl.o dup-safer.o error.o fcntl.o fd-safer.o fflush.o filenamecat.o filenamecat-lgpl.o fopen-safer.o fpending.o fpurge.o frexp.o frexpl.o fseeko.o getopt.o getopt1.o isnanf.o isnanl.o mbrtowc.o mbsinit.o mkdtemp.o mkstemp-safer.o obstack.o pipe-safer.o printf-args.o printf-parse.o quotearg.o rawmemchr.o regex.o rmdir.o signbitd.o signbitf.o signbitl.o spawn_faction_addclose.o spawn_faction_adddup2.o spawn_faction_addopen.o spawn_faction_destroy.o spawn_faction_init.o spawnattr_destroy.o spawnattr_init.o spawnattr_setflags.o spawnattr_setsigmask.o spawni.o spawnp.o strchrnul.o strerror.o stripslash.o strndup.o strnlen.o strstr.o strtod.o tempname.o vasnprintf.o vasprintf.o wcrtomb.o xmalloc.o
ranlib libm4.a
.....
gcc -std=gnu99 -D_ALL_SOURCE -O -Wl,-R/usr/pkg/lib -o m4 m4.o builtin.o debug.o eval.o format.o freeze.o input.o macro.o output.o path.o symtab.o ../lib/libm4.a
関数が存在しないときはソースからライブラリ(libm4.a)を作成して組み込んでいるようです。
別の場所でmakeファイル等を直して、無いときはソースから作成するように変更してみました。
ソースはm4と同じものを使用しました。
------------------------------------------
gcc -g -O2 -o ginfo dir.o display.o dribble.o echo-area.o filesys.o footnotes.o gc.o indices.o info-utils.o info.o infodoc.o infomap.o m-x.o man.o nodemenu.o nodes.o search.o session.o signals.o terminal.o tilde.o variables.o window.o doc.o ../lib/libtxi.a ../gnulib/lib/libgnu.a -lncurses
display.o(.text+0xa1f): In function `mbiter_multi_next':
unix/src/gnu/texinfo-4.13/info/../gnulib/lib/mbiter.h:137: undefined reference to `_mbrtowc'
session.o(.text+0x6f0f): In function `mbiter_multi_next':
unix/src/gnu/texinfo-4.13/info/../gnulib/lib/mbiter.h:137: undefined reference to `_mbrtowc'
window.o(.text+0x26ff): In function `mbiter_multi_next':
unix/src/gnu/texinfo-4.13/info/../gnulib/lib/mbiter.h:137: undefined reference to `_mbrtowc'
collect2: ld returned 1 exit status
gmake[3]: *** [ginfo] Error 1
------------------------------------------
ビルドに失敗しました。mbsinitは消えましたがmbrtowcが残っています。
glibc-2.12.2のソースを見ると最後にエイリアスが仕込まれていますね。
libc_hidden_def (__mbrtowc)
weak_alias (__mbrtowc, mbrtowc)
libc_hidden_weak (mbrtowc)
ソースをglibc-2.12.2のに代えてビルドしてみます。
Interix は BSD と System V からの移行に対応で Linux にするよりいいですよってことみみたいですね。
GNU C Library (glibc) とBSD C Library は対応しています。
Interix の C Library は、System V よりなのかな。
----------------------------------------------------------
Gnulib module: mbsinit
Portability problems fixed by Gnulib:
- This function is missing on some platforms: HP-UX 11.00, IRIX 6.5, Solaris 2.6, Interix 3.5.
----------------------------------------------------------
関数の詳細
http://www.gnu.org/software/hello/manual/gnulib/mbsinit.html
http://www.gnu.org/software/hello/manual/gnulib/mbrtowc.html
Interix についての参考
http://technet.microsoft.com/ja-jp/library/bb463202.aspx
http://technet.microsoft.com/ja-jp/interopmigration/bb380242.aspx
http://msdn.microsoft.com/ja-jp/library/bb463206.aspx