summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--classes/rmc-db.bbclass92
-rw-r--r--common/recipes-bsp/rmc/rmc.bb46
2 files changed, 138 insertions, 0 deletions
diff --git a/classes/rmc-db.bbclass b/classes/rmc-db.bbclass
new file mode 100644
index 00000000..0fb4c272
--- /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 00000000..d8e538b2
--- /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"