diff options
Diffstat (limited to 'meta/classes/image_types.bbclass')
-rw-r--r-- | meta/classes/image_types.bbclass | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/meta/classes/image_types.bbclass b/meta/classes/image_types.bbclass new file mode 100644 index 0000000000..8c49169533 --- /dev/null +++ b/meta/classes/image_types.bbclass | |||
@@ -0,0 +1,251 @@ | |||
1 | def get_imagecmds(d): | ||
2 | cmds = "\n" | ||
3 | old_overrides = d.getVar('OVERRIDES', 0) | ||
4 | |||
5 | alltypes = d.getVar('IMAGE_FSTYPES', True).split() | ||
6 | types = [] | ||
7 | ctypes = d.getVar('COMPRESSIONTYPES', True).split() | ||
8 | cimages = {} | ||
9 | |||
10 | # The elf image depends on the cpio.gz image already having | ||
11 | # been created, so we add that explicit ordering here. | ||
12 | |||
13 | if "elf" in alltypes: | ||
14 | alltypes.remove("elf") | ||
15 | if "cpio.gz" not in alltypes: | ||
16 | alltypes.append("cpio.gz") | ||
17 | alltypes.append("elf") | ||
18 | |||
19 | # Filter out all the compressed images from alltypes | ||
20 | for type in alltypes: | ||
21 | basetype = None | ||
22 | for ctype in ctypes: | ||
23 | if type.endswith("." + ctype): | ||
24 | basetype = type[:-len("." + ctype)] | ||
25 | if basetype not in types: | ||
26 | types.append(basetype) | ||
27 | if basetype not in cimages: | ||
28 | cimages[basetype] = [] | ||
29 | if ctype not in cimages[basetype]: | ||
30 | cimages[basetype].append(ctype) | ||
31 | break | ||
32 | if not basetype and type not in types: | ||
33 | types.append(type) | ||
34 | |||
35 | # Live and VMDK images will be processed via inheriting | ||
36 | # bbclass and does not get processed here. | ||
37 | # vmdk depend on live images also depend on ext3 so ensure its present | ||
38 | # Note: we need to ensure ext3 is in alltypes, otherwise, subimages may | ||
39 | # not contain ext3 and the .rootfs.ext3 file won't be created. | ||
40 | if "vmdk" in types: | ||
41 | if "ext3" not in types: | ||
42 | types.append("ext3") | ||
43 | if "ext3" not in alltypes: | ||
44 | alltypes.append("ext3") | ||
45 | types.remove("vmdk") | ||
46 | if "live" in types: | ||
47 | if "ext3" not in types: | ||
48 | types.append("ext3") | ||
49 | if "ext3" not in alltypes: | ||
50 | alltypes.append("ext3") | ||
51 | types.remove("live") | ||
52 | |||
53 | if d.getVar('IMAGE_LINK_NAME', True): | ||
54 | if d.getVar('RM_OLD_IMAGE', True) == "1": | ||
55 | # Remove the old image | ||
56 | cmds += "\trm -f `find ${DEPLOY_DIR_IMAGE} -maxdepth 1 -type l -name ${IMAGE_LINK_NAME}'.*' -exec readlink -f {} \;`" | ||
57 | # Remove the symlink | ||
58 | cmds += "\n\trm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.*" | ||
59 | |||
60 | for type in types: | ||
61 | ccmd = [] | ||
62 | subimages = [] | ||
63 | localdata = bb.data.createCopy(d) | ||
64 | localdata.setVar('OVERRIDES', '%s:%s' % (type, old_overrides)) | ||
65 | bb.data.update_data(localdata) | ||
66 | localdata.setVar('type', type) | ||
67 | if type in cimages: | ||
68 | for ctype in cimages[type]: | ||
69 | ccmd.append("\t" + localdata.getVar("COMPRESS_CMD_" + ctype, True)) | ||
70 | subimages.append(type + "." + ctype) | ||
71 | if type not in alltypes: | ||
72 | ccmd.append(localdata.expand("\trm ${IMAGE_NAME}.rootfs.${type}")) | ||
73 | else: | ||
74 | subimages.append(type) | ||
75 | localdata.setVar('ccmd', "\n".join(ccmd)) | ||
76 | localdata.setVar('subimages', " ".join(subimages)) | ||
77 | cmd = localdata.getVar("IMAGE_CMD", True) | ||
78 | localdata.setVar('cmd', cmd) | ||
79 | cmds += "\n" + localdata.getVar("runimagecmd", True) | ||
80 | return cmds | ||
81 | |||
82 | # The default aligment of the size of the rootfs is set to 1KiB. In case | ||
83 | # you're using the SD card emulation of a QEMU system simulator you may | ||
84 | # set this value to 2048 (2MiB alignment). | ||
85 | IMAGE_ROOTFS_ALIGNMENT ?= "1" | ||
86 | |||
87 | runimagecmd () { | ||
88 | # Image generation code for image type ${type} | ||
89 | # The base_size gets calculated: | ||
90 | # - initial size determined by `du -ks` of the IMAGE_ROOTFS | ||
91 | # - then multiplied by the IMAGE_OVERHEAD_FACTOR | ||
92 | # - tested against IMAGE_ROOTFS_SIZE | ||
93 | # - round up ROOTFS_SIZE to IMAGE_ROOTFS_ALIGNMENT | ||
94 | ROOTFS_SIZE=`du -ks ${IMAGE_ROOTFS} | awk '{base_size = $1 * ${IMAGE_OVERHEAD_FACTOR}; base_size = ((base_size > ${IMAGE_ROOTFS_SIZE} ? base_size : ${IMAGE_ROOTFS_SIZE}) + ${IMAGE_ROOTFS_EXTRA_SPACE}); if (base_size != int(base_size)) base_size = int(base_size + 1); base_size = base_size + ${IMAGE_ROOTFS_ALIGNMENT} - 1; base_size -= base_size % ${IMAGE_ROOTFS_ALIGNMENT}; print base_size }'` | ||
95 | ${cmd} | ||
96 | # Now create the needed compressed versions | ||
97 | cd ${DEPLOY_DIR_IMAGE}/ | ||
98 | ${ccmd} | ||
99 | # And create the symlinks | ||
100 | if [ -n "${IMAGE_LINK_NAME}" ]; then | ||
101 | for type in ${subimages}; do | ||
102 | if [ -e ${IMAGE_NAME}.rootfs.$type ]; then | ||
103 | ln -s ${IMAGE_NAME}.rootfs.$type ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.$type | ||
104 | fi | ||
105 | done | ||
106 | fi | ||
107 | } | ||
108 | |||
109 | def imagetypes_getdepends(d): | ||
110 | def adddep(depstr, deps): | ||
111 | for i in (depstr or "").split(): | ||
112 | if i not in deps: | ||
113 | deps.append(i) | ||
114 | |||
115 | deps = [] | ||
116 | ctypes = d.getVar('COMPRESSIONTYPES', True).split() | ||
117 | for type in (d.getVar('IMAGE_FSTYPES', True) or "").split(): | ||
118 | if type == "vmdk" or type == "live": | ||
119 | type = "ext3" | ||
120 | basetype = type | ||
121 | for ctype in ctypes: | ||
122 | if type.endswith("." + ctype): | ||
123 | basetype = type[:-len("." + ctype)] | ||
124 | adddep(d.getVar("COMPRESS_DEPENDS_%s" % ctype, True), deps) | ||
125 | break | ||
126 | adddep(d.getVar('IMAGE_DEPENDS_%s' % basetype, True) , deps) | ||
127 | |||
128 | depstr = "" | ||
129 | for dep in deps: | ||
130 | depstr += " " + dep + ":do_populate_sysroot" | ||
131 | return depstr | ||
132 | |||
133 | |||
134 | XZ_COMPRESSION_LEVEL ?= "-e -6" | ||
135 | XZ_INTEGRITY_CHECK ?= "crc32" | ||
136 | XZ_THREADS ?= "-T 0" | ||
137 | |||
138 | IMAGE_CMD_jffs2 = "mkfs.jffs2 --root=${IMAGE_ROOTFS} --faketime --output=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2 -n ${EXTRA_IMAGECMD}" | ||
139 | IMAGE_CMD_sum.jffs2 = "${IMAGE_CMD_jffs2} && sumtool -i ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2 \ | ||
140 | -o ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.sum.jffs2 -n ${EXTRA_IMAGECMD}" | ||
141 | |||
142 | IMAGE_CMD_cramfs = "mkfs.cramfs ${IMAGE_ROOTFS} ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.cramfs ${EXTRA_IMAGECMD}" | ||
143 | |||
144 | oe_mkext234fs () { | ||
145 | fstype=$1 | ||
146 | extra_imagecmd="" | ||
147 | |||
148 | if [ $# -gt 1 ]; then | ||
149 | shift | ||
150 | extra_imagecmd=$@ | ||
151 | fi | ||
152 | |||
153 | # Create a sparse image block | ||
154 | dd if=/dev/zero of=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.$fstype seek=$ROOTFS_SIZE count=0 bs=1k | ||
155 | mkfs.$fstype -F $extra_imagecmd ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.$fstype | ||
156 | populate-extfs.sh ${IMAGE_ROOTFS} ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.$fstype | ||
157 | } | ||
158 | |||
159 | IMAGE_CMD_ext2 = "oe_mkext234fs ext2 ${EXTRA_IMAGECMD}" | ||
160 | IMAGE_CMD_ext3 = "oe_mkext234fs ext3 ${EXTRA_IMAGECMD}" | ||
161 | IMAGE_CMD_ext4 = "oe_mkext234fs ext4 ${EXTRA_IMAGECMD}" | ||
162 | |||
163 | IMAGE_CMD_btrfs () { | ||
164 | mkfs.btrfs -b `expr ${ROOTFS_SIZE} \* 1024` ${EXTRA_IMAGECMD} -r ${IMAGE_ROOTFS} ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.btrfs | ||
165 | } | ||
166 | |||
167 | IMAGE_CMD_squashfs = "mksquashfs ${IMAGE_ROOTFS} ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.squashfs ${EXTRA_IMAGECMD} -noappend" | ||
168 | IMAGE_CMD_squashfs-xz = "mksquashfs ${IMAGE_ROOTFS} ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.squashfs-xz ${EXTRA_IMAGECMD} -noappend -comp xz" | ||
169 | IMAGE_CMD_tar = "cd ${IMAGE_ROOTFS} && tar -cvf ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.tar ." | ||
170 | |||
171 | CPIO_TOUCH_INIT () { | ||
172 | if [ ! -L ${IMAGE_ROOTFS}/init ] | ||
173 | then | ||
174 | touch ${IMAGE_ROOTFS}/init | ||
175 | fi | ||
176 | } | ||
177 | IMAGE_CMD_cpio () { | ||
178 | ${CPIO_TOUCH_INIT} | ||
179 | cd ${IMAGE_ROOTFS} && (find . | cpio -o -H newc >${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.cpio) | ||
180 | } | ||
181 | |||
182 | ELF_KERNEL ?= "${STAGING_DIR_HOST}/usr/src/kernel/${KERNEL_IMAGETYPE}" | ||
183 | ELF_APPEND ?= "ramdisk_size=32768 root=/dev/ram0 rw console=" | ||
184 | |||
185 | IMAGE_CMD_elf () { | ||
186 | test -f ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.elf && rm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.elf | ||
187 | mkelfImage --kernel=${ELF_KERNEL} --initrd=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.cpio.gz --output=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.elf --append='${ELF_APPEND}' ${EXTRA_IMAGECMD} | ||
188 | } | ||
189 | |||
190 | UBI_VOLNAME ?= "${MACHINE}-rootfs" | ||
191 | |||
192 | IMAGE_CMD_ubi () { | ||
193 | echo \[ubifs\] > ubinize.cfg | ||
194 | echo mode=ubi >> ubinize.cfg | ||
195 | echo image=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ubifs >> ubinize.cfg | ||
196 | echo vol_id=0 >> ubinize.cfg | ||
197 | echo vol_type=dynamic >> ubinize.cfg | ||
198 | echo vol_name=${UBI_VOLNAME} >> ubinize.cfg | ||
199 | echo vol_flags=autoresize >> ubinize.cfg | ||
200 | mkfs.ubifs -r ${IMAGE_ROOTFS} -o ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ubifs ${MKUBIFS_ARGS} && ubinize -o ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ubi ${UBINIZE_ARGS} ubinize.cfg | ||
201 | } | ||
202 | IMAGE_CMD_ubifs = "mkfs.ubifs -r ${IMAGE_ROOTFS} -o ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ubifs ${MKUBIFS_ARGS}" | ||
203 | |||
204 | EXTRA_IMAGECMD = "" | ||
205 | |||
206 | inherit siteinfo | ||
207 | JFFS2_ENDIANNESS ?= "${@base_conditional('SITEINFO_ENDIANNESS', 'le', '--little-endian', '--big-endian', d)}" | ||
208 | JFFS2_ERASEBLOCK ?= "0x40000" | ||
209 | EXTRA_IMAGECMD_jffs2 ?= "--pad ${JFFS2_ENDIANNESS} --eraseblock=${JFFS2_ERASEBLOCK} --no-cleanmarkers" | ||
210 | |||
211 | # Change these if you want default mkfs behavior (i.e. create minimal inode number) | ||
212 | EXTRA_IMAGECMD_ext2 ?= "-i 8192" | ||
213 | EXTRA_IMAGECMD_ext3 ?= "-i 8192" | ||
214 | EXTRA_IMAGECMD_ext4 ?= "-i 8192" | ||
215 | EXTRA_IMAGECMD_btrfs ?= "" | ||
216 | EXTRA_IMAGECMD_elf ?= "" | ||
217 | |||
218 | IMAGE_DEPENDS = "" | ||
219 | IMAGE_DEPENDS_jffs2 = "mtd-utils-native" | ||
220 | IMAGE_DEPENDS_sum.jffs2 = "mtd-utils-native" | ||
221 | IMAGE_DEPENDS_cramfs = "util-linux-native" | ||
222 | IMAGE_DEPENDS_ext2 = "e2fsprogs-native" | ||
223 | IMAGE_DEPENDS_ext3 = "e2fsprogs-native" | ||
224 | IMAGE_DEPENDS_ext4 = "e2fsprogs-native" | ||
225 | IMAGE_DEPENDS_btrfs = "btrfs-tools-native" | ||
226 | IMAGE_DEPENDS_squashfs = "squashfs-tools-native" | ||
227 | IMAGE_DEPENDS_squashfs-xz = "squashfs-tools-native" | ||
228 | IMAGE_DEPENDS_elf = "virtual/kernel mkelfimage-native" | ||
229 | IMAGE_DEPENDS_ubi = "mtd-utils-native" | ||
230 | IMAGE_DEPENDS_ubifs = "mtd-utils-native" | ||
231 | |||
232 | # This variable is available to request which values are suitable for IMAGE_FSTYPES | ||
233 | IMAGE_TYPES = "jffs2 sum.jffs2 cramfs ext2 ext2.gz ext2.bz2 ext3 ext3.gz ext2.lzma btrfs live squashfs squashfs-xz ubi ubifs tar tar.gz tar.bz2 tar.xz cpio cpio.gz cpio.xz cpio.lzma vmdk elf" | ||
234 | |||
235 | COMPRESSIONTYPES = "gz bz2 lzma xz" | ||
236 | COMPRESS_CMD_lzma = "lzma -k -f -7 ${IMAGE_NAME}.rootfs.${type}" | ||
237 | COMPRESS_CMD_gz = "gzip -f -9 -c ${IMAGE_NAME}.rootfs.${type} > ${IMAGE_NAME}.rootfs.${type}.gz" | ||
238 | COMPRESS_CMD_bz2 = "bzip2 -f -k ${IMAGE_NAME}.rootfs.${type}" | ||
239 | COMPRESS_CMD_xz = "xz -f -k -c ${XZ_COMPRESSION_LEVEL} ${XZ_THREADS} --check=${XZ_INTEGRITY_CHECK} ${IMAGE_NAME}.rootfs.${type} > ${IMAGE_NAME}.rootfs.${type}.xz" | ||
240 | COMPRESS_DEPENDS_lzma = "xz-native" | ||
241 | COMPRESS_DEPENDS_gz = "" | ||
242 | COMPRESS_DEPENDS_bz2 = "" | ||
243 | COMPRESS_DEPENDS_xz = "xz-native" | ||
244 | |||
245 | RUNNABLE_IMAGE_TYPES ?= "ext2 ext3" | ||
246 | RUNNABLE_MACHINE_PATTERNS ?= "qemu" | ||
247 | |||
248 | DEPLOYABLE_IMAGE_TYPES ?= "hddimg iso" | ||
249 | |||
250 | # Use IMAGE_EXTENSION_xxx to map image type 'xxx' with real image file extension name(s) for Hob | ||
251 | IMAGE_EXTENSION_live = "hddimg iso" | ||