diff options
Diffstat (limited to 'meta/classes/image.bbclass')
-rw-r--r-- | meta/classes/image.bbclass | 227 |
1 files changed, 204 insertions, 23 deletions
diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass index ffad5d28d2..5003dacc1c 100644 --- a/meta/classes/image.bbclass +++ b/meta/classes/image.bbclass | |||
@@ -106,21 +106,6 @@ python () { | |||
106 | d.setVarFlag(var, 'func', '1') | 106 | d.setVarFlag(var, 'func', '1') |
107 | } | 107 | } |
108 | 108 | ||
109 | def fstype_variables(d): | ||
110 | import oe.image | ||
111 | |||
112 | image = oe.image.Image(d) | ||
113 | alltypes, fstype_groups, cimages = image._get_image_types() | ||
114 | fstype_vars = set() | ||
115 | for fstype_group in fstype_groups: | ||
116 | for fstype in fstype_group: | ||
117 | fstype_vars.add('IMAGE_CMD_' + fstype) | ||
118 | if fstype in cimages: | ||
119 | for ctype in cimages[fstype]: | ||
120 | fstype_vars.add('COMPRESS_CMD_' + ctype) | ||
121 | |||
122 | return sorted(fstype_vars) | ||
123 | |||
124 | def rootfs_variables(d): | 109 | def rootfs_variables(d): |
125 | from oe.rootfs import variable_depends | 110 | from oe.rootfs import variable_depends |
126 | variables = ['IMAGE_DEVICE_TABLES','BUILD_IMAGES_FROM_FEEDS','IMAGE_TYPES_MASKED','IMAGE_ROOTFS_ALIGNMENT','IMAGE_OVERHEAD_FACTOR','IMAGE_ROOTFS_SIZE','IMAGE_ROOTFS_EXTRA_SPACE', | 111 | variables = ['IMAGE_DEVICE_TABLES','BUILD_IMAGES_FROM_FEEDS','IMAGE_TYPES_MASKED','IMAGE_ROOTFS_ALIGNMENT','IMAGE_OVERHEAD_FACTOR','IMAGE_ROOTFS_SIZE','IMAGE_ROOTFS_EXTRA_SPACE', |
@@ -129,7 +114,6 @@ def rootfs_variables(d): | |||
129 | 'MULTILIB_TEMP_ROOTFS','MULTILIB_VARIANTS','MULTILIBS','ALL_MULTILIB_PACKAGE_ARCHS','MULTILIB_GLOBAL_VARIANTS','BAD_RECOMMENDATIONS','NO_RECOMMENDATIONS','PACKAGE_ARCHS', | 114 | 'MULTILIB_TEMP_ROOTFS','MULTILIB_VARIANTS','MULTILIBS','ALL_MULTILIB_PACKAGE_ARCHS','MULTILIB_GLOBAL_VARIANTS','BAD_RECOMMENDATIONS','NO_RECOMMENDATIONS','PACKAGE_ARCHS', |
130 | 'PACKAGE_CLASSES','TARGET_VENDOR','TARGET_VENDOR','TARGET_ARCH','TARGET_OS','OVERRIDES','BBEXTENDVARIANT','FEED_DEPLOYDIR_BASE_URI','INTERCEPT_DIR','USE_DEVFS', | 115 | 'PACKAGE_CLASSES','TARGET_VENDOR','TARGET_VENDOR','TARGET_ARCH','TARGET_OS','OVERRIDES','BBEXTENDVARIANT','FEED_DEPLOYDIR_BASE_URI','INTERCEPT_DIR','USE_DEVFS', |
131 | 'COMPRESSIONTYPES', 'IMAGE_GEN_DEBUGFS'] | 116 | 'COMPRESSIONTYPES', 'IMAGE_GEN_DEBUGFS'] |
132 | variables.extend(fstype_variables(d)) | ||
133 | variables.extend(command_variables(d)) | 117 | variables.extend(command_variables(d)) |
134 | variables.extend(variable_depends(d)) | 118 | variables.extend(variable_depends(d)) |
135 | return " ".join(variables) | 119 | return " ".join(variables) |
@@ -250,19 +234,13 @@ do_rootfs[umask] = "022" | |||
250 | addtask rootfs before do_build | 234 | addtask rootfs before do_build |
251 | 235 | ||
252 | fakeroot python do_image () { | 236 | fakeroot python do_image () { |
253 | from oe.image import create_image | ||
254 | from oe.image import Image | ||
255 | from oe.utils import execute_pre_post_process | 237 | from oe.utils import execute_pre_post_process |
256 | 238 | ||
257 | i = Image(d) | ||
258 | |||
259 | pre_process_cmds = d.getVar("IMAGE_PREPROCESS_COMMAND", True) | 239 | pre_process_cmds = d.getVar("IMAGE_PREPROCESS_COMMAND", True) |
260 | 240 | ||
261 | execute_pre_post_process(d, pre_process_cmds) | 241 | execute_pre_post_process(d, pre_process_cmds) |
262 | 242 | ||
263 | i._remove_old_symlinks() | 243 | write_wic_env(d) |
264 | |||
265 | i.create() | ||
266 | } | 244 | } |
267 | do_image[dirs] = "${TOPDIR}" | 245 | do_image[dirs] = "${TOPDIR}" |
268 | do_image[umask] = "022" | 246 | do_image[umask] = "022" |
@@ -279,6 +257,209 @@ do_image_complete[dirs] = "${TOPDIR}" | |||
279 | do_image_complete[umask] = "022" | 257 | do_image_complete[umask] = "022" |
280 | addtask do_image_complete after do_image before do_build | 258 | addtask do_image_complete after do_image before do_build |
281 | 259 | ||
260 | # | ||
261 | # Write environment variables used by wic | ||
262 | # to tmp/sysroots/<machine>/imgdata/<image>.env | ||
263 | # | ||
264 | def write_wic_env(d): | ||
265 | wicvars = d.getVar('WICVARS', True) | ||
266 | if not wicvars: | ||
267 | return | ||
268 | |||
269 | stdir = d.getVar('STAGING_DIR_TARGET', True) | ||
270 | outdir = os.path.join(stdir, 'imgdata') | ||
271 | bb.utils.mkdirhier(outdir) | ||
272 | basename = d.getVar('IMAGE_BASENAME', True) | ||
273 | with open(os.path.join(outdir, basename) + '.env', 'w') as envf: | ||
274 | for var in wicvars.split(): | ||
275 | value = d.getVar(var, True) | ||
276 | if value: | ||
277 | envf.write('%s="%s"\n' % (var, value.strip())) | ||
278 | |||
279 | def setup_debugfs_variables(d): | ||
280 | d.appendVar('IMAGE_ROOTFS', '-dbg') | ||
281 | d.appendVar('IMAGE_LINK_NAME', '-dbg') | ||
282 | d.appendVar('IMAGE_NAME','-dbg') | ||
283 | debugfs_image_fstypes = d.getVar('IMAGE_FSTYPES_DEBUGFS', True) | ||
284 | if debugfs_image_fstypes: | ||
285 | d.setVar('IMAGE_FSTYPES', debugfs_image_fstypes) | ||
286 | |||
287 | python setup_debugfs () { | ||
288 | setup_debugfs_variables(d) | ||
289 | } | ||
290 | |||
291 | python () { | ||
292 | vardeps = set() | ||
293 | ctypes = d.getVar('COMPRESSIONTYPES', True).split() | ||
294 | old_overrides = d.getVar('OVERRIDES', 0) | ||
295 | |||
296 | def _image_base_type(type): | ||
297 | if type in ["vmdk", "vdi", "qcow2", "live", "iso", "hddimg"]: | ||
298 | type = "ext4" | ||
299 | basetype = type | ||
300 | for ctype in ctypes: | ||
301 | if type.endswith("." + ctype): | ||
302 | basetype = type[:-len("." + ctype)] | ||
303 | break | ||
304 | |||
305 | return basetype | ||
306 | |||
307 | basetypes = {} | ||
308 | alltypes = d.getVar('IMAGE_FSTYPES', True).split() | ||
309 | typedeps = {} | ||
310 | |||
311 | if d.getVar('IMAGE_GEN_DEBUGFS', True) == "1": | ||
312 | debugfs_fstypes = d.getVar('IMAGE_FSTYPES_DEBUGFS', True).split() | ||
313 | for t in debugfs_fstypes: | ||
314 | alltypes.append("debugfs_" + t) | ||
315 | |||
316 | def _add_type(t): | ||
317 | baset = _image_base_type(t) | ||
318 | if baset not in basetypes: | ||
319 | basetypes[baset]= [] | ||
320 | if t not in basetypes[baset]: | ||
321 | basetypes[baset].append(t) | ||
322 | debug = "" | ||
323 | if t.startswith("debugfs_"): | ||
324 | t = t[8:] | ||
325 | debug = "debugfs_" | ||
326 | deps = (d.getVar('IMAGE_TYPEDEP_' + t, True) or "").split() | ||
327 | vardeps.add('IMAGE_TYPEDEP_' + t) | ||
328 | if baset not in typedeps: | ||
329 | typedeps[baset] = set() | ||
330 | deps = [debug + dep for dep in deps] | ||
331 | for dep in deps: | ||
332 | if dep not in alltypes: | ||
333 | alltypes.append(dep) | ||
334 | _add_type(dep) | ||
335 | basedep = _image_base_type(dep) | ||
336 | typedeps[baset].add(basedep) | ||
337 | |||
338 | for t in alltypes[:]: | ||
339 | _add_type(t) | ||
340 | |||
341 | d.appendVarFlag('do_image', 'vardeps', ' '.join(vardeps)) | ||
342 | |||
343 | for t in basetypes: | ||
344 | vardeps = set() | ||
345 | cmds = [] | ||
346 | subimages = [] | ||
347 | realt = t | ||
348 | |||
349 | localdata = bb.data.createCopy(d) | ||
350 | debug = "" | ||
351 | if t.startswith("debugfs_"): | ||
352 | setup_debugfs_variables(localdata) | ||
353 | debug = "setup_debugfs " | ||
354 | realt = t[8:] | ||
355 | localdata.setVar('OVERRIDES', '%s:%s' % (realt, old_overrides)) | ||
356 | bb.data.update_data(localdata) | ||
357 | localdata.setVar('type', realt) | ||
358 | |||
359 | image_cmd = localdata.getVar("IMAGE_CMD", True) | ||
360 | vardeps.add('IMAGE_CMD_' + realt) | ||
361 | if image_cmd: | ||
362 | cmds.append("\t" + image_cmd) | ||
363 | else: | ||
364 | bb.fatal("No IMAGE_CMD defined for IMAGE_FSTYPES entry '%s' - possibly invalid type name or missing support class" % t) | ||
365 | cmds.append(localdata.expand("\tcd ${DEPLOY_DIR_IMAGE}")) | ||
366 | |||
367 | for bt in basetypes[t]: | ||
368 | for ctype in ctypes: | ||
369 | if bt.endswith("." + ctype): | ||
370 | cmds.append("\t" + localdata.getVar("COMPRESS_CMD_" + ctype, True)) | ||
371 | vardeps.add('COMPRESS_CMD_' + ctype) | ||
372 | subimages.append(realt + "." + ctype) | ||
373 | |||
374 | if realt not in alltypes: | ||
375 | cmds.append(localdata.expand("\trm ${IMAGE_NAME}.rootfs.${type}")) | ||
376 | else: | ||
377 | subimages.append(realt) | ||
378 | |||
379 | d.setVar('do_image_%s' % t, '\n'.join(cmds)) | ||
380 | d.setVarFlag('do_image_%s' % t, 'func', '1') | ||
381 | d.setVarFlag('do_image_%s' % t, 'fakeroot', '1') | ||
382 | d.setVarFlag('do_image_%s' % t, 'prefuncs', debug + 'set_image_size') | ||
383 | d.setVarFlag('do_image_%s' % t, 'postfuncs', 'create_symlinks') | ||
384 | d.setVarFlag('do_image_%s' % t, 'subimages', subimages) | ||
385 | d.appendVarFlag('do_image_%s' % t, 'vardeps', ' '.join(vardeps)) | ||
386 | |||
387 | after = 'do_image' | ||
388 | for dep in typedeps[t]: | ||
389 | after += ' do_image_%s' % dep | ||
390 | |||
391 | bb.debug(2, "Adding type %s before %s, after %s" % (t, 'do_image_complete', after)) | ||
392 | bb.build.addtask('do_image_%s' % t, 'do_image_complete', after, d) | ||
393 | } | ||
394 | |||
395 | # | ||
396 | # Compute the rootfs size | ||
397 | # | ||
398 | def get_rootfs_size(d): | ||
399 | import subprocess | ||
400 | |||
401 | rootfs_alignment = int(d.getVar('IMAGE_ROOTFS_ALIGNMENT', True)) | ||
402 | overhead_factor = float(d.getVar('IMAGE_OVERHEAD_FACTOR', True)) | ||
403 | rootfs_req_size = int(d.getVar('IMAGE_ROOTFS_SIZE', True)) | ||
404 | rootfs_extra_space = eval(d.getVar('IMAGE_ROOTFS_EXTRA_SPACE', True)) | ||
405 | rootfs_maxsize = d.getVar('IMAGE_ROOTFS_MAXSIZE', True) | ||
406 | |||
407 | output = subprocess.check_output(['du', '-ks', | ||
408 | d.getVar('IMAGE_ROOTFS', True)]) | ||
409 | size_kb = int(output.split()[0]) | ||
410 | base_size = size_kb * overhead_factor | ||
411 | base_size = (base_size, rootfs_req_size)[base_size < rootfs_req_size] + \ | ||
412 | rootfs_extra_space | ||
413 | |||
414 | if base_size != int(base_size): | ||
415 | base_size = int(base_size + 1) | ||
416 | else: | ||
417 | base_size = int(base_size) | ||
418 | |||
419 | base_size += rootfs_alignment - 1 | ||
420 | base_size -= base_size % rootfs_alignment | ||
421 | |||
422 | # Check the rootfs size against IMAGE_ROOTFS_MAXSIZE (if set) | ||
423 | if rootfs_maxsize: | ||
424 | rootfs_maxsize_int = int(rootfs_maxsize) | ||
425 | if base_size > rootfs_maxsize_int: | ||
426 | bb.fatal("The rootfs size %d(K) overrides the max size %d(K)" % \ | ||
427 | (base_size, rootfs_maxsize_int)) | ||
428 | return base_size | ||
429 | |||
430 | python set_image_size () { | ||
431 | rootfs_size = get_rootfs_size(d) | ||
432 | d.setVar('ROOTFS_SIZE', str(rootfs_size)) | ||
433 | d.setVarFlag('ROOTFS_SIZE', 'export', '1') | ||
434 | } | ||
435 | |||
436 | # | ||
437 | # Create symlinks to the newly created image | ||
438 | # | ||
439 | python create_symlinks() { | ||
440 | |||
441 | deploy_dir = d.getVar('DEPLOY_DIR_IMAGE', True) | ||
442 | img_name = d.getVar('IMAGE_NAME', True) | ||
443 | link_name = d.getVar('IMAGE_LINK_NAME', True) | ||
444 | manifest_name = d.getVar('IMAGE_MANIFEST', True) | ||
445 | taskname = d.getVar("BB_CURRENTTASK", True) | ||
446 | subimages = d.getVarFlag("do_" + taskname, 'subimages', False) | ||
447 | os.chdir(deploy_dir) | ||
448 | |||
449 | if not link_name: | ||
450 | return | ||
451 | for type in subimages: | ||
452 | if os.path.exists(img_name + ".rootfs." + type): | ||
453 | dst = deploy_dir + "/" + link_name + "." + type | ||
454 | src = img_name + ".rootfs." + type | ||
455 | bb.note("Creating symlink: %s -> %s" % (dst, src)) | ||
456 | if os.path.islink(dst): | ||
457 | if d.getVar('RM_OLD_IMAGE', True) == "1" and \ | ||
458 | os.path.exists(os.path.realpath(dst)): | ||
459 | os.remove(os.path.realpath(dst)) | ||
460 | os.remove(dst) | ||
461 | os.symlink(src, dst) | ||
462 | } | ||
282 | 463 | ||
283 | MULTILIBRE_ALLOW_REP =. "${base_bindir}|${base_sbindir}|${bindir}|${sbindir}|${libexecdir}|${sysconfdir}|${nonarch_base_libdir}/udev|/lib/modules/[^/]*/modules.*|" | 464 | MULTILIBRE_ALLOW_REP =. "${base_bindir}|${base_sbindir}|${bindir}|${sbindir}|${libexecdir}|${sysconfdir}|${nonarch_base_libdir}/udev|/lib/modules/[^/]*/modules.*|" |
284 | MULTILIB_CHECK_FILE = "${WORKDIR}/multilib_check.py" | 465 | MULTILIB_CHECK_FILE = "${WORKDIR}/multilib_check.py" |