#!/bin/sh
#
# Copyright (C) 2012 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Rebuild the host GDB binaries from sources.
#
# include common function and variable definitions
NDK_BUILDTOOLS_PATH="$(dirname $0)"
. "$NDK_BUILDTOOLS_PATH/prebuilt-common.sh"
. "$NDK_BUILDTOOLS_PATH/common-build-host-funcs.sh"
PROGRAM_PARAMETERS=""
PROGRAM_DESCRIPTION="\
This program is used to rebuild one or more NDK gdb client programs from
sources. To use it, you will need a working set of toolchain sources, like
those downloaded with download-toolchain-sources.sh, then pass the
corresponding directory with the --toolchain-src-dir=<path> option.
By default, the script rebuilds GDB for you host system [$HOST_TAG],
but you can use --systems=<tag1>,<tag2>,.. to ask binaries that can run on
several distinct systems. Each <tag> value in the list can be one of the
following:
linux-x86
linux-x86_64
windows
windows-x86 (equivalent to 'windows')
windows-x86_64
darwin-x86
darwin-x86_64
For example, here's how to rebuild the ARM toolchains on Linux
for four different systems:
$PROGNAME --toolchain-src-dir=/path/to/toolchain/src \
--systems=linux-x86,linux-x86_64,windows,windows-x86_64 \
--arch=arm"
TOOLCHAIN_SRC_DIR=
register_var_option "--toolchain-src-dir=<path>" TOOLCHAIN_SRC_DIR "Select toolchain source directory"
GDB_VERSION="6.6 7.3.x"
register_var_option "--gdb-version=<version>" GDB_VERSION "Select GDB version(s)."
BUILD_DIR=
register_var_option "--build-dir=<path>" BUILD_DIR "Build GDB into directory"
PYTHON_VERSION=
register_var_option "--python-version=<version>" PYTHON_VERSION "Python version."
PYTHON_BUILD_DIR=
register_var_option "--python-build-dir=<path>" PYTHON_BUILD_DIR "Python build directory."
NDK_DIR=$ANDROID_NDK_ROOT
register_var_option "--ndk-dir=<path>" NDK_DIR "Select NDK install directory."
PACKAGE_DIR=
register_var_option "--package-dir=<path>" PACKAGE_DIR "Package prebuilt tarballs into directory."
ARCHS=$DEFAULT_ARCHS
register_var_option "--arch=<list>" ARCHS "Build GDB client for these CPU architectures."
bh_register_options
register_jobs_option
extract_parameters "$@"
if [ -n "$PARAMETERS" ]; then
panic "This script doesn't take parameters, only options. See --help"
fi
if [ -z "$TOOLCHAIN_SRC_DIR" ]; then
panic "Please use --toolchain-src-dir=<path> to select toolchain source directory."
fi
BH_HOST_SYSTEMS=$(commas_to_spaces $BH_HOST_SYSTEMS)
# Sanity check for all GDB versions
for VERSION in $(commas_to_spaces $GDB_VERSION); do
GDB_SRCDIR=$TOOLCHAIN_SRC_DIR/gdb/gdb-$VERSION
if [ ! -d "$GDB_SRCDIR" ]; then
panic "Missing source directory: $GDB_SRCDIR"
fi
done
if [ -z "$BUILD_DIR" ] ; then
BUILD_DIR=/tmp/ndk-$USER/buildgdb
fi
bh_setup_build_dir $BUILD_DIR
# Sanity check that we have the right compilers for all hosts
for SYSTEM in $BH_HOST_SYSTEMS; do
bh_setup_build_for_host $SYSTEM
done
# Return the build install directory of a given GDB version
# $1: host system tag
# $2: target system tag
# $3: gdb version
gdb_build_install_dir ()
{
echo "$BH_BUILD_DIR/install/$1/gdb-$(get_toolchain_name_for_arch $(bh_tag_to_arch $2))-$3"
}
# $1: host system tag
# $2: target system tag
# $3: gdb version
gdb_ndk_package_name ()
{
echo "gdb-$(get_toolchain_name_for_arch $(bh_tag_to_arch $2))-$3-$1"
}
# Same as gdb_build_install_dir, but for the final NDK installation
# directory. Relative to $NDK_DIR.
gdb_ndk_install_dir ()
{
echo "toolchains/gdb-$(get_toolchain_name_for_arch $(bh_tag_to_arch $2))-$3/prebuilt/$(install_dir_from_host_tag $1)"
}
python_build_install_dir ()
{
echo "$PYTHON_BUILD_DIR/install/prebuilt/$(install_dir_from_host_tag $1)"
}
# $1: host system tag
build_expat ()
{
local ARGS
local SRCDIR=$TOOLCHAIN_SRC_DIR/expat/expat-2.0.1
local BUILDDIR=$BH_BUILD_DIR/build-expat-2.0.1-$1
local INSTALLDIR=$BH_BUILD_DIR/install-host-$1
ARGS=" --prefix=$INSTALLDIR"
ARGS=$ARGS" --disable-shared --enable-static"
ARGS=$ARGS" --build=$BH_BUILD_CONFIG"
ARGS=$ARGS" --host=$BH_HOST_CONFIG"
TEXT="$(bh_host_text) expat:"
mkdir -p "$BUILDDIR" && rm -rf "$BUILDDIR"/* &&
cd "$BUILDDIR" &&
dump "$TEXT Building"
run2 "$SRCDIR"/configure $ARGS &&
run2 make -j$NUM_JOBS &&
run2 make -j$NUM_JOBS install
}
need_build_expat ()
{
bh_stamps_do host-expat-$1 build_expat $1
}
# $1: host system tag
# $2: target tag
# $3: gdb version
build_host_gdb ()
{
local SRCDIR=$TOOLCHAIN_SRC_DIR/gdb/gdb-$3
local BUILDDIR=$BH_BUILD_DIR/build-gdb-$1-$2-$3
local INSTALLDIR=$(gdb_build_install_dir $1 $2 $3)
local ARGS TEXT
if [ ! -f "$SRCDIR/configure" ]; then
panic "Missing configure script in $SRCDIR"
fi
bh_set_target_tag $2
bh_setup_host_env
need_build_expat $1
local EXPATPREFIX=$BH_BUILD_DIR/install-host-$1
ARGS=" --prefix=$INSTALLDIR"
ARGS=$ARGS" --disable-shared"
ARGS=$ARGS" --build=$BH_BUILD_CONFIG"
ARGS=$ARGS" --host=$BH_HOST_CONFIG"
ARGS=$ARGS" --target=$(bh_tag_to_config_triplet $2)"
ARGS=$ARGS" --disable-werror"
ARGS=$ARGS" --disable-nls"
ARGS=$ARGS" --disable-docs"
ARGS=$ARGS" --with-expat"
ARGS=$ARGS" --with-libexpat-prefix=$EXPATPREFIX"
if [ -n "$PYTHON_VERSION" ]; then
ARGS=$ARGS" --with-python=$(python_build_install_dir $BH_HOST_TAG)/bin/python-config.sh"
if [ $1 = windows-x86 -o $1 = windows-x86_64 ]; then
# This is necessary for the Python integration to build.
CFLAGS=$CFLAGS" -D__USE_MINGW_ANSI_STDIO=1"
CXXFLAGS=$CXXFLAGS" -D__USE_MINGW_ANSI_STDIO=1"
fi
fi
TEXT="$(bh_host_text) gdb-$BH_TARGET_ARCH-$3:"
mkdir -p "$BUILDDIR" && rm -rf "$BUILDDIR"/* &&
cd "$BUILDDIR" &&
dump "$TEXT Building"
run2 "$SRCDIR"/configure $ARGS &&
run2 make -j$NUM_JOBS &&
run2 make -j$NUM_JOBS install
fail_panic "Failed to configure/make/install gdb"
}
need_build_host_gdb ()
{
bh_stamps_do host-gdb-$1-$2-$3 build_host_gdb $1 $2 $3
}
# Install host GDB binaries and support files to the NDK install dir.
# $1: host tag
# $2: target tag
# $3: gdb version
install_host_gdb ()
{
local SRCDIR="$(gdb_build_install_dir $1 $2 $3)"
local DSTDIR="$NDK_DIR/$(gdb_ndk_install_dir $1 $2 $3)"
local PYDIR="$NDK_DIR/$(python_ndk_install_dir $1)"
need_build_host_gdb $1 $2 $3
bh_set_target_tag $2
dump "$(bh_host_text) gdb-$BH_TARGET_ARCH-$3: Installing"
run copy_directory "$SRCDIR/bin" "$DSTDIR/bin"
if [ -d "$SRCDIR/share/gdb" ]; then
run copy_directory "$SRCDIR/share/gdb" "$DSTDIR/share/gdb"
fi
# build the gdb stub and replace gdb with it. This is done post-install
# so files are in the correct place when determining the relative path.
case "$1" in
windows*)
dump "$TEXT Building gdb-stub"
bh_setup_host_env
GCC_FOR_STUB=${BH_HOST_CONFIG}-gcc
GCC_FOR_STUB_TARGET=`$GCC_FOR_STUB -dumpmachine`
if [ "$GCC_FOR_STUB_TARGET" = "i586-mingw32msvc" ]; then
GCC_FOR_STUB=i686-w64-mingw32-gcc
dump "Override compiler for gdb-stub: $GCC_FOR_STUB"
fi
# Uses $TOOLCHAIN_PATH/bin/$(bh_tag_to_config_triplet $2)-gdb.exe (1) instead of
# ${DSTDIR}/bin/$(bh_tag_to_config_triplet $2)-gdb.exe (2) because
# the final layout is to (1) which is a folder deeper than (2).
# Sample (1):
# $NDK/gdb-arm-linux-androideabi-7.6/prebuilt/windows/bin/arm-linux-androideabi-gdb.exe
# Sample (2):
# $NDK/toolchains/arm-linux-androideabi-4.7/prebuilt/windows/bin/arm-linux-androideabi-gdb.exe
run $NDK_BUILDTOOLS_PATH/build-gdb-stub.sh \
--gdb-executable-path=${DSTDIR}/bin/$(bh_tag_to_config_triplet $2)-gdb.exe \
--python-prefix-dir=${PYDIR} \
--mingw-w64-gcc=${GCC_FOR_STUB}
;;
*)
;;
esac
}
need_install_host_gdb ()
{
bh_stamps_do install-host-gdb-$1-$2-$3 install_host_gdb $1 $2 $3
}
# Package host GDB binaries into a tarball
# $1: host tag
# $2: target tag
# $3: gdb version
package_host_gdb ()
{
local SRCDIR="$(gdb_ndk_install_dir $1 $2 $3)"
local PACKAGENAME=$(gdb_ndk_package_name $1 $2 $3).tar.bz2
local PACKAGE="$PACKAGE_DIR/$PACKAGENAME"
need_install_host_gdb $1 $2 $3
bh_set_target_tag $2
dump "$(bh_host_text) $PACKAGENAME: Packaging"
run pack_archive "$PACKAGE" "$NDK_DIR" "$SRCDIR"
}
GDB_VERSION=$(commas_to_spaces $GDB_VERSION)
ARCHS=$(commas_to_spaces $ARCHS)
# Let's build this
for SYSTEM in $BH_HOST_SYSTEMS; do
bh_setup_build_for_host $SYSTEM
for ARCH in $ARCHS; do
for VERSION in $GDB_VERSION; do
need_install_host_gdb $SYSTEM android-$ARCH $VERSION
done
done
done
if [ "$PACKAGE_DIR" ]; then
for SYSTEM in $BH_HOST_SYSTEMS; do
bh_setup_build_for_host $SYSTEM
for ARCH in $ARCHS; do
for VERSION in $GDB_VERSION; do
bh_stamps_do package_host_gdb-$SYSTEM-$ARCH-$VERSION package_host_gdb $SYSTEM android-$ARCH $VERSION
done
done
done
fi