| #!/bin/bash |
| ############################################################################## |
| # Example command to build the android target. |
| ############################################################################## |
| # |
| # This script shows how one can build a Caffe2 binary for the Android platform |
| # using android-cmake. A few notes: |
| # |
| # (1) This build also does a host build for protobuf. You will need autoconf |
| # to carry out this. If autoconf is not possible, you will need to provide |
| # a pre-built protoc binary that is the same version as the protobuf |
| # version under third_party. |
| # If you are building on Mac, you might need to install autotool and |
| # libtool. The easiest way is via homebrew: |
| # brew install automake |
| # brew install libtool |
| # (2) You will need to have android ndk installed. The current script assumes |
| # that you set ANDROID_NDK to the location of ndk. |
| # (3) The toolchain and the build target platform can be specified with the |
| # cmake arguments below. For more details, check out android-cmake's doc. |
| |
| set -e |
| |
| CAFFE2_ROOT="$( cd "$(dirname "$0")"/.. ; pwd -P)" |
| |
| if [ -z "$ANDROID_NDK" ]; then |
| echo "ANDROID_NDK not set; please set it to the Android NDK directory" |
| exit 1 |
| fi |
| |
| if [ ! -d "$ANDROID_NDK" ]; then |
| echo "ANDROID_NDK not a directory; did you install it under $ANDROID_NDK?" |
| exit 1 |
| fi |
| |
| echo "Bash: $(/bin/bash --version | head -1)" |
| echo "Caffe2 path: $CAFFE2_ROOT" |
| echo "Using Android NDK at $ANDROID_NDK" |
| |
| # Build protobuf from third_party so we have a host protoc binary. |
| echo "Building protoc" |
| $CAFFE2_ROOT/scripts/build_host_protoc.sh |
| |
| # Now, actually build the Android target. |
| BUILD_ROOT=${BUILD_ROOT:-"$CAFFE2_ROOT/build_android"} |
| mkdir -p $BUILD_ROOT |
| cd $BUILD_ROOT |
| |
| CMAKE_ARGS=() |
| |
| # If Ninja is installed, prefer it to Make |
| if [ -x "$(command -v ninja)" ]; then |
| CMAKE_ARGS+=("-GNinja") |
| fi |
| |
| # Use locally built protoc because we'll build libprotobuf for the |
| # target architecture and need an exact version match. |
| CMAKE_ARGS+=("-DCAFFE2_CUSTOM_PROTOC_EXECUTABLE=$CAFFE2_ROOT/build_host_protoc/bin/protoc") |
| |
| # Use android-cmake to build Android project from CMake. |
| CMAKE_ARGS+=("-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake") |
| |
| # Don't build artifacts we don't need |
| CMAKE_ARGS+=("-DBUILD_TEST=OFF") |
| CMAKE_ARGS+=("-DBUILD_BINARY=OFF") |
| CMAKE_ARGS+=("-DBUILD_PYTHON=OFF") |
| CMAKE_ARGS+=("-DBUILD_SHARED_LIBS=OFF") |
| CMAKE_ARGS+=("-DANDROID_TOOLCHAIN=gcc") |
| # Disable unused dependencies |
| CMAKE_ARGS+=("-DUSE_CUDA=OFF") |
| CMAKE_ARGS+=("-DUSE_GFLAGS=OFF") |
| CMAKE_ARGS+=("-DUSE_OPENCV=OFF") |
| CMAKE_ARGS+=("-DUSE_LMDB=OFF") |
| CMAKE_ARGS+=("-DUSE_LEVELDB=OFF") |
| CMAKE_ARGS+=("-DUSE_MPI=OFF") |
| CMAKE_ARGS+=("-DUSE_OPENMP=OFF") |
| |
| # Only toggle if VERBOSE=1 |
| if [ "${VERBOSE:-}" == '1' ]; then |
| CMAKE_ARGS+=("-DCMAKE_VERBOSE_MAKEFILE=1") |
| fi |
| |
| # Android specific flags |
| CMAKE_ARGS+=("-DANDROID_NDK=$ANDROID_NDK") |
| CMAKE_ARGS+=("-DANDROID_ABI=armeabi-v7a with NEON") |
| CMAKE_ARGS+=("-DANDROID_NATIVE_API_LEVEL=21") |
| CMAKE_ARGS+=("-DANDROID_CPP_FEATURES=rtti exceptions") |
| |
| # Use-specified CMake arguments go last to allow overridding defaults |
| CMAKE_ARGS+=($@) |
| |
| cmake "$CAFFE2_ROOT" \ |
| -DCMAKE_INSTALL_PREFIX=../install \ |
| -DCMAKE_BUILD_TYPE=Release \ |
| "${CMAKE_ARGS[@]}" |
| |
| # Cross-platform parallel build |
| if [ -z "$MAX_JOBS" ]; then |
| if [ "$(uname)" == 'Darwin' ]; then |
| MAX_JOBS=$(sysctl -n hw.ncpu) |
| else |
| MAX_JOBS=$(nproc) |
| fi |
| fi |
| cmake --build . -- "-j${MAX_JOBS}" |