# binutils options

comment "GNU binutils"

# gold only suports the listed architectures
config BINUTILS_GOLD_SUPPORTS_ARCH
    bool
    default y if ARCH_ARM
    default y if ARCH_X86

config BINUTILS_GOLD_SUPPORT
    bool
    default y
    depends on BINUTILS_GOLD_SUPPORTS_ARCH
    depends on ! STATIC_TOOLCHAIN

# Force using the BFD linker if needed. There are two options:
# - For some C libraries (eg. glibc at least), BFD ld must be
#   built and be selected by default.
# - For elf2flt, BFD ld must be the only linker built.
config BINUTILS_FORCE_LD_BFD_DEFAULT
    bool

config BINUTILS_FORCE_LD_BFD_ONLY
    bool

# Binutils 2.39 requires bison 3.0.4 or later for gprofng on x86/aarch64
config BINUTILS_DEP_BISON
    def_bool y
    depends on BINUTILS_2_39_or_later && !CONFIGURE_has_bison_3_0_4_or_newer && (ARCH_X86 || (ARCH_ARM && ARCH_64))
    select COMP_TOOLS_BISON

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_GOLD_SUPPORT
    depends on !BINUTILS_FORCE_LD_BFD_DEFAULT && !BINUTILS_FORCE_LD_BFD_ONLY
    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_FORCE_LD_BFD_ONLY
    depends on BINUTILS_GOLD_SUPPORT
    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_FORCE_LD_BFD_DEFAULT && !BINUTILS_FORCE_LD_BFD_ONLY
    depends on BINUTILS_GOLD_SUPPORT
    select BINUTILS_GOLD_INSTALLED
    select BINUTILS_LINKER_BOTH
    select BINUTILS_LD_WRAPPER if BINUTILS_FORCE_LD_BFD_DEFAULT
    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!"
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"
    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_RELRO
    tristate
    prompt "Enable -z relro in ELF linker by default" if BINUTILS_2_27_or_later
    default m
    help
      Setting this option forces "-z relro" by default in the ELF linker.
      Clearing this option forces "-z norelro" by default in the ELF linker.
      Setting this option to 'M' configures binutils with their internal
      default for the selected architecture.

config BINUTILS_DETERMINISTIC_ARCHIVES
    bool
    prompt "Enable deterministic archives by default"
    default y
    help
      Setting this option will enable deterministic mode by default (-D).
      ar and ranlib will use zero for UIDs, GIDs,
      timestamps, and use consistent file modes for all files.

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
    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

config BINUTILS_FOR_TARGET_OPCODES
    bool
    prompt "libopcodes"
    default y

endif # BINUTILS_FOR_TARGET

if ARCH_BINFMT_FLAT

comment "elf2flt"

config ELF2FLT_REQUIRES
    def_bool y
    select ZLIB_NEEDED
    select BINUTILS_FORCE_LD_BFD_ONLY

source "config/versions/elf2flt.in"

config ELF2FLT_EXTRA_CONFIG_ARRAY
    string
    prompt "elf2flt 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

endif # ARCH_BINFMT_FLAT
