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

Jianxun Zhang jianxun.zhang at linux.intel.com
Tue Jul 12 10:59:53 PDT 2016


RMC recipes 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-native.bbclass provides functions to generate rmc database
file for other software components to reuse.

Signed-off-by: Jianxun Zhang <jianxun.zhang at linux.intel.com>
---
 classes/rmc-native.bbclass           | 92 ++++++++++++++++++++++++++++++++++++
 common/recipes-bsp/rmc/rmc-native.bb |  7 +++
 common/recipes-bsp/rmc/rmc.bb        | 21 ++++++++
 common/recipes-bsp/rmc/rmc.inc       | 22 +++++++++
 4 files changed, 142 insertions(+)
 create mode 100644 classes/rmc-native.bbclass
 create mode 100644 common/recipes-bsp/rmc/rmc-native.bb
 create mode 100644 common/recipes-bsp/rmc/rmc.bb
 create mode 100644 common/recipes-bsp/rmc/rmc.inc

diff --git a/classes/rmc-native.bbclass b/classes/rmc-native.bbclass
new file mode 100644
index 0000000..2591b6c
--- /dev/null
+++ b/classes/rmc-native.bbclass
@@ -0,0 +1,92 @@
+# RMC native 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-native.bb b/common/recipes-bsp/rmc/rmc-native.bb
new file mode 100644
index 0000000..ae95f06
--- /dev/null
+++ b/common/recipes-bsp/rmc/rmc-native.bb
@@ -0,0 +1,7 @@
+require rmc.inc
+
+inherit native
+
+do_install() {
+	install -m 0755 ${S}/src/rmc ${bindir}
+}
diff --git a/common/recipes-bsp/rmc/rmc.bb b/common/recipes-bsp/rmc/rmc.bb
new file mode 100644
index 0000000..1cac285
--- /dev/null
+++ b/common/recipes-bsp/rmc/rmc.bb
@@ -0,0 +1,21 @@
+require rmc.inc
+
+DEPENDS = "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 () {
+	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
+}
diff --git a/common/recipes-bsp/rmc/rmc.inc b/common/recipes-bsp/rmc/rmc.inc
new file mode 100644
index 0000000..c046e2e
--- /dev/null
+++ b/common/recipes-bsp/rmc/rmc.inc
@@ -0,0 +1,22 @@
+SUMMARY = "RMC (Runtime Machine Configuration)"
+
+DESCRIPTION = "Recipes of RMC feature integrates RMC project into build. RMC \
+project itself provides an executable RMC tool to be called in build and run- \
+time, as well as RMC libraries to be linked into RMC bootloader and the tool. \
+Other two main parts of the feature are RMC installer and RMC bootloader. \
+RMC recipes are responsible to build and deploy all of these RMC bits in an \
+image. Another important task for recipes is to generate RMC database file, \
+which is also deployed into image, based on all inputs (fingerprint, config \
+files, board-specific file blobs) of all board types added by developer in \
+RMC. More information can be obtained in README files in RMC project. \
+"
+
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://COPYING;md5=bcdd376d27b26bde6afadd67aa3c8b07"
+
+SRC_URI = "git://git@git.yoctoproject.org/rmc;protocol=ssh"
+
+SRCREV = "f10c018fbaa19072c7281726e1457c73a409e1d1"
+
+S = "${WORKDIR}/git"
-- 
2.7.4



More information about the meta-intel mailing list