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

Tom Zanussi tom.zanussi at linux.intel.com
Thu Jul 21 15:35:10 PDT 2016


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.

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