| #!/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 "gdb-$(get_toolchain_name_for_arch $(bh_tag_to_arch $2))-$3/prebuilt/$1" |
| } |
| |
| python_build_install_dir () |
| { |
| echo "$PYTHON_BUILD_DIR/install/prebuilt/$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 [ "$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 |
| } |
| |
| 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)" |
| |
| 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 |
| } |
| |
| 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 |