scripts/build/kernel_linux.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed Apr 11 21:26:03 2007 +0000 (2007-04-11)
changeset 37 21bcbfde8094
parent 1 eeea35fbf182
child 49 f431118daec4
permissions -rw-r--r--
Add an option for those having the kernel headers pre-installed from a customised local tree.
In that case, neither download, nor extract, nor patch.
     1 # This file declares functions to install the kernel headers for linux
     2 # Copyright 2007 Yann E. MORIN
     3 # Licensed under the GPL v2. See COPYING in the root of this package
     4 
     5 # Check kernel configuration
     6 do_kernel_check_config() {
     7     CT_DoStep INFO "Checking kernel configuration"
     8 
     9     if [ "${CT_KERNEL_LINUX_HEADERS_USE_CUSTOM_DIR}" != "y" ]; then
    10         CT_TestOrAbort "You did not provide a kernel config file!" -n "${CT_KERNEL_LINUX_CONFIG_FILE}" -a -f "${CT_KERNEL_LINUX_CONFIG_FILE}"
    11     fi
    12 
    13     CT_EndStep
    14 }
    15 
    16 # Wrapper to the actual headers install method
    17 do_kernel_headers() {
    18     CT_DoStep INFO "Installing kernel headers"
    19 
    20     # Special case when using pre-installed headers
    21     if [ "${CT_KERNEL_LINUX_HEADERS_USE_CUSTOM_DIR}" = "y" ]; then
    22         do_kernel_preinstalled
    23     else
    24         # We need to enter this directory to find the kernel version strings
    25         cd "${CT_SRC_DIR}/${CT_KERNEL_FILE}"
    26         if [ "${CT_KERNEL_LINUX_HEADERS_SANITISED}" != "y" ]; then
    27             k_version=`awk '/^VERSION =/ { print $3 }' Makefile`
    28             k_patchlevel=`awk '/^PATCHLEVEL =/ { print $3 }' Makefile`
    29             k_sublevel=`awk '/^SUBLEVEL =/ { print $3 }' Makefile`
    30             k_extraversion=`awk '/^EXTRAVERSION =/ { print $3 }' Makefile`
    31         else
    32             k_version=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 1`
    33             k_patchlevel=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 2`
    34             k_sublevel=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 3`
    35             k_extraversion=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 4`
    36         fi
    37 
    38         case "${k_version}.${k_patchlevel}" in
    39             2.2|2.4|2.6) ;;
    40             *)  CT_Abort "Unsupported kernel version \"linux-${k_version}.${k_patchlevel}\".";;
    41         esac
    42 
    43         # Kernel version that support verbosity will use this, others will ignore it:
    44         V_OPT="V=${CT_KERNEL_LINUX_VERBOSE_LEVEL}"
    45 
    46         if [ "${CT_KERNEL_LINUX_HEADERS_INSTALL}" = "y" ]; then
    47             do_kernel_install
    48         elif [ "${CT_KERNEL_LINUX_HEADERS_SANITISED}" = "y" ]; then
    49             do_kernel_sanitised
    50         else [ "${CT_KERNEL_LINUX_HEADERS_COPY}" = "y" ];
    51             do_kernel_copy
    52         fi
    53     fi
    54 
    55     CT_EndStep
    56 }
    57 
    58 # Install kernel headers using headers_install from kernel sources.
    59 do_kernel_install() {
    60     CT_DoLog EXTRA "Using kernel's headers_install"
    61 
    62     mkdir -p "${CT_BUILD_DIR}/build-kernel-headers"
    63     cd "${CT_BUILD_DIR}/build-kernel-headers"
    64 
    65     case "${k_version}.${k_patchlevel}" in
    66         2.6) [ ${k_sublevel} -ge 18 ] || CT_Abort "Kernel version >= 2.6.18 is needed to install kernel headers.";;
    67         *)   CT_Abort "Kernel version >= 2.6.18 is needed to install kernel headers.";;
    68     esac
    69 
    70     CT_DoLog EXTRA "Configuring kernel headers"
    71     cp "${CT_KERNEL_LINUX_CONFIG_FILE}" .config
    72     CT_DoYes "" |make -C "${CT_SRC_DIR}/${CT_KERNEL_FILE}"      \
    73                       O="${CT_BUILD_DIR}/build-kernel-headers"  \
    74                       ${V_OPT}                                  \
    75                       ARCH=${CT_KERNEL_ARCH} oldconfig          2>&1 |CT_DoLog DEBUG
    76 
    77     CT_DoLog EXTRA "Installing kernel headers"
    78     make ARCH=${CT_KERNEL_ARCH}                     \
    79          INSTALL_HDR_PATH="${CT_SYSROOT_DIR}/usr"   \
    80          ${V_OPT}                                   \
    81          headers_install                            2>&1 |CT_DoLog DEBUG
    82 
    83     CT_DoLog EXTRA "Checking installed headers"
    84     make ARCH=${CT_KERNEL_ARCH}                     \
    85          INSTALL_HDR_PATH="${CT_SYSROOT_DIR}/usr"   \
    86          ${V_OPT}                                   \
    87          headers_check                              2>&1 |CT_DoLog DEBUG
    88 }
    89 
    90 # Install kernel headers from oldish Mazur's sanitised headers.
    91 do_kernel_sanitised() {
    92     CT_DoLog EXTRA "Copying sanitised headers"
    93     cd "${CT_SRC_DIR}/${CT_KERNEL_FILE}"
    94     cp -rv include/linux "${CT_HEADERS_DIR}" 2>&1 |CT_DoLog DEBUG
    95     cp -rv "include/asm-${CT_KERNEL_ARCH}" "${CT_HEADERS_DIR}/asm" 2>&1 |CT_DoLog DEBUG
    96 }
    97 
    98 # Install kernel headers by plain copy.
    99 do_kernel_copy() {
   100     CT_DoLog EXTRA "Copying plain kernel headers"
   101     CT_DoLog WARN "You are using plain kernel headers. You really shouldn't do that."
   102     CT_DoLog WARN "You'd be better off by using installed headers (or sanitised headers)."
   103 
   104     # 2.2 and 2.4 don't support building out-of-tree. 2.6 does.
   105     CT_DoLog EXTRA "Preparing kernel headers"
   106     case "${k_version}.${k_patchlevel}" in
   107         2.2|2.4) cd "${CT_SRC_DIR}/${CT_KERNEL_FILE}"
   108                  cp "${CT_KERNEL_LINUX_CONFIG_FILE}" .config
   109                  CT_DoYes "" |make ARCH=${CT_KERNEL_ARCH} oldconfig
   110                  # 2.4 doesn't follow V=# for verbosity... :-(
   111                  make ARCH=${CT_KERNEL_ARCH} symlinks include/linux/version.h
   112                  ;;
   113         2.6)     mkdir -p "${CT_BUILD_DIR}/build-kernel-headers"
   114                  cd "${CT_BUILD_DIR}/build-kernel-headers"
   115                  cp "${CT_KERNEL_LINUX_CONFIG_FILE}" .config
   116                  CT_DoYes "" |make -C "${CT_SRC_DIR}/${CT_KERNEL_FILE}"         \
   117                                    O="`pwd`" ${V_OPT} ARCH=${CT_KERNEL_ARCH}    \
   118                                    oldconfig
   119                  case "${CT_KERNEL_ARCH}" in
   120                      sh*)        # sh does secret stuff in 'make prepare' that can't be
   121                                  # triggered separately, but happily, it doesn't use
   122                                  # target gcc, so we can use it.
   123                                  # Update: this fails on 2.6.11, as it installs
   124                                  # elfconfig.h, which requires target compiler :-(
   125                                  make ${PARALLELMFLAGS}                 \
   126                                       ARCH=${CT_KERNEL_ARCH} ${V_OPT}   \
   127                                       prepare include/linux/version.h
   128                                  ;;
   129                      arm*|cris*) make ${PARALLELMFLAGS}                 \
   130                                       ARCH=${CT_KERNEL_ARCH} ${V_OPT}       \
   131                                       include/asm include/linux/version.h   \
   132                                       include/asm-${CT_KERNEL_ARCH}/.arch
   133                                  ;;
   134                      mips*)      # for linux-2.6, 'make prepare' for mips doesn't 
   135                                  # actually create any symlinks.  Hope generic is ok.
   136                                  # Note that glibc ignores all -I flags passed in CFLAGS,
   137                                  # so you have to use -isystem.
   138                                  make ${PARALLELMFLAGS}                 \
   139                                       ARCH=${CT_KERNEL_ARCH} ${V_OPT}   \
   140                                       include/asm include/linux/version.h
   141                                  TARGET_CFLAGS="${TARGET_CFLAGS} -isystem ${LINUX_HEADER_DIR}/include/asm-mips/mach-generic"
   142                                  ;;
   143                      *)          make ${PARALLELMFLAGS}                 \
   144                                       ARCH=${CT_KERNEL_ARCH} ${V_OPT}   \
   145                                       include/asm include/linux/version.h
   146                                  ;;
   147                  esac
   148                  ;;
   149     esac 2>&1 |CT_DoLog DEBUG
   150 
   151     CT_DoLog EXTRA "Copying kernel headers"
   152     cp -rv include/asm-generic "${CT_HEADERS_DIR}/asm-generic" 2>&1 |CT_DoLog DEBUG
   153     cp -rv include/linux "${CT_HEADERS_DIR}" 2>&1 |CT_DoLog DEBUG
   154     cp -rv include/asm-${CT_KERNEL_ARCH} "${CT_HEADERS_DIR}/asm" 2>&1 |CT_DoLog DEBUG
   155 }
   156 
   157 # Use preinstalled headers (most probably by using make headers_install in a
   158 # modified (read: customised) kernel tree). In this case, simply copy
   159 # the headers in place
   160 do_kernel_preinstalled() {
   161     CT_DoLog EXTRA "Copying preinstalled kernel headers"
   162 
   163     mkdir -p "${CT_SYSROOT_DIR}/usr"
   164     cd "${CT_KERNEL_LINUX_HEADERS_CUSTOM_DIR}"
   165     cp -rv include "${CT_SYSROOT_DIR}/usr" 2>&1 |CT_DoLog DEBUG
   166 }