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 21NDK_BUILDTOOLS_PATH="$(dirname $0)" 22. "$NDK_BUILDTOOLS_PATH/prebuilt-common.sh" 23. "$NDK_BUILDTOOLS_PATH/common-build-host-funcs.sh" 24 25PROGRAM_PARAMETERS="" 26PROGRAM_DESCRIPTION="\ 27This program is used to rebuild one or more NDK gdb client programs from 28sources. To use it, you will need a working set of toolchain sources, like 29those downloaded with download-toolchain-sources.sh, then pass the 30corresponding directory with the --toolchain-src-dir=<path> option. 31 32By default, the script rebuilds GDB for you host system [$HOST_TAG], 33but you can use --systems=<tag1>,<tag2>,.. to ask binaries that can run on 34several distinct systems. Each <tag> value in the list can be one of the 35following: 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 45For example, here's how to rebuild the ARM toolchains on Linux 46for 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 52TOOLCHAIN_SRC_DIR= 53register_var_option "--toolchain-src-dir=<path>" TOOLCHAIN_SRC_DIR "Select toolchain source directory" 54 55GDB_VERSION="6.6 7.3.x" 56register_var_option "--gdb-version=<version>" GDB_VERSION "Select GDB version(s)." 57 58BUILD_DIR= 59register_var_option "--build-dir=<path>" BUILD_DIR "Build GDB into directory" 60 61PYTHON_VERSION= 62register_var_option "--python-version=<version>" PYTHON_VERSION "Python version." 63 64PYTHON_BUILD_DIR= 65register_var_option "--python-build-dir=<path>" PYTHON_BUILD_DIR "Python build directory." 66 67NDK_DIR=$ANDROID_NDK_ROOT 68register_var_option "--ndk-dir=<path>" NDK_DIR "Select NDK install directory." 69 70PACKAGE_DIR= 71register_var_option "--package-dir=<path>" PACKAGE_DIR "Package prebuilt tarballs into directory." 72 73ARCHS=$DEFAULT_ARCHS 74register_var_option "--arch=<list>" ARCHS "Build GDB client for these CPU architectures." 75 76bh_register_options 77 78register_jobs_option 79 80extract_parameters "$@" 81 82if [ -n "$PARAMETERS" ]; then 83 panic "This script doesn't take parameters, only options. See --help" 84fi 85 86if [ -z "$TOOLCHAIN_SRC_DIR" ]; then 87 panic "Please use --toolchain-src-dir=<path> to select toolchain source directory." 88fi 89 90BH_HOST_SYSTEMS=$(commas_to_spaces $BH_HOST_SYSTEMS) 91 92# Sanity check for all GDB versions 93for 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 98done 99 100if [ -z "$BUILD_DIR" ] ; then 101 BUILD_DIR=/tmp/ndk-$USER/buildgdb 102fi 103 104bh_setup_build_dir $BUILD_DIR 105 106# Sanity check that we have the right compilers for all hosts 107for SYSTEM in $BH_HOST_SYSTEMS; do 108 bh_setup_build_for_host $SYSTEM 109done 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 115gdb_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 123gdb_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. 131gdb_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 136python_build_install_dir () 137{ 138 echo "$PYTHON_BUILD_DIR/install/prebuilt/$(install_dir_from_host_tag $1)" 139} 140 141# $1: host system tag 142build_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 164need_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 172build_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 218need_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 227install_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 275need_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 284package_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 298GDB_VERSION=$(commas_to_spaces $GDB_VERSION) 299ARCHS=$(commas_to_spaces $ARCHS) 300 301# Let's build this 302for 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 309done 310 311if [ "$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 320fi 321