# Linux kernel options

## select KERNEL_SUPPORTS_SHARED_LIBS
##
## help Build a toolchain targeting systems running Linux as a kernel.

config KERNEL_LINUX_USE_CUSTOM_HEADERS
    bool
    prompt "Use pre-installed headers tree (OBSOLETE)"
    depends on OBSOLETE
    help
      If you have some pre-installed kernel headers lying around, you can
      enter the path to these headers, below, they will be copied from
      there, and into the toolchain's sysroot.
      
      Note:
      This will *not* let you use a complete kernel tree!
      If you want to use your own full kernel tree, then you want to say 'N'
      here, and select KERNEL_LINUX_CUSTOM, in the versions list, below.

if ! KERNEL_LINUX_USE_CUSTOM_HEADERS

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

config KERNEL_V_3_15
    bool
    prompt "3.15.4"

config KERNEL_V_3_14
    bool
    prompt "3.14.11 (longterm)"

config KERNEL_V_3_13
    bool
    prompt "3.13.11"

config KERNEL_V_3_12
    bool
    prompt "3.12.24 (longterm)"

config KERNEL_V_3_11
    bool
    prompt "3.11.10"

config KERNEL_V_3_10
    bool
    prompt "3.10.47 (longterm)"

config KERNEL_V_3_9
    bool
    prompt "3.9.11"

config KERNEL_V_3_8
    bool
    prompt "3.8.13"

config KERNEL_V_3_7
    bool
    prompt "3.7.10"

config KERNEL_V_3_6
    bool
    prompt "3.6.11"

config KERNEL_V_3_5
    bool
    prompt "3.5.7"

config KERNEL_V_3_4
    bool
    prompt "3.4.97 (longterm)"

config KERNEL_V_3_3
    bool
    prompt "3.3.8"

config KERNEL_V_3_2
    bool
    prompt "3.2.60 (longterm)"

config KERNEL_V_3_1
    bool
    prompt "3.1.10"

config KERNEL_V_3_0
    bool
    prompt "3.0.101"

config KERNEL_V_2_6_39
    bool
    prompt "2.6.39.4"

config KERNEL_V_2_6_38
    bool
    prompt "2.6.38.8"

config KERNEL_V_2_6_37
    bool
    prompt "2.6.37.6"

config KERNEL_V_2_6_36
    bool
    prompt "2.6.36.4"

config KERNEL_V_2_6_33
    bool
    prompt "2.6.33.20"
    help
      This is primarily for the use of those people who are stuck using the
      .33-rt kernel.  Anyone else who really wants to use the .33 kernel tree
      is welcome to use this one as well.

config KERNEL_V_2_6_32
    bool
    prompt "2.6.32.63 (longterm)"
    help
      The Linux 2.6.32 tree is a "longterm" maintenance branch.
      
      It is intended to fill the niche for users who are not using distribution
      kernels but want to use a regression-free kernel for a longer time.
      
      Critical bug fixes to later 2.6 releases are often ported to this branch
      which makes 2.6.32 a very useful base for many embedded developers seeking
      stable APIs or those who do not need the latest bleeding edge features.
      
      ... and no, this kernel has not undergone any specific QA testing.
      
      See the original announcement by Greg Kroah-Hartman in the following
      mailing list entry:
        http://marc.info/?l=linux-kernel&m=126384198403392&w=4

config KERNEL_V_2_6_31
    bool
    prompt "2.6.31.14"

config KERNEL_V_2_6_27
    bool
    prompt "2.6.27.62 (longterm)"
    help
      The Linux 2.6.27 tree is a "longterm" maintenance branch.
      
      It is intended to fill the niche for users who are not using distribution
      kernels but want to use a regression-free kernel for a longer time.
      
      Critical bug fixes to later 2.6 releases are often ported to this branch
      which makes 2.6.27 a very useful base for many embedded developers seeking
      stable APIs or those who do not need the latest bleeding edge features.
      
      ... and no, this kernel has not undergone any specific QA testing.
      
      See the original announcement by Adrian Bunk in the following mailing list
      entry:
        http://marc.info/?l=linux-kernel&m=122375909403298&w=4
      
      It is now maintained by Greg Kroah-Hartman, see this mailing list entry:
        http://marc.info/?l=linux-kernel&m=129133701916793&w=4

config KERNEL_LINUX_CUSTOM
    bool
    prompt "custom tarball or directory"
    help
      Use a local tarball or local kernel directory of a complete kernel source tree.

config KERNEL_LINUX_CUSTOM_LOCATION
    string
    prompt "Path to custom source, tarball or directory"
    depends on KERNEL_LINUX_CUSTOM
    help
      Enter here the path to the tarball of your full kernel tree or
      kernel directory

endchoice

config KERNEL_VERSION
    string
# Don't remove next line
# CT_INSERT_VERSION_STRING_BELOW
    default "3.15.4" if KERNEL_V_3_15
    default "3.14.11" if KERNEL_V_3_14
    default "3.13.11" if KERNEL_V_3_13
    default "3.12.24" if KERNEL_V_3_12
    default "3.11.10" if KERNEL_V_3_11
    default "3.10.47" if KERNEL_V_3_10
    default "3.9.11" if KERNEL_V_3_9
    default "3.8.13" if KERNEL_V_3_8
    default "3.7.10" if KERNEL_V_3_7
    default "3.6.11" if KERNEL_V_3_6
    default "3.5.7" if KERNEL_V_3_5
    default "3.4.97" if KERNEL_V_3_4
    default "3.3.8" if KERNEL_V_3_3
    default "3.2.60" if KERNEL_V_3_2
    default "3.1.10" if KERNEL_V_3_1
    default "3.0.101" if KERNEL_V_3_0
    default "2.6.39.4" if KERNEL_V_2_6_39
    default "2.6.38.8" if KERNEL_V_2_6_38
    default "2.6.37.6" if KERNEL_V_2_6_37
    default "2.6.36.4" if KERNEL_V_2_6_36
    default "2.6.33.20" if KERNEL_V_2_6_33
    default "2.6.32.63" if KERNEL_V_2_6_32
    default "2.6.31.14" if KERNEL_V_2_6_31
    default "2.6.27.62" if KERNEL_V_2_6_27
    default "custom" if KERNEL_LINUX_CUSTOM

endif # ! KERNEL_LINUX_USE_CUSTOM_HEADERS

if KERNEL_LINUX_USE_CUSTOM_HEADERS

config KERNEL_LINUX_CUSTOM_PATH
    string
    prompt "Path to custom headers directory/tarball"
    help
      See KERNEL_LINUX_CUSTOM_IS_TARBALL, below.

config KERNEL_LINUX_CUSTOM_IS_TARBALL
    bool
    prompt "This is a tarball"
    help
      If you say 'n' here, the path above is expected to point to a directory
      containing readily prepared headers
      
      If you say 'y' here, then the path above is expected to point to a
      tarball of such a directory.
      
      Eg., if your headers are available in: /foo/bar/buz/my_hdrs/include,
      say 'n' here, and enter: /foo/bar/buz/my_hdrs below.
      
      Now, passing a tarball around is easier than passing a directory, so
      if you want to, you can make a tarball of /foo/bar/buz/my_hdrs/include,
      say 'y' here, and enter the path to this tarball below.

endif # KERNEL_LINUX_USE_CUSTOM_HEADERS
