diff options
-rw-r--r-- | classes/rmc-db.bbclass | 92 | ||||
-rw-r--r-- | common/recipes-bsp/rmc/rmc.bb | 46 |
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" |