1*4882a593Smuzhiyun# syslinux.bbclass 2*4882a593Smuzhiyun# Copyright (C) 2004-2006, Advanced Micro Devices, Inc. All Rights Reserved 3*4882a593Smuzhiyun# Released under the MIT license (see packages/COPYING) 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun# Provide syslinux specific functions for building bootable images. 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun# External variables 8*4882a593Smuzhiyun# ${INITRD} - indicates a list of filesystem images to concatenate and use as an initrd (optional) 9*4882a593Smuzhiyun# ${ROOTFS} - indicates a filesystem image to include as the root filesystem (optional) 10*4882a593Smuzhiyun# ${AUTO_SYSLINUXMENU} - set this to 1 to enable creating an automatic menu 11*4882a593Smuzhiyun# ${LABELS} - a list of targets for the automatic config 12*4882a593Smuzhiyun# ${APPEND} - an override list of append strings for each label 13*4882a593Smuzhiyun# ${SYSLINUX_OPTS} - additional options to add to the syslinux file ';' delimited 14*4882a593Smuzhiyun# ${SYSLINUX_SPLASH} - A background for the vga boot menu if using the boot menu 15*4882a593Smuzhiyun# ${SYSLINUX_DEFAULT_CONSOLE} - set to "console=ttyX" to change kernel boot default console 16*4882a593Smuzhiyun# ${SYSLINUX_SERIAL} - Set an alternate serial port or turn off serial with empty string 17*4882a593Smuzhiyun# ${SYSLINUX_SERIAL_TTY} - Set alternate console=tty... kernel boot argument 18*4882a593Smuzhiyun# ${SYSLINUX_KERNEL_ARGS} - Add additional kernel arguments 19*4882a593Smuzhiyun 20*4882a593Smuzhiyundo_bootimg[depends] += "${MLPREFIX}syslinux:do_populate_sysroot \ 21*4882a593Smuzhiyun syslinux-native:do_populate_sysroot" 22*4882a593Smuzhiyun 23*4882a593SmuzhiyunISOLINUXDIR ?= "/isolinux" 24*4882a593SmuzhiyunSYSLINUXDIR = "/" 25*4882a593Smuzhiyun# The kernel has an internal default console, which you can override with 26*4882a593Smuzhiyun# a console=...some_tty... 27*4882a593SmuzhiyunSYSLINUX_DEFAULT_CONSOLE ?= "" 28*4882a593SmuzhiyunSYSLINUX_SERIAL ?= "0 115200" 29*4882a593SmuzhiyunSYSLINUX_SERIAL_TTY ?= "console=ttyS0,115200" 30*4882a593SmuzhiyunSYSLINUX_PROMPT ?= "0" 31*4882a593SmuzhiyunSYSLINUX_TIMEOUT ?= "50" 32*4882a593SmuzhiyunAUTO_SYSLINUXMENU ?= "1" 33*4882a593SmuzhiyunSYSLINUX_ALLOWOPTIONS ?= "1" 34*4882a593SmuzhiyunSYSLINUX_ROOT ?= "${ROOT}" 35*4882a593SmuzhiyunSYSLINUX_CFG_VM ?= "${S}/syslinux_vm.cfg" 36*4882a593SmuzhiyunSYSLINUX_CFG_LIVE ?= "${S}/syslinux_live.cfg" 37*4882a593SmuzhiyunAPPEND ?= "" 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun# Need UUID utility code. 40*4882a593Smuzhiyuninherit fs-uuid 41*4882a593Smuzhiyun 42*4882a593Smuzhiyunsyslinux_populate() { 43*4882a593Smuzhiyun DEST=$1 44*4882a593Smuzhiyun BOOTDIR=$2 45*4882a593Smuzhiyun CFGNAME=$3 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun install -d ${DEST}${BOOTDIR} 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun # Install the config files 50*4882a593Smuzhiyun install -m 0644 ${SYSLINUX_CFG} ${DEST}${BOOTDIR}/${CFGNAME} 51*4882a593Smuzhiyun if [ "${AUTO_SYSLINUXMENU}" = 1 ] ; then 52*4882a593Smuzhiyun install -m 0644 ${STAGING_DATADIR}/syslinux/vesamenu.c32 ${DEST}${BOOTDIR}/vesamenu.c32 53*4882a593Smuzhiyun install -m 0444 ${STAGING_DATADIR}/syslinux/libcom32.c32 ${DEST}${BOOTDIR}/libcom32.c32 54*4882a593Smuzhiyun install -m 0444 ${STAGING_DATADIR}/syslinux/libutil.c32 ${DEST}${BOOTDIR}/libutil.c32 55*4882a593Smuzhiyun if [ "${SYSLINUX_SPLASH}" != "" ] ; then 56*4882a593Smuzhiyun install -m 0644 ${SYSLINUX_SPLASH} ${DEST}${BOOTDIR}/splash.lss 57*4882a593Smuzhiyun fi 58*4882a593Smuzhiyun fi 59*4882a593Smuzhiyun} 60*4882a593Smuzhiyun 61*4882a593Smuzhiyunsyslinux_iso_populate() { 62*4882a593Smuzhiyun iso_dir=$1 63*4882a593Smuzhiyun syslinux_populate $iso_dir ${ISOLINUXDIR} isolinux.cfg 64*4882a593Smuzhiyun install -m 0644 ${STAGING_DATADIR}/syslinux/isolinux.bin $iso_dir${ISOLINUXDIR} 65*4882a593Smuzhiyun install -m 0644 ${STAGING_DATADIR}/syslinux/ldlinux.c32 $iso_dir${ISOLINUXDIR} 66*4882a593Smuzhiyun} 67*4882a593Smuzhiyun 68*4882a593Smuzhiyunsyslinux_hddimg_populate() { 69*4882a593Smuzhiyun hdd_dir=$1 70*4882a593Smuzhiyun syslinux_populate $hdd_dir ${SYSLINUXDIR} syslinux.cfg 71*4882a593Smuzhiyun install -m 0444 ${STAGING_DATADIR}/syslinux/ldlinux.sys $hdd_dir${SYSLINUXDIR}/ldlinux.sys 72*4882a593Smuzhiyun} 73*4882a593Smuzhiyun 74*4882a593Smuzhiyunsyslinux_hddimg_install() { 75*4882a593Smuzhiyun syslinux ${IMGDEPLOYDIR}/${IMAGE_NAME}.hddimg 76*4882a593Smuzhiyun} 77*4882a593Smuzhiyun 78*4882a593Smuzhiyunpython build_syslinux_cfg () { 79*4882a593Smuzhiyun import copy 80*4882a593Smuzhiyun import sys 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun workdir = d.getVar('WORKDIR') 83*4882a593Smuzhiyun if not workdir: 84*4882a593Smuzhiyun bb.error("WORKDIR not defined, unable to package") 85*4882a593Smuzhiyun return 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun labels = d.getVar('LABELS') 88*4882a593Smuzhiyun if not labels: 89*4882a593Smuzhiyun bb.debug(1, "LABELS not defined, nothing to do") 90*4882a593Smuzhiyun return 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun if labels == []: 93*4882a593Smuzhiyun bb.debug(1, "No labels, nothing to do") 94*4882a593Smuzhiyun return 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun cfile = d.getVar('SYSLINUX_CFG') 97*4882a593Smuzhiyun if not cfile: 98*4882a593Smuzhiyun bb.fatal('Unable to read SYSLINUX_CFG') 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun try: 101*4882a593Smuzhiyun cfgfile = open(cfile, 'w') 102*4882a593Smuzhiyun except OSError: 103*4882a593Smuzhiyun bb.fatal('Unable to open %s' % cfile) 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun cfgfile.write('# Automatically created by OE\n') 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun opts = d.getVar('SYSLINUX_OPTS') 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun if opts: 110*4882a593Smuzhiyun for opt in opts.split(';'): 111*4882a593Smuzhiyun cfgfile.write('%s\n' % opt) 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun allowoptions = d.getVar('SYSLINUX_ALLOWOPTIONS') 114*4882a593Smuzhiyun if allowoptions: 115*4882a593Smuzhiyun cfgfile.write('ALLOWOPTIONS %s\n' % allowoptions) 116*4882a593Smuzhiyun else: 117*4882a593Smuzhiyun cfgfile.write('ALLOWOPTIONS 1\n') 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun syslinux_default_console = d.getVar('SYSLINUX_DEFAULT_CONSOLE') 120*4882a593Smuzhiyun syslinux_serial_tty = d.getVar('SYSLINUX_SERIAL_TTY') 121*4882a593Smuzhiyun syslinux_serial = d.getVar('SYSLINUX_SERIAL') 122*4882a593Smuzhiyun if syslinux_serial: 123*4882a593Smuzhiyun cfgfile.write('SERIAL %s\n' % syslinux_serial) 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun menu = (d.getVar('AUTO_SYSLINUXMENU') == "1") 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun if menu and syslinux_serial: 128*4882a593Smuzhiyun cfgfile.write('DEFAULT Graphics console %s\n' % (labels.split()[0])) 129*4882a593Smuzhiyun else: 130*4882a593Smuzhiyun cfgfile.write('DEFAULT %s\n' % (labels.split()[0])) 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun timeout = d.getVar('SYSLINUX_TIMEOUT') 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun if timeout: 135*4882a593Smuzhiyun cfgfile.write('TIMEOUT %s\n' % timeout) 136*4882a593Smuzhiyun else: 137*4882a593Smuzhiyun cfgfile.write('TIMEOUT 50\n') 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun prompt = d.getVar('SYSLINUX_PROMPT') 140*4882a593Smuzhiyun if prompt: 141*4882a593Smuzhiyun cfgfile.write('PROMPT %s\n' % prompt) 142*4882a593Smuzhiyun else: 143*4882a593Smuzhiyun cfgfile.write('PROMPT 1\n') 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun if menu: 146*4882a593Smuzhiyun cfgfile.write('ui vesamenu.c32\n') 147*4882a593Smuzhiyun cfgfile.write('menu title Select kernel options and boot kernel\n') 148*4882a593Smuzhiyun cfgfile.write('menu tabmsg Press [Tab] to edit, [Return] to select\n') 149*4882a593Smuzhiyun splash = d.getVar('SYSLINUX_SPLASH') 150*4882a593Smuzhiyun if splash: 151*4882a593Smuzhiyun cfgfile.write('menu background splash.lss\n') 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun for label in labels.split(): 154*4882a593Smuzhiyun localdata = bb.data.createCopy(d) 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun overrides = localdata.getVar('OVERRIDES') 157*4882a593Smuzhiyun if not overrides: 158*4882a593Smuzhiyun bb.fatal('OVERRIDES not defined') 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun localdata.setVar('OVERRIDES', label + ':' + overrides) 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun btypes = [ [ "", syslinux_default_console ] ] 163*4882a593Smuzhiyun if menu and syslinux_serial: 164*4882a593Smuzhiyun btypes = [ [ "Graphics console ", syslinux_default_console ], 165*4882a593Smuzhiyun [ "Serial console ", syslinux_serial_tty ] ] 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun root= d.getVar('SYSLINUX_ROOT') 168*4882a593Smuzhiyun if not root: 169*4882a593Smuzhiyun bb.fatal('SYSLINUX_ROOT not defined') 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun kernel = localdata.getVar('KERNEL_IMAGETYPE') 172*4882a593Smuzhiyun for btype in btypes: 173*4882a593Smuzhiyun cfgfile.write('LABEL %s%s\nKERNEL /%s\n' % (btype[0], label, kernel)) 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun exargs = d.getVar('SYSLINUX_KERNEL_ARGS') 176*4882a593Smuzhiyun if exargs: 177*4882a593Smuzhiyun btype[1] += " " + exargs 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun append = localdata.getVar('APPEND') 180*4882a593Smuzhiyun initrd = localdata.getVar('INITRD') 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun append = root + " " + append 183*4882a593Smuzhiyun cfgfile.write('APPEND ') 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun if initrd: 186*4882a593Smuzhiyun cfgfile.write('initrd=/initrd ') 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun cfgfile.write('LABEL=%s '% (label)) 189*4882a593Smuzhiyun append = replace_rootfs_uuid(d, append) 190*4882a593Smuzhiyun cfgfile.write('%s %s\n' % (append, btype[1])) 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun cfgfile.close() 193*4882a593Smuzhiyun} 194*4882a593Smuzhiyunbuild_syslinux_cfg[dirs] = "${S}" 195