summaryrefslogtreecommitdiffstats
path: root/bsp/meta-arm/meta-arm-autonomy/classes/image_types_xenguest.bbclass
diff options
context:
space:
mode:
Diffstat (limited to 'bsp/meta-arm/meta-arm-autonomy/classes/image_types_xenguest.bbclass')
-rw-r--r--bsp/meta-arm/meta-arm-autonomy/classes/image_types_xenguest.bbclass108
1 files changed, 108 insertions, 0 deletions
diff --git a/bsp/meta-arm/meta-arm-autonomy/classes/image_types_xenguest.bbclass b/bsp/meta-arm/meta-arm-autonomy/classes/image_types_xenguest.bbclass
new file mode 100644
index 00000000..195d6ed2
--- /dev/null
+++ b/bsp/meta-arm/meta-arm-autonomy/classes/image_types_xenguest.bbclass
@@ -0,0 +1,108 @@
+# Create a xenguest image with kernel and filesystem produced by Yocto
+# This will create a .xenguest file that the xenguest-manager can use.
+
+inherit xenguest-image
+
+# We are creating our guest in a local subdirectory
+# force the value so that we are not impacted if the user is changing it
+XENGUEST_IMAGE_DEPLOY_DIR = "${WORKDIR}/tmp-xenguest"
+
+# Name of deployed file (keep standard image name and add .xenguest)
+XENGUEST_IMAGE_DEPLOY ??= "${IMAGE_NAME}"
+
+# Add kernel XENGUEST_IMAGE_KERNEL from DEPLOY_DIR_IMAGE to image
+xenguest_image_add_kernel() {
+ srcfile="${1:-}"
+ if [ -z "${srcfile}" ]; then
+ srcfile="${DEPLOY_DIR_IMAGE}/${XENGUEST_IMAGE_KERNEL}"
+ fi
+ call_xenguest_mkimage partial --xen-kernel=$srcfile
+}
+
+# Add rootfs file to the image
+xenguest_image_add_rootfs() {
+ call_xenguest_mkimage partial \
+ --disk-add-file=${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${IMAGE_TYPEDEP_xenguest}:rootfs.${IMAGE_TYPEDEP_xenguest}
+}
+
+# Pack xenguest image
+xenguest_image_pack() {
+ mkdir -p ${IMGDEPLOYDIR}
+ rm -f ${IMGDEPLOYDIR}/${XENGUEST_IMAGE_DEPLOY}.xenguest
+ call_xenguest_mkimage pack \
+ ${IMGDEPLOYDIR}/${XENGUEST_IMAGE_DEPLOY}.xenguest
+}
+
+#
+# Task finishing the bootimg
+# We need this task to actually create the symlinks
+#
+python do_bootimg_xenguest() {
+ subtasks = d.getVarFlag('do_bootimg_xenguest', 'subtasks')
+
+ bb.build.exec_func('xenguest_image_clone', d)
+ if subtasks:
+ for tk in subtasks.split():
+ bb.build.exec_func(tk, d)
+ bb.build.exec_func('xenguest_image_pack', d)
+ bb.build.exec_func('create_symlinks', d)
+}
+# This is used to add sub-tasks to do_bootimg_xenguest
+do_bootimg_xenguest[subtasks] = ""
+# Those are required by create_symlinks to find our image
+do_bootimg_xenguest[subimages] = "xenguest"
+do_bootimg_xenguest[imgsuffix] = "."
+do_bootimg_xenguest[depends] += "xenguest-base-image:do_deploy"
+# Need to have rootfs so all recipes have deployed their content
+do_bootimg_xenguest[depends] += "${PN}:do_rootfs"
+
+# This set in python anonymous after, just set a default value here
+IMAGE_TYPEDEP_xenguest ?= "tar"
+
+# We must not be built at rootfs build time because we need the kernel
+IMAGE_TYPES_MASKED += "xenguest"
+IMAGE_TYPES += "xenguest"
+
+python __anonymous() {
+ # Do not do anything if we are not in the want FSTYPES
+ if bb.utils.contains_any('IMAGE_FSTYPES', 'xenguest', '1', '0', d):
+
+ # Check the coherency of the configuration
+ rootfs_needed = False
+ rootfs_file = ''
+ kernel_needed = False
+
+ rootfs_file = xenguest_image_rootfs_file(d)
+ if rootfs_file:
+ rootfs_needed = True
+
+ if d.getVar('XENGUEST_IMAGE_KERNEL') and not d.getVar('INITRAMFS_IMAGE'):
+ # If INITRAMFS_IMAGE is set, even if INITRAMFS_IMAGE_BUNDLE is not
+ # set to 1 to bundle the initramfs with the kernel, kernel.bbclass
+ # is setting a dependency on ${PN}:do_image_complete. We cannot
+ # in this case depend on do_deploy as it would create a circular
+ # dependency:
+ # do_image_complete would depend on kernel:do_deploy which would
+ # depend on ${PN}:do_image_complete
+ # In the case INITRAMFS_IMAGE_BUNDLE = 1, the kernel-xenguest class
+ # will handle the creation of a xenguest image with the kernel.
+ # In the other case the kernel can be added manually to the image.
+ kernel_needed = True
+
+ bb.build.addtask('do_bootimg_xenguest', 'do_image_complete', None, d)
+
+ if rootfs_needed:
+ # tell do_bootimg_xenguest to call add_rootfs
+ d.appendVarFlag('do_bootimg_xenguest', 'subtasks', ' xenguest_image_add_rootfs')
+ # do_bootimg_xenguest will need the tar file
+ d.appendVarFlag('do_bootimg_xenguest', 'depends', ' %s:do_image_tar' % (d.getVar('PN')))
+ # set our TYPEDEP to the proper compression
+ d.setVar('IMAGE_TYPEDEP_xenguest', 'tar' + (rootfs_file.split('.tar', 1)[1] or ''))
+
+ if kernel_needed:
+ # Tell do_bootimg_xenguest to call xenguest_image_add_kernel
+ d.appendVarFlag('do_bootimg_xenguest', 'subtasks', ' xenguest_image_add_kernel')
+ # we will need kernel do_deploy
+ d.appendVarFlag('do_bootimg_xenguest', 'depends', ' virtual/kernel:do_deploy')
+}
+