Home | History | Annotate | Download | only in tools
      1 #!/bin/sh
      2 #
      3 # Copyright (C) 2009 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 # build-ndk-sysroot.sh
     18 #
     19 # collect files from an Android tree to assemble a sysroot suitable for
     20 # building a standable toolchain.
     21 #
     22 # after that, you may use build/tools/package-ndk-sysroot.sh to package
     23 # the resulting files for distribution.
     24 #
     25 # NOTE: this is different from the Android toolchain original build-sysroot.sh
     26 #       script because we place target files differently.
     27 #
     28 # WARNING: For now, only a single target ABI/Architecture us supported
     29 #
     30 
     31 . `dirname $0`/ndk-common.sh
     32 
     33 # PLATFORM is the name of the current Android system platform
     34 PLATFORM=android-3
     35 
     36 # ABI is the target ABI name for the NDK
     37 ABI=arm
     38 
     39 OPTION_HELP=no
     40 OPTION_BUILD_OUT=
     41 OPTION_PLATFORM=
     42 OPTION_PACKAGE=no
     43 OPTION_ABI=
     44 
     45 for opt do
     46   optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
     47   case "$opt" in
     48   --help|-h|-\?) OPTION_HELP=yes
     49   ;;
     50   --verbose)
     51     VERBOSE=yes
     52     ;;
     53   --platform=*)
     54     OPTION_PLATFORM=$optarg
     55     ;;
     56   --build-out=*)
     57     OPTION_BUILD_OUT=$optarg
     58     ;;
     59   --package)
     60     OPTION_PACKAGE=yes
     61     ;;
     62   --abi=*)
     63     OPTION_ABI=$optarg
     64     ;;
     65   *)
     66     echo "unknown option '$opt', use --help"
     67     exit 1
     68   esac
     69 done
     70 
     71 if [ $OPTION_HELP = "yes" ] ; then
     72     echo "Collect files from an Android build tree and assembles a sysroot"
     73     echo "suitable for building a standalone toolchain or be used by the"
     74     echo "Android NDK."
     75     echo ""
     76     echo "options:"
     77     echo ""
     78     echo "  --help             print this message"
     79     echo "  --verbose          enable verbose messages"
     80     echo "  --platform=<name>  generate sysroot for platform <name> (default is $PLATFORM)"
     81     echo "  --abi=<name>       generate sysroot for abi <name> (default is $ABI)"
     82     echo "  --build-out=<path> set Android build out directory"
     83     echo "  --package          generate sysroot package tarball"
     84     echo ""
     85     exit 0
     86 fi
     87 
     88 if [ -n "$OPTION_PLATFORM" ] ; then
     89     PLATFORM=$OPTION_PLATFORM
     90 fi
     91 
     92 if [ -n "$OPTION_ABI" ] ; then
     93     ABI=$OPTION_ABI
     94 fi
     95 
     96 case "$ABI" in
     97 arm*)
     98     ARCH=arm
     99     ;;
    100 *)
    101     ARCH=$ABI
    102     ;;
    103 esac
    104 
    105 
    106 # Get the root of the NDK from the current program location
    107 NDK_ROOT=`dirname $0`
    108 NDK_ROOT=`dirname $NDK_ROOT`
    109 NDK_ROOT=`dirname $NDK_ROOT`
    110 
    111 # Get the Android out directory
    112 if [ -z "$OPTION_BUILD_OUT" ] ; then
    113     if [ -z "$ANDROID_PRODUCT_OUT" ] ; then
    114         echo "ANDROID_PRODUCT_OUT is not defined in your environment. Aborting"
    115         exit 1
    116     fi
    117     if [ ! -d $ANDROID_PRODUCT_OUT ] ; then
    118         echo "ANDROID_PRODUCT_OUT does not point to a valid directory. Aborting"
    119         exit 1
    120     fi
    121 else
    122     ANDROID_PRODUCT_OUT=$OPTION_BUILD_OUT
    123     if [ ! -d $ANDROID_PRODUCT_OUT ] ; then
    124         echo "The build out path is not a valid directory: $OPTION_BUILD_OUT"
    125         exit 1
    126     fi
    127 fi
    128 
    129 PRODUCT_DIR=$ANDROID_PRODUCT_OUT
    130 SYSROOT=$NDK_ROOT/build/platforms/$PLATFORM/arch-$ABI
    131 COMMON_ROOT=$NDK_ROOT/build/platforms/$PLATFORM/common
    132 
    133 # clean up everything in existing sysroot
    134 rm -rf $SYSROOT
    135 mkdir -p $SYSROOT
    136 
    137 rm -rf $COMMON_ROOT
    138 mkdir -p $COMMON_ROOT
    139 
    140 LIB_ROOT=$SYSROOT/usr/lib
    141 
    142 install_file ()
    143 {
    144     mkdir -p $2/`dirname $1`
    145     cp -fp $1 $2/$1
    146 }
    147 
    148 install_helper ()
    149 {
    150   (cd $1 && find . -type f | while read ff; do install_file $ff $2; done)
    151 }
    152 
    153 TOP=$PRODUCT_DIR/../../../..
    154 
    155 # CRT objects that need to be copied
    156 CRT_OBJS_DIR=$PRODUCT_DIR/obj/lib
    157 CRT_OBJS="$CRT_OBJS_DIR/crtbegin_static.o \
    158 $CRT_OBJS_DIR/crtbegin_dynamic.o \
    159 $CRT_OBJS_DIR/crtend_android.o"
    160 
    161 # static libraries that need to be copied.
    162 STATIC_LIBS_DIR=$PRODUCT_DIR/obj/STATIC_LIBRARIES
    163 STATIC_LIBS="$STATIC_LIBS_DIR/libc_intermediates/libc.a \
    164 $STATIC_LIBS_DIR/libm_intermediates/libm.a \
    165 $STATIC_LIBS_DIR/libstdc++_intermediates/libstdc++.a
    166 $STATIC_LIBS_DIR/libthread_db_intermediates/libthread_db.a"
    167 
    168 # dynamic libraries that need to be copied.
    169 DYNAMIC_LIBS_DIR=$PRODUCT_DIR/symbols/system/lib
    170 DYNAMIC_LIBS="$DYNAMIC_LIBS_DIR/libdl.so \
    171 $DYNAMIC_LIBS_DIR/libc.so \
    172 $DYNAMIC_LIBS_DIR/libm.so \
    173 $DYNAMIC_LIBS_DIR/libstdc++.so \
    174 $DYNAMIC_LIBS_DIR/libthread_db.so"
    175 
    176 # Copy all CRT objects and libraries
    177 rm -rf $LIB_ROOT
    178 mkdir -p $LIB_ROOT
    179 cp -f $CRT_OBJS $STATIC_LIBS $DYNAMIC_LIBS $LIB_ROOT
    180 
    181 # Check $TOP/bionic to see if this is new source layout.
    182 if [ -d $TOP/bionic ] ;then
    183   BIONIC_ROOT=$TOP/bionic
    184   LIBC_ROOT=$BIONIC_ROOT/libc
    185 else
    186   BIONIC_ROOT=$TOP/system
    187   LIBC_ROOT=$BIONIC_ROOT/bionic
    188 fi
    189 
    190 # Copy headers.  This need to be done in the reverse order of inclusion
    191 # in case there are different headers with the same name.
    192 ARCH_INCLUDE=$SYSROOT/usr/include
    193 rm -rf $ARCH_INCLUDE
    194 mkdir -p $ARCH_INCLUDE
    195 
    196 COMMON_INCLUDE=$COMMON_ROOT/include
    197 rm -rf $COMMON_INCLUDE
    198 mkdir -p $COMMON_INCLUDE
    199 
    200 # Install a common header and create the appropriate arch-specific
    201 # directory for it.
    202 #
    203 # $1: source directory
    204 # $2: header path, relative to source directory
    205 #
    206 common_header ()
    207 {
    208     echo "Copy: $COMMON_INCLUDE/$2"
    209     mkdir -p `dirname $COMMON_INCLUDE/$2`
    210     install $1/$2 $COMMON_INCLUDE/$2
    211     # just to be safe
    212     chmod a-x $COMMON_INCLUDE/$2
    213 
    214     # the link prefix, used to point to common/
    215     # from arch-$ARCH/usr/
    216     link_prefix=../../common/include
    217 
    218     # we need to count the number of directory separators in $2
    219     # for each one of them, we're going to prepend ../ to the
    220     # link prefix
    221     for item in `echo $2 | tr '/' ' '`; do
    222         link_prefix=../$link_prefix
    223     done
    224 
    225     echo "Link: $ARCH_INCLUDE/$2"
    226     mkdir -p `dirname $ARCH_INCLUDE/$2`
    227     ln -s $link_prefix/$2 $ARCH_INCLUDE/$2
    228 }
    229 
    230 common_headers ()
    231 {
    232     srcs=`cd $1 && find . -type f`
    233     # remove leading ./
    234     srcs=`echo $srcs | sed -e "s%\./%%g"`
    235 
    236     for src in $srcs; do
    237         common_header $1 $src
    238     done
    239 }
    240 
    241 arch_header ()
    242 {
    243     echo "Copy: $ARCH_INCLUDE/$2"
    244     mkdir -p `dirname $ARCH_INCLUDE/$2`
    245     install $1/$2 $ARCH_INCLUDE/$2
    246     # just to be safe
    247     chmod a-x $ARCH_INCLUDE/$2
    248 }
    249 
    250 arch_headers ()
    251 {
    252     srcs=`cd $1 && find . -type f`
    253     # remove leading ./
    254     srcs=`echo $srcs | sed -e "s%\./%%g"`
    255 
    256     for src in $srcs; do
    257         arch_header $1 $src
    258     done
    259 }
    260 
    261 # ZLib headers
    262 common_header  $TOP/external/zlib zlib.h
    263 common_header  $TOP/external/zlib zconf.h
    264 
    265 # Jni header
    266 common_header  $TOP/libnativehelper/include/nativehelper jni.h
    267 
    268 # libthread_db headers, not sure if this is needed for the NDK
    269 common_headers $BIONIC_ROOT/libthread_db/include
    270 
    271 # for libm, just copy math.h and fenv.h
    272 common_header $BIONIC_ROOT/libm/include math.h
    273 if [ "$ARCH" = "x86" ]; then
    274     arch_header   $BIONIC_ROOT/libm/include i387/fenv.h
    275 else
    276     arch_header   $BIONIC_ROOT/libm/include $ARCH/fenv.h
    277 fi
    278 
    279 # our tiny C++ standard library
    280 common_headers $BIONIC_ROOT/libstdc++/include
    281 
    282 # C library kernel headers
    283 common_headers $LIBC_ROOT/kernel/common
    284 arch_headers   $LIBC_ROOT/kernel/arch-$ARCH
    285 
    286 # C library headers
    287 common_headers $LIBC_ROOT/include
    288 arch_headers   $LIBC_ROOT/arch-$ARCH/include
    289 
    290 # Do we need to package the result
    291 if [ $OPTION_PACKAGE = yes ] ; then
    292     DATE=`date +%Y%m%d`
    293     PKGFILE=$TMPDIR/android-ndk-sysroot-$DATE.tar.bz2
    294     tar cjf $PKGFILE build/platforms/$PLATFORM/arch-$ARCH
    295     echo "Packaged in $PKGFILE"
    296 fi
    297