projects/aports·blob master · refs

345 lines · 9.0 KiB

1build_kernel() {
2 local _flavor="$2" _modloopsign= _add
3 shift 3
4 local _pkgs="$@"
5 if [ "$modloop_sign" = "yes" ]; then
6 _modloopsign="--modloopsign --apk-pubkey $_abuild_pubkey"
7 if [ -z "$PACKAGER_PRIVKEY" ]; then
8 error "Need \$PACKAGER_PRIVKEY to be set for modloop_sign=yes"
9 return 1
10 fi
11 fi
12 update-kernel \
13 $_hostkeys \
14 $_modloopsign \
15 --media \
16 --cache-dir "$APKROOT/etc/apk/cache" \
17 --keys-dir "$APKROOT/etc/apk/keys" \
18 --flavor "$_flavor" \
19 --arch "$ARCH" \
20 --package "$_pkgs" \
21 --feature "$initfs_features" \
22 --modloopfw "$modloopfw" \
23 --repositories-file "$APKROOT/etc/apk/repositories" \
24 "$DESTDIR"
25 for _add in $boot_addons; do
26 apk fetch --root "$APKROOT" --quiet --stdout $_add | tar -C "${DESTDIR}" -zx boot/
27 done
28}
29
30section_kernels() {
31 local _f _a _pkgs
32 for _f in $kernel_flavors; do
33 _pkgs="linux-$_f linux-firmware wireless-regdb $modloop_addons"
34 for _a in $kernel_addons; do
35 _pkgs="$_pkgs $_a-$_f"
36 done
37 local id=$( (echo "$initfs_features::$_hostkeys" ; apk fetch --root "$APKROOT" --simulate alpine-base $_pkgs | sort) | checksum)
38 build_section kernel $ARCH $_f $id $_pkgs
39 done
40}
41
42build_apks() {
43 local _apksdir="$DESTDIR/apks"
44 local _archdir="$_apksdir/$ARCH"
45 mkdir -p "$_archdir"
46
47 apk fetch --root "$APKROOT" --link --recursive --output "$_archdir" $apks
48 if ! ls "$_archdir"/*.apk >& /dev/null; then
49 return 1
50 fi
51
52 apk index \
53 --root "$APKROOT" \
54 --description "$RELEASE" \
55 --rewrite-arch "$ARCH" \
56 --index "$_archdir"/APKINDEX.tar.gz \
57 --output "$_archdir"/APKINDEX.tar.gz \
58 "$_archdir"/*.apk
59 abuild-sign "$_archdir"/APKINDEX.tar.gz
60 touch "$_apksdir/.boot_repository"
61}
62
63section_apks() {
64 [ -n "$apks" ] || return 0
65 build_section apks $ARCH $(apk fetch --root "$APKROOT" --simulate --recursive $apks | sort | checksum)
66}
67
68build_apkovl() {
69 local _host="$1" _script=
70 msg "Generating $_host.apkovl.tar.gz"
71 for _script in "$PWD"/"$apkovl" $HOME/.mkimage/$apkovl \
72 $(readlink -f "$scriptdir/$apkovl"); do
73
74 if [ -f "$_script" ]; then
75 break
76 fi
77 done
78 [ -n "$_script" ] || die "could not find $apkovl"
79 (cd "$DESTDIR"; fakeroot "$_script" "$_host")
80}
81
82section_apkovl() {
83 [ -n "$apkovl" -a -n "$hostname" ] || return 0
84 build_section apkovl $hostname $(checksum < "$apkovl")
85}
86
87build_syslinux() {
88 local _fn
89 mkdir -p "$DESTDIR"/boot/syslinux
90 apk fetch --root "$APKROOT" --stdout syslinux | tar -C "$DESTDIR" -xz usr/share/syslinux
91 for _fn in isohdpfx.bin isolinux.bin ldlinux.c32 libutil.c32 libcom32.c32 mboot.c32; do
92 mv "$DESTDIR"/usr/share/syslinux/$_fn "$DESTDIR"/boot/syslinux/$_fn
93 done
94 rm -rf "$DESTDIR"/usr
95}
96
97section_syslinux() {
98 [ "$ARCH" = x86 -o "$ARCH" = x86_64 ] || return 0
99 [ "$output_format" = "iso" ] || return 0
100 build_section syslinux $(apk fetch --root "$APKROOT" --simulate syslinux | sort | checksum)
101}
102
103syslinux_gen_config() {
104 [ -z "$syslinux_serial" ] || echo "SERIAL $syslinux_serial"
105 echo "TIMEOUT ${syslinux_timeout:-10}"
106 echo "PROMPT ${syslinux_prompt:-1}"
107 echo "DEFAULT ${kernel_flavors%% *}"
108
109 local _f _p _initrd
110 for _f in $kernel_flavors; do
111 if [ -z "${xen_params+set}" ]; then
112 _initrd="/boot/initramfs-$_f"
113 for _p in $initrd_ucode; do
114 _initrd="$_p,$_initrd"
115 done
116
117 cat <<- EOF
118
119 LABEL $_f
120 MENU LABEL Linux $_f
121 KERNEL /boot/vmlinuz-$_f
122 INITRD $_initrd
123 FDTDIR /boot/dtbs-$_f
124 APPEND $initfs_cmdline $kernel_cmdline
125 EOF
126 else
127 cat <<- EOF
128
129 LABEL $_f
130 MENU LABEL Xen/Linux $_f
131 KERNEL /boot/syslinux/mboot.c32
132 APPEND /boot/xen.gz ${xen_params} --- /boot/vmlinuz-$_f $initfs_cmdline $kernel_cmdline --- /boot/initramfs-$_f
133 EOF
134 fi
135 done
136}
137
138grub_gen_config() {
139 local _f _p _initrd
140 echo "set timeout=1"
141 for _f in $kernel_flavors; do
142 if [ -z "${xen_params+set}" ]; then
143 _initrd="/boot/initramfs-$_f"
144 for _p in $initrd_ucode; do
145 _initrd="$_p $_initrd"
146 done
147
148 cat <<- EOF
149
150 menuentry "Linux $_f" {
151 linux /boot/vmlinuz-$_f $initfs_cmdline $kernel_cmdline
152 initrd $_initrd
153 }
154 EOF
155 else
156 cat <<- EOF
157
158 menuentry "Xen/Linux $_f" {
159 multiboot2 /boot/xen.gz ${xen_params}
160 module2 /boot/vmlinuz-$_f $initfs_cmdline $kernel_cmdline
161 module2 /boot/initramfs-$_f
162 }
163 EOF
164 fi
165 done
166}
167
168build_syslinux_cfg() {
169 local syslinux_cfg="$1"
170 mkdir -p "${DESTDIR}/$(dirname $syslinux_cfg)"
171 syslinux_gen_config > "${DESTDIR}"/$syslinux_cfg
172}
173
174section_syslinux_cfg() {
175 syslinux_cfg=""
176 if [ "$ARCH" = x86 -o "$ARCH" = x86_64 ]; then
177 [ ! "$output_format" = "iso" ] || syslinux_cfg="boot/syslinux/syslinux.cfg"
178 fi
179 [ ! -n "$uboot_install" ] || syslinux_cfg="extlinux/extlinux.conf"
180 [ -n "$syslinux_cfg" ] || return 0
181 build_section syslinux_cfg $syslinux_cfg $(syslinux_gen_config | checksum)
182}
183
184build_grub_cfg() {
185 local grub_cfg="$1"
186 mkdir -p "${DESTDIR}/$(dirname $grub_cfg)"
187 grub_gen_config > "${DESTDIR}"/$grub_cfg
188}
189
190gen_volid() {
191 printf "%s" "alpine-${profile_abbrev:-$PROFILE} ${RELEASE%_rc*} $ARCH" | cut -c1-32
192}
193
194grub_gen_earlyconf() {
195 cat <<- EOF
196 search --no-floppy --set=root --label "$(gen_volid)"
197 set prefix=(\$root)/boot/grub
198 EOF
199}
200
201build_grub_efi() {
202 local _format="$1"
203 local _efi="$2"
204
205 apk fetch --root "$APKROOT" --quiet --stdout grub-efi | tar -C "$WORKDIR" -zx usr/lib/grub
206
207 # Prepare grub-efi bootloader
208 mkdir -p "$DESTDIR/efi/boot"
209 grub_gen_earlyconf > "$WORKDIR/grub_early.$3.cfg"
210 grub-mkimage \
211 --config="$WORKDIR/grub_early.$3.cfg" \
212 --directory="$WORKDIR"/usr/lib/grub/"$_format" \
213 --prefix="/boot/grub" \
214 --output="$DESTDIR/efi/boot/$_efi" \
215 --format="$_format" \
216 --compression="xz" \
217 $grub_mod
218}
219
220section_grubieee1275() {
221 [ "$ARCH" = ppc64le ] || return 0
222 [ "$output_format" = "iso" ] || return 0
223 kernel_cmdline="$kernel_cmdline console=hvc0"
224
225 build_section grub_cfg boot/grub/grub.cfg $(grub_gen_config | checksum)
226}
227
228section_grub_efi() {
229 [ -n "$grub_mod" ] || return 0
230 local _format _efi
231 case "$ARCH" in
232 aarch64)_format="arm64-efi"; _efi="bootaa64.efi" ;;
233 arm*) _format="arm-efi"; _efi="bootarm.efi" ;;
234 x86) _format="i386-efi"; _efi="bootia32.efi" ;;
235 x86_64) _format="x86_64-efi"; _efi="bootx64.efi" ;;
236 riscv64) _format="riscv64-efi"; _efi="bootriscv64.efi" ;;
237 loongarch64) _format="loongarch64-efi"; _efi="bootloongarch64.efi" ;;
238 *) return 0 ;;
239 esac
240
241 build_section grub_cfg boot/grub/grub.cfg $(grub_gen_config | checksum)
242 build_section grub_efi $_format $_efi $(grub_gen_earlyconf | checksum)
243}
244
245create_image_iso() {
246 local ISO="${OUTDIR}/${output_filename}"
247 local _isolinux
248 local _efiboot
249
250 if [ -e "${DESTDIR}/boot/syslinux/isolinux.bin" ]; then
251 # isolinux enabled
252 _isolinux="
253 -isohybrid-mbr ${DESTDIR}/boot/syslinux/isohdpfx.bin
254 -eltorito-boot boot/syslinux/isolinux.bin
255 -eltorito-catalog boot/syslinux/boot.cat
256 -no-emul-boot
257 -boot-load-size 4
258 -boot-info-table
259 "
260 fi
261 if [ -e "${DESTDIR}/efi" -a -e "${DESTDIR}/boot/grub" ]; then
262 # Create the EFI boot partition image
263 mformat -i ${DESTDIR}/boot/grub/efi.img -C -f 1440 -N 0 ::
264 mcopy -i ${DESTDIR}/boot/grub/efi.img -s ${DESTDIR}/efi ::
265 touch -md "@${SOURCE_DATE_EPOCH}" ${DESTDIR}/boot/grub/efi.img
266
267 # Enable EFI boot
268 if [ -z "$_isolinux" ]; then
269 # efi boot only
270 _efiboot="
271 -efi-boot-part
272 --efi-boot-image
273 -e boot/grub/efi.img
274 -no-emul-boot
275 "
276 else
277 # hybrid isolinux+efi boot
278 _efiboot="
279 -eltorito-alt-boot
280 -e boot/grub/efi.img
281 -no-emul-boot
282 -isohybrid-gpt-basdat
283 "
284 fi
285 fi
286
287 if [ "$ARCH" = ppc64le ]; then
288 apk fetch --root "$APKROOT" --quiet --stdout grub-ieee1275 | tar -C "$WORKDIR" -zx usr/lib/grub
289 grub-mkrescue --output ${ISO} ${DESTDIR} -follow-links \
290 --directory="$WORKDIR"/usr/lib/grub/powerpc-ieee1275 \
291 -sysid LINUX \
292 -volid "$(gen_volid)"
293 else
294 if [ "$ARCH" = s390x ]; then
295 printf %s "$initfs_cmdline $kernel_cmdline " > ${WORKDIR}/parmfile
296 for _f in $kernel_flavors; do
297 mk-s390image -p ${WORKDIR}/parmfile \
298 -r ${DESTDIR}/boot/initramfs-$_f \
299 ${DESTDIR}/boot/vmlinuz-$_f \
300 ${DESTDIR}/boot/merged.img
301 done
302 iso_opts="$iso_opts -no-emul-boot -eltorito-boot boot/merged.img"
303 fi
304 xorrisofs \
305 -quiet \
306 -output ${ISO} \
307 -full-iso9660-filenames \
308 -joliet \
309 -rational-rock \
310 -sysid LINUX \
311 -volid "$(gen_volid)" \
312 $_isolinux \
313 $_efiboot \
314 -follow-links \
315 ${iso_opts} \
316 ${DESTDIR}
317 fi
318}
319
320create_image_targz() {
321 tar -C "${DESTDIR}" \
322 --mtime="@${SOURCE_DATE_EPOCH}" \
323 --owner=0 --group=0 --numeric-owner \
324 -chzf "${OUTDIR}/${output_filename}" .
325}
326
327profile_base() {
328 kernel_flavors="lts"
329 initfs_cmdline="modules=loop,squashfs,sd-mod,usb-storage quiet"
330 initfs_features="ata base bootchart cdrom dhcp ext4 mmc nvme raid scsi squashfs usb virtio"
331 modloop_sign=yes
332 grub_mod="all_video disk part_gpt part_msdos linux normal configfile search search_label efi_gop fat iso9660 cat echo ls test true help gzio"
333 case "$ARCH" in
334 x86*) grub_mod="$grub_mod multiboot2 efi_uga";;
335 esac
336 case "$ARCH" in
337 x86_64) initfs_features="$initfs_features nfit";;
338 arm*|aarch64|riscv64) initfs_features="$initfs_features phy";;
339 esac
340 apks="alpine-base apk-cron busybox chrony dhcpcd doas e2fsprogs
341 kbd-bkeymaps network-extras openntpd openssl openssh
342 tzdata wget tiny-cloud-alpine"
343 apkovl=
344 hostname="alpine"
345}