Home | History | Annotate | Download | only in tools
      1 #!/bin/sh
      2 #
      3 # Copyright (C) 2012 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 # Rebuild the host GDB binaries from sources.
     18 #
     19 
     20 # include common function and variable definitions
     21 NDK_BUILDTOOLS_PATH="$(dirname $0)"
     22 . "$NDK_BUILDTOOLS_PATH/prebuilt-common.sh"
     23 . "$NDK_BUILDTOOLS_PATH/common-build-host-funcs.sh"
     24 
     25 PROGRAM_PARAMETERS=""
     26 PROGRAM_DESCRIPTION="\
     27 This program is used to rebuild one or more NDK gdb client programs from
     28 sources. To use it, you will need a working set of toolchain sources, like
     29 those downloaded with download-toolchain-sources.sh, then pass the
     30 corresponding directory with the --toolchain-src-dir=<path> option.
     31 
     32 By default, the script rebuilds GDB for you host system [$HOST_TAG],
     33 but you can use --systems=<tag1>,<tag2>,.. to ask binaries that can run on
     34 several distinct systems. Each <tag> value in the list can be one of the
     35 following:
     36 
     37    linux-x86
     38    linux-x86_64
     39    windows
     40    windows-x86  (equivalent to 'windows')
     41    windows-x86_64
     42    darwin-x86
     43    darwin-x86_64
     44 
     45 For example, here's how to rebuild the ARM toolchains on Linux
     46 for four different systems:
     47 
     48   $PROGNAME --toolchain-src-dir=/path/to/toolchain/src \
     49     --systems=linux-x86,linux-x86_64,windows,windows-x86_64 \
     50     --arch=arm"
     51 
     52 TOOLCHAIN_SRC_DIR=
     53 register_var_option "--toolchain-src-dir=<path>" TOOLCHAIN_SRC_DIR "Select toolchain source directory"
     54 
     55 GDB_VERSION="6.6 7.3.x"
     56 register_var_option "--gdb-version=<version>" GDB_VERSION "Select GDB version(s)."
     57 
     58 BUILD_DIR=
     59 register_var_option "--build-dir=<path>" BUILD_DIR "Build GDB into directory"
     60 
     61 PYTHON_VERSION=
     62 register_var_option "--python-version=<version>" PYTHON_VERSION "Python version."
     63 
     64 PYTHON_BUILD_DIR=
     65 register_var_option "--python-build-dir=<path>" PYTHON_BUILD_DIR "Python build directory."
     66 
     67 NDK_DIR=$ANDROID_NDK_ROOT
     68 register_var_option "--ndk-dir=<path>" NDK_DIR "Select NDK install directory."
     69 
     70 PACKAGE_DIR=
     71 register_var_option "--package-dir=<path>" PACKAGE_DIR "Package prebuilt tarballs into directory."
     72 
     73 ARCHS=$DEFAULT_ARCHS
     74 register_var_option "--arch=<list>" ARCHS "Build GDB client for these CPU architectures."
     75 
     76 bh_register_options
     77 
     78 register_jobs_option
     79 
     80 extract_parameters "$@"
     81 
     82 if [ -n "$PARAMETERS" ]; then
     83     panic "This script doesn't take parameters, only options. See --help"
     84 fi
     85 
     86 if [ -z "$TOOLCHAIN_SRC_DIR" ]; then
     87     panic "Please use --toolchain-src-dir=<path> to select toolchain source directory."
     88 fi
     89 
     90 BH_HOST_SYSTEMS=$(commas_to_spaces $BH_HOST_SYSTEMS)
     91 
     92 # Sanity check for all GDB versions
     93 for VERSION in $(commas_to_spaces $GDB_VERSION); do
     94     GDB_SRCDIR=$TOOLCHAIN_SRC_DIR/gdb/gdb-$VERSION
     95     if [ ! -d "$GDB_SRCDIR" ]; then
     96         panic "Missing source directory: $GDB_SRCDIR"
     97     fi
     98 done
     99 
    100 if [ -z "$BUILD_DIR" ] ; then
    101     BUILD_DIR=/tmp/ndk-$USER/buildgdb
    102 fi
    103 
    104 bh_setup_build_dir $BUILD_DIR
    105 
    106 # Sanity check that we have the right compilers for all hosts
    107 for SYSTEM in $BH_HOST_SYSTEMS; do
    108     bh_setup_build_for_host $SYSTEM
    109 done
    110 
    111 # Return the build install directory of a given GDB version
    112 # $1: host system tag
    113 # $2: target system tag
    114 # $3: gdb version
    115 gdb_build_install_dir ()
    116 {
    117     echo "$BH_BUILD_DIR/install/$1/gdb-$(get_toolchain_name_for_arch $(bh_tag_to_arch $2))-$3"
    118 }
    119 
    120 # $1: host system tag
    121 # $2: target system tag
    122 # $3: gdb version
    123 gdb_ndk_package_name ()
    124 {
    125     echo "gdb-$(get_toolchain_name_for_arch $(bh_tag_to_arch $2))-$3-$1"
    126 }
    127 
    128 
    129 # Same as gdb_build_install_dir, but for the final NDK installation
    130 # directory. Relative to $NDK_DIR.
    131 gdb_ndk_install_dir ()
    132 {
    133     echo "toolchains/gdb-$(get_toolchain_name_for_arch $(bh_tag_to_arch $2))-$3/prebuilt/$(install_dir_from_host_tag $1)"
    134 }
    135 
    136 python_build_install_dir ()
    137 {
    138     echo "$PYTHON_BUILD_DIR/install/prebuilt/$(install_dir_from_host_tag $1)"
    139 }
    140 
    141 # $1: host system tag
    142 build_expat ()
    143 {
    144     local ARGS
    145     local SRCDIR=$TOOLCHAIN_SRC_DIR/expat/expat-2.0.1
    146     local BUILDDIR=$BH_BUILD_DIR/build-expat-2.0.1-$1
    147     local INSTALLDIR=$BH_BUILD_DIR/install-host-$1
    148 
    149     ARGS=" --prefix=$INSTALLDIR"
    150     ARGS=$ARGS" --disable-shared --enable-static"
    151     ARGS=$ARGS" --build=$BH_BUILD_CONFIG"
    152     ARGS=$ARGS" --host=$BH_HOST_CONFIG"
    153 
    154     TEXT="$(bh_host_text) expat:"
    155 
    156     mkdir -p "$BUILDDIR" && rm -rf "$BUILDDIR"/* &&
    157     cd "$BUILDDIR" &&
    158     dump "$TEXT Building"
    159     run2 "$SRCDIR"/configure $ARGS &&
    160     run2 make -j$NUM_JOBS &&
    161     run2 make -j$NUM_JOBS install
    162 }
    163 
    164 need_build_expat ()
    165 {
    166     bh_stamps_do host-expat-$1 build_expat $1
    167 }
    168 
    169 # $1: host system tag
    170 # $2: target tag
    171 # $3: gdb version
    172 build_host_gdb ()
    173 {
    174     local SRCDIR=$TOOLCHAIN_SRC_DIR/gdb/gdb-$3
    175     local BUILDDIR=$BH_BUILD_DIR/build-gdb-$1-$2-$3
    176     local INSTALLDIR=$(gdb_build_install_dir $1 $2 $3)
    177     local ARGS TEXT
    178 
    179     if [ ! -f "$SRCDIR/configure" ]; then
    180         panic "Missing configure script in $SRCDIR"
    181     fi
    182 
    183     bh_set_target_tag $2
    184     bh_setup_host_env
    185 
    186     need_build_expat $1
    187     local EXPATPREFIX=$BH_BUILD_DIR/install-host-$1
    188 
    189     ARGS=" --prefix=$INSTALLDIR"
    190     ARGS=$ARGS" --disable-shared"
    191     ARGS=$ARGS" --build=$BH_BUILD_CONFIG"
    192     ARGS=$ARGS" --host=$BH_HOST_CONFIG"
    193     ARGS=$ARGS" --target=$(bh_tag_to_config_triplet $2)"
    194     ARGS=$ARGS" --disable-werror"
    195     ARGS=$ARGS" --disable-nls"
    196     ARGS=$ARGS" --disable-docs"
    197     ARGS=$ARGS" --with-expat"
    198     ARGS=$ARGS" --with-libexpat-prefix=$EXPATPREFIX"
    199     if [ -n "$PYTHON_VERSION" ]; then
    200         ARGS=$ARGS" --with-python=$(python_build_install_dir $BH_HOST_TAG)/bin/python-config.sh"
    201         if [ $1 = windows-x86 -o $1 = windows-x86_64 ]; then
    202             # This is necessary for the Python integration to build.
    203             CFLAGS=$CFLAGS" -D__USE_MINGW_ANSI_STDIO=1"
    204             CXXFLAGS=$CXXFLAGS" -D__USE_MINGW_ANSI_STDIO=1"
    205         fi
    206     fi
    207     TEXT="$(bh_host_text) gdb-$BH_TARGET_ARCH-$3:"
    208 
    209     mkdir -p "$BUILDDIR" && rm -rf "$BUILDDIR"/* &&
    210     cd "$BUILDDIR" &&
    211     dump "$TEXT Building"
    212     run2 "$SRCDIR"/configure $ARGS &&
    213     run2 make -j$NUM_JOBS &&
    214     run2 make -j$NUM_JOBS install
    215     fail_panic "Failed to configure/make/install gdb"
    216 }
    217 
    218 need_build_host_gdb ()
    219 {
    220     bh_stamps_do host-gdb-$1-$2-$3 build_host_gdb $1 $2 $3
    221 }
    222 
    223 # Install host GDB binaries and support files to the NDK install dir.
    224 # $1: host tag
    225 # $2: target tag
    226 # $3: gdb version
    227 install_host_gdb ()
    228 {
    229     local SRCDIR="$(gdb_build_install_dir $1 $2 $3)"
    230     local DSTDIR="$NDK_DIR/$(gdb_ndk_install_dir $1 $2 $3)"
    231     local PYDIR="$NDK_DIR/$(python_ndk_install_dir $1)"
    232 
    233     need_build_host_gdb $1 $2 $3
    234 
    235     bh_set_target_tag $2
    236 
    237     dump "$(bh_host_text) gdb-$BH_TARGET_ARCH-$3: Installing"
    238     run copy_directory "$SRCDIR/bin" "$DSTDIR/bin"
    239     if [ -d "$SRCDIR/share/gdb" ]; then
    240         run copy_directory "$SRCDIR/share/gdb" "$DSTDIR/share/gdb"
    241     fi
    242 
    243     # build the gdb stub and replace gdb with it. This is done post-install
    244     # so files are in the correct place when determining the relative path.
    245 
    246     case "$1" in
    247         windows*)
    248             dump "$TEXT Building gdb-stub"
    249             bh_setup_host_env
    250             GCC_FOR_STUB=${BH_HOST_CONFIG}-gcc
    251             GCC_FOR_STUB_TARGET=`$GCC_FOR_STUB -dumpmachine`
    252             if [ "$GCC_FOR_STUB_TARGET" = "i586-mingw32msvc" ]; then
    253                 GCC_FOR_STUB=i686-w64-mingw32-gcc
    254                 dump "Override compiler for gdb-stub: $GCC_FOR_STUB"
    255             fi
    256 
    257             # Uses $TOOLCHAIN_PATH/bin/$(bh_tag_to_config_triplet $2)-gdb.exe (1) instead of
    258             # ${DSTDIR}/bin/$(bh_tag_to_config_triplet $2)-gdb.exe (2) because
    259             # the final layout is to (1) which is a folder deeper than (2).
    260             # Sample (1):
    261             #  $NDK/gdb-arm-linux-androideabi-4.8/prebuilt/windows/bin/arm-linux-androideabi-gdb.exe
    262             # Sample (2):
    263             #  $NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/bin/arm-linux-androideabi-gdb.exe
    264             run $NDK_BUILDTOOLS_PATH/build-gdb-stub.sh \
    265                 --gdb-executable-path=${DSTDIR}/bin/$(bh_tag_to_config_triplet $2)-gdb.exe \
    266                 --python-prefix-dir=${PYDIR} \
    267                 --mingw-w64-gcc=${GCC_FOR_STUB}
    268             fail_panic "Failed to build gdb-sutb"
    269             ;;
    270         *)
    271             ;;
    272     esac
    273 }
    274 
    275 need_install_host_gdb ()
    276 {
    277     bh_stamps_do install-host-gdb-$1-$2-$3 install_host_gdb $1 $2 $3
    278 }
    279 
    280 # Package host GDB binaries into a tarball
    281 # $1: host tag
    282 # $2: target tag
    283 # $3: gdb version
    284 package_host_gdb ()
    285 {
    286     local SRCDIR="$(gdb_ndk_install_dir $1 $2 $3)"
    287     local PACKAGENAME=$(gdb_ndk_package_name $1 $2 $3).tar.bz2
    288     local PACKAGE="$PACKAGE_DIR/$PACKAGENAME"
    289 
    290     need_install_host_gdb $1 $2 $3
    291 
    292     bh_set_target_tag $2
    293 
    294     dump "$(bh_host_text) $PACKAGENAME: Packaging"
    295     run pack_archive "$PACKAGE" "$NDK_DIR" "$SRCDIR"
    296 }
    297 
    298 GDB_VERSION=$(commas_to_spaces $GDB_VERSION)
    299 ARCHS=$(commas_to_spaces $ARCHS)
    300 
    301 # Let's build this
    302 for SYSTEM in $BH_HOST_SYSTEMS; do
    303     bh_setup_build_for_host $SYSTEM
    304     for ARCH in $ARCHS; do
    305         for VERSION in $GDB_VERSION; do
    306             need_install_host_gdb $SYSTEM android-$ARCH $VERSION
    307         done
    308     done
    309 done
    310 
    311 if [ "$PACKAGE_DIR" ]; then
    312     for SYSTEM in $BH_HOST_SYSTEMS; do
    313         bh_setup_build_for_host $SYSTEM
    314         for ARCH in $ARCHS; do
    315             for VERSION in $GDB_VERSION; do
    316                 bh_stamps_do package_host_gdb-$SYSTEM-$ARCH-$VERSION package_host_gdb $SYSTEM android-$ARCH $VERSION
    317             done
    318         done
    319     done
    320 fi
    321