【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

libiconv

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の移植は完了です。