• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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