# binutils options

comment "GNU binutils"

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

config BINUTILS_V_2_23_1
    bool
    prompt "2.23.1 (EXPERIMENTAL)"
    depends on EXPERIMENTAL
    select BINUTILS_2_23_or_later

config BINUTILS_V_2_22
    bool
    prompt "2.22"
    select BINUTILS_2_22_or_later

config BINUTILS_V_2_21_53
    bool
    prompt "2.21.53"
    select BINUTILS_2_21_or_later

config BINUTILS_V_2_21_1a
    bool
    prompt "2.21.1a"
    select BINUTILS_2_21_or_later

config BINUTILS_V_2_20_1a
    bool
    prompt "2.20.1a"
    select BINUTILS_2_20_or_later

config BINUTILS_V_2_19_1a
    bool
    prompt "2.19.1a"
    select BINUTILS_2_19_or_later

config BINUTILS_V_2_18a
    bool
    prompt "2.18a"
    select BINUTILS_2_18_or_later

config BINUTILS_CUSTOM
    bool
    prompt "Custom binutils"
    depends on EXPERIMENTAL
    select BINUTILS_2_22_or_later

endchoice

if BINUTILS_CUSTOM

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

endif # BINUTILS_CUSTOM

config BINUTILS_VERSION
    string
# Don't remove next line
# CT_INSERT_VERSION_STRING_BELOW
    default "2.23.1" if BINUTILS_V_2_23_1
    default "2.22" if BINUTILS_V_2_22
    default "2.21.53" if BINUTILS_V_2_21_53
    default "2.21.1a" if BINUTILS_V_2_21_1a
    default "2.20.1a" if BINUTILS_V_2_20_1a
    default "2.19.1a" if BINUTILS_V_2_19_1a
    default "2.18a" if BINUTILS_V_2_18a
    default "custom" if BINUTILS_CUSTOM

config BINUTILS_2_23_or_later
    bool
    select BINUTILS_2_22_or_later
    select BINUTILS_HAS_GOLD
    select BINUTILS_HAS_PLUGINS

config BINUTILS_2_22_or_later
    bool
    select BINUTILS_2_21_or_later
    select BINUTILS_HAS_GOLD
    select BINUTILS_HAS_PLUGINS

config BINUTILS_2_21_or_later
    bool
    select BINUTILS_2_20_or_later
    select BINUTILS_HAS_GOLD
    select BINUTILS_HAS_PLUGINS

config BINUTILS_2_20_or_later
    bool
    select BINUTILS_2_19_or_later

config BINUTILS_2_19_or_later
    bool
    select BINUTILS_2_18_or_later

config BINUTILS_2_18_or_later
    bool
    select BINUTILS_HAS_PKGVERSION_BUGURL
    select BINUTILS_HAS_HASH_STYLE

config BINUTILS_HAS_HASH_STYLE
    bool

config BINUTILS_HAS_GOLD
    bool

# gold only suports the listed architectures
config BINUTILS_GOLD_SUPPORTS_ARCH
    bool
    default y if ARCH_arm
    default y if ARCH_x86

config BINUTILS_HAS_PLUGINS
    bool

config BINUTILS_HAS_PKGVERSION_BUGURL
    bool

# Force using the BFD linker if needed
# This is the case for some C libraries (eg. glibc and
# eglibc at least) and affected components can select this
config BINUTILS_FORCE_LD_BFD
    bool

choice
    bool
    prompt "Linkers to enable"

config BINUTILS_LINKER_LD
    bool
    prompt "ld"
    help
      The historical, bfd linker.

config BINUTILS_LINKER_GOLD
    bool
    prompt "gold"
    depends on BINUTILS_HAS_GOLD
    depends on BINUTILS_GOLD_SUPPORTS_ARCH
    depends on ! BINUTILS_FORCE_LD_BFD
    select BINUTILS_GOLD_INSTALLED
    help
      gold is a new, optimised, multi-threaded linker with support
      for plugins. Designed to be a drop-in replacement for the
      original linker, ld, it can be much faster, with a 5:1 or
      bigger ratio being not uncommon, YMMV.

config BINUTILS_LINKER_LD_GOLD
    bool
    prompt "ld, gold"
    depends on BINUTILS_HAS_GOLD
    depends on BINUTILS_GOLD_SUPPORTS_ARCH
    select BINUTILS_GOLD_INSTALLED
    select BINUTILS_LINKER_BOTH
    help
      Both the historical ld and the new gold linkers will be
      installed, with ld being the default linker used.
      
      See help for gold, above.

config BINUTILS_LINKER_GOLD_LD
    bool
    prompt "gold, ld"
    depends on BINUTILS_HAS_GOLD
    depends on BINUTILS_GOLD_SUPPORTS_ARCH
    select BINUTILS_GOLD_INSTALLED
    select BINUTILS_LINKER_BOTH
    select BINUTILS_LD_WRAPPER if BINUTILS_FORCE_LD_BFD
    help
      Both the historical ld and the new gold linkers will be
      installed, with gold being the default linker used.
      
      See help for gold, above.

endchoice # Enable linkers

if BINUTILS_LINKER_GOLD
comment "WARNING! gold is not capable of"
comment "|         building glibc/eglibc!"
endif # BINUTILS_LINKER_GOLD

config BINUTILS_GOLD_INSTALLED
    bool

config BINUTILS_GOLD_THREADS
    bool
    prompt "|  Enable threaded gold"
    depends on BINUTILS_GOLD_INSTALLED
    help
      When configured with threads, gold can link in parallel,
      possibly cooperating with a make jobserver.

config BINUTILS_LINKER_BOTH
    bool

config BINUTILS_LINKERS_LIST
    string
    default "ld"        if BINUTILS_LINKER_LD
    default "gold"      if BINUTILS_LINKER_GOLD
    default "ld,gold"   if BINUTILS_LINKER_LD_GOLD
    default "gold,ld"   if BINUTILS_LINKER_GOLD_LD

config BINUTILS_LD_WRAPPER
    bool
    prompt "|  Add ld wrapper"
    depends on BINUTILS_LINKER_BOTH
    help
      Add an ld wrapper that calls to either gold or ld.
      
      By default, the wrapper will call to the default wrapper,
      but if you set the environment variable CTNG_LD_IS, you
      can change which linker will get called:
        CTNG_LD_IS=gold     will unconditionally call the gold linker
        CTNG_LD_IS=bfd      will unconditionally call the old bfd ld linker

config BINUTILS_LINKER_DEFAULT
    string
    default "bfd"   if BINUTILS_LINKER_LD || BINUTILS_LINKER_LD_GOLD
    default "gold"  if BINUTILS_LINKER_GOLD || BINUTILS_LINKER_GOLD_LD

config BINUTILS_PLUGINS
    bool
    prompt "Enable support for plugins"
    depends on BINUTILS_HAS_PLUGINS
    depends on ! STATIC_TOOLCHAIN
    help
      binutils can be extended through the use of plugins.
      Especially, gold can use the lto-plugin, as installed
      by gcc, to handle LTO.

config BINUTILS_EXTRA_CONFIG_ARRAY
    string
    prompt "binutils extra config"
    default ""
    help
      Extra flags passed onto ./configure when configuring
      
      You can enter multiple arguments here, and arguments can contain spaces
      if they are properly quoted (or escaped, but prefer quotes). Eg.:
          --with-foo="1st arg with 4 spaces" --with-bar=2nd-arg-without-space

config BINUTILS_FOR_TARGET
    bool
    prompt "binutils libraries for the target"
    depends on ! BARE_METAL
    depends on ! BACKEND
    help
      Some utilities may need binutils libraries to be available on
      the target, eg. oprofile.

if BINUTILS_FOR_TARGET

config BINUTILS_FOR_TARGET_IBERTY
    bool
    prompt "libiberty"
    default y

config BINUTILS_FOR_TARGET_BFD
    bool
    prompt "libbfd"
    default y

endif # BINUTILS_FOR_TARGET
