diff options
author | Jason Wessel <jason.wessel@windriver.com> | 2013-08-22 18:04:27 -0500 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-09-06 23:04:47 +0100 |
commit | 0fa12e44663c9e27de7d2c33be9132127679d0d3 (patch) | |
tree | f53799785bce2e509b3175cabd8646a370497da4 /meta/classes | |
parent | 95d413d03f66299aa7a835e84dd8ce00d623da6d (diff) | |
download | poky-0fa12e44663c9e27de7d2c33be9132127679d0d3.tar.gz |
kernel.bbclass, image.bbclass: Implement kernel INITRAMFS dependency and bundling
This patch aims to fix the following two cases for the INITRAMFS generation.
1) Allow an image recipe to specify a paired INITRAMFS recipe such
as core-image-minimal-initramfs. This allows building a base
image which always generates the needed initramfs image in one step
2) Allow building a single binary which contains a kernel and
the initramfs.
A key requirement of the initramfs is to be able to add kernel
modules. The current implementation of the INITRAMFS_IMAGE variable
has a circular dependency when using kernel modules in the initramfs
image.bb file that is caused by kernel.bbclass trying to build the
initramfs before the kernel's do_install rule.
The solution for this problem is to have the kernel's
do_bundle_initramfs_image task depend on the do_rootfs from the
INITRAMFS_IMAGE and not some intermediate point. The image.bbclass
will also sets up dependencies to make the initramfs creation task run
last.
The code to bundle the kernel and initramfs together has been added.
At a high level, all it is doing is invoking a second compilation of
the kernel but changing the value of CONFIG_INITRAMFS_SOURCE to point
to the generated initramfs from the image recipe.
[YOCTO #4072]
(From OE-Core rev: 609d5a9ab9e58bb1c2bcc2145399fbc8b701b85a)
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Acked-by: Bruce Ashfield <bruce.ashfield@windriver.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes')
-rw-r--r-- | meta/classes/image.bbclass | 12 | ||||
-rw-r--r-- | meta/classes/kernel.bbclass | 96 |
2 files changed, 96 insertions, 12 deletions
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 | } |