GNUツールはInterixですんなりビルドできないことが多いです。Interixはバージョンによってかなり異なりますが、今回はWindows Vista(x64)のSUAにlibiconv-1.13を移植します。Windows 7(x64)でも同様です。
- 修正箇所: config.guess, PATH, ソースの修正, 実行属性
config.guess
configureでOS(Interix)が認識されずに停止します。
% ./configure (中略) UNAME_MACHINE = authenticamd UNAME_RELEASE = 6.0 UNAME_SYSTEM = Interix UNAME_VERSION = 10.0.6030.0 configure: error: cannot guess build type; you must specify one
config.guessを新しいものに差し替えると認識します。libtool-2.2.6aがInterix 6(Windows Vista以降)に対応しています。config.guessは以下にあります。
- libtool-2.2.6/libltdl/config/config.guess
libiconvには複数のconfig.guessがあります。これらをすべて上書きします。
- libiconv-1.13/build-aux/config.guess
- libiconv-1.13/libcharset/build-aux/config.guess
これでconfigureが通るようになります。
PATH
makeすると以下のエラーで止まります。
ar: Either the AR_LIBRARIAN environment variable must be set ar: or you must include the directory containing 'lib.exe' in PATH
GNUツールでビルドする場合にはgccと同じパスのarを使う必要があります。デフォルトでは/bin/arが使われるためこのようなエラーになります。
% which ar /bin/ar % printenv PATH /bin:/opt/gcc.3.3/bin:/usr/contrib/bin:/usr/X11R6/bin:/usr/local/bin:/usr/contrib/win32/bin
PATH環境変数を設定することで回避します。
% setenv PATH "/opt/gcc.3.3/bin:$PATH"
/opt/gcc.3.3/binが二重に定義されるのが気になりますが、実用的には問題ないので無視します。
ソースの修正
makeを進めるとエラーが発生します。
In file included from iconv.c:234: iconv_open2.h: In function `libiconv_open': iconv_open2.h:85: error: structure has no member named `state' iconv_open2.h:85: error: `mbstate_t' undeclared (first use in this function) iconv_open2.h:85: error: (Each undeclared identifier is reported only once iconv_open2.h:85: error: for each function it appears in.)
該当箇所(lib/iconv_open2.h)は以下のようになっています。
struct wchar_conv_struct * wcd = (struct wchar_conv_struct *) cd; memset(&wcd->state,'\0',sizeof(mbstate_t));
wchar_conv_structにstateがないというエラーのため、wchar_conv_structの定義を確認します。(lib/loop_wchar.h)
struct wchar_conv_struct { struct conv_struct parent; #if HAVE_WCRTOMB || HAVE_MBRTOWC mbstate_t state; #endif };
mbstate_tがない環境ではstateを定義していません。エラーになった箇所も同様の条件を追加します。
--- lib/iconv_open2.h.orig +++ lib/iconv_open2.h @@ -79,9 +79,11 @@ cd->hooks.wc_hook = NULL; cd->hooks.data = NULL; #endif + #if HAVE_WCRTOMB || HAVE_MBRTOWC /* Initialize additional fields. */ if (from_wchar != to_wchar) { struct wchar_conv_struct * wcd = (struct wchar_conv_struct *) cd; memset(&wcd->state,'\0',sizeof(mbstate_t)); } + #endif /* Done. */
makeは無事に終了します。
実行属性
このままではインストールしても起動しません。
% make install (中略) % /usr/local/bin/iconv /usr/local/bin/iconv: error in loading shared libraries libiconv.so.2: system cannot load image
これはInterixでは共有ライブラリにも実行属性が必要なためです。実行属性を付けると起動します。
% chmod 755 /usr/local/lib/libiconv.so.2.5.0 % iconv Usage: iconv -f fromcode -t tocode [file...] Usage: iconv -l
これでlibconvの移植は完了です。