aboutsummaryrefslogtreecommitdiff
path: root/android/build_android.sh
blob: 053b828f2b26a6ba2b56010a70c17839f8138dff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/bin/sh
#
# Ceres Solver - A fast non-linear least squares minimizer
# Copyright 2012 Google Inc. All rights reserved.
# http://code.google.com/p/ceres-solver/
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
#   this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
#   this list of conditions and the following disclaimer in the documentation
#   and/or other materials provided with the distribution.
# * Neither the name of Google Inc. nor the names of its contributors may be
#   used to endorse or promote products derived from this software without
#   specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# Author: keir@google.com
#         settinger@google.com
#
# Ceres build script for Android. To build the ceres.so libraray for Android,
# cd into an empty directory and run the script. Usage:
#
#   build_android.sh \
#   <path to Android NDK> \
#   <path to Eigen> \
#   <path to Ceres source>
#
#   make
#
# This script exists only to make it easier to get Ceres building on Android;
# as one can see from the code below, it is only a matter of extracting a
# standalone NDK toolchain from the NDK, and getting the right arguments to
# CMake to get it to work.
#
# Android NDK version r5 or higher is required. Jellybean does not work out of
# the box, since the android-cmake toolchain is not yet updated to for it.
#
# Note: You may wish to run 'ccmake .', the CMake curses GUI, in order to tweak
# the build parameters that are set by default. There are a few settings to
# consider changing:
#
# SCHUR_SPECIALIZATIONS:
#
# Consider if enabling the schur specializations is a big enough win for the
# problem you are solving, since compiling the schur specializations
# considerably increases the binary size. Disable them by running 'ccmake .',
# finding the SCHUR_SPECIALIZATIONS variable, hitting enter (toggling to "off"),
# pressing 'c' to generate, then 'g' to generate and exit, followed by 'make'.
#
# EXECUTABLE_OUTPUT_PATH
# LIBRARY_OUTPUT_PATH
# LIBRARY_OUTPUT_PATH_ROOT:
#
# In normal CMake builds, where you do an out of source build, the source
# directory is untouched when building. However, by default the Android CMake
# toolchain selects locations under your *source* tree for the final library
# and binary destinations. For example, if your Ceres git tree is under
# ceres-solver.git/ and the build directory you are using is
# ceres-android-bin/, the resulting binaries will live in ceres-solver.git/
# (but not the intermediate .o files!) By changing the variables
# EXECUTABLE_OUTPUT_PATH, LIBRARY_OUTPUT_PATH, and LIBRARY_OUTPUT_PATH_ROOT to
# something under e.g. ceres-android-bin/ then true out-of-ource builds work.

if [ $# -ne 3 ] ; then
  echo "usage: build_android.sh \\"
  echo "       <path to Android NDK> \\"
  echo "       <path to Eigen> \\"
  echo "       <path to Ceres source>"
  exit 1
fi

if [ -f "CMakeLists.txt" ] ; then
  echo "ERROR: Can't run from inside the source tree."
  echo "       Make a new directory that's not under"
  echo "       the main Ceres source tree."
  exit 1
fi

# For some reason, using the NDK in-place doesn't work even though the
# android-cmake toolchain appears to support it.
#
# TODO(keir): Figure out the issue with the stand-alone NDK and don't create
# the extra stand-alone toolchain. Also test with other NDK versions and add
# explicit checks to ensure a compatible version is used.
ANDROID_NDK=$1
MAKE_ANDROID_TOOLCHAIN=$ANDROID_NDK/build/tools/make-standalone-toolchain.sh
if [ ! -f $MAKE_ANDROID_TOOLCHAIN ] ; then
  echo "ERROR: First argument doesn't appear to be the NDK root; missing:"
  echo "       $MAKE_ANDROID_TOOLCHAIN"
  exit 1
fi

EIGEN_DIR=$2
if [ ! -f $EIGEN_DIR/eigen3.pc.in ] ; then
  echo "ERROR: Second argument doesn't appear to be Eigen3; missing:"
  echo "       $EIGEN_DIR/eigen3.pc.in"
  exit 1
fi

CERES_SOURCE_ROOT=$3
if [ ! -f "$CERES_SOURCE_ROOT/internal/ceres/CMakeLists.txt" ] ; then
  echo "ERROR: Third argument doesn't appear to be the Ceres source directory."
  exit 1
fi
echo "Using Ceres source directory: $CERES_SOURCE_ROOT"

# Make a standalone Android NDK toolchain if needed.
export ANDROID_STANDALONE_TOOLCHAIN="`pwd`/toolchain"
if [ ! -d "$ANDROID_STANDALONE_TOOLCHAIN" ] ; then
  echo "Extracting the Android GCC standalone toolchain to:"
  echo "    $ANDROID_STANDALONE_TOOLCHAIN..."
  $ANDROID_NDK/build/tools/make-standalone-toolchain.sh \
  --platform=android-8 \
  --install-dir=$ANDROID_STANDALONE_TOOLCHAIN
else
  echo "Found NDK standalone toolchain; skipping creation."
fi

# Get the Android CMake NDK toolchain file if needed.
if [ ! -d "android-cmake" ] ; then
  hg clone https://code.google.com/p/android-cmake/
else
  echo "Found Android-CMake toolchain; skipping download."
fi

ANDROID_CMAKE_TOOLCHAIN=android-cmake/toolchain/android.toolchain.cmake
if [ ! -f $ANDROID_CMAKE_TOOLCHAIN ] ; then
  echo "ERROR: It seems the toolchain file is missing:"
  echo "       $ANDROID_CMAKE_TOOLCHAIN"
  exit 1
fi

cmake $CERES_SOURCE_ROOT \
      -DCMAKE_TOOLCHAIN_FILE=$ANDROID_CMAKE_TOOLCHAIN \
      -DCMAKE_BUILD_TYPE=Release \
      -DEIGEN_INCLUDE=$EIGEN_DIR \
      -DBUILD_ANDROID=ON \
      -DSUITESPARSE=OFF \
      -DGFLAGS=OFF \
      -DCXSPARSE=OFF