scripts/build/debug/300-gdb.sh
author "Benoît THÉBAUDEAU" <benoit.thebaudeau@advansee.com>
Wed Jun 08 15:47:43 2011 +0200 (2011-06-08)
changeset 2508 9e2761e59a75
parent 2503 b5541f296b92
child 2570 2651341cc084
permissions -rw-r--r--
debug/cross-gdb: check host dependencies

Cross-gdb depends on expat and python. If either is missing, cross-gdb will
build successfully, but lacking some features.

Especially, if expat is missing, cross-gdb will be unable to parse the target
description, which may lead to runtime malfunctions and the following GDB
warning:
"Can not parse XML target description; XML support was disabled at compile time"

Hence, expat should be considered mandatory.

On the other hand, the features missing without python are not critical, so
python should not be considered mandatory.

This patch does the following:
- At configure time, warn the user if either expat or python is missing.
- In menuconfig, disable the static build options regarding cross-gdb if no
static version of expat is available, and disable cross-gdb if expat is
missing.

Signed-off-by: "Benoît THÉBAUDEAU" <benoit.thebaudeau@advansee.com>
[yann.morin.1998@anciens.enib.fr: add comment for impossible static cross-gdb]
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
yann@479
     1
# Build script for the gdb debug facility
yann@479
     2
yann@1743
     3
# The version of ncurses to use. Yes, it's hard-coded.
yann@1743
     4
# It's used only internally by crosstool-NG, and is
yann@1743
     5
# not exposed outside, so we don't care about providing
yann@1743
     6
# config options for this.
yann@1743
     7
CT_DEBUG_GDB_NCURSES_VERSION="5.7"
yann@1743
     8
yann@2101
     9
# Ditto for the expat library
yann@2101
    10
CT_DEBUG_GDB_EXPAT_VERSION="2.0.1"
yann@2101
    11
yann@821
    12
do_debug_gdb_parts() {
yann@821
    13
    do_gdb=
yann@821
    14
    do_ncurses=
yann@2101
    15
    do_expat=
yann@821
    16
yann@821
    17
    if [ "${CT_GDB_CROSS}" = y ]; then
yann@1916
    18
        do_gdb=y
yann@821
    19
    fi
yann@821
    20
yann@821
    21
    if [ "${CT_GDB_GDBSERVER}" = "y" ]; then
yann@821
    22
        do_gdb=y
yann@821
    23
    fi
yann@821
    24
yann@821
    25
    if [ "${CT_GDB_NATIVE}" = "y" ]; then
yann@821
    26
        do_gdb=y
linux@2021
    27
        # GDB on Mingw depends on PDcurses, not ncurses
linux@2021
    28
        if [ "${CT_MINGW32}" != "y" ]; then
linux@2021
    29
            do_ncurses=y
linux@2021
    30
        fi
yann@2101
    31
        do_expat=y
yann@821
    32
    fi
yann@821
    33
}
yann@821
    34
yann@479
    35
do_debug_gdb_get() {
yann@2303
    36
    local linaro_version
yann@2303
    37
    local linaro_series
yann@2303
    38
    local linaro_base_url="http://launchpad.net/gdb-linaro"
yann@2303
    39
yann@2303
    40
    # Account for the Linaro versioning
yann@2303
    41
    linaro_version="$( echo "${CT_GDB_VERSION}"      \
yann@2303
    42
                       |sed -r -e 's/^linaro-//;'   \
yann@2303
    43
                     )"
yann@2303
    44
    linaro_series="$( echo "${linaro_version}"      \
yann@2303
    45
                      |sed -r -e 's/-.*//;'         \
yann@2303
    46
                    )"
yann@2303
    47
yann@821
    48
    do_debug_gdb_parts
yann@821
    49
yann@821
    50
    if [ "${do_gdb}" = "y" ]; then
yann@1899
    51
        CT_GetFile "gdb-${CT_GDB_VERSION}"                          \
yann@1899
    52
                   {ftp,http}://ftp.gnu.org/pub/gnu/gdb             \
yann@2303
    53
                   ftp://sources.redhat.com/pub/gdb/{,old-}releases \
yann@2303
    54
                   "${linaro_base_url}/${linaro_series}/${linaro_version}/+download"
yann@821
    55
    fi
yann@821
    56
yann@821
    57
    if [ "${do_ncurses}" = "y" ]; then
yann@1743
    58
        CT_GetFile "ncurses-${CT_DEBUG_GDB_NCURSES_VERSION}" .tar.gz  \
yann@573
    59
                   {ftp,http}://ftp.gnu.org/pub/gnu/ncurses \
yann@573
    60
                   ftp://invisible-island.net/ncurses
yann@573
    61
    fi
yann@2101
    62
yann@2101
    63
    if [ "${do_expat}" = "y" ]; then
yann@2101
    64
        CT_GetFile "expat-${CT_DEBUG_GDB_EXPAT_VERSION}" .tar.gz    \
yann@2101
    65
                   http://mesh.dl.sourceforge.net/sourceforge/expat/expat/${CT_DEBUG_GDB_EXPAT_VERSION}
yann@2101
    66
    fi
yann@479
    67
}
yann@479
    68
yann@479
    69
do_debug_gdb_extract() {
yann@821
    70
    do_debug_gdb_parts
yann@821
    71
yann@821
    72
    if [ "${do_gdb}" = "y" ]; then
yann@1899
    73
        CT_Extract "gdb-${CT_GDB_VERSION}"
yann@1901
    74
        CT_Patch "gdb" "${CT_GDB_VERSION}"
yann@821
    75
    fi
yann@821
    76
yann@821
    77
    if [ "${do_ncurses}" = "y" ]; then
yann@1743
    78
        CT_Extract "ncurses-${CT_DEBUG_GDB_NCURSES_VERSION}"
yann@2326
    79
        CT_DoExecLog ALL chmod -R u+w "${CT_SRC_DIR}/ncurses-${CT_DEBUG_GDB_NCURSES_VERSION}"
yann@1901
    80
        CT_Patch "ncurses" "${CT_DEBUG_GDB_NCURSES_VERSION}"
yann@598
    81
    fi
yann@2101
    82
yann@2101
    83
    if [ "${do_expat}" = "y" ]; then
yann@2101
    84
        CT_Extract "expat-${CT_DEBUG_GDB_EXPAT_VERSION}"
yann@2101
    85
        CT_Patch "expat" "${CT_DEBUG_GDB_EXPAT_VERSION}"
yann@2101
    86
    fi
yann@479
    87
}
yann@479
    88
yann@479
    89
do_debug_gdb_build() {
yann@1481
    90
    local -a extra_config
yann@1481
    91
linux@2021
    92
    do_debug_gdb_parts
linux@2021
    93
yann@1899
    94
    gdb_src_dir="${CT_SRC_DIR}/gdb-${CT_GDB_VERSION}"
yann@479
    95
yann@479
    96
    # Version 6.3 and below behave badly with gdbmi
yann@479
    97
    case "${CT_GDB_VERSION}" in
yann@1481
    98
        6.2*|6.3)   extra_config+=("--disable-gdbmi");;
yann@479
    99
    esac
yann@479
   100
benoit@2490
   101
    if [ "${CT_GDB_HAS_PKGVERSION_BUGURL}" = "y" ]; then
benoit@2503
   102
        extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
benoit@2503
   103
        [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
benoit@2490
   104
    fi
benoit@2490
   105
yann@479
   106
    if [ "${CT_GDB_CROSS}" = "y" ]; then
yann@1481
   107
        local -a cross_extra_config
yann@1481
   108
yann@479
   109
        CT_DoStep INFO "Installing cross-gdb"
yann@479
   110
        CT_DoLog EXTRA "Configuring cross-gdb"
yann@479
   111
yann@479
   112
        mkdir -p "${CT_BUILD_DIR}/build-gdb-cross"
yann@479
   113
        cd "${CT_BUILD_DIR}/build-gdb-cross"
yann@479
   114
yann@1481
   115
        cross_extra_config=("${extra_config[@]}")
yann@583
   116
        case "${CT_THREADS}" in
yann@1481
   117
            none)   cross_extra_config+=("--disable-threads");;
yann@1481
   118
            *)      cross_extra_config+=("--enable-threads");;
yann@583
   119
        esac
yann@583
   120
yann@479
   121
        CC_for_gdb=
yann@479
   122
        LD_for_gdb=
yann@583
   123
        if [ "${CT_GDB_CROSS_STATIC}" = "y" ]; then
yann@479
   124
            CC_for_gdb="gcc -static"
yann@479
   125
            LD_for_gdb="ld -static"
yann@479
   126
        fi
yann@479
   127
yann@821
   128
        gdb_cross_configure="${gdb_src_dir}/configure"
yann@821
   129
yann@1481
   130
        CT_DoLog DEBUG "Extra config passed: '${cross_extra_config[*]}'"
yann@602
   131
yann@2344
   132
        CT_DoExecLog CFG                                \
yann@479
   133
        CC="${CC_for_gdb}"                              \
yann@583
   134
        LD="${LD_for_gdb}"                              \
yann@821
   135
        "${gdb_cross_configure}"                        \
yann@479
   136
            --build=${CT_BUILD}                         \
yann@479
   137
            --host=${CT_HOST}                           \
yann@479
   138
            --target=${CT_TARGET}                       \
yann@479
   139
            --prefix="${CT_PREFIX_DIR}"                 \
yann@479
   140
            --with-build-sysroot="${CT_SYSROOT_DIR}"    \
benoit@2476
   141
            --with-sysroot="${CT_SYSROOT_DIR}"          \
benoit@2508
   142
            --with-expat=yes                            \
yann@801
   143
            --disable-werror                            \
yann@1481
   144
            "${cross_extra_config[@]}"
yann@479
   145
yann@479
   146
        CT_DoLog EXTRA "Building cross-gdb"
yann@2275
   147
        CT_DoExecLog ALL make ${JOBSFLAGS}
yann@479
   148
yann@479
   149
        CT_DoLog EXTRA "Installing cross-gdb"
yann@669
   150
        CT_DoExecLog ALL make install
yann@479
   151
yann@479
   152
        CT_EndStep
yann@479
   153
    fi
yann@479
   154
yann@479
   155
    if [ "${CT_GDB_NATIVE}" = "y" ]; then
yann@1481
   156
        local -a native_extra_config
yann@1481
   157
        local -a ncurses_opt
yann@2100
   158
        local -a gdb_native_CFLAGS
yann@1481
   159
yann@573
   160
        CT_DoStep INFO "Installing native gdb"
yann@573
   161
yann@2100
   162
        native_extra_config=("${extra_config[@]}")
yann@2100
   163
linux@2021
   164
        # GDB on Mingw depends on PDcurses, not ncurses
linux@2021
   165
        if [ "${do_ncurses}" = "y" ]; then
linux@2021
   166
            CT_DoLog EXTRA "Building static target ncurses"
yann@1281
   167
linux@2021
   168
            [ "${CT_CC_LANG_CXX}" = "y" ] || ncurses_opts+=("--without-cxx" "--without-cxx-binding")
linux@2021
   169
            [ "${CT_CC_LANG_ADA}" = "y" ] || ncurses_opts+=("--without-ada")
yann@1281
   170
linux@2021
   171
            mkdir -p "${CT_BUILD_DIR}/build-ncurses-build-tic"
linux@2021
   172
            cd "${CT_BUILD_DIR}/build-ncurses-build-tic"
yann@1264
   173
linux@2021
   174
            # Use build = CT_REAL_BUILD so that configure thinks it is
linux@2021
   175
            # cross-compiling, and thus will use the ${CT_BUILD}-*
linux@2021
   176
            # tools instead of searching for the native ones...
anthony@2154
   177
            CT_DoExecLog CFG                                                    \
linux@2021
   178
            "${CT_SRC_DIR}/ncurses-${CT_DEBUG_GDB_NCURSES_VERSION}/configure"   \
linux@2021
   179
                --build=${CT_BUILD}                                             \
linux@2021
   180
                --host=${CT_BUILD}                                              \
linux@2021
   181
                --prefix=/usr                                                   \
linux@2021
   182
                --without-shared                                                \
linux@2021
   183
                --enable-symlinks                                               \
linux@2021
   184
                --with-build-cc=${CT_REAL_BUILD}-gcc                            \
linux@2021
   185
                --with-build-cpp=${CT_REAL_BUILD}-gcc                           \
linux@2021
   186
                --with-build-cflags="${CT_CFLAGS_FOR_HOST}"                     \
linux@2021
   187
                "${ncurses_opts[@]}"
yann@1264
   188
linux@2021
   189
            # Under some operating systems (eg. Winblows), there is an
linux@2021
   190
            # extension appended to executables. Find that.
linux@2021
   191
            tic_ext=$(grep -E '^x[[:space:]]*=' progs/Makefile |sed -r -e 's/^.*=[[:space:]]*//;')
yann@1267
   192
yann@2275
   193
            CT_DoExecLog ALL make ${JOBSFLAGS} -C include
yann@2275
   194
            CT_DoExecLog ALL make ${JOBSFLAGS} -C progs "tic${tic_ext}"
yann@1264
   195
linux@2021
   196
            CT_DoExecLog ALL install -d -m 0755 "${CT_PREFIX_DIR}/buildtools"
linux@2021
   197
            CT_DoExecLog ALL install -m 0755 "progs/tic${tic_ext}" "${CT_PREFIX_DIR}/buildtools"
yann@1264
   198
linux@2021
   199
            mkdir -p "${CT_BUILD_DIR}/build-ncurses"
linux@2021
   200
            cd "${CT_BUILD_DIR}/build-ncurses"
yann@573
   201
anthony@2154
   202
            CT_DoExecLog CFG                                                    \
linux@2021
   203
            "${CT_SRC_DIR}/ncurses-${CT_DEBUG_GDB_NCURSES_VERSION}/configure"   \
linux@2021
   204
                --build=${CT_BUILD}                                             \
linux@2021
   205
                --host=${CT_TARGET}                                             \
linux@2021
   206
                --with-build-cc=${CT_BUILD}-gcc                                 \
linux@2021
   207
                --with-build-cpp=${CT_BUILD}-gcc                                \
linux@2021
   208
                --with-build-cflags="${CT_CFLAGS_FOR_HOST}"                     \
yann@2100
   209
                --prefix="${CT_BUILD_DIR}/static-target"                        \
linux@2021
   210
                --without-shared                                                \
linux@2021
   211
                --without-sysmouse                                              \
linux@2021
   212
                --without-progs                                                 \
linux@2021
   213
                --enable-termcap                                                \
linux@2021
   214
                "${ncurses_opts[@]}"
yann@573
   215
yann@2275
   216
            CT_DoExecLog ALL make ${JOBSFLAGS}
yann@573
   217
linux@2021
   218
            CT_DoExecLog ALL make install
yann@573
   219
linux@2021
   220
            # We no longer need the temporary tic. Remove it
yann@2022
   221
            CT_DoExecLog DEBUG rm -fv "${CT_PREFIX_DIR}/buildtools/tic${tic_ext}"
yann@2100
   222
yann@2100
   223
            native_extra_config+=("--with-curses")
yann@2100
   224
            # There's no better way to tell gdb where to find -lcurses... :-(
yann@2100
   225
            gdb_native_CFLAGS+=("-I${CT_BUILD_DIR}/static-target/include")
yann@2100
   226
            gdb_native_CFLAGS+=("-L${CT_BUILD_DIR}/static-target/lib")
linux@2021
   227
        fi # do_ncurses
yann@1281
   228
yann@2101
   229
        if [ "${do_expat}" = "y" ]; then
yann@2101
   230
            CT_DoLog EXTRA "Building static target expat"
yann@2101
   231
yann@2101
   232
            mkdir -p "${CT_BUILD_DIR}/expat-build"
yann@2101
   233
            cd "${CT_BUILD_DIR}/expat-build"
yann@2101
   234
anthony@2154
   235
            CT_DoExecLog CFG                                                \
yann@2101
   236
            "${CT_SRC_DIR}/expat-${CT_DEBUG_GDB_EXPAT_VERSION}/configure"   \
yann@2101
   237
                --build=${CT_BUILD}                                         \
yann@2101
   238
                --host=${CT_TARGET}                                         \
yann@2101
   239
                --prefix="${CT_BUILD_DIR}/static-target"                    \
yann@2101
   240
                --enable-static                                             \
yann@2101
   241
                --disable-shared
yann@2101
   242
yann@2275
   243
            CT_DoExecLog ALL make ${JOBSFLAGS}
yann@2101
   244
            CT_DoExecLog ALL make install
yann@2101
   245
yann@2101
   246
            native_extra_config+=("--with-expat")
yann@2101
   247
            native_extra_config+=("--with-libexpat-prefix=${CT_BUILD_DIR}/static-target")
yann@2101
   248
        fi # do_expat
yann@2101
   249
yann@479
   250
        CT_DoLog EXTRA "Configuring native gdb"
yann@479
   251
yann@479
   252
        mkdir -p "${CT_BUILD_DIR}/build-gdb-native"
yann@479
   253
        cd "${CT_BUILD_DIR}/build-gdb-native"
yann@479
   254
yann@583
   255
        case "${CT_THREADS}" in
yann@1481
   256
            none)   native_extra_config+=("--disable-threads");;
yann@1481
   257
            *)      native_extra_config+=("--enable-threads");;
yann@583
   258
        esac
yann@583
   259
yann@583
   260
        if [ "${CT_GDB_NATIVE_STATIC}" = "y" ]; then
yann@583
   261
            CC_for_gdb="${CT_TARGET}-gcc -static"
yann@583
   262
            LD_for_gdb="${CT_TARGET}-ld -static"
yann@626
   263
        else
yann@626
   264
            CC_for_gdb="${CT_TARGET}-gcc"
yann@626
   265
            LD_for_gdb="${CT_TARGET}-ld"
yann@583
   266
        fi
yann@583
   267
yann@583
   268
        export ac_cv_func_strncmp_works=yes
yann@583
   269
yann@1481
   270
        CT_DoLog DEBUG "Extra config passed: '${native_extra_config[*]}'"
yann@602
   271
yann@2344
   272
        CT_DoExecLog CFG                                \
yann@583
   273
        CC="${CC_for_gdb}"                              \
yann@583
   274
        LD="${LD_for_gdb}"                              \
yann@2344
   275
        CFLAGS="${gdb_native_CFLAGS[*]}"                \
yann@479
   276
        "${gdb_src_dir}/configure"                      \
yann@479
   277
            --build=${CT_BUILD}                         \
yann@479
   278
            --host=${CT_TARGET}                         \
yann@479
   279
            --target=${CT_TARGET}                       \
yann@479
   280
            --prefix=/usr                               \
yann@479
   281
            --with-build-sysroot="${CT_SYSROOT_DIR}"    \
yann@479
   282
            --without-uiout                             \
yann@479
   283
            --disable-tui                               \
yann@479
   284
            --disable-gdbtk                             \
yann@479
   285
            --without-x                                 \
yann@479
   286
            --disable-sim                               \
yann@583
   287
            --disable-werror                            \
yann@479
   288
            --without-included-gettext                  \
yann@583
   289
            --without-develop                           \
yann@1481
   290
            "${native_extra_config[@]}"
yann@479
   291
yann@479
   292
        CT_DoLog EXTRA "Building native gdb"
yann@2275
   293
        CT_DoExecLog ALL make ${JOBSFLAGS} CC=${CT_TARGET}-${CT_CC}
yann@479
   294
yann@479
   295
        CT_DoLog EXTRA "Installing native gdb"
yann@1219
   296
        CT_DoExecLog ALL make DESTDIR="${CT_DEBUGROOT_DIR}" install
yann@479
   297
yann@583
   298
        # Building a native gdb also builds a gdbserver
yann@1219
   299
        find "${CT_DEBUGROOT_DIR}" -type f -name gdbserver -exec rm -fv {} \; 2>&1 |CT_DoLog ALL
yann@583
   300
yann@583
   301
        unset ac_cv_func_strncmp_works
yann@583
   302
linux@2021
   303
        # GDB on Mingw depends on PDcurses, not ncurses
linux@2021
   304
        if [ "${CT_MINGW32}" != "y" ]; then
linux@2021
   305
            CT_DoLog EXTRA "Cleaning up ncurses"
linux@2021
   306
            cd "${CT_BUILD_DIR}/build-ncurses"
linux@2021
   307
            CT_DoExecLog ALL make DESTDIR="${CT_SYSROOT_DIR}" uninstall
yann@1555
   308
linux@2021
   309
            CT_DoExecLog DEBUG rm -rf "${CT_BUILD_DIR}/ncurses"
linux@2021
   310
        fi
yann@1733
   311
yann@1281
   312
        CT_EndStep # native gdb build
yann@583
   313
    fi
yann@583
   314
yann@583
   315
    if [ "${CT_GDB_GDBSERVER}" = "y" ]; then
yann@1481
   316
        local -a gdbserver_extra_config
yann@1481
   317
yann@583
   318
        CT_DoStep INFO "Installing gdbserver"
yann@583
   319
        CT_DoLog EXTRA "Configuring gdbserver"
yann@583
   320
yann@583
   321
        mkdir -p "${CT_BUILD_DIR}/build-gdb-gdbserver"
yann@583
   322
        cd "${CT_BUILD_DIR}/build-gdb-gdbserver"
yann@583
   323
yann@583
   324
        # Workaround for bad versions, where the configure
yann@583
   325
        # script for gdbserver is not executable...
yann@583
   326
        # Bah, GNU folks strike again... :-(
yann@583
   327
        chmod +x "${gdb_src_dir}/gdb/gdbserver/configure"
yann@583
   328
yann@583
   329
        gdbserver_LDFLAGS=
yann@583
   330
        if [ "${CT_GDB_GDBSERVER_STATIC}" = "y" ]; then
yann@583
   331
            gdbserver_LDFLAGS=-static
yann@583
   332
        fi
yann@583
   333
yann@1481
   334
        gdbserver_extra_config=("${extra_config[@]}")
yann@602
   335
yann@2344
   336
        CT_DoExecLog CFG                                \
yann@583
   337
        LDFLAGS="${gdbserver_LDFLAGS}"                  \
yann@583
   338
        "${gdb_src_dir}/gdb/gdbserver/configure"        \
yann@583
   339
            --build=${CT_BUILD}                         \
yann@583
   340
            --host=${CT_TARGET}                         \
yann@583
   341
            --target=${CT_TARGET}                       \
yann@583
   342
            --prefix=/usr                               \
yann@583
   343
            --sysconfdir=/etc                           \
yann@583
   344
            --localstatedir=/var                        \
yann@583
   345
            --includedir="${CT_HEADERS_DIR}"            \
yann@583
   346
            --with-build-sysroot="${CT_SYSROOT_DIR}"    \
yann@583
   347
            --program-prefix=                           \
yann@583
   348
            --without-uiout                             \
yann@583
   349
            --disable-tui                               \
yann@583
   350
            --disable-gdbtk                             \
yann@583
   351
            --without-x                                 \
yann@583
   352
            --without-included-gettext                  \
yann@583
   353
            --without-develop                           \
yann@801
   354
            --disable-werror                            \
yann@1481
   355
            "${gdbserver_extra_config[@]}"
yann@583
   356
yann@583
   357
        CT_DoLog EXTRA "Building gdbserver"
yann@2275
   358
        CT_DoExecLog ALL make ${JOBSFLAGS} CC=${CT_TARGET}-${CT_CC}
yann@583
   359
yann@583
   360
        CT_DoLog EXTRA "Installing gdbserver"
yann@1219
   361
        CT_DoExecLog ALL make DESTDIR="${CT_DEBUGROOT_DIR}" install
yann@583
   362
yann@479
   363
        CT_EndStep
yann@479
   364
    fi
yann@479
   365
}