[OE-core] [PATCH 1/2] baremetal-helloworld: Create recipe for baremetal examples on QEMU
Khem Raj
raj.khem at gmail.com
Mon Jan 27 20:51:14 UTC 2020
On Mon, Jan 27, 2020 at 2:01 AM Alejandro Enedino Hernandez Samaniego
<alejandro at enedino.org> wrote:
>
> 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 the oe environment as usual
> $ source oe-init-buildenv
>
> # Set TCLIBC to either newlib or baremetal
> $ echo "TCLIBC = \"newlib\"" >> ./conf/local.conf
>
> # Use one of the supported architectures (qemuarm64, qemuarm or qemuarmv5)
> $ echo "MACHINE = \"qemuarm64\"" >> ./conf/local.conf
>
> # Build
> $ bitbake baremetal-helloworld
>
> # Launch QEMU
> $ 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>
> ---
> .../baremetal-examples/baremetal-helloworld_git.bb | 114 +++++++++++++++++++++
> 1 file changed, 114 insertions(+)
> create mode 100644 meta/recipes-extended/baremetal-examples/baremetal-helloworld_git.bb
>
> diff --git a/meta/recipes-extended/baremetal-examples/baremetal-helloworld_git.bb b/meta/recipes-extended/baremetal-examples/baremetal-helloworld_git.bb
> new file mode 100644
> index 0000000..aab48b1
> --- /dev/null
> +++ b/meta/recipes-extended/baremetal-examples/baremetal-helloworld_git.bb
> @@ -0,0 +1,114 @@
> +SUMMARY = "Baremetal examples to work with the several QEMU architectures supported on OpenEmbedded"
> +HOMEPAGE = "https://github.com/aehs29/baremetal-helloqemu"
> +LICENSE = "CC-BY-SA-4.0"
I think MIT or Apache-2.0 would be much nicer.
> +LIC_FILES_CHKSUM = "file://LICENSE;md5=4084714af41157e38872e798eb3fe1b1"
> +
> +SRCREV = "fe81742f1159725408dd7305e40e7bd4dfd1e264"
> +
> +SRC_URI = "git://github.com/aehs29/baremetal-helloqemu.git;protocol=https "
> +
> +S = "${WORKDIR}/git"
> +B = "${WORKDIR}/build"
> +
> +# 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"
Perhaps check for TARGET_OS instead of LIBC
> +# 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"
> +
this setting should be abstracted into something like baremetal.bbclass
> +
> +EXTRA_OEMAKE_append = " QEMUARCH=${BAREMETAL_QEMUARCH}"
> +
> +do_configure(){
> + # Avoid building on the source directory
> + cp ${S}/* ${B}
> +}
copying sources to B why is that needed ?
> +
> +do_install(){
> + install -d ${D}/${datadir}
> + install -m 755 ${B}/hello_baremetal_${BAREMETAL_QEMUARCH}.bin ${D}/${datadir}/hello_baremetal_${MACHINE}.bin
> + install -m 755 ${B}/hello_baremetal_${BAREMETAL_QEMUARCH}.elf ${D}/${datadir}/hello_baremetal_${MACHINE}.elf
> +}
> +
> +# Make sure there are no race conditions when
> +# assembling compiling and linking steps
> +PARALLEL_MAKE = ""
> +
hmmm bad example to start of.
> +# 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'))
> +}
> +
these all should be abstracted
> +# 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 setting perhaps should be in machine conf ?
> +# 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'))
> +}
> --
> 2.7.4
>
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core
More information about the Openembedded-core
mailing list