scripts/build/kernel_linux.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Feb 17 22:08:06 2008 +0000 (2008-02-17)
changeset 431 8bde4c6ea47a
parent 164 e78c0b2bc057
child 486 92f6149c4275
permissions -rw-r--r--
Robert P. J. DAY says:

apparently, the patchset for gcc 4.2.1 applies properly to the
source for gcc 4.2.2 and gcc 4.2.3. so, if you want, you can simply
add support for those last two just by augmenting menuconfig and
adding a couple symlinks for those two directories. seems like a
cheap way to add a couple new versions.
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@161
     5
do_print_filename() {
yann@161
     6
    [ "${CT_KERNEL}" = "linux" ] || return 0
yann@164
     7
    case "${CT_KERNEL_LINUX_HEADERS_SANITISED}" in
yann@164
     8
        y)  echo "linux-libc-headers-${CT_KERNEL_VERSION}";;
yann@164
     9
        *)  echo "linux-${CT_KERNEL_VERSION}";;
yann@164
    10
    esac
yann@161
    11
}
yann@161
    12
yann@63
    13
# Download the kernel
yann@63
    14
do_kernel_get() {
yann@63
    15
    if [ "${CT_KERNEL_LINUX_HEADERS_USE_CUSTOM_DIR}" != "y" ]; then
yann@63
    16
        CT_GetFile "${CT_KERNEL_FILE}"                                  \
yann@63
    17
                   ftp://ftp.kernel.org/pub/linux/kernel/v2.6           \
yann@63
    18
                   ftp://ftp.kernel.org/pub/linux/kernel/v2.4           \
yann@63
    19
                   ftp://ftp.kernel.org/pub/linux/kernel/v2.2           \
yann@63
    20
                   ftp://ftp.kernel.org/pub/linux/kernel/v2.6/testing   \
yann@63
    21
                   http://ep09.pld-linux.org/~mmazur/linux-libc-headers
yann@63
    22
    fi
yann@63
    23
    return 0
yann@63
    24
}
yann@63
    25
yann@63
    26
# Extract kernel
yann@63
    27
do_kernel_extract() {
yann@63
    28
    if [ "${CT_KERNEL_LINUX_HEADERS_USE_CUSTOM_DIR}" != "y" ]; then
yann@63
    29
        CT_ExtractAndPatch "${CT_KERNEL_FILE}"
yann@63
    30
    fi
yann@63
    31
    return 0
yann@63
    32
}
yann@63
    33
yann@1
    34
# Check kernel configuration
yann@1
    35
do_kernel_check_config() {
yann@66
    36
    # Only the copied or sanitised headers need a config file.
yann@66
    37
    # Pre-existing headers as well as headers_install don't.
yann@66
    38
    if [ "${CT_KERNEL_LINUX_NEEDS_CONFIG}" = "y"        \
yann@66
    39
         -a \( -z "${CT_KERNEL_LINUX_CONFIG_FILE}"      \
yann@66
    40
               -o ! -r "${CT_KERNEL_LINUX_CONFIG_FILE}" \
yann@66
    41
            \)                                          \
yann@66
    42
       ]; then
yann@49
    43
        CT_DoLog WARN "You did not provide a kernel configuration file!"
yann@49
    44
        CT_DoLog WARN "I will try to generate one for you, but beware!"
yann@49
    45
yann@49
    46
        CT_DoStep INFO "Building a default configuration file for linux kernel"
yann@49
    47
yann@49
    48
        mkdir -p "${CT_BUILD_DIR}/build-kernel-defconfig"
yann@49
    49
        cd "${CT_BUILD_DIR}/build-kernel-defconfig"
yann@49
    50
        make -C "${CT_SRC_DIR}/${CT_KERNEL_FILE}" O=`pwd`   \
yann@78
    51
             ARCH=${CT_KERNEL_ARCH} defconfig               2>&1 |CT_DoLog ALL
yann@49
    52
yann@49
    53
        CT_KERNEL_LINUX_CONFIG_FILE="`pwd`/.config"
yann@49
    54
yann@49
    55
        CT_EndStep
yann@37
    56
    fi
yann@1
    57
}
yann@1
    58
yann@1
    59
# Wrapper to the actual headers install method
yann@1
    60
do_kernel_headers() {
yann@1
    61
    CT_DoStep INFO "Installing kernel headers"
yann@1
    62
yann@37
    63
    # Special case when using pre-installed headers
yann@37
    64
    if [ "${CT_KERNEL_LINUX_HEADERS_USE_CUSTOM_DIR}" = "y" ]; then
yann@37
    65
        do_kernel_preinstalled
yann@1
    66
    else
yann@37
    67
        # We need to enter this directory to find the kernel version strings
yann@37
    68
        cd "${CT_SRC_DIR}/${CT_KERNEL_FILE}"
yann@37
    69
        if [ "${CT_KERNEL_LINUX_HEADERS_SANITISED}" != "y" ]; then
yann@37
    70
            k_version=`awk '/^VERSION =/ { print $3 }' Makefile`
yann@37
    71
            k_patchlevel=`awk '/^PATCHLEVEL =/ { print $3 }' Makefile`
yann@37
    72
            k_sublevel=`awk '/^SUBLEVEL =/ { print $3 }' Makefile`
yann@37
    73
            k_extraversion=`awk '/^EXTRAVERSION =/ { print $3 }' Makefile`
yann@37
    74
        else
yann@37
    75
            k_version=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 1`
yann@37
    76
            k_patchlevel=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 2`
yann@37
    77
            k_sublevel=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 3`
yann@37
    78
            k_extraversion=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 4`
yann@37
    79
        fi
yann@1
    80
yann@37
    81
        case "${k_version}.${k_patchlevel}" in
yann@37
    82
            2.2|2.4|2.6) ;;
yann@37
    83
            *)  CT_Abort "Unsupported kernel version \"linux-${k_version}.${k_patchlevel}\".";;
yann@37
    84
        esac
yann@1
    85
yann@37
    86
        # Kernel version that support verbosity will use this, others will ignore it:
yann@37
    87
        V_OPT="V=${CT_KERNEL_LINUX_VERBOSE_LEVEL}"
yann@1
    88
yann@37
    89
        if [ "${CT_KERNEL_LINUX_HEADERS_INSTALL}" = "y" ]; then
yann@37
    90
            do_kernel_install
yann@37
    91
        elif [ "${CT_KERNEL_LINUX_HEADERS_SANITISED}" = "y" ]; then
yann@37
    92
            do_kernel_sanitised
yann@37
    93
        else [ "${CT_KERNEL_LINUX_HEADERS_COPY}" = "y" ];
yann@37
    94
            do_kernel_copy
yann@37
    95
        fi
yann@1
    96
    fi
yann@1
    97
yann@1
    98
    CT_EndStep
yann@1
    99
}
yann@1
   100
yann@1
   101
# Install kernel headers using headers_install from kernel sources.
yann@1
   102
do_kernel_install() {
yann@78
   103
    CT_DoLog DEBUG "Using kernel's headers_install"
yann@1
   104
yann@1
   105
    mkdir -p "${CT_BUILD_DIR}/build-kernel-headers"
yann@1
   106
    cd "${CT_BUILD_DIR}/build-kernel-headers"
yann@1
   107
yann@1
   108
    case "${k_version}.${k_patchlevel}" in
yann@1
   109
        2.6) [ ${k_sublevel} -ge 18 ] || CT_Abort "Kernel version >= 2.6.18 is needed to install kernel headers.";;
yann@1
   110
        *)   CT_Abort "Kernel version >= 2.6.18 is needed to install kernel headers.";;
yann@1
   111
    esac
yann@1
   112
yann@1
   113
    CT_DoLog EXTRA "Installing kernel headers"
yann@64
   114
    make -C "${CT_SRC_DIR}/${CT_KERNEL_FILE}"       \
yann@64
   115
         O="`pwd`"                                  \
yann@64
   116
         ARCH=${CT_KERNEL_ARCH}                     \
yann@1
   117
         INSTALL_HDR_PATH="${CT_SYSROOT_DIR}/usr"   \
yann@1
   118
         ${V_OPT}                                   \
yann@78
   119
         headers_install                            2>&1 |CT_DoLog ALL
yann@1
   120
yann@199
   121
    if [ "${CT_KERNEL_LINUX_HEADERS_INSTALL_CHECK}" = "y" ]; then
yann@199
   122
        CT_DoLog EXTRA "Checking installed headers"
yann@199
   123
        make -C "${CT_SRC_DIR}/${CT_KERNEL_FILE}"       \
yann@199
   124
             O="`pwd`"                                  \
yann@199
   125
             ARCH=${CT_KERNEL_ARCH}                     \
yann@199
   126
             INSTALL_HDR_PATH="${CT_SYSROOT_DIR}/usr"   \
yann@199
   127
             ${V_OPT}                                   \
yann@199
   128
             headers_check                              2>&1 |CT_DoLog ALL
yann@199
   129
        find "${CT_SYSROOT_DIR}" -type f -name '.check*' -exec rm {} \;
yann@199
   130
    fi
yann@1
   131
}
yann@1
   132
yann@1
   133
# Install kernel headers from oldish Mazur's sanitised headers.
yann@1
   134
do_kernel_sanitised() {
yann@1
   135
    CT_DoLog EXTRA "Copying sanitised headers"
yann@1
   136
    cd "${CT_SRC_DIR}/${CT_KERNEL_FILE}"
yann@78
   137
    cp -rv include/linux "${CT_HEADERS_DIR}" 2>&1 |CT_DoLog ALL
yann@78
   138
    cp -rv "include/asm-${CT_KERNEL_ARCH}" "${CT_HEADERS_DIR}/asm" 2>&1 |CT_DoLog ALL
yann@1
   139
}
yann@1
   140
yann@1
   141
# Install kernel headers by plain copy.
yann@1
   142
do_kernel_copy() {
yann@78
   143
    CT_DoLog DEBUG "Copying plain kernel headers"
yann@1
   144
    CT_DoLog WARN "You are using plain kernel headers. You really shouldn't do that."
yann@1
   145
    CT_DoLog WARN "You'd be better off by using installed headers (or sanitised headers)."
yann@1
   146
yann@1
   147
    # 2.2 and 2.4 don't support building out-of-tree. 2.6 does.
yann@1
   148
    CT_DoLog EXTRA "Preparing kernel headers"
yann@1
   149
    case "${k_version}.${k_patchlevel}" in
yann@1
   150
        2.2|2.4) cd "${CT_SRC_DIR}/${CT_KERNEL_FILE}"
yann@1
   151
                 cp "${CT_KERNEL_LINUX_CONFIG_FILE}" .config
yann@1
   152
                 CT_DoYes "" |make ARCH=${CT_KERNEL_ARCH} oldconfig
yann@1
   153
                 # 2.4 doesn't follow V=# for verbosity... :-(
yann@1
   154
                 make ARCH=${CT_KERNEL_ARCH} symlinks include/linux/version.h
yann@1
   155
                 ;;
yann@1
   156
        2.6)     mkdir -p "${CT_BUILD_DIR}/build-kernel-headers"
yann@1
   157
                 cd "${CT_BUILD_DIR}/build-kernel-headers"
yann@1
   158
                 cp "${CT_KERNEL_LINUX_CONFIG_FILE}" .config
yann@1
   159
                 CT_DoYes "" |make -C "${CT_SRC_DIR}/${CT_KERNEL_FILE}"         \
yann@1
   160
                                   O="`pwd`" ${V_OPT} ARCH=${CT_KERNEL_ARCH}    \
yann@1
   161
                                   oldconfig
yann@1
   162
                 case "${CT_KERNEL_ARCH}" in
yann@1
   163
                     sh*)        # sh does secret stuff in 'make prepare' that can't be
yann@1
   164
                                 # triggered separately, but happily, it doesn't use
yann@1
   165
                                 # target gcc, so we can use it.
yann@1
   166
                                 # Update: this fails on 2.6.11, as it installs
yann@1
   167
                                 # elfconfig.h, which requires target compiler :-(
yann@1
   168
                                 make ${PARALLELMFLAGS}                 \
yann@1
   169
                                      ARCH=${CT_KERNEL_ARCH} ${V_OPT}   \
yann@1
   170
                                      prepare include/linux/version.h
yann@1
   171
                                 ;;
yann@1
   172
                     arm*|cris*) make ${PARALLELMFLAGS}                 \
yann@1
   173
                                      ARCH=${CT_KERNEL_ARCH} ${V_OPT}       \
yann@1
   174
                                      include/asm include/linux/version.h   \
yann@1
   175
                                      include/asm-${CT_KERNEL_ARCH}/.arch
yann@1
   176
                                 ;;
yann@1
   177
                     mips*)      # for linux-2.6, 'make prepare' for mips doesn't 
yann@1
   178
                                 # actually create any symlinks.  Hope generic is ok.
yann@1
   179
                                 # Note that glibc ignores all -I flags passed in CFLAGS,
yann@1
   180
                                 # so you have to use -isystem.
yann@1
   181
                                 make ${PARALLELMFLAGS}                 \
yann@1
   182
                                      ARCH=${CT_KERNEL_ARCH} ${V_OPT}   \
yann@1
   183
                                      include/asm include/linux/version.h
yann@1
   184
                                 TARGET_CFLAGS="${TARGET_CFLAGS} -isystem ${LINUX_HEADER_DIR}/include/asm-mips/mach-generic"
yann@1
   185
                                 ;;
yann@1
   186
                     *)          make ${PARALLELMFLAGS}                 \
yann@1
   187
                                      ARCH=${CT_KERNEL_ARCH} ${V_OPT}   \
yann@1
   188
                                      include/asm include/linux/version.h
yann@1
   189
                                 ;;
yann@1
   190
                 esac
yann@1
   191
                 ;;
yann@78
   192
    esac 2>&1 |CT_DoLog ALL
yann@1
   193
yann@1
   194
    CT_DoLog EXTRA "Copying kernel headers"
yann@78
   195
    cp -rv include/asm-generic "${CT_HEADERS_DIR}/asm-generic" 2>&1 |CT_DoLog ALL
yann@78
   196
    cp -rv include/linux "${CT_HEADERS_DIR}" 2>&1 |CT_DoLog ALL
yann@78
   197
    cp -rv include/asm-${CT_KERNEL_ARCH} "${CT_HEADERS_DIR}/asm" 2>&1 |CT_DoLog ALL
yann@1
   198
}
yann@37
   199
yann@37
   200
# Use preinstalled headers (most probably by using make headers_install in a
yann@37
   201
# modified (read: customised) kernel tree). In this case, simply copy
yann@37
   202
# the headers in place
yann@37
   203
do_kernel_preinstalled() {
yann@37
   204
    CT_DoLog EXTRA "Copying preinstalled kernel headers"
yann@37
   205
yann@37
   206
    mkdir -p "${CT_SYSROOT_DIR}/usr"
yann@37
   207
    cd "${CT_KERNEL_LINUX_HEADERS_CUSTOM_DIR}"
yann@78
   208
    cp -rv include "${CT_SYSROOT_DIR}/usr" 2>&1 |CT_DoLog ALL
yann@37
   209
}