# 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_0_4
    bool
    prompt "3.0.4"

config KERNEL_V_3_0_3
    bool
    prompt "3.0.3"

config KERNEL_V_3_0_2
    bool
    prompt "3.0.2"

config KERNEL_V_3_0_1
    bool
    prompt "3.0.1"

config KERNEL_V_3_0
    bool
    prompt "3.0"

config KERNEL_V_2_6_39_4
    bool
    prompt "2.6.39.4"

config KERNEL_V_2_6_38_8
    bool
    prompt "2.6.38.8"

config KERNEL_V_2_6_37_6
    bool
    prompt "2.6.37.6"

config KERNEL_V_2_6_36_4
    bool
    prompt "2.6.36.4"

config KERNEL_V_2_6_35_14
    bool
    prompt "2.6.35.14 (longterm)"
    help
      The Linux 2.6.35 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.35 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 Andi Kleen in the following mailing
      list entry:
        http://marc.info/?l=linux-kernel&m=129136895415202&w=4

config KERNEL_V_2_6_34_10
    bool
    prompt "2.6.34.10"

config KERNEL_V_2_6_33_19
    bool
    prompt "2.6.33.19"
    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_46
    bool
    prompt "2.6.32.46 (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_14
    bool
    prompt "2.6.31.14"

config KERNEL_V_2_6_27_59
    bool
    prompt "2.6.27.59 (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.0.4" if KERNEL_V_3_0_4
    default "3.0.3" if KERNEL_V_3_0_3
    default "3.0.2" if KERNEL_V_3_0_2
    default "3.0.1" if KERNEL_V_3_0_1
    default "3.0" if KERNEL_V_3_0
    default "2.6.39.4" if KERNEL_V_2_6_39_4
    default "2.6.38.8" if KERNEL_V_2_6_38_8
    default "2.6.37.6" if KERNEL_V_2_6_37_6
    default "2.6.36.4" if KERNEL_V_2_6_36_4
    default "2.6.35.14" if KERNEL_V_2_6_35_14
    default "2.6.34.10" if KERNEL_V_2_6_34_10
    default "2.6.33.19" if KERNEL_V_2_6_33_19
    default "2.6.32.46" if KERNEL_V_2_6_32_46
    default "2.6.31.14" if KERNEL_V_2_6_31_14
    default "2.6.27.59" if KERNEL_V_2_6_27_59
    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
