[Buildroot] [PATCH] gdb: convert to the package infrastructure
Arnout Vandecappelle
arnout at mind.be
Thu Feb 28 08:00:45 UTC 2013
On 26/02/13 23:13, Thomas Petazzoni wrote:
> This commit converts gdb to the package infrastructure, and therefore
> moves it from toolchain/gdb to package/gdb.
>
> The target package is now visible in "Package selection for the
> target" => "Debugging, profiling and benchmark". The main option,
> "gdb", forcefully selects the "gdbserver" sub-option by
> default. Another sub-option, "full debugger" allows to install the
> complete gdb on the target. When this option is enabled, then
> "gdbserver" is no longer forcefully selected. This ensures that at
> least gdbserver or the full debugger gets built/installed, so that the
> package is not a no-op.
>
> The host debugger is still enabled through a configuration option in
> "Toolchain". It is now visible regardless of the toolchain type (it
> used to be hidden for External Toolchains). The configuration options
> relative to the host debugger are now in package/gdb/Config.in.host,
> similar to how we have package/binutils/Config.in.host.
>
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
This looks like a great idea!
Just a couple of generic remarks, and then a few specific ones below.
The generic remarks are probably for follow-up patches.
* It really doesn't make sense to build host-gdb without a gdbserver for
the target. So I would auto-select gdbserver from host-gdb.
* Does it really make sense to keep options for four different gdb
versions? Can't we just remove the user-selectable version completely?
* Do gdb-7.2+ actually work for avr32? If yes, why keep the 6.7.1 around?
> ---
> It would be good to have a few people testing this before committing.
Nah, just let the autobuilders do it :-)
[snip]
> diff --git a/package/gdb/Config.in b/package/gdb/Config.in
> new file mode 100644
> index 0000000..958a64a
> --- /dev/null
> +++ b/package/gdb/Config.in
> @@ -0,0 +1,38 @@
> +config BR2_PACKAGE_GDB
> + bool "gdb"
> + select BR2_PACKAGE_GDB_SERVER if !BR2_PACKAGE_GDB_DEBUGGER
> + help
> + GDB, the GNU Project debugger, allows you to see what is
> + going on `inside' another program while it executes -- or
> + what another program was doing at the moment it crashed.
> +
> + This option allows to build gdbserver and/or the gdb
> + debugger for the target.
> +
> + For embedded development, the most common solution is to
> + build only 'gdbserver' for the target, and use a cross-gdb
> + on the host. See BR2_PACKAGE_HOST_GDB to enable one.
"See BR2_PACKAGE_HOST_GDB in the Toolchain menu to enable one."
It could be useful to add a comment that external toolchains often
provide gdb/gdbserver.
> +
> + http://www.gnu.org/software/gdb/
> +
> +if BR2_PACKAGE_GDB
> +
> +config BR2_PACKAGE_GDB_SERVER
> + bool "gdbserver"
> + help
> + Build the gdbserver stub to run on the target.
> + A full gdb is needed to debug the progam.
> +
> +config BR2_PACKAGE_GDB_DEBUGGER
> + bool "full debugger"
> + select BR2_PACKAGE_NCURSES
> + depends on BR2_USE_WCHAR
> + depends on BR2_TOOLCHAIN_HAS_THREADS
> + depends on !BR2_sh && !BR2_sh64 && !BR2_avr32 && !BR2_microblaze && !BR2_bfin && !BR2_aarch64
> + depends on BR2_TOOLCHAIN_HAS_THREADS_DEBUG_IF_NEEDED
> + select BR2_PTHREAD_DEBUG if (BR2_TOOLCHAIN_BUILDROOT && !BR2_PTHREADS_NONE)
It feels pretty strange to modify a toolchain option from a package
Config.in. Remember, the user may add gdb in a second run and try to do
an incremental build... So I would say: move it to a depends like we
usually do.
> +
> +comment "full gdb on target needs WCHAR and threads support in toolchain"
> + depends on !BR2_USE_WCHAR || !BR2_TOOLCHAIN_HAS_THREADS
> +
> +endif
> diff --git a/package/gdb/Config.in.host b/package/gdb/Config.in.host
> new file mode 100644
> index 0000000..6ee1d26
> --- /dev/null
> +++ b/package/gdb/Config.in.host
> @@ -0,0 +1,56 @@
> +config BR2_PACKAGE_HOST_GDB
> + bool "Build cross gdb for the host"
> + help
> + Build a cross gdb that runs on the host machine and debugs
> + programs running on the target. It requires 'gdbserver'
> + installed on the target, see BR2_PACKAGE_GDB_SERVER to
> + enable it.
As I said, I would just auto-select BR2_PACKAGE_GDB, which will select
BR2_PACKAGE_GDB_SERVER
[snip]
> diff --git a/package/gdb/gdb.mk b/package/gdb/gdb.mk
> new file mode 100644
> index 0000000..c102cc9
> --- /dev/null
> +++ b/package/gdb/gdb.mk
> @@ -0,0 +1,100 @@
> +#############################################################
> +#
> +# gdb
> +#
> +#############################################################
> +
> +GDB_VERSION = $(call qstrip,$(BR2_GDB_VERSION))
> +
> +# When no version is defined, it means that cross-gdb for the host has
> +# not been enabled, and we will only build gdbserver or gdb for the
> +# target. In this case, use the latest available version
> +# automatically.
> +ifeq ($(GDB_VERSION),)
> +ifeq ($(BR2_bfin),y)
> +GDB_VERSION = 6.6a
> +GDB_SITE = $(BR2_GNU_MIRROR)/gdb
Just define this once, either before the condition (and override it for
avr32), or after the condition (and use ?=).
> +else ifeq ($(BR2_avr32),y)
> +GDB_VERSION = 6.7.1-avr32-2.1.5
> +GDB_SITE = ftp://www.at91.com/pub/buildroot/
> +else
> +GDB_VERSION = 7.5.1
> +GDB_SITE = $(BR2_GNU_MIRROR)/gdb
> +endif
> +endif
> +
> +GDB_SOURCE = gdb-$(GDB_VERSION).tar.bz2
> +GDB_LICENSE = GPLv2+ LGPLv2+ GPLv3+ LGPLv3+
> +GDB_LICENSE_FILES = COPYING COPYING.LIB COPYING3 COPYING3.LIB
> +
> +# We only want gdbserver and not the entire debugger.
> +ifeq ($(BR2_PACKAGE_GDB_DEBUGGER),)
> +GDB_SUBDIR = gdb/gdbserver
> +HOST_GDB_SUBDIR = .
> +else
> +GDB_DEPENDENCIES = ncurses
> +endif
> +
> +# For the host variant, we really want to build with XML support,
> +# which is needed to read XML descriptions of target architectures.
> +HOST_GDB_DEPENDENCIES = host-expat
Can we rely on host-nurses being present? It is not checked in
dependencies.sh AFAIK. Admittedly, it is not a dependency of host-gdb
now, but most people have ncurses installed anyway for menuconfig...
[snip]
> +define GDB_REMOVE_UNNEEDED_FILES
> + $(RM) -rf $(TARGET_DIR)/usr/share/gdb
> +endef
Perhaps a comment why this is needed? Or is it just to keep it
consistent with the current behaviour?
Regards,
Arnout
> +
> +GDB_POST_INSTALL_TARGET_HOOKS += GDB_REMOVE_UNNEEDED_FILES
> +
> +# A few notes:
> +# * --target, because we're doing a cross build rather than a real
> +# host build.
> +# * --enable-static because gdb really wants to use libbfd.a
> +# * --disable-shared, otherwise the old 6.7 version specific to AVR32
> +# doesn't build because it wants to link a shared libbfd.so against
> +# non-PIC liberty.a.
> +HOST_GDB_CONF_OPT = \
> + --target=$(GNU_TARGET_NAME) \
> + --enable-static --disable-shared \
> + --without-uiout \
> + --disable-tui \
> + --disable-gdbtk \
> + --without-x \
> + --enable-threads \
> + --disable-werror \
> + --without-included-gettext \
> + --disable-sim
> +
> +$(eval $(autotools-package))
> +$(eval $(host-autotools-package))
[snip]
--
Arnout Vandecappelle arnout at mind be
Senior Embedded Software Architect +32-16-286500
Essensium/Mind http://www.mind.be
G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven
LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
More information about the buildroot
mailing list