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