diff options
author | Raymond Danks <raymond@edanks.com> | 2006-05-31 23:18:20 +0000 |
---|---|---|
committer | OpenEmbedded Project <openembedded-devel@lists.openembedded.org> | 2006-05-31 23:18:20 +0000 |
commit | a37558949698152bb853c520dba87d40fc74e77f (patch) | |
tree | ed24ca0c1bc4dd0c4c405d18214f0510de1e0215 /classes | |
parent | cce9638455be863b406573020215590d72e4d70e (diff) |
bootimg.bbclass - This creates a bootable image using syslinux, your kernel and an optional initrd
syslinux.bbclass - This creates a configuration file suitable for use with syslinux.
db1200.conf geodelx.conf - add db1200 and geodelx machine configurations.
Forgot the mt-add on these in the last attempt...
Diffstat (limited to 'classes')
-rw-r--r-- | classes/bootimg.bbclass | 92 | ||||
-rw-r--r-- | classes/syslinux.bbclass | 156 |
2 files changed, 248 insertions, 0 deletions
diff --git a/classes/bootimg.bbclass b/classes/bootimg.bbclass new file mode 100644 index 0000000000..820749a335 --- /dev/null +++ b/classes/bootimg.bbclass @@ -0,0 +1,92 @@ +# bootimg.oeclass +# Copyright (C) 2004, Advanced Micro Devices, Inc. All Rights Reserved +# Released under the MIT license (see packages/COPYING) + +# This creates a bootable image using syslinux, your kernel and an optional +# initrd + +# External variables needed +# ${INITRD} - indicates a filesystem image to use as an initrd (optional) +# ${AUTO_SYSLINUXCFG} - set this to 1 to enable creating an automatic config +# ${LABELS} - a list of targets for the automatic config +# ${APPEND} - an override list of append strings for each label +# ${SYSLINUX_OPTS} - additional options to add to the syslinux file ';' delimited + +DEPENDS_append=" dosfstools-native syslinux-native mtools-native cdrtools-native" + +BDIR="${WORKDIR}/boot" +ISODIR="${IMAGE_ROOTFS}/isolinux/" + +BOOTIMG_VOLUME_ID ?= "oe" +BOOTIMG_EXTRA_SPACE ?= "64" + +# Get the build_syslinux_cfg() function from the syslinux class + +SYSLINUXCFG="${BDIR}/syslinux.cfg" +SYSLINUXMENU="${BDIR}/menu" +inherit syslinux + +build_boot_bin() { + install -d ${BDIR} + install -m 0644 ${STAGING_KERNEL_DIR}/bzImage \ + ${BDIR}/vmlinuz + + if [ -n "${INITRD}" ] && [ -s "${INITRD}" ]; then + install -m 0644 ${INITRD} ${BDIR}/initrd + fi + + install -m 444 ${STAGING_DIR}/${BUILD_SYS}/share/syslinux/ldlinux.sys \ + ${BDIR}/ldlinux.sys + + # Do a little math, bash style + #BLOCKS=`du -s ${BDIR} | cut -f 1` + BLOCKS=`du -bks ${BDIR} | cut -f 1` + SIZE=`expr $BLOCKS + ${BOOTIMG_EXTRA_SPACE}` + + mkdosfs -F 12 -n ${BOOTIMG_VOLUME_ID} -d ${BDIR} \ + -C ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}-boot.bin $SIZE + + syslinux ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}-boot.bin + + #Create an ISO if we have an INITRD + if [ -n "${INITRD}" ] && [ -s "${INITRD}" ] && [ "${NOISO}" != "1" ] ; then + install -d ${ISODIR} + + # Install the kernel + + install -m 0644 ${STAGING_KERNEL_DIR}/bzImage \ + ${ISODIR}/vmlinuz + + # Install the configuration files + + cp ${BDIR}/syslinux.cfg ${ISODIR}/isolinux.cfg + + if [ -f ${SYSLINUXMENU} ]; then + cp ${SYSLINUXMENU} ${ISODIR} + fi + + install -m 0644 ${INITRD} ${ISODIR}/initrd + + # And install the syslinux stuff + cp ${STAGING_DIR}/${BUILD_SYS}/share/syslinux/isolinux.bin \ + ${ISODIR} + + mkisofs -V ${BOOTIMG_VOLUME_ID} \ + -o ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.iso \ + -b isolinux/isolinux.bin -c isolinux/boot.cat -r \ + -no-emul-boot -boot-load-size 4 -boot-info-table \ + ${IMAGE_ROOTFS} + fi +} + +python do_bootimg() { + docfg = bb.data.getVar('AUTO_SYSLINUXCFG', d, 1) + if docfg: + bb.build.exec_func('build_syslinux_cfg', d) + bb.build.exec_func('build_boot_bin', d) +} + +# We need to run after bootsplash if it exists, so thats why this line +# is such. Don't worry, if you don't do bootsplash, nobody will notice + +addtask bootimg before do_build after do_bootsplash diff --git a/classes/syslinux.bbclass b/classes/syslinux.bbclass new file mode 100644 index 0000000000..2f5b6c43d7 --- /dev/null +++ b/classes/syslinux.bbclass @@ -0,0 +1,156 @@ +# syslinux.bbclass +# Copyright (C) 2004-2006, Advanced Micro Devices, Inc. All Rights Reserved +# Released under the MIT license (see packages/COPYING) + +# This creates a configuration file suitable for use with syslinux. + +python build_syslinux_menu () { + import copy + import sys + + workdir = bb.data.getVar('WORKDIR', d, 1) + if not workdir: + bb.error("WORKDIR is not defined") + return + + labels = bb.data.getVar('LABELS', d, 1) + if not labels: + bb.debug(1, "LABELS not defined, nothing to do") + return + + if labels == []: + bb.debug(1, "No labels, nothing to do") + return + + cfile = bb.data.getVar('SYSLINUXMENU', d, 1) + if not cfile: + raise bb.build.FuncFailed('Unable to read SYSLINUXMENU') + + bb.mkdirhier(os.path.dirname(cfile)) + + try: + cfgfile = file(cfile, 'w') + except OSError: + raise bb.build.funcFailed('Unable to open %s' % (cfile)) + + # Beep the speaker and Clear the screen + cfgfile.write('\x07\x0C') + + # The title should be configurable + cfgfile.write('AMD Geode Linux Boot Menu\n') + cfgfile.write('The following targets are available on this image:\n') + cfgfile.write('\n') + + for label in labels.split(): + from copy import deepcopy + localdata = deepcopy(d) + + overrides = bb.data.getVar('OVERRIDES', localdata) + if not overrides: + raise bb.build.FuncFailed('OVERRIDES not defined') + overrides = bb.data.expand(overrides, localdata) + + bb.data.setVar('OVERRIDES', label + ':' + overrides, localdata) + bb.data.update_data(localdata) + + usage = bb.data.getVar('USAGE', localdata, 1) + cfgfile.write(' \x0F\x30\x3E%16s\x0F\x30\x37: ' % (label)) + cfgfile.write('%s\n' % (usage)) + + del localdata + + cfgfile.write('\n') + cfgfile.close() +} + +python build_syslinux_cfg () { + import copy + import sys + + workdir = bb.data.getVar('WORKDIR', d, 1) + if not workdir: + bb.error("WORKDIR not defined, unable to package") + return + + labels = bb.data.getVar('LABELS', d, 1) + if not labels: + bb.debug(1, "LABELS not defined, nothing to do") + return + + if labels == []: + bb.debug(1, "No labels, nothing to do") + return + + cfile = bb.data.getVar('SYSLINUXCFG', d, 1) + if not cfile: + raise bb.build.FuncFailed('Unable to read SYSLINUXCFG') + + bb.mkdirhier(os.path.dirname(cfile)) + + try: + cfgfile = file(cfile, 'w') + except OSError: + raise bb.build.funcFailed('Unable to open %s' % (cfile)) + + # FIXME - the timeout should be settable + # And maybe the default too + # Definately the prompt + + cfgfile.write('# Automatically created by OE\n') + + opts = bb.data.getVar('SYSLINUX_OPTS', d, 1) + + if opts: + for opt in opts.split(';'): + cfgfile.write('%s\n' % opt) + + cfgfile.write('ALLOWOPTIONS 1\n'); + cfgfile.write('DEFAULT %s\n' % (labels.split()[0])) + + timeout = bb.data.getVar('SYSLINUX_TIMEOUT', d, 1) + + if timeout: + cfgfile.write('TIMEOUT %s\n' % timeout) + else: + cfgfile.write('TIMEOUT 50\n') + + cfgfile.write('PROMPT 1\n') + + menu = bb.data.getVar('AUTO_SYSLINUXMENU', d, 1) + + # This is ugly. My bad. + + if menu: + bb.build.exec_func('build_syslinux_menu', d) + mfile = bb.data.getVar('SYSLINUXMENU', d, 1) + cfgfile.write('DISPLAY %s\n' % (mfile.split('/')[-1]) ) + + for label in labels.split(): + from copy import deepcopy + localdata = deepcopy(d) + + overrides = bb.data.getVar('OVERRIDES', localdata) + if not overrides: + raise bb.build.FuncFailed('OVERRIDES not defined') + overrides = bb.data.expand(overrides, localdata) + + bb.data.setVar('OVERRIDES', label + ':' + overrides, localdata) + bb.data.update_data(localdata) + + cfgfile.write('LABEL %s\nKERNEL vmlinuz\n' % (label)) + + append = bb.data.getVar('APPEND', localdata, 1) + initrd = bb.data.getVar('INITRD', localdata, 1) + + if append: + cfgfile.write('APPEND ') + + if initrd: + cfgfile.write('initrd=initrd ') + + cfgfile.write('%s\n' % (append)) + + del localdata + + cfgfile.close() +} |