16724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#!/bin/sh
26724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#
36724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Copyright (C) 2010 The Android Open Source Project
46724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#
56724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Licensed under the Apache License, Version 2.0 (the "License");
66724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# you may not use this file except in compliance with the License.
76724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# You may obtain a copy of the License at
86724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#
96724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#      http://www.apache.org/licenses/LICENSE-2.0
106724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#
116724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# Unless required by applicable law or agreed to in writing, software
126724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# distributed under the License is distributed on an "AS IS" BASIS,
136724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# See the License for the specific language governing permissions and
156724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner# limitations under the License.
166724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#
176724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#  This shell script is a wrapper to launch the NDK build from the
186724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#  command-line inside an application project path.
196724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#
206724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#  Typical usage is:
216724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#
226724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#     cd $PROJECT_PATH
236724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#     ndk-build
246724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#
256724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#  Assuming that the Android NDK root path is in your PATH. However,
266724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#  you can also invoke it directly as:
276724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#
286724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#     $NDK_ROOT/ndk-build
296724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#
306724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#  This really is a tiny wrapper around GNU Make.
316724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner#
32a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner
33a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner# Ensure we get the full path of this script's directory
34a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner# this is needed if the caller uses the -C <path> GNU Make
35a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner# option, as in:
36a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner#
37a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner#    cd ndk
38a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner#    ./ndk-build -C <project-path>
39a08d605794902f5c7ed79b3d894adb722e1b6cacDavid 'Digit' Turner#
406724aaa2876f40ad270823bc933edf7552f67436David 'Digit' TurnerPROGDIR=`dirname $0`
41d8276e9ad1bdc4f3209de6ab28eba0d61e69e3eeAndrew HsiehPROGDIR=`cd $PROGDIR && pwd -P`
426724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner
432c1bb7ca4db1efd528e2ae7beac53b1b04cdb154Andrew Hsieh# Check if absolute NDK path contain space
442c1bb7ca4db1efd528e2ae7beac53b1b04cdb154Andrew Hsieh#
452c1bb7ca4db1efd528e2ae7beac53b1b04cdb154Andrew Hsiehcase $PROGDIR in
462c1bb7ca4db1efd528e2ae7beac53b1b04cdb154Andrew Hsieh    *\ *) echo "ERROR: NDK path cannot contain space"
472c1bb7ca4db1efd528e2ae7beac53b1b04cdb154Andrew Hsieh          exit 1
482c1bb7ca4db1efd528e2ae7beac53b1b04cdb154Andrew Hsieh        ;;
492c1bb7ca4db1efd528e2ae7beac53b1b04cdb154Andrew Hsiehesac
502c1bb7ca4db1efd528e2ae7beac53b1b04cdb154Andrew Hsieh
515cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner# If NDK_LOG is set to 1 or true in the environment, or the command-line
525cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner# then enable log messages below
538fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh# Also normalize NDK_HOST_32BIT and NDK_ANALYZE to 1 or 0
545cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turnerif [ -z "$NDK_LOG" ]; then
555cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner  NDK_LOG=0
565cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turnerfi
575cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner
5818f80b1624fdf4491c674986564f07e486e06c75Andrew Hsiehif [ -z "$NDK_HOST_32BIT" ]; then
5918f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh  NDK_HOST_32BIT=0
6018f80b1624fdf4491c674986564f07e486e06c75Andrew Hsiehfi
6118f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh
628fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsiehif [ -z "$NDK_ANALYZE" ]; then
638fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh  NDK_ANALYZE=0
648fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsiehfi
658fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh
668fbff41d699dad1386dcdf58e02b7263939abe41Andrew HsiehPROJECT_PATH=
678fbff41d699dad1386dcdf58e02b7263939abe41Andrew HsiehPROJECT_PATH_NEXT=
685cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turnerfor opt; do
698fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    if [ -z "$PROJECT_PATH" -a "$PROJECT_PATH_NEXT" = "yes" ] ; then
708fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        PROJECT_PATH=$opt
718fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        PROJECT_PATH_NEXT=
728fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    else
738fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        case $opt in
748fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh          NDK_LOG=1|NDK_LOG=true)
758fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            NDK_LOG=1
768fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            ;;
778fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh          NDK_LOG=*)
788fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            NDK_LOG=0
798fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            ;;
808fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh          NDK_HOST_32BIT=1|NDK_HOST_32BIT=true)
818fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            NDK_HOST_32BIT=1
828fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            ;;
838fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh          NDK_HOST_32BIT=*)
848fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            NDK_HOST_32BIT=0
858fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            ;;
868fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh          NDK_ANALYZE=1|NDK_ANALYZE=true)
878fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            NDK_ANALYZE=1
888fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            ;;
898fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh          NDK_ANALYZE=*)
908fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            NDK_ANALYZE=0
918fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            ;;
928fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh          NDK_TOOLCHAIN_VERSION=*)
938fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            NDK_TOOLCHAIN_VERSION=${opt#NDK_TOOLCHAIN_VERSION=}
948fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            ;;
958fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh          APP_ABI=*)
968fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            APP_ABI=${opt#APP_ABI=}
978fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            ;;
988fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh          -C)
998fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            PROJECT_PATH_NEXT="yes"
1008fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            ;;
1018fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        esac
1028fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    fi
1035cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turnerdone
1045cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner
1055cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turnerif [ "$NDK_LOG" = "true" ]; then
1065cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner  NDK_LOG=1
1075cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turnerfi
10818f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh
10918f80b1624fdf4491c674986564f07e486e06c75Andrew Hsiehif [ "$NDK_HOST_32BIT" = "true" ]; then
11018f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh  NDK_HOST_32BIT=1
11118f80b1624fdf4491c674986564f07e486e06c75Andrew Hsiehfi
11218f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh
1138fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsiehif [ "$NDK_ANALYZE" = "true" ]; then
1148fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh  NDK_ANALYZE=1
1158fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsiehfi
1168fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh
11718f80b1624fdf4491c674986564f07e486e06c75Andrew Hsiehif [ "$NDK_LOG" = "1" ]; then
1185cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner  log () {
1195cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    echo "$@"
1205cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner  }
1215cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turnerelse
1225cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner  log () {
1235cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    : # nothing
1245cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner  }
1255cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turnerfi
1265cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner
1275cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner# Detect host operating system and architecture
1285cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner# The 64-bit / 32-bit distinction gets tricky on Linux and Darwin because
1295cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner# uname -m returns the kernel's bit size, and it's possible to run with
1305cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner# a 64-bit kernel and a 32-bit userland.
1315cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner#
1325cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' TurnerHOST_OS=$(uname -s)
1335cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turnercase $HOST_OS in
1345cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner  Darwin) HOST_OS=darwin;;
1355cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner  Linux) HOST_OS=linux;;
1365cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner  FreeBsd) HOST_OS=freebsd;;
1375cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner  CYGWIN*|*_NT-*) HOST_OS=cygwin;;
1385cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner  *) echo "ERROR: Unknown host operating system: $HOST_OS"
1395cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner     exit 1
1405cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turneresac
1415cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turnerlog "HOST_OS=$HOST_OS"
1425cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner
1435cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' TurnerHOST_ARCH=$(uname -m)
1445cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turnercase $HOST_ARCH in
1455cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    i?86) HOST_ARCH=x86;;
1465cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    x86_64|amd64) HOST_ARCH=x86_64;;
1475cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    *) echo "ERROR: Unknown host CPU architecture: $HOST_ARCH"
1485cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner       exit 1
1495cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turneresac
1505cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turnerlog "HOST_ARCH=$HOST_ARCH"
1515cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner
1525cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner# Detect 32-bit userland on 64-bit kernels
1535cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' TurnerHOST_TAG="$HOST_OS-$HOST_ARCH"
1545cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turnercase $HOST_TAG in
1555cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner  linux-x86_64|darwin-x86_64)
1565cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    # we look for x86_64 or x86-64 in the output of 'file' for our shell
1575cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    # the -L flag is used to dereference symlinks, just in case.
1585cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    file -L "$SHELL" | grep -q "x86[_-]64"
1595cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    if [ $? != 0 ]; then
1605cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner      HOST_ARCH=x86
1615cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner      log "HOST_ARCH=$HOST_ARCH (32-bit userland detected)"
1625cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    fi
1635cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    ;;
1645cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turneresac
1655cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner
1665cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner# Check that we have 64-bit binaries on 64-bit system, otherwise fallback
1675cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner# on 32-bit ones. This gives us more freedom in packaging the NDK.
16818f80b1624fdf4491c674986564f07e486e06c75Andrew HsiehLOG_MESSAGE=
16918f80b1624fdf4491c674986564f07e486e06c75Andrew Hsiehif [ $HOST_ARCH = x86_64 ]; then
17018f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh  if [ ! -d $PROGDIR/prebuilt/$HOST_TAG ]; then
17118f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh    HOST_ARCH=x86
17218f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh    LOG_MESSAGE="(no 64-bit prebuilt binaries detected)"
1735cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner  fi
17418f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh
17518f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh  if [ "$NDK_HOST_32BIT" = "1" ]; then
17618f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh    HOST_ARCH=x86
17718f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh    LOG_MESSAGE="(force 32-bit host toolchain)"
17818f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh  fi
17918f80b1624fdf4491c674986564f07e486e06c75Andrew Hsiehfi
18018f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh
18118f80b1624fdf4491c674986564f07e486e06c75Andrew HsiehHOST_TAG=$HOST_OS-$HOST_ARCH
18218f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh# Special case windows-x86 -> windows
18318f80b1624fdf4491c674986564f07e486e06c75Andrew Hsiehif [ $HOST_TAG = windows-x86 ]; then
18418f80b1624fdf4491c674986564f07e486e06c75Andrew Hsieh  HOST_TAG=windows
1855cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turnerfi
18618f80b1624fdf4491c674986564f07e486e06c75Andrew Hsiehlog "HOST_TAG=$HOST_TAG $LOG_MESSAGE"
1875cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner
18833202f3b3008ce413717c04b7eefd8722eaa214cDavid 'Digit' Turner# If GNUMAKE is defined, check that it points to a valid file
18933202f3b3008ce413717c04b7eefd8722eaa214cDavid 'Digit' Turnerif [ -n "$GNUMAKE" ] ; then
19033202f3b3008ce413717c04b7eefd8722eaa214cDavid 'Digit' Turner    ABS_GNUMAKE=`which $GNUMAKE 2> /dev/null`
19133202f3b3008ce413717c04b7eefd8722eaa214cDavid 'Digit' Turner    if [ $? != 0 ] ; then
19233202f3b3008ce413717c04b7eefd8722eaa214cDavid 'Digit' Turner        echo "ERROR: Your GNUMAKE variable is defined to an invalid name: $GNUMAKE"
19333202f3b3008ce413717c04b7eefd8722eaa214cDavid 'Digit' Turner        echo "Please fix it to point to a valid make executable (e.g. /usr/bin/make)"
19433202f3b3008ce413717c04b7eefd8722eaa214cDavid 'Digit' Turner        exit 1
19533202f3b3008ce413717c04b7eefd8722eaa214cDavid 'Digit' Turner    fi
19633202f3b3008ce413717c04b7eefd8722eaa214cDavid 'Digit' Turner    GNUMAKE="$ABS_GNUMAKE"
1975cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    log "GNUMAKE=$GNUMAKE (from environment variable)"
19833202f3b3008ce413717c04b7eefd8722eaa214cDavid 'Digit' Turnerelse
1995cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    # Otherwise use the prebuilt version for our host tag, if it exists
2005cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    # Note: we intentionally do not provide prebuilt make binaries for Cygwin
2015cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    # or MSys.
2025cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    GNUMAKE=$PROGDIR/prebuilt/$HOST_TAG/bin/make
2035cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    if [ ! -f "$GNUMAKE" ]; then
2045cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner        # Otherwise, use 'make' and check that it is available
2055cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner        GNUMAKE=`which make 2> /dev/null`
2065cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner        if [ $? != 0 ] ; then
2075cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner            echo "ERROR: Cannot find 'make' program. Please install Cygwin make package"
2085cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner            echo "or define the GNUMAKE variable to point to it."
2095cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner            exit 1
2105cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner        fi
2115cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner        log "GNUMAKE=$GNUMAKE (system path)"
2125cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    else
2135cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner        log "GNUMAKE=$GNUMAKE (NDK prebuilt)"
21433202f3b3008ce413717c04b7eefd8722eaa214cDavid 'Digit' Turner    fi
2156724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turnerfi
2166724aaa2876f40ad270823bc933edf7552f67436David 'Digit' Turner
217dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner# On Windows, when running under cygwin, check that we are
218dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner# invoking a cygwin-compatible GNU Make binary. It is unfortunately
2195cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner# common for app developers to have another non cygwin-compatible
2205cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner# 'make' program in their PATH.
221dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner#
222dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turnerif [ "$OSTYPE" = "cygwin" ] ; then
223dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner    GNUMAKE=`cygpath -u $GNUMAKE`
22433202f3b3008ce413717c04b7eefd8722eaa214cDavid 'Digit' Turner    PROGDIR_MIXED=`cygpath -m $PROGDIR`
22599dcb2c517a0d9d9e7246cca9e668c04a8e348b8David 'Digit' Turner    CYGWIN_GNUMAKE=`$GNUMAKE -f "$PROGDIR_MIXED/build/core/check-cygwin-make.mk" 2>&1`
226dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner    if [ $? != 0 ] ; then
227dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner        echo "ERROR: You are using a non-Cygwin compatible Make program."
228dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner        echo "Currently using: `cygpath -m $GNUMAKE`"
229dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner        echo ""
230dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner        echo "To solve the issue, follow these steps:"
231dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner        echo ""
232dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner        echo "1. Ensure that the Cygwin 'make' package is installed."
233dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner        echo "   NOTE: You will need GNU Make 3.81 or later!"
234dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner        echo ""
235dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner        echo "2. Define the GNUMAKE environment variable to point to it, as in:"
236dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner        echo ""
237dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner        echo "     export GNUMAKE=/usr/bin/make"
238dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner        echo ""
239dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner        echo "3. Call 'ndk-build' again."
240dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner        echo ""
241dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner        exit 1
242dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner    fi
2435cf36153892578ff9bb86053f0922f1b153345b6David 'Digit' Turner    log "Cygwin-compatible GNU make detected"
244dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turnerfi
245dfc478bcac20693422ee56a423377403bba46932David 'Digit' Turner
2468fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsiehif [ "$NDK_ANALYZE" = 1 ]; then
2478fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    . $PROGDIR/build/tools/dev-defaults.sh  # for DEFAULT_LLVM_VERSION
2488fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh
2492641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh    # Find perl.  If HOST_PERL is defined, check that it points to a valid file
2502641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh    HOST_PERL_LIB=
2512641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh    if [ -n "$HOST_PERL" ] ; then
2522641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh        ABS_PERL=`which $HOST_PERL 2> /dev/null`
2532641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh        if [ $? != 0 ] ; then
2542641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh            echo "ERROR: Your HOST_PERL variable is defined to an invalid name: $HOST_PERL"
2552641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh            echo "Please fix it to point to a valid perl executable (e.g. /usr/bin/perl)"
2562641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh            exit 1
2572641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh        fi
2582641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh        HOST_PERL="$ABS_PERL"
2592641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh        log "HOST_PERL=$HOST_PERL (from environment variable)"
2602641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh    else
2612641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh        # Otherwise use the prebuilt version for our host tag
2622641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh        HOST_PERL="$PROGDIR/prebuilt/$HOST_TAG/bin/perl"
2632641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh        if [ ! -f "$HOST_PERL" ]; then
2642641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh            # Otherwise, use 'perl' and check that it is available
2652641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh            HOST_PERL=`which perl 2> /dev/null`
2662641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh            if [ $? != 0 ] ; then
2672641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh                echo "ERROR: Cannot find 'perl' program. Please install perl package"
2682641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh                echo "or define the HOST_PERL variable to point to it."
2692641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh                exit 1
2702641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh            fi
2712641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh            log "HOST_PERL=$HOST_PERL (system path)"
2722641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh        else
2732641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh            HOST_PERL_LIB="$PROGDIR/prebuilt/$HOST_TAG/lib/perl5"
2742641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh            log "HOST_PERL=$HOST_PERL (NDK prebuilt)"
2752641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh        fi
2762641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh    fi
2772641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh
2788fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    # Return flags send in env. or command line which are enough to retrive APP_ABI and TOOLCHAIN_PREFIX later
2798fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    gen_flags ()
2808fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    {
2818fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        local FLAGS=
2828fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh
2838fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        if [ -n "$PROJECT_PATH" ] ; then
2848fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            FLAGS=$FLAGS" -C $PROJECT_PATH"
2858fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        fi
2868fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        if [ -n "$APP_ABI" ] ; then
2878fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            FLAGS=$FLAGS" APP_ABI=$APP_ABI"
2888fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        fi
2898fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        if [ -n "$NDK_HOST_32BIT" ] ; then
2908fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            FLAGS=$FLAGS" NDK_HOST_32BIT=$NDK_HOST_32BIT"
2918fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        fi
2928fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        if [ -n "$NDK_TOOLCHAIN_VERSION" ] ; then
2938fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            FLAGS=$FLAGS" NDK_TOOLCHAIN_VERSION=$NDK_TOOLCHAIN_VERSION"
2948fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        fi
2958fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        echo "$FLAGS"
2968fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    }
2978fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh
2988fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    get_build_var ()
2998fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    {
3008fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        local VAR=$1
3018fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        local FLAGS=`gen_flags`
3028fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        $GNUMAKE --no-print-dir -f $PROGDIR/build/core/build-local.mk $FLAGS DUMP_${VAR} | tail -1
3038fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    }
3048fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh
3058fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    get_build_var_for_abi ()
3068fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    {
3078fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        local VAR=$1
3088fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        local ABI=$2
3098fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        local FLAGS=`gen_flags`
3108fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        $GNUMAKE --no-print-dir -f $PROGDIR/build/core/build-local.mk $FLAGS DUMP_${VAR} APP_ABI=${ABI} | tail -1
3118fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    }
3128fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh
3138fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    APP_ABIS=`get_build_var APP_ABI`
3148fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    for ABI in $APP_ABIS; do
3158fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh        TOOLCHAIN_PREFIX=`get_build_var_for_abi TOOLCHAIN_PREFIX $ABI`
3162641f6f5414e56d792fac26572a5d984977ef462Andrew Hsieh        PERL5LIB="$HOST_PERL_LIB" "$HOST_PERL" $PROGDIR/prebuilt/common/scan-build/scan-build \
3178fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            --use-analyzer $PROGDIR/toolchains/llvm-${DEFAULT_LLVM_VERSION}/prebuilt/$HOST_TAG/bin/${ABI}/analyzer \
3188fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            --use-cc ${TOOLCHAIN_PREFIX}gcc \
3198fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            --use-c++ ${TOOLCHAIN_PREFIX}g++ \
32016b7a31819fa874e981cf9ab5671aec76901d5d2Martin Storsjo            --status-bugs \
3218fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh            $GNUMAKE -f $PROGDIR/build/core/build-local.mk "$@" APP_ABI=$ABI
3228fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    done
3238fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsiehelse
3248fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh    $GNUMAKE -f $PROGDIR/build/core/build-local.mk "$@"
3258fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsiehfi
3268fbff41d699dad1386dcdf58e02b7263939abe41Andrew Hsieh
327