[oe-commits] [openembedded-core] 01/10: baremetal-helloworld: Create recipe for baremetal examples on QEMU

git at git.openembedded.org git at git.openembedded.org
Wed Feb 5 13:47:53 UTC 2020


This is an automated email from the git hooks/post-receive script.

rpurdie pushed a commit to branch master
in repository openembedded-core.

commit b314e9a0923c8aa95a2f2c3f48d956206e9885a7
Author: Alejandro Enedino Hernandez Samaniego <alejandro at enedino.org>
AuthorDate: Fri Jan 31 01:54:42 2020 -0800

    baremetal-helloworld: Create recipe for baremetal examples on QEMU
    
    Create HelloWorld examples that run on several of the QEMU architectures
    supported by the build system.
    
    This recipe can be used by anyone to understand how baremetal applications
    can be built using OpenEmbedded and how the wiring to set them up could be.
    
    This should also facilitate creating/extending the OE testing infrastructure
    to allow baremetal applications or RTOSs to be tested in the same way that
    Linux currently is.
    
    This can easily be extended to work on other MACHINES in the future.
    
    To run this example:
    
    $ source oe-init-buildenv
    
    $ bitbake-layers add-layer ../meta-skeleton
    
    # TCLIBC="baremetal" would work as well
    $ echo "TCLIBC = \"newlib\"" >> ./conf/local.conf
    
    $ echo "MACHINE = \"qemuarm64\"" >> ./conf/local.conf
    
    $ bitbake baremetal-helloworld
    
    $ runqemu
    
    runqemu - INFO - Running bitbake -e ...
    runqemu - INFO - Continuing with the following parameters:
    KERNEL: [tmp/deploy/images/qemuarm64/baremetal-helloworld-qemuarm64.bin]
    MACHINE: [qemuarm64]
    FSTYPE: [bin]
    ROOTFS: [tmp/deploy/images/qemuarm64/baremetal-helloworld-qemuarm64.bin]
    CONFFILE: [tmp/deploy/images/qemuarm64/baremetal-helloworld-qemuarm64.qemuboot.conf]
    
    Hello OpenEmbedded!
    
    Signed-off-by: Alejandro Enedino Hernandez Samaniego <alejandro at enedino.org>
    Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
---
 .../baremetal-examples/baremetal-helloworld_git.bb | 105 +++++++++++++++++++++
 1 file changed, 105 insertions(+)

diff --git a/meta-skeleton/recipes-baremetal/baremetal-examples/baremetal-helloworld_git.bb b/meta-skeleton/recipes-baremetal/baremetal-examples/baremetal-helloworld_git.bb
new file mode 100644
index 0000000..d863370
--- /dev/null
+++ b/meta-skeleton/recipes-baremetal/baremetal-examples/baremetal-helloworld_git.bb
@@ -0,0 +1,105 @@
+SUMMARY = "Baremetal examples to work with the several QEMU architectures supported on OpenEmbedded"
+HOMEPAGE = "https://github.com/aehs29/baremetal-helloqemu"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=39346640a23c701e4f459e05f56f4449"
+
+SRCREV = "99f4fa4a3b266b42b52af302610b0f4f429ba5e3"
+PV = "0.1+git${SRCPV}"
+
+SRC_URI = "git://github.com/aehs29/baremetal-helloqemu.git;protocol=https;branch=master"
+
+S = "${WORKDIR}/git/"
+
+# These examples are not meant to be built when using either musl or glibc
+COMPATIBLE_HOST_libc-musl_class-target = "null"
+COMPATIBLE_HOST_libc-glibc_class-target = "null"
+
+# This will be translated automatically to the architecture and
+# machine that QEMU uses on OE, e.g. -machine virt -cpu cortex-a57
+# but the examples can also be run on other architectures/machines
+# such as vexpress-a15 by overriding the setting on the machine.conf
+COMPATIBLE_MACHINE = "qemuarmv5|qemuarm|qemuarm64"
+
+BAREMETAL_QEMUARCH ?= ""
+BAREMETAL_QEMUARCH_qemuarmv5 = "versatile"
+BAREMETAL_QEMUARCH_qemuarm = "arm"
+BAREMETAL_QEMUARCH_qemuarm64 = "aarch64"
+
+
+EXTRA_OEMAKE_append = " QEMUARCH=${BAREMETAL_QEMUARCH} V=1"
+
+do_install(){
+    install -d ${D}/${datadir}
+    install -m 755 ${B}build/hello_baremetal_${BAREMETAL_QEMUARCH}.bin ${D}/${datadir}/hello_baremetal_${MACHINE}.bin
+    install -m 755 ${B}build/hello_baremetal_${BAREMETAL_QEMUARCH}.elf ${D}/${datadir}/hello_baremetal_${MACHINE}.elf
+}
+
+# Borrowed from meta-freertos
+inherit rootfs-postcommands
+inherit deploy
+do_deploy[dirs] = "${DEPLOYDIR} ${DEPLOY_DIR_IMAGE}"
+do_rootfs[dirs] = "${DEPLOYDIR} ${DEPLOY_DIR_IMAGE}"
+DEPLOYDIR = "${IMGDEPLOYDIR}"
+IMAGE_LINK_NAME ?= "baremetal-helloworld-image-${MACHINE}"
+IMAGE_NAME_SUFFIX ?= ""
+
+do_deploy(){
+    install ${D}/${datadir}/hello_baremetal_${MACHINE}.bin ${DEPLOYDIR}/${IMAGE_LINK_NAME}.bin
+    install ${D}/${datadir}/hello_baremetal_${MACHINE}.elf ${DEPLOYDIR}/${IMAGE_LINK_NAME}.elf
+}
+
+do_image(){
+    :
+}
+
+FILES_${PN} += " \
+    ${datadir}/hello_baremetal_${MACHINE}.bin \
+    ${datadir}/hello_baremetal_${MACHINE}.elf \
+"
+
+python do_rootfs(){
+    from oe.utils import execute_pre_post_process
+    from pathlib import Path
+
+    # Write empty manifest testdate file
+    deploy_dir = d.getVar('DEPLOYDIR')
+    link_name = d.getVar('IMAGE_LINK_NAME')
+    manifest_name = d.getVar('IMAGE_MANIFEST')
+
+    Path(manifest_name).touch()
+    if os.path.exists(manifest_name) and link_name:
+        manifest_link = deploy_dir + "/" + link_name + ".manifest"
+        if os.path.lexists(manifest_link):
+            os.remove(manifest_link)
+        os.symlink(os.path.basename(manifest_name), manifest_link)
+    execute_pre_post_process(d, d.getVar('ROOTFS_POSTPROCESS_COMMAND'))
+}
+
+# QEMU generic FreeRTOS parameters
+QB_DEFAULT_KERNEL = "${IMAGE_LINK_NAME}.bin"
+QB_MEM = "-m 256"
+QB_OPT_APPEND = "-nographic"
+QB_DEFAULT_FSTYPE = "bin"
+QB_DTB = ""
+
+# This next part is necessary to trick the build system into thinking
+# its building an image recipe so it generates the qemuboot.conf
+addtask do_deploy after do_write_qemuboot_conf before do_build
+addtask do_rootfs before do_deploy after do_install
+addtask do_image after do_rootfs before do_build
+inherit qemuboot
+
+# Based on image.bbclass to make sure we build qemu
+python(){
+    # do_addto_recipe_sysroot doesnt exist for all recipes, but we need it to have
+    # /usr/bin on recipe-sysroot (qemu) populated
+    def extraimage_getdepends(task):
+        deps = ""
+        for dep in (d.getVar('EXTRA_IMAGEDEPENDS') or "").split():
+        # Make sure we only add it for qemu
+            if 'qemu' in dep:
+                deps += " %s:%s" % (dep, task)
+        return deps
+    d.appendVarFlag('do_image', 'depends', extraimage_getdepends('do_addto_recipe_sysroot'))
+    d.appendVarFlag('do_image', 'depends', extraimage_getdepends('do_populate_sysroot'))
+}

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Openembedded-commits mailing list