zsh 5.0.2をAndroid NDKでクロスコンパイルする

まずhttp://zsh.sourceforge.net/Arc/source.html から zsh-5.0.2.tar.bz2 をダウンロードします。

ビルドには ncurses, PCRE, libiconv の各ライブラリが必要です。以前の記事「ncurses 5.9をAndroid NDKでクロスコンパイルする」「PCRE 8.33をAndroid NDKでクロスコンパイルする」および「libiconv 1.14をAndroid NDKでクロスコンパイルする」を参照してください。

zshに含まれるconfig.subはAndroidのクロスコンパイル環境に対応していない古いものなので、libtoolのファイルをコピーしてからconfigureします。

また、_mktemp(3)を使わないようにするためconfigureに対して環境変数をセットします(理由は後述)。

さらに、Android 4.3時点ではttyname(3)は未実装であり、下記のようなエラーメッセージを出してNULLを返します。

char* ttyname(int)(3) is not implemented on Android

zshは内部的にttyname(3) を利用しているので、これを利用しないよう、パッチを当てた上でttyname(3)を使わないよう環境変数をセットします。

configure中で利用しているpcre-config(シェルスクリプト)にパスを通す必要もあります。

以上を反映したものが下記の実行例です。

$ tar xvjf zsh-5.0.2.tar.bz2
$ cd zsh-5.0.2
$ for i in `find . -name config.guess` ; do cp /usr/local/share/libtool/config/config.guess $i ; done
$ for i in `find . -name config.sub` ; do cp /usr/local/share/libtool/config/config.sub $i ; done
$ curl https://gist.github.com/hnw/6751590/raw/0297fdc1987130f67d3cde11dc76fa18276da3c8/zsh-5.0.2-android-patch.txt | patch -p1
$ autoreconf
$ PATH=$ANDROID_APP_ROOT/pcre-8.33/bin:$PATH CFLAGS="-O2 -I$ANDROID_APP_ROOT/ncurses-5.9/include -I$ANDROID_APP_ROOT/pcre-8.33/include -I$ANDROID_APP_ROOT/libiconv-1.14/include" LDFLAGS="-s -L$ANDROID_APP_ROOT/ncurses-5.9/lib -L$ANDROID_APP_ROOT/pcre-8.33/lib -L$ANDROID_APP_ROOT/libiconv-1.14/lib" ac_cv_func__mktemp=no ac_cv_func_ttyname=no ./configure --host=arm-linux-androideabi --prefix=$ANDROID_APP_ROOT/zsh-5.0.2 --with-term-lib=ncurses --disable-locale --disable-multibyte --enable-pcre
$ make
$ make install

Androidの_mktemp(3)について

Android NDK r9時点では、toolkitに含まれるlibcは_mktempという関数を含んでいるようで、configure中のチェックビルドでは_mktempシンボルを解決できてしまいます。

しかし、実際に_mktempを利用しているバイナリを実機で実行しようとすると下記のようなエラーが出てしまいます。

CANNOT LINK EXECUTABLE: cannot locate symbol "_mktemp" referenced by "/data/local/tmp/a.out"...

このように、AndroidのlibcとAndroid NDKのlibcとが異なっていることがあるようです。この手のトラブルは実機やエミュレータで動かしてみるまでわからないので、なかなか厄介です。

installed files

bin/zsh
bin/zsh-5.0.2
share/man/man1/*.1
share/zsh/5.0.2/functions/*