scripts/build/kernel/linux.sh
changeset 1990 c12158f27395
parent 1989 f357bc3abfa6
child 2228 aa02b51ce928
     1.1 --- a/scripts/build/kernel/linux.sh	Tue Jun 15 20:04:01 2010 +0200
     1.2 +++ b/scripts/build/kernel/linux.sh	Thu Jun 17 18:30:09 2010 +0200
     1.3 @@ -17,7 +17,9 @@
     1.4  
     1.5  # Download the kernel
     1.6  do_kernel_get() {
     1.7 -    if [ "${CT_KERNEL_LINUX_INSTALL}" = "y" ]; then
     1.8 +    if [    "${CT_KERNEL_LINUX_INSTALL}" = "y"  \
     1.9 +         -a "${CT_KERNEL_LINUX_CUSTOM}" != "y"  \
    1.10 +       ]; then
    1.11          CT_GetFile "linux-${CT_KERNEL_VERSION}" \
    1.12                     {ftp,http}://ftp.{de.,eu.,}kernel.org/pub/linux/kernel/v2.{6{,/testing},4,2}
    1.13      fi
    1.14 @@ -25,9 +27,43 @@
    1.15  
    1.16  # Extract kernel
    1.17  do_kernel_extract() {
    1.18 +    local tar_opt
    1.19      if [ "${CT_KERNEL_LINUX_INSTALL}" = "y" ]; then
    1.20 -        CT_Extract "linux-${CT_KERNEL_VERSION}"
    1.21 -        CT_Patch "linux" "${CT_KERNEL_VERSION}"
    1.22 +        if [ "${CT_KERNEL_LINUX_CUSTOM}" = "y" ]; then
    1.23 +            # We extract the custom linux tree into a directory with a
    1.24 +            # well-known name, and strip the leading directory component
    1.25 +            # of the extracted pathes. This is needed because we do not
    1.26 +            # know the value for this first component, because it is a
    1.27 +            # _custom_ tree.
    1.28 +            # Also, we have to protect from partial extraction using the
    1.29 +            # .extracting and .extracted locks (not using .patching and
    1.30 +            # .patched as we are *not* patching that kernel).
    1.31 +
    1.32 +            if [ -e "${CT_SRC_DIR}/.linux-custom.extracted" ]; then
    1.33 +                CT_DoLog DEBUG "Custom linux kernel tree already extracted"
    1.34 +                return 0
    1.35 +            fi
    1.36 +
    1.37 +            CT_TestAndAbort "Custom kernel tree partially extracted. Remove before resuming" -f "${CT_SRC_DIR}/.linux-custom.extracting"
    1.38 +            CT_DoExecLog DEBUG touch "${CT_SRC_DIR}/.linux-custom.extracting"
    1.39 +            CT_DoExecLog DEBUG mkdir "${CT_SRC_DIR}/linux-custom"
    1.40 +
    1.41 +            case "${CT_KERNEL_LINUX_CUSTOM_TARBALL}" in
    1.42 +                *.tar.bz2)      tar_opt=-j;;
    1.43 +                *.tar.gz|*.tgz) tar_opt=-z;;
    1.44 +                *.tar)          ;;
    1.45 +                *)              CT_Abort "Don't know how to handle '${CT_KERNEL_LINUX_CUSTOM_TARBALL}': unknown extension";;
    1.46 +            esac
    1.47 +            CT_DoLog EXTRA "Extracting custom linux kernel"
    1.48 +            CT_DoExecLog ALL tar x -C "${CT_SRC_DIR}/linux-custom"      \
    1.49 +                                 --strip-components 1 -v ${tar_opt}     \
    1.50 +                                 -f "${CT_KERNEL_LINUX_CUSTOM_TARBALL}"
    1.51 +
    1.52 +            CT_DoExecLog ALL mv -v "${CT_SRC_DIR}/.linux-custom.extracting" "${CT_SRC_DIR}/.linux-custom.extracted"
    1.53 +        else
    1.54 +            CT_Extract "linux-${CT_KERNEL_VERSION}"
    1.55 +            CT_Patch "linux" "${CT_KERNEL_VERSION}"
    1.56 +        fi
    1.57      fi
    1.58  }
    1.59  
    1.60 @@ -46,17 +82,22 @@
    1.61  
    1.62  # Install kernel headers using headers_install from kernel sources.
    1.63  do_kernel_install() {
    1.64 +    local kernel_path
    1.65 +
    1.66      CT_DoLog DEBUG "Using kernel's headers_install"
    1.67  
    1.68      mkdir -p "${CT_BUILD_DIR}/build-kernel-headers"
    1.69 -    cd "${CT_BUILD_DIR}/build-kernel-headers"
    1.70  
    1.71 +    kernel_path="${CT_SRC_DIR}/linux-${CT_KERNEL_VERSION}"
    1.72 +    if [ "${CT_KERNEL_LINUX_CUSTOM}" = "y" ]; then
    1.73 +        kernel_path="${CT_SRC_DIR}/linux-custom"
    1.74 +    fi
    1.75      V_OPT="V=${CT_KERNEL_LINUX_VERBOSE_LEVEL}"
    1.76  
    1.77      CT_DoLog EXTRA "Installing kernel headers"
    1.78      CT_DoExecLog ALL                                    \
    1.79 -    make -C "${CT_SRC_DIR}/linux-${CT_KERNEL_VERSION}"  \
    1.80 -         O=$(pwd)                                       \
    1.81 +    make -C "${kernel_path}"                            \
    1.82 +         O="${CT_BUILD_DIR}/build-kernel-headers"       \
    1.83           ARCH=${CT_ARCH}                                \
    1.84           INSTALL_HDR_PATH="${CT_SYSROOT_DIR}/usr"       \
    1.85           ${V_OPT}                                       \
    1.86 @@ -65,8 +106,8 @@
    1.87      if [ "${CT_KERNEL_LINUX_INSTALL_CHECK}" = "y" ]; then
    1.88          CT_DoLog EXTRA "Checking installed headers"
    1.89          CT_DoExecLog ALL                                    \
    1.90 -        make -C "${CT_SRC_DIR}/linux-${CT_KERNEL_VERSION}"  \
    1.91 -             O=$(pwd)                                       \
    1.92 +        make -C "${kernel_path}"                            \
    1.93 +             O="${CT_BUILD_DIR}/build-kernel-headers"       \
    1.94               ARCH=${CT_ARCH}                                \
    1.95               INSTALL_HDR_PATH="${CT_SYSROOT_DIR}/usr"       \
    1.96               ${V_OPT}                                       \