scripts/build/kernel_linux.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Feb 24 11:00:05 2007 +0000 (2007-02-24)
changeset 1 eeea35fbf182
child 37 21bcbfde8094
permissions -rw-r--r--
Add the full crosstool-NG sources to the new repository of its own.
You might just say: 'Yeah! crosstool-NG's got its own repo!".
Unfortunately, that's because the previous repo got damaged beyond repair and I had no backup.
That means I'm putting backups in place in the afternoon.
That also means we've lost history... :-(
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@1
     9
    CT_TestOrAbort "You did not provide a kernel config file!" -n "${CT_KERNEL_LINUX_CONFIG_FILE}" -a -f "${CT_KERNEL_LINUX_CONFIG_FILE}"
yann@1
    10
yann@1
    11
    CT_EndStep
yann@1
    12
}
yann@1
    13
yann@1
    14
# Wrapper to the actual headers install method
yann@1
    15
do_kernel_headers() {
yann@1
    16
    CT_DoStep INFO "Installing kernel headers"
yann@1
    17
yann@1
    18
    # We need to enter this directory to find the kernel version strings
yann@1
    19
    cd "${CT_SRC_DIR}/${CT_KERNEL_FILE}"
yann@1
    20
    if [ "${CT_KERNEL_LINUX_HEADERS_SANITISED}" != "y" ]; then
yann@1
    21
        k_version=`awk '/^VERSION =/ { print $3 }' Makefile`
yann@1
    22
        k_patchlevel=`awk '/^PATCHLEVEL =/ { print $3 }' Makefile`
yann@1
    23
        k_sublevel=`awk '/^SUBLEVEL =/ { print $3 }' Makefile`
yann@1
    24
        k_extraversion=`awk '/^EXTRAVERSION =/ { print $3 }' Makefile`
yann@1
    25
    else
yann@1
    26
        k_version=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 1`
yann@1
    27
        k_patchlevel=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 2`
yann@1
    28
        k_sublevel=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 3`
yann@1
    29
        k_extraversion=`echo "${CT_KERNEL_VERSION}." |cut -d . -f 4`
yann@1
    30
    fi
yann@1
    31
yann@1
    32
    case "${k_version}.${k_patchlevel}" in
yann@1
    33
        2.2|2.4|2.6) ;;
yann@1
    34
        *)  CT_Abort "Unsupported kernel version \"linux-${k_version}.${k_patchlevel}\".";;
yann@1
    35
    esac
yann@1
    36
yann@1
    37
    # Kernel version that support verbosity will use this, others will ignore it:
yann@1
    38
    V_OPT="V=${CT_KERNEL_LINUX_VERBOSE_LEVEL}"
yann@1
    39
yann@1
    40
    if [ "${CT_KERNEL_LINUX_HEADERS_INSTALL}" = "y" ]; then
yann@1
    41
        do_kernel_install
yann@1
    42
    elif [ "${CT_KERNEL_LINUX_HEADERS_SANITISED}" = "y" ]; then
yann@1
    43
        do_kernel_sanitised
yann@1
    44
    else [ "${CT_KERNEL_LINUX_HEADERS_COPY}" = "y" ];
yann@1
    45
        do_kernel_copy
yann@1
    46
    fi
yann@1
    47
yann@1
    48
    CT_EndStep
yann@1
    49
}
yann@1
    50
yann@1
    51
# Install kernel headers using headers_install from kernel sources.
yann@1
    52
do_kernel_install() {
yann@1
    53
    CT_DoLog EXTRA "Using kernel's headers_install"
yann@1
    54
yann@1
    55
    mkdir -p "${CT_BUILD_DIR}/build-kernel-headers"
yann@1
    56
    cd "${CT_BUILD_DIR}/build-kernel-headers"
yann@1
    57
yann@1
    58
    case "${k_version}.${k_patchlevel}" in
yann@1
    59
        2.6) [ ${k_sublevel} -ge 18 ] || CT_Abort "Kernel version >= 2.6.18 is needed to install kernel headers.";;
yann@1
    60
        *)   CT_Abort "Kernel version >= 2.6.18 is needed to install kernel headers.";;
yann@1
    61
    esac
yann@1
    62
yann@1
    63
    CT_DoLog EXTRA "Configuring kernel headers"
yann@1
    64
    cp "${CT_KERNEL_LINUX_CONFIG_FILE}" .config
yann@1
    65
    CT_DoYes "" |make -C "${CT_SRC_DIR}/${CT_KERNEL_FILE}"      \
yann@1
    66
                      O="${CT_BUILD_DIR}/build-kernel-headers"  \
yann@1
    67
                      ${V_OPT}                                  \
yann@1
    68
                      ARCH=${CT_KERNEL_ARCH} oldconfig          2>&1 |CT_DoLog DEBUG
yann@1
    69
yann@1
    70
    CT_DoLog EXTRA "Installing kernel headers"
yann@1
    71
    make ARCH=${CT_KERNEL_ARCH}                     \
yann@1
    72
         INSTALL_HDR_PATH="${CT_SYSROOT_DIR}/usr"   \
yann@1
    73
         ${V_OPT}                                   \
yann@1
    74
         headers_install                            2>&1 |CT_DoLog DEBUG
yann@1
    75
yann@1
    76
    CT_DoLog EXTRA "Checking installed headers"
yann@1
    77
    make ARCH=${CT_KERNEL_ARCH}                     \
yann@1
    78
         INSTALL_HDR_PATH="${CT_SYSROOT_DIR}/usr"   \
yann@1
    79
         ${V_OPT}                                   \
yann@1
    80
         headers_check                              2>&1 |CT_DoLog DEBUG
yann@1
    81
}
yann@1
    82
yann@1
    83
# Install kernel headers from oldish Mazur's sanitised headers.
yann@1
    84
do_kernel_sanitised() {
yann@1
    85
    CT_DoLog EXTRA "Copying sanitised headers"
yann@1
    86
    cd "${CT_SRC_DIR}/${CT_KERNEL_FILE}"
yann@1
    87
    cp -rv include/linux "${CT_HEADERS_DIR}" 2>&1 |CT_DoLog DEBUG
yann@1
    88
    cp -rv "include/asm-${CT_KERNEL_ARCH}" "${CT_HEADERS_DIR}/asm" 2>&1 |CT_DoLog DEBUG
yann@1
    89
}
yann@1
    90
yann@1
    91
# Install kernel headers by plain copy.
yann@1
    92
do_kernel_copy() {
yann@1
    93
    CT_DoLog EXTRA "Copying plain kernel headers"
yann@1
    94
    CT_DoLog WARN "You are using plain kernel headers. You really shouldn't do that."
yann@1
    95
    CT_DoLog WARN "You'd be better off by using installed headers (or sanitised headers)."
yann@1
    96
yann@1
    97
    # 2.2 and 2.4 don't support building out-of-tree. 2.6 does.
yann@1
    98
    CT_DoLog EXTRA "Preparing kernel headers"
yann@1
    99
    case "${k_version}.${k_patchlevel}" in
yann@1
   100
        2.2|2.4) cd "${CT_SRC_DIR}/${CT_KERNEL_FILE}"
yann@1
   101
                 cp "${CT_KERNEL_LINUX_CONFIG_FILE}" .config
yann@1
   102
                 CT_DoYes "" |make ARCH=${CT_KERNEL_ARCH} oldconfig
yann@1
   103
                 # 2.4 doesn't follow V=# for verbosity... :-(
yann@1
   104
                 make ARCH=${CT_KERNEL_ARCH} symlinks include/linux/version.h
yann@1
   105
                 ;;
yann@1
   106
        2.6)     mkdir -p "${CT_BUILD_DIR}/build-kernel-headers"
yann@1
   107
                 cd "${CT_BUILD_DIR}/build-kernel-headers"
yann@1
   108
                 cp "${CT_KERNEL_LINUX_CONFIG_FILE}" .config
yann@1
   109
                 CT_DoYes "" |make -C "${CT_SRC_DIR}/${CT_KERNEL_FILE}"         \
yann@1
   110
                                   O="`pwd`" ${V_OPT} ARCH=${CT_KERNEL_ARCH}    \
yann@1
   111
                                   oldconfig
yann@1
   112
                 case "${CT_KERNEL_ARCH}" in
yann@1
   113
                     sh*)        # sh does secret stuff in 'make prepare' that can't be
yann@1
   114
                                 # triggered separately, but happily, it doesn't use
yann@1
   115
                                 # target gcc, so we can use it.
yann@1
   116
                                 # Update: this fails on 2.6.11, as it installs
yann@1
   117
                                 # elfconfig.h, which requires target compiler :-(
yann@1
   118
                                 make ${PARALLELMFLAGS}                 \
yann@1
   119
                                      ARCH=${CT_KERNEL_ARCH} ${V_OPT}   \
yann@1
   120
                                      prepare include/linux/version.h
yann@1
   121
                                 ;;
yann@1
   122
                     arm*|cris*) make ${PARALLELMFLAGS}                 \
yann@1
   123
                                      ARCH=${CT_KERNEL_ARCH} ${V_OPT}       \
yann@1
   124
                                      include/asm include/linux/version.h   \
yann@1
   125
                                      include/asm-${CT_KERNEL_ARCH}/.arch
yann@1
   126
                                 ;;
yann@1
   127
                     mips*)      # for linux-2.6, 'make prepare' for mips doesn't 
yann@1
   128
                                 # actually create any symlinks.  Hope generic is ok.
yann@1
   129
                                 # Note that glibc ignores all -I flags passed in CFLAGS,
yann@1
   130
                                 # so you have to use -isystem.
yann@1
   131
                                 make ${PARALLELMFLAGS}                 \
yann@1
   132
                                      ARCH=${CT_KERNEL_ARCH} ${V_OPT}   \
yann@1
   133
                                      include/asm include/linux/version.h
yann@1
   134
                                 TARGET_CFLAGS="${TARGET_CFLAGS} -isystem ${LINUX_HEADER_DIR}/include/asm-mips/mach-generic"
yann@1
   135
                                 ;;
yann@1
   136
                     *)          make ${PARALLELMFLAGS}                 \
yann@1
   137
                                      ARCH=${CT_KERNEL_ARCH} ${V_OPT}   \
yann@1
   138
                                      include/asm include/linux/version.h
yann@1
   139
                                 ;;
yann@1
   140
                 esac
yann@1
   141
                 ;;
yann@1
   142
    esac 2>&1 |CT_DoLog DEBUG
yann@1
   143
yann@1
   144
    CT_DoLog EXTRA "Copying kernel headers"
yann@1
   145
    cp -rv include/asm-generic "${CT_HEADERS_DIR}/asm-generic" 2>&1 |CT_DoLog DEBUG
yann@1
   146
    cp -rv include/linux "${CT_HEADERS_DIR}" 2>&1 |CT_DoLog DEBUG
yann@1
   147
    cp -rv include/asm-${CT_KERNEL_ARCH} "${CT_HEADERS_DIR}/asm" 2>&1 |CT_DoLog DEBUG
yann@1
   148
}