summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/kernel/linux.in25
-rw-r--r--scripts/build/kernel/linux.sh57
2 files changed, 71 insertions, 11 deletions
diff --git a/config/kernel/linux.in b/config/kernel/linux.in
index d5afdf9..da17dbb 100644
--- a/config/kernel/linux.in
+++ b/config/kernel/linux.in
@@ -83,6 +83,19 @@ config KERNEL_V_2_6_27_47
See the original announcement by Adrian Bunk in the following mailing list
entry: http://marc.info/?l=linux-kernel&m=122375909403298&w=2
+config KERNEL_LINUX_CUSTOM
+ bool
+ prompt "custom tarball"
+ help
+ Use a local tarball of a complete kernel source tree.
+
+config KERNEL_LINUX_CUSTOM_TARBALL
+ string
+ prompt "Path to custom tarball"
+ depends on KERNEL_LINUX_CUSTOM
+ help
+ Enter here the path to the tarball of your full kernel tree.
+
endchoice
config KERNEL_VERSION
@@ -144,10 +157,16 @@ endif # KERNEL_LINUX_INSTALL
config KERNEL_LINUX_USE_CUSTOM_HEADERS
bool
- prompt "custom, and/or pre-installed, headers tree"
+ prompt "pre-installed headers tree"
help
- If you have some kernel headers lying around, you can enter the path
- below.
+ If you have some pre-installed kernel headers lying around, you can
+ enter the path to these headers, below, they will be copied from
+ there, and into the toolchain's sysroot.
+
+ Note:
+ This will *not* let you use a complete kernel tree!
+ If you want to use your own full kernel tree, then you want to
+ say 'Y' to KERNEL_LINUX_INSTALL, above, and select KERNEL_LINUX_CUSTOM.
if KERNEL_LINUX_USE_CUSTOM_HEADERS
diff --git a/scripts/build/kernel/linux.sh b/scripts/build/kernel/linux.sh
index e5ea57f..a6898d8 100644
--- a/scripts/build/kernel/linux.sh
+++ b/scripts/build/kernel/linux.sh
@@ -17,7 +17,9 @@ CT_DoKernelTupleValues() {
# Download the kernel
do_kernel_get() {
- if [ "${CT_KERNEL_LINUX_INSTALL}" = "y" ]; then
+ if [ "${CT_KERNEL_LINUX_INSTALL}" = "y" \
+ -a "${CT_KERNEL_LINUX_CUSTOM}" != "y" \
+ ]; then
CT_GetFile "linux-${CT_KERNEL_VERSION}" \
{ftp,http}://ftp.{de.,eu.,}kernel.org/pub/linux/kernel/v2.{6{,/testing},4,2}
fi
@@ -25,9 +27,43 @@ do_kernel_get() {
# Extract kernel
do_kernel_extract() {
+ local tar_opt
if [ "${CT_KERNEL_LINUX_INSTALL}" = "y" ]; then
- CT_Extract "linux-${CT_KERNEL_VERSION}"
- CT_Patch "linux" "${CT_KERNEL_VERSION}"
+ if [ "${CT_KERNEL_LINUX_CUSTOM}" = "y" ]; then
+ # We extract the custom linux tree into a directory with a
+ # well-known name, and strip the leading directory component
+ # of the extracted pathes. This is needed because we do not
+ # know the value for this first component, because it is a
+ # _custom_ tree.
+ # Also, we have to protect from partial extraction using the
+ # .extracting and .extracted locks (not using .patching and
+ # .patched as we are *not* patching that kernel).
+
+ if [ -e "${CT_SRC_DIR}/.linux-custom.extracted" ]; then
+ CT_DoLog DEBUG "Custom linux kernel tree already extracted"
+ return 0
+ fi
+
+ CT_TestAndAbort "Custom kernel tree partially extracted. Remove before resuming" -f "${CT_SRC_DIR}/.linux-custom.extracting"
+ CT_DoExecLog DEBUG touch "${CT_SRC_DIR}/.linux-custom.extracting"
+ CT_DoExecLog DEBUG mkdir "${CT_SRC_DIR}/linux-custom"
+
+ case "${CT_KERNEL_LINUX_CUSTOM_TARBALL}" in
+ *.tar.bz2) tar_opt=-j;;
+ *.tar.gz|*.tgz) tar_opt=-z;;
+ *.tar) ;;
+ *) CT_Abort "Don't know how to handle '${CT_KERNEL_LINUX_CUSTOM_TARBALL}': unknown extension";;
+ esac
+ CT_DoLog EXTRA "Extracting custom linux kernel"
+ CT_DoExecLog ALL tar x -C "${CT_SRC_DIR}/linux-custom" \
+ --strip-components 1 -v ${tar_opt} \
+ -f "${CT_KERNEL_LINUX_CUSTOM_TARBALL}"
+
+ CT_DoExecLog ALL mv -v "${CT_SRC_DIR}/.linux-custom.extracting" "${CT_SRC_DIR}/.linux-custom.extracted"
+ else
+ CT_Extract "linux-${CT_KERNEL_VERSION}"
+ CT_Patch "linux" "${CT_KERNEL_VERSION}"
+ fi
fi
}
@@ -46,17 +82,22 @@ do_kernel_headers() {
# Install kernel headers using headers_install from kernel sources.
do_kernel_install() {
+ local kernel_path
+
CT_DoLog DEBUG "Using kernel's headers_install"
mkdir -p "${CT_BUILD_DIR}/build-kernel-headers"
- cd "${CT_BUILD_DIR}/build-kernel-headers"
+ kernel_path="${CT_SRC_DIR}/linux-${CT_KERNEL_VERSION}"
+ if [ "${CT_KERNEL_LINUX_CUSTOM}" = "y" ]; then
+ kernel_path="${CT_SRC_DIR}/linux-custom"
+ fi
V_OPT="V=${CT_KERNEL_LINUX_VERBOSE_LEVEL}"
CT_DoLog EXTRA "Installing kernel headers"
CT_DoExecLog ALL \
- make -C "${CT_SRC_DIR}/linux-${CT_KERNEL_VERSION}" \
- O=$(pwd) \
+ make -C "${kernel_path}" \
+ O="${CT_BUILD_DIR}/build-kernel-headers" \
ARCH=${CT_ARCH} \
INSTALL_HDR_PATH="${CT_SYSROOT_DIR}/usr" \
${V_OPT} \
@@ -65,8 +106,8 @@ do_kernel_install() {
if [ "${CT_KERNEL_LINUX_INSTALL_CHECK}" = "y" ]; then
CT_DoLog EXTRA "Checking installed headers"
CT_DoExecLog ALL \
- make -C "${CT_SRC_DIR}/linux-${CT_KERNEL_VERSION}" \
- O=$(pwd) \
+ make -C "${kernel_path}" \
+ O="${CT_BUILD_DIR}/build-kernel-headers" \
ARCH=${CT_ARCH} \
INSTALL_HDR_PATH="${CT_SYSROOT_DIR}/usr" \
${V_OPT} \