# uClibc options

## depends on ! MINGW32 && ! BARE_METAL
##
## select LIBC_SUPPORT_LINUXTHREADS
## select LIBC_SUPPORT_THREADS_NONE
##
## help The de-facto standard for embeded linux systems.
## help
## help Highly configurable, thus as feature-rich as you
## help need, without compromising for size.

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

config LIBC_UCLIBC_V_0_9_32
    bool
    prompt "0.9.32"
    select LIBC_UCLIBC_0_9_32_or_later

config LIBC_UCLIBC_V_0_9_31
    bool
    prompt "0.9.31 (EXPERIMENTAL)"
    depends on EXPERIMENTAL
    select LIBC_UCLIBC_0_9_30_or_later

config LIBC_UCLIBC_V_0_9_30_3
    bool
    prompt "0.9.30.3"
    select LIBC_UCLIBC_0_9_30_or_later

config LIBC_UCLIBC_V_0_9_30_2
    bool
    prompt "0.9.30.2"
    select LIBC_UCLIBC_0_9_30_or_later

config LIBC_UCLIBC_V_0_9_30_1
    bool
    prompt "0.9.30.1"
    select LIBC_UCLIBC_0_9_30_or_later

config LIBC_UCLIBC_V_0_9_30
    bool
    prompt "0.9.30"
    select LIBC_UCLIBC_0_9_30_or_later

config LIBC_UCLIBC_V_0_9_29
    bool
    prompt "0.9.29 (OBSOLETE)"
    depends on OBSOLETE

config LIBC_UCLIBC_V_0_9_28_3
    bool
    prompt "0.9.28.3 (OBSOLETE)"
    depends on OBSOLETE

# As of today (20100702) we can be pretty sure that every
# snapshots made since a month ago are post -0.9.30.

config LIBC_UCLIBC_V_snapshot
    bool
    prompt "latest snapshot (EXPERIMENTAL)"
    depends on EXPERIMENTAL
    select LIBC_SUPPORT_NPTL
    select LIBC_UCLIBC_0_9_30_or_later

config LIBC_UCLIBC_V_specific_date
    bool
    prompt "<specific date> (EXPERIMENTAL)"
    depends on EXPERIMENTAL
    select LIBC_SUPPORT_NPTL
    select LIBC_UCLIBC_0_9_30_or_later

endchoice

config LIBC_VERSION
    string
    prompt "Enter date (YYYYMMDD)" if LIBC_UCLIBC_V_specific_date
# Don't remove next line
# CT_INSERT_VERSION_STRING_BELOW
    default "0.9.32" if LIBC_UCLIBC_V_0_9_32
    default "0.9.31" if LIBC_UCLIBC_V_0_9_31
    default "0.9.30.3" if LIBC_UCLIBC_V_0_9_30_3
    default "0.9.30.2" if LIBC_UCLIBC_V_0_9_30_2
    default "0.9.30.1" if LIBC_UCLIBC_V_0_9_30_1
    default "0.9.30" if LIBC_UCLIBC_V_0_9_30
    default "0.9.29" if LIBC_UCLIBC_V_0_9_29
    default "0.9.28.3" if LIBC_UCLIBC_V_0_9_28_3
    default "snapshot" if LIBC_UCLIBC_V_snapshot

config LIBC_UCLIBC_0_9_32_or_later
    bool
    select LIBC_SUPPORT_NPTL
    select LIBC_UCLIBC_0_9_30_or_later

config LIBC_UCLIBC_0_9_30_or_later
    bool
    select LIBC_UCLIBC_PARALLEL

config LIBC_UCLIBC_PARALLEL
    bool

choice
    bool
    prompt "uClibc verbosity:"
    default LIBC_UCLIBC_VERBOSITY_0

config LIBC_UCLIBC_VERBOSITY_0
    bool
    prompt "Quiet build"
    help
      Print terse command indications.

config LIBC_UCLIBC_VERBOSITY_1
    bool
    prompt "Brief build (show defines, ld flags)"
    help
      Print simplified command lines.

config LIBC_UCLIBC_VERBOSITY_2
    bool
    prompt "Very verbose build"
    help
      Print full command lines.

endchoice

config LIBC_UCLIBC_VERBOSITY
    string
    default ""      if LIBC_UCLIBC_VERBOSITY_0
    default "V=1"   if LIBC_UCLIBC_VERBOSITY_1
    default "V=2"   if LIBC_UCLIBC_VERBOSITY_2

choice
    bool
    prompt "Debug level"
    default LIBC_UCLIBC_DEBUG_LEVEL_0

config LIBC_UCLIBC_DEBUG_LEVEL_0
    bool
    prompt "none"

config LIBC_UCLIBC_DEBUG_LEVEL_1
    bool
    prompt "minimal"

config LIBC_UCLIBC_DEBUG_LEVEL_2
    bool
    prompt "all"

endchoice

config LIBC_UCLIBC_DEBUG_LEVEL
    int
    default 0 if LIBC_UCLIBC_DEBUG_LEVEL_0
    default 1 if LIBC_UCLIBC_DEBUG_LEVEL_1
    default 2 if LIBC_UCLIBC_DEBUG_LEVEL_2

config LIBC_UCLIBC_CONFIG_FILE
    string
    prompt "Configuration file"
    default ""
    help
      Path to the configuration file.
      
      You _must_ provide one (for now).
