# Options specific to extracting packages

comment "Extracting"

config FORCE_EXTRACT
    bool
    prompt "Force extractions"
    help
      Force extraction of already extracted tarballs.
      
      Useful if you suspect a previous extract did not complete (eg. broken
      tarball), or you added a new set of patches for this component.

config OVERIDE_CONFIG_GUESS_SUB
    bool
    prompt "Override config.{guess,sub}"
    default y
    help
      Override tools' versions of config.guess and config.sub with the ones
      from crosstool-NG. This means that all instances of config.guess and
      config.sub in gcc, binutils, glibc, etc... will be replaced.

      Most of the time, the versions of those scripts found in packages are old
      versions, thus lacking some target definitions. This is the case for
      uClibc-based tuples in old versions of gcc and gdb, for example.

      Also, doing so will guarantee that all components have the same tuples
      definitions for your target, and not diverging ones.

      You can update the ones provided with crosstool-NG by first running:
        ct-ng updatetools
      in the directory where you want to run crosstool-NG prior to the build.

config ONLY_EXTRACT
    bool
    prompt "Stop after extracting tarballs"
    help
      Exit after unpacking and patching tarballs.
      
      Useful to look at the code before doing the build itself.

choice
    prompt "Patches origin"
    bool
    default PATCH_BUNDLED

config PATCH_BUNDLED
    bool
    prompt "Bundled only"
    help
      Only apply patches bundled with crosstool-NG.

config PATCH_LOCAL
    bool
    prompt "Local only"
    select PATCH_USE_LOCAL
    help
      Only apply your local patches.

config PATCH_BUNDLED_LOCAL
    bool
    prompt "Bundled, then local"
    select PATCH_USE_LOCAL
    help
      Apply the patches bundled with crosstool-NG,
      then apply your local patches.

config PATCH_LOCAL_BUNDLED
    bool
    prompt "Local, then bundled"
    select PATCH_USE_LOCAL
    help
      Apply your local patches, then apply the patches
      bundled with crosstool-NG.

config PATCH_BUNDLED_FALLBACK_LOCAL
    bool
    prompt "Bundled only, local if no bundled"
    select PATCH_USE_LOCAL
    select PATCH_SINGLE
    help
      Apply the patches bundled with crosstool-NG;
      if there's no bundled patches, apply your local patches.

config PATCH_LOCAL_FALLBACK_BUNDLED
    bool
    prompt "Local only, bundled if no local"
    select PATCH_USE_LOCAL
    select PATCH_SINGLE
    help
      Only apply your local patches;
      if there's no local patches, apply patches bundled with crosstool-NG.

config PATCH_NONE
    bool
    prompt "None"
    help
      Don't use any patch at all.
      
      Please be careful if you select this. Most components do require
      patches to properly build. It can happen, however, that support for
      your architecture is clean enough that you can build a toolchain
      with no patch. But most probably, this is *not* the case.
      
      Be safe, use (the bundeld) patches.

endchoice

config PATCH_ORDER
    string
    default "bundled"           if PATCH_BUNDLED
    default "local"             if PATCH_LOCAL
    default "bundled,local"     if PATCH_BUNDLED_LOCAL || PATCH_BUNDLED_FALLBACK_LOCAL
    default "local,bundled"     if PATCH_LOCAL_BUNDLED || PATCH_LOCAL_FALLBACK_BUNDLED
    default "none"              if PATCH_NONE

config PATCH_SINGLE
    bool

config PATCH_USE_LOCAL
    bool

config LOCAL_PATCH_DIR
    string
    prompt "|  Local patch directory"
    default ""
    depends on PATCH_USE_LOCAL
    help
      Enter the custom patch directory here.
      
      Note that you must ensure that the directory containing your custom
      patches is arranged the same way the official directory is.
