#!/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/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. By default, the script rebuilds GDB for your host system [$HOST_TAG], but you can use --systems=,,.. to ask binaries that can run on several distinct systems. Each 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=" TOOLCHAIN_SRC_DIR "Select toolchain source directory" GDB_VERSION=$DEFAULT_GDB_VERSION register_var_option "--gdb-version=" GDB_VERSION "Select GDB version(s)." BUILD_DIR= register_var_option "--build-dir=" BUILD_DIR "Build GDB into directory" PYTHON_VERSION=$DEFAULT_PYTHON_VERSION register_var_option "--python-version=" PYTHON_VERSION "Python version." PYTHON_BUILD_DIR= register_var_option "--python-build-dir=" PYTHON_BUILD_DIR "Python build directory." NDK_DIR=$ANDROID_NDK_ROOT register_var_option "--ndk-dir=" NDK_DIR "Select NDK install directory." PACKAGE_DIR= register_var_option "--package-dir=" PACKAGE_DIR "Package prebuilt tarballs into directory." ARCHS=$DEFAULT_ARCHS register_var_option "--arch=" 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= 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 panic "--build-dir is required" fi if [ -z "$PYTHON_BUILD_DIR" ] ; then panic "--python-build-dir is required" fi INSTALL_DIR=$BUILD_DIR/install BUILD_DIR=$BUILD_DIR/build 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: gdb version gdb_build_install_dir () { echo "$BH_BUILD_DIR/install/$1/gdb-multiarch-$2" } # $1: host system tag # $2: gdb version gdb_ndk_package_name () { echo "gdb-multiarch-$2-$1" } # Same as gdb_build_install_dir, but for the final NDK installation # directory. Relative to $NDK_DIR. # $1: gdb version gdb_ndk_install_dir () { echo "host-tools/" } python_build_install_dir () { echo "$PYTHON_BUILD_DIR/$1/install/host-tools/" } # $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" run "$SRCDIR"/configure $ARGS && run make -j$NUM_JOBS && run make -j$NUM_JOBS install } # $1: host system tag build_lzma () { local ARGS local SRCDIR=$TOOLCHAIN_SRC_DIR/xz local BUILDDIR=$BH_BUILD_DIR/build-xz-$1 local INSTALLDIR=$BH_BUILD_DIR/install-host-$1 ARGS=" --prefix=$INSTALLDIR" ARGS=$ARGS" --disable-shared --enable-static" ARGS=$ARGS" --disable-xz --disable-xzdec --disable-lzmadec --disable-scripts --disable-doc" ARGS=$ARGS" --build=$BH_BUILD_CONFIG" ARGS=$ARGS" --host=$BH_HOST_CONFIG" TEXT="$(bh_host_text) lzma:" mkdir -p "$BUILDDIR" && rm -rf "$BUILDDIR"/* && cd "$BUILDDIR" && dump "$TEXT Building" # HACK: git doesn't keep track of file modification date, so autoconf will sometimes (usually?) # want to regenerate itself. Trick it into not doing so by touching all of the source files. case "$BH_BUILD_CONFIG" in *darwin*) # Darwin's touch sucks. run find $SRCDIR -exec touch -t 197001010000 {} + ;; *) run find $SRCDIR -exec touch -d "`date`" {} + ;; esac run "$SRCDIR"/configure $ARGS && run make -j$NUM_JOBS && run make -j$NUM_JOBS install } # $1: host system tag # $2: gdb version # ${@:3}: target tags build_host_gdb () { local SRCDIR=$TOOLCHAIN_SRC_DIR/gdb/gdb-$2 local BUILDDIR=$BH_BUILD_DIR/build-gdb-$1-multiarch-$2 local INSTALLDIR=$(gdb_build_install_dir $1 $2) local ARGS TEXT if [ ! -f "$SRCDIR/configure" ]; then panic "Missing configure script in $SRCDIR" fi bh_setup_host_env local TARGETS="$(bh_tag_to_config_triplet $1)" for ARCH in ${@:3}; do TARGETS="$TARGETS,$(bh_tag_to_config_triplet android-$ARCH)" done build_expat $1 local EXPATPREFIX=$BH_BUILD_DIR/install-host-$1 ARGS=" --prefix=$INSTALLDIR" ARGS=$ARGS" --disable-shared" case "$BH_BUILD_CONFIG" in # For some reason, multiarch + darwin doesn't build a gdb binary when # --build or --host are specified. *darwin*) ;; *) ARGS=$ARGS" --build=$BH_BUILD_CONFIG" ARGS=$ARGS" --host=$BH_HOST_CONFIG" ;; esac case "$1" in *windows) # The liblzma build fails when targeting windows32, for some reason. ;; *) build_lzma $1 local LZMAPREFIX=$BH_BUILD_DIR/install-host-$1 ARGS=$ARGS" --with-lzma" ARGS=$ARGS" --with-liblzma-prefix=$LZMAPREFIX" ;; esac ARGS=$ARGS" --enable-targets=$TARGETS" ARGS=$ARGS" --disable-werror" ARGS=$ARGS" --disable-nls" ARGS=$ARGS" --disable-docs" ARGS=$ARGS" --with-expat" ARGS=$ARGS" --with-libexpat-prefix=$EXPATPREFIX" ARGS=$ARGS" --without-mpc" ARGS=$ARGS" --without-mpfr" ARGS=$ARGS" --without-gmp" ARGS=$ARGS" --without-cloog" ARGS=$ARGS" --without-isl" ARGS=$ARGS" --disable-sim" ARGS=$ARGS" --enable-gdbserver=no" if [ -n "$PYTHON_VERSION" ]; then ARGS=$ARGS" --with-python=$(python_build_install_dir $1)/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-multiarch-$2:" mkdir -p "$BUILDDIR" && rm -rf "$BUILDDIR"/* && cd "$BUILDDIR" && dump "$TEXT Building" run "$SRCDIR"/configure $ARGS && run make -j$NUM_JOBS && run make -j$NUM_JOBS install fail_panic "Failed to configure/make/install gdb" } # Install host GDB binaries and support files to the NDK install dir. # $1: host tag # $2: gdb version # ${@:3}: target tags install_host_gdb () { local SRCDIR="$(gdb_build_install_dir $1 $2)" local DSTDIR="$INSTALL_DIR/$(gdb_ndk_install_dir $1)" local PYDIR="$INSTALL_DIR/$(python_ndk_install_dir $1)" build_host_gdb $@ dump "$(bh_host_text) gdb-multiarch-$2: 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. dump "$(bh_host_text) Generating gdb-stub..." case "$1" in windows*) 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 run $NDK_BUILDTOOLS_PATH/build-gdb-stub.sh \ --gdb-executable-path=${DSTDIR}/bin/gdb.exe \ --python-prefix-dir=${PYDIR} \ --mingw-w64-gcc=${GCC_FOR_STUB} fail_panic "Failed to build gdb-stub" ;; *) # Generate a script which sets PYTHONHOME GDB_PATH=${DSTDIR}/bin/gdb mv "$GDB_PATH" "$GDB_PATH"-orig cat > "$GDB_PATH" << EOF #!/bin/bash GDBDIR=\$(cd \$(dirname \$0) && pwd) PYTHONHOME="\$GDBDIR/.." "\$GDBDIR/gdb-orig" "\$@" EOF chmod 755 $GDB_PATH ;; esac dump "$(bh_host_text) Done generating gdb-stub." } # Package host GDB binaries into a tarball # $1: host tag # $2: gdb version # ${@:3}: target tags package_host_gdb () { local SRCDIR="$(gdb_ndk_install_dir $1)" local PACKAGENAME=$(gdb_ndk_package_name $1 $2).tar.bz2 local PACKAGE="$PACKAGE_DIR/$PACKAGENAME" dump "$(bh_host_text) $PACKAGENAME: Packaging" run pack_archive "$PACKAGE" "$INSTALL_DIR" "$SRCDIR" fail_panic "Failed to package GDB!" } 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 VERSION in $GDB_VERSION; do install_host_gdb $SYSTEM $VERSION $ARCHS done done if [ "$PACKAGE_DIR" ]; then for SYSTEM in $BH_HOST_SYSTEMS; do bh_setup_build_for_host $SYSTEM for VERSION in $GDB_VERSION; do bh_do package_host_gdb $SYSTEM $VERSION $ARCHS done done fi