comment "Gdb Options"

config BR2_PACKAGE_GDB
	bool "Build gdb debugger for the Target"
	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
	# The newest versions of gdb require thread debugging in the
	# toolchain. The only cases for which this is not needed is if
	# we use gdb 6.8 (marked deprecated)
	depends on \
		BR2_TOOLCHAIN_HAS_THREADS_DEBUG_IF_NEEDED || \
		BR2_DEPRECATED || \
		BR2_bfin
	help
	    Build the full gdb debugger to run on the target.

comment "Gdb for the target needs WCHAR and threads support in toolchain"
	depends on !BR2_USE_WCHAR || !BR2_TOOLCHAIN_HAS_THREADS

config BR2_PACKAGE_GDB_SERVER
	bool "Build gdb server for the Target"
	depends on !BR2_TOOLCHAIN_EXTERNAL
	help
	    Build the gdbserver stub to run on the target.
	    A full gdb is needed to debug the progam.

config BR2_TOOLCHAIN_EXTERNAL_GDB_SERVER_COPY
	bool "Copy gdb server to the Target"
	depends on BR2_TOOLCHAIN_EXTERNAL
	help
	  Copy the gdbserver provided by the external toolchain to the
	  target.

config BR2_PACKAGE_GDB_HOST
	bool "Build gdb for the Host"
	# cross-gdb is supposed to be part of the external
	# toolchain. And the build currently fails.
	depends on !BR2_TOOLCHAIN_EXTERNAL
	help
	    Build gdb to run on the host to debug programs run on the target.

choice
	prompt "GDB debugger Version"
	default BR2_GDB_VERSION_6_6 if BR2_bfin
	default BR2_GDB_VERSION_6_7_1_AVR32_2_1_5 if BR2_avr32
	default BR2_GDB_VERSION_7_5
	depends on BR2_PACKAGE_GDB || BR2_PACKAGE_GDB_SERVER || BR2_PACKAGE_GDB_HOST
	help
	  Select the version of gdb you wish to use.

	config BR2_GDB_VERSION_6_6
		bool "gdb 6.6"
		depends on BR2_bfin

	config BR2_GDB_VERSION_6_7_1_AVR32_2_1_5
		depends on BR2_avr32
		bool "gdb 6.7.1-avr32-2.1.5"

	config BR2_GDB_VERSION_7_2
		bool "gdb 7.2.x"
		depends on !BR2_bfin
		depends on BR2_DEPRECATED
		depends on BR2_TOOLCHAIN_HAS_THREADS_DEBUG_IF_NEEDED
		select BR2_PTHREAD_DEBUG if (BR2_TOOLCHAIN_BUILDROOT && !BR2_PTHREADS_NONE)

	config BR2_GDB_VERSION_7_3
		bool "gdb 7.3.x"
		depends on !BR2_bfin
		depends on BR2_DEPRECATED
		depends on BR2_TOOLCHAIN_HAS_THREADS_DEBUG_IF_NEEDED
		select BR2_PTHREAD_DEBUG if (BR2_TOOLCHAIN_BUILDROOT && !BR2_PTHREADS_NONE)

	config BR2_GDB_VERSION_7_4
		bool "gdb 7.4.x"
		depends on !BR2_bfin
		depends on BR2_TOOLCHAIN_HAS_THREADS_DEBUG_IF_NEEDED
		select BR2_PTHREAD_DEBUG if (BR2_TOOLCHAIN_BUILDROOT && !BR2_PTHREADS_NONE)

	config BR2_GDB_VERSION_7_5
		bool "gdb 7.5.x"
		depends on !BR2_bfin
		depends on BR2_TOOLCHAIN_HAS_THREADS_DEBUG_IF_NEEDED
		select BR2_PTHREAD_DEBUG if (BR2_TOOLCHAIN_BUILDROOT && !BR2_PTHREADS_NONE)

endchoice

comment "gdb support needs pthread debug support in toolchain"
	depends on !BR2_DEPRECATED && !BR2_bfin && !BR2_TOOLCHAIN_HAS_THREADS_DEBUG_IF_NEEDED

config BR2_GDB_VERSION
	string
	default "6.6a"     if BR2_GDB_VERSION_6_6
	default "6.7.1-avr32-2.1.5" if BR2_GDB_VERSION_6_7_1_AVR32_2_1_5
	default "7.2a"     if BR2_GDB_VERSION_7_2
	default "7.3.1"    if BR2_GDB_VERSION_7_3
	default "7.4.1"    if BR2_GDB_VERSION_7_4
	default "7.5.1"    if BR2_GDB_VERSION_7_5
