# eglibc options

## depends on ! MINGW32 && ! BARE_METAL && ARCH_USE_MMU
##
## select LIBC_SUPPORT_NPTL
## select LIBC_SUPPORT_LINUXTHREADS
##
## help EGLIBC (Embedded GLIBC) is a variant of the standard GNU GLIBC
## help that is designed to work well on embedded systems.  EGLIBC strives
## help to be source and binary compatible with GLIBC.  Its goals include
## help a reduced footprint, configurable components, and improved
## help cross-compilation support.  EGLIBC also includes some embedded ports
## help (such as e500/spe) that are normally separate add-ons of GLIBC.

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

config LIBC_EGLIBC_V_2_14
    bool
    prompt "2_14"
    depends on EXPERIMENTAL
    select LIBC_EGLIBC_2_14_or_later

config LIBC_EGLIBC_V_2_13
    bool
    prompt "2_13"
    depends on EXPERIMENTAL
    select LIBC_EGLIBC_2_13_or_later

config LIBC_EGLIBC_V_2_12
    bool
    prompt "2_12"
    select LIBC_EGLIBC_2_12_or_later

config LIBC_EGLIBC_V_2_11
    bool
    prompt "2_11"
    select LIBC_EGLIBC_2_11_or_later

config LIBC_EGLIBC_V_2_10
    bool
    prompt "2_10"
    select LIBC_EGLIBC_2_10_or_later

config LIBC_EGLIBC_V_2_9
    bool
    prompt "2_9"
    select LIBC_EGLIBC_2_9_or_later

config LIBC_EGLIBC_V_2_8
    bool
    prompt "2_8 (OBSOLETE)"
    depends on OBSOLETE

config LIBC_EGLIBC_V_2_7
    bool
    prompt "2_7 (OBSOLETE)"
    depends on OBSOLETE

config LIBC_EGLIBC_V_2_6
    bool
    prompt "2_6 (OBSOLETE)"
    depends on OBSOLETE

config LIBC_EGLIBC_V_2_5
    bool
    prompt "2_5 (OBSOLETE)"
    depends on OBSOLETE

config LIBC_EGLIBC_V_TRUNK
    bool
    prompt "'trunk'"
    select LIBC_EGLIBC_2_14_or_later
    help
      Selecting this will export the trunk of the eglibc subversion repository.

endchoice

config LIBC_VERSION
    string
# Don't remove next line
# CT_INSERT_VERSION_STRING_BELOW
    default "2_14" if LIBC_EGLIBC_V_2_14
    default "2_13" if LIBC_EGLIBC_V_2_13
    default "2_12" if LIBC_EGLIBC_V_2_12
    default "2_11" if LIBC_EGLIBC_V_2_11
    default "2_10" if LIBC_EGLIBC_V_2_10
    default "2_9" if LIBC_EGLIBC_V_2_9
    default "2_8" if LIBC_EGLIBC_V_2_8
    default "2_7" if LIBC_EGLIBC_V_2_7
    default "2_6" if LIBC_EGLIBC_V_2_6
    default "2_5" if LIBC_EGLIBC_V_2_5
    default "trunk" if LIBC_EGLIBC_V_TRUNK

config LIBC_EGLIBC_2_14_or_later
    bool
    select LIBC_EGLIBC_2_13_or_later

config LIBC_EGLIBC_2_13_or_later
    bool
    select LIBC_EGLIBC_2_12_or_later

config LIBC_EGLIBC_2_12_or_later
    bool
    select LIBC_EGLIBC_2_11_or_later

config LIBC_EGLIBC_2_11_or_later
    bool
    select LIBC_EGLIBC_2_10_or_later

config LIBC_EGLIBC_2_10_or_later
    bool
    select LIBC_EGLIBC_2_9_or_later

config LIBC_EGLIBC_2_9_or_later
    bool
    select LIBC_EGLIBC_HAS_PKGVERSION_BUGURL

config LIBC_EGLIBC_HAS_PKGVERSION_BUGURL
    bool

if CONFIGURE_has_svn

config EGLIBC_REVISION
    string
    prompt "Revision to use"
    default "HEAD"
    help
      Enter the revision of trunk you want to use.
      Default is HEAD.
      
      A revision argument can be one of:
          NUMBER       revision number
          '{' DATE '}' revision at start of the date (*)
          'HEAD'       latest in repository
      
      (*) If you want to use a date, please use ISO-8601 formats if
          at all possible.

config EGLIBC_HTTP
    bool
    prompt "use http:// instead of svn://"
    help
      By default, when eglibc is downloaded it is checked out using
      svn://svn.eglibc.org. This option allows you to download eglibc
      from http://www.eglibc.org, if you are behind a proxy or firewall.
      If you are behind a proxy, don't forget to update your
      .subversion/servers file with your proxy info in [global].

config EGLIBC_CHECKOUT
    bool
    prompt "checkout instead of export"
    default y if LIBC_EGLIBC_V_TRUNK
    help
      By default, the eglibc download will be an export of the subversion
      repository. If you say 'y' here, then the repository will instead be
      checked-out, so that you can update it later.
      
      Note that crosstool-NG will *not* update your working copy, you will
      have to do that yourself.

endif # ! CONFIGURE_has_svn
if ! CONFIGURE_has_svn

comment "svn is missing. You'll have to either:"
comment "|  - have a pre-downloaded local tarball"
comment "|  - or have a LAN mirror with a pre-downloaded tarball"
comment "otherwise you won't be able to download eglibc"

endif # ! CONFIGURE_has_svn

config EGLIBC_OPT_SIZE
    bool
    prompt "optimize eglibc for size (-Os)"
    help
      Optimize eglibc for size using -Os instead of -O2. This will make eglibc
      smaller but may make it slower.

config EGLIBC_CUSTOM_CONFIG
    bool
    prompt "Use custom configuration file"
    help
      Use a custom configuration file to disable some features in the eglibc
      library. The configuration file options are described in detail in the
      option-groups.def file in the eglibc source directory.

if EGLIBC_CUSTOM_CONFIG
    config EGLIBC_OPTION_GROUPS_FILE
        string
        prompt "Path to the option-groups configuration file"
        default ""
        help
          Path to the option groups configuration file.

    config EGLIBC_BUNDLED_NSS_CONFIG
        bool
        prompt "Use bundled NSS config file"
        default y
        help
          Use minimal nsswitch configuration file bundled in eglibc.
          This option is only meaningful when runtime nss configuration
          is disabled in the option groups file.

    config EGLIBC_NSS_CONFIG_FILE
        string
        prompt "Path to the NSS config file"
        default ""
        depends on !EGLIBC_BUNDLED_NSS_CONFIG
        help
          Path to the nsswitch configuration file

    config EGLIBC_BUNDLED_NSS_FUNCTIONS
        bool
        prompt "Use bundled NSS functions file"
        default y
        help
          Use minimal nsswitch functions file bundled in eglibc.
          This option is only meaningful when runtime nss configuration
          is disabled in the option groups file.

    config EGLIBC_NSS_FUNCTIONS_FILE
        string
        prompt "Path to the NSS functions file"
        default ""
        depends on !EGLIBC_BUNDLED_NSS_FUNCTIONS
        help
          Path to the nsswitch functions file
endif
