Edited at

Bazel で Android w/NDK や iOS アプリをビルド

More than 1 year has passed since last update.


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 用のビルドができるものの、ストアに並べるようなものよりは社内ツールなどのユーティリティ向きと思いました。