• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2
3# Copyright (c) 2012 The Chromium Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7# Defines functions for envsetup.sh which sets up environment for building
8# Chromium on Android.  The build can be either use the Android NDK/SDK or
9# android source tree.  Each has a unique init function which calls functions
10# prefixed with "common_" that is common for both environment setups.
11
12################################################################################
13# Check to make sure the toolchain exists for the NDK version.
14################################################################################
15common_check_toolchain() {
16  if [[ ! -d "${ANDROID_TOOLCHAIN}" ]]; then
17    echo "Can not find Android toolchain in ${ANDROID_TOOLCHAIN}." >& 2
18    echo "The NDK version might be wrong." >& 2
19    return 1
20  fi
21}
22
23################################################################################
24# Exports environment variables common to both sdk and non-sdk build (e.g. PATH)
25# based on CHROME_SRC and ANDROID_TOOLCHAIN, along with DEFINES for GYP_DEFINES.
26################################################################################
27common_vars_defines() {
28  # Set toolchain path according to product architecture.
29  case "${TARGET_ARCH}" in
30    "arm")
31      toolchain_arch="arm-linux-androideabi"
32      ;;
33    "x86")
34      toolchain_arch="x86"
35      ;;
36    "mips")
37      toolchain_arch="mipsel-linux-android"
38      ;;
39    *)
40      echo "TARGET_ARCH: ${TARGET_ARCH} is not supported." >& 2
41      print_usage
42      return 1
43      ;;
44  esac
45
46  toolchain_version="4.6"
47  # We directly set the gcc_version since we know what we use, and it should
48  # be set to xx instead of x.x. Refer the output of compiler_version.py.
49  gcc_version="46"
50  toolchain_target=$(basename \
51    ${ANDROID_NDK_ROOT}/toolchains/${toolchain_arch}-${toolchain_version})
52  toolchain_path="${ANDROID_NDK_ROOT}/toolchains/${toolchain_target}"\
53"/prebuilt/${toolchain_dir}/bin/"
54
55  # Set only if not already set.
56  # Don't override ANDROID_TOOLCHAIN if set by Android configuration env.
57  export ANDROID_TOOLCHAIN=${ANDROID_TOOLCHAIN:-${toolchain_path}}
58
59  common_check_toolchain
60
61  # Add Android SDK/NDK tools to system path.
62  export PATH=$PATH:${ANDROID_NDK_ROOT}
63  export PATH=$PATH:${ANDROID_SDK_ROOT}/tools
64  export PATH=$PATH:${ANDROID_SDK_ROOT}/platform-tools
65  export PATH=$PATH:${ANDROID_SDK_ROOT}/build-tools/\
66${ANDROID_SDK_BUILD_TOOLS_VERSION}
67
68  # This must be set before ANDROID_TOOLCHAIN, so that clang could find the
69  # gold linker.
70  # TODO(michaelbai): Remove this path once the gold linker become the default
71  # linker.
72  export PATH=$PATH:${CHROME_SRC}/build/android/${toolchain_arch}-gold
73
74  # Must have tools like arm-linux-androideabi-gcc on the path for ninja
75  export PATH=$PATH:${ANDROID_TOOLCHAIN}
76
77  # Add Chromium Android development scripts to system path.
78  # Must be after CHROME_SRC is set.
79  export PATH=$PATH:${CHROME_SRC}/build/android
80
81  # TODO(beverloo): Remove these once all consumers updated to --strip-binary.
82  export OBJCOPY=$(echo ${ANDROID_TOOLCHAIN}/*-objcopy)
83  export STRIP=$(echo ${ANDROID_TOOLCHAIN}/*-strip)
84
85  # The set of GYP_DEFINES to pass to gyp. Use 'readlink -e' on directories
86  # to canonicalize them (remove double '/', remove trailing '/', etc).
87  DEFINES="OS=android"
88  DEFINES+=" host_os=${host_os}"
89  DEFINES+=" gcc_version=${gcc_version}"
90
91  if [[ -n "$CHROME_ANDROID_OFFICIAL_BUILD" ]]; then
92    DEFINES+=" branding=Chrome"
93    DEFINES+=" buildtype=Official"
94
95    # These defines are used by various chrome build scripts to tag the binary's
96    # version string as 'official' in linux builds (e.g. in
97    # chrome/trunk/src/chrome/tools/build/version.py).
98    export OFFICIAL_BUILD=1
99    export CHROMIUM_BUILD="_google_chrome"
100    export CHROME_BUILD_TYPE="_official"
101  fi
102
103  # The order file specifies the order of symbols in the .text section of the
104  # shared library, libchromeview.so.  The file is an order list of section
105  # names and the library is linked with option
106  # --section-ordering-file=<orderfile>. The order file is updated by profiling
107  # startup after compiling with the order_profiling=1 GYP_DEFINES flag.
108  ORDER_DEFINES="order_text_section=${CHROME_SRC}/orderfiles/orderfile.out"
109
110  # The following defines will affect ARM code generation of both C/C++ compiler
111  # and V8 mksnapshot.
112  case "${TARGET_ARCH}" in
113    "arm")
114      DEFINES+=" ${ORDER_DEFINES}"
115      DEFINES+=" target_arch=arm"
116      ;;
117    "x86")
118    # TODO(tedbo): The ia32 build fails on ffmpeg, so we disable it here.
119      DEFINES+=" use_libffmpeg=0"
120
121      host_arch=$(uname -m | sed -e \
122        's/i.86/ia32/;s/x86_64/x64/;s/amd64/x64/;s/arm.*/arm/;s/i86pc/ia32/')
123      DEFINES+=" host_arch=${host_arch}"
124      DEFINES+=" target_arch=ia32"
125      ;;
126    "mips")
127      DEFINES+=" target_arch=mipsel"
128      DEFINES+=" mips_arch_variant=mips32r1"
129      ;;
130    *)
131      echo "TARGET_ARCH: ${TARGET_ARCH} is not supported." >& 2
132      print_usage
133      return 1
134  esac
135}
136
137
138################################################################################
139# Exports common GYP variables based on variable DEFINES and CHROME_SRC.
140################################################################################
141common_gyp_vars() {
142  export GYP_DEFINES="${DEFINES}"
143
144  # Set GYP_GENERATORS to ninja if it's currently unset or null.
145  if [ -z "$GYP_GENERATORS" ]; then
146    echo "Defaulting GYP_GENERATORS to ninja."
147    GYP_GENERATORS=ninja
148  elif [ "$GYP_GENERATORS" != "ninja" ]; then
149    echo "Warning: GYP_GENERATORS set to '$GYP_GENERATORS'."
150    echo "Only GYP_GENERATORS=ninja has continuous coverage."
151  fi
152  export GYP_GENERATORS
153
154  # Use our All target as the default
155  export GYP_GENERATOR_FLAGS="${GYP_GENERATOR_FLAGS} default_target=All"
156
157  # We want to use our version of "all" targets.
158  export CHROMIUM_GYP_FILE="${CHROME_SRC}/build/all_android.gyp"
159}
160
161
162################################################################################
163# Prints out help message on usage.
164################################################################################
165print_usage() {
166  echo "usage: ${0##*/} [--target-arch=value] [--help]" >& 2
167  echo "--target-arch=value     target CPU architecture (arm=default, x86)" >& 2
168  echo "--host-os=value         override host OS detection (linux, mac)" >&2
169  echo "--try-32bit-host        try building a 32-bit host architecture" >&2
170  echo "--help                  this help" >& 2
171}
172
173################################################################################
174# Process command line options.
175# --target-arch=  Specifices target CPU architecture. Currently supported
176#                 architectures are "arm" (default), and "x86".
177# --help          Prints out help message.
178################################################################################
179process_options() {
180  host_os=$(uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')
181  try_32bit_host_build=
182  while [[ -n $1 ]]; do
183    case "$1" in
184      --target-arch=*)
185        target_arch="$(echo "$1" | sed 's/^[^=]*=//')"
186        ;;
187      --host-os=*)
188        host_os="$(echo "$1" | sed 's/^[^=]*=//')"
189        ;;
190      --try-32bit-host)
191        try_32bit_host_build=true
192        ;;
193      --help)
194        print_usage
195        return 1
196        ;;
197      *)
198        # Ignore other command line options
199        echo "Unknown option: $1"
200        ;;
201    esac
202    shift
203  done
204
205  # Sets TARGET_ARCH. Defaults to arm if not specified.
206  TARGET_ARCH=${target_arch:-arm}
207}
208
209################################################################################
210# Initializes environment variables for NDK/SDK build. Only Android NDK Revision
211# 7 on Linux or Mac is offically supported. To run this script, the system
212# environment ANDROID_NDK_ROOT must be set to Android NDK's root path.  The
213# ANDROID_SDK_ROOT only needs to be set to override the default SDK which is in
214# the tree under $ROOT/src/third_party/android_tools/sdk.
215# To build Chromium for Android with NDK/SDK follow the steps below:
216#  > export ANDROID_NDK_ROOT=<android ndk root>
217#  > export ANDROID_SDK_ROOT=<android sdk root> # to override the default sdk
218#  > . build/android/envsetup.sh
219#  > make
220################################################################################
221sdk_build_init() {
222
223  # Allow the caller to override a few environment variables. If any of them is
224  # unset, we default to a sane value that's known to work. This allows for
225  # experimentation with a custom SDK.
226  local sdk_defines=""
227  if [[ -z "${ANDROID_NDK_ROOT}" || ! -d "${ANDROID_NDK_ROOT}" ]]; then
228    export ANDROID_NDK_ROOT="${CHROME_SRC}/third_party/android_tools/ndk/"
229  fi
230  if [[ -z "${ANDROID_SDK_VERSION}" ]]; then
231    export ANDROID_SDK_VERSION=19
232  else
233    sdk_defines+=" android_sdk_version=${ANDROID_SDK_VERSION}"
234  fi
235  local sdk_suffix=platforms/android-${ANDROID_SDK_VERSION}
236  if [[ -z "${ANDROID_SDK_ROOT}" || \
237       ! -d "${ANDROID_SDK_ROOT}/${sdk_suffix}" ]]; then
238    export ANDROID_SDK_ROOT="${CHROME_SRC}/third_party/android_tools/sdk/"
239  else
240    sdk_defines+=" android_sdk_root=${ANDROID_SDK_ROOT}"
241  fi
242  if [[ -z "${ANDROID_SDK_BUILD_TOOLS_VERSION}" ]]; then
243    export ANDROID_SDK_BUILD_TOOLS_VERSION=19.0.0
244  fi
245
246  unset ANDROID_BUILD_TOP
247
248  # Set default target.
249  export TARGET_PRODUCT="${TARGET_PRODUCT:-trygon}"
250
251  # Unset toolchain so that it can be set based on TARGET_PRODUCT.
252  # This makes it easy to switch between architectures.
253  unset ANDROID_TOOLCHAIN
254
255  common_vars_defines
256
257  DEFINES+="${sdk_defines}"
258
259  common_gyp_vars
260
261  if [[ -n "$CHROME_ANDROID_BUILD_WEBVIEW" ]]; then
262    # Can not build WebView with NDK/SDK because it needs the Android build
263    # system and build inside an Android source tree.
264    echo "Can not build WebView with NDK/SDK.  Requires android source tree." \
265        >& 2
266    echo "Try . build/android/envsetup.sh instead." >& 2
267    return 1
268  fi
269
270  # Directory containing build-tools: aapt, aidl, dx
271  export ANDROID_SDK_TOOLS="${ANDROID_SDK_ROOT}/build-tools/\
272${ANDROID_SDK_BUILD_TOOLS_VERSION}"
273}
274
275################################################################################
276# To build WebView, we use the Android build system and build inside an Android
277# source tree. This method is called from non_sdk_build_init() and adds to the
278# settings specified there.
279#############################################################################
280webview_build_init() {
281  # Use the latest API in the AOSP prebuilts directory (change with AOSP roll).
282  export ANDROID_SDK_VERSION=18
283
284  # For the WebView build we always use the NDK and SDK in the Android tree,
285  # and we don't touch ANDROID_TOOLCHAIN which is already set by Android.
286  export ANDROID_NDK_ROOT=${ANDROID_BUILD_TOP}/prebuilts/ndk/8
287  export ANDROID_SDK_ROOT=${ANDROID_BUILD_TOP}/prebuilts/sdk/\
288${ANDROID_SDK_VERSION}
289
290  common_vars_defines
291
292  # We need to supply SDK paths relative to the top of the Android tree to make
293  # sure the generated Android makefiles are portable, as they will be checked
294  # into the Android tree.
295  ANDROID_SDK=$(python -c \
296      "import os.path; print os.path.relpath('${ANDROID_SDK_ROOT}', \
297      '${ANDROID_BUILD_TOP}')")
298  case "${host_os}" in
299    "linux")
300      ANDROID_SDK_TOOLS=$(python -c \
301          "import os.path; \
302          print os.path.relpath('${ANDROID_SDK_ROOT}/../tools/linux', \
303          '${ANDROID_BUILD_TOP}')")
304      ;;
305    "mac")
306      ANDROID_SDK_TOOLS=$(python -c \
307          "import os.path; \
308          print os.path.relpath('${ANDROID_SDK_ROOT}/../tools/darwin', \
309          '${ANDROID_BUILD_TOP}')")
310      ;;
311  esac
312  DEFINES+=" android_webview_build=1"
313  DEFINES+=" android_src=\$(PWD)"
314  DEFINES+=" android_sdk=\$(PWD)/${ANDROID_SDK}"
315  DEFINES+=" android_sdk_root=\$(PWD)/${ANDROID_SDK}"
316  DEFINES+=" android_sdk_tools=\$(PWD)/${ANDROID_SDK_TOOLS}"
317  DEFINES+=" android_sdk_version=${ANDROID_SDK_VERSION}"
318  DEFINES+=" android_toolchain=${ANDROID_TOOLCHAIN}"
319  if [[ -n "$CHROME_ANDROID_WEBVIEW_ENABLE_DMPROF" ]]; then
320    DEFINES+=" disable_debugallocation=1"
321    DEFINES+=" android_full_debug=1"
322    DEFINES+=" android_use_tcmalloc=1"
323  fi
324  export GYP_DEFINES="${DEFINES}"
325
326  export GYP_GENERATORS="android"
327
328  export GYP_GENERATOR_FLAGS="${GYP_GENERATOR_FLAGS} default_target=All"
329  export GYP_GENERATOR_FLAGS="${GYP_GENERATOR_FLAGS} limit_to_target_all=1"
330  export GYP_GENERATOR_FLAGS="${GYP_GENERATOR_FLAGS} auto_regeneration=0"
331
332  export CHROMIUM_GYP_FILE="${CHROME_SRC}/android_webview/all_webview.gyp"
333}
334