Android NDK: Host 'awk' tool is outdated. Please define HOST_AWK to point to Gawk or Nawk !

先日リリースされたNDK r7を使った時に若干ハマったのでメモしときます。

いつものようにこちらからダウンロードして、適当なディレクトリに解凍、パスを通しておしまい・・・と思って、もともとあったソースコードをビルドしてみると

% ndk-build -B 
[...]/android-ndk-r7/prebuilt/linux-x86/bin/awk: 1: ELF: not found
[...]/android-ndk-r7/prebuilt/linux-x86/bin/awk: 4: Syntax error: word unexpected (expecting ")")
Android NDK: Host 'awk' tool is outdated. Please define HOST_AWK to point to Gawk or Nawk !    
[...]/android-ndk-r7/build/core/init.mk:258: *** Android NDK: Aborting.    .  Stop.


あれれ?なんか怒られた。。。
こんなことは初めて。さてどうしたものかとネットを漁ってみたけどサクッとは見つからず。INSTALL.htmlを読むと

The NDK also requires a Nawk or GNU Awk executable being available on your
development system. Note that the original 'awk' program doesn't implement
the 'match' and 'substr' functions used by the NDK build system.


なるほど。オリジナルのawkではNG。gawkかnawkが必要とのこと。
でも確認してみるとgawkもnawkもインストールされています。

% which gawk
/usr/bin/gawk
% which nawk    
/usr/bin/nawk


どうしようもないのでエラーが発生しているinit.mkを見てみました。

AWK_TEST := $(shell $(HOST_AWK) -f $(BUILD_AWK)/check-awk.awk)
$(call ndk_log,Host 'awk' test returned: $(AWK_TEST))
ifneq ($(AWK_TEST),Pass)
    $(call __ndk_info,Host 'awk' tool is outdated. Please define HOST_AWK to point to Gawk or Nawk !)
    $(call __ndk_error,Aborting.)
endif


よくは分かりませんが、

$(shell $(HOST_AWK) -f $(BUILD_AWK)/check-awk.awk)


が失敗しているのが原因のようです。元々のエラーメッセージにもHOST_AWKを設定しろ、とありました。ではHOST_AWKはどのように定義されているのでしょうか?
どうもこの辺です。

# Check for NDK-specific versions of our host tools
HOST_PREBUILT := $(strip $(wildcard $(NDK_ROOT)/prebuilt/$(HOST_TAG)/bin))
ifdef HOST_PREBUILT
    $(call ndk_log,Host tools prebuilt directory: $(HOST_PREBUILT))
    HOST_AWK := $(wildcard $(HOST_PREBUILT)/awk$(HOST_EXEEXT))
    HOST_SED  := $(wildcard $(HOST_PREBUILT)/sed$(HOST_EXEEXT))
    HOST_MAKE := $(wildcard $(HOST_PREBUILT)/make$(HOST_EXEEXT))
else
    $(call ndk_log,Host tols prebuilt directory not found, using system tools)
endif


HOST_AWKには「android-ndk-r7/prebuilt/linux-x86/bin/awk」が設定されているようです。なので設定されていないわけではないですね。でもこのawkがおかしいみたい。
実際実行してみると

% ./awk_ --version
zsh: exec format error: ./awk


あれれ?フォーマットエラー??

% file ./awk
./awk: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped


どうも64bit用のバイナリのようです。私のPCは32bitなのでNGです。あ〜すっきり。適当にシンボリックリンクを張ってみました。

% mv awk awk_
% ln -s /usr/bin/gawk ./awk


ビルド (ndk-build -B) も通り、めでたしめでたし。