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" |
