@@ -524,6 +524,7 @@ python () {
d.setVarFlag(task, 'imagetype', t)
d.appendVarFlag(task, 'prefuncs', ' ' + debug + ' set_image_size')
+ d.prependVarFlag(task, 'postfuncs', 'check_image_max_size ')
d.prependVarFlag(task, 'postfuncs', 'create_symlinks ')
d.appendVarFlag(task, 'subimages', ' ' + ' '.join(subimages))
d.appendVarFlag(task, 'vardeps', ' ' + ' '.join(vardeps))
@@ -626,6 +627,34 @@ python create_symlinks() {
bb.note("Skipping symlink, source does not exist: %s -> %s" % (dst, src))
}
+#
+# Check if image size is lighter than maximum size
+#
+python check_image_max_size() {
+ def get_max_image_size(d, fs):
+ max_size = d.getVar("IMAGE_FILE_MAXSIZE:%s" % fs)
+ if max_size is not None:
+ return int(max_size)
+
+ return None
+
+ deploy_dir = d.getVar('IMGDEPLOYDIR')
+ img_name = d.getVar('IMAGE_NAME')
+ taskname = d.getVar("BB_CURRENTTASK")
+ subimages = (d.getVarFlag("do_" + taskname, 'subimages', False) or "").split()
+
+ for type in subimages:
+ file_name = os.path.join(deploy_dir, img_name + "." + type)
+
+ if os.path.exists(file_name):
+ file_size = os.stat(file_name).st_size / 1024
+ max_size = get_max_image_size(d, type)
+ if max_size is not None:
+ if file_size > max_size:
+ bb.fatal("The image %s size %d(K) exceeds IMAGE_FILE_MAXSIZE: %d(K)" % \
+ (file_name, file_size, max_size))
+}
+
python write_image_output_manifest() {
import json
from pathlib import Path
@@ -234,6 +234,59 @@ UBINIZE_ARGS_mtd_4_256 ?= "-m 4096 -p 256KiB"
self.assertTrue(os.path.exists(image_path),
"%s image %s doesn't exist" % (itype, image_path))
+ def test_image_maxsize_success(self):
+ """
+ Summary: Check if the image built is below maximum size if set
+ Expected: image is built, size below the limit and no error are reported
+ Product: oe-core
+ Author: Charles-Antoine Couret <charles-antoine.couret@mind.be>
+ """
+ image = 'core-image-minimal'
+
+ config = """
+IMAGE_FSTYPES += "ext4"
+IMAGE_FILE_MAXSIZE:ext4 = "300000"
+"""
+ self.write_config(config)
+
+ res = bitbake(image)
+ bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME'], image)
+
+ link_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], "%s.%s" % (bb_vars['IMAGE_LINK_NAME'], "ext4"))
+ image_path = os.path.realpath(link_path)
+ # check if result image is in deploy directory
+ self.assertTrue(os.path.exists(link_path),
+ "%s image %s does not exist" % ("ext4", link_path))
+ # check if result image size is below than maximum value
+ self.assertTrue(os.stat(image_path).st_size / 1024 <= 300000)
+ # No error during execution
+ self.assertEqual(res.status, 0)
+
+ def test_image_maxsize_failure(self):
+ """
+ Summary: Check if the image built with size above limit is triggering error
+ Expected: the image size is above limit and triggers error
+ Product: oe-core
+ Author: Charles-Antoine Couret <charles-antoine.couret@mind.be>
+ """
+ image = 'core-image-minimal'
+
+ config = """
+IMAGE_FSTYPES += "ext4"
+IMAGE_FILE_MAXSIZE:ext4 = "1000"
+"""
+ self.write_config(config)
+
+ res = bitbake(image, ignore_status=True)
+ bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME'], image)
+
+ link_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], "%s.%s" % (bb_vars['IMAGE_LINK_NAME'], "ext4"))
+ # check if result image is not generated
+ self.assertFalse(os.path.exists(link_path),
+ "%s image %s exists" % ("ext4", link_path))
+ # Error triggered during execution
+ self.assertNotEqual(res.status, 0)
+
def test_useradd_static(self):
config = """
USERADDEXTENSION = "useradd-staticids"