2019年11月18日月曜日

[RaspberryPI]ラズベリーPI4 (raspbian Buster)にbazelをインストールしてみる

 最近、32ビットをサポートしないソフトが増えてきた。ここで新しいPCを新調すれば良いのだが、(何を思ったか)ラズベリーPIというワンボード・コンピュータを買うという暴挙に出てしまった。面積はキャッシュカード位で高さはコネクター類が付いているから1.5cm位。Raspberry PI 4といやつで4コアだ。あちこちから色々なセットが発売されているが、今回は4G RAMモデルのボードにヒートシンクとファンに、ちょっと容量大きめの電源アダプタを選んだ。
 今使っているのは2コアで2G RAMなので、単純にみれば2倍だ。得物にraspbian-busterというものを入れ込んで(基本的にラズベリーPIはMicroSDをストレージとしているので、raspbian-busterをMicroSDに書き込み、そのMicroSDを本体にセット)、電源を入れると...ラズベリーPI用のDebian Linuxが立ち上がる......。

で、ここからが本題!
 bazelというツールがある。これは、mavenやらmake(?)等と同じようにソースからプログラムをビルドするためのツールで、最初はconfigureというシェルスクリプトでMakefileを自動生成して後はmakeコマンドでプログラムをビルドするというもので良かったが、段々とMavenなどの複雑なツールへと代わって行った。使う人間にとってはあまり関係ないが、作る側にとってプログラムは作成、修正、変更、検証の繰り返しであるからそれらをなるべく一元的に管理できるような仕組みが必要になる。
 bazelはGoogle由来のオープンプロジェクトのビルドに結構使われている。ところがbazelは結構バージョン替わりが早くて、raspberry(向け)に用意されている(bazelの)パッケージでは必要なプログラムをビルドするために必要なバージョンと合わない事がしばしばある。で、bazelをソースからビルドすることにした。このビルドが旨く行ったら、次に設定ファイルなどを書き変えて32bit用の実行ファイルが作れればそれこそ一石二鳥。

 途中で色々なエラーが発生して、結構な時間を費やしてしまったが結局ビルドに成功した。

まず、githubにあるbazelのリリースページからbazel-0.27.1-dist.zipをダウンロードしてホームディレクトリーに置いておく(初めてビルドする場合は-dist付きのをダウンロードする必要があることに注意)。
次にjdk(今回はopenjdk8)とビルド環境(gcc,g++,make等)をパッケージインストールする。その他にpythonやらpython3が必要なようだがraspbian-busterには最初から入っているので今回は特にインストールすることはしない。


cd ~
mkdir bazel
cd bazel
unzip ../bazel-0.27.1-dist.zip
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-armhf
export EXTRA_BAZEL_ARGS="--host_javabase=@local_jdk//:jdk --jobs=2"
export BAZEL_JAVAC_OPTS="-J-Xms256m -J-Xmx512m"
./compile.sh


bazelのビルド情報は数多くあり、その方法は(raspbianのバージョンやツールの組み合わせによって)様々で、色々試したがほとんどが旨くいかなかった。やっと旨くいったのが上記のように環境変数をセットする方法。どのバージョンからそうなったのかは調べていないが、ビルドファイルが整備されてビルドが簡単になったのだと思う。ここでポイントとなるのは--host_javabase=@local_jdk//:jdkで、これがないとよく判らないエラーに悩まされる。3時間ほどでビルドが終わりoutputディレクトリの下にbazelが生成される。
生成されたものがちゃんと動くかどうかをチェックするため、output/bazelを他のところ(例えば/tmp等)に移動させて、そのフルパスを環境変数BAZELにセットしてから、もう一度compile.shを実行する。エラーなしでoutput/bazelが生成されれば多分問題なしと思われる。
これを/usr/local/bin/の下あたりにコピーしてインストール完了。
結構疲れた。

追記(2020/01/11) bazel 2.0.0(えらく飛ばしてしまったけど)も、この方法でビルドすることができた。