Hatena::ブログ(Diary)

七誌の開発日記(旧) このページをアンテナに追加 RSSフィード

新ブログ Twitter OneDrive Wiki

2010-01-13

[][][][][]クロス開発環境構築

GdiumでOpenBSDの動作確認を行うため、カーネルをクロスビルドしました。最初は無難にOpenBSD上で行い、同じ動作を他のOSで再現するという手順を採りました。

  1. OpenBSD(i386)上でOpenBSD(mips64el)カーネルユーザーランドをクロスビルド
  2. Interix上でOpenBSD(mips64el)カーネルをクロスビルド
  3. Hurd上でOpenBSD(mips64el)カーネルをクロスビルド

ビルドしたカーネルはGdiumで起動中にパニックします。それを修正するため、日常的に使っている環境でクロス開発できるようにしました。Interix上でOpenBSDの開発というのは一見無茶な組み合わせですが、実はそうでもありません。なぜかというとInterixのlibcの一部はOpenBSD由来で、他のUNIXに比べて親和性があるためです。

OpenBSD(i386)

OpenBSD上で他のアーキテクチャカーネルをクロスビルドする手順は驟雨さんがまとめています。

Gdiumはloongsonアーキテクチャですが、loongsonサポートはつい最近CVSコミットされたばかりで、CVSからcurrentを取得する必要があります。sgiもloongsonもmips64ですがエンディアンが異なるため、ビルド時にエンディアンを区別する必要がありますが、そのための修正はCVSにはコミットされていません。後述のビルドツールに同梱しているので参照してください。

エンディアンに関する修正を施せば、カーネルはすんなりビルドできました。

Interix

OpenBSD上でのビルドの動きを見ていると、ビルドに必要なコマンドを用意すれば他のOSでもビルドできそうです。

真っ先に必要になるのはmakeです。OpenBSD特有のマクロを使用するため、GNU makeでは代用できません。OpenBSDのソースから抜き出してビルドできるように改変しました。GNU makeなどと区別するためobmakeという名前で/usr/local/binに入れてビルドプロセスを試しました。

TARGET=loongson obmake cross-gcc

プロセスが進むうちにコマンドがなかったり非互換だったりでエラーが出ます。その度にコマンドを持って来ることを繰り返して、最終的には以下のコマンドを用意すればカーネルビルドまで完了しました。

  • make, mkdep, config, mtree, readlink, rpcgen, compile_et

binutilsgccは本来のビルドプロセスに含まれているため、別途用意しなくても問題ありません。

ビルド中に構築される仮想ルートで所有権の設定を試みますが、Interixにはrootやwheelなどが存在しないためエラーになります。そのため所有権を無視したコマンドも用意しました。

  • chown, install

こうして用意したコマンドだけを、OpenBSDのソースツリーから抜き出してビルドできるようにまとめました。

Debian/Interix環境で以下のパッケージがインストールされていることが前提です。Debian/Interixについてはid:n7shi:20091214id:n7shi:20091215を参照してください。

  • binutils, bison, flex, gcc, groff, install-info, libreadline5-dev, texinfo

環境が整えばクロスツールのインストールは簡単です。

make install

OpenBSDのソースを/usr/srcに展開します。前述のエンディアンやInterix特有の問題などを修正したパッチがpatch/cross.diffにあるため適用します。CVSの時期によってははじかれる可能性があるため、はじかれた場合は手動で対処が必要です。

パッチを適用後、ソースツリーに移動してビルドします。カーネルビルドには大量の環境変数を設定する必要があるため、cross-wrapperとして環境変数シェルスクリプトにダンプできるように改変しています。

cd /usr/src
TARGET=loongson obmake cross-gcc
TARGET=loongson obmake cross-wrapper ← 独自拡張
mv cross-wrapper /usr/local/bin/loongson
cd sys/arch/loongson/conf
obconfig GENERIC
cd ../compile/GENERIC
loongson obmake depend
loongson obmake

この手順は複雑なため一発でできるようにも改変しましたが、今回はカーネルを修正しながら何度もビルドするのが目的のため、あまり意味はありません。

cd /usr/src
TARGET=loongson obmake cross-kernel ← 独自拡張

RAMDISKカーネルにはディスクイメージを入れる必要がありますが、前述の所有権やディスクイメージのマウントなど問題が山積しているため、OpenBSDビルドしたイメージを持って来るのが現実的です。

それ以前の問題として、現段階ではルートのマウントの前にカーネルパニックしてしまうため、RAMDISKカーネルを用意しても意味がありません。パニックせずにルートのマウントまで進むようにカーネルをハックするのが先です。RAMDISKについてはその後で考えることにします。

Hurd

Interixで成功したので、Hurdでも試みました。基本的なやり方はInterixと同じですが、前述のようにInterixはOpenBSDに近いため比較的簡単で、Hurdではそれよりもかなり手間が掛かりました。一部の関数OpenBSDから持って来るのが困難だったため、NetBSDのpkgsrcの互換レイヤ(libnbcompat)から持って来ました。

Hurdで動くようにしたものを置いておきます。readlineは注意が必要で、libreadline6-devではなくlibreadline5-devをインストールしてください。基本的にInterix版にHurd対応コードを付け足したものなので、config.mkを書き換えればInterixでも使えます。

Hurd対応というより実質的にglibc対応です。そのためglibcを使用する他のOSDebian GNU/kFreeBSDなど)でも少しの修正で使用できると思われます。

ちなみにこれをkではないオリジナルのFreeBSDに持って行くと大量のエラーが出ます。OpenBSDFreeBSDとで同じ定義が重複するためです。それらはもともと存在して互換レイヤとして必要ないものですから、削ればうまくいくと思われます。

2009-12-15

[][]インストールレポート

Debian/Interixの手順書(id:n7shi:20091214で翻訳)に沿って、Windows XPインストールしてみました。結論から言うとばっちり動いています。システムを置き換えてどんどんGNU化していくので、そこを割り切れない場合は導入しない方が良いと思います。

GNU系のツール(gettext, bison, flexなど)の自前ビルドから解放されたので、かなり楽になりました。ただしパッケージが古く、自前ビルドしたツール(id:n7shi:20091212に含まれるもの)の方が新しいものもあります(python, gtarなど)。そのためしばらくは自前ビルドと併用することになりそうですが、それらも徐々にdeb化していこうと思います。

インストールレポートは以下の通りです。

hotfix

Debian/Interixを試すまでhotfixの存在を知りませんでした。ちょっと複雑なことをするとすぐbus errorでコアを吐いたりしていたのですが、ロールアップしたところ安定しました。

Debianを使わなくても以下のhotfixはインストール必須です。

Administrator

Administratorでログインして作業するように強く指示されていますが、Windows XPで作業した限り「別のユーザーとして実行」やsuでも問題なくインストールできました。「簡易フォルダの共有」も無効にする必要はないようです。ただし「別のユーザーとして実行」はVistaの「管理者として実行」とは異なりますし、Vistaではまだ試していないため、あくまでXPに限ります。

環境構築後の実運用でも、aptなどがrootかどうかをチェックしているため、パッケージデータベースパーミッションをいじっても一般ユーザーからパッケージをインストールすることはできません。sudoがないためsuでAdministratorになる必要があります。

apt-getでパッケージをインストールする際にもsbinへのパスを通す必要があります。手順書の通り/etc/profile.lclにパス設定を書き加えて、"su -l"としてAdministratorとしてログインして使っています。

エラー?

インストール中に以下のエラーらしきものが出力されましたが、トラブルシューティングの手順("dpkg -l"など)でインストールを確認した所、特に問題はないようでした。実運用でも特に問題はないようです。

$ id -u
197108
$ ksh setup
I: Retrieving Release
I: Retrieving Packages
I: Validating Packages
(中略)
I: Installing core packages...
W: Failure trying to run: chroot // dpkg --force-depends --install
W: Failure trying to run: chroot // dpkg --force-depends --install
(中略)
I: Configuring debconf-english...
W: Failure while configuring base packages.
W: Failure while configuring base packages.
W: Failure while configuring base packages.
W: Failure while configuring base packages.
W: Failure while configuring base packages.
I: Base system installed successfully.
$ 

suではなくAdministratorで実際にログインしたり、「簡易ファイルの共有」を無効にしたりしても、結果に変化はありませんでした。

"apt-get check"の際にもエラーが発生しますが、これは手順書の最後で無視するように指示があります。

W: GPG error: http://debian-interix.net unstable35 Release: The following signat
ures were invalid: NODATA 2
W: GPG error: http://ftp.de.debian.org unstable Release: The following signature
s couldn't be verified because the public key is not available: NO_PUBKEY 9AA38D
CD55BE302B
W: You may want to run apt-get update to correct these problems

署名がないためパッケージのインストール時に毎回確認を求められます。

WARNING: The following packages cannot be authenticated!
  パッケージ名
Install these packages without verification [y/N]? 

これに y と答えないとインストールされません。

dselect

dselectを使うとパッケージデータベースへのアクセスが異常に遅くなるようです。dselectを使う前は"dpkg -l"はすぐに表示されていましたが、dselectを使うと10秒以上待たされるようになりました。

"dpkg --configure -a"としてデータベースの再構築を試みましたが、改善しませんでした。そのため仕方なくDebian/Interix自体を再インストールしました。なお、再インストールの際に削除するファイルが手順書に記載されているので注意が必要です。

対処法は分かっていないため、現時点ではdselectの使用を避けています。

2009-12-14

[][]インストール方法(日本語訳)

Debian Interix Portインストール方法を日本語訳しました。超訳ですが悪しからずご了承ください。

【追記】インストールレポートはid:n7shi:20091215をご覧ください。

Installing Debian GNU/Interix
=============================
last updated: 2009-06-13  mkoeppe@gmx.de
translated  : 2009-12-14  7shi@live.jp


以下の環境で動作を確認しています。
- SFU 3.5 on Windows 2000 SP4
- SFU 3.5 on Windows XP SP2, SP3
- SUA 5.2 on Windows Server 2003 R2
- SUA 6.0 on Windows Vista SP0, SP1


Debian GNU/Interix 環境構築方法:
-------------------------------------------------------

* この手順は Administrator でログインして行ってください。
  Administrator グループでは不十分です!
  ksh を「管理者として実行」するのも不十分です。
  実際に Administrator としてログインしてください!
  Vista では後述の手順で Administrator アカウントを有効にしてください。

* Administrator かどうか確認してください。
  Interix のシェルで "id -u" を実行して 197108 と表示されるはずです。
 これは Administrator の UID です。
 (「管理者として実行」した場合でも 197108 と表示されます)

* Administrator アカウントの有効化:
  Vista はデフォルトで Administrator アカウントが無効化されています。
  ドメインに参加していれば「コンピュータの管理」で以下を開いて、
  ・システムツール -> ローカルユーザーとグループ
  Administrator アカウントを有効化してパスワードを設定してください。
  ドメインに参加していなければ以下を参照してください。
  http://www.interopsystems.com/community/tm.aspx?m=10345
  
* Windows XP では「簡易ファイルの共有」を使用しないでください。

* SFU 3.5 または SUA utilities をダウンロードしてインストールしてください。
  インストール時のオプションは以下を選択してください。
  - Utilities -> Base Utilities
  - Interix GNU Components -> Interix GNU Utilities (/lib/ld.so.1 が必要)
  - Interix GNU SDK (ar が必要)

  - setuid と case sensitive file system を有効にしてください。
  - Vista では SuToRoot を有効にしてください。
  (既にインストールしていた場合はトラブルシューティングを参照してください)

  UNIX Perl は古い (ver.5.6.1) ためインストールしないでください。
  Debian GNU/Interix には 5.10 が含まれています。
  ActiveState Perl もインストールしないでください。
  どうしても必要な場合は以下から最新版をダウンロードしてください。
  http://www.activestate.com

* SFU 3.5 では以下の更新を適用してください。
  - 913030: http://support.microsoft.com/kb/913030/en-us (rollup package)
  - 942312: http://support.microsoft.com/kb/942312/en-us (ld.so update)
  - 973389: http://support.microsoft.com/kb/973389/en-us (最新のコアファイル)
  ダウンロードをリクエストすると Microsoft からメールが送られてきます。
  更新の詳細については以下を参照してください。
  http://www.debian-interix.net/hotfixes/  

* Server 2003 R2 / SUA 5.2 では以下の更新を適用してください。
  - 945449: http://support.microsoft.com/kb/945449/en-us (コアファイル)
  - 948918: http://support.microsoft.com/kb/948918/en-us (libdl.so)

* 最新の Windows Update を適用してください。
  ただし KB920958(2006-09-26) を適用すると Windows 2000 で
  Interix の速度が低下します。

* 環境構築用ファイルをダウンロードしてください。
  ftp://debian-interix.net/debian-interix/install.zip
  適当なフォルダに展開してください。 例: C:\SFU\tmp\install
  スペースを含むパスではインストールに失敗します。
  このアーカイブに含まれるファイルは以下で確認できます。
  ftp://debian-interix.net/debian-interix/install/

* インストールを中断して最初からやり直す場合は、
  以下のファイルやフォルダを削除するかリネームしてください。
  これらが存在すると先に進めなくなります。
  - /debootstrap/debootstrap.log
  - /usr/local/man/man
  - /var/cache/apt/
  - /var/lib/apt/
  - /var/lib/dpkg/

* 64-bit 環境では標準でインストールされる ar コマンドは 64-bit 用です。
  32-bit のものに置き換えてください。
  例: /bin/ar を /bin/ar.amd64 にリネームして、
      /opt/gcc.4.2/bin/ar を /bin/ar にコピーします。

* Korn Shell を開いて Administrator (uid 197108) かどうか確認してください。
  $ id -u
  197108

* /sbin と /usr/sbin にパスを通してください。
  /etc/profile.lcl に以下の行を追加すると便利です。
    export PATH=/usr/sbin:/sbin:$PATH

* 互換性のないコマンドが使われないか確認してください。
  たとえば /usr/local/bin などに他のパッケージのコマンドがある場合、
  /usr/local/bin などより先に /bin や /usr/bin にパスを通せば
  アンインストールする必要はありません。

* 環境構築用ファイルのフォルダに移動してインストールを開始します。
  $ cd /tmp/install
  $ ksh setup
  パッケージをダウンロード・検証・展開してインストールされます。
  非常に長い時間が掛かることがあるようです。(特に Windows 2000)
  インストールが完了すると以下のように表示されます。
  "Base system installed successfully."
  警告やエラーはログファイルで確認できます。
  /debootstrap/debootstrap.log

* /etc/apt/preferences を以下の内容で作成してください。
    Package: *
    Pin: release a=unreleased35
    Pin-Priority: 800
  これは debian-interix で arch:all パッケージを使用するのに必要です。
  詳細については apt_preferences(5) を参照してください。

* パッケージの整合性を確認してください。
  $ apt-get update
  $ apt-get upgrade -f -V
  (これらのパッケージをアンインストールしないでください。
   ここでパッケージが更新されることはないはずです。
   何か問題があれば debian-interix.net のバグかもしれないので、
   報告をお願いします。)

* パッケージのインストール方法:
  $ apt-get install <package> ...
  例:
  $ apt-get install perl mc less dialog
  パッケージのアンインストール方法:
  $ apt-get remove <package> ...
  curses ベースの dselect を使用することもできます。
  (dselect より新しい aptitude はまだ Interix に移植されていません)

* 現時点で coreutils のパッケージは提供されていません。
  coreutils の cp (-a を使用), install, readlink, tac などが必要なときは
  私 (Martin K&ouml;ppe) がビルドしたバイナリが以下にあります。
  http://debian-interix.net/debian-interix/bootstrap-tools/

* パッケージを作成するには以下が必要です。
  これらは arch-all のものに修正が必要です。
  - dpkg-dev
  - debhelper
  - cdbs
  - debootstrap

  たとえば dpkg-dev は以下のようにインストールします。
  $ apt-get install dpkg-dev/unreleased35
  Debian/Interix 用にインストールされるパッケージを確認する場合、
  以下から手動で dpkg-dev_*_all.deb をダウンロードして
  http://www.debian-interix.net/debian-interix/pool/unreleased35/main/d/dpkg/
  インストールする方法もあります。
  $ dpkg -i dpkg-dev_*_all.deb

  標準の Debian のパッケージが更新されても、手元のバージョンを固定化するには、
  以下のようにします。
  $ dpkg --set-selections <<EOF
  dpkg-dev hold
  debhelper hold
  EOF

  Debian-Interix の arch:all パッケージを更新する必要があっても、
  大抵は標準な Debian のパッケージの方が新しいです。
  しかし新しいパッケージはうまく動かないことが多いため、
  Debian-Interix の方をインストールしてください。
  (常に最新のものに追随するのは時間的に難しいです)

  これらの問題に対処するには以下の内容で /etc/apt/preferences を
  作成してください。
  
    Package: *
    Pin: release a=unreleased35
    Pin-Priority: 800

  こうしておけば自動的に Interix 版のパッケージが選択されます。


トラブルシューティング
---------------
既に SFU 3.5 や SUA utilities をインストールしていて、setuid や
case sensitivity や su-to-root を有効にしていなかった場合、
レジストリを書き換えて再起動してください。

case sensitivity:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\obcaseinsensitive
0 for case sensitive; 1 for insensitive

setuid:
HKLM\SOFTWARE\Microsoft\Services for UNIX\EnableSetuidBinaries
or
HKLM\SOFTWARE\Microsoft\SUA\EnableSetuidBinaries
1 to turn on; 0 (zero) to turn off

su-to-root:
HKLM\SOFTWARE\Microsoft\SUA\EnableSuToRoot
1 to turn on; 0 (zero) to turn off


Interix で root に相当する権限のあるユーザーの UID:
  66834 =  0x10512  SYSTEM
 197108 =  0x301F4  local Administrator
1049076 = 0x1001F4  domain Administrator



"ksh setup" の後、インストールに成功したかどうか確認する方法。

- "dpkg -l" としてすべてのパッケージの状態が "ii" かどうか。

- "apt-get check" として以下の 2 行が出力されるかどうか。
     Reading package lists... Done
     Building dependency tree... Done

- /etc/apt/sources.list に少なくとも以下の 3 行が含まれているかどうか。
     deb http://debian-interix.net/debian-interix unstable35 main
     deb http://debian-interix.net/debian-interix unreleased35 main
     deb http://ftp.de.debian.org/debian dists/unstable/main/binary-i386/
  最後の行が適切な Debian のミラーかどうか。

- /debootstrap/debootstrap.log に以下のエラーが含まれていないかどうか。
  "dpkg: error processing xyz"


既知の問題と制限
----------------------------

- "apt-get update" でパッケージリストを更新するときに
  GPGで署名が無効だというエラーが発生します。
  debian-interix.net で提供されるパッケージは署名されていないため
  無視してください。

- パッケージをインストールする際に以下が表示されることがあります。
  "debconf: falling back to frontend"
  dialog パッケージをインストールすれば解消します。
  $ apt-get install dialog

- もし何らかの理由でパッケージのセットアップに失敗する場合、
  以下にあるパッケージ化されていない GNU coreutils を試してみてください。
  http://debian-interix.net/debian-interix/bootstrap-tools/coreutils/bin.tgz

2009-12-12

[][][]クロス開発環境構築

WindowsでNetWalker(Ubuntu 9.04 ARM)のアプリをクロス開発するため、Interix上にクロス開発環境を構築しました。基本的な手順はid:n7shi:20091211FreeBSDと同じですが、Interixではビルドに必要なツールやライブラリを自前で用意しないといけないため大変です。Package Manager for Interixを利用して、自動的にソースをダウンロードしてビルドするようにまとめました。Win32(MinGW)とWin64(id:n7shi:20091004)のクロスコンパイラも同梱しています。

Windows XPでの動作を確認しています。Vistaや7では未確認ですが動作するはずです。独自形式はメンテナンスが大変なので、Debian Interix Portへの移行を検討しています。

ビルド方法

C Shellを管理者として実行して、インストール先を作成します。

% mkdir /opt/pmgr
% chmod 777 /opt/pmgr
% exit

通常ユーザーでC Shellを実行して、ビルドを開始します。

% gzip -dc pmgr-interix-0.2-20091128.tar.gz | tar xvf -
% setenv PATH "/opt/pmgr/bin:$PATH"
% cd pmgr-interix
% make install

ソースをダウンロードしてビルドが始まります。目安として Athlon 64 X2 4600+ (2.4GHz) で約3時間掛かります。(※ダウンロード時間を除く)

パッケージ管理

簡単なパッケージ管理機能があります。

一度ビルドしたパッケージは以下のフォルダに入ります。pmgr-addコマンドで再インストールできます。

  • pmgr-interix/packages/

パッケージ配布

Windows XP用のパッケージの配布を行っています。Vistaや7のInterixとはバイナリ互換性がないため使用できません。

パッケージをインストールするには、pmgr-interix-0.2-20091128.tar.gzからbase/pmgrとbase/xzのインストールが必要です。

% cd pmgr-interix/base/pmgr
% make install
% cd ../xz
% make install
% rehash
% pmgr-add [package file]

pmgrファイルの実体はtar.xzです。オリジナルのtar.bz2から変更しました。

2009-10-04

[][]x64 Windows用gcc

MinGW-w64(x64 Windows用gcc)をInterixに移植しました。Package Manager for Interixを利用して、自動的にソースをダウンロードしてビルドするようにまとめました。

Windows Vista (x64)とWindows 7 (x64)での動作を確認しています。出力するのはInterixバイナリではなくWin64バイナリのため、Interixに依存しません。

ビルド方法

C Shellを管理者として実行して、インストール先を作成します。

% mkdir /opt/pmgr
% chmod 777 /opt/pmgr
% exit

通常ユーザーでC Shellを実行して、ビルドを開始します。

% setenv PATH "/opt/pmgr/bin:/opt/gcc.3.3/bin:$PATH"
% unsetenv GCC_EXEC_PREFIX
% tar xvzf pmgr-x86_64-mingw32-20091005.tar.gz
% cd pmgr-interix
% make install

ソースをダウンロードしてビルドが始まります。目安として Athlon 64 X2 4600+ (2.4GHz) で約2時間掛かります。

% time make install
(中略)
2869.54u 2534.36s 1:52:38.26 79.9%

ダウンロード時間は除いています。

パッケージ管理

簡単なパッケージ管理機能があります。

一度ビルドしたパッケージは以下のフォルダに入ります。pmgr-addコマンドで再インストールできます。

  • pmgr-interix/packages/

パッケージ配布

パッケージの配布も行っています。

パッケージをインストールするには、x86_64-mingw32-interix-20091005.tar.gzからbase/pmgrとbase/bzip2のインストールが必要です。

% cd pmgr-interix/base/pmgr
% make install
% cd ../bzip2
% make install
% rehash
% pmgr-add [package file]

2009-10-03

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