LoginSignup
11
10

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-08

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

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10