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