scripts/build/debug/300-gdb.sh
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Thu May 17 17:56:27 2012 +0200 (2012-05-17)
changeset 2986 c301df1af7cb
parent 2867 ef6dad58ab1c
child 3035 cb75966698d7
permissions -rw-r--r--
debug/gdb: add option to enable/disable the IPA lib for gdbserver

gdbserver >= 7.2 comes with an optional library to use tracepoints, the
In Process Agent (IPA) library, libinproctrace.so.

Currently, we build gdbserver staticaly, but that breaks the build of
the IPA lib.

Add an option to biuld the IPA lib, but not if statically linking.

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