1#	$OpenBSD: Makefile,v 1.41 2025/01/03 02:23:20 kn Exp $
2
3INSTALLBOOT ?=		/usr/sbin/installboot
4DRY_RUN =		${INSTALLBOOT} -n
5REAL_RUN =		${INSTALLBOOT}
6
7# see distrib/${MACHINE}/ramdisk/install.md for FORMAT_DISK values
8# default to root on softraid(4) on all architectures that have
9# bootstrap + kernel + installboot(8) support for it
10.if   ${MACHINE} == "amd64"	# assume EFI/GPT
11FORMAT_DISK =		fdisk -gy -b 532480
12DISK_BLOCKS =		768
13STAGENAMES =		biosboot boot
14USE_SOFTRAID ?=		Yes
15.elif ${MACHINE} == "arm64"
16STAGENAMES =		BOOTAA64.EFI
17USE_SOFTRAID ?=		Yes
18.elif ${MACHINE} == "armv7"
19STAGENAMES =		BOOTARM.EFI
20.elif ${MACHINE} == "i386"
21FORMAT_DISK =		fdisk -iy
22STAGENAMES =		biosboot boot
23USE_SOFTRAID ?=		Yes
24.elif ${MACHINE} == "macppc"	# assume MBR
25FORMAT_DISK =		fdisk -iy -b '2048@1:06'
26STAGENAMES =		ofwboot
27.elif ${MACHINE} == "octeon"
28FORMAT_DISK =		fdisk -iy -b '65536@64:C'
29STAGENAMES =		boot
30.elif ${MACHINE} == "powerpc64"
31STAGENAMES =		boot
32.elif ${MACHINE} == "riscv64"
33STAGENAMES =		BOOTRISCV64.EFI
34USE_SOFTRAID ?=		Yes
35.elif ${MACHINE} == "sparc64"
36FORMAT_DISK =		true	# NOOP
37STAGENAMES =		bootblk ofwboot
38USE_SOFTRAID ?=		Yes
39.else
40# missing: alpha, hppa, landisk, loongson, luna88k
41regress:
42	@echo SKIPPED
43.endif
44
45# how distrib/$(arch -s)/*/install.md:md_prep_fdisk() formats the root disk
46FORMAT_DISK ?=		fdisk -iy -b '32768@32768:C'
47DISK_BLOCKS ?=		128
48STAGEDIR =		/usr/mdec
49STAGEFILES =		${STAGENAMES:=${STAGEDIR}/%}
50# is installboot(8) built with -DSOFTRAID?
51USE_SOFTRAID ?=		No
52
53.if ${USE_SOFTRAID:L} == "yes"
54# install on multi-chunk RAID 1C with keydisk so installboot(8) must
55# - iterate over chunks
56# - ignore the keydisk/not install to it
57NDISKS ?=		2
58KEYDISKFILE =		keydisk.img
59KEYDEVFILE =		keydev.txt
60.else
61NDISKS =		1
62.endif
63
64DISKFILES !=		jot -w disk%d.img    -- ${NDISKS}
65DISKDEVFILES !=		jot -w diskdev%d.txt -- ${NDISKS}
66ROOTDEVFILE =		rootdev.txt
67MOUNTPOINT =		mnt
68
69
70REGRESS_SETUP_ONCE =	create-root
71
72# |1.img ... n.img|    |1.img 1.txt|
73# |1.txt ... n.txt| => |...   ...  |
74#                      |n.img n.txt|
75FILETUPLES !=		{ echo ${DISKFILES}    ${KEYDISKFILE}; \
76			  echo ${DISKDEVFILES} ${KEYDEVFILE} ; } | \
77				rs -T -- $$((${NDISKS} + 1)) 2
78create-disks:
79.for diskfile devfile in ${FILETUPLES}
80	dd if=/dev/zero  of=${diskfile} bs=1m count=0 seek=${DISK_BLOCKS} status=none
81	${SUDO} vnconfig -- ${diskfile} 1>${devfile}
82	${SUDO} ${FORMAT_DISK} -- "$$(<${devfile})" 1>/dev/null
83.  if ${USE_SOFTRAID:L} == "yes"
84	echo 'RAID *' | ${SUDO} disklabel -wAT- -- "$$(<${devfile})" 1>/dev/null
85.  endif
86.endfor
87
88create-root: create-disks
89.if ${USE_SOFTRAID:L} == "yes"
90	${SUDO} bioctl -l"$$(sed -- s/$$/a/ ${DISKDEVFILES} | paste -sd, -- -)" \
91	    -c1C -k"$$(<${KEYDEVFILE})"a -- softraid0 | \
92		grep -o -- 'sd[0-9]*$$' 1>${ROOTDEVFILE}
93	${SUDO} ${FORMAT_DISK} -- "$$(<${ROOTDEVFILE})" 1>/dev/null
94.else
95	ln -s -- ${DISKDEVFILES} ${ROOTDEVFILE}
96.endif
97	${SUDO} disklabel -Aw -- "$$(<${ROOTDEVFILE})"
98	${SUDO} newfs -q -- "$$(<${ROOTDEVFILE})"a 1>/dev/null
99	mkdir -p -- ${MOUNTPOINT}
100	${SUDO} mount -- /dev/"$$(<${ROOTDEVFILE})"a ${MOUNTPOINT}
101	${SUDO} mkdir -- ${MOUNTPOINT}/usr
102	${SUDO} cp -r -- ${STAGEDIR} ${MOUNTPOINT}/usr/
103
104
105# must be first as some targets expect a working filesystem
106REGRESS_TARGETS =	prepare
107
108prepare:
109	${SUDO} ${REAL_RUN} -p -- "$$(<${ROOTDEVFILE})"
110
111SUCCESS_TESTS +=	dry-prepare \
112			dry-default \
113			dry-root \
114			root \
115			root-stages
116REGRESS_TARGETS +=	${SUCCESS_TESTS}
117REGRESS_ROOT_TARGETS +=	${SUCCESS_TESTS}
118
119dry-prepare:
120	${SUDO} ${DRY_RUN} -p -- "$$(<${ROOTDEVFILE})"
121dry-default:
122	${SUDO} ${DRY_RUN} -- "$$(<${ROOTDEVFILE})"
123dry-root:
124	${SUDO} ${DRY_RUN} -r/ -- "$$(<${ROOTDEVFILE})"
125
126root:
127	${SUDO} ${REAL_RUN} -r ${MOUNTPOINT} -- "$$(<${ROOTDEVFILE})"
128root-stages:
129	${SUDO} ${REAL_RUN} -- "$$(<${ROOTDEVFILE})" ${STAGEFILES}
130
131
132FAILURE_TESTS =			dry-prepare-root \
133				dry-prepare-stages \
134				dry-nodisk-stages \
135				dry-toofew \
136				dry-toomany
137REGRESS_EXPECTED_FAILURES +=	${FAILURE_TESTS}
138REGRESS_TARGETS +=		${FAILURE_TESTS}
139REGRESS_ROOT_TARGETS +=		dry-nodisk-stages
140
141dry-prepare-root:
142	${DRY_RUN} -p -r/ -- "$$(<${ROOTDEVFILE})" 2>/dev/null
143dry-prepare-stages:
144	${DRY_RUN} -p -- "$$(<${ROOTDEVFILE})" ${STAGEFILES} 2>/dev/null
145
146dry-nodisk-stages:
147	${SUDO} ${DRY_RUN} -- ${STAGEFILES} 2>/dev/null
148
149dry-toofew:
150	${DRY_RUN} -- 2>/dev/null
151dry-toomany:
152	${DRY_RUN} -- disk stage1 stage2 too many 2>/dev/null
153
154
155CLEANFILES =		*.txt *.img
156REGRESS_CLEANUP =	cleanup
157
158# allow failure to always cleanup as much as possible
159.IGNORE: cleanup
160cleanup:
161	${SUDO} umount -- ${MOUNTPOINT} 2>/dev/null
162	rmdir -- ${MOUNTPOINT} 2>/dev/null
163.if ${USE_SOFTRAID:L} == "yes"
164	${SUDO} bioctl -d -- "$$(<${ROOTDEVFILE})" 2>/dev/null
165.endif
166.for _ devfile in ${FILETUPLES}
167	${SUDO} vnconfig -u -- "$$(<${devfile})" 2>/dev/null
168.endfor
169
170.include <bsd.regress.mk>
171