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