summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--classes/uefi-comboapp.bbclass71
1 files changed, 48 insertions, 23 deletions
diff --git a/classes/uefi-comboapp.bbclass b/classes/uefi-comboapp.bbclass
index 77196863..fc7e1b6f 100644
--- a/classes/uefi-comboapp.bbclass
+++ b/classes/uefi-comboapp.bbclass
@@ -32,12 +32,13 @@ do_uefiapp[depends] += "${@ '${INITRD_IMAGE}:do_image_complete' if d.getVar('INI
32# - the kernel 32# - the kernel
33# - an initramfs (optional) 33# - an initramfs (optional)
34 34
35python do_uefiapp() { 35def create_uefiapp(d, uuid=None, app_suffix=''):
36 import glob, re 36 import glob, re
37 from subprocess import check_call 37 from subprocess import check_call
38 38
39 build_dir = d.getVar('B') 39 build_dir = d.getVar('B')
40 deploy_dir_image = d.getVar('DEPLOY_DIR_IMAGE') 40 deploy_dir_image = d.getVar('DEPLOY_DIR_IMAGE')
41 image_link_name = d.getVar('IMAGE_LINK_NAME')
41 42
42 cmdline = '%s/cmdline.txt' % build_dir 43 cmdline = '%s/cmdline.txt' % build_dir
43 linux = '%s/%s' % (deploy_dir_image, d.getVar('KERNEL_IMAGETYPE')) 44 linux = '%s/%s' % (deploy_dir_image, d.getVar('KERNEL_IMAGETYPE'))
@@ -45,8 +46,9 @@ python do_uefiapp() {
45 46
46 stub_path = '%s/linux*.efi.stub' % deploy_dir_image 47 stub_path = '%s/linux*.efi.stub' % deploy_dir_image
47 stub = glob.glob(stub_path)[0] 48 stub = glob.glob(stub_path)[0]
48 app = re.sub(r"\S*(ia32|x64)(.efi)\S*", r"boot\1\2", os.path.basename(stub)) 49 m = re.match(r"\S*(ia32|x64)(.efi)\S*", os.path.basename(stub))
49 executable = '%s/%s' % (deploy_dir_image, app) 50 app = "boot%s%s%s" % (m.group(1), app_suffix, m.group(2))
51 executable = '%s/%s.%s' % (deploy_dir_image, image_link_name, app)
50 52
51 if d.getVar('INITRD_LIVE'): 53 if d.getVar('INITRD_LIVE'):
52 with open(initrd, 'wb') as dst: 54 with open(initrd, 'wb') as dst:
@@ -57,7 +59,6 @@ python do_uefiapp() {
57 else: 59 else:
58 initrd_cmd = "" 60 initrd_cmd = ""
59 61
60 uuid = d.getVar('DISK_SIGNATURE_UUID')
61 root = 'root=PARTUUID=%s' % uuid if uuid else '' 62 root = 'root=PARTUUID=%s' % uuid if uuid else ''
62 63
63 with open(cmdline, 'w') as f: 64 with open(cmdline, 'w') as f:
@@ -70,21 +71,22 @@ python do_uefiapp() {
70 (cmdline, linux, initrd_cmd, stub, executable) 71 (cmdline, linux, initrd_cmd, stub, executable)
71 72
72 check_call(objcopy_cmd, shell=True) 73 check_call(objcopy_cmd, shell=True)
73}
74 74
75do_uefiapp[vardeps] += "APPEND DISK_SIGNATURE_UUID INITRD_LIVE KERNEL_IMAGETYPE" 75python create_uefiapps () {
76 76 # We must clean up anything that matches the expected output pattern, to ensure that
77do_uefiapp_deploy() { 77 # the next steps do not accidentally use old files.
78 rm -rf ${IMAGE_ROOTFS}/boot/* 78 import glob
79 mkdir -p ${IMAGE_ROOTFS}/boot/EFI/BOOT 79 pattern = d.expand('${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.boot*.efi')
80 cp --preserve=timestamps ${DEPLOY_DIR_IMAGE}/boot*.efi ${IMAGE_ROOTFS}/boot/EFI/BOOT/ 80 for old_efi in glob.glob(pattern):
81 os.unlink(old_efi)
82 uuid = d.getVar('DISK_SIGNATURE_UUID')
83 create_uefiapp(d, uuid=uuid)
81} 84}
82 85
83do_uefiapp_deploy[depends] += "${PN}:do_uefiapp" 86sign_uefiapps () {
84 87 if ${@ bb.utils.contains('IMAGE_FEATURES', 'secureboot', 'true', 'false', d) } &&
85do_uefiapp_sign() { 88 [ -f ${UEFIAPP_SIGNING_KEY} ] && [ -f ${UEFIAPP_SIGNING_CERT} ]; then
86 if [ -f ${UEFIAPP_SIGNING_KEY} ] && [ -f ${UEFIAPP_SIGNING_CERT} ]; then 89 for i in `find ${DEPLOY_DIR_IMAGE}/ -name '${IMAGE_LINK_NAME}.boot*.efi'`; do
87 for i in `find ${DEPLOY_DIR_IMAGE}/ -name 'boot*.efi'`; do
88 sbsign --key ${UEFIAPP_SIGNING_KEY} --cert ${UEFIAPP_SIGNING_CERT} $i 90 sbsign --key ${UEFIAPP_SIGNING_KEY} --cert ${UEFIAPP_SIGNING_CERT} $i
89 sbverify --cert ${UEFIAPP_SIGNING_CERT} $i.signed 91 sbverify --cert ${UEFIAPP_SIGNING_CERT} $i.signed
90 mv $i.signed $i 92 mv $i.signed $i
@@ -92,8 +94,35 @@ do_uefiapp_sign() {
92 fi 94 fi
93} 95}
94 96
95do_uefiapp_sign[depends] += "${PN}:do_uefiapp_deploy \ 97# This is intentionally split into different parts. This way, derived
96 sbsigntool-native:do_populate_sysroot" 98# classes or images can extend the individual parts. We can also use
99# whatever language (shell script or Python) is more suitable.
100python do_uefiapp() {
101 bb.build.exec_func('create_uefiapps', d)
102 bb.build.exec_func('sign_uefiapps', d)
103}
104
105do_uefiapp[vardeps] += "APPEND DISK_SIGNATURE_UUID INITRD_LIVE KERNEL_IMAGETYPE IMAGE_LINK_NAME"
106do_uefiapp[depends] += "${@ bb.utils.contains('IMAGE_FEATURES', 'secureboot', 'sbsigntool-native:do_populate_sysroot', '', d) }"
107
108uefiapp_deploy_at() {
109 dest=$1
110 for i in ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.boot*.efi; do
111 target=`basename $i`
112 target=`echo $target | sed -e 's/${IMAGE_LINK_NAME}.//'`
113 cp --preserve=timestamps -r $i $dest/$target
114 done
115}
116
117do_uefiapp_deploy() {
118 rm -rf ${IMAGE_ROOTFS}/boot/*
119 dest=${IMAGE_ROOTFS}/boot/EFI/BOOT
120 mkdir -p $dest
121 uefiapp_deploy_at $dest
122}
123
124do_uefiapp_deploy[depends] += "${PN}:do_uefiapp"
125
97 126
98# This decides when/how we add our tasks to the image 127# This decides when/how we add our tasks to the image
99python () { 128python () {
@@ -124,17 +153,13 @@ python () {
124 if initramfs_fstypes not in image_fstypes: 153 if initramfs_fstypes not in image_fstypes:
125 bb.build.addtask('uefiapp', 'do_image', 'do_rootfs', d) 154 bb.build.addtask('uefiapp', 'do_image', 'do_rootfs', d)
126 bb.build.addtask('uefiapp_deploy', 'do_image', 'do_rootfs', d) 155 bb.build.addtask('uefiapp_deploy', 'do_image', 'do_rootfs', d)
127 # Only sign if secureboot is enabled
128 if secureboot:
129 bb.build.addtask('uefiapp_sign', 'do_image', 'do_rootfs', d)
130} 156}
131 157
132do_uefiapp[vardeps] += "UEFIAPP_SIGNING_CERT_HASH UEFIAPP_SIGNING_KEY_HASH" 158do_uefiapp[vardeps] += "UEFIAPP_SIGNING_CERT_HASH UEFIAPP_SIGNING_KEY_HASH"
133 159
134# Legacy hddimg support below this line 160# Legacy hddimg support below this line
135efi_hddimg_populate() { 161efi_hddimg_populate() {
136 DEST=$1 162 uefiapp_deploy_at "$1"
137 cp --preserve=timestamps -r ${DEPLOY_DIR_IMAGE}/boot*.efi ${DEST}/
138} 163}
139 164
140build_efi_cfg() { 165build_efi_cfg() {