Home | History | Annotate | Download | only in tools
      1 #
      2 # Copyright (C) 2011 The Android Open Source Project
      3 #
      4 # Licensed under the Apache License, Version 2.0 (the "License");
      5 # you may not use this file except in compliance with the License.
      6 # You may obtain a copy of the License at
      7 #
      8 #      http://www.apache.org/licenses/LICENSE-2.0
      9 #
     10 # Unless required by applicable law or agreed to in writing, software
     11 # distributed under the License is distributed on an "AS IS" BASIS,
     12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 # See the License for the specific language governing permissions and
     14 # limitations under the License.
     15 #
     16 #  This file contains various shell function definitions that can be
     17 #  used to either build a static and shared libraries from sources, or
     18 #  generate a Makefile to do it in parallel.
     19 #
     20 
     21 _BUILD_TAB=$(echo " " | tr ' ' '\t')
     22 
     23 builder_command ()
     24 {
     25     if [ -z "$_BUILD_MK" ]; then
     26         if [ "$VERBOSE2" = "yes" ]; then
     27             echo "$@"
     28         fi
     29         "$@"
     30     else
     31         echo "${_BUILD_TAB}${_BUILD_HIDE}$@" >> $_BUILD_MK
     32     fi
     33 }
     34 
     35 
     36 builder_log ()
     37 {
     38     if [ "$_BUILD_MK" ]; then
     39         echo "${_BUILD_TAB}${_BUILD_HIDE}echo $@" >> $_BUILD_MK
     40     else
     41         log "$@"
     42     fi
     43 }
     44 
     45 # $1: Build directory
     46 # $2: Optional Makefile name
     47 builder_begin ()
     48 {
     49     _BUILD_DIR_NEW=
     50     _BUILD_DIR=$1
     51     if [ ! -d "$_BUILD_DIR" ]; then
     52         mkdir -p "$_BUILD_DIR"
     53         fail_panic "Can't create build directory: $_BUILD_DIR"
     54         _BUILD_DIR_NEW=true
     55     else
     56         rm -rf "$_BUILD_DIR/*"
     57         fail_panic "Can't cleanup build directory: $_BUILD_DIR"
     58     fi
     59     _BUILD_TARGETS=
     60     _BUILD_PREFIX=
     61     _BUILD_MK=$2
     62     if [ -n "$_BUILD_MK" ]; then
     63         log "Creating temporary build Makefile: $_BUILD_MK"
     64         rm -f $_BUILD_MK &&
     65         echo "# Auto-generated by $0 - do not edit!" > $_BUILD_MK
     66         echo ".PHONY: all" >> $_BUILD_MK
     67         echo "all:" >> $_BUILD_MK
     68     fi
     69     # HIDE is used to hide the Makefile output, unless --verbose --verbose
     70     # is used.
     71     if [ "$VERBOSE2" = "yes" ]; then
     72         _BUILD_HIDE=""
     73     else
     74         _BUILD_HIDE=@
     75     fi
     76 
     77     builder_begin_module
     78 }
     79 
     80 # $1: Variable name
     81 # out: Variable value
     82 _builder_varval ()
     83 {
     84     eval echo "\$$1"
     85 }
     86 
     87 _builder_varadd ()
     88 {
     89     local _varname="$1"
     90     local _varval="$(_builder_varval $_varname)"
     91     shift
     92     if [ -z "$_varval" ]; then
     93         eval $_varname=\"$@\"
     94     else
     95         eval $_varname=\$$_varname\" $@\"
     96     fi
     97 }
     98 
     99 
    100 builder_set_prefix ()
    101 {
    102     _BUILD_PREFIX="$@"
    103 }
    104 
    105 builder_begin_module ()
    106 {
    107     _BUILD_CC=
    108     _BUILD_CXX=
    109     _BUILD_AR=
    110     _BUILD_C_INCLUDES=
    111     _BUILD_CFLAGS=
    112     _BUILD_CXXFLAGS=
    113     _BUILD_LDFLAGS_BEGIN_SO=
    114     _BUILD_LDFLAGS_END_SO=
    115     _BUILD_LDFLAGS_BEGIN_EXE=
    116     _BUILD_LDFLAGS_END_EXE=
    117     _BUILD_LDFLAGS=
    118     _BUILD_BINPREFIX=
    119     _BUILD_DSTDIR=
    120     _BUILD_SRCDIR=.
    121     _BUILD_OBJECTS=
    122     _BUILD_STATIC_LIBRARIES=
    123     _BUILD_SHARED_LIBRARIES=
    124     _BUILD_COMPILER_RUNTIME_LDFLAGS=-lgcc
    125 }
    126 
    127 builder_set_binprefix ()
    128 {
    129     _BUILD_BINPREFIX=$1
    130     _BUILD_CC=${1}gcc
    131     _BUILD_CXX=${1}g++
    132     _BUILD_AR=${1}ar
    133 }
    134 
    135 builder_set_binprefix_llvm ()
    136 {
    137     _BUILD_BINPREFIX=$1
    138     _BUILD_CC=${1}clang
    139     _BUILD_CXX=${1}clang++
    140     _BUILD_AR=${2}ar
    141 }
    142 
    143 builder_set_builddir ()
    144 {
    145     _BUILD_DIR=$1
    146 }
    147 
    148 builder_set_srcdir ()
    149 {
    150     _BUILD_SRCDIR=$1
    151 }
    152 
    153 builder_set_dstdir ()
    154 {
    155     _BUILD_DSTDIR=$1
    156 }
    157 
    158 builder_ldflags ()
    159 {
    160     _builder_varadd _BUILD_LDFLAGS "$@"
    161 }
    162 
    163 builder_ldflags_exe ()
    164 {
    165     _builder_varadd _BUILD_LDFLAGS_EXE "$@"
    166 }
    167 
    168 builder_cflags ()
    169 {
    170     _builder_varadd _BUILD_CFLAGS "$@"
    171 }
    172 
    173 builder_cxxflags ()
    174 {
    175     _builder_varadd _BUILD_CXXFLAGS "$@"
    176 }
    177 
    178 builder_c_includes ()
    179 {
    180     _builder_varadd _BUILD_C_INCLUDES "$@"
    181 }
    182 
    183 # $1: optional var to hold the original cflags before reset
    184 builder_reset_cflags ()
    185 {
    186     local _varname="$1"
    187     if [ -n "$_varname" ] ; then
    188         eval $_varname=\"$_BUILD_CFLAGS\"
    189     fi
    190     _BUILD_CFLAGS=
    191 }
    192 
    193 # $1: optional var to hold the original cxxflags before reset
    194 builder_reset_cxxflags ()
    195 {
    196     local _varname="$1"
    197     if [ -n "$_varname" ] ; then
    198         eval $_varname=\"$_BUILD_CXXFLAGS\"
    199     fi
    200     _BUILD_CXXFLAGS=
    201 }
    202 
    203 # $1: optional var to hold the original c_includes before reset
    204 builder_reset_c_includes ()
    205 {
    206     local _varname="$1"
    207     if [ -n "$_varname" ] ; then
    208         eval $_varname=\"$_BUILD_C_INCLUDES\"
    209     fi
    210     _BUILD_C_INCLUDES=
    211 }
    212 
    213 builder_compiler_runtime_ldflags ()
    214 {
    215     _BUILD_COMPILER_RUNTIME_LDFLAGS=$1
    216 }
    217 
    218 builder_link_with ()
    219 {
    220     local LIB
    221     for LIB; do
    222         case $LIB in
    223             *.a)
    224                 _builder_varadd _BUILD_STATIC_LIBRARIES $LIB
    225                 ;;
    226             *.so)
    227                 _builder_varadd _BUILD_SHARED_LIBRARIES $LIB
    228                 ;;
    229             *)
    230                 echo "ERROR: Unknown link library extension: $LIB"
    231                 exit 1
    232         esac
    233     done
    234 }
    235 
    236 builder_sources ()
    237 {
    238     local src srcfull obj cc cflags text
    239     if [ -z "$_BUILD_DIR" ]; then
    240         panic "Build directory not set!"
    241     fi
    242     if [ -z "$_BUILD_CC" ]; then
    243         _BUILD_CC=${CC:-gcc}
    244     fi
    245     if [ -z "$_BUILD_CXX" ]; then
    246         _BUILD_CXX=${CXX:-g++}
    247     fi
    248     for src in "$@"; do
    249         srcfull=$_BUILD_SRCDIR/$src
    250         if [ ! -f "$srcfull" ]; then
    251             echo "ERROR: Missing source file: $srcfull"
    252             exit 1
    253         fi
    254         obj=$src
    255         cflags=""
    256         for inc in $_BUILD_C_INCLUDES; do
    257             cflags=$cflags" -I$inc"
    258         done
    259         cflags=$cflags" -I$_BUILD_SRCDIR"
    260         case $obj in
    261             *.c)
    262                 obj=${obj%%.c}
    263                 text="C"
    264                 cc=$_BUILD_CC
    265                 cflags="$cflags $_BUILD_CFLAGS"
    266                 ;;
    267             *.cpp)
    268                 obj=${obj%%.cpp}
    269                 text="C++"
    270                 cc=$_BUILD_CXX
    271                 cflags="$cflags $_BUILD_CXXFLAGS"
    272                 ;;
    273             *.cc)
    274                 obj=${obj%%.cc}
    275                 text="C++"
    276                 cc=$_BUILD_CXX
    277                 cflags="$cflags $_BUILD_CXXFLAGS"
    278                 ;;
    279             *.S|*.s)
    280                 obj=${obj%%.$obj}
    281                 text="ASM"
    282                 cc=$_BUILD_CC
    283                 cflags="$cflags $_BUILD_CFLAGS"
    284                 ;;
    285             *)
    286                 echo "Unknown source file extension: $obj"
    287                 exit 1
    288                 ;;
    289         esac
    290 
    291         # Source file path can include ../ path items, ensure
    292         # that the generated object do not back up the output
    293         # directory by translating them to __/
    294         obj=$(echo "$obj" | tr '../' '__/')
    295 
    296         # Ensure we have unwind tables in the generated machine code
    297         # This is useful to get good stack traces
    298         cflags=$cflags" -funwind-tables"
    299 
    300         obj=$_BUILD_DIR/$obj.o
    301         if [ "$_BUILD_MK" ]; then
    302             echo "$obj: $srcfull" >> $_BUILD_MK
    303         fi
    304         builder_log "${_BUILD_PREFIX}$text: $src"
    305         builder_command mkdir -p $(dirname "$obj")
    306         builder_command $NDK_CCACHE $cc -c -o "$obj" "$srcfull" $cflags
    307         fail_panic "Could not compile ${_BUILD_PREFIX}$src"
    308         _BUILD_OBJECTS=$_BUILD_OBJECTS" $obj"
    309     done
    310 }
    311 
    312 builder_static_library ()
    313 {
    314     local lib libname
    315     libname=$1
    316     if [ -z "$_BUILD_DSTDIR" ]; then
    317         panic "Destination directory not set"
    318     fi
    319     lib=$_BUILD_DSTDIR/$libname
    320     lib=${lib%%.a}.a
    321     if [ "$_BUILD_MK" ]; then
    322         _BUILD_TARGETS=$_BUILD_TARGETS" $lib"
    323         echo "$lib: $_BUILD_OBJECTS" >> $_BUILD_MK
    324     fi
    325     if [ -z "${_BUILD_AR}" ]; then
    326         _BUILD_AR=${AR:-ar}
    327     fi
    328     builder_log "${_BUILD_PREFIX}Archive: $libname"
    329     rm -f "$lib"
    330     builder_command ${_BUILD_AR} crsD "$lib" "$_BUILD_OBJECTS"
    331     fail_panic "Could not archive ${_BUILD_PREFIX}$libname objects!"
    332 }
    333 
    334 builder_host_static_library ()
    335 {
    336     local lib libname
    337     libname=$1
    338     if [ -z "$_BUILD_DSTDIR" ]; then
    339         panic "Destination directory not set"
    340     fi
    341     lib=$_BUILD_DSTDIR/$libname
    342     lib=${lib%%.a}.a
    343     if [ "$_BUILD_MK" ]; then
    344         _BUILD_TARGETS=$_BUILD_TARGETS" $lib"
    345         echo "$lib: $_BUILD_OBJECTS" >> $_BUILD_MK
    346     fi
    347     if [ -z "$BUILD_AR" ]; then
    348         _BUILD_AR=${AR:-ar}
    349     fi
    350     builder_log "${_BUILD_PREFIX}Archive: $libname"
    351     rm -f "$lib"
    352     builder_command ${_BUILD_AR} crsD "$lib" "$_BUILD_OBJECTS"
    353     fail_panic "Could not archive ${_BUILD_PREFIX}$libname objects!"
    354 }
    355 
    356 builder_shared_library ()
    357 {
    358     local lib libname suffix libm
    359     libname=$1
    360     suffix=$2
    361     armeabi_v7a_float_abi=$3
    362 
    363     if [ -z "$suffix" ]; then
    364         suffix=".so"
    365     fi
    366     libm="-lm"
    367     if [ "$armeabi_v7a_float_abi" = "hard" ]; then
    368         libm="-lm_hard"
    369     fi
    370     lib=$_BUILD_DSTDIR/$libname
    371     lib=${lib%%${suffix}}${suffix}
    372     if [ "$_BUILD_MK" ]; then
    373         _BUILD_TARGETS=$_BUILD_TARGETS" $lib"
    374         echo "$lib: $_BUILD_OBJECTS" >> $_BUILD_MK
    375     fi
    376     builder_log "${_BUILD_PREFIX}SharedLibrary: $libname"
    377 
    378     # Important: -lgcc must appear after objects and static libraries,
    379     #            but before shared libraries for Android. It doesn't hurt
    380     #            for other platforms.
    381     #            Also $libm must come before -lc because bionic libc
    382     #            accidentally exports a soft-float version of ldexp.
    383     builder_command ${_BUILD_CXX} \
    384         -Wl,-soname,$(basename $lib) \
    385         -Wl,-shared \
    386         $_BUILD_LDFLAGS_BEGIN_SO \
    387         $_BUILD_OBJECTS \
    388         $_BUILD_STATIC_LIBRARIES \
    389         $_BUILD_COMPILER_RUNTIME_LDFLAGS \
    390         $_BUILD_SHARED_LIBRARIES \
    391         $libm -lc \
    392         $_BUILD_LDFLAGS \
    393         $_BUILD_LDFLAGS_END_SO \
    394         -o $lib
    395     fail_panic "Could not create ${_BUILD_PREFIX}shared library $libname"
    396 }
    397 
    398 # Same as builder_shared_library, but do not link the default libs
    399 builder_nostdlib_shared_library ()
    400 {
    401     local lib libname suffix
    402     libname=$1
    403     suffix=$2
    404     if [ -z "$suffix" ]; then
    405         suffix=".so"
    406     fi
    407     lib=$_BUILD_DSTDIR/$libname
    408     lib=${lib%%${suffix}}${suffix}
    409     if [ "$_BUILD_MK" ]; then
    410         _BUILD_TARGETS=$_BUILD_TARGETS" $lib"
    411         echo "$lib: $_BUILD_OBJECTS" >> $_BUILD_MK
    412     fi
    413     builder_log "${_BUILD_PREFIX}SharedLibrary: $libname"
    414 
    415     builder_command ${_BUILD_CXX} \
    416         -Wl,-soname,$(basename $lib) \
    417         -Wl,-shared \
    418         $_BUILD_LDFLAGS_BEGIN_SO \
    419         $_BUILD_OBJECTS \
    420         $_BUILD_STATIC_LIBRARIES \
    421         $_BUILD_SHARED_LIBRARIES \
    422         $_BUILD_LDFLAGS \
    423         $_BUILD_LDFLAGS_END_SO \
    424         -o $lib
    425     fail_panic "Could not create ${_BUILD_PREFIX}shared library $libname"
    426 }
    427 
    428 builder_host_shared_library ()
    429 {
    430     local lib libname
    431     libname=$1
    432     lib=$_BUILD_DSTDIR/$libname
    433     lib=${lib%%.so}.so
    434     if [ "$_BUILD_MK" ]; then
    435         _BUILD_TARGETS=$_BUILD_TARGETS" $lib"
    436         echo "$lib: $_BUILD_OBJECTS" >> $_BUILD_MK
    437     fi
    438     builder_log "${_BUILD_PREFIX}SharedLibrary: $libname"
    439 
    440     if [ -z "$_BUILD_CXX" ]; then
    441         _BUILD_CXX=${CXX:-g++}
    442     fi
    443 
    444     # Important: -lgcc must appear after objects and static libraries,
    445     #            but before shared libraries for Android. It doesn't hurt
    446     #            for other platforms.
    447     builder_command ${_BUILD_CXX} \
    448         -shared -s \
    449         $_BUILD_OBJECTS \
    450         $_BUILD_STATIC_LIBRARIES \
    451         $_BUILD_SHARED_LIBRARIES \
    452         $_BUILD_LDFLAGS \
    453         -o $lib
    454     fail_panic "Could not create ${_BUILD_PREFIX}shared library $libname"
    455 }
    456 
    457 builder_host_executable ()
    458 {
    459     local exe exename
    460     exename=$1
    461     exe=$_BUILD_DSTDIR/$exename$HOST_EXE
    462     if [ "$_BUILD_MK" ]; then
    463         _BUILD_TARGETS=$_BUILD_TARGETS" $exe"
    464         echo "$exe: $_BUILD_OBJECTS" >> $_BUILD_MK
    465     fi
    466     builder_log "${_BUILD_PREFIX}Executable: $exename$HOST_EXE"
    467 
    468     if [ -z "$_BUILD_CXX" ]; then
    469         _BUILD_CXX=${CXX:-g++}
    470     fi
    471 
    472     # Important: -lgcc must appear after objects and static libraries,
    473     #            but before shared libraries for Android. It doesn't hurt
    474     #            for other platforms.
    475     builder_command ${_BUILD_CXX} \
    476         -s \
    477         $_BUILD_OBJECTS \
    478         $_BUILD_STATIC_LIBRARIES \
    479         $_BUILD_SHARED_LIBRARIES \
    480         $_BUILD_LDFLAGS \
    481         -o $exe
    482     fail_panic "Could not create ${_BUILD_PREFIX}executable $libname"
    483 }
    484 
    485 
    486 builder_end ()
    487 {
    488     if [ "$_BUILD_MK" ]; then
    489         echo "all: $_BUILD_TARGETS" >> $_BUILD_MK
    490         run make -j$NUM_JOBS -f $_BUILD_MK
    491         fail_panic "Could not build project!"
    492     fi
    493 
    494     if [ "$_BUILD_DIR_NEW" ]; then
    495         log2 "Cleaning up build directory: $_BUILD_DIR"
    496         rm -rf "$_BUILD_DIR"
    497         _BUILD_DIR_NEW=
    498     fi
    499 }
    500 
    501 # Same as builder_begin, but to target Android with a specific ABI
    502 # $1: ABI name (e.g. armeabi)
    503 # $2: Build directory
    504 # $3: Gcc version
    505 # $4: Optional llvm version
    506 # $5: Optional Makefile name
    507 builder_begin_android ()
    508 {
    509     local ABI BUILDDIR LLVM_VERSION MAKEFILE
    510     local ARCH SYSROOT LDIR FLAGS
    511     local CRTBEGIN_SO_O CRTEND_SO_O CRTBEGIN_EXE_SO CRTEND_SO_O
    512     local BINPREFIX GCC_TOOLCHAIN LLVM_TRIPLE GCC_VERSION
    513     local SCRATCH_FLAGS
    514     if [ -z "$NDK_DIR" ]; then
    515         panic "NDK_DIR is not defined!"
    516     elif [ ! -d "$NDK_DIR/platforms" ]; then
    517         panic "Missing directory: $NDK_DIR/platforms"
    518     fi
    519     ABI=$1
    520     BUILDDIR=$2
    521     GCC_VERSION=$3
    522     LLVM_VERSION=$4
    523     MAKEFILE=$5
    524     ARCH=$(convert_abi_to_arch $ABI)
    525 
    526     if [ "$(arch_in_unknown_archs $ARCH)" = "yes" ]; then
    527         LLVM_VERSION=$DEFAULT_LLVM_VERSION
    528     fi
    529     if [ -n "$LLVM_VERSION" ]; then
    530         # override GCC_VERSION to pick $DEFAULT_LLVM_GCC??_VERSION instead
    531         if [ "$ABI" != "${ABI%%64*}" ]; then
    532             GCC_VERSION=$DEFAULT_LLVM_GCC64_VERSION
    533         else
    534             GCC_VERSION=$DEFAULT_LLVM_GCC32_VERSION
    535         fi
    536     fi
    537     for TAG in $HOST_TAG $HOST_TAG32; do
    538         BINPREFIX=$NDK_DIR/$(get_toolchain_binprefix_for_arch $ARCH $GCC_VERSION $TAG)
    539         if [ -f ${BINPREFIX}gcc ]; then
    540             break;
    541         fi
    542     done
    543     if [ -n "$LLVM_VERSION" ]; then
    544         GCC_TOOLCHAIN=`dirname $BINPREFIX`
    545         GCC_TOOLCHAIN=`dirname $GCC_TOOLCHAIN`
    546         BINPREFIX=$NDK_DIR/$(get_llvm_toolchain_binprefix $LLVM_VERSION $TAG)
    547     fi
    548 
    549     SYSROOT=$NDK_DIR/$(get_default_platform_sysroot_for_arch $ARCH)
    550     LDIR=$SYSROOT"/usr/"$(get_default_libdir_for_arch $ARCH)
    551 
    552     CRTBEGIN_EXE_O=$LDIR/crtbegin_dynamic.o
    553     CRTEND_EXE_O=$LDIR/crtend_android.o
    554 
    555     CRTBEGIN_SO_O=$LDIR/crtbegin_so.o
    556     CRTEND_SO_O=$LDIR/crtend_so.o
    557     if [ ! -f "$CRTBEGIN_SO_O" ]; then
    558         CRTBEGIN_SO_O=$CRTBEGIN_EXE_O
    559     fi
    560     if [ ! -f "$CRTEND_SO_O" ]; then
    561         CRTEND_SO_O=$CRTEND_EXE_O
    562     fi
    563 
    564     builder_begin "$BUILDDIR" "$MAKEFILE"
    565     builder_set_prefix "$ABI "
    566     if [ -z "$LLVM_VERSION" ]; then
    567         builder_set_binprefix "$BINPREFIX"
    568     else
    569         builder_set_binprefix_llvm "$BINPREFIX"
    570         case $ABI in
    571             armeabi)
    572                 LLVM_TRIPLE=armv5te-none-linux-androideabi
    573                 ;;
    574             armeabi-v7a|armeabi-v7a-hard)
    575                 LLVM_TRIPLE=armv7-none-linux-androideabi
    576                 ;;
    577             arm64-v8a)
    578                 LLVM_TRIPLE=aarch64-none-linux-android
    579                 ;;
    580             x86)
    581                 LLVM_TRIPLE=i686-none-linux-android
    582                 ;;
    583             x86_64)
    584                 LLVM_TRIPLE=x86_64-none-linux-android
    585                 ;;
    586             mips)
    587                 LLVM_TRIPLE=mipsel-none-linux-android
    588                 ;;
    589             mips64)
    590                 LLVM_TRIPLE=mips64el-none-linux-android
    591                 ;;
    592             *)
    593                 LLVM_TRIPLE=le32-none-ndk
    594                 GCC_TOOLCHAIN=
    595                 CRTBEGIN_SO_O=
    596                 CRTEND_SO_O=
    597                 CRTBEGIN_EXE_O=
    598                 CRTEND_EXE_O=
    599                 FLAGS=-emit-llvm
    600                 ;;
    601         esac
    602         SCRATCH_FLAGS="-target $LLVM_TRIPLE $FLAGS"
    603         builder_cflags  "$SCRATCH_FLAGS"
    604         builder_cxxflags "$SCRATCH_FLAGS"
    605         builder_ldflags "$SCRATCH_FLAGS"
    606         if [ ! -z $GCC_TOOLCHAIN ]; then
    607             SCRATCH_FLAGS="-gcc-toolchain $GCC_TOOLCHAIN"
    608             builder_cflags "$SCRATCH_FLAGS"
    609             builder_cxxflags "$SCRATCH_FLAGS"
    610             builder_ldflags "$SCRATCH_FLAGS"
    611         fi
    612     fi
    613 
    614     SCRATCH_FLAGS="--sysroot=$SYSROOT"
    615     builder_cflags "$SCRATCH_FLAGS"
    616     builder_cxxflags "$SCRATCH_FLAGS"
    617 
    618     SCRATCH_FLAGS="--sysroot=$SYSROOT -nostdlib"
    619     _BUILD_LDFLAGS_BEGIN_SO="$SCRATCH_FLAGS $CRTBEGIN_SO_O"
    620     _BUILD_LDFLAGS_BEGIN_EXE="$SCRATCH_FLAGS $CRTBEGIN_EXE_O"
    621 
    622     _BUILD_LDFLAGS_END_SO="$CRTEND_SO_O"
    623     _BUILD_LDFLAGS_END_EXE="$CRTEND_EXE_O"
    624 
    625     case $ABI in
    626         armeabi)
    627             if [ -z "$LLVM_VERSION" ]; then
    628                 # add -minline-thumb1-jumptable such that gabi++/stlport/libc++ can be linked
    629                 # with compiler-rt where helpers __gnu_thumb1_case_* (in libgcc.a) don't exist
    630                 SCRATCH_FLAGS="-minline-thumb1-jumptable"
    631                 builder_cflags "$SCRATCH_FLAGS"
    632                 builder_cxxflags "$SCRATCH_FLAGS"
    633             else
    634                 builder_cflags ""
    635                 builder_cxxflags ""
    636             fi
    637             ;;
    638         armeabi-v7a|armeabi-v7a-hard)
    639             SCRATCH_FLAGS="-march=armv7-a -mfpu=vfpv3-d16"
    640             builder_cflags "$SCRATCH_FLAGS"
    641             builder_cxxflags "$SCRATCH_FLAGS"
    642             builder_ldflags "-march=armv7-a -Wl,--fix-cortex-a8"
    643             if [ "$ABI" != "armeabi-v7a-hard" ]; then
    644                 SCRATCH_FLAGS="-mfloat-abi=softfp"
    645                 builder_cflags "$SCRATCH_FLAGS"
    646                 builder_cxxflags "$SCRATCH_FLAGS"
    647             else
    648                 SCRATCH_FLAGS="-mhard-float -D_NDK_MATH_NO_SOFTFP=1"
    649                 builder_cflags "$SCRATCH_FLAGS"
    650                 builder_cxxflags "$SCRATCH_FLAGS"
    651                 builder_ldflags "-Wl,--no-warn-mismatch -lm_hard"
    652             fi
    653             ;;
    654     esac
    655 }
    656 
    657 # $1: Build directory
    658 # $2: Optional Makefile name
    659 builder_begin_host ()
    660 {
    661     prepare_host_build
    662     builder_begin "$1" "$2"
    663     builder_set_prefix "$HOST_TAG "
    664 }
    665