[meta-intel] [PATCHv5 05/10] rmc: add recipe and bbclass for RMC feature
RMC Feature is based on RMC project, systemd-boot, EFI installer to enable a single generic image, built for multiple platforms, automatically applies customization and quirks specific to a type of boards at runtime. In another word, you will see a single image behaves differently and intelligently according to the type of board it is running on. To Enable this feature: add the two lines in conf file: DISTRO_FEATURES_append = " rmc" EFI_PROVIDER = "rmc-systemd-boot" Based on Saul Wold's initial work on a feature switch, RMC patches in systemd-boot, installer and gnu-efi aren't built unless the feature is enabled. For a supported board, this feature can : () show and boot with board-specific boot entries in boot menu in live-boot and post-installation. () apply a kernel cmdline fragment to the end of cmdline to boot Linux kernel. This is effective for any boot entry user chooses in boot menu. () create directory and deploy files only for the type of the running board to target's file systems. What left on target after installation is just same as the result from installing a conventional image customized for a single type of hardware. To add support of new boards, a new variable RMC_BOARD_DATA_DIRS is the interface to developers. How-to information will be provided with examples in following patches. Signed-off-by: Jianxun Zhang --- classes/rmc-systemd-boot.bbclass | 12 ++ common/recipes-bsp/rmc/rmc-db.bb | 48 conf/layer.conf | 10 + 3 files changed, 70 insertions(+) create mode 100644 classes/rmc-systemd-boot.bbclass create mode 100644 common/recipes-bsp/rmc/rmc-db.bb diff --git a/classes/rmc-systemd-boot.bbclass b/classes/rmc-systemd-boot.bbclass new file mode 100644 index 000..ad2cf10 --- /dev/null +++ b/classes/rmc-systemd-boot.bbclass @@ -0,0 +1,12 @@ +# rmc-systemd-boot bbclass +# Deploy central RMC database file to ESP + +IMAGE_INSTALL_append = " rmc" + +inherit systemd-boot + +do_bootimg[depends] += "${MLPREFIX}rmc-db:do_deploy" + +efi_populate_append() { +install -m 0400 ${DEPLOY_DIR_IMAGE}/rmc.db ${DEST}/rmc.db +} diff --git a/common/recipes-bsp/rmc/rmc-db.bb b/common/recipes-bsp/rmc/rmc-db.bb new file mode 100644 index 000..14553af --- /dev/null +++ b/common/recipes-bsp/rmc/rmc-db.bb @@ -0,0 +1,48 @@ +SUMMARY = "Central RMC Database" +DESCRIPTION = "Generate a centralized RMC database for RMC feature. \ +Fingerprints and data for all boards supported are specified by variable \ +RMC_BOARD_DATA_DIRS which is a list of top directories that contains \ +subdirectories for boards. Developers can add their top directories by appending \ +them to this variable in a rmc-db.bbappend.Refer to rmc-db bbclass for more \ +information." + +LICENSE = "MIT" + +LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=4d92cd373abda3937c2bc47fbc49d690" + +S = "${WORKDIR}" + +inherit rmc-db + +RMC_BOARD_DATA_DIRS_append := " ${THISDIR}/boards/" +RMC_DB_DIR = "${WORKDIR}/db" + +# Let sstate be aware of change in any added board directories +do_generate_rmc_db[file-checksums] = "${@get_rmc_top_dirs_list(d)}" + +# derived from get_lic_checksum_file_list(d) in base.bbclass in OE +def get_rmc_top_dirs_list(d): +dirlist = [] +dirs = d.getVar("RMC_BOARD_DATA_DIRS", True) or '' +topdirs = dirs.split() +for each in topdirs: +dirlist.append(each + ":" + str(os.path.exists(each))) +return " ".join(dirlist) + +do_generate_rmc_db () { + rmc_generate_db "${RMC_BOARD_DATA_DIRS}" "${RMC_DB_DIR}"/rmc.db +} + +addtask generate_rmc_db after do_compile + +inherit deploy + +do_deploy () { + if [ -f ${RMC_DB_DIR}/rmc.db ]; then + install -m 0400 ${RMC_DB_DIR}/rmc.db ${DEPLOYDIR} + else + echo "Warning: no RMC central database found, skip deployment." + fi +} + +addtask deploy after do_generate_rmc_db diff --git a/conf/layer.conf b/conf/layer.conf index d8e5000..41e42e8 100644 --- a/conf/layer.conf +++ b/conf/layer.conf @@ -15,3 +15,13 @@ LICENSE_PATH += "${LAYERDIR}/common/custom-licenses" # This should only be incremented on significant changes that will # cause compatibility issues with other layers LAYERVERSION_intel = "3" + + +# Exclude RMC patches unless RMC Feature is eanbled +RMC_BBMASK := "${LAYERDIR}/common/recipes-bsp/systemd-boot/systemd-boot.*\.bbappend \ + ${LAYERDIR}/common/recipes-core/initrdscripts/initramfs-live-install-efi.*\.bbappend \ + ${LAYERDIR}/common/recipes-bsp/gnu-efi/gnu-efi.*\.bbappend" + +BBMASK += "${RMC_BBMASK}" + +BBMASK_remove = "${@bb.utils.contains('DISTRO_FEATURES', 'rmc', '${RMC_BBMASK}', '', d)}" -- 2.7.4 -- ___ meta-intel mailing list meta-intel@yoctoproject.org https://lists.yoctoproject.org/listinfo/meta-intel
Re: [meta-intel] [PATCHv5 05/10] rmc: add recipe and bbclass for RMC feature
On Wed, 2016-08-03 at 11:04 -0700, Jianxun Zhang wrote: > RMC Feature is based on RMC project, systemd-boot, EFI installer > to enable a single generic image, built for multiple platforms, > automatically applies customization and quirks specific to a type > of boards at runtime. > > In another word, you will see a single image behaves differently > and intelligently according to the type of board it is running on. > > To Enable this feature: add the two lines in conf file: > DISTRO_FEATURES_append = " rmc" > EFI_PROVIDER = "rmc-systemd-boot" > > Based on Saul Wold's initial work on a feature switch, RMC patches > in systemd-boot, installer and gnu-efi aren't built unless the > feature is enabled. > > For a supported board, this feature can : > () show and boot with board-specific boot entries in boot menu > in live-boot and post-installation. > > () apply a kernel cmdline fragment to the end of cmdline to boot > Linux kernel. This is effective for any boot entry user chooses in > boot menu. > > () create directory and deploy files only for the type of the > running board to target's file systems. What left on target after > installation is just same as the result from installing a > conventional > image customized for a single type of hardware. > > To add support of new boards, a new variable RMC_BOARD_DATA_DIRS > is the interface to developers. How-to information will be provided > with examples in following patches. > > Signed-off-by: Jianxun Zhang Reviewed-by: Saul Wold > --- > classes/rmc-systemd-boot.bbclass | 12 ++ > common/recipes-bsp/rmc/rmc-db.bb | 48 > > conf/layer.conf | 10 + > 3 files changed, 70 insertions(+) > create mode 100644 classes/rmc-systemd-boot.bbclass > create mode 100644 common/recipes-bsp/rmc/rmc-db.bb > > diff --git a/classes/rmc-systemd-boot.bbclass b/classes/rmc-systemd- > boot.bbclass > new file mode 100644 > index 000..ad2cf10 > --- /dev/null > +++ b/classes/rmc-systemd-boot.bbclass > @@ -0,0 +1,12 @@ > +# rmc-systemd-boot bbclass > +# Deploy central RMC database file to ESP > + > +IMAGE_INSTALL_append = " rmc" > + > +inherit systemd-boot > + > +do_bootimg[depends] += "${MLPREFIX}rmc-db:do_deploy" > + > +efi_populate_append() { > +install -m 0400 ${DEPLOY_DIR_IMAGE}/rmc.db ${DEST}/rmc.db > +} > diff --git a/common/recipes-bsp/rmc/rmc-db.bb b/common/recipes- > bsp/rmc/rmc-db.bb > new file mode 100644 > index 000..14553af > --- /dev/null > +++ b/common/recipes-bsp/rmc/rmc-db.bb > @@ -0,0 +1,48 @@ > +SUMMARY = "Central RMC Database" > +DESCRIPTION = "Generate a centralized RMC database for RMC feature. > \ > +Fingerprints and data for all boards supported are specified by > variable \ > +RMC_BOARD_DATA_DIRS which is a list of top directories that contains > \ > +subdirectories for boards. Developers can add their top directories > by appending \ > +them to this variable in a rmc-db.bbappend.Refer to rmc-db bbclass > for more \ > +information." > + > +LICENSE = "MIT" > + > +LIC_FILES_CHKSUM = > "file://${COREBASE}/LICENSE;md5=4d92cd373abda3937c2bc47fbc49d690" > + > +S = "${WORKDIR}" > + > +inherit rmc-db > + > +RMC_BOARD_DATA_DIRS_append := " ${THISDIR}/boards/" > +RMC_DB_DIR = "${WORKDIR}/db" > + > +# Let sstate be aware of change in any added board directories > +do_generate_rmc_db[file-checksums] = "${@get_rmc_top_dirs_list(d)}" > + > +# derived from get_lic_checksum_file_list(d) in base.bbclass in OE > +def get_rmc_top_dirs_list(d): > +dirlist = [] > +dirs = d.getVar("RMC_BOARD_DATA_DIRS", True) or '' > +topdirs = dirs.split() > +for each in topdirs: > +dirlist.append(each + ":" + str(os.path.exists(each))) > +return " ".join(dirlist) > + > +do_generate_rmc_db () { > + rmc_generate_db "${RMC_BOARD_DATA_DIRS}" > "${RMC_DB_DIR}"/rmc.db > +} > + > +addtask generate_rmc_db after do_compile > + > +inherit deploy > + > +do_deploy () { > + if [ -f ${RMC_DB_DIR}/rmc.db ]; then > + install -m 0400 ${RMC_DB_DIR}/rmc.db ${DEPLOYDIR} > + else > + echo "Warning: no RMC central database found, skip > deployment." > + fi > +} > + > +addtask deploy after do_generate_rmc_db > diff --git a/conf/layer.conf b/conf/layer.conf > index d8e5000..41e42e8 100644 > --- a/conf/layer.conf > +++ b/conf/layer.conf > @@ -15,3 +15,13 @@ LICENSE_PATH += "${LAYERDIR}/common/custom- > licenses" > # This should only be incremented on significant changes that will > # cause compatibility issues with other layers > LAYERVERSION_intel = "3" > + > + > +# Exclude RMC patches unless RMC Feature is eanbled > +RMC_BBMASK := "${LAYERDIR}/common/recipes-bsp/systemd-boot/systemd- > boot.*\.bbappend \ > + ${LAYERDIR}/common/recipes- > core/initrdscripts/initramfs-live-install-efi.*\.bbappend \ > + ${LAYERDIR}/common/recipes-bsp/gnu-efi/gnu- > efi.*\.bbappend" > + > +BBMASK += "${RMC_BBMASK}" > + > +BBMASK_remove = "${