mirror of
https://git.yoctoproject.org/poky
synced 2026-05-30 00:20:08 +00:00
kernel: Add KERNEL_IMAGETYPES to build multi types kernel at one time
Add KERNEL_IMAGETYPES to support building packaging and installing multi types of kernel images, such as zImage uImage, at one time. KERNEL_IMAGETYPE and KERNEL_ALT_IMAGETYPE work as before. (From OE-Core rev: 849b67b2e4820564b5e5c9bd4bb293c44351c5f3) Signed-off-by: He Zhe <zhe.he@windriver.com> Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
+125
-49
@@ -16,12 +16,53 @@ INITRAMFS_IMAGE ?= ""
|
||||
INITRAMFS_TASK ?= ""
|
||||
INITRAMFS_IMAGE_BUNDLE ?= ""
|
||||
|
||||
# KERNEL_VERSION is extracted from source code. It is evaluated as
|
||||
# None for the first parsing, since the code has not been fetched.
|
||||
# After the code is fetched, it will be evaluated as real version
|
||||
# number and cause kernel to be rebuilt. To avoid this, make
|
||||
# KERNEL_VERSION_NAME and KERNEL_VERSION_PKG_NAME depend on
|
||||
# LINUX_VERSION which is a constant.
|
||||
KERNEL_VERSION_NAME = "${@d.getVar('KERNEL_VERSION', True) or ""}"
|
||||
KERNEL_VERSION_NAME[vardepvalue] = "${LINUX_VERSION}"
|
||||
KERNEL_VERSION_PKG_NAME = "${@legitimize_package_name(d.getVar('KERNEL_VERSION', True))}"
|
||||
KERNEL_VERSION_PKG_NAME[vardepvalue] = "${LINUX_VERSION}"
|
||||
|
||||
python __anonymous () {
|
||||
import re
|
||||
|
||||
kerneltype = d.getVar('KERNEL_IMAGETYPE', True)
|
||||
# Merge KERNEL_IMAGETYPE and KERNEL_ALT_IMAGETYPE into KERNEL_IMAGETYPES
|
||||
type = d.getVar('KERNEL_IMAGETYPE', True) or ""
|
||||
alttype = d.getVar('KERNEL_ALT_IMAGETYPE', True) or ""
|
||||
types = d.getVar('KERNEL_IMAGETYPES', True) or ""
|
||||
if type not in types.split():
|
||||
types = (type + ' ' + types).strip()
|
||||
if alttype not in types.split():
|
||||
types = (alttype + ' ' + types).strip()
|
||||
d.setVar('KERNEL_IMAGETYPES', types)
|
||||
|
||||
d.setVar("KERNEL_IMAGETYPE_FOR_MAKE", re.sub(r'\.gz$', '', kerneltype))
|
||||
typeformake = re.sub(r'\.gz', '', types)
|
||||
d.setVar('KERNEL_IMAGETYPE_FOR_MAKE', typeformake)
|
||||
|
||||
for type in typeformake.split():
|
||||
typelower = type.lower()
|
||||
|
||||
d.appendVar('PACKAGES', ' ' + 'kernel-image-' + typelower)
|
||||
|
||||
d.setVar('FILES_kernel-image-' + typelower, '/boot/' + type + '*')
|
||||
|
||||
d.appendVar('RDEPENDS_kernel-image', ' ' + 'kernel-image-' + typelower)
|
||||
|
||||
d.setVar('PKG_kernel-image-' + typelower, 'kernel-image-' + typelower + '-${KERNEL_VERSION_PKG_NAME}')
|
||||
|
||||
d.setVar('ALLOW_EMPTY_kernel-image-' + typelower, '1')
|
||||
|
||||
imagedest = d.getVar('KERNEL_IMAGEDEST', True)
|
||||
priority = d.getVar('KERNEL_PRIORITY', True)
|
||||
postinst = '#!/bin/sh\n' + 'update-alternatives --install /' + imagedest + '/' + type + ' ' + type + ' ' + '/' + imagedest + '/' + type + '-${KERNEL_VERSION_NAME} ' + priority + ' || true' + '\n'
|
||||
d.setVar('pkg_postinst_kernel-image-' + typelower, postinst)
|
||||
|
||||
postrm = '#!/bin/sh\n' + 'update-alternatives --remove' + ' ' + type + ' ' + type + '-${KERNEL_VERSION_NAME} || true' + '\n'
|
||||
d.setVar('pkg_postrm_kernel-image-' + typelower, postrm)
|
||||
|
||||
image = d.getVar('INITRAMFS_IMAGE', True)
|
||||
if image:
|
||||
@@ -92,8 +133,8 @@ KERNEL_PRIORITY ?= "${@int(d.getVar('PV',1).split('-')[0].split('+')[0].split('.
|
||||
|
||||
KERNEL_RELEASE ?= "${KERNEL_VERSION}"
|
||||
|
||||
# Where built kernel lies in the kernel tree
|
||||
KERNEL_OUTPUT ?= "arch/${ARCH}/boot/${KERNEL_IMAGETYPE}"
|
||||
# The directory where built kernel lies in the kernel tree
|
||||
KERNEL_OUTPUT_DIR ?= "arch/${ARCH}/boot"
|
||||
KERNEL_IMAGEDEST = "boot"
|
||||
|
||||
#
|
||||
@@ -162,23 +203,48 @@ copy_initramfs() {
|
||||
echo "Finished copy of initramfs into ./usr"
|
||||
}
|
||||
|
||||
INITRAMFS_BASE_NAME = "${KERNEL_IMAGETYPE}-initramfs-${PV}-${PR}-${MACHINE}-${DATETIME}"
|
||||
INITRAMFS_BASE_NAME = "initramfs-${PV}-${PR}-${MACHINE}-${DATETIME}"
|
||||
INITRAMFS_BASE_NAME[vardepsexclude] = "DATETIME"
|
||||
do_bundle_initramfs () {
|
||||
if [ ! -z "${INITRAMFS_IMAGE}" -a x"${INITRAMFS_IMAGE_BUNDLE}" = x1 ]; then
|
||||
echo "Creating a kernel image with a bundled initramfs..."
|
||||
copy_initramfs
|
||||
if [ -e ${KERNEL_OUTPUT} ] ; then
|
||||
mv -f ${KERNEL_OUTPUT} ${KERNEL_OUTPUT}.bak
|
||||
fi
|
||||
# Backing up kernel image relies on its type(regular file or symbolic link)
|
||||
tmp_path=""
|
||||
for type in ${KERNEL_IMAGETYPES} ; do
|
||||
if [ -h ${KERNEL_OUTPUT_DIR}/$type ] ; then
|
||||
linkpath=`readlink -n ${KERNEL_OUTPUT_DIR}/$type`
|
||||
realpath=`readlink -fn ${KERNEL_OUTPUT_DIR}/$type`
|
||||
mv -f $realpath $realpath.bak
|
||||
tmp_path=$tmp_path" "$type"#"$linkpath"#"$realpath
|
||||
elif [ -f ${KERNEL_OUTPUT_DIR}/$type ]; then
|
||||
mv -f ${KERNEL_OUTPUT_DIR}/$type ${KERNEL_OUTPUT_DIR}/$type.bak
|
||||
tmp_path=$tmp_path" "$type"##"
|
||||
fi
|
||||
done
|
||||
use_alternate_initrd=CONFIG_INITRAMFS_SOURCE=${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.cpio
|
||||
kernel_do_compile
|
||||
mv -f ${KERNEL_OUTPUT} ${KERNEL_OUTPUT}.initramfs
|
||||
mv -f ${KERNEL_OUTPUT}.bak ${KERNEL_OUTPUT}
|
||||
# Restoring kernel image
|
||||
for tp in $tmp_path ; do
|
||||
type=`echo $tp|cut -d "#" -f 1`
|
||||
linkpath=`echo $tp|cut -d "#" -f 2`
|
||||
realpath=`echo $tp|cut -d "#" -f 3`
|
||||
if [ -n "$realpath" ]; then
|
||||
mv -f $realpath $realpath.initramfs
|
||||
mv -f $realpath.bak $realpath
|
||||
cd ${B}/${KERNEL_OUTPUT_DIR}
|
||||
ln -sf $linkpath.initramfs
|
||||
else
|
||||
mv -f ${KERNEL_OUTPUT_DIR}/$type ${KERNEL_OUTPUT_DIR}/$type.initramfs
|
||||
mv -f ${KERNEL_OUTPUT_DIR}/$type.bak ${KERNEL_OUTPUT_DIR}/$type
|
||||
fi
|
||||
done
|
||||
# Update install area
|
||||
echo "There is kernel image bundled with initramfs: ${B}/${KERNEL_OUTPUT}.initramfs"
|
||||
install -m 0644 ${B}/${KERNEL_OUTPUT}.initramfs ${D}/boot/${KERNEL_IMAGETYPE}-initramfs-${MACHINE}.bin
|
||||
echo "${B}/${KERNEL_OUTPUT}.initramfs"
|
||||
for type in ${KERNEL_IMAGETYPES} ; do
|
||||
echo "There is kernel image bundled with initramfs: ${B}/${KERNEL_OUTPUT_DIR}/$type.initramfs"
|
||||
install -m 0644 ${B}/${KERNEL_OUTPUT_DIR}/$type.initramfs ${D}/boot/$type-initramfs-${MACHINE}.bin
|
||||
echo "${B}/${KERNEL_OUTPUT_DIR}/$type.initramfs"
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -203,10 +269,15 @@ kernel_do_compile() {
|
||||
copy_initramfs
|
||||
use_alternate_initrd=CONFIG_INITRAMFS_SOURCE=${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.cpio
|
||||
fi
|
||||
oe_runmake ${KERNEL_IMAGETYPE_FOR_MAKE} ${KERNEL_ALT_IMAGETYPE} CC="${KERNEL_CC}" LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} $use_alternate_initrd
|
||||
if test "${KERNEL_IMAGETYPE_FOR_MAKE}.gz" = "${KERNEL_IMAGETYPE}"; then
|
||||
gzip -9c < "${KERNEL_IMAGETYPE_FOR_MAKE}" > "${KERNEL_OUTPUT}"
|
||||
fi
|
||||
for typeformake in ${KERNEL_IMAGETYPE_FOR_MAKE} ; do
|
||||
oe_runmake ${typeformake} CC="${KERNEL_CC}" LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} $use_alternate_initrd
|
||||
for type in ${KERNEL_IMAGETYPES} ; do
|
||||
if test "${typeformake}.gz" = "${type}"; then
|
||||
gzip -9c < "${typeformake}" > "${KERNEL_OUTPUT_DIR}/${type}"
|
||||
break;
|
||||
fi
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
do_compile_kernelmodules() {
|
||||
@@ -247,7 +318,9 @@ kernel_do_install() {
|
||||
#
|
||||
install -d ${D}/${KERNEL_IMAGEDEST}
|
||||
install -d ${D}/boot
|
||||
install -m 0644 ${KERNEL_OUTPUT} ${D}/${KERNEL_IMAGEDEST}/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}
|
||||
for type in ${KERNEL_IMAGETYPES} ; do
|
||||
install -m 0644 ${KERNEL_OUTPUT_DIR}/${type} ${D}/${KERNEL_IMAGEDEST}/${type}-${KERNEL_VERSION}
|
||||
done
|
||||
install -m 0644 System.map ${D}/boot/System.map-${KERNEL_VERSION}
|
||||
install -m 0644 .config ${D}/boot/config-${KERNEL_VERSION}
|
||||
install -m 0644 vmlinux ${D}/boot/vmlinux-${KERNEL_VERSION}
|
||||
@@ -375,12 +448,12 @@ EXPORT_FUNCTIONS do_compile do_install do_configure
|
||||
PACKAGES = "kernel kernel-base kernel-vmlinux kernel-image kernel-dev kernel-modules"
|
||||
FILES_${PN} = ""
|
||||
FILES_kernel-base = "/lib/modules/${KERNEL_VERSION}/modules.order /lib/modules/${KERNEL_VERSION}/modules.builtin"
|
||||
FILES_kernel-image = "/boot/${KERNEL_IMAGETYPE}*"
|
||||
FILES_kernel-image = ""
|
||||
FILES_kernel-dev = "/boot/System.map* /boot/Module.symvers* /boot/config* ${KERNEL_SRC_PATH} /lib/modules/${KERNEL_VERSION}/build"
|
||||
FILES_kernel-vmlinux = "/boot/vmlinux*"
|
||||
FILES_kernel-modules = ""
|
||||
RDEPENDS_kernel = "kernel-base"
|
||||
# Allow machines to override this dependency if kernel image files are
|
||||
# Allow machines to override this dependency if kernel image files are
|
||||
# not wanted in images as standard
|
||||
RDEPENDS_kernel-base ?= "kernel-image"
|
||||
PKG_kernel-image = "kernel-image-${@legitimize_package_name('${KERNEL_VERSION}')}"
|
||||
@@ -404,14 +477,6 @@ pkg_postinst_kernel-base () {
|
||||
fi
|
||||
}
|
||||
|
||||
pkg_postinst_kernel-image () {
|
||||
update-alternatives --install /${KERNEL_IMAGEDEST}/${KERNEL_IMAGETYPE} ${KERNEL_IMAGETYPE} /${KERNEL_IMAGEDEST}/${KERNEL_IMAGETYPE}-${KERNEL_VERSION} ${KERNEL_PRIORITY} || true
|
||||
}
|
||||
|
||||
pkg_postrm_kernel-image () {
|
||||
update-alternatives --remove ${KERNEL_IMAGETYPE} ${KERNEL_IMAGETYPE}-${KERNEL_VERSION} || true
|
||||
}
|
||||
|
||||
PACKAGESPLITFUNCS_prepend = "split_kernel_packages "
|
||||
|
||||
python split_kernel_packages () {
|
||||
@@ -432,13 +497,13 @@ do_kernel_link_vmlinux() {
|
||||
|
||||
do_strip() {
|
||||
if [ -n "${KERNEL_IMAGE_STRIP_EXTRA_SECTIONS}" ]; then
|
||||
if [ "${KERNEL_IMAGETYPE}" != "vmlinux" ]; then
|
||||
bbwarn "image type will not be stripped (not supported): ${KERNEL_IMAGETYPE}"
|
||||
if ! (echo "${KERNEL_IMAGETYPES}" | grep -wq "vmlinux"); then
|
||||
bbwarn "image type(s) will not be stripped (not supported): ${KERNEL_IMAGETYPES}"
|
||||
return
|
||||
fi
|
||||
|
||||
cd ${B}
|
||||
headers=`"$CROSS_COMPILE"readelf -S ${KERNEL_OUTPUT} | \
|
||||
headers=`"$CROSS_COMPILE"readelf -S ${KERNEL_OUTPUT_DIR}/vmlinux | \
|
||||
grep "^ \{1,\}\[[0-9 ]\{1,\}\] [^ ]" | \
|
||||
sed "s/^ \{1,\}\[[0-9 ]\{1,\}\] //" | \
|
||||
gawk '{print $1}'`
|
||||
@@ -448,7 +513,7 @@ do_strip() {
|
||||
bbwarn "Section not found: $str";
|
||||
fi
|
||||
|
||||
"$CROSS_COMPILE"strip -s -R $str ${KERNEL_OUTPUT}
|
||||
"$CROSS_COMPILE"strip -s -R $str ${KERNEL_OUTPUT_DIR}/vmlinux
|
||||
}; done
|
||||
|
||||
bbnote "KERNEL_IMAGE_STRIP_EXTRA_SECTIONS is set, stripping sections:" \
|
||||
@@ -467,20 +532,22 @@ do_sizecheck() {
|
||||
if [ -n "$invalid" ]; then
|
||||
die "Invalid KERNEL_IMAGE_MAXSIZE: ${KERNEL_IMAGE_MAXSIZE}, should be an integerx (The unit is Kbytes)"
|
||||
fi
|
||||
size=`du -ks ${B}/${KERNEL_OUTPUT} | awk '{ print $1}'`
|
||||
if [ $size -ge ${KERNEL_IMAGE_MAXSIZE} ]; then
|
||||
die "This kernel (size=$size(K) > ${KERNEL_IMAGE_MAXSIZE}(K)) is too big for your device. Please reduce the size of the kernel by making more of it modular."
|
||||
fi
|
||||
for type in ${KERNEL_IMAGETYPES} ; do
|
||||
size=`du -ks ${B}/${KERNEL_OUTPUT_DIR}/$type | awk '{print $1}'`
|
||||
if [ $size -ge ${KERNEL_IMAGE_MAXSIZE} ]; then
|
||||
warn "This kernel $type (size=$size(K) > ${KERNEL_IMAGE_MAXSIZE}(K)) is too big for your device. Please reduce the size of the kernel by making more of it modular."
|
||||
fi
|
||||
done
|
||||
fi
|
||||
}
|
||||
do_sizecheck[dirs] = "${B}"
|
||||
|
||||
addtask sizecheck before do_install after do_strip
|
||||
|
||||
KERNEL_IMAGE_BASE_NAME ?= "${KERNEL_IMAGETYPE}-${PKGE}-${PKGV}-${PKGR}-${MACHINE}-${DATETIME}"
|
||||
KERNEL_IMAGE_BASE_NAME ?= "${PKGE}-${PKGV}-${PKGR}-${MACHINE}-${DATETIME}"
|
||||
# Don't include the DATETIME variable in the sstate package signatures
|
||||
KERNEL_IMAGE_BASE_NAME[vardepsexclude] = "DATETIME"
|
||||
KERNEL_IMAGE_SYMLINK_NAME ?= "${KERNEL_IMAGETYPE}-${MACHINE}"
|
||||
KERNEL_IMAGE_SYMLINK_NAME ?= "${MACHINE}"
|
||||
MODULE_IMAGE_BASE_NAME ?= "modules-${PKGE}-${PKGV}-${PKGR}-${MACHINE}-${DATETIME}"
|
||||
MODULE_IMAGE_BASE_NAME[vardepsexclude] = "DATETIME"
|
||||
MODULE_TARBALL_BASE_NAME ?= "${MODULE_IMAGE_BASE_NAME}.tgz"
|
||||
@@ -489,28 +556,37 @@ MODULE_TARBALL_SYMLINK_NAME ?= "modules-${MACHINE}.tgz"
|
||||
MODULE_TARBALL_DEPLOY ?= "1"
|
||||
|
||||
kernel_do_deploy() {
|
||||
install -m 0644 ${KERNEL_OUTPUT} ${DEPLOYDIR}/${KERNEL_IMAGE_BASE_NAME}.bin
|
||||
for type in ${KERNEL_IMAGETYPES} ; do
|
||||
base_name=${type}-${KERNEL_IMAGE_BASE_NAME}
|
||||
install -m 0644 ${KERNEL_OUTPUT_DIR}/${type} ${DEPLOYDIR}/${base_name}.bin
|
||||
done
|
||||
if [ ${MODULE_TARBALL_DEPLOY} = "1" ] && (grep -q -i -e '^CONFIG_MODULES=y$' .config); then
|
||||
mkdir -p ${D}/lib
|
||||
tar -cvzf ${DEPLOYDIR}/${MODULE_TARBALL_BASE_NAME} -C ${D} lib
|
||||
ln -sf ${MODULE_TARBALL_BASE_NAME} ${DEPLOYDIR}/${MODULE_TARBALL_SYMLINK_NAME}
|
||||
fi
|
||||
|
||||
ln -sf ${KERNEL_IMAGE_BASE_NAME}.bin ${DEPLOYDIR}/${KERNEL_IMAGE_SYMLINK_NAME}.bin
|
||||
ln -sf ${KERNEL_IMAGE_BASE_NAME}.bin ${DEPLOYDIR}/${KERNEL_IMAGETYPE}
|
||||
for type in ${KERNEL_IMAGETYPES} ; do
|
||||
base_name=${type}-${KERNEL_IMAGE_BASE_NAME}
|
||||
symlink_name=${type}-${KERNEL_IMAGE_SYMLINK_NAME}
|
||||
ln -sf ${base_name}.bin ${DEPLOYDIR}/${symlink_name}.bin
|
||||
ln -sf ${base_name}.bin ${DEPLOYDIR}/${type}
|
||||
done
|
||||
|
||||
cp ${COREBASE}/meta/files/deploydir_readme.txt ${DEPLOYDIR}/README_-_DO_NOT_DELETE_FILES_IN_THIS_DIRECTORY.txt
|
||||
|
||||
cd ${B}
|
||||
# Update deploy directory
|
||||
if [ -e "${KERNEL_OUTPUT}.initramfs" ]; then
|
||||
echo "Copying deploy kernel-initramfs image and setting up links..."
|
||||
initramfs_base_name=${INITRAMFS_BASE_NAME}
|
||||
initramfs_symlink_name=${KERNEL_IMAGETYPE}-initramfs-${MACHINE}
|
||||
install -m 0644 ${KERNEL_OUTPUT}.initramfs ${DEPLOYDIR}/${initramfs_base_name}.bin
|
||||
cd ${DEPLOYDIR}
|
||||
ln -sf ${initramfs_base_name}.bin ${initramfs_symlink_name}.bin
|
||||
fi
|
||||
for type in ${KERNEL_IMAGETYPES} ; do
|
||||
if [ -e "${KERNEL_OUTPUT_DIR}/${type}.initramfs" ]; then
|
||||
echo "Copying deploy ${type} kernel-initramfs image and setting up links..."
|
||||
initramfs_base_name=${type}-${INITRAMFS_BASE_NAME}
|
||||
initramfs_symlink_name=${type}-initramfs-${MACHINE}
|
||||
install -m 0644 ${KERNEL_OUTPUT_DIR}/${type}.initramfs ${DEPLOYDIR}/${initramfs_base_name}.bin
|
||||
cd ${DEPLOYDIR}
|
||||
ln -sf ${initramfs_base_name}.bin ${initramfs_symlink_name}.bin
|
||||
fi
|
||||
done
|
||||
}
|
||||
do_deploy[cleandirs] = "${DEPLOYDIR}"
|
||||
do_deploy[dirs] = "${DEPLOYDIR} ${B}"
|
||||
|
||||
Reference in New Issue
Block a user