from https://github.com/sjitech/build-nodejs-for-android-perfectly
NDKのstandalone toolchainでNodeJSをcross-compileする時に、一発成功した人はないでしょう。--without-...
を指定したり、環境変数、GYPをいじったりしないと通らないですね。
いいニューズは、完璧にNodeJS for android-{arm,arm64,x86,x64,mipsel}をビルドする方法がありました。皆んなone lineコマンドです。ソース修正なし、機能制限なし!
しかも、ビルド済みのバイナリファイルもアップロードしました:https://github.com/sjitech/nodejs-android-prebuilt-binaries。
自分でdocker image osexp2000/build-nodejs-android
を利用すれば、ビルド結果は見れるし、自分でソースを修正してコンパイルも素早くできる、そんなビルド環境dockerです。
詳しくは上記のURLを参照ください。
私はNDKのstandalone toolchainを便利に利用するために、android-gcc-toolchainを作る時に、テストとして、NodeJSのAndroid版をビルドしてみました。
前回のNodeJS Androidをビルドしてから2年前を経過した、もう大分改善された、すんなりビルド完了でしょうと思ったが、意外に、あれこれに怒られた。
一体どこで弾かれたのか、覗いて見たが、色々問題ですね、ほとんどはhost(現在利用中のマシン)側向けのコードを作成する時のエラーです。例えば、
- [Mac]ar(.oを.aに合併するツール)の乱用。Android側向けの.oファイルをhost側の.oとして利用してしまった。
- [Mac]-lrt: 存在しないlibrtへリンクしようとしている。Macはlibrtはない。
- [Linux]-lpthread: どこかでlibpthreadをリンクするように指定し忘れたようです、変な"DSO command not found"エラーが出た。
- [Mac/Linux]-m32: 32bitコードを作成するような指示-m32は一部指定、一部指定し忘れ、結局32bitと64bit混在でリンクエラーになった。
いずれも、一体NodeJS及び子プロジェクトのどこで設定間違ったのか、いちいち探すのは大変です。
GYP,CMake,autoconfいくつかビルドシステム混在しているようです、関節が多すぎ全部把握するのは難しい。
偶然に、思い出したアイデアは$PATH経由ar,gccなどコマンドのhookです。そこでオプションの増減をすれば、きっとうまく行く!試してみた、うまくできた。
こうして、色々整理して、android-gcc-toolchainツールを出来上がりました。
NDKのstandalone toolchainを自由に切り替え、素早く利用できるツールです。
今日はとりあえずここまで。