# GDB menu

## help gdb is the GNU debugger

source "config/debug/gdb.in.cross"
source "config/debug/gdb.in.native"
source "config/debug/gdb.in.gdbserver"

if GDB_CROSS || GDB_NATIVE || GDB_GDBSERVER

comment "gdb version"

config DEBUG_GDB_SHOW_LINARO
    bool
    prompt "Show Linaro versions"
    help
      Linaro is maintaining some advanced/more stable/experimental versions
      of gdb, especially for the ARM architecture.

      Those versions have not been blessed by the gdb community (nor have they
      been cursed either!), but they look to be pretty much stable, and even
      more stable than the upstream versions. YMMV...

      If you do not know what this Linaro stuff is, then simply say 'n' here,
      and rest in peace. OTOH, if you know what you are doing, you will be
      able to use and enjoy :-) the Linaro versions by saying 'y' here.

      Linaro: http://www.linaro.org/

choice
    bool
    prompt "gdb version"
# Don't remove next line
# CT_INSERT_VERSION_BELOW

config GDB_V_linaro_7_6_2013_05
    bool
    prompt "linaro-7.6-2013.05"
    depends on DEBUG_GDB_SHOW_LINARO
    select GDB_7_0_or_later
    select GDB_7_2_or_later

config GDB_V_linaro_7_5_2012_12_1
    bool
    prompt "linaro-7.5-2012.12-1"
    depends on DEBUG_GDB_SHOW_LINARO
    select GDB_7_0_or_later
    select GDB_7_2_or_later

config GDB_V_linaro_7_4_2012_06
    bool
    prompt "linaro-7.4-2012.06"
    depends on DEBUG_GDB_SHOW_LINARO
    select GDB_7_0_or_later
    select GDB_7_2_or_later

config GDB_V_7_4_1
    bool
    prompt "7.4.1"
    select GDB_7_0_or_later
    select GDB_7_2_or_later

config GDB_V_7_4
    bool
    prompt "7.4"
    select GDB_7_0_or_later
    select GDB_7_2_or_later

config GDB_V_linaro_7_3_2011_12
    bool
    prompt "linaro-7.3-2011.12"
    depends on DEBUG_GDB_SHOW_LINARO
    select GDB_7_0_or_later
    select GDB_7_2_or_later

config GDB_V_7_3_1
    bool
    prompt "7.3.1"
    select GDB_7_0_or_later
    select GDB_7_2_or_later

config GDB_V_7_3a
    bool
    prompt "7.3a"
    select GDB_7_0_or_later
    select GDB_7_2_or_later

config GDB_V_linaro_7_2_2011_05_0
    bool
    prompt "linaro-7.2-2011.05-0"
    depends on DEBUG_GDB_SHOW_LINARO
    select GDB_7_0_or_later
    select GDB_7_2_or_later

config GDB_V_7_2a
    bool
    prompt "7.2a"
    select GDB_7_0_or_later
    select GDB_7_2_or_later

config GDB_V_7_1a
    bool
    prompt "7.1a"
    select GDB_7_0_or_later

config GDB_V_7_0_1a
    bool
    prompt "7.0.1a"
    select GDB_7_0_or_later

config GDB_V_7_0a
    bool
    prompt "7.0a"
    select GDB_7_0_or_later

config GDB_V_6_8a
    bool
    prompt "6.8a"

config GDB_CUSTOM
    bool
    prompt "Custom gdb"
    depends on EXPERIMENTAL
    select GDB_7_0_or_later
    select GDB_7_2_or_later

endchoice

config GDB_7_2_or_later
    bool

config GDB_7_0_or_later
    bool
    select GDB_HAS_PKGVERSION_BUGURL
    select GDB_INSTALL_GDBINIT

config GDB_HAS_PKGVERSION_BUGURL
    bool

config GDB_INSTALL_GDBINIT
    bool

config GDB_VERSION
    string
# Don't remove next line
# CT_INSERT_VERSION_STRING_BELOW
    default "linaro-7.6-2013.05" if GDB_V_linaro_7_6_2013_05
    default "linaro-7.5-2012.12-1" if GDB_V_linaro_7_5_2012_12_1
    default "linaro-7.4-2012.06" if GDB_V_linaro_7_4_2012_06
    default "7.4.1" if GDB_V_7_4_1
    default "7.4" if GDB_V_7_4
    default "linaro-7.3-2011.12" if GDB_V_linaro_7_3_2011_12
    default "7.3.1" if GDB_V_7_3_1
    default "7.3a" if GDB_V_7_3a
    default "linaro-7.2-2011.05-0" if GDB_V_linaro_7_2_2011_05_0
    default "7.2a" if GDB_V_7_2a
    default "7.1a" if GDB_V_7_1a
    default "7.0.1a" if GDB_V_7_0_1a
    default "7.0a" if GDB_V_7_0a
    default "6.8a" if GDB_V_6_8a
    default "custom" if GDB_CUSTOM

if GDB_CUSTOM

config GDB_CUSTOM_LOCATION
    string
    prompt "Full path to custom gdb source"
    default ""
    help
      Enter the path to the directory (or tarball) of your source for gdb,
      or leave blank to use default CT_CUSTOM_LOCATION_ROOT_DIR/gdb

endif # GDB_CUSTOM

endif

