[meta-intel] [PATCHv3 1/6] rmc: Add Runtime Machine Configuration (RMC) project

Jianxun Zhang jianxun.zhang at linux.intel.com
Thu Jul 21 16:23:39 PDT 2016


> On Jul 21, 2016, at 3:35 PM, Tom Zanussi <tom.zanussi at linux.intel.com> wrote:
> 
> On 07/21/2016 03:37 AM, Jianxun Zhang wrote:
>> RMC recipe fetch RMC project and build it more than once in
>> build time:
>> 
>> RMC tool is built for host architecture (native). The tool for
>> host is used to generate RMC database in build time.
>> 
>> RMC tool is also built for target architecture, so that scripts
>> in user space can call RMC tool on a running target. Developers
>> can also boot a target and run rmc tool to obtain fingerprint
>> for a new board type.
>> 
>> RMC libraries are compiled for both of UEFI context and user
>> space. They are always linked in RMC tool and can be linked
>> into an EFI bootloader. The recipes don't install libraries
>> for target's user space until we have a new client needs it.
>> 
>> The rmc-db.bbclass provides functions to generate rmc database
>> file for other software components to reuse.
>> 
>> We absorb a patch from Tom Zanussi to update source location with
>> the public link. We could put this change in another commit, but
>> leaving the replaced internal link in this commit could cause
>> trouble when people bisect the project but don't have access to
>> the internal location:
>> ----------------------
>> rmc: Update to use public repo
>> 
>> The repo the rmc recipe was pointing to was private - it's now public
>> Signed-off-by: Tom Zanussi <tom.zanussi at linux.intel.com>
>> 
>> common/recipes-bsp/rmc/rmc.inc | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>> 
>> diff --git a/common/recipes-bsp/rmc/rmc.inc b/common/recipes-bsp/rmc/rmc.inc
>> index c046e2e..bdf930d 100644
>> --- a/common/recipes-bsp/rmc/rmc.inc
>> +++ b/common/recipes-bsp/rmc/rmc.inc
>> @@ -15,7 +15,7 @@ LICENSE = "MIT"
>> 
>> LIC_FILES_CHKSUM = "file://COPYING;md5=bcdd376d27b26bde6afadd67aa3c8b07"
>> 
>> -SRC_URI = "git://git@git.yoctoproject.org/rmc;protocol=ssh"
>> +SRC_URI = "git://git.yoctoproject.org/rmc"
>> ...
>> ----------------------
>> 
>> Signed-off-by: Jianxun Zhang <jianxun.zhang at linux.intel.com>
>> ---
>> classes/rmc-db.bbclass        | 92 +++++++++++++++++++++++++++++++++++++++++++
>> common/recipes-bsp/rmc/rmc.bb | 46 ++++++++++++++++++++++
>> 2 files changed, 138 insertions(+)
>> create mode 100644 classes/rmc-db.bbclass
>> create mode 100644 common/recipes-bsp/rmc/rmc.bb
>> 
>> diff --git a/classes/rmc-db.bbclass b/classes/rmc-db.bbclass
>> new file mode 100644
>> index 0000000..0fb4c27
>> --- /dev/null
>> +++ b/classes/rmc-db.bbclass
>> @@ -0,0 +1,92 @@
>> +# RMC database bbclass
>> +# provide functions to generate RMC database file on build host (native)
>> +
>> +DEPENDS += "rmc-native"
>> +
>> +# rmc_generate_db()
>> +# $1: a list of directories. Each directory holds directories for a group of
>> +# boards.
>> +# $2: path_name of rmc generates database file and records
>> +#
>> +# WARNING: content of directory of database file will be removed.
>> +#
>> +# Each board directory shall contain a fingerprint file (*.fp) at least, with
>> +# optional file blob(s) associated to the type of board. If a board directory
>> +# has no file blob, no record is created for that board.
>> +#
>> +# An example of two directories each of which contains two boards for RMC:
>> +# (All file and directory names are for illustration purpose.)
>> +#
>> +# dir_1/
>> +#     board_1/
>> +#         board_1_fingerprint.fp
>> +#         file_1.blob
>> +#     board_2/
>> +#         board_2.fp
>> +# dir_2/
>> +#     board_3/
>> +#         b3.fp
>> +#         file_1.blob
>> +#         file_2.conf
>> +#     board_4/
>> +#         board_foo.fp
>> +#         mylib.config
>> +#
> 
> I was easily able to accidentally create nonsense configuration and
> nothing told me it was wrong.
> 
> For example, in my BOOTENTRY.CONFIG I mistyped a filename that didn't exist:
> 
> doesntexistboot.conf
> 
> It would seem that would be something the user would definitely be
> interested in knowing (along with any other errors in .conf files
> themselves), especially since there doesn't seem to be any way on the
> target to tell what the source of the problem is.
> 
> It seems you should be able to detect that when generating the db file
> on the host at least.
> 
> Basically there doesn't seem to be any way to determine the cause of
> problems other than inspection, which is going to cause lots of
> complaints from users.
> 
The feature’s design will be coupled with different things if we just copy that parser from installer to bbclass. DB is created in a generic function in build time. INSTALLER.CONFIG is a special (policy) file for EFI installer. A better way is to have a special hook to DB function, so that each client (bootloader, installer) can add its checker at build time.

Totally agree with you that we need checkers. Could I fix this after 1st merge?


> Tom
> 
> 
>> +# To generate a RMC database "rmc.db" with data of all (actually 3) of boards in
>> +# a directory "deploy_dir":
>> +#
>> +# rmc_generate_db "dir_1 dir_2" "deploy_dir/rmc.db"
>> +#
>> +# The board_2 will be skipped. No record or any data for it is packed in
>> +# generated database because it only contains a fingerprint file.
>> +#
>> +
>> +rmc_generate_db () {
>> +	RMC_BOARD_DIRS=$1
>> +
>> +	if [ "$#" -ne 2 ]; then
>> +		echo "rmc_generate_db(): Wrong number of arguments: $#"
>> +		return 1
>> +	fi
>> +
>> +	RMC_DB_DIR=$(dirname "$2")
>> +	RMC_RECORDS=""
>> +
>> +	rm -rf ${RMC_DB_DIR}
>> +	mkdir -p ${RMC_DB_DIR}
>> +
>> +	# generate rmc database
>> +	for topdir in ${RMC_BOARD_DIRS}; do
>> +		# For all board dirs in a topdir:
>> +		CUR_BOARD_DIRS=$(find ${topdir}/* -type d)
>> +		for board_dir in ${CUR_BOARD_DIRS}; do
>> +			# FIXME: we shall fail when having more than one .fp file
>> +			CUR_FINGERPRINT=$(find ${board_dir}/ -name "*.fp")
>> +
>> +			# disallow a board directory without any fingerprint file in it.
>> +			if [ -z "${CUR_FINGERPRINT}" ]; then
>> +				echo "Cannot find RMC fingerprint file in ${board_dir}"
>> +				return 1
>> +			fi
>> +
>> +			CUR_FILES=$(find ${board_dir}/ -type f |grep -v '\.fp$' || true)
>> +
>> +			# allow a directory only with fingerprint file. Developer may
>> +			# check in fingerprint for future use.
>> +			if [ -z "${CUR_FILES}" ]; then
>> +				continue
>> +			fi
>> +
>> +			CUR_TAG=$(echo "${board_dir}"|sed  's/\//-/g')
>> +			CUR_RECORD=${RMC_DB_DIR}/rmc${CUR_TAG}.rec
>> +
>> +			rmc -R -f ${CUR_FINGERPRINT} -b ${CUR_FILES} -o ${CUR_RECORD}
>> +
>> +			RMC_RECORDS="${RMC_RECORDS} ${CUR_RECORD}"
>> +		done
>> +	done
>> +
>> +	if [ ! -z "${RMC_RECORDS}" ]; then
>> +		rmc -D ${RMC_RECORDS} -o "$2"
>> +	fi
>> +}
>> diff --git a/common/recipes-bsp/rmc/rmc.bb b/common/recipes-bsp/rmc/rmc.bb
>> new file mode 100644
>> index 0000000..d8e538b
>> --- /dev/null
>> +++ b/common/recipes-bsp/rmc/rmc.bb
>> @@ -0,0 +1,46 @@
>> +SUMMARY = "RMC (Runtime Machine Configuration)"
>> +
>> +DESCRIPTION = "RMC project provides a tool and libraries to identify types \
>> +of hardware boards and access any file-based data specific to the board's \
>> +type at runtime in a centralized way. Software (clients) can have a generic \
>> +logic to query board-specific data from RMC without knowing the type of board. \
>> +This make it possible to have a generic software work running on boards which \
>> +require any quirks or customizations at a board or product level. \
>> +"
>> +
>> +LICENSE = "MIT"
>> +
>> +LIC_FILES_CHKSUM = "file://COPYING;md5=838c366f69b72c5df05c96dff79b35f2"
>> +
>> +SRC_URI = "git://git.yoctoproject.org/rmc"
>> +
>> +SRCREV = "9bc0f645729bb41e050395fbfac170fca351b3b8"
>> +
>> +S = "${WORKDIR}/git"
>> +
>> +DEPENDS_class-target = "gnu-efi"
>> +
>> +# from gnu-efi, we should align arch-mapping with it.
>> +def rmc_efi_arch(d):
>> +    import re
>> +    arch = d.getVar("TARGET_ARCH", True)
>> +    if re.match("i[3456789]86", arch):
>> +        return "ia32"
>> +    return arch
>> +
>> +do_compile_class-target() {
>> +	oe_runmake
>> +	oe_runmake RMC_EFI_HEADER_PREFIX=${STAGING_INCDIR}/efi RMC_EFI_ARCH="${@rmc_efi_arch(d)}" -f Makefile.efi
>> +}
>> +
>> +do_install() {
>> +	oe_runmake RMC_EFI_ARCH="${@rmc_efi_arch(d)}" RMC_INSTALL_PREFIX=${D}/usr install
>> +	oe_runmake RMC_EFI_ARCH="${@rmc_efi_arch(d)}" RMC_INSTALL_PREFIX=${D}/usr -f Makefile.efi install
>> +}
>> +
>> +do_install_class-native() {
>> +	install -d ${D}${STAGING_BINDIR_NATIVE}
>> +	install -m 0755 ${S}/src/rmc ${D}${STAGING_BINDIR_NATIVE}
>> +}
>> +
>> +BBCLASSEXTEND = "native"



More information about the meta-intel mailing list