diff options
| -rw-r--r-- | meta-yocto/conf/local.conf.sample.extended | 22 | ||||
| -rw-r--r-- | meta/classes/image.bbclass | 12 | ||||
| -rw-r--r-- | meta/classes/kernel.bbclass | 96 |
3 files changed, 118 insertions, 12 deletions
diff --git a/meta-yocto/conf/local.conf.sample.extended b/meta-yocto/conf/local.conf.sample.extended index 06d7abc01b..a2cb81bc1c 100644 --- a/meta-yocto/conf/local.conf.sample.extended +++ b/meta-yocto/conf/local.conf.sample.extended | |||
| @@ -241,3 +241,25 @@ FORTRAN_forcevariable = ",fortran" | |||
| 241 | RUNTIMETARGET_append_pn-gcc-runtime = " libquadmath libgfortran" | 241 | RUNTIMETARGET_append_pn-gcc-runtime = " libquadmath libgfortran" |
| 242 | export BUILD_FC = "${CCACHE}${BUILD_PREFIX}gfortran ${BUILD_CC_ARCH}" | 242 | export BUILD_FC = "${CCACHE}${BUILD_PREFIX}gfortran ${BUILD_CC_ARCH}" |
| 243 | export FC = "${CCACHE}${HOST_PREFIX}gfortran ${HOST_CC_ARCH}" | 243 | export FC = "${CCACHE}${HOST_PREFIX}gfortran ${HOST_CC_ARCH}" |
| 244 | |||
| 245 | # | ||
| 246 | # Kernel image features | ||
| 247 | # | ||
| 248 | # The INITRAMFS_IMAGE image variable will cause an additional recipe to | ||
| 249 | # be built as a dependency to the what ever rootfs recipe you might be | ||
| 250 | # using such as core-image-sato. The initramfs might be needed for | ||
| 251 | # the initial boot of of the target system such as to load kernel | ||
| 252 | # modules prior to mounting the root file system. | ||
| 253 | # | ||
| 254 | # INITRAMFS_IMAGE_BUNDLE variable controls if the image recipe | ||
| 255 | # specified by the INITRAMFS_IMAGE will be run through an extra pass | ||
| 256 | # through the kernel compilation in order to build a single binary | ||
| 257 | # which contains both the kernel image and the initramfs. The | ||
| 258 | # combined binary will be deposited into the tmp/deploy directory. | ||
| 259 | # NOTE: You can set INITRAMFS_IMAGE in an image recipe, but | ||
| 260 | # INITRAMFS_IMAGE_BUNDLE can only be set in a conf file. | ||
| 261 | # | ||
| 262 | #INITRAMFS_IMAGE = "core-image-minimal-initramfs" | ||
| 263 | #INITRAMFS_IMAGE_BUNDLE = "1" | ||
| 264 | |||
| 265 | |||
diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass index 84f638c099..4a0946c8e3 100644 --- a/meta/classes/image.bbclass +++ b/meta/classes/image.bbclass | |||
| @@ -130,6 +130,10 @@ python () { | |||
| 130 | d.setVar('MULTILIB_VENDORS', ml_vendor_list) | 130 | d.setVar('MULTILIB_VENDORS', ml_vendor_list) |
| 131 | 131 | ||
| 132 | check_image_features(d) | 132 | check_image_features(d) |
| 133 | initramfs_image = d.getVar('INITRAMFS_IMAGE', True) or "" | ||
| 134 | if initramfs_image != "": | ||
| 135 | d.appendVarFlag('do_build', 'depends', " %s:do_bundle_initramfs" % d.getVar('PN', True)) | ||
| 136 | d.appendVarFlag('do_bundle_initramfs', 'depends', " %s:do_rootfs" % initramfs_image) | ||
| 133 | } | 137 | } |
| 134 | 138 | ||
| 135 | # | 139 | # |
| @@ -629,3 +633,11 @@ do_package_write_deb[noexec] = "1" | |||
| 629 | do_package_write_rpm[noexec] = "1" | 633 | do_package_write_rpm[noexec] = "1" |
| 630 | 634 | ||
| 631 | addtask rootfs before do_build | 635 | addtask rootfs before do_build |
| 636 | # Allow the kernel to be repacked with the initramfs and boot image file as a single file | ||
| 637 | do_bundle_initramfs[depends] += "virtual/kernel:do_bundle_initramfs" | ||
| 638 | do_bundle_initramfs[nostamp] = "1" | ||
| 639 | do_bundle_initramfs[noexec] = "1" | ||
| 640 | do_bundle_initramfs () { | ||
| 641 | : | ||
| 642 | } | ||
| 643 | addtask bundle_initramfs after do_rootfs | ||
diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass index e039dfc15c..8cf66ce7dc 100644 --- a/meta/classes/kernel.bbclass +++ b/meta/classes/kernel.bbclass | |||
| @@ -9,6 +9,7 @@ INHIBIT_DEFAULT_DEPS = "1" | |||
| 9 | KERNEL_IMAGETYPE ?= "zImage" | 9 | KERNEL_IMAGETYPE ?= "zImage" |
| 10 | INITRAMFS_IMAGE ?= "" | 10 | INITRAMFS_IMAGE ?= "" |
| 11 | INITRAMFS_TASK ?= "" | 11 | INITRAMFS_TASK ?= "" |
| 12 | INITRAMFS_IMAGE_BUNDLE ?= "" | ||
| 12 | 13 | ||
| 13 | python __anonymous () { | 14 | python __anonymous () { |
| 14 | kerneltype = d.getVar('KERNEL_IMAGETYPE', True) or '' | 15 | kerneltype = d.getVar('KERNEL_IMAGETYPE', True) or '' |
| @@ -19,7 +20,15 @@ python __anonymous () { | |||
| 19 | 20 | ||
| 20 | image = d.getVar('INITRAMFS_IMAGE', True) | 21 | image = d.getVar('INITRAMFS_IMAGE', True) |
| 21 | if image: | 22 | if image: |
| 22 | d.setVar('INITRAMFS_TASK', '${INITRAMFS_IMAGE}:do_rootfs') | 23 | d.appendVarFlag('do_bundle_initramfs', 'depends', ' ${INITRAMFS_IMAGE}:do_rootfs') |
| 24 | |||
| 25 | # NOTE: setting INITRAMFS_TASK is for backward compatibility | ||
| 26 | # The preferred method is to set INITRAMFS_IMAGE, because | ||
| 27 | # this INITRAMFS_TASK has circular dependency problems | ||
| 28 | # if the initramfs requires kernel modules | ||
| 29 | image_task = d.getVar('INITRAMFS_TASK', True) | ||
| 30 | if image_task: | ||
| 31 | d.appendVarFlag('do_configure', 'depends', ' ${INITRAMFS_TASK}') | ||
| 23 | } | 32 | } |
| 24 | 33 | ||
| 25 | inherit kernel-arch deploy | 34 | inherit kernel-arch deploy |
| @@ -72,9 +81,82 @@ KERNEL_SRC_PATH = "/usr/src/kernel" | |||
| 72 | 81 | ||
| 73 | KERNEL_IMAGETYPE_FOR_MAKE = "${@(lambda s: s[:-3] if s[-3:] == ".gz" else s)(d.getVar('KERNEL_IMAGETYPE', True))}" | 82 | KERNEL_IMAGETYPE_FOR_MAKE = "${@(lambda s: s[:-3] if s[-3:] == ".gz" else s)(d.getVar('KERNEL_IMAGETYPE', True))}" |
| 74 | 83 | ||
| 84 | copy_initramfs() { | ||
| 85 | echo "Copying initramfs into ./usr ..." | ||
| 86 | # Find and use the first initramfs image archive type we find | ||
| 87 | rm -f ${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.cpio | ||
| 88 | for img in cpio.gz cpio.lzo cpio.lzma cpio.xz; do | ||
| 89 | if [ -e "${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE}-${MACHINE}.$img" ]; then | ||
| 90 | cp ${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE}-${MACHINE}.$img ${B}/usr/. | ||
| 91 | case $img in | ||
| 92 | *gz) | ||
| 93 | echo "gzip decompressing image" | ||
| 94 | gunzip -f ${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.$img | ||
| 95 | break | ||
| 96 | ;; | ||
| 97 | *lzo) | ||
| 98 | echo "lzo decompressing image" | ||
| 99 | lzop -df ${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.$img | ||
| 100 | break | ||
| 101 | ;; | ||
| 102 | *lzma) | ||
| 103 | echo "lzma decompressing image" | ||
| 104 | lzmash -df ${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.$img | ||
| 105 | break | ||
| 106 | ;; | ||
| 107 | *xz) | ||
| 108 | echo "xz decompressing image" | ||
| 109 | xz -df ${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.$img | ||
| 110 | break | ||
| 111 | ;; | ||
| 112 | esac | ||
| 113 | fi | ||
| 114 | done | ||
| 115 | echo "Finished copy of initramfs into ./usr" | ||
| 116 | } | ||
| 117 | |||
| 118 | INITRAMFS_BASE_NAME = "${KERNEL_IMAGETYPE}-initramfs-${PV}-${PR}-${MACHINE}-${DATETIME}" | ||
| 119 | INITRAMFS_BASE_NAME[vardepsexclude] = "DATETIME" | ||
| 120 | do_bundle_initramfs () { | ||
| 121 | if [ ! -z "${INITRAMFS_IMAGE}" -a x"${INITRAMFS_IMAGE_BUNDLE}" = x1 ]; then | ||
| 122 | echo "Creating a kernel image with a bundled initramfs..." | ||
| 123 | copy_initramfs | ||
| 124 | if [ -e ${KERNEL_OUTPUT} ] ; then | ||
| 125 | mv -f ${KERNEL_OUTPUT} ${KERNEL_OUTPUT}.bak | ||
| 126 | fi | ||
| 127 | use_alternate_initrd=CONFIG_INITRAMFS_SOURCE=${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.cpio | ||
| 128 | kernel_do_compile | ||
| 129 | mv -f ${KERNEL_OUTPUT} ${KERNEL_OUTPUT}.initramfs | ||
| 130 | mv -f ${KERNEL_OUTPUT}.bak ${KERNEL_OUTPUT} | ||
| 131 | # Update install area | ||
| 132 | echo "There is kernel image bundled with initramfs: ${B}/${KERNEL_OUTPUT}.initramfs" | ||
| 133 | install -m 0644 ${B}/${KERNEL_OUTPUT}.initramfs ${D}/boot/${KERNEL_IMAGETYPE}-initramfs-${MACHINE}.bin | ||
| 134 | echo "${B}/${KERNEL_OUTPUT}.initramfs" | ||
| 135 | cd ${B} | ||
| 136 | # Update deploy directory | ||
| 137 | if [ -e "${KERNEL_OUTPUT}.initramfs" ]; then | ||
| 138 | echo "Copying deploy kernel-initramfs image and setting up links..." | ||
| 139 | initramfs_base_name=${INITRAMFS_BASE_NAME} | ||
| 140 | initramfs_symlink_name=${KERNEL_IMAGETYPE}-initramfs-${MACHINE} | ||
| 141 | install -m 0644 ${KERNEL_OUTPUT}.initramfs ${DEPLOY_DIR_IMAGE}/${initramfs_base_name}.bin | ||
| 142 | cd ${DEPLOY_DIR_IMAGE} | ||
| 143 | ln -sf ${initramfs_base_name}.bin ${initramfs_symlink_name}.bin | ||
| 144 | fi | ||
| 145 | fi | ||
| 146 | } | ||
| 147 | do_bundle_initramfs[nostamp] = "1" | ||
| 148 | addtask bundle_initramfs after do_compile | ||
| 149 | |||
| 75 | kernel_do_compile() { | 150 | kernel_do_compile() { |
| 76 | unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE | 151 | unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE |
| 77 | oe_runmake ${KERNEL_IMAGETYPE_FOR_MAKE} ${KERNEL_ALT_IMAGETYPE} CC="${KERNEL_CC}" LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} | 152 | # The $use_alternate_initrd is only set from |
| 153 | # do_bundle_initramfs() This variable is specifically for the | ||
| 154 | # case where we are making a second pass at the kernel | ||
| 155 | # compilation and we want to force the kernel build to use a | ||
| 156 | # different initramfs image. The way to do that in the kernel | ||
| 157 | # is to specify: | ||
| 158 | # make ...args... CONFIG_INITRAMFS_SOURCE=some_other_initramfs.cpio | ||
| 159 | oe_runmake ${KERNEL_IMAGETYPE_FOR_MAKE} ${KERNEL_ALT_IMAGETYPE} CC="${KERNEL_CC}" LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} $use_alternate_initrd | ||
| 78 | if test "${KERNEL_IMAGETYPE_FOR_MAKE}.gz" = "${KERNEL_IMAGETYPE}"; then | 160 | if test "${KERNEL_IMAGETYPE_FOR_MAKE}.gz" = "${KERNEL_IMAGETYPE}"; then |
| 79 | gzip -9c < "${KERNEL_IMAGETYPE_FOR_MAKE}" > "${KERNEL_OUTPUT}" | 161 | gzip -9c < "${KERNEL_IMAGETYPE_FOR_MAKE}" > "${KERNEL_OUTPUT}" |
| 80 | fi | 162 | fi |
| @@ -219,18 +301,8 @@ kernel_do_configure() { | |||
| 219 | cp "${WORKDIR}/defconfig" "${B}/.config" | 301 | cp "${WORKDIR}/defconfig" "${B}/.config" |
| 220 | fi | 302 | fi |
| 221 | yes '' | oe_runmake oldconfig | 303 | yes '' | oe_runmake oldconfig |
| 222 | |||
| 223 | if [ ! -z "${INITRAMFS_IMAGE}" ]; then | ||
| 224 | for img in cpio.gz cpio.lzo cpio.lzma cpio.xz; do | ||
| 225 | if [ -e "${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE}-${MACHINE}.$img" ]; then | ||
| 226 | cp "${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE}-${MACHINE}.$img" initramfs.$img | ||
| 227 | fi | ||
| 228 | done | ||
| 229 | fi | ||
| 230 | } | 304 | } |
| 231 | 305 | ||
| 232 | do_configure[depends] += "${INITRAMFS_TASK}" | ||
| 233 | |||
| 234 | do_savedefconfig() { | 306 | do_savedefconfig() { |
| 235 | oe_runmake savedefconfig | 307 | oe_runmake savedefconfig |
| 236 | } | 308 | } |
