xref: /OK3568_Linux_fs/yocto/poky/meta/classes/syslinux.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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