Bazelって?
Tensorflow 等のビルドシステムとして採用されている Google 謹製ビルドシステムです。
現在は βバージョンが利用可能で、 Android や iOSがビルドできます。
http://bazel.io/
既に先人による良記事が存在しているので、本稿では導入等の手順は割愛します。
クックパッド開発者ブログ - 次世代ビルドツールBazelを使ってAndroidアプリをビルドする
Bazelでビルドする
gitに上げているソースを元にした詳解です。
Android NDK、及びiOSプロジェクトのビルドのサンプルを公開しています。
https://github.com/dolow/bazel-build-sample
本稿の開発環境
- Mac OSX 10.11.5
- Android NDK r10b
- Android SDK 23
- iOS SDK 10.0
- Xcode 8.2
- Bazel 0.4.3-homebrew
Android NDKプロジェクト
ソース
c/c++ と java 間の連携を確認するための h/cpp と java を用意します
WORKSPACE
ビルド環境などを設定します。
本稿ではNDKを利用するので、NDKの設定を記述します。
android_sdk_repository(
name="androidsdk",
path="/path/to/android-sdk",
api_level = 23,
build_tools_version="24.0.0"
)
android_ndk_repository(
name = "androidndk",
path = "/path/to/android-ndk",
api_level = 22,
)
BUILD
ビルド対象やビルド時のオプションを設定します。
# cpp library
cc_library (
name = "android_app_cpp",
srcs = glob(["cpp/*.cpp"]),
hdrs = glob(["cpp/*.h"]),
copts = ["-std=c++11"], # compile option
linkopts = ["-llog"], # linker option for logging
)
# java project
android_binary (
name = "android_app",
srcs = glob(["java/**/*.java"]),
custom_package = "jp.do_low.bazel.sample",
manifest = "AndroidManifest.xml",
resource_files = glob(["res/**"]),
deps = [":android_app_cpp"], # name of cc_library
)
ビルドコマンド
$ bazel build //Sandbox:android_app --crosstool_top=//external:android/crosstool --host_crosstool_top=@bazel_tools//tools/cpp:toolchain --cpu=x86_64
オプション
//Sandbox:android_app
Sandox は WORKSPACE ディレクトリから、BUILDの置いてあるディレクトリへのパスです。
:android_app は、BUILDに設定したビルドターゲットの android_binary.name の値です。
--crosstool_top
c++ のコンパイルに利用するクロスコンパイル用ツールの場所を指定します。
本稿の値は tensorflow のサンプルを参考にしたもので、正直どこを指しているのかわかりませんでした。
--host_crosstool_top
bazelで提供するクロスコンパイルツールを指定します。
本稿の値は tensorflow のサンプルを参考にしたもので、実態は bazel-bazel-build-sample/external/bazel_tools/tools/cpp/BUILD で定義されているターゲットの toolchain を指しています。
iOS プロジェクト
ソース
Obj-C のスクリプトを用意します。
iOS では c/c++ 連携に特に障壁はないので、それらは特に用意しません。
WORKSPACE
iOS用の設定はありません。
BUILD
objc_binary はコンパイラに渡す情報、 ios_application は主に Xcode に関わる設定を記述します。
objc_binary (
name = "ios_app_binary",
srcs = glob(["objc/*.m"]),
hdrs = glob(["objc/*.h"]),
)
# ios project
ios_application (
name = "ios_app",
bundle_id = "jp.do_low.bazel.sample",
binary = ":ios_app_binary",
infoplist = "ios/Info.plist",
)
ビルドコマンド
$ bazel build //Sandbox:ios_app --ios_sdk_version=9.0
--ios_sdk_version
UIKit などの iOS SDK の参照を解決させるために指定します。
バージョン番号は、実際にインストールされているものから任意の番号を指定してください。
以上です。
おわりに
本稿の初稿は bazel 0.2.2 で記載しましたが、一年経って 0.4.3-homebrew にアップデートしても、この記事の範囲内での I/F に大きな変化は見られませんでした。
ただ、やはりビルド時のコマンドのオプション指定が煩雑な印象です。
iOS, Android 用のビルドができるものの、ストアに並べるようなものよりは社内ツールなどのユーティリティ向きと思いました。