Home | History | Annotate | Download | only in ndk
      1 #!/bin/sh
      2 #
      3 # Copyright (C) 2010 The Android Open Source Project
      4 #
      5 # Licensed under the Apache License, Version 2.0 (the "License");
      6 # you may not use this file except in compliance with the License.
      7 # You may obtain a copy of the License at
      8 #
      9 #      http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 # Unless required by applicable law or agreed to in writing, software
     12 # distributed under the License is distributed on an "AS IS" BASIS,
     13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 # See the License for the specific language governing permissions and
     15 # limitations under the License.
     16 #
     17 #  This shell script is a wrapper to launch the NDK build from the
     18 #  command-line inside an application project path.
     19 #
     20 #  Typical usage is:
     21 #
     22 #     cd $PROJECT_PATH
     23 #     ndk-build
     24 #
     25 #  Assuming that the Android NDK root path is in your PATH. However,
     26 #  you can also invoke it directly as:
     27 #
     28 #     $NDK_ROOT/ndk-build
     29 #
     30 #  This really is a tiny wrapper around GNU Make.
     31 #
     32 
     33 # Ensure we get the full path of this script's directory
     34 # this is needed if the caller uses the -C <path> GNU Make
     35 # option, as in:
     36 #
     37 #    cd ndk
     38 #    ./ndk-build -C <project-path>
     39 #
     40 PROGDIR=`dirname $0`
     41 PROGDIR=`cd $PROGDIR && pwd`
     42 
     43 # If NDK_LOG is set to 1 or true in the environment, or the command-line
     44 # then enable log messages below
     45 if [ -z "$NDK_LOG" ]; then
     46   NDK_LOG=0
     47 fi
     48 
     49 for opt; do
     50     case $opt in
     51       NDK_LOG=1|NDK_LOG=true)
     52         NDK_LOG=1
     53         ;;
     54       NDK_LOG=*)
     55         NDK_LOG=0
     56         ;;
     57     esac
     58 done
     59 
     60 if [ "$NDK_LOG" = "true" ]; then
     61   NDK_LOG=1
     62 fi
     63 if [ "$NDK_LOG" = 1 ]; then
     64   log () {
     65     echo "$@"
     66   }
     67 else
     68   log () {
     69     : # nothing
     70   }
     71 fi
     72 
     73 # Detect host operating system and architecture
     74 # The 64-bit / 32-bit distinction gets tricky on Linux and Darwin because
     75 # uname -m returns the kernel's bit size, and it's possible to run with
     76 # a 64-bit kernel and a 32-bit userland.
     77 #
     78 HOST_OS=$(uname -s)
     79 case $HOST_OS in
     80   Darwin) HOST_OS=darwin;;
     81   Linux) HOST_OS=linux;;
     82   FreeBsd) HOST_OS=freebsd;;
     83   CYGWIN*|*_NT-*) HOST_OS=cygwin;;
     84   *) echo "ERROR: Unknown host operating system: $HOST_OS"
     85      exit 1
     86 esac
     87 log "HOST_OS=$HOST_OS"
     88 
     89 HOST_ARCH=$(uname -m)
     90 case $HOST_ARCH in
     91     i?86) HOST_ARCH=x86;;
     92     x86_64|amd64) HOST_ARCH=x86_64;;
     93     *) echo "ERROR: Unknown host CPU architecture: $HOST_ARCH"
     94        exit 1
     95 esac
     96 log "HOST_ARCH=$HOST_ARCH"
     97 
     98 # Detect 32-bit userland on 64-bit kernels
     99 HOST_TAG="$HOST_OS-$HOST_ARCH"
    100 case $HOST_TAG in
    101   linux-x86_64|darwin-x86_64)
    102     # we look for x86_64 or x86-64 in the output of 'file' for our shell
    103     # the -L flag is used to dereference symlinks, just in case.
    104     file -L "$SHELL" | grep -q "x86[_-]64"
    105     if [ $? != 0 ]; then
    106       HOST_ARCH=x86
    107       HOST_TAG=$HOST_OS-x86
    108       log "HOST_ARCH=$HOST_ARCH (32-bit userland detected)"
    109     fi
    110     ;;
    111   windows-x86) # Special case windows-x86 -> windows
    112     HOST_TAG=windows
    113 esac
    114 
    115 # Check that we have 64-bit binaries on 64-bit system, otherwise fallback
    116 # on 32-bit ones. This gives us more freedom in packaging the NDK.
    117 if [ $HOST_ARCH = x86_64 -a ! -d $PROGDIR/prebuilt/$HOST_TAG ]; then
    118   HOST_TAG=$HOST_OS-x86
    119   if [ $HOST_TAG = windows-x86 ]; then
    120     HOST_TAG=windows
    121   fi
    122   log "HOST_TAG=$HOST_TAG (no 64-bit prebuilt binaries detected)"
    123 else
    124   log "HOST_TAG=$HOST_TAG"
    125 fi
    126 
    127 # If GNUMAKE is defined, check that it points to a valid file
    128 if [ -n "$GNUMAKE" ] ; then
    129     ABS_GNUMAKE=`which $GNUMAKE 2> /dev/null`
    130     if [ $? != 0 ] ; then
    131         echo "ERROR: Your GNUMAKE variable is defined to an invalid name: $GNUMAKE"
    132         echo "Please fix it to point to a valid make executable (e.g. /usr/bin/make)"
    133         exit 1
    134     fi
    135     GNUMAKE="$ABS_GNUMAKE"
    136     log "GNUMAKE=$GNUMAKE (from environment variable)"
    137 else
    138     # Otherwise use the prebuilt version for our host tag, if it exists
    139     # Note: we intentionally do not provide prebuilt make binaries for Cygwin
    140     # or MSys.
    141     GNUMAKE=$PROGDIR/prebuilt/$HOST_TAG/bin/make
    142     if [ ! -f "$GNUMAKE" ]; then
    143         # Otherwise, use 'make' and check that it is available
    144         GNUMAKE=`which make 2> /dev/null`
    145         if [ $? != 0 ] ; then
    146             echo "ERROR: Cannot find 'make' program. Please install Cygwin make package"
    147             echo "or define the GNUMAKE variable to point to it."
    148             exit 1
    149         fi
    150         log "GNUMAKE=$GNUMAKE (system path)"
    151     else
    152         log "GNUMAKE=$GNUMAKE (NDK prebuilt)"
    153     fi
    154 fi
    155 
    156 # On Windows, when running under cygwin, check that we are
    157 # invoking a cygwin-compatible GNU Make binary. It is unfortunately
    158 # common for app developers to have another non cygwin-compatible
    159 # 'make' program in their PATH.
    160 #
    161 if [ "$OSTYPE" = "cygwin" ] ; then
    162     GNUMAKE=`cygpath -u $GNUMAKE`
    163     PROGDIR_MIXED=`cygpath -m $PROGDIR`
    164     CYGWIN_GNUMAKE=`$GNUMAKE -f "$PROGDIR_MIXED/build/core/check-cygwin-make.mk" 2>&1`
    165     if [ $? != 0 ] ; then
    166         echo "ERROR: You are using a non-Cygwin compatible Make program."
    167         echo "Currently using: `cygpath -m $GNUMAKE`"
    168         echo ""
    169         echo "To solve the issue, follow these steps:"
    170         echo ""
    171         echo "1. Ensure that the Cygwin 'make' package is installed."
    172         echo "   NOTE: You will need GNU Make 3.81 or later!"
    173         echo ""
    174         echo "2. Define the GNUMAKE environment variable to point to it, as in:"
    175         echo ""
    176         echo "     export GNUMAKE=/usr/bin/make"
    177         echo ""
    178         echo "3. Call 'ndk-build' again."
    179         echo ""
    180         exit 1
    181     fi
    182     log "Cygwin-compatible GNU make detected"
    183 fi
    184 
    185 $GNUMAKE -f $PROGDIR/build/core/build-local.mk "$@"
    186