From patchwork Sat Dec 13 20:53:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Badrikesh Prusty X-Patchwork-Id: 4722 Return-Path: Received: from shymkent.ilbers.de ([unix socket]) by shymkent (Cyrus 2.5.10-Debian-2.5.10-3+deb9u2) with LMTPA; Sat, 13 Dec 2025 21:53:33 +0100 X-Sieve: CMU Sieve 2.4 Received: from mail-lf1-f60.google.com (mail-lf1-f60.google.com [209.85.167.60]) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8+deb9u1) with ESMTPS id 5BDKrWt7005584 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Sat, 13 Dec 2025 21:53:33 +0100 Received: by mail-lf1-f60.google.com with SMTP id 2adb3069b0e04-59580c95819sf1407538e87.0 for ; Sat, 13 Dec 2025 12:53:33 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1765659207; cv=pass; d=google.com; s=arc-20240605; b=MXgbQhN/qUYpoXSIH74h00q5DOsYDGxTIdaomGZRBJhyhlQTSkl6GR91LsIbZfH5Yw 63xp6JFVKugwuxzGTNHq9JmgemBWLDFYmo7j+4bzn+G0THNblEIV9Il6BaidpiZdAEdJ VuaTDMTUxUQNCPMi9ObIEXREewRHsdo8O9KJfKkd/+JYAUGNVmApL5v7aZf+1aiTosJL s8pp8v5xwqxh5XLa+hCmZuGBr6Y0SG4uEqAYn55ywJfFBEPrLmHi04ZROPGSeosoE6Gz m7cpOM5S9HW7dmnY+z9IK+8Gw/MlijmZOWTMoHXZFcGG3kODycI0rZBs7n3qwp+b13wV v9yg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:reply-to:feedback-id:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=24luX/qlt5LI+ukb7jZym8GG6L3GXIdxJ8iLdzkLQVo=; fh=A48N3LBAtHNmdZQ14H1vB1INNnlv7m8bUPZwTjfG0v8=; b=QDTnkLt6XQc5Uh/jsQcFVzdv2vDRzu1E+X4A8t2zXK8vZvA3RXVbZBxx98K7vT+AMq NY0FeF90zOV/Txul9w4+UdswAMs3oWagiyXuSs3NucyULpM5APtqotCMiY2OqTvM625c fX/Jy7NKby4TjIckYSfBmfX9S4cOJvTueLh1JpRQQpg4gHWwl3vEvFClJv9neoyKFiFG cV/xdrku5YVHIYMvKfXtZEUGvWU31DQkDoB4FSz80iZGy7yljT1MpD+uo/2NH6yoNDES Q0eL5yqTBZOw3pv2X3XUMASdnfBMpn9SieGA0dhuAvWa/hmFUntFsfPmWC6NLS2VXaSM xfYw==; darn=isar-build.org ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm2 header.b=ev4lsSl8; spf=pass (google.com: domain of fm-1328765-20251213205322e48dff2eb60002072f-lyk0e1@rts-flowmailer.siemens.com designates 185.136.65.227 as permitted sender) smtp.mailfrom=fm-1328765-20251213205322e48dff2eb60002072f-LyK0e1@rts-flowmailer.siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20230601; t=1765659207; x=1766264007; darn=isar-build.org; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:reply-to :x-original-authentication-results:x-original-sender:feedback-id :mime-version:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to; bh=24luX/qlt5LI+ukb7jZym8GG6L3GXIdxJ8iLdzkLQVo=; b=A+igN5lPqZPnv9TSCGIxYi/uFogkuPRKvxa0OEMMPtun3GgSl5XzJ2O3vI/w5G8ova H/Goc6tfVNmPnVxNUfTXnEo7FoO984A0UPPmqoE4IuxovDt1GGwaUlllGCnqpnNsBSjm IrfvG0spjqxgXn5XiAWrYip43BqyW2aPDmyUJ6Zf7B8hYQPcJ2p7s/zRYHVRyUUHOYPj jkxLvTaDohCpU3c948CoQ8b0U5F3S/52/gq00MCn4ngEkRCAgrHVJffMyhUlQTjCU0Wb 9V1+CMG8rBTNuPsWybRN7ntDJqAP6wwr5xaL9u58CnhpeXIwDxa5d17orPoauU3CZ26I 8SCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765659207; x=1766264007; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :x-spam-checked-in-group:list-id:mailing-list:precedence:reply-to :x-original-authentication-results:x-original-sender:feedback-id :mime-version:message-id:date:subject:cc:to:from:x-beenthere :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=24luX/qlt5LI+ukb7jZym8GG6L3GXIdxJ8iLdzkLQVo=; b=G2b6fcdsh8uWwcznATFkT3u7BSdLHGgwq7Qc2gPjlk71W9J8CiG5b7bD8EPQah+h64 sK2GIIUI9MSU6wPgSxbXp3ARGjVXjoCKwmlxOE80X6KPe/1q7myNRufhEN02BnNjBPsW LO98zFCip2IoSje9jHVZRieoe9SQe1vHINhi22+1A245WIFRMcwZWnY3bv+c3RxVZ6u9 3xD7G4tC6Xqhs/+MbX7IlvTUE74wmSgUIfsY79u81Bi2NN1wngzMo9/qWs6UbWdhtvOO WrqszGe9Gl98Z30CNogyKU1fkFvhX2VEQpBkOLQvlbUW947TswoQiHJKQPE/zkXbvu8g kH0Q== X-Forwarded-Encrypted: i=2; AJvYcCVkCPGhGa3TpyXhXKkkSClheD39vaWKt+YK+bN5J3f0XMetM1lY9NO/xI6h1jEvfFBS910LVhs=@isar-build.org X-Gm-Message-State: AOJu0YxEe1KOGI8vUvAJWqnQSOxYZlgMGPoExuIhEB8ZW5D9odI/mRWn xV1IkainTqR3iqi2xLuodPN23sJyxegHi49zgFdQvrwtUA3JlF3bUPVL X-Google-Smtp-Source: AGHT+IGF7oJOX8irEfR2V2eDNiI7uDg7fOoBb1vKahFbVWm/teacqCc9H2aHX4/t8J0tf6wqOpYXnA== X-Received: by 2002:a05:6512:3e1d:b0:598:eecb:c891 with SMTP id 2adb3069b0e04-598faa7c97emr2045158e87.52.1765659206743; Sat, 13 Dec 2025 12:53:26 -0800 (PST) X-BeenThere: isar-users@googlegroups.com; h="AWVwgWb+mlANh8TbxjH+/oUzZDn2F/x5rGVKVe+OaIrmq8WDNA==" Received: by 2002:a05:6512:1188:b0:597:d79e:e081 with SMTP id 2adb3069b0e04-598fa3fb650ls790321e87.1.-pod-prod-03-eu; Sat, 13 Dec 2025 12:53:24 -0800 (PST) X-Received: by 2002:a05:6512:10cd:b0:594:51bd:8fcd with SMTP id 2adb3069b0e04-598faa132d7mr2173269e87.16.1765659203774; Sat, 13 Dec 2025 12:53:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1765659203; cv=none; d=google.com; s=arc-20240605; b=PP0BFv1nnkB530Q47p7+vOkMR4la6ALCLzzSuRhwWuJuT9Il+FUt+a5vUJF8an8jih QPW5VT+Esp7so9EQ3C+rbLPXlUZY6tXUYG/4oDM8XqifY+AbFAUg7QJLIZxb6VX9ON8m YptFGZ/Om01e+35300Q18BXlcXjIQ55W6UkX3C5A/rn7WkKr5rXQUpuzWUHfMxVrviCv 9XR/355/Ddyy+81yjtipg+xeqDOtQhZt++MEDlvPuz3Sprb0dy8br9ghQLAPxUgDtyUK nQkFDiTu6uYk2Gw1UOuFBWDxMqAAEwZDIWk8EDtCHEwCBq5aZeapg0iq620t5tSH4KxU NZAw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=feedback-id:content-transfer-encoding:mime-version:message-id:date :subject:cc:to:from:dkim-signature; bh=4A0O1Li1JTFEbssOSn9XPfRTzl0yeG1pjVZ4yeBAqyg=; fh=Pt40xOu0ssl96dVOzN1FNmNtHgqv9aW9VmLrBG8UyVY=; b=jrBbVqKiIK0MYwR5eSEqVvG+sh385L2/LQYKw3nSjkyiJ03lEFouK8yTJfKDCrqcRz P8KYxzFwI7C1an5oVWljhDOLSw3bw3B452bKrsnCsYyunwvektVdM7wise5eo72jnZe1 aX99Gc54zV/gOHEFYMELOhg65NtilQogYiu1xsdqukQC+LMeu9UjHXBjH9kYiLTeoUwD 4yui49SrA67sVd7nBjD8Eey19CDhg8iE2WhJnZHYmR6rtdKFMZZobM6yptx3/z7YhWGa XleoD8Un2PfXnSsBHtPQTpMzSg+0tdLcDqRY3rVvySimUPI1MPIfGNJ5f3ZHqMh4KdRo WEGw==; dara=google.com ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm2 header.b=ev4lsSl8; spf=pass (google.com: domain of fm-1328765-20251213205322e48dff2eb60002072f-lyk0e1@rts-flowmailer.siemens.com designates 185.136.65.227 as permitted sender) smtp.mailfrom=fm-1328765-20251213205322e48dff2eb60002072f-LyK0e1@rts-flowmailer.siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com Received: from mta-65-227.siemens.flowmailer.net (mta-65-227.siemens.flowmailer.net. [185.136.65.227]) by gmr-mx.google.com with ESMTPS id 2adb3069b0e04-598f2f6cb21si136682e87.3.2025.12.13.12.53.23 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 13 Dec 2025 12:53:23 -0800 (PST) Received-SPF: pass (google.com: domain of fm-1328765-20251213205322e48dff2eb60002072f-lyk0e1@rts-flowmailer.siemens.com designates 185.136.65.227 as permitted sender) client-ip=185.136.65.227; Received: by mta-65-227.siemens.flowmailer.net with ESMTPSA id 20251213205322e48dff2eb60002072f for ; Sat, 13 Dec 2025 21:53:22 +0100 X-Patchwork-Original-From: "'Badrikesh Prusty' via isar-users" From: Badrikesh Prusty To: isar-users@googlegroups.com Cc: Badrikesh Prusty Subject: [PATCH 1/2] installer: support bundling multiple target images Date: Sat, 13 Dec 2025 15:53:00 -0500 Message-ID: <20251213205301.2209317-1-badrikesh.prusty@siemens.com> MIME-Version: 1.0 X-Flowmailer-Platform: Siemens Feedback-ID: 519:519-1328765:519-21489:flowmailer X-Original-Sender: badrikesh.prusty@siemens.com X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=fm2 header.b=ev4lsSl8; spf=pass (google.com: domain of fm-1328765-20251213205322e48dff2eb60002072f-lyk0e1@rts-flowmailer.siemens.com designates 185.136.65.227 as permitted sender) smtp.mailfrom=fm-1328765-20251213205322e48dff2eb60002072f-LyK0e1@rts-flowmailer.siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com X-Original-From: Badrikesh Prusty Reply-To: Badrikesh Prusty Precedence: list Mailing-list: list isar-users@googlegroups.com; contact isar-users+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: isar-users@googlegroups.com X-Google-Group-Id: 914930254986 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , X-Spam-Status: No, score=-4.9 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, RCVD_IN_DNSWL_BLOCKED,RCVD_IN_MSPIKE_H2,RCVD_IN_RP_CERTIFIED, RCVD_IN_RP_RNBL,RCVD_IN_RP_SAFE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on shymkent.ilbers.de X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= Introduce `INSTALLER_TARGET_IMAGES` to allow bundling multiple target images (defaulting to `INSTALLER_TARGET_IMAGE` if unset), dynamically generate `ROOTFS_ADDITIONAL_FILES` for each target image including `.wic` and `.wic.bmap` files, and update multiconfig task dependencies to include all configured installer images. The `deploy-image` script of the `isar-installer` already supports multiple target images and allows the user to select the required image to install. Example: To bundle multiple target images, set the following in `local.conf`: ``` INSTALLER_TARGET_IMAGES = "isar-image-base isar-image-debug isar-image-ci" ``` Signed-off-by: Badrikesh Prusty --- RECIPE-API-CHANGELOG.md | 13 ++++ .../installer-add-rootfs.bbclass | 69 +++++++++++++------ 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/RECIPE-API-CHANGELOG.md b/RECIPE-API-CHANGELOG.md index 6d7c56b9..07034b83 100644 --- a/RECIPE-API-CHANGELOG.md +++ b/RECIPE-API-CHANGELOG.md @@ -919,3 +919,16 @@ The following includes were considered internal and are no longer available: The other original includes still exist and inherit the corresponding new class. However, they issue a warning to perform the recommended conversion because these transitional includes will eventually be dropped. + +### Support bundling multiple images in the installer + +Introduce `INSTALLER_TARGET_IMAGES` to allow bundling multiple installer +images (defaulting to `INSTALLER_TARGET_IMAGE` if unset), dynamically +generate `ROOTFS_ADDITIONAL_FILES` for each target image including `.wic` +and `.wic.bmap` files, and update MC task dependencies to include all +configured installer images. + +Example: To bundle multiple target images, set the following in local.conf: +``` +INSTALLER_TARGET_IMAGES = "isar-image-base isar-image-debug isar-image-ci" +``` diff --git a/meta-isar/classes-recipe/installer-add-rootfs.bbclass b/meta-isar/classes-recipe/installer-add-rootfs.bbclass index 6708932c..2fa551bd 100644 --- a/meta-isar/classes-recipe/installer-add-rootfs.bbclass +++ b/meta-isar/classes-recipe/installer-add-rootfs.bbclass @@ -9,6 +9,7 @@ inherit rootfs-add-files INSTALLER_MC ??= "isar-installer" INSTALLER_TARGET_IMAGE ??= "isar-image-base" +INSTALLER_TARGET_IMAGES ??= "${INSTALLER_TARGET_IMAGE}" INSTALLER_TARGET_MC ??= "installer-target" INSTALLER_TARGET_DISTRO ??= "${DISTRO}" INSTALLER_TARGET_MACHINE ??= "${MACHINE}" @@ -19,39 +20,65 @@ IMAGE_DATA_POSTFIX ??= "wic.zst" IMAGE_DATA_POSTFIX:buster ??= "wic.xz" IMAGE_DATA_POSTFIX:bullseye ??= "wic.xz" -ROOTFS_ADDITIONAL_FILES ??= "installer-target installer-target-bmap" - -def get_installer_source(d, suffix): - installer_target_image = d.getVar('INSTALLER_TARGET_IMAGE') or "" - if not installer_target_image: - return "" +def get_installer_sources(d, suffix): + installer_target_images = sorted(set((d.getVar('INSTALLER_TARGET_IMAGES') or "").split())) + if not installer_target_images: + return [""] target_deploy_dir = d.getVar('INSTALLER_TARGET_DEPLOY_DIR_IMAGE') - image_data = d.getVar('IMAGE_DATA_FILE') - return f"{target_deploy_dir}/{image_data}.{suffix}" + target_distro = d.getVar('INSTALLER_TARGET_DISTRO') + target_machine = d.getVar('INSTALLER_TARGET_MACHINE') + sources = [] + for image in installer_target_images: + image_data = f"{image}-{target_distro}-{target_machine}" + sources.append(f"{target_deploy_dir}/{image_data}.{suffix}") + return sources -def get_installer_destination(d, suffix): - installer_target_image = d.getVar('INSTALLER_TARGET_IMAGE') or "" - if not installer_target_image: - return "/install/keep" - image_data = d.getVar('IMAGE_DATA_FILE') - return f"/install/{image_data}.{suffix}" +def get_installer_destinations(d, suffix): + installer_target_images = sorted(set((d.getVar('INSTALLER_TARGET_IMAGES') or "").split())) + if not installer_target_images: + return ["/install/keep"] + target_distro = d.getVar('INSTALLER_TARGET_DISTRO') + target_machine = d.getVar('INSTALLER_TARGET_MACHINE') + dests = [] + for image in installer_target_images: + image_data = f"{image}-{target_distro}-{target_machine}" + dests.append(f"/install/{image_data}.{suffix}") + return dests def get_mc_depends(d, task): - installer_target_image = d.getVar('INSTALLER_TARGET_IMAGE') or "" - if not installer_target_image: + installer_target_images = sorted(set((d.getVar('INSTALLER_TARGET_IMAGES') or "").split())) + if not installer_target_images: return "" installer_mc = d.getVar('INSTALLER_MC') or "" installer_target_mc = d.getVar('INSTALLER_TARGET_MC') or "" - return f"mc:{installer_mc}:{installer_target_mc}:{installer_target_image}:{task}" + deps = [] + for image in installer_target_images: + deps.append(f"mc:{installer_mc}:{installer_target_mc}:{image}:{task}") + return " ".join(deps) def get_image_type(suffix): image_type = suffix.split(".")[0] return f"{image_type}" -ROOTFS_ADDITIONAL_FILE_installer-target[source] = "${@ get_installer_source(d, d.getVar('IMAGE_DATA_POSTFIX'))}" -ROOTFS_ADDITIONAL_FILE_installer-target[destination] = "${@ get_installer_destination(d, d.getVar('IMAGE_DATA_POSTFIX'))}" -ROOTFS_ADDITIONAL_FILE_installer-target-bmap[source] = "${@ get_installer_source(d, "wic.bmap")}" -ROOTFS_ADDITIONAL_FILE_installer-target-bmap[destination] = "${@ get_installer_destination(d, "wic.bmap")}" +python() { + entries = [] + + def add_entries(postfix, suffix): + sources = get_installer_sources(d, suffix) + dests = get_installer_destinations(d, suffix) + + for idx, (src, dst) in enumerate(zip(sources, dests)): + name = f"installer-target-{idx}{postfix}" + var = f"ROOTFS_ADDITIONAL_FILE_{name}" + entries.append(name) + d.setVarFlag(var, "source", src) + d.setVarFlag(var, "destination", dst) + + add_entries("", d.getVar("IMAGE_DATA_POSTFIX")) + add_entries("-bmap", "wic.bmap") + + d.setVar("ROOTFS_ADDITIONAL_FILES", " ".join(entries)) +} INSTALLER_TARGET_TASK ??="do_image_${@ get_image_type(d.getVar('IMAGE_DATA_POSTFIX'))}" do_rootfs_install[mcdepends] += "${@ get_mc_depends(d, d.getVar('INSTALLER_TARGET_TASK'))}"