[meta-intel] [PATCHv5 01/10] rmc: Add Runtime Machine Configuration (RMC) project

Saul Wold sgw at linux.intel.com
Wed Aug 3 11:28:29 PDT 2016


On Wed, 2016-08-03 at 11:04 -0700, 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>

Reviewed-by: Saul Wold <sgw 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
> +#
> +# 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"
> -- 
> 2.7.4
> 


More information about the meta-intel mailing list