Openembedded Core Discussions
 help / color / mirror / Atom feed
* [PATCH] add variable APPENDS for multiple boot configuration
@ 2019-08-02 11:39 chee.yang.lee
  2019-08-02 12:01 ` ✗ patchtest: failure for " Patchwork
  0 siblings, 1 reply; 2+ messages in thread
From: chee.yang.lee @ 2019-08-02 11:39 UTC (permalink / raw)
  To: openembedded-core

From: Chee Yang Lee <chee.yang.lee@intel.com>

This patch introduce new variable APPENDS to define multiple
boot configuration for systemd-boot and grub-efi.

APPENDS set the different in kernel option for each .conf
file(for systemd-boot) or menuentry(for grub-efi).
Include the differences in the title.
Separate each configuration with ";".

e.g.:
APPEND = "console=tty0 rootwait"
APPENDS = " i915.enable_guc=0; i915.enable_guc=2"

for systemd-boot, above setting will produce 2 .conf,
boot-1.conf and boot-2.conf which set with below title and option:

boot-1.conf -
	title boot-1 i915.enable_guc=0
	option console=tty0 rootwait i915.enable_guc=0

boot-2.conf -
	title boot-2 i915.enable_guc=2
	option console=tty0 rootwait i915.enable_guc=2

This patch also update oeqa/selftest/wic testcase.
---
 meta/classes/grub-efi-cfg.bbclass             | 46 +++++++-------
 meta/classes/image_types_wic.bbclass          |  2 +-
 meta/classes/systemd-boot-cfg.bbclass         | 75 +++++++++++++----------
 meta/lib/oeqa/selftest/cases/wic.py           |  2 +-
 scripts/lib/wic/plugins/source/bootimg-efi.py | 86 +++++++++++++++------------
 5 files changed, 118 insertions(+), 93 deletions(-)

diff --git a/meta/classes/grub-efi-cfg.bbclass b/meta/classes/grub-efi-cfg.bbclass
index f661a69..811c78f 100644
--- a/meta/classes/grub-efi-cfg.bbclass
+++ b/meta/classes/grub-efi-cfg.bbclass
@@ -89,29 +89,31 @@ python build_efi_cfg() {
     for label in labels.split():
         localdata = d.createCopy()
 
+        initrd = localdata.getVar('INITRD')
+        append = localdata.getVar('APPEND')
+        appends = localdata.getVar('APPENDS') if localdata.getVar('APPENDS') else ""
         for btype in btypes:
-            cfgfile.write('\nmenuentry \'%s%s\'{\n' % (label, btype[0]))
-            lb = label
-            if label == "install":
-                lb = "install-efi"
-            kernel = localdata.getVar('KERNEL_IMAGETYPE')
-            cfgfile.write('linux /%s LABEL=%s' % (kernel, lb))
-
-            cfgfile.write(' %s' % replace_rootfs_uuid(d, root))
-
-            append = localdata.getVar('APPEND')
-            initrd = localdata.getVar('INITRD')
-
-            if append:
-                append = replace_rootfs_uuid(d, append)
-                cfgfile.write(' %s' % (append))
-
-            cfgfile.write(' %s' % btype[1])
-            cfgfile.write('\n')
-
-            if initrd:
-                cfgfile.write('initrd /initrd')
-            cfgfile.write('\n}\n')
+            for apd in appends.split(';'):
+                cfgfile.write('\nmenuentry \'%s%s %s\'{\n' % (label, btype[0],apd))
+                lb = label
+                if label == "install":
+                    lb = "install-efi"
+                kernel = localdata.getVar('KERNEL_IMAGETYPE')
+                cfgfile.write('linux /%s LABEL=%s' % (kernel, lb))
+
+                cfgfile.write(' %s' % replace_rootfs_uuid(d, root))
+
+                ap = append + apd
+                if ap:
+                    append = replace_rootfs_uuid(d, ap)
+                    cfgfile.write(' %s' % (ap))
+
+                cfgfile.write(' %s' % btype[1])
+                cfgfile.write('\n')
+
+                if initrd:
+                    cfgfile.write('initrd /initrd')
+                cfgfile.write('\n}\n')
 
     cfgfile.close()
 }
diff --git a/meta/classes/image_types_wic.bbclass b/meta/classes/image_types_wic.bbclass
index 519aeb1..4f2bdcc 100644
--- a/meta/classes/image_types_wic.bbclass
+++ b/meta/classes/image_types_wic.bbclass
@@ -3,7 +3,7 @@
 WICVARS ?= "\
            BBLAYERS IMGDEPLOYDIR DEPLOY_DIR_IMAGE FAKEROOTCMD IMAGE_BASENAME IMAGE_BOOT_FILES \
            IMAGE_LINK_NAME IMAGE_ROOTFS INITRAMFS_FSTYPES INITRD INITRD_LIVE ISODIR RECIPE_SYSROOT_NATIVE \
-           ROOTFS_SIZE STAGING_DATADIR STAGING_DIR STAGING_LIBDIR TARGET_SYS \
+           ROOTFS_SIZE STAGING_DATADIR STAGING_DIR STAGING_LIBDIR TARGET_SYS APPENDS \
            KERNEL_IMAGETYPE MACHINE INITRAMFS_IMAGE INITRAMFS_IMAGE_BUNDLE INITRAMFS_LINK_NAME"
 
 inherit ${@bb.utils.contains('INITRAMFS_IMAGE_BUNDLE', '1', 'kernel-artifact-names', '', d)}
diff --git a/meta/classes/systemd-boot-cfg.bbclass b/meta/classes/systemd-boot-cfg.bbclass
index b3e0e6a..fddbfad 100644
--- a/meta/classes/systemd-boot-cfg.bbclass
+++ b/meta/classes/systemd-boot-cfg.bbclass
@@ -19,6 +19,12 @@ python build_efi_cfg() {
         bb.debug(1, "No labels, nothing to do")
         return
 
+    #remove conf file from previous build
+    files = os.listdir(s)
+    for file in files:
+        if file.endswith(".conf"):
+            os.unlink(file)
+
     cfile = d.getVar('SYSTEMD_BOOT_CFG')
     cdir = os.path.dirname(cfile)
     if not os.path.exists(cdir):
@@ -37,35 +43,44 @@ python build_efi_cfg() {
         cfgfile.write('timeout 10\n')
     cfgfile.close()
 
+    appends = d.getVar('APPENDS') if d.getVar('APPENDS') else ""
+
     for label in labels.split():
-        localdata = d.createCopy()
-
-        entryfile = "%s/%s.conf" % (s, label)
-        if not os.path.exists(s):
-            os.makedirs(s)
-        d.appendVar("SYSTEMD_BOOT_ENTRIES", " " + entryfile)
-        try:
-            entrycfg = open(entryfile, "w")
-        except OSError:
-            bb.fatal('Unable to open %s' % entryfile)
-
-        entrycfg.write('title %s\n' % label)
-
-        kernel = localdata.getVar("KERNEL_IMAGETYPE")
-        entrycfg.write('linux /%s\n' % kernel)
-
-        append = localdata.getVar('APPEND')
-        initrd = localdata.getVar('INITRD')
-
-        if initrd:
-            entrycfg.write('initrd /initrd\n')
-        lb = label
-        if label == "install":
-            lb = "install-efi"
-        entrycfg.write('options LABEL=%s ' % lb)
-        if append:
-            append = replace_rootfs_uuid(d, append)
-            entrycfg.write('%s' % append)
-        entrycfg.write('\n')
-        entrycfg.close()
+        conf_count = 0
+        for apd in appends.split(';'):
+            conf_title = "%s-%s" % ( label, conf_count) if apd else label
+            localdata = d.createCopy()
+
+            entryfile = "%s/%s.conf" % (s, conf_title)
+            if not os.path.exists(s):
+                os.makedirs(s)
+            d.appendVar("SYSTEMD_BOOT_ENTRIES", " " + entryfile)
+            try:
+                entrycfg = open(entryfile, "w")
+            except OSError:
+                bb.fatal('Unable to open %s' % entryfile)
+
+            entrycfg.write('title %s %s\n' % (conf_title, apd) )
+
+            kernel = localdata.getVar("KERNEL_IMAGETYPE")
+            entrycfg.write('linux /%s\n' % kernel)
+
+            append = localdata.getVar('APPEND')
+            initrd = localdata.getVar('INITRD')
+
+            if initrd:
+                entrycfg.write('initrd /initrd\n')
+            lb = label
+            if label == "install":
+                lb = "install-efi"
+            entrycfg.write('options LABEL=%s ' % lb)
+
+            ap = append + apd
+            if ap:
+                append = replace_rootfs_uuid(d, ap)
+                entrycfg.write('%s' % ap)
+
+            entrycfg.write('\n')
+            entrycfg.close()
+            conf_count += 1
 }
diff --git a/meta/lib/oeqa/selftest/cases/wic.py b/meta/lib/oeqa/selftest/cases/wic.py
index fcdd550..cee8776 100644
--- a/meta/lib/oeqa/selftest/cases/wic.py
+++ b/meta/lib/oeqa/selftest/cases/wic.py
@@ -498,7 +498,7 @@ class Wic2(WicTestCase):
 
         wicvars = set(bb_vars['WICVARS'].split())
         # filter out optional variables
-        wicvars = wicvars.difference(('DEPLOY_DIR_IMAGE', 'IMAGE_BOOT_FILES',
+        wicvars = wicvars.difference(('DEPLOY_DIR_IMAGE', 'IMAGE_BOOT_FILES', 'APPENDS',
                                       'INITRD', 'INITRD_LIVE', 'ISODIR','INITRAMFS_IMAGE',
                                       'INITRAMFS_IMAGE_BUNDLE', 'INITRAMFS_LINK_NAME'))
         with open(path) as envfile:
diff --git a/scripts/lib/wic/plugins/source/bootimg-efi.py b/scripts/lib/wic/plugins/source/bootimg-efi.py
index 2cfdc10..5977ab0 100644
--- a/scripts/lib/wic/plugins/source/bootimg-efi.py
+++ b/scripts/lib/wic/plugins/source/bootimg-efi.py
@@ -65,37 +65,39 @@ class BootimgEFIPlugin(SourcePlugin):
         if not custom_cfg:
             # Create grub configuration using parameters from wks file
             bootloader = creator.ks.bootloader
-            title = source_params.get('title')
+            title = source_params.get('title') if source_params.get('title') else "boot"
 
             grubefi_conf = ""
             grubefi_conf += "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1\n"
             grubefi_conf += "default=boot\n"
             grubefi_conf += "timeout=%s\n" % bootloader.timeout
-            grubefi_conf += "menuentry '%s'{\n" % (title if title else "boot")
 
-            kernel = get_bitbake_var("KERNEL_IMAGETYPE")
-            if get_bitbake_var("INITRAMFS_IMAGE_BUNDLE") == "1":
-                if get_bitbake_var("INITRAMFS_IMAGE"):
-                    kernel = "%s-%s.bin" % \
-                        (get_bitbake_var("KERNEL_IMAGETYPE"), get_bitbake_var("INITRAMFS_LINK_NAME"))
+            appends = get_bitbake_var("APPENDS") if get_bitbake_var("APPENDS") else ""
+            for apd in appends.split(';'):
+                grubefi_conf += "menuentry '%s %s'{\n" % (title, apd )
 
-            label = source_params.get('label')
-            label_conf = "root=%s" % creator.rootdev
-            if label:
-                label_conf = "LABEL=%s" % label
+                kernel = get_bitbake_var("KERNEL_IMAGETYPE")
+                if get_bitbake_var("INITRAMFS_IMAGE_BUNDLE") == "1":
+                    if get_bitbake_var("INITRAMFS_IMAGE"):
+                        kernel = "%s-%s.bin" % \
+                            (get_bitbake_var("KERNEL_IMAGETYPE"), get_bitbake_var("INITRAMFS_LINK_NAME"))
 
-            grubefi_conf += "linux /%s %s rootwait %s\n" \
-                % (kernel, label_conf, bootloader.append)
+                label = source_params.get('label')
+                label_conf = "root=%s" % creator.rootdev
+                if label:
+                    label_conf = "LABEL=%s" % label
 
-            if initrd:
-                initrds = initrd.split(';')
-                grubefi_conf += "initrd"
-                for rd in initrds:
-                    grubefi_conf += " /%s" % rd
-                grubefi_conf += "\n"
+                grubefi_conf += "linux /%s %s rootwait %s %s\n" \
+                    % (kernel, label_conf, bootloader.append, apd)
 
-            grubefi_conf += "}\n"
+                if initrd:
+                    initrds = initrd.split(';')
+                    grubefi_conf += "initrd"
+                    for rd in initrds:
+                        grubefi_conf += " /%s" % rd
+                    grubefi_conf += "\n"
 
+                grubefi_conf += "}\n"
         logger.debug("Writing grubefi config %s/hdd/boot/EFI/BOOT/grub.cfg",
                      cr_workdir)
         cfg = open("%s/hdd/boot/EFI/BOOT/grub.cfg" % cr_workdir, "w")
@@ -161,30 +163,36 @@ class BootimgEFIPlugin(SourcePlugin):
                     kernel = "%s-%s.bin" % \
                         (get_bitbake_var("KERNEL_IMAGETYPE"), get_bitbake_var("INITRAMFS_LINK_NAME"))
 
-            title = source_params.get('title')
+            title = source_params.get('title') if source_params.get('title') else "boot"
+            appends = get_bitbake_var("APPENDS") if get_bitbake_var("APPENDS") else ""
+            conf_count = 0
+            for apd in appends.split(';'):
+                conf_title = "%s-%s" % ( title, conf_count) if apd else title
 
-            boot_conf = ""
-            boot_conf += "title %s\n" % (title if title else "boot")
-            boot_conf += "linux /%s\n" % kernel
+                boot_conf = ""
+                boot_conf += "title %s %s\n" % ( conf_title, apd )
+                boot_conf += "linux /%s\n" % kernel
 
-            label = source_params.get('label')
-            label_conf = "LABEL=Boot root=%s" % creator.rootdev
-            if label:
-                label_conf = "LABEL=%s" % label
+                label = source_params.get('label')
+                label_conf = "LABEL=Boot root=%s" % creator.rootdev
+                if label:
+                    label_conf = "LABEL=%s" % label
 
-            boot_conf += "options %s %s\n" % \
-                             (label_conf, bootloader.append)
+                boot_conf += "options %s %s %s\n" % \
+                                 (label_conf, bootloader.append, apd)
 
-            if initrd:
-                initrds = initrd.split(';')
-                for rd in initrds:
-                    boot_conf += "initrd /%s\n" % rd
+                if initrd:
+                    initrds = initrd.split(';')
+                    for rd in initrds:
+                        boot_conf += "initrd /%s\n" % rd
 
-        logger.debug("Writing systemd-boot config "
-                     "%s/hdd/boot/loader/entries/boot.conf", cr_workdir)
-        cfg = open("%s/hdd/boot/loader/entries/boot.conf" % cr_workdir, "w")
-        cfg.write(boot_conf)
-        cfg.close()
+                conf_count += 1
+
+                logger.debug("Writing systemd-boot config "
+                             "%s/hdd/boot/loader/entries/%s.conf" % (cr_workdir, conf_title))
+                cfg = open("%s/hdd/boot/loader/entries/%s.conf" % (cr_workdir, conf_title), "w")
+                cfg.write(boot_conf)
+                cfg.close()
 
 
     @classmethod
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* ✗ patchtest: failure for add variable APPENDS for multiple boot configuration
  2019-08-02 11:39 [PATCH] add variable APPENDS for multiple boot configuration chee.yang.lee
@ 2019-08-02 12:01 ` Patchwork
  0 siblings, 0 replies; 2+ messages in thread
From: Patchwork @ 2019-08-02 12:01 UTC (permalink / raw)
  To: chee.yang.lee; +Cc: openembedded-core

== Series Details ==

Series: add variable APPENDS for multiple boot configuration
Revision: 1
URL   : https://patchwork.openembedded.org/series/19050/
State : failure

== Summary ==


Thank you for submitting this patch series to OpenEmbedded Core. This is
an automated response. Several tests have been executed on the proposed
series by patchtest resulting in the following failures:



* Patch            add variable APPENDS for multiple boot configuration
 Issue             Shortlog does not follow expected format [test_shortlog_format] 
  Suggested fix    Commit shortlog (first line of commit message) should follow the format "<target>: <summary>"

* Patch            add variable APPENDS for multiple boot configuration
 Issue             Patch is missing Signed-off-by [test_signed_off_by_presence] 
  Suggested fix    Sign off the patch (either manually or with "git commit --amend -s")



If you believe any of these test results are incorrect, please reply to the
mailing list (openembedded-core@lists.openembedded.org) raising your concerns.
Otherwise we would appreciate you correcting the issues and submitting a new
version of the patchset if applicable. Please ensure you add/increment the
version number when sending the new version (i.e. [PATCH] -> [PATCH v2] ->
[PATCH v3] -> ...).

---
Guidelines:     https://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines
Test framework: http://git.yoctoproject.org/cgit/cgit.cgi/patchtest
Test suite:     http://git.yoctoproject.org/cgit/cgit.cgi/patchtest-oe



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-08-02 12:01 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-08-02 11:39 [PATCH] add variable APPENDS for multiple boot configuration chee.yang.lee
2019-08-02 12:01 ` ✗ patchtest: failure for " Patchwork

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox