* [PATCH v2 0/2] Yocto Bug #6945 @ 2016-02-19 9:56 zhe.he 2016-02-19 9:56 ` [PATCH v2 1/2] kernel: Add KERNEL_IMAGETYPES to build multi types kernel at one time zhe.he 2016-02-19 9:56 ` [PATCH v2 2/2] kernel: Make symbol link to vmlinuz in boot directory zhe.he 0 siblings, 2 replies; 7+ messages in thread From: zhe.he @ 2016-02-19 9:56 UTC (permalink / raw) To: openembedded-core From: He Zhe <zhe.he@windriver.com> v1 to v2: - Change KERNEL_OUTPUT to KERNEL_OUTPUT_DIR and update comments - Update related doc files - Replace all KERNEL_ALT_IMAGETYPEs with KERNEL_IMAGETYPES - Link built vmlinuz to boot directory for reference The following changes since commit ed20c6ca446a8788615e497bd4452195537deab5: epiphany: Add libxml2-native to DEPENDS (2016-02-19 01:01:26 +0000) are available in the git repository at: git://git.yoctoproject.org/poky-contrib zhe/yocto-bug-6945 http://git.yoctoproject.org/cgit/cgit.cgi/poky-contrib/commit/?h=zhe/yocto-bug-6945 for you to fetch changes up to 5ddb8ef58e1cd3c4b95de6439894510641f2e70a: kernel: Make symbol link to vmlinuz in boot directory (2016-02-19 04:23:28 -0500) ---------------------------------------------------------------- He Zhe (2): kernel: Add KERNEL_IMAGETYPES to build multi types kernel at one time kernel: Make symbol link to vmlinuz in boot directory documentation/ref-manual/ref-tasks.xml | 8 +- documentation/ref-manual/ref-variables.xml | 10 +- meta-yocto-bsp/conf/machine/edgerouter.conf | 2 +- meta/classes/kernel-fitimage.bbclass | 20 ++- meta/classes/kernel-grub.bbclass | 44 +++-- meta/classes/kernel-uimage.bbclass | 22 +-- meta/classes/kernel.bbclass | 184 ++++++++++++++------- meta/conf/documentation.conf | 3 +- meta/conf/machine/qemumips.conf | 2 +- meta/conf/machine/qemumips64.conf | 2 +- meta/recipes-kernel/linux/linux-dtb.inc | 49 +++--- meta/recipes-kernel/linux/linux-yocto.inc | 2 +- .../target/arch/mips/conf/machine/machine.conf | 2 +- .../target/arch/mips64/conf/machine/machine.conf | 2 +- .../target/arch/qemu/conf/machine/machine.conf | 2 +- 15 files changed, 228 insertions(+), 126 deletions(-) -- 1.9.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 1/2] kernel: Add KERNEL_IMAGETYPES to build multi types kernel at one time 2016-02-19 9:56 [PATCH v2 0/2] Yocto Bug #6945 zhe.he @ 2016-02-19 9:56 ` zhe.he 2016-02-19 15:46 ` Bruce Ashfield 2016-02-19 9:56 ` [PATCH v2 2/2] kernel: Make symbol link to vmlinuz in boot directory zhe.he 1 sibling, 1 reply; 7+ messages in thread From: zhe.he @ 2016-02-19 9:56 UTC (permalink / raw) To: openembedded-core From: He Zhe <zhe.he@windriver.com> Add KERNEL_IMAGETYPES to support building packaging and installing multi types of kernel images, such as zImage uImage, at one time. KERNEL_IMAGETYPE works as before. All KERNEL_ALT_IMAGETYPEs are replaced by KERNEL_IMAGETYPES. Fixes [YOCTO #6945]. Signed-off-by: He Zhe <zhe.he@windriver.com> --- documentation/ref-manual/ref-variables.xml | 10 +- meta-yocto-bsp/conf/machine/edgerouter.conf | 2 +- meta/classes/kernel-fitimage.bbclass | 20 +-- meta/classes/kernel-grub.bbclass | 44 ++++-- meta/classes/kernel-uimage.bbclass | 22 +-- meta/classes/kernel.bbclass | 171 +++++++++++++++------ meta/conf/documentation.conf | 1 + meta/conf/machine/qemumips.conf | 2 +- meta/conf/machine/qemumips64.conf | 2 +- meta/recipes-kernel/linux/linux-dtb.inc | 49 +++--- .../target/arch/mips/conf/machine/machine.conf | 2 +- .../target/arch/mips64/conf/machine/machine.conf | 2 +- .../target/arch/qemu/conf/machine/machine.conf | 2 +- 13 files changed, 214 insertions(+), 115 deletions(-) diff --git a/documentation/ref-manual/ref-variables.xml b/documentation/ref-manual/ref-variables.xml index a76a8c2..a8e4fd8 100644 --- a/documentation/ref-manual/ref-variables.xml +++ b/documentation/ref-manual/ref-variables.xml @@ -6417,14 +6417,14 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3" </glossdef> </glossentry> - <glossentry id='var-KERNEL_ALT_IMAGETYPE'><glossterm>KERNEL_ALT_IMAGETYPE</glossterm> + <glossentry id='var-KERNEL_IMAGETYPES'><glossterm>KERNEL_IMAGETYPES</glossterm> <info> - KERNEL_ALT_IMAGETYPE[doc] = "Specifies an alternate kernel image type for creation." + KERNEL_IMAGETYPES[doc] = "Specifies alternate kernel image types for creation." </info> <glossdef> <para role="glossdeffirst"> <!-- <para role="glossdeffirst"><imagedata fileref="figures/define-generic.png" /> --> - Specifies an alternate kernel image type for creation in + Specifies alternate kernel image types for creation in addition to the kernel image type specified using the <link linkend='var-KERNEL_IMAGETYPE'><filename>KERNEL_IMAGETYPE</filename></link> variable. @@ -6612,8 +6612,8 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3" </para> <para> - If you want to build an alternate kernel image type, use the - <link linkend='var-KERNEL_ALT_IMAGETYPE'><filename>KERNEL_ALT_IMAGETYPE</filename></link> + If you want to build alternate kernel image types, use the + <link linkend='var-KERNEL_IMAGETYPES'><filename>KERNEL_IMAGETYPES</filename></link> variable. </para> </glossdef> diff --git a/meta-yocto-bsp/conf/machine/edgerouter.conf b/meta-yocto-bsp/conf/machine/edgerouter.conf index 476e690..affd568 100644 --- a/meta-yocto-bsp/conf/machine/edgerouter.conf +++ b/meta-yocto-bsp/conf/machine/edgerouter.conf @@ -7,7 +7,7 @@ require conf/machine/include/tune-mips64.inc MACHINE_FEATURES = "pci ext2 ext3 serial" KERNEL_IMAGETYPE = "vmlinux" -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" +KERNEL_IMAGETYPES = "vmlinux.bin" KERNEL_IMAGE_STRIP_EXTRA_SECTIONS = ".comment" PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto" diff --git a/meta/classes/kernel-fitimage.bbclass b/meta/classes/kernel-fitimage.bbclass index f1b409c..51df19d 100644 --- a/meta/classes/kernel-fitimage.bbclass +++ b/meta/classes/kernel-fitimage.bbclass @@ -1,8 +1,8 @@ inherit kernel-uboot python __anonymous () { - kerneltype = d.getVar('KERNEL_IMAGETYPE', True) - if kerneltype == 'fitImage': + kerneltypes = d.getVar('KERNEL_IMAGETYPES', True) or "" + if 'fitImage' in kerneltypes.split(): depends = d.getVar("DEPENDS", True) depends = "%s u-boot-mkimage-native dtc-native" % depends d.setVar("DEPENDS", depends) @@ -10,7 +10,9 @@ python __anonymous () { # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal # to kernel.bbclass . We have to override it, since we pack zImage # (at least for now) into the fitImage . - d.setVar("KERNEL_IMAGETYPE_FOR_MAKE", "zImage") + typeformake = d.getVar("KERNEL_IMAGETYPE_FOR_MAKE", True) or "" + if 'fitImage' in typeformake.split(): + d.setVar('KERNEL_IMAGETYPE_FOR_MAKE', typeformake.replace('fitImage', 'zImage')) image = d.getVar('INITRAMFS_IMAGE', True) if image: @@ -154,7 +156,7 @@ EOF } do_assemble_fitimage() { - if test "x${KERNEL_IMAGETYPE}" = "xfitImage" ; then + if echo ${KERNEL_IMAGETYPES} | grep -Pq "\bfitImage\b"; then kernelcount=1 dtbcount="" rm -f fit-image.its @@ -217,14 +219,14 @@ addtask assemble_fitimage before do_install after do_compile kernel_do_deploy_append() { # Update deploy directory - if test "x${KERNEL_IMAGETYPE}" = "xfitImage" ; then + if echo ${KERNEL_IMAGETYPES} | grep -Pq "\bfitImage\b"; then cd ${B} echo "Copying fit-image.its source file..." - its_base_name="${KERNEL_IMAGETYPE}-its-${PV}-${PR}-${MACHINE}-${DATETIME}" - its_symlink_name=${KERNEL_IMAGETYPE}-its-${MACHINE} + its_base_name="fitImage-its-${PV}-${PR}-${MACHINE}-${DATETIME}" + its_symlink_name=fitImage-its-${MACHINE} install -m 0644 fit-image.its ${DEPLOYDIR}/${its_base_name}.its - linux_bin_base_name="${KERNEL_IMAGETYPE}-linux.bin-${PV}-${PR}-${MACHINE}-${DATETIME}" - linux_bin_symlink_name=${KERNEL_IMAGETYPE}-linux.bin-${MACHINE} + linux_bin_base_name="fitImage-linux.bin-${PV}-${PR}-${MACHINE}-${DATETIME}" + linux_bin_symlink_name=fitImage-linux.bin-${MACHINE} install -m 0644 linux.bin ${DEPLOYDIR}/${linux_bin_base_name}.bin cd ${DEPLOYDIR} diff --git a/meta/classes/kernel-grub.bbclass b/meta/classes/kernel-grub.bbclass index a63f482..f7dcc07 100644 --- a/meta/classes/kernel-grub.bbclass +++ b/meta/classes/kernel-grub.bbclass @@ -10,41 +10,44 @@ # updates the new kernel as the boot priority. # -pkg_preinst_kernel-image_append () { +python __anonymous () { + import re + + preinst = ''' # Parsing confliction [ -f "$D/boot/grub/menu.list" ] && grubcfg="$D/boot/grub/menu.list" [ -f "$D/boot/grub/grub.cfg" ] && grubcfg="$D/boot/grub/grub.cfg" if [ -n "$grubcfg" ]; then # Dereference symlink to avoid confliction with new kernel name. - if grep -q "/${KERNEL_IMAGETYPE} \+root=" $grubcfg; then - if [ -L "$D/boot/${KERNEL_IMAGETYPE}" ]; then - kimage=`realpath $D/boot/${KERNEL_IMAGETYPE} 2>/dev/null` + if grep -q "/KERNEL_IMAGETYPE \+root=" $grubcfg; then + if [ -L "$D/boot/KERNEL_IMAGETYPE" ]; then + kimage=`realpath $D/boot/KERNEL_IMAGETYPE 2>/dev/null` if [ -f "$D$kimage" ]; then - sed -i "s:${KERNEL_IMAGETYPE} \+root=:${kimage##*/} root=:" $grubcfg + sed -i "s:KERNEL_IMAGETYPE \+root=:${kimage##*/} root=:" $grubcfg fi fi fi # Rename old kernel if it conflicts with new kernel name. - if grep -q "/${KERNEL_IMAGETYPE}-${KERNEL_VERSION} \+root=" $grubcfg; then - if [ -f "$D/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}" ]; then + if grep -q "/KERNEL_IMAGETYPE-${KERNEL_VERSION} \+root=" $grubcfg; then + if [ -f "$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}" ]; then timestamp=`date +%s` - kimage="$D/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}-$timestamp-back" - sed -i "s:${KERNEL_IMAGETYPE}-${KERNEL_VERSION} \+root=:${kimage##*/} root=:" $grubcfg - mv "$D/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}" "$kimage" + kimage="$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}-$timestamp-back" + sed -i "s:KERNEL_IMAGETYPE-${KERNEL_VERSION} \+root=:${kimage##*/} root=:" $grubcfg + mv "$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}" "$kimage" fi fi fi -} +''' -pkg_postinst_kernel-image_prepend () { + postinst = ''' get_new_grub_cfg() { grubcfg="$1" old_image="$2" - title="Update ${KERNEL_IMAGETYPE}-${KERNEL_VERSION}-${PV}" + title="Update KERNEL_IMAGETYPE-${KERNEL_VERSION}-${PV}" if [ "${grubcfg##*/}" = "grub.cfg" ]; then rootfs=`grep " *linux \+[^ ]\+ \+root=" $grubcfg -m 1 | \ - sed "s#${old_image}#${old_image%/*}/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}#"` + sed "s#${old_image}#${old_image%/*}/KERNEL_IMAGETYPE-${KERNEL_VERSION}#"` echo "menuentry \"$title\" {" echo " set root=(hd0,1)" @@ -52,7 +55,7 @@ pkg_postinst_kernel-image_prepend () { echo "}" elif [ "${grubcfg##*/}" = "menu.list" ]; then rootfs=`grep "kernel \+[^ ]\+ \+root=" $grubcfg -m 1 | \ - sed "s#${old_image}#${old_image%/*}/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}#"` + sed "s#${old_image}#${old_image%/*}/KERNEL_IMAGETYPE-${KERNEL_VERSION}#"` echo "default 0" echo "timeout 30" @@ -87,5 +90,16 @@ pkg_postinst_kernel-image_prepend () { mv $grubcfgtmp $grubcfg echo "Caution! Update kernel may affect kernel-module!" fi +''' + + imagetypes = d.getVar('KERNEL_IMAGETYPES', True) + imagetypes = re.sub(r'\.gz$', '', imagetypes) + + for type in imagetypes.split(): + typelower = type.lower() + preinst_append = preinst.replace('KERNEL_IMAGETYPE', type) + postinst_prepend = postinst.replace('KERNEL_IMAGETYPE', type) + d.setVar('pkg_preinst_kernel-image-' + typelower + '_append', preinst_append) + d.setVar('pkg_postinst_kernel-image-' + typelower + '_prepend', postinst_prepend) } diff --git a/meta/classes/kernel-uimage.bbclass b/meta/classes/kernel-uimage.bbclass index f73965b..a238ce4 100644 --- a/meta/classes/kernel-uimage.bbclass +++ b/meta/classes/kernel-uimage.bbclass @@ -1,23 +1,25 @@ inherit kernel-uboot python __anonymous () { - kerneltype = d.getVar('KERNEL_IMAGETYPE', True) - if kerneltype == 'uImage': + if "uImage" in (d.getVar('KERNEL_IMAGETYPES', True) or "").split(): depends = d.getVar("DEPENDS", True) depends = "%s u-boot-mkimage-native" % depends d.setVar("DEPENDS", depends) - # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal - # to kernel.bbclass . We override the variable here, since we need - # to build uImage using the kernel build system if and only if - # KEEPUIMAGE == yes. Otherwise, we pack compressed vmlinux into - # the uImage . - if d.getVar("KEEPUIMAGE", True) != 'yes': - d.setVar("KERNEL_IMAGETYPE_FOR_MAKE", "zImage") + # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal + # to kernel.bbclass . We override the variable here, since we need + # to build uImage using the kernel build system if and only if + # KEEPUIMAGE == yes. Otherwise, we pack compressed vmlinux into + # the uImage . + if d.getVar("KEEPUIMAGE", True) != 'yes': + typeformake = d.getVar("KERNEL_IMAGETYPE_FOR_MAKE", True) or "" + if "uImage" in typeformake.split(): + typeformake.replace('uImage', 'zImage') + d.setVar('KERNEL_IMAGETYPE_FOR_MAKE', typeformake) } do_uboot_mkimage() { - if test "x${KERNEL_IMAGETYPE}" = "xuImage" ; then + if echo "${KERNEL_IMAGETYPES}" | grep -Pq "\buImage\b"; then if test "x${KEEPUIMAGE}" != "xyes" ; then uboot_prep_kimage diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass index c3eab50..6db2e2e 100644 --- a/meta/classes/kernel.bbclass +++ b/meta/classes/kernel.bbclass @@ -16,12 +16,48 @@ 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) + type = d.getVar('KERNEL_IMAGETYPE', True) or "" + types = d.getVar('KERNEL_IMAGETYPES', True) or "" + if type not in types.split(): + types = (type + ' ' + types).strip() + d.setVar('KERNEL_IMAGETYPES', types) + 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') - d.setVar("KERNEL_IMAGETYPE_FOR_MAKE", re.sub(r'\.gz$', '', kerneltype)) + 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 +128,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" # @@ -119,8 +155,6 @@ KERNEL_EXTRA_ARGS ?= "" # We don't want to override kernel Makefile variables from the environment EXTRA_OEMAKE = "" -KERNEL_ALT_IMAGETYPE ??= "" - # Define where the kernel headers are installed on the target as well as where # they are staged. KERNEL_SRC_PATH = "/usr/src/kernel" @@ -166,23 +200,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 + # Backuping 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 } @@ -207,10 +266,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 + oe_runmake ${KERNEL_IMAGETYPE_FOR_MAKE} CC="${KERNEL_CC}" LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} $use_alternate_initrd + for typeformake in ${KERNEL_IMAGETYPE_FOR_MAKE} ; do + 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() { @@ -251,7 +315,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} @@ -365,12 +431,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}')}" @@ -394,14 +460,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 () { @@ -422,13 +480,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 -q "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}'` @@ -438,7 +496,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:" \ @@ -457,20 +515,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 + die "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" @@ -479,28 +539,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}" diff --git a/meta/conf/documentation.conf b/meta/conf/documentation.conf index 00a69da..b3969b0 100644 --- a/meta/conf/documentation.conf +++ b/meta/conf/documentation.conf @@ -246,6 +246,7 @@ KERNEL_CLASSES[doc] = "A list of classes defining kernel image types that kernel KERNEL_EXTRA_ARGS[doc] = "Specifies additional make command-line arguments the OpenEmbedded build system passes on when compiling the kernel." KERNEL_FEATURES[doc] = "Includes additional metadata from the Yocto Project kernel Git repository. The metadata you add through this variable includes config fragments and features descriptions." KERNEL_IMAGETYPE[doc] = "The type of kernel to build for a device, usually set by the machine configuration files and defaults to 'zImage'." +KERNEL_IMAGETYPES[doc] = "The list of types of kernel to build for a device, usually set by the machine configuration files and defaults to KERNEL_IMAGETYPE." KERNEL_MODULE_AUTOLOAD[doc] = "Lists kernel modules that need to be auto-loaded during boot" KERNEL_MODULE_PROBECONF[doc] = "Lists kernel modules for which the build system expects to find module_conf_* values that specify configuration for each of the modules" KERNEL_PATH[doc] = "The location of the kernel sources. This variable is set to the value of the STAGING_KERNEL_DIR within the module class (module.bbclass)." diff --git a/meta/conf/machine/qemumips.conf b/meta/conf/machine/qemumips.conf index fbf8137..67ce161 100644 --- a/meta/conf/machine/qemumips.conf +++ b/meta/conf/machine/qemumips.conf @@ -6,7 +6,7 @@ require conf/machine/include/qemu.inc require conf/machine/include/tune-mips32r2.inc KERNEL_IMAGETYPE = "vmlinux" -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" +KERNEL_IMAGETYPES = "vmlinux.bin" SERIAL_CONSOLES = "115200;ttyS0 115200;ttyS1" diff --git a/meta/conf/machine/qemumips64.conf b/meta/conf/machine/qemumips64.conf index 8c3f1fe..393212e 100644 --- a/meta/conf/machine/qemumips64.conf +++ b/meta/conf/machine/qemumips64.conf @@ -6,7 +6,7 @@ require conf/machine/include/qemu.inc require conf/machine/include/tune-mips64.inc KERNEL_IMAGETYPE = "vmlinux" -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" +KERNEL_IMAGETYPES = "vmlinux.bin" SERIAL_CONSOLES = "115200;ttyS0 115200;ttyS1" diff --git a/meta/recipes-kernel/linux/linux-dtb.inc b/meta/recipes-kernel/linux/linux-dtb.inc index 651a19e..74f5ef8 100644 --- a/meta/recipes-kernel/linux/linux-dtb.inc +++ b/meta/recipes-kernel/linux/linux-dtb.inc @@ -34,9 +34,12 @@ do_install_append() { for DTB in ${KERNEL_DEVICETREE}; do DTB=`normalize_dtb "${DTB}"` DTB_BASE_NAME=`basename ${DTB} .dtb` - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` - DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` - install -m 0644 ${DTB_PATH} ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do + symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` + DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` + install -m 0644 ${DTB_PATH} ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb + done done } @@ -44,31 +47,39 @@ do_deploy_append() { for DTB in ${KERNEL_DEVICETREE}; do DTB=`normalize_dtb "${DTB}"` DTB_BASE_NAME=`basename ${DTB} .dtb` - DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` - DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` - install -d ${DEPLOYDIR} - install -m 0644 ${DTB_PATH} ${DEPLOYDIR}/${DTB_NAME}.dtb - ln -sf ${DTB_NAME}.dtb ${DEPLOYDIR}/${DTB_SYMLINK_NAME}.dtb + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do + base_name=${type}"-"${KERNEL_IMAGE_BASE_NAME} + symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} + DTB_NAME=`echo ${base_name} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` + DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` + install -d ${DEPLOYDIR} + install -m 0644 ${DTB_PATH} ${DEPLOYDIR}/${DTB_NAME}.dtb + ln -sf ${DTB_NAME}.dtb ${DEPLOYDIR}/${DTB_SYMLINK_NAME}.dtb + done done } pkg_postinst_kernel-devicetree () { cd /${KERNEL_IMAGEDEST} - for DTB in ${KERNEL_DEVICETREE} - do - DTB_BASE_NAME=`basename ${DTB} | awk -F "." '{print $1}'` - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` - update-alternatives --install /${KERNEL_IMAGEDEST}/${DTB_BASE_NAME}.dtb ${DTB_BASE_NAME}.dtb /boot/devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true + for DTB in ${KERNEL_DEVICETREE}; do + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do + symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} + DTB_BASE_NAME=`basename ${DTB} | awk -F "." '{print $1}'` + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` + update-alternatives --install /${KERNEL_IMAGEDEST}/${DTB_BASE_NAME}.dtb ${DTB_BASE_NAME}.dtb /boot/devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true + done done } pkg_postrm_kernel-devicetree () { cd /${KERNEL_IMAGEDEST} - for DTB in ${KERNEL_DEVICETREE} - do - DTB_BASE_NAME=`basename ${DTB} | awk -F "." '{print $1}'` - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` - update-alternatives --remove ${DTB_BASE_NAME}.dtb /boot/devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true + for DTB in ${KERNEL_DEVICETREE}; do + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do + symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} + DTB_BASE_NAME=`basename ${DTB} | awk -F "." '{print $1}'` + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` + update-alternatives --remove ${DTB_BASE_NAME}.dtb /boot/devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true + done done } diff --git a/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf b/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf index b319d62..e4a6f30 100644 --- a/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf +++ b/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf @@ -9,7 +9,7 @@ require conf/machine/include/tune-mips32.inc MACHINE_FEATURES = "screen keyboard pci usbhost ext2 ext3 serial" KERNEL_IMAGETYPE = "vmlinux" -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" +KERNEL_IMAGETYPES = "vmlinux.bin" KERNEL_IMAGE_STRIP_EXTRA_SECTIONS = ".comment" {{ if kernel_choice == "custom": preferred_kernel = "linux-yocto-custom" }} diff --git a/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf b/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf index 3afc5e0..2c2d8af 100644 --- a/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf +++ b/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf @@ -9,7 +9,7 @@ require conf/machine/include/tune-mips64.inc MACHINE_FEATURES = "pci ext2 ext3 serial" KERNEL_IMAGETYPE = "vmlinux" -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" +KERNEL_IMAGETYPES = "vmlinux.bin" KERNEL_IMAGE_STRIP_EXTRA_SECTIONS = ".comment" {{ if kernel_choice == "custom": preferred_kernel = "linux-yocto-custom" }} diff --git a/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf b/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf index 67e1cbd..7a0a4d3 100644 --- a/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf +++ b/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf @@ -69,6 +69,6 @@ SERIAL_CONSOLE = "115200 ttyS0" {{ if qemuarch == "mips" or qemuarch == "mips64": }} KERNEL_IMAGETYPE = "vmlinux" -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" +KERNEL_IMAGETYPES = "vmlinux.bin" SERIAL_CONSOLE = "115200 ttyS0" MACHINE_EXTRA_RRECOMMENDS = " kernel-modules" -- 1.9.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/2] kernel: Add KERNEL_IMAGETYPES to build multi types kernel at one time 2016-02-19 9:56 ` [PATCH v2 1/2] kernel: Add KERNEL_IMAGETYPES to build multi types kernel at one time zhe.he @ 2016-02-19 15:46 ` Bruce Ashfield 2016-02-22 8:43 ` He Zhe 0 siblings, 1 reply; 7+ messages in thread From: Bruce Ashfield @ 2016-02-19 15:46 UTC (permalink / raw) To: He Zhe; +Cc: Patches and discussions about the oe-core layer [-- Attachment #1: Type: text/plain, Size: 42742 bytes --] On Fri, Feb 19, 2016 at 4:56 AM, <zhe.he@windriver.com> wrote: > From: He Zhe <zhe.he@windriver.com> > > Add KERNEL_IMAGETYPES to support building packaging and installing > multi types of kernel images, such as zImage uImage, at one time. > > KERNEL_IMAGETYPE works as before. All KERNEL_ALT_IMAGETYPEs are > replaced by KERNEL_IMAGETYPES. > I see that you have updated layers/configs with the new variable, but obviously you can't see all the layers that may be using that old variable. Isn't it possible to have a python routine that detects the old ALT_IMAGETYPE variable and assigns it to the new one (if it isn't already set) ? Sort of like how distro features/features backfill work ? > Fixes [YOCTO #6945]. > > Signed-off-by: He Zhe <zhe.he@windriver.com> > --- > documentation/ref-manual/ref-variables.xml | 10 +- > meta-yocto-bsp/conf/machine/edgerouter.conf | 2 +- > meta/classes/kernel-fitimage.bbclass | 20 +-- > meta/classes/kernel-grub.bbclass | 44 ++++-- > meta/classes/kernel-uimage.bbclass | 22 +-- > meta/classes/kernel.bbclass | 171 > +++++++++++++++------ > meta/conf/documentation.conf | 1 + > meta/conf/machine/qemumips.conf | 2 +- > meta/conf/machine/qemumips64.conf | 2 +- > meta/recipes-kernel/linux/linux-dtb.inc | 49 +++--- > .../target/arch/mips/conf/machine/machine.conf | 2 +- > .../target/arch/mips64/conf/machine/machine.conf | 2 +- > .../target/arch/qemu/conf/machine/machine.conf | 2 +- > 13 files changed, 214 insertions(+), 115 deletions(-) > > diff --git a/documentation/ref-manual/ref-variables.xml > b/documentation/ref-manual/ref-variables.xml > index a76a8c2..a8e4fd8 100644 > --- a/documentation/ref-manual/ref-variables.xml > +++ b/documentation/ref-manual/ref-variables.xml > @@ -6417,14 +6417,14 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR > = "${INC_PR}.3" > </glossdef> > </glossentry> > > - <glossentry > id='var-KERNEL_ALT_IMAGETYPE'><glossterm>KERNEL_ALT_IMAGETYPE</glossterm> > + <glossentry > id='var-KERNEL_IMAGETYPES'><glossterm>KERNEL_IMAGETYPES</glossterm> > <info> > - KERNEL_ALT_IMAGETYPE[doc] = "Specifies an alternate > kernel image type for creation." > + KERNEL_IMAGETYPES[doc] = "Specifies alternate kernel > image types for creation." > </info> > <glossdef> > <para role="glossdeffirst"> > <!-- <para role="glossdeffirst"><imagedata > fileref="figures/define-generic.png" /> --> > - Specifies an alternate kernel image type for creation > in > + Specifies alternate kernel image types for creation in > addition to the kernel image type specified using the > <link > linkend='var-KERNEL_IMAGETYPE'><filename>KERNEL_IMAGETYPE</filename></link> > variable. > @@ -6612,8 +6612,8 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = > "${INC_PR}.3" > </para> > > <para> > - If you want to build an alternate kernel image type, > use the > - <link > linkend='var-KERNEL_ALT_IMAGETYPE'><filename>KERNEL_ALT_IMAGETYPE</filename></link> > + If you want to build alternate kernel image types, > use the > + <link > linkend='var-KERNEL_IMAGETYPES'><filename>KERNEL_IMAGETYPES</filename></link> > variable. > </para> > </glossdef> > diff --git a/meta-yocto-bsp/conf/machine/edgerouter.conf > b/meta-yocto-bsp/conf/machine/edgerouter.conf > index 476e690..affd568 100644 > --- a/meta-yocto-bsp/conf/machine/edgerouter.conf > +++ b/meta-yocto-bsp/conf/machine/edgerouter.conf > @@ -7,7 +7,7 @@ require conf/machine/include/tune-mips64.inc > MACHINE_FEATURES = "pci ext2 ext3 serial" > > KERNEL_IMAGETYPE = "vmlinux" > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > +KERNEL_IMAGETYPES = "vmlinux.bin" > This now reads a bit ... odd (for back of a better description). I'm concerned that it will cause confusion, there are two variables: KERNEL_IMAGETYPE and KERNEL_IMAGETYPES .. They are very close in name, and just reading the variable doesn't really tell us why we'd set one and not the other. The old "ALT" made it more obvious. But from the patch, KERNEL_IMAGETYPE isn't used, so does it have to be set at all in these .conf files ? .. or maybe I missed where it is still used other than for compatibility. > KERNEL_IMAGE_STRIP_EXTRA_SECTIONS = ".comment" > > PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto" > diff --git a/meta/classes/kernel-fitimage.bbclass > b/meta/classes/kernel-fitimage.bbclass > index f1b409c..51df19d 100644 > --- a/meta/classes/kernel-fitimage.bbclass > +++ b/meta/classes/kernel-fitimage.bbclass > @@ -1,8 +1,8 @@ > inherit kernel-uboot > > python __anonymous () { > - kerneltype = d.getVar('KERNEL_IMAGETYPE', True) > - if kerneltype == 'fitImage': > + kerneltypes = d.getVar('KERNEL_IMAGETYPES', True) or "" > + if 'fitImage' in kerneltypes.split(): > depends = d.getVar("DEPENDS", True) > depends = "%s u-boot-mkimage-native dtc-native" % depends > d.setVar("DEPENDS", depends) > @@ -10,7 +10,9 @@ python __anonymous () { > # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal > # to kernel.bbclass . We have to override it, since we pack zImage > # (at least for now) into the fitImage . > - d.setVar("KERNEL_IMAGETYPE_FOR_MAKE", "zImage") > + typeformake = d.getVar("KERNEL_IMAGETYPE_FOR_MAKE", True) or "" > + if 'fitImage' in typeformake.split(): > + d.setVar('KERNEL_IMAGETYPE_FOR_MAKE', > typeformake.replace('fitImage', 'zImage')) > > image = d.getVar('INITRAMFS_IMAGE', True) > if image: > @@ -154,7 +156,7 @@ EOF > } > > do_assemble_fitimage() { > - if test "x${KERNEL_IMAGETYPE}" = "xfitImage" ; then > + if echo ${KERNEL_IMAGETYPES} | grep -Pq "\bfitImage\b"; then > Not that it really matters, but grep -w would work here as well, and might read bit simpler. > kernelcount=1 > dtbcount="" > rm -f fit-image.its > @@ -217,14 +219,14 @@ addtask assemble_fitimage before do_install after > do_compile > > kernel_do_deploy_append() { > # Update deploy directory > - if test "x${KERNEL_IMAGETYPE}" = "xfitImage" ; then > + if echo ${KERNEL_IMAGETYPES} | grep -Pq "\bfitImage\b"; then > cd ${B} > echo "Copying fit-image.its source file..." > - > its_base_name="${KERNEL_IMAGETYPE}-its-${PV}-${PR}-${MACHINE}-${DATETIME}" > - its_symlink_name=${KERNEL_IMAGETYPE}-its-${MACHINE} > + > its_base_name="fitImage-its-${PV}-${PR}-${MACHINE}-${DATETIME}" > + its_symlink_name=fitImage-its-${MACHINE} > install -m 0644 fit-image.its > ${DEPLOYDIR}/${its_base_name}.its > - > linux_bin_base_name="${KERNEL_IMAGETYPE}-linux.bin-${PV}-${PR}-${MACHINE}-${DATETIME}" > - > linux_bin_symlink_name=${KERNEL_IMAGETYPE}-linux.bin-${MACHINE} > + > linux_bin_base_name="fitImage-linux.bin-${PV}-${PR}-${MACHINE}-${DATETIME}" > + linux_bin_symlink_name=fitImage-linux.bin-${MACHINE} > install -m 0644 linux.bin > ${DEPLOYDIR}/${linux_bin_base_name}.bin > > cd ${DEPLOYDIR} > diff --git a/meta/classes/kernel-grub.bbclass > b/meta/classes/kernel-grub.bbclass > index a63f482..f7dcc07 100644 > --- a/meta/classes/kernel-grub.bbclass > +++ b/meta/classes/kernel-grub.bbclass > @@ -10,41 +10,44 @@ > # updates the new kernel as the boot priority. > # > > -pkg_preinst_kernel-image_append () { > +python __anonymous () { > Maybe it is just the patch context making me misread this, but can you elaborate on what is changing here ? Is it the old preinst is being replaced by anonymous python that generates the preinst as a string, and that this injected into the package via the python ? Are we guaranteed to run the anonymous python at the right time ? .. I've been burned by that before, so I wanted to check that it has been considered. > + import re > + > + preinst = ''' > # Parsing confliction > [ -f "$D/boot/grub/menu.list" ] && grubcfg="$D/boot/grub/menu.list" > [ -f "$D/boot/grub/grub.cfg" ] && grubcfg="$D/boot/grub/grub.cfg" > if [ -n "$grubcfg" ]; then > # Dereference symlink to avoid confliction with new kernel > name. > - if grep -q "/${KERNEL_IMAGETYPE} \+root=" $grubcfg; then > - if [ -L "$D/boot/${KERNEL_IMAGETYPE}" ]; then > - kimage=`realpath > $D/boot/${KERNEL_IMAGETYPE} 2>/dev/null` > + if grep -q "/KERNEL_IMAGETYPE \+root=" $grubcfg; then > It's lines like these that made me ask my question above. This looks like its checking the grubcfg on disk. Is that same grep going to work in this anonymous python .. or maybe this isn't being run now, and only when the package is being installed ? I'm most likely missing something. > + if [ -L "$D/boot/KERNEL_IMAGETYPE" ]; then > + kimage=`realpath $D/boot/KERNEL_IMAGETYPE > 2>/dev/null` > if [ -f "$D$kimage" ]; then > - sed -i "s:${KERNEL_IMAGETYPE} > \+root=:${kimage##*/} root=:" $grubcfg > + sed -i "s:KERNEL_IMAGETYPE > \+root=:${kimage##*/} root=:" $grubcfg > fi > fi > fi > > # Rename old kernel if it conflicts with new kernel name. > - if grep -q "/${KERNEL_IMAGETYPE}-${KERNEL_VERSION} > \+root=" $grubcfg; then > - if [ -f > "$D/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}" ]; then > + if grep -q "/KERNEL_IMAGETYPE-${KERNEL_VERSION} \+root=" > $grubcfg; then > + if [ -f > "$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}" ]; then > timestamp=`date +%s` > - > kimage="$D/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}-$timestamp-back" > - sed -i > "s:${KERNEL_IMAGETYPE}-${KERNEL_VERSION} \+root=:${kimage##*/} root=:" > $grubcfg > - mv > "$D/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}" "$kimage" > + > kimage="$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}-$timestamp-back" > + sed -i > "s:KERNEL_IMAGETYPE-${KERNEL_VERSION} \+root=:${kimage##*/} root=:" $grubcfg > + mv > "$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}" "$kimage" > fi > fi > fi > -} > +''' > > -pkg_postinst_kernel-image_prepend () { > + postinst = ''' > get_new_grub_cfg() { > grubcfg="$1" > old_image="$2" > - title="Update ${KERNEL_IMAGETYPE}-${KERNEL_VERSION}-${PV}" > + title="Update KERNEL_IMAGETYPE-${KERNEL_VERSION}-${PV}" > if [ "${grubcfg##*/}" = "grub.cfg" ]; then > rootfs=`grep " *linux \+[^ ]\+ \+root=" $grubcfg > -m 1 | \ > - sed > "s#${old_image}#${old_image%/*}/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}#"` > + sed > "s#${old_image}#${old_image%/*}/KERNEL_IMAGETYPE-${KERNEL_VERSION}#"` > > echo "menuentry \"$title\" {" > echo " set root=(hd0,1)" > @@ -52,7 +55,7 @@ pkg_postinst_kernel-image_prepend () { > echo "}" > elif [ "${grubcfg##*/}" = "menu.list" ]; then > rootfs=`grep "kernel \+[^ ]\+ \+root=" $grubcfg -m > 1 | \ > - sed > "s#${old_image}#${old_image%/*}/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}#"` > + sed > "s#${old_image}#${old_image%/*}/KERNEL_IMAGETYPE-${KERNEL_VERSION}#"` > > echo "default 0" > echo "timeout 30" > @@ -87,5 +90,16 @@ pkg_postinst_kernel-image_prepend () { > mv $grubcfgtmp $grubcfg > echo "Caution! Update kernel may affect kernel-module!" > fi > +''' > + > + imagetypes = d.getVar('KERNEL_IMAGETYPES', True) > + imagetypes = re.sub(r'\.gz$', '', imagetypes) > + > + for type in imagetypes.split(): > + typelower = type.lower() > + preinst_append = preinst.replace('KERNEL_IMAGETYPE', type) > + postinst_prepend = postinst.replace('KERNEL_IMAGETYPE', type) > + d.setVar('pkg_preinst_kernel-image-' + typelower + '_append', > preinst_append) > + d.setVar('pkg_postinst_kernel-image-' + typelower + '_prepend', > postinst_prepend) > } > > diff --git a/meta/classes/kernel-uimage.bbclass > b/meta/classes/kernel-uimage.bbclass > index f73965b..a238ce4 100644 > --- a/meta/classes/kernel-uimage.bbclass > +++ b/meta/classes/kernel-uimage.bbclass > @@ -1,23 +1,25 @@ > inherit kernel-uboot > > python __anonymous () { > - kerneltype = d.getVar('KERNEL_IMAGETYPE', True) > - if kerneltype == 'uImage': > + if "uImage" in (d.getVar('KERNEL_IMAGETYPES', True) or "").split(): > depends = d.getVar("DEPENDS", True) > depends = "%s u-boot-mkimage-native" % depends > d.setVar("DEPENDS", depends) > > - # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal > - # to kernel.bbclass . We override the variable here, since we need > - # to build uImage using the kernel build system if and only if > - # KEEPUIMAGE == yes. Otherwise, we pack compressed vmlinux into > - # the uImage . > - if d.getVar("KEEPUIMAGE", True) != 'yes': > - d.setVar("KERNEL_IMAGETYPE_FOR_MAKE", "zImage") > + # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal > + # to kernel.bbclass . We override the variable here, since we need > + # to build uImage using the kernel build system if and only if > + # KEEPUIMAGE == yes. Otherwise, we pack compressed vmlinux into > + # the uImage . > + if d.getVar("KEEPUIMAGE", True) != 'yes': > + typeformake = d.getVar("KERNEL_IMAGETYPE_FOR_MAKE", True) or > "" > + if "uImage" in typeformake.split(): > + typeformake.replace('uImage', 'zImage') > + d.setVar('KERNEL_IMAGETYPE_FOR_MAKE', typeformake) > } > > do_uboot_mkimage() { > - if test "x${KERNEL_IMAGETYPE}" = "xuImage" ; then > + if echo "${KERNEL_IMAGETYPES}" | grep -Pq "\buImage\b"; then > if test "x${KEEPUIMAGE}" != "xyes" ; then > uboot_prep_kimage > > diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass > index c3eab50..6db2e2e 100644 > --- a/meta/classes/kernel.bbclass > +++ b/meta/classes/kernel.bbclass > @@ -16,12 +16,48 @@ 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) > + type = d.getVar('KERNEL_IMAGETYPE', True) or "" > Aha. Here is that use of KERNEL_IMAGETYPE. Like I mentioned for the alt image type, can't this existing variable be checked, and then added to KERNEL_IMAGE_TYPES in some python code ? That would simplify the code here, and also not require the two variables to be kept around. > + types = d.getVar('KERNEL_IMAGETYPES', True) or "" > + if type not in types.split(): > + types = (type + ' ' + types).strip() > + d.setVar('KERNEL_IMAGETYPES', types) > + 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') > > - d.setVar("KERNEL_IMAGETYPE_FOR_MAKE", re.sub(r'\.gz$', '', > kerneltype)) > + 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 +128,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" > > # > @@ -119,8 +155,6 @@ KERNEL_EXTRA_ARGS ?= "" > # We don't want to override kernel Makefile variables from the environment > EXTRA_OEMAKE = "" > > -KERNEL_ALT_IMAGETYPE ??= "" > - > # Define where the kernel headers are installed on the target as well as > where > # they are staged. > KERNEL_SRC_PATH = "/usr/src/kernel" > @@ -166,23 +200,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 > + # Backuping kernel image relies on its type(regular file > or symbolic link) > s/Backuping/Backing up/ > + 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 > } > > @@ -207,10 +266,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 > + oe_runmake ${KERNEL_IMAGETYPE_FOR_MAKE} CC="${KERNEL_CC}" > LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} $use_alternate_initrd > This is probably something that is worth mentioning in the top of the commit message. You are building multiple kernel image types, but they are all currently using the same configuration. If the make invokations were split into separate calls per image type, we could conceivably extend this to generate and use a separate config int he future. > + for typeformake in ${KERNEL_IMAGETYPE_FOR_MAKE} ; do > + 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() { > @@ -251,7 +315,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} > @@ -365,12 +431,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}')}" > @@ -394,14 +460,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 () { > @@ -422,13 +480,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 -q "vmlinux"); > then > You had used the \bfitImage\b, but here you don't .. grep -w could work for them all. > + bbwarn "image type(s) will not be stripped (not > supported): ${KERNEL_IMAGETYPES}" > But on another note. Is it really right to say that none of the images will be stripped if you find vmlinux anywhere in the image type list ? > 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}'` > @@ -438,7 +496,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:" \ > @@ -457,20 +515,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 > + die "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." > Hmm. Again here. Multiple image types are being built. If one of them is too large for the device, who's to say that that's the one that is going to be used ? Maybe this should be a warn, instead of a die ? > + 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" > @@ -479,28 +539,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}" > diff --git a/meta/conf/documentation.conf b/meta/conf/documentation.conf > index 00a69da..b3969b0 100644 > --- a/meta/conf/documentation.conf > +++ b/meta/conf/documentation.conf > @@ -246,6 +246,7 @@ KERNEL_CLASSES[doc] = "A list of classes defining > kernel image types that kernel > KERNEL_EXTRA_ARGS[doc] = "Specifies additional make command-line > arguments the OpenEmbedded build system passes on when compiling the > kernel." > KERNEL_FEATURES[doc] = "Includes additional metadata from the Yocto > Project kernel Git repository. The metadata you add through this variable > includes config fragments and features descriptions." > KERNEL_IMAGETYPE[doc] = "The type of kernel to build for a device, > usually set by the machine configuration files and defaults to 'zImage'." > +KERNEL_IMAGETYPES[doc] = "The list of types of kernel to build for a > device, usually set by the machine configuration files and defaults to > KERNEL_IMAGETYPE." > KERNEL_MODULE_AUTOLOAD[doc] = "Lists kernel modules that need to be > auto-loaded during boot" > KERNEL_MODULE_PROBECONF[doc] = "Lists kernel modules for which the build > system expects to find module_conf_* values that specify configuration for > each of the modules" > KERNEL_PATH[doc] = "The location of the kernel sources. This variable is > set to the value of the STAGING_KERNEL_DIR within the module class > (module.bbclass)." > diff --git a/meta/conf/machine/qemumips.conf > b/meta/conf/machine/qemumips.conf > index fbf8137..67ce161 100644 > --- a/meta/conf/machine/qemumips.conf > +++ b/meta/conf/machine/qemumips.conf > @@ -6,7 +6,7 @@ require conf/machine/include/qemu.inc > require conf/machine/include/tune-mips32r2.inc > > KERNEL_IMAGETYPE = "vmlinux" > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > +KERNEL_IMAGETYPES = "vmlinux.bin" > > SERIAL_CONSOLES = "115200;ttyS0 115200;ttyS1" > > diff --git a/meta/conf/machine/qemumips64.conf > b/meta/conf/machine/qemumips64.conf > index 8c3f1fe..393212e 100644 > --- a/meta/conf/machine/qemumips64.conf > +++ b/meta/conf/machine/qemumips64.conf > @@ -6,7 +6,7 @@ require conf/machine/include/qemu.inc > require conf/machine/include/tune-mips64.inc > > KERNEL_IMAGETYPE = "vmlinux" > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > +KERNEL_IMAGETYPES = "vmlinux.bin" > > SERIAL_CONSOLES = "115200;ttyS0 115200;ttyS1" > > diff --git a/meta/recipes-kernel/linux/linux-dtb.inc > b/meta/recipes-kernel/linux/linux-dtb.inc > index 651a19e..74f5ef8 100644 > --- a/meta/recipes-kernel/linux/linux-dtb.inc > +++ b/meta/recipes-kernel/linux/linux-dtb.inc > @@ -34,9 +34,12 @@ do_install_append() { > for DTB in ${KERNEL_DEVICETREE}; do > DTB=`normalize_dtb "${DTB}"` > DTB_BASE_NAME=`basename ${DTB} .dtb` > - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > - DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` > - install -m 0644 ${DTB_PATH} > ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb > + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do > + symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} > If there are multiple image types being built, is this valid for them all ? > + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > + DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` > + install -m 0644 ${DTB_PATH} > ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb > + done > done > } > > @@ -44,31 +47,39 @@ do_deploy_append() { > for DTB in ${KERNEL_DEVICETREE}; do > DTB=`normalize_dtb "${DTB}"` > DTB_BASE_NAME=`basename ${DTB} .dtb` > - DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > - DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` > - install -d ${DEPLOYDIR} > - install -m 0644 ${DTB_PATH} ${DEPLOYDIR}/${DTB_NAME}.dtb > - ln -sf ${DTB_NAME}.dtb ${DEPLOYDIR}/${DTB_SYMLINK_NAME}.dtb > + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do > + base_name=${type}"-"${KERNEL_IMAGE_BASE_NAME} > + symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} > + DTB_NAME=`echo ${base_name} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > + DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` > + install -d ${DEPLOYDIR} > + install -m 0644 ${DTB_PATH} > ${DEPLOYDIR}/${DTB_NAME}.dtb > + ln -sf ${DTB_NAME}.dtb > ${DEPLOYDIR}/${DTB_SYMLINK_NAME}.dtb > + done > done > } > > pkg_postinst_kernel-devicetree () { > cd /${KERNEL_IMAGEDEST} > - for DTB in ${KERNEL_DEVICETREE} > - do > - DTB_BASE_NAME=`basename ${DTB} | awk -F "." '{print $1}'` > - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > - update-alternatives --install > /${KERNEL_IMAGEDEST}/${DTB_BASE_NAME}.dtb ${DTB_BASE_NAME}.dtb > /boot/devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true > + for DTB in ${KERNEL_DEVICETREE}; do > + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do > + symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} > + DTB_BASE_NAME=`basename ${DTB} | awk -F "." > '{print $1}'` > + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > + update-alternatives --install > /${KERNEL_IMAGEDEST}/${DTB_BASE_NAME}.dtb ${DTB_BASE_NAME}.dtb > /boot/devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true > + done > done > } > > pkg_postrm_kernel-devicetree () { > cd /${KERNEL_IMAGEDEST} > - for DTB in ${KERNEL_DEVICETREE} > - do > - DTB_BASE_NAME=`basename ${DTB} | awk -F "." '{print $1}'` > - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > - update-alternatives --remove ${DTB_BASE_NAME}.dtb > /boot/devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true > + for DTB in ${KERNEL_DEVICETREE}; do > + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do > + symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} > + DTB_BASE_NAME=`basename ${DTB} | awk -F "." > '{print $1}'` > + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > + update-alternatives --remove ${DTB_BASE_NAME}.dtb > /boot/devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true > + done > done > } > diff --git > a/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf > b/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf > index b319d62..e4a6f30 100644 > --- a/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf > +++ b/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf > @@ -9,7 +9,7 @@ require conf/machine/include/tune-mips32.inc > MACHINE_FEATURES = "screen keyboard pci usbhost ext2 ext3 serial" > > KERNEL_IMAGETYPE = "vmlinux" > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > +KERNEL_IMAGETYPES = "vmlinux.bin" > KERNEL_IMAGE_STRIP_EXTRA_SECTIONS = ".comment" > > {{ if kernel_choice == "custom": preferred_kernel = "linux-yocto-custom" > }} > diff --git > a/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf > b/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf > index 3afc5e0..2c2d8af 100644 > --- > a/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf > +++ > b/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf > @@ -9,7 +9,7 @@ require conf/machine/include/tune-mips64.inc > MACHINE_FEATURES = "pci ext2 ext3 serial" > > KERNEL_IMAGETYPE = "vmlinux" > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > +KERNEL_IMAGETYPES = "vmlinux.bin" > Again, why can't vmlinux just bein in KERNEL_IMAGETYPES ? Bruce > KERNEL_IMAGE_STRIP_EXTRA_SECTIONS = ".comment" > > {{ if kernel_choice == "custom": preferred_kernel = "linux-yocto-custom" > }} > diff --git > a/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf > b/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf > index 67e1cbd..7a0a4d3 100644 > --- a/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf > +++ b/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf > @@ -69,6 +69,6 @@ SERIAL_CONSOLE = "115200 ttyS0" > > {{ if qemuarch == "mips" or qemuarch == "mips64": }} > KERNEL_IMAGETYPE = "vmlinux" > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > +KERNEL_IMAGETYPES = "vmlinux.bin" > SERIAL_CONSOLE = "115200 ttyS0" > MACHINE_EXTRA_RRECOMMENDS = " kernel-modules" > -- > 1.9.1 > > -- > _______________________________________________ > Openembedded-core mailing list > Openembedded-core@lists.openembedded.org > http://lists.openembedded.org/mailman/listinfo/openembedded-core > -- "Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end" [-- Attachment #2: Type: text/html, Size: 53943 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/2] kernel: Add KERNEL_IMAGETYPES to build multi types kernel at one time 2016-02-19 15:46 ` Bruce Ashfield @ 2016-02-22 8:43 ` He Zhe 2016-02-22 14:37 ` Bruce Ashfield 0 siblings, 1 reply; 7+ messages in thread From: He Zhe @ 2016-02-22 8:43 UTC (permalink / raw) To: Bruce Ashfield; +Cc: Patches and discussions about the oe-core layer On 02/19/2016 11:46 PM, Bruce Ashfield wrote: > > > On Fri, Feb 19, 2016 at 4:56 AM, <zhe.he@windriver.com <mailto:zhe.he@windriver.com>>wrote: > > From: He Zhe <zhe.he@windriver.com <mailto:zhe.he@windriver.com>> > > Add KERNEL_IMAGETYPES to support building packaging and installing > multi types of kernel images, such as zImage uImage, at one time. > > KERNEL_IMAGETYPE works as before. All KERNEL_ALT_IMAGETYPEs are > replaced by KERNEL_IMAGETYPES. > > > > I see that you have updated layers/configs with the new variable, but obviously you can't see all the > layers that may be using that old variable. > > Isn't it possible to have a python routine that detects the old ALT_IMAGETYPE variable and > assigns it to the new one (if it isn't already set) ? Sort of like how distro features/features backfill > work ? > Thanks for careful review. OK. I'll try to add such function. > > Fixes [YOCTO #6945]. > > Signed-off-by: He Zhe <zhe.he@windriver.com <mailto:zhe.he@windriver.com>> > --- > documentation/ref-manual/ref-variables.xml | 10 +- > meta-yocto-bsp/conf/machine/edgerouter.conf | 2 +- > meta/classes/kernel-fitimage.bbclass | 20 +-- > meta/classes/kernel-grub.bbclass | 44 ++++-- > meta/classes/kernel-uimage.bbclass | 22 +-- > meta/classes/kernel.bbclass | 171 +++++++++++++++------ > meta/conf/documentation.conf | 1 + > meta/conf/machine/qemumips.conf | 2 +- > meta/conf/machine/qemumips64.conf | 2 +- > meta/recipes-kernel/linux/linux-dtb.inc | 49 +++--- > .../target/arch/mips/conf/machine/machine.conf | 2 +- > .../target/arch/mips64/conf/machine/machine.conf | 2 +- > .../target/arch/qemu/conf/machine/machine.conf | 2 +- > 13 files changed, 214 insertions(+), 115 deletions(-) > > diff --git a/documentation/ref-manual/ref-variables.xml b/documentation/ref-manual/ref-variables.xml > index a76a8c2..a8e4fd8 100644 > --- a/documentation/ref-manual/ref-variables.xml > +++ b/documentation/ref-manual/ref-variables.xml > @@ -6417,14 +6417,14 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3" > </glossdef> > </glossentry> > > - <glossentry id='var-KERNEL_ALT_IMAGETYPE'><glossterm>KERNEL_ALT_IMAGETYPE</glossterm> > + <glossentry id='var-KERNEL_IMAGETYPES'><glossterm>KERNEL_IMAGETYPES</glossterm> > <info> > - KERNEL_ALT_IMAGETYPE[doc] = "Specifies an alternate kernel image type for creation." > + KERNEL_IMAGETYPES[doc] = "Specifies alternate kernel image types for creation." > </info> > <glossdef> > <para role="glossdeffirst"> > <!-- <para role="glossdeffirst"><imagedata fileref="figures/define-generic.png" /> --> > - Specifies an alternate kernel image type for creation in > + Specifies alternate kernel image types for creation in > addition to the kernel image type specified using the > <link linkend='var-KERNEL_IMAGETYPE'><filename>KERNEL_IMAGETYPE</filename></link> > variable. > @@ -6612,8 +6612,8 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3" > </para> > > <para> > - If you want to build an alternate kernel image type, use the > - <link linkend='var-KERNEL_ALT_IMAGETYPE'><filename>KERNEL_ALT_IMAGETYPE</filename></link> > + If you want to build alternate kernel image types, use the > + <link linkend='var-KERNEL_IMAGETYPES'><filename>KERNEL_IMAGETYPES</filename></link> > variable. > </para> > </glossdef> > diff --git a/meta-yocto-bsp/conf/machine/edgerouter.conf b/meta-yocto-bsp/conf/machine/edgerouter.conf > index 476e690..affd568 100644 > --- a/meta-yocto-bsp/conf/machine/edgerouter.conf > +++ b/meta-yocto-bsp/conf/machine/edgerouter.conf > @@ -7,7 +7,7 @@ require conf/machine/include/tune-mips64.inc > MACHINE_FEATURES = "pci ext2 ext3 serial" > > KERNEL_IMAGETYPE = "vmlinux" > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > +KERNEL_IMAGETYPES = "vmlinux.bin" > > > This now reads a bit ... odd (for back of a better description). I'm concerned that it will cause > confusion, there are two variables: > > KERNEL_IMAGETYPE and KERNEL_IMAGETYPES .. > > They are very close in name, and just reading the variable doesn't really tell us why > we'd set one and not the other. The old "ALT" made it more obvious. > But changing original KERNEL_ALT_IMAGETYPE to a list or using KERNEL_ALT_IMAGETYPES in addition to KERNEL_ALT_IMAGETYPE also seems not very clear. Below is the previous talk with Richard Purdie and Christopher Larson. >>>>> Question, why not add KERNEL_IMAGETYPES, and make KERNEL_IMAGETYPE equal to your new KERNEL_IMAGETYPE_0?(Christopher) >>>> Adding a new KERNEL_IMAGETYPES will also work. But it should be better(me) >>>> not to change the name of KERNEL_IMAGETYPE, so that those who have >>>> used it don't have to change their code. >>>> >>>> Thank you for reviewing. >>> I have to agree with Chris here, keeping KERNEL_IMAGETYPE as used today(Richard) >>> and equivalent to KERNEL_IMAGETYPE_0 and adding KERNEL_IMAGETYPES does >>> seem like a cleaner way to implement this. >> >> But it might mean we are going to check both KERNEL_IMAGETYPE and KERNEL_IMAGETYPES(me) >> to generate final image type list. Is that OK? > >Well, in some places you will use one and in some places you'll use the(Richard) >other, that is unavoidable. > >I much prefer "KERNEL_IMAGETYPE and KERNEL_IMAGETYPES" to >"KERNEL_IMAGETYPE_0 and KERNEL_IMAGETYPE" as variable names though. > >Cheers, > But from the patch, KERNEL_IMAGETYPE isn't used, so does it have to be set at > all in these .conf files ? .. or maybe I missed where it is still used other than for > compatibility. > Not every KERNEL_IMAGETYPE should be replaced by KERNEL_IMAGETYPES. Only one type of kernel image is necessary for below cases.Right? Yes, more explanations should be added to commit message and code comments. 1) boot fs image meta/classes/bootimg.bbclass:50:KERNEL_IMAGETYPE ??= "bzImage" meta/classes/bootimg.bbclass:72: install -m 0644 ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} ${DEST}/vmlinuz meta/classes/image_types.bbclass:109:ELF_KERNEL ?= "${STAGING_DIR_HOST}/usr/src/kernel/${KERNEL_IMAGETYPE}" 2) test fs image meta/lib/oeqa/controllers/masterimage.py:55: self.kernel = os.path.join(d.getVar("DEPLOY_DIR_IMAGE", True), d.getVar("KERNEL_IMAGETYPE", False) + '-' + d.getVar('MACHINE', False) + '.bin') meta/lib/oeqa/targetcontrol.py:126: self.kernel = os.path.join(d.getVar("DEPLOY_DIR_IMAGE", True), d.getVar("KERNEL_IMAGETYPE", False) + '-' + d.getVar('MACHINE', False) + '.bin') > KERNEL_IMAGE_STRIP_EXTRA_SECTIONS = ".comment" > > PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto" > diff --git a/meta/classes/kernel-fitimage.bbclass b/meta/classes/kernel-fitimage.bbclass > index f1b409c..51df19d 100644 > --- a/meta/classes/kernel-fitimage.bbclass > +++ b/meta/classes/kernel-fitimage.bbclass > @@ -1,8 +1,8 @@ > inherit kernel-uboot > > python __anonymous () { > - kerneltype = d.getVar('KERNEL_IMAGETYPE', True) > - if kerneltype == 'fitImage': > + kerneltypes = d.getVar('KERNEL_IMAGETYPES', True) or "" > + if 'fitImage' in kerneltypes.split(): > depends = d.getVar("DEPENDS", True) > depends = "%s u-boot-mkimage-native dtc-native" % depends > d.setVar("DEPENDS", depends) > @@ -10,7 +10,9 @@ python __anonymous () { > # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal > # to kernel.bbclass . We have to override it, since we pack zImage > # (at least for now) into the fitImage . > - d.setVar("KERNEL_IMAGETYPE_FOR_MAKE", "zImage") > + typeformake = d.getVar("KERNEL_IMAGETYPE_FOR_MAKE", True) or "" > + if 'fitImage' in typeformake.split(): > + d.setVar('KERNEL_IMAGETYPE_FOR_MAKE', typeformake.replace('fitImage', 'zImage')) > > image = d.getVar('INITRAMFS_IMAGE', True) > if image: > @@ -154,7 +156,7 @@ EOF > } > > do_assemble_fitimage() { > - if test "x${KERNEL_IMAGETYPE}" = "xfitImage" ; then > + if echo ${KERNEL_IMAGETYPES} | grep -Pq "\bfitImage\b"; then > > > Not that it really matters, but grep -w would work here as well, and might read bit simpler. OK. I'll replace it with "-w" > > > kernelcount=1 > dtbcount="" > rm -f fit-image.its > @@ -217,14 +219,14 @@ addtask assemble_fitimage before do_install after do_compile > > kernel_do_deploy_append() { > # Update deploy directory > - if test "x${KERNEL_IMAGETYPE}" = "xfitImage" ; then > + if echo ${KERNEL_IMAGETYPES} | grep -Pq "\bfitImage\b"; then > cd ${B} > echo "Copying fit-image.its source file..." > - its_base_name="${KERNEL_IMAGETYPE}-its-${PV}-${PR}-${MACHINE}-${DATETIME}" > - its_symlink_name=${KERNEL_IMAGETYPE}-its-${MACHINE} > + its_base_name="fitImage-its-${PV}-${PR}-${MACHINE}-${DATETIME}" > + its_symlink_name=fitImage-its-${MACHINE} > install -m 0644 fit-image.its ${DEPLOYDIR}/${its_base_name}.its > - linux_bin_base_name="${KERNEL_IMAGETYPE}-linux.bin-${PV}-${PR}-${MACHINE}-${DATETIME}" > - linux_bin_symlink_name=${KERNEL_IMAGETYPE}-linux.bin-${MACHINE} > + linux_bin_base_name="fitImage-linux.bin-${PV}-${PR}-${MACHINE}-${DATETIME}" > + linux_bin_symlink_name=fitImage-linux.bin-${MACHINE} > install -m 0644 linux.bin ${DEPLOYDIR}/${linux_bin_base_name}.bin > > cd ${DEPLOYDIR} > diff --git a/meta/classes/kernel-grub.bbclass b/meta/classes/kernel-grub.bbclass > index a63f482..f7dcc07 100644 > --- a/meta/classes/kernel-grub.bbclass > +++ b/meta/classes/kernel-grub.bbclass > @@ -10,41 +10,44 @@ > # updates the new kernel as the boot priority. > # > > -pkg_preinst_kernel-image_append () { > +python __anonymous () { > > > Maybe it is just the patch context making me misread this, but can you elaborate on > what is changing here ? > Here I change the two variables, pkg_preinst_kernel-image_append and pkg_postinst_kernel-image_prepend to two strings, and change all "${KERNEL_IMAGETYPE}" in the strings to "KERNEL_IMAGETYPE" to avoid being expanded in parsing time. So that I can replace KERNEL_IMAGETYPEs to every single image type in the following loops, in which the two original variables' name are constructed and their values are set. According to bitbake user manual, __anonymous functions are executed during parsing. It should be OK for the following references. I've verified this by building an image with kernel-grub.bbclass. > Is it the old preinst is being replaced by anonymous python that generates the preinst as > a string, and that this injected into the package via the python ? Are we guaranteed > to run the anonymous python at the right time ? .. I've been burned by that before, so > I wanted to check that it has been considered. > > > + import re > + > + preinst = ''' > # Parsing confliction > [ -f "$D/boot/grub/menu.list" ] && grubcfg="$D/boot/grub/menu.list" > [ -f "$D/boot/grub/grub.cfg" ] && grubcfg="$D/boot/grub/grub.cfg" > if [ -n "$grubcfg" ]; then > # Dereference symlink to avoid confliction with new kernel name. > - if grep -q "/${KERNEL_IMAGETYPE} \+root=" $grubcfg; then > - if [ -L "$D/boot/${KERNEL_IMAGETYPE}" ]; then > - kimage=`realpath $D/boot/${KERNEL_IMAGETYPE} 2>/dev/null` > + if grep -q "/KERNEL_IMAGETYPE \+root=" $grubcfg; then > > > It's lines like these that made me ask my question above. This looks like its checking the > grubcfg on disk. Is that same grep going to work in this anonymous python .. or maybe this > isn't being run now, and only when the package is being installed ? I'm most likely missing > something. No, it's not running, it's in the middle of the string. > > > + if [ -L "$D/boot/KERNEL_IMAGETYPE" ]; then > + kimage=`realpath $D/boot/KERNEL_IMAGETYPE 2>/dev/null` > if [ -f "$D$kimage" ]; then > - sed -i "s:${KERNEL_IMAGETYPE} \+root=:${kimage##*/} root=:" $grubcfg > + sed -i "s:KERNEL_IMAGETYPE \+root=:${kimage##*/} root=:" $grubcfg > fi > fi > fi > > # Rename old kernel if it conflicts with new kernel name. > - if grep -q "/${KERNEL_IMAGETYPE}-${KERNEL_VERSION} \+root=" $grubcfg; then > - if [ -f "$D/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}" ]; then > + if grep -q "/KERNEL_IMAGETYPE-${KERNEL_VERSION} \+root=" $grubcfg; then > + if [ -f "$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}" ]; then > timestamp=`date +%s` > - kimage="$D/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}-$timestamp-back" > - sed -i "s:${KERNEL_IMAGETYPE}-${KERNEL_VERSION} \+root=:${kimage##*/} root=:" $grubcfg > - mv "$D/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}" "$kimage" > + kimage="$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}-$timestamp-back" > + sed -i "s:KERNEL_IMAGETYPE-${KERNEL_VERSION} \+root=:${kimage##*/} root=:" $grubcfg > + mv "$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}" "$kimage" > fi > fi > fi > -} > +''' > > -pkg_postinst_kernel-image_prepend () { > + postinst = ''' > get_new_grub_cfg() { > grubcfg="$1" > old_image="$2" > - title="Update ${KERNEL_IMAGETYPE}-${KERNEL_VERSION}-${PV}" > + title="Update KERNEL_IMAGETYPE-${KERNEL_VERSION}-${PV}" > if [ "${grubcfg##*/}" = "grub.cfg" ]; then > rootfs=`grep " *linux \+[^ ]\+ \+root=" $grubcfg -m 1 | \ > - sed "s#${old_image}#${old_image%/*}/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}#"` > + sed "s#${old_image}#${old_image%/*}/KERNEL_IMAGETYPE-${KERNEL_VERSION}#"` > > echo "menuentry \"$title\" {" > echo " set root=(hd0,1)" > @@ -52,7 +55,7 @@ pkg_postinst_kernel-image_prepend () { > echo "}" > elif [ "${grubcfg##*/}" = "menu.list" ]; then > rootfs=`grep "kernel \+[^ ]\+ \+root=" $grubcfg -m 1 | \ > - sed "s#${old_image}#${old_image%/*}/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}#"` > + sed "s#${old_image}#${old_image%/*}/KERNEL_IMAGETYPE-${KERNEL_VERSION}#"` > > echo "default 0" > echo "timeout 30" > @@ -87,5 +90,16 @@ pkg_postinst_kernel-image_prepend () { > mv $grubcfgtmp $grubcfg > echo "Caution! Update kernel may affect kernel-module!" > fi > +''' > + > + imagetypes = d.getVar('KERNEL_IMAGETYPES', True) > + imagetypes = re.sub(r'\.gz$', '', imagetypes) > + > + for type in imagetypes.split(): > + typelower = type.lower() > + preinst_append = preinst.replace('KERNEL_IMAGETYPE', type) > + postinst_prepend = postinst.replace('KERNEL_IMAGETYPE', type) > + d.setVar('pkg_preinst_kernel-image-' + typelower + '_append', preinst_append) > + d.setVar('pkg_postinst_kernel-image-' + typelower + '_prepend', postinst_prepend) > } > > diff --git a/meta/classes/kernel-uimage.bbclass b/meta/classes/kernel-uimage.bbclass > index f73965b..a238ce4 100644 > --- a/meta/classes/kernel-uimage.bbclass > +++ b/meta/classes/kernel-uimage.bbclass > @@ -1,23 +1,25 @@ > inherit kernel-uboot > > python __anonymous () { > - kerneltype = d.getVar('KERNEL_IMAGETYPE', True) > - if kerneltype == 'uImage': > + if "uImage" in (d.getVar('KERNEL_IMAGETYPES', True) or "").split(): > depends = d.getVar("DEPENDS", True) > depends = "%s u-boot-mkimage-native" % depends > d.setVar("DEPENDS", depends) > > - # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal > - # to kernel.bbclass . We override the variable here, since we need > - # to build uImage using the kernel build system if and only if > - # KEEPUIMAGE == yes. Otherwise, we pack compressed vmlinux into > - # the uImage . > - if d.getVar("KEEPUIMAGE", True) != 'yes': > - d.setVar("KERNEL_IMAGETYPE_FOR_MAKE", "zImage") > + # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is internal > + # to kernel.bbclass . We override the variable here, since we need > + # to build uImage using the kernel build system if and only if > + # KEEPUIMAGE == yes. Otherwise, we pack compressed vmlinux into > + # the uImage . > + if d.getVar("KEEPUIMAGE", True) != 'yes': > + typeformake = d.getVar("KERNEL_IMAGETYPE_FOR_MAKE", True) or "" > + if "uImage" in typeformake.split(): > + typeformake.replace('uImage', 'zImage') > + d.setVar('KERNEL_IMAGETYPE_FOR_MAKE', typeformake) > } > > do_uboot_mkimage() { > - if test "x${KERNEL_IMAGETYPE}" = "xuImage" ; then > + if echo "${KERNEL_IMAGETYPES}" | grep -Pq "\buImage\b"; then > if test "x${KEEPUIMAGE}" != "xyes" ; then > uboot_prep_kimage > > diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass > index c3eab50..6db2e2e 100644 > --- a/meta/classes/kernel.bbclass > +++ b/meta/classes/kernel.bbclass > @@ -16,12 +16,48 @@ 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) > + type = d.getVar('KERNEL_IMAGETYPE', True) or "" > > > Aha. Here is that use of KERNEL_IMAGETYPE. Like I mentioned for the alt image type, can't > this existing variable be checked, and then added to KERNEL_IMAGE_TYPES in some > python code ? That would simplify the code here, and also not require the two variables to > be kept around. See above for explanation for KERNEL_IMAGETYPES. > > > + types = d.getVar('KERNEL_IMAGETYPES', True) or "" > + if type not in types.split(): > + types = (type + ' ' + types).strip() > + d.setVar('KERNEL_IMAGETYPES', types) > + 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') > > - d.setVar("KERNEL_IMAGETYPE_FOR_MAKE", re.sub(r'\.gz$', '', kerneltype)) > + 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 +128,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" > > # > @@ -119,8 +155,6 @@ KERNEL_EXTRA_ARGS ?= "" > # We don't want to override kernel Makefile variables from the environment > EXTRA_OEMAKE = "" > > -KERNEL_ALT_IMAGETYPE ??= "" > - > # Define where the kernel headers are installed on the target as well as where > # they are staged. > KERNEL_SRC_PATH = "/usr/src/kernel" > @@ -166,23 +200,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 > + # Backuping kernel image relies on its type(regular file or symbolic link) > > > s/Backuping/Backing up/ I'll correct it. > > > + 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 > } > > @@ -207,10 +266,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 > + oe_runmake ${KERNEL_IMAGETYPE_FOR_MAKE} CC="${KERNEL_CC}" LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} $use_alternate_initrd > > > > This is probably something that is worth mentioning in the top of the commit message. You are > building multiple kernel image types, but they are all currently using the same configuration. > > If the make invokations were split into separate calls per image type, we could conceivably > extend this to generate and use a separate config int he future. > OK. Let me test if there is any side effect after putting this make in a type loop. > + for typeformake in ${KERNEL_IMAGETYPE_FOR_MAKE} ; do > + 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() { > @@ -251,7 +315,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} > @@ -365,12 +431,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}')}" > @@ -394,14 +460,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 () { > @@ -422,13 +480,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 -q "vmlinux"); then > > > You had used the \bfitImage\b, but here you don't .. grep -w could work for them all. I'll correct it. > > > + bbwarn "image type(s) will not be stripped (not supported): ${KERNEL_IMAGETYPES}" > > > > But on another note. Is it really right to say that none of the images will be stripped if you > find vmlinux anywhere in the image type list ? > Not clear what you mean here. > 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}'` > @@ -438,7 +496,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:" \ > @@ -457,20 +515,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 > + die "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." > > > Hmm. Again here. Multiple image types are being built. If one of them is too large for the device, > who's to say that that's the one that is going to be used ? Maybe this should be a warn, instead > of a die ? > Fair point. A warn is OK. > + 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" > @@ -479,28 +539,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}" > diff --git a/meta/conf/documentation.conf b/meta/conf/documentation.conf > index 00a69da..b3969b0 100644 > --- a/meta/conf/documentation.conf > +++ b/meta/conf/documentation.conf > @@ -246,6 +246,7 @@ KERNEL_CLASSES[doc] = "A list of classes defining kernel image types that kernel > KERNEL_EXTRA_ARGS[doc] = "Specifies additional make command-line arguments the OpenEmbedded build system passes on when compiling the kernel." > KERNEL_FEATURES[doc] = "Includes additional metadata from the Yocto Project kernel Git repository. The metadata you add through this variable includes config fragments and features descriptions." > KERNEL_IMAGETYPE[doc] = "The type of kernel to build for a device, usually set by the machine configuration files and defaults to 'zImage'." > +KERNEL_IMAGETYPES[doc] = "The list of types of kernel to build for a device, usually set by the machine configuration files and defaults to KERNEL_IMAGETYPE." > KERNEL_MODULE_AUTOLOAD[doc] = "Lists kernel modules that need to be auto-loaded during boot" > KERNEL_MODULE_PROBECONF[doc] = "Lists kernel modules for which the build system expects to find module_conf_* values that specify configuration for each of the modules" > KERNEL_PATH[doc] = "The location of the kernel sources. This variable is set to the value of the STAGING_KERNEL_DIR within the module class (module.bbclass)." > diff --git a/meta/conf/machine/qemumips.conf b/meta/conf/machine/qemumips.conf > index fbf8137..67ce161 100644 > --- a/meta/conf/machine/qemumips.conf > +++ b/meta/conf/machine/qemumips.conf > @@ -6,7 +6,7 @@ require conf/machine/include/qemu.inc > require conf/machine/include/tune-mips32r2.inc > > KERNEL_IMAGETYPE = "vmlinux" > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > +KERNEL_IMAGETYPES = "vmlinux.bin" > > SERIAL_CONSOLES = "115200;ttyS0 115200;ttyS1" > > diff --git a/meta/conf/machine/qemumips64.conf b/meta/conf/machine/qemumips64.conf > index 8c3f1fe..393212e 100644 > --- a/meta/conf/machine/qemumips64.conf > +++ b/meta/conf/machine/qemumips64.conf > @@ -6,7 +6,7 @@ require conf/machine/include/qemu.inc > require conf/machine/include/tune-mips64.inc > > KERNEL_IMAGETYPE = "vmlinux" > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > +KERNEL_IMAGETYPES = "vmlinux.bin" > > SERIAL_CONSOLES = "115200;ttyS0 115200;ttyS1" > > diff --git a/meta/recipes-kernel/linux/linux-dtb.inc b/meta/recipes-kernel/linux/linux-dtb.inc > index 651a19e..74f5ef8 100644 > --- a/meta/recipes-kernel/linux/linux-dtb.inc > +++ b/meta/recipes-kernel/linux/linux-dtb.inc > @@ -34,9 +34,12 @@ do_install_append() { > for DTB in ${KERNEL_DEVICETREE}; do > DTB=`normalize_dtb "${DTB}"` > DTB_BASE_NAME=`basename ${DTB} .dtb` > - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` > - DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` > - install -m 0644 ${DTB_PATH} ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb > + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do > + symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} > > > If there are multiple image types being built, is this valid for them all ? Add these links for convenience. If we give different configurations to different types of images in the future, as you pointed above, we might also need different dtb. > > > + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` > + DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` > + install -m 0644 ${DTB_PATH} ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb > + done > done > } > > @@ -44,31 +47,39 @@ do_deploy_append() { > for DTB in ${KERNEL_DEVICETREE}; do > DTB=`normalize_dtb "${DTB}"` > DTB_BASE_NAME=`basename ${DTB} .dtb` > - DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` > - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` > - DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` > - install -d ${DEPLOYDIR} > - install -m 0644 ${DTB_PATH} ${DEPLOYDIR}/${DTB_NAME}.dtb > - ln -sf ${DTB_NAME}.dtb ${DEPLOYDIR}/${DTB_SYMLINK_NAME}.dtb > + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do > + base_name=${type}"-"${KERNEL_IMAGE_BASE_NAME} > + symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} > + DTB_NAME=`echo ${base_name} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` > + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` > + DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` > + install -d ${DEPLOYDIR} > + install -m 0644 ${DTB_PATH} ${DEPLOYDIR}/${DTB_NAME}.dtb > + ln -sf ${DTB_NAME}.dtb ${DEPLOYDIR}/${DTB_SYMLINK_NAME}.dtb > + done > done > } > > pkg_postinst_kernel-devicetree () { > cd /${KERNEL_IMAGEDEST} > - for DTB in ${KERNEL_DEVICETREE} > - do > - DTB_BASE_NAME=`basename ${DTB} | awk -F "." '{print $1}'` > - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` > - update-alternatives --install /${KERNEL_IMAGEDEST}/${DTB_BASE_NAME}.dtb ${DTB_BASE_NAME}.dtb /boot/devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true > + for DTB in ${KERNEL_DEVICETREE}; do > + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do > + symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} > + DTB_BASE_NAME=`basename ${DTB} | awk -F "." '{print $1}'` > + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` > + update-alternatives --install /${KERNEL_IMAGEDEST}/${DTB_BASE_NAME}.dtb ${DTB_BASE_NAME}.dtb /boot/devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true > + done > done > } > > pkg_postrm_kernel-devicetree () { > cd /${KERNEL_IMAGEDEST} > - for DTB in ${KERNEL_DEVICETREE} > - do > - DTB_BASE_NAME=`basename ${DTB} | awk -F "." '{print $1}'` > - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` > - update-alternatives --remove ${DTB_BASE_NAME}.dtb /boot/devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true > + for DTB in ${KERNEL_DEVICETREE}; do > + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do > + symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} > + DTB_BASE_NAME=`basename ${DTB} | awk -F "." '{print $1}'` > + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` > + update-alternatives --remove ${DTB_BASE_NAME}.dtb /boot/devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true > + done > done > } > diff --git a/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf b/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf > index b319d62..e4a6f30 100644 > --- a/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf > +++ b/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf > @@ -9,7 +9,7 @@ require conf/machine/include/tune-mips32.inc > MACHINE_FEATURES = "screen keyboard pci usbhost ext2 ext3 serial" > > KERNEL_IMAGETYPE = "vmlinux" > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > +KERNEL_IMAGETYPES = "vmlinux.bin" > KERNEL_IMAGE_STRIP_EXTRA_SECTIONS = ".comment" > > {{ if kernel_choice == "custom": preferred_kernel = "linux-yocto-custom" }} > diff --git a/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf b/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf > index 3afc5e0..2c2d8af 100644 > --- a/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf > +++ b/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf > @@ -9,7 +9,7 @@ require conf/machine/include/tune-mips64.inc > MACHINE_FEATURES = "pci ext2 ext3 serial" > > KERNEL_IMAGETYPE = "vmlinux" > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > +KERNEL_IMAGETYPES = "vmlinux.bin" > > > > Again, why can't vmlinux just bein in KERNEL_IMAGETYPES ? > Discussed above. Thanks, Zhe > Bruce > > > KERNEL_IMAGE_STRIP_EXTRA_SECTIONS = ".comment" > > {{ if kernel_choice == "custom": preferred_kernel = "linux-yocto-custom" }} > diff --git a/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf b/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf > index 67e1cbd..7a0a4d3 100644 > --- a/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf > +++ b/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf > @@ -69,6 +69,6 @@ SERIAL_CONSOLE = "115200 ttyS0" > > {{ if qemuarch == "mips" or qemuarch == "mips64": }} > KERNEL_IMAGETYPE = "vmlinux" > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > +KERNEL_IMAGETYPES = "vmlinux.bin" > SERIAL_CONSOLE = "115200 ttyS0" > MACHINE_EXTRA_RRECOMMENDS = " kernel-modules" > -- > 1.9.1 > > -- > _______________________________________________ > Openembedded-core mailing list > Openembedded-core@lists.openembedded.org <mailto:Openembedded-core@lists.openembedded.org> > http://lists.openembedded.org/mailman/listinfo/openembedded-core > > > > > -- > "Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end" ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/2] kernel: Add KERNEL_IMAGETYPES to build multi types kernel at one time 2016-02-22 8:43 ` He Zhe @ 2016-02-22 14:37 ` Bruce Ashfield 0 siblings, 0 replies; 7+ messages in thread From: Bruce Ashfield @ 2016-02-22 14:37 UTC (permalink / raw) To: He Zhe; +Cc: Patches and discussions about the oe-core layer [-- Attachment #1: Type: text/plain, Size: 52573 bytes --] On Mon, Feb 22, 2016 at 3:43 AM, He Zhe <zhe.he@windriver.com> wrote: > > > On 02/19/2016 11:46 PM, Bruce Ashfield wrote: > > > > > > On Fri, Feb 19, 2016 at 4:56 AM, <zhe.he@windriver.com <mailto: > zhe.he@windriver.com>>wrote: > > > > From: He Zhe <zhe.he@windriver.com <mailto:zhe.he@windriver.com>> > > > > Add KERNEL_IMAGETYPES to support building packaging and installing > > multi types of kernel images, such as zImage uImage, at one time. > > > > KERNEL_IMAGETYPE works as before. All KERNEL_ALT_IMAGETYPEs are > > replaced by KERNEL_IMAGETYPES. > > > > > > > > I see that you have updated layers/configs with the new variable, but > obviously you can't see all the > > layers that may be using that old variable. > > > > Isn't it possible to have a python routine that detects the old > ALT_IMAGETYPE variable and > > assigns it to the new one (if it isn't already set) ? Sort of like how > distro features/features backfill > > work ? > > > > Thanks for careful review. > > OK. I'll try to add such function. > > > > > Fixes [YOCTO #6945]. > > > > Signed-off-by: He Zhe <zhe.he@windriver.com <mailto: > zhe.he@windriver.com>> > > --- > > documentation/ref-manual/ref-variables.xml | 10 +- > > meta-yocto-bsp/conf/machine/edgerouter.conf | 2 +- > > meta/classes/kernel-fitimage.bbclass | 20 +-- > > meta/classes/kernel-grub.bbclass | 44 ++++-- > > meta/classes/kernel-uimage.bbclass | 22 +-- > > meta/classes/kernel.bbclass | 171 > +++++++++++++++------ > > meta/conf/documentation.conf | 1 + > > meta/conf/machine/qemumips.conf | 2 +- > > meta/conf/machine/qemumips64.conf | 2 +- > > meta/recipes-kernel/linux/linux-dtb.inc | 49 +++--- > > .../target/arch/mips/conf/machine/machine.conf | 2 +- > > .../target/arch/mips64/conf/machine/machine.conf | 2 +- > > .../target/arch/qemu/conf/machine/machine.conf | 2 +- > > 13 files changed, 214 insertions(+), 115 deletions(-) > > > > diff --git a/documentation/ref-manual/ref-variables.xml > b/documentation/ref-manual/ref-variables.xml > > index a76a8c2..a8e4fd8 100644 > > --- a/documentation/ref-manual/ref-variables.xml > > +++ b/documentation/ref-manual/ref-variables.xml > > @@ -6417,14 +6417,14 @@ > recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3" > > </glossdef> > > </glossentry> > > > > - <glossentry > id='var-KERNEL_ALT_IMAGETYPE'><glossterm>KERNEL_ALT_IMAGETYPE</glossterm> > > + <glossentry > id='var-KERNEL_IMAGETYPES'><glossterm>KERNEL_IMAGETYPES</glossterm> > > <info> > > - KERNEL_ALT_IMAGETYPE[doc] = "Specifies an alternate > kernel image type for creation." > > + KERNEL_IMAGETYPES[doc] = "Specifies alternate > kernel image types for creation." > > </info> > > <glossdef> > > <para role="glossdeffirst"> > > <!-- <para role="glossdeffirst"><imagedata > fileref="figures/define-generic.png" /> --> > > - Specifies an alternate kernel image type for > creation in > > + Specifies alternate kernel image types for > creation in > > addition to the kernel image type specified > using the > > <link > linkend='var-KERNEL_IMAGETYPE'><filename>KERNEL_IMAGETYPE</filename></link> > > variable. > > @@ -6612,8 +6612,8 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR > = "${INC_PR}.3" > > </para> > > > > <para> > > - If you want to build an alternate kernel image > type, use the > > - <link > linkend='var-KERNEL_ALT_IMAGETYPE'><filename>KERNEL_ALT_IMAGETYPE</filename></link> > > + If you want to build alternate kernel image > types, use the > > + <link > linkend='var-KERNEL_IMAGETYPES'><filename>KERNEL_IMAGETYPES</filename></link> > > variable. > > </para> > > </glossdef> > > diff --git a/meta-yocto-bsp/conf/machine/edgerouter.conf > b/meta-yocto-bsp/conf/machine/edgerouter.conf > > index 476e690..affd568 100644 > > --- a/meta-yocto-bsp/conf/machine/edgerouter.conf > > +++ b/meta-yocto-bsp/conf/machine/edgerouter.conf > > @@ -7,7 +7,7 @@ require conf/machine/include/tune-mips64.inc > > MACHINE_FEATURES = "pci ext2 ext3 serial" > > > > KERNEL_IMAGETYPE = "vmlinux" > > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > > +KERNEL_IMAGETYPES = "vmlinux.bin" > > > > > > This now reads a bit ... odd (for back of a better description). I'm > concerned that it will cause > > confusion, there are two variables: > > > > KERNEL_IMAGETYPE and KERNEL_IMAGETYPES .. > > > > They are very close in name, and just reading the variable doesn't > really tell us why > > we'd set one and not the other. The old "ALT" made it more obvious. > > > > But changing original KERNEL_ALT_IMAGETYPE to a list or using > KERNEL_ALT_IMAGETYPES > in addition to KERNEL_ALT_IMAGETYPE also seems not very clear. Below is > the previous > talk with Richard Purdie and Christopher Larson. > Aha. I didn't recall that previous discussion. Clearly there's no "one good way" to name these to avoid some confusion, so I'd defer to Richard's opinion on the naming. That being said, I do wish that the names conveyed why there was a variable that took a single image type, and then another one that took a list, and that the lists were non overlapping. > > >>>>> Question, why not add KERNEL_IMAGETYPES, and make KERNEL_IMAGETYPE > equal to your new KERNEL_IMAGETYPE_0?(Christopher) > >>>> Adding a new KERNEL_IMAGETYPES will also work. But it should be > better(me) > >>>> not to change the name of KERNEL_IMAGETYPE, so that those who have > >>>> used it don't have to change their code. > >>>> > >>>> Thank you for reviewing. > >>> I have to agree with Chris here, keeping KERNEL_IMAGETYPE as used > today(Richard) > >>> and equivalent to KERNEL_IMAGETYPE_0 and adding KERNEL_IMAGETYPES does > >>> seem like a cleaner way to implement this. > >> > >> But it might mean we are going to check both KERNEL_IMAGETYPE and > KERNEL_IMAGETYPES(me) > >> to generate final image type list. Is that OK? > > > >Well, in some places you will use one and in some places you'll use > the(Richard) > >other, that is unavoidable. > > > >I much prefer "KERNEL_IMAGETYPE and KERNEL_IMAGETYPES" to > >"KERNEL_IMAGETYPE_0 and KERNEL_IMAGETYPE" as variable names though. > > > >Cheers, > > > But from the patch, KERNEL_IMAGETYPE isn't used, so does it have to be > set at > > all in these .conf files ? .. or maybe I missed where it is still used > other than for > > compatibility. > > > > Not every KERNEL_IMAGETYPE should be replaced by KERNEL_IMAGETYPES. Only > one > type of kernel image is necessary for below cases.Right? > > Yes, more explanations should be added to commit message and code comments. > > 1) boot fs image > meta/classes/bootimg.bbclass:50:KERNEL_IMAGETYPE ??= "bzImage" > meta/classes/bootimg.bbclass:72: install -m 0644 > ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} ${DEST}/vmlinuz > meta/classes/image_types.bbclass:109:ELF_KERNEL ?= > "${STAGING_DIR_HOST}/usr/src/kernel/${KERNEL_IMAGETYPE}" > > 2) test fs image > meta/lib/oeqa/controllers/masterimage.py:55: self.kernel = > os.path.join(d.getVar("DEPLOY_DIR_IMAGE", True), > d.getVar("KERNEL_IMAGETYPE", False) + '-' + d.getVar('MACHINE', False) + > '.bin') > meta/lib/oeqa/targetcontrol.py:126: self.kernel = > os.path.join(d.getVar("DEPLOY_DIR_IMAGE", True), > d.getVar("KERNEL_IMAGETYPE", False) + '-' + d.getVar('MACHINE', False) + > '.bin') > > > > KERNEL_IMAGE_STRIP_EXTRA_SECTIONS = ".comment" > > > > PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto" > > diff --git a/meta/classes/kernel-fitimage.bbclass > b/meta/classes/kernel-fitimage.bbclass > > index f1b409c..51df19d 100644 > > --- a/meta/classes/kernel-fitimage.bbclass > > +++ b/meta/classes/kernel-fitimage.bbclass > > @@ -1,8 +1,8 @@ > > inherit kernel-uboot > > > > python __anonymous () { > > - kerneltype = d.getVar('KERNEL_IMAGETYPE', True) > > - if kerneltype == 'fitImage': > > + kerneltypes = d.getVar('KERNEL_IMAGETYPES', True) or "" > > + if 'fitImage' in kerneltypes.split(): > > depends = d.getVar("DEPENDS", True) > > depends = "%s u-boot-mkimage-native dtc-native" % depends > > d.setVar("DEPENDS", depends) > > @@ -10,7 +10,9 @@ python __anonymous () { > > # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is > internal > > # to kernel.bbclass . We have to override it, since we pack > zImage > > # (at least for now) into the fitImage . > > - d.setVar("KERNEL_IMAGETYPE_FOR_MAKE", "zImage") > > + typeformake = d.getVar("KERNEL_IMAGETYPE_FOR_MAKE", True) > or "" > > + if 'fitImage' in typeformake.split(): > > + d.setVar('KERNEL_IMAGETYPE_FOR_MAKE', > typeformake.replace('fitImage', 'zImage')) > > > > image = d.getVar('INITRAMFS_IMAGE', True) > > if image: > > @@ -154,7 +156,7 @@ EOF > > } > > > > do_assemble_fitimage() { > > - if test "x${KERNEL_IMAGETYPE}" = "xfitImage" ; then > > + if echo ${KERNEL_IMAGETYPES} | grep -Pq "\bfitImage\b"; then > > > > > > Not that it really matters, but grep -w would work here as well, and > might read bit simpler. > > OK. I'll replace it with "-w" > > > > > > > kernelcount=1 > > dtbcount="" > > rm -f fit-image.its > > @@ -217,14 +219,14 @@ addtask assemble_fitimage before do_install > after do_compile > > > > kernel_do_deploy_append() { > > # Update deploy directory > > - if test "x${KERNEL_IMAGETYPE}" = "xfitImage" ; then > > + if echo ${KERNEL_IMAGETYPES} | grep -Pq "\bfitImage\b"; then > > cd ${B} > > echo "Copying fit-image.its source file..." > > - > its_base_name="${KERNEL_IMAGETYPE}-its-${PV}-${PR}-${MACHINE}-${DATETIME}" > > - its_symlink_name=${KERNEL_IMAGETYPE}-its-${MACHINE} > > + > its_base_name="fitImage-its-${PV}-${PR}-${MACHINE}-${DATETIME}" > > + its_symlink_name=fitImage-its-${MACHINE} > > install -m 0644 fit-image.its > ${DEPLOYDIR}/${its_base_name}.its > > - > linux_bin_base_name="${KERNEL_IMAGETYPE}-linux.bin-${PV}-${PR}-${MACHINE}-${DATETIME}" > > - > linux_bin_symlink_name=${KERNEL_IMAGETYPE}-linux.bin-${MACHINE} > > + > linux_bin_base_name="fitImage-linux.bin-${PV}-${PR}-${MACHINE}-${DATETIME}" > > + linux_bin_symlink_name=fitImage-linux.bin-${MACHINE} > > install -m 0644 linux.bin > ${DEPLOYDIR}/${linux_bin_base_name}.bin > > > > cd ${DEPLOYDIR} > > diff --git a/meta/classes/kernel-grub.bbclass > b/meta/classes/kernel-grub.bbclass > > index a63f482..f7dcc07 100644 > > --- a/meta/classes/kernel-grub.bbclass > > +++ b/meta/classes/kernel-grub.bbclass > > @@ -10,41 +10,44 @@ > > # updates the new kernel as the boot priority. > > # > > > > -pkg_preinst_kernel-image_append () { > > +python __anonymous () { > > > > > > Maybe it is just the patch context making me misread this, but can you > elaborate on > > what is changing here ? > > > > Here I change the two variables, pkg_preinst_kernel-image_append and > pkg_postinst_kernel-image_prepend to two strings, and change all > "${KERNEL_IMAGETYPE}" > in the strings to "KERNEL_IMAGETYPE" to avoid being expanded in parsing > time. So that I can > replace KERNEL_IMAGETYPEs to every single image type in the following > loops, in which the > two original variables' name are constructed and their values are set. > > According to bitbake user manual, __anonymous functions are executed > during parsing. It > should be OK for the following references. I've verified this by building > an image with > kernel-grub.bbclass. > Thanks. That clarifies things, I know there have been some variable expansion changes recently in bitbake, and I wanted to make sure they have been taken into account. > > > Is it the old preinst is being replaced by anonymous python that > generates the preinst as > > a string, and that this injected into the package via the python ? Are > we guaranteed > > to run the anonymous python at the right time ? .. I've been burned by > that before, so > > I wanted to check that it has been considered. > > > > > > + import re > > + > > + preinst = ''' > > # Parsing confliction > > [ -f "$D/boot/grub/menu.list" ] && > grubcfg="$D/boot/grub/menu.list" > > [ -f "$D/boot/grub/grub.cfg" ] && > grubcfg="$D/boot/grub/grub.cfg" > > if [ -n "$grubcfg" ]; then > > # Dereference symlink to avoid confliction with new > kernel name. > > - if grep -q "/${KERNEL_IMAGETYPE} \+root=" $grubcfg; > then > > - if [ -L "$D/boot/${KERNEL_IMAGETYPE}" ]; then > > - kimage=`realpath > $D/boot/${KERNEL_IMAGETYPE} 2>/dev/null` > > + if grep -q "/KERNEL_IMAGETYPE \+root=" $grubcfg; then > > > > > > It's lines like these that made me ask my question above. This looks > like its checking the > > grubcfg on disk. Is that same grep going to work in this anonymous > python .. or maybe this > > isn't being run now, and only when the package is being installed ? I'm > most likely missing > > something. > > No, it's not running, it's in the middle of the string. > Hmm. Indeed, the way that nested strings are valid is a bit confusing, but that's just my background not being in python chowing through! > > > > > > > + if [ -L "$D/boot/KERNEL_IMAGETYPE" ]; then > > + kimage=`realpath > $D/boot/KERNEL_IMAGETYPE 2>/dev/null` > > if [ -f "$D$kimage" ]; then > > - sed -i > "s:${KERNEL_IMAGETYPE} \+root=:${kimage##*/} root=:" $grubcfg > > + sed -i "s:KERNEL_IMAGETYPE > \+root=:${kimage##*/} root=:" $grubcfg > > fi > > fi > > fi > > > > # Rename old kernel if it conflicts with new kernel > name. > > - if grep -q "/${KERNEL_IMAGETYPE}-${KERNEL_VERSION} > \+root=" $grubcfg; then > > - if [ -f > "$D/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}" ]; then > > + if grep -q "/KERNEL_IMAGETYPE-${KERNEL_VERSION} > \+root=" $grubcfg; then > > + if [ -f > "$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}" ]; then > > timestamp=`date +%s` > > - > kimage="$D/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}-$timestamp-back" > > - sed -i > "s:${KERNEL_IMAGETYPE}-${KERNEL_VERSION} \+root=:${kimage##*/} root=:" > $grubcfg > > - mv > "$D/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}" "$kimage" > > + > kimage="$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}-$timestamp-back" > > + sed -i > "s:KERNEL_IMAGETYPE-${KERNEL_VERSION} \+root=:${kimage##*/} root=:" $grubcfg > > + mv > "$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}" "$kimage" > > fi > > fi > > fi > > -} > > +''' > > > > -pkg_postinst_kernel-image_prepend () { > > + postinst = ''' > > get_new_grub_cfg() { > > grubcfg="$1" > > old_image="$2" > > - title="Update > ${KERNEL_IMAGETYPE}-${KERNEL_VERSION}-${PV}" > > + title="Update > KERNEL_IMAGETYPE-${KERNEL_VERSION}-${PV}" > > if [ "${grubcfg##*/}" = "grub.cfg" ]; then > > rootfs=`grep " *linux \+[^ ]\+ \+root=" > $grubcfg -m 1 | \ > > - sed > "s#${old_image}#${old_image%/*}/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}#"` > > + sed > "s#${old_image}#${old_image%/*}/KERNEL_IMAGETYPE-${KERNEL_VERSION}#"` > > > > echo "menuentry \"$title\" {" > > echo " set root=(hd0,1)" > > @@ -52,7 +55,7 @@ pkg_postinst_kernel-image_prepend () { > > echo "}" > > elif [ "${grubcfg##*/}" = "menu.list" ]; then > > rootfs=`grep "kernel \+[^ ]\+ \+root=" > $grubcfg -m 1 | \ > > - sed > "s#${old_image}#${old_image%/*}/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}#"` > > + sed > "s#${old_image}#${old_image%/*}/KERNEL_IMAGETYPE-${KERNEL_VERSION}#"` > > > > echo "default 0" > > echo "timeout 30" > > @@ -87,5 +90,16 @@ pkg_postinst_kernel-image_prepend () { > > mv $grubcfgtmp $grubcfg > > echo "Caution! Update kernel may affect > kernel-module!" > > fi > > +''' > > + > > + imagetypes = d.getVar('KERNEL_IMAGETYPES', True) > > + imagetypes = re.sub(r'\.gz$', '', imagetypes) > > + > > + for type in imagetypes.split(): > > + typelower = type.lower() > > + preinst_append = preinst.replace('KERNEL_IMAGETYPE', type) > > + postinst_prepend = postinst.replace('KERNEL_IMAGETYPE', > type) > > + d.setVar('pkg_preinst_kernel-image-' + typelower + > '_append', preinst_append) > > + d.setVar('pkg_postinst_kernel-image-' + typelower + > '_prepend', postinst_prepend) > > } > > > > diff --git a/meta/classes/kernel-uimage.bbclass > b/meta/classes/kernel-uimage.bbclass > > index f73965b..a238ce4 100644 > > --- a/meta/classes/kernel-uimage.bbclass > > +++ b/meta/classes/kernel-uimage.bbclass > > @@ -1,23 +1,25 @@ > > inherit kernel-uboot > > > > python __anonymous () { > > - kerneltype = d.getVar('KERNEL_IMAGETYPE', True) > > - if kerneltype == 'uImage': > > + if "uImage" in (d.getVar('KERNEL_IMAGETYPES', True) or > "").split(): > > depends = d.getVar("DEPENDS", True) > > depends = "%s u-boot-mkimage-native" % depends > > d.setVar("DEPENDS", depends) > > > > - # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is > internal > > - # to kernel.bbclass . We override the variable here, since > we need > > - # to build uImage using the kernel build system if and only > if > > - # KEEPUIMAGE == yes. Otherwise, we pack compressed vmlinux > into > > - # the uImage . > > - if d.getVar("KEEPUIMAGE", True) != 'yes': > > - d.setVar("KERNEL_IMAGETYPE_FOR_MAKE", "zImage") > > + # Override KERNEL_IMAGETYPE_FOR_MAKE variable, which is > internal > > + # to kernel.bbclass . We override the variable here, since > we need > > + # to build uImage using the kernel build system if and only > if > > + # KEEPUIMAGE == yes. Otherwise, we pack compressed vmlinux > into > > + # the uImage . > > + if d.getVar("KEEPUIMAGE", True) != 'yes': > > + typeformake = d.getVar("KERNEL_IMAGETYPE_FOR_MAKE", > True) or "" > > + if "uImage" in typeformake.split(): > > + typeformake.replace('uImage', 'zImage') > > + d.setVar('KERNEL_IMAGETYPE_FOR_MAKE', typeformake) > > } > > > > do_uboot_mkimage() { > > - if test "x${KERNEL_IMAGETYPE}" = "xuImage" ; then > > + if echo "${KERNEL_IMAGETYPES}" | grep -Pq "\buImage\b"; then > > if test "x${KEEPUIMAGE}" != "xyes" ; then > > uboot_prep_kimage > > > > diff --git a/meta/classes/kernel.bbclass > b/meta/classes/kernel.bbclass > > index c3eab50..6db2e2e 100644 > > --- a/meta/classes/kernel.bbclass > > +++ b/meta/classes/kernel.bbclass > > @@ -16,12 +16,48 @@ 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) > > + type = d.getVar('KERNEL_IMAGETYPE', True) or "" > > > > > > Aha. Here is that use of KERNEL_IMAGETYPE. Like I mentioned for the alt > image type, can't > > this existing variable be checked, and then added to KERNEL_IMAGE_TYPES > in some > > python code ? That would simplify the code here, and also not require > the two variables to > > be kept around. > > See above for explanation for KERNEL_IMAGETYPES. > True. But I still think that we could allow the old variable to be set, and have it joined into a single variable by python code. That would mean you'd only need to check one variable, and users can continue to set the existing one. Something to think about. > > > > > > > + types = d.getVar('KERNEL_IMAGETYPES', True) or "" > > + if type not in types.split(): > > + types = (type + ' ' + types).strip() > > + d.setVar('KERNEL_IMAGETYPES', types) > > + 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') > > > > - d.setVar("KERNEL_IMAGETYPE_FOR_MAKE", re.sub(r'\.gz$', '', > kerneltype)) > > + 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 +128,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" > > > > # > > @@ -119,8 +155,6 @@ KERNEL_EXTRA_ARGS ?= "" > > # We don't want to override kernel Makefile variables from the > environment > > EXTRA_OEMAKE = "" > > > > -KERNEL_ALT_IMAGETYPE ??= "" > > - > > # Define where the kernel headers are installed on the target as > well as where > > # they are staged. > > KERNEL_SRC_PATH = "/usr/src/kernel" > > @@ -166,23 +200,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 > > + # Backuping kernel image relies on its type(regular > file or symbolic link) > > > > > > s/Backuping/Backing up/ > > I'll correct it. > > > > > > > + 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 > > } > > > > @@ -207,10 +266,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 > > + oe_runmake ${KERNEL_IMAGETYPE_FOR_MAKE} CC="${KERNEL_CC}" > LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} $use_alternate_initrd > > > > > > > > This is probably something that is worth mentioning in the top of the > commit message. You are > > building multiple kernel image types, but they are all currently using > the same configuration. > > > > If the make invokations were split into separate calls per image type, > we could conceivably > > extend this to generate and use a separate config int he future. > > > > OK. Let me test if there is any side effect after putting this make in a > type loop. > > > + for typeformake in ${KERNEL_IMAGETYPE_FOR_MAKE} ; do > > + 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() { > > @@ -251,7 +315,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} > > @@ -365,12 +431,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}')}" > > @@ -394,14 +460,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 () { > > @@ -422,13 +480,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 -q > "vmlinux"); then > > > > > > You had used the \bfitImage\b, but here you don't .. grep -w could work > for them all. > > I'll correct it. > > > > > > > + bbwarn "image type(s) will not be stripped > (not supported): ${KERNEL_IMAGETYPES}" > > > > > > > > But on another note. Is it really right to say that none of the images > will be stripped if you > > find vmlinux anywhere in the image type list ? > > > > Not clear what you mean here. > Consider that there are a list of image types in KERNEL_IMAGETYPES, and most of them could be stripped, but that list contains vmlinux. The test above will avoid stripping any of them, where the intent was really to not strip vmlinux, and only vmlinux. > > > 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}'` > > @@ -438,7 +496,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:" \ > > @@ -457,20 +515,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 > > + die "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." > > > > > > Hmm. Again here. Multiple image types are being built. If one of them is > too large for the device, > > who's to say that that's the one that is going to be used ? Maybe this > should be a warn, instead > > of a die ? > > > > Fair point. A warn is OK. > > > + 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" > > @@ -479,28 +539,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}" > > diff --git a/meta/conf/documentation.conf > b/meta/conf/documentation.conf > > index 00a69da..b3969b0 100644 > > --- a/meta/conf/documentation.conf > > +++ b/meta/conf/documentation.conf > > @@ -246,6 +246,7 @@ KERNEL_CLASSES[doc] = "A list of classes > defining kernel image types that kernel > > KERNEL_EXTRA_ARGS[doc] = "Specifies additional make command-line > arguments the OpenEmbedded build system passes on when compiling the > kernel." > > KERNEL_FEATURES[doc] = "Includes additional metadata from the Yocto > Project kernel Git repository. The metadata you add through this variable > includes config fragments and features descriptions." > > KERNEL_IMAGETYPE[doc] = "The type of kernel to build for a device, > usually set by the machine configuration files and defaults to 'zImage'." > > +KERNEL_IMAGETYPES[doc] = "The list of types of kernel to build for > a device, usually set by the machine configuration files and defaults to > KERNEL_IMAGETYPE." > > KERNEL_MODULE_AUTOLOAD[doc] = "Lists kernel modules that need to be > auto-loaded during boot" > > KERNEL_MODULE_PROBECONF[doc] = "Lists kernel modules for which the > build system expects to find module_conf_* values that specify > configuration for each of the modules" > > KERNEL_PATH[doc] = "The location of the kernel sources. This > variable is set to the value of the STAGING_KERNEL_DIR within the module > class (module.bbclass)." > > diff --git a/meta/conf/machine/qemumips.conf > b/meta/conf/machine/qemumips.conf > > index fbf8137..67ce161 100644 > > --- a/meta/conf/machine/qemumips.conf > > +++ b/meta/conf/machine/qemumips.conf > > @@ -6,7 +6,7 @@ require conf/machine/include/qemu.inc > > require conf/machine/include/tune-mips32r2.inc > > > > KERNEL_IMAGETYPE = "vmlinux" > > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > > +KERNEL_IMAGETYPES = "vmlinux.bin" > > > > SERIAL_CONSOLES = "115200;ttyS0 115200;ttyS1" > > > > diff --git a/meta/conf/machine/qemumips64.conf > b/meta/conf/machine/qemumips64.conf > > index 8c3f1fe..393212e 100644 > > --- a/meta/conf/machine/qemumips64.conf > > +++ b/meta/conf/machine/qemumips64.conf > > @@ -6,7 +6,7 @@ require conf/machine/include/qemu.inc > > require conf/machine/include/tune-mips64.inc > > > > KERNEL_IMAGETYPE = "vmlinux" > > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > > +KERNEL_IMAGETYPES = "vmlinux.bin" > > > > SERIAL_CONSOLES = "115200;ttyS0 115200;ttyS1" > > > > diff --git a/meta/recipes-kernel/linux/linux-dtb.inc > b/meta/recipes-kernel/linux/linux-dtb.inc > > index 651a19e..74f5ef8 100644 > > --- a/meta/recipes-kernel/linux/linux-dtb.inc > > +++ b/meta/recipes-kernel/linux/linux-dtb.inc > > @@ -34,9 +34,12 @@ do_install_append() { > > for DTB in ${KERNEL_DEVICETREE}; do > > DTB=`normalize_dtb "${DTB}"` > > DTB_BASE_NAME=`basename ${DTB} .dtb` > > - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} > | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` > > - DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` > > - install -m 0644 ${DTB_PATH} > ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb > > + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do > > + > symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} > > > > > > If there are multiple image types being built, is this valid for them > all ? > > Add these links for convenience. If we give different configurations to > different types of images in the future, as you pointed above, we might > also need different dtb. > Sounds good. > > > > > > > + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > > + DTB_PATH=`get_real_dtb_path_in_kernel > "${DTB}"` > > + install -m 0644 ${DTB_PATH} > ${D}/${KERNEL_IMAGEDEST}/devicetree-${DTB_SYMLINK_NAME}.dtb > > + done > > done > > } > > > > @@ -44,31 +47,39 @@ do_deploy_append() { > > for DTB in ${KERNEL_DEVICETREE}; do > > DTB=`normalize_dtb "${DTB}"` > > DTB_BASE_NAME=`basename ${DTB} .dtb` > > - DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > > - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} > | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` > > - DTB_PATH=`get_real_dtb_path_in_kernel "${DTB}"` > > - install -d ${DEPLOYDIR} > > - install -m 0644 ${DTB_PATH} > ${DEPLOYDIR}/${DTB_NAME}.dtb > > - ln -sf ${DTB_NAME}.dtb > ${DEPLOYDIR}/${DTB_SYMLINK_NAME}.dtb > > + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do > > + base_name=${type}"-"${KERNEL_IMAGE_BASE_NAME} > > + > symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} > > + DTB_NAME=`echo ${base_name} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > > + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > > + DTB_PATH=`get_real_dtb_path_in_kernel > "${DTB}"` > > + install -d ${DEPLOYDIR} > > + install -m 0644 ${DTB_PATH} > ${DEPLOYDIR}/${DTB_NAME}.dtb > > + ln -sf ${DTB_NAME}.dtb > ${DEPLOYDIR}/${DTB_SYMLINK_NAME}.dtb > > + done > > done > > } > > > > pkg_postinst_kernel-devicetree () { > > cd /${KERNEL_IMAGEDEST} > > - for DTB in ${KERNEL_DEVICETREE} > > - do > > - DTB_BASE_NAME=`basename ${DTB} | awk -F "." '{print > $1}'` > > - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} > | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` > > - update-alternatives --install > /${KERNEL_IMAGEDEST}/${DTB_BASE_NAME}.dtb ${DTB_BASE_NAME}.dtb > /boot/devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true > > + for DTB in ${KERNEL_DEVICETREE}; do > > + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do > > + > symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} > > + DTB_BASE_NAME=`basename ${DTB} | awk -F "." > '{print $1}'` > > + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > > + update-alternatives --install > /${KERNEL_IMAGEDEST}/${DTB_BASE_NAME}.dtb ${DTB_BASE_NAME}.dtb > /boot/devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true > > + done > > done > > } > > > > pkg_postrm_kernel-devicetree () { > > cd /${KERNEL_IMAGEDEST} > > - for DTB in ${KERNEL_DEVICETREE} > > - do > > - DTB_BASE_NAME=`basename ${DTB} | awk -F "." '{print > $1}'` > > - DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} > | sed "s/${MACHINE}/${DTB_BASE_NAME}/g"` > > - update-alternatives --remove ${DTB_BASE_NAME}.dtb > /boot/devicetree-${DTB_SYMLINK_NAME}.dtb ${KERNEL_PRIORITY} || true > > + for DTB in ${KERNEL_DEVICETREE}; do > > + for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do > > + > symlink_name=${type}"-"${KERNEL_IMAGE_SYMLINK_NAME} > > + DTB_BASE_NAME=`basename ${DTB} | awk -F "." > '{print $1}'` > > + DTB_SYMLINK_NAME=`echo ${symlink_name} | sed > "s/${MACHINE}/${DTB_BASE_NAME}/g"` > > + update-alternatives --remove > ${DTB_BASE_NAME}.dtb /boot/devicetree-${DTB_SYMLINK_NAME}.dtb > ${KERNEL_PRIORITY} || true > > + done > > done > > } > > diff --git > a/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf > b/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf > > index b319d62..e4a6f30 100644 > > --- > a/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf > > +++ > b/scripts/lib/bsp/substrate/target/arch/mips/conf/machine/machine.conf > > @@ -9,7 +9,7 @@ require conf/machine/include/tune-mips32.inc > > MACHINE_FEATURES = "screen keyboard pci usbhost ext2 ext3 serial" > > > > KERNEL_IMAGETYPE = "vmlinux" > > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > > +KERNEL_IMAGETYPES = "vmlinux.bin" > > KERNEL_IMAGE_STRIP_EXTRA_SECTIONS = ".comment" > > > > {{ if kernel_choice == "custom": preferred_kernel = > "linux-yocto-custom" }} > > diff --git > a/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf > b/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf > > index 3afc5e0..2c2d8af 100644 > > --- > a/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf > > +++ > b/scripts/lib/bsp/substrate/target/arch/mips64/conf/machine/machine.conf > > @@ -9,7 +9,7 @@ require conf/machine/include/tune-mips64.inc > > MACHINE_FEATURES = "pci ext2 ext3 serial" > > > > KERNEL_IMAGETYPE = "vmlinux" > > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > > +KERNEL_IMAGETYPES = "vmlinux.bin" > > > > > > > > Again, why can't vmlinux just bein in KERNEL_IMAGETYPES ? > > > > Discussed above. > Thanks for the quick follow up! Cheers, Bruce > > Thanks, > Zhe > > > Bruce > > > > > > KERNEL_IMAGE_STRIP_EXTRA_SECTIONS = ".comment" > > > > {{ if kernel_choice == "custom": preferred_kernel = > "linux-yocto-custom" }} > > diff --git > a/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf > b/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf > > index 67e1cbd..7a0a4d3 100644 > > --- > a/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf > > +++ > b/scripts/lib/bsp/substrate/target/arch/qemu/conf/machine/machine.conf > > @@ -69,6 +69,6 @@ SERIAL_CONSOLE = "115200 ttyS0" > > > > {{ if qemuarch == "mips" or qemuarch == "mips64": }} > > KERNEL_IMAGETYPE = "vmlinux" > > -KERNEL_ALT_IMAGETYPE = "vmlinux.bin" > > +KERNEL_IMAGETYPES = "vmlinux.bin" > > SERIAL_CONSOLE = "115200 ttyS0" > > MACHINE_EXTRA_RRECOMMENDS = " kernel-modules" > > -- > > 1.9.1 > > > > -- > > _______________________________________________ > > Openembedded-core mailing list > > Openembedded-core@lists.openembedded.org <mailto: > Openembedded-core@lists.openembedded.org> > > http://lists.openembedded.org/mailman/listinfo/openembedded-core > > > > > > > > > > -- > > "Thou shalt not follow the NULL pointer, for chaos and madness await > thee at its end" > > -- "Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end" [-- Attachment #2: Type: text/html, Size: 68191 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 2/2] kernel: Make symbol link to vmlinuz in boot directory 2016-02-19 9:56 [PATCH v2 0/2] Yocto Bug #6945 zhe.he 2016-02-19 9:56 ` [PATCH v2 1/2] kernel: Add KERNEL_IMAGETYPES to build multi types kernel at one time zhe.he @ 2016-02-19 9:56 ` zhe.he 2016-02-19 23:55 ` Burton, Ross 1 sibling, 1 reply; 7+ messages in thread From: zhe.he @ 2016-02-19 9:56 UTC (permalink / raw) To: openembedded-core From: He Zhe <zhe.he@windriver.com> Rename do_kernel_link_vmlinux to do_kernel_link_images and make a symbol link to vmlinuz(if exists) for reference in arch/$arch/boot directory. Signed-off-by: He Zhe <zhe.he@windriver.com> --- documentation/ref-manual/ref-tasks.xml | 8 ++++---- meta/classes/kernel.bbclass | 13 ++++++++----- meta/conf/documentation.conf | 2 +- meta/recipes-kernel/linux/linux-yocto.inc | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/documentation/ref-manual/ref-tasks.xml b/documentation/ref-manual/ref-tasks.xml index 8ac37a0..517663b 100644 --- a/documentation/ref-manual/ref-tasks.xml +++ b/documentation/ref-manual/ref-tasks.xml @@ -663,13 +663,13 @@ </para> </section> - <section id='ref-tasks-kernel_link_vmlinux'> - <title><filename>do_kernel_link_vmlinux</filename></title> + <section id='ref-tasks-kernel_link_images'> + <title><filename>do_kernel_link_images</filename></title> <para> Creates a symbolic link in - <filename>arch/$arch/boot</filename> for vmlinux kernel - images. + <filename>arch/$arch/boot</filename> for vmlinux and vmlinuz + kernel images. </para> </section> diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass index 6db2e2e..19b5132 100644 --- a/meta/classes/kernel.bbclass +++ b/meta/classes/kernel.bbclass @@ -467,15 +467,18 @@ python split_kernel_packages () { } # Many scripts want to look in arch/$arch/boot for the bootable -# image. This poses a problem for vmlinux based booting. This -# task arranges to have vmlinux appear in the normalized directory -# location. -do_kernel_link_vmlinux() { +# image. This poses a problem for vmlinux and vmlinuz based +# booting. This task arranges to have vmlinux and vmlinuz appear +# in the normalized directory location. +do_kernel_link_images() { if [ ! -d "${B}/arch/${ARCH}/boot" ]; then mkdir ${B}/arch/${ARCH}/boot fi cd ${B}/arch/${ARCH}/boot ln -sf ../../../vmlinux + if [ -f ../../../vmlinuz ]; then + ln -sf ../../../vmlinuz + fi } do_strip() { @@ -505,7 +508,7 @@ do_strip() { } do_strip[dirs] = "${B}" -addtask do_strip before do_sizecheck after do_kernel_link_vmlinux +addtask do_strip before do_sizecheck after do_kernel_link_images # Support checking the kernel size since some kernels need to reside in partitions # with a fixed length or there is a limit in transferring the kernel to memory diff --git a/meta/conf/documentation.conf b/meta/conf/documentation.conf index b3969b0..f0c2399 100644 --- a/meta/conf/documentation.conf +++ b/meta/conf/documentation.conf @@ -28,7 +28,7 @@ do_install_ptest_base[doc] = "Copies the runtime test suite files from the compi do_kernel_checkout[doc] = "Checks out source/meta branches for a linux-yocto style kernel" do_kernel_configcheck[doc] = "Validates the kernel configuration for a linux-yocto style kernel" do_kernel_configme[doc] = "Assembles the kernel configuration for a linux-yocto style kernel" -do_kernel_link_vmlinux[doc] = "Creates a symbolic link in arch/$arch/boot for vmlinux kernel images" +do_kernel_link_images[doc] = "Creates a symbolic link in arch/$arch/boot for vmlinux and vmlinuz kernel images" do_listtasks[doc] = "Lists all defined tasks for a target" do_menuconfig[doc] = "Runs 'make menuconfig' for the kernel" do_package[doc] = "Analyzes the content of the holding area and splits it into subsets based on available packages and files" diff --git a/meta/recipes-kernel/linux/linux-yocto.inc b/meta/recipes-kernel/linux/linux-yocto.inc index 6b161fc..fd68786 100644 --- a/meta/recipes-kernel/linux/linux-yocto.inc +++ b/meta/recipes-kernel/linux/linux-yocto.inc @@ -52,6 +52,6 @@ do_install_append(){ } # extra tasks -addtask kernel_link_vmlinux after do_compile before do_install +addtask kernel_link_images after do_compile before do_install addtask validate_branches before do_patch after do_kernel_checkout addtask kernel_configcheck after do_configure before do_compile -- 1.9.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] kernel: Make symbol link to vmlinuz in boot directory 2016-02-19 9:56 ` [PATCH v2 2/2] kernel: Make symbol link to vmlinuz in boot directory zhe.he @ 2016-02-19 23:55 ` Burton, Ross 0 siblings, 0 replies; 7+ messages in thread From: Burton, Ross @ 2016-02-19 23:55 UTC (permalink / raw) To: He Zhe; +Cc: OE-core [-- Attachment #1: Type: text/plain, Size: 480 bytes --] On 19 February 2016 at 09:56, <zhe.he@windriver.com> wrote: > documentation/ref-manual/ref-tasks.xml | 8 ++++---- > meta/classes/kernel.bbclass | 13 ++++++++----- > meta/conf/documentation.conf | 2 +- > meta/recipes-kernel/linux/linux-yocto.inc | 2 +- > documentation/ is actually a separate git repo (yocto-docs), please submit a patch to yocto@ (with [yocto-docs] in the subject) when this patch is merged into oe-core. Ross [-- Attachment #2: Type: text/html, Size: 911 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2016-02-22 14:37 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-02-19 9:56 [PATCH v2 0/2] Yocto Bug #6945 zhe.he 2016-02-19 9:56 ` [PATCH v2 1/2] kernel: Add KERNEL_IMAGETYPES to build multi types kernel at one time zhe.he 2016-02-19 15:46 ` Bruce Ashfield 2016-02-22 8:43 ` He Zhe 2016-02-22 14:37 ` Bruce Ashfield 2016-02-19 9:56 ` [PATCH v2 2/2] kernel: Make symbol link to vmlinuz in boot directory zhe.he 2016-02-19 23:55 ` Burton, Ross
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox