1# $OpenBSD: Makefile,v 1.11 2021/09/09 11:48:06 schwarze Exp $
2#
3# Copyright (c) 2016 Ingo Schwarze <schwarze@openbsd.org>
4#
5# Permission to use, copy, modify, and distribute this software for any
6# purpose with or without fee is hereby granted, provided that the above
7# copyright notice and this permission notice appear in all copies.
8#
9# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
17# D: dbm_dump	M: man	O: out	E: err
18D_MOE_TESTS =	empty
19DO_MO_TESTS =	onepage twopages threepages threemacros
20DO_MO_TESTS +=	sortpages sortpages_rev so so_rev sortnames
21DO_MO_TESTS +=	twosect twoarch threearch fn in va sh xr
22DOE_M_TESTS =	padipage padfpage padmpage 
23DOE_M_TESTS +=	padmacros padimacro padmmacro
24DOE_M_TESTS +=	padientry padfentry padmentry padfmagic
25DOE_MOE_TESTS =	badname0 badname badsect0 badsect badarch0 badarch
26DOE_MOE_TESTS += baddesc0 baddesc badfile0 badfile
27DE_M_TESTS =	nonexistent short badimagic badversion badmacrosp badendp
28DE_M_TESTS +=	badnpages badnmacros badmacrop badfmagic
29
30DO_TESTS =	${DO_MO_TESTS}
31DOE_TESTS =	${DOE_M_TESTS} ${DOE_MOE_TESTS}
32DE_TESTS =	${DE_M_TESTS}
33DOB_TESTS =	${DO_TESTS} ${DOE_TESTS}
34DEB_TESTS =	${DOE_TESTS} ${DE_TESTS}
35MOB_TESTS =	${DO_MO_TESTS} ${D_MOE_TESTS} ${DOE_MOE_TESTS}
36MEB_TESTS =	${D_MOE_TESTS} ${DOE_MOE_TESTS}
37ALL_TESTS =	${DO_TESTS} ${DOE_TESTS} ${DE_TESTS}
38
39REGRESS_TARGETS = ${ALL_TESTS} diff.derr diff.mout diff.merr
40
41CLEANFILES =	${ALL_TESTS:C/$/.db/}
42CLEANFILES +=	${ALL_TESTS:C/$/.dout/} ${ALL_TESTS:C/$/.derr/} all.derr
43CLEANFILES +=	${MOB_TESTS:C/$/.mout/} all.mout
44CLEANFILES +=	${MEB_TESTS:C/$/.merr/} all.merr
45CLEANFILES +=	binedit dbm_dump makeinodes
46
47# === MAIN REGRESSION TARGETS ==========================================
48
49.for NAME in ${DO_TESTS}
50${NAME}: ${NAME}.dout ${NAME}.derr
51	test \! -s ${NAME}.derr
52	diff -u ${.CURDIR}/../out/${NAME}.dout ${NAME}.dout
53.endfor
54
55.for NAME in ${DOE_TESTS}
56${NAME}: ${NAME}.dout ${NAME}.derr
57	test -s ${NAME}.derr
58	diff -u ${.CURDIR}/../out/${NAME}.dout ${NAME}.dout
59.endfor
60
61.for NAME in ${DE_TESTS}
62${NAME}: ${NAME}.dout ${NAME}.derr
63	test -s ${NAME}.derr
64	test \! -s ${NAME}.dout
65.endfor
66
67diff.derr: all.derr
68	diff -u ${.CURDIR}/../out/all.derr all.derr
69
70diff.mout: all.mout
71	diff -u ${.CURDIR}/../out/all.mout all.mout
72
73diff.merr: all.merr
74	diff -u ${.CURDIR}/../out/all.merr all.merr
75
76.PHONY: ${REGRESS_TARGETS}
77
78
79# === RUNNING DBM_DUMP =================================================
80
81.for NAME in ${DOB_TESTS}
82${NAME}.dout ${NAME}.derr: dbm_dump ${NAME}.db
83	./dbm_dump ${NAME}.db > ${NAME}.dout 2> ${NAME}.derr
84.endfor
85
86.for NAME in ${DE_TESTS}
87${NAME}.dout ${NAME}.derr: dbm_dump ${NAME}.db
88	if ./dbm_dump ${NAME}.db > ${NAME}.dout 2> ${NAME}.derr; \
89		then false; else true; fi
90.endfor
91
92all.derr: ${DEB_TESTS:C/$/.derr/}
93	for f in ${DEB_TESTS}; \
94		do printf "\n>>> $$f\n"; cat $$f.derr; done > $@
95
96
97# === RUNNING MAKEWHATIS AND MAN =======================================
98
99empty.mout empty.merr:
100	@echo creating $@
101	mkdir -p empty.dir
102	makewhatis empty.dir
103	if man -kM empty.dir something > empty.mout 2> empty.merr; \
104		then false; else test $$? -eq 5; fi
105
106onepage.db onepage.mout: ${.CURDIR}/../man/empty.1
107	@echo creating $@
108	mkdir -p onepage.dir/man1
109	cp ${.CURDIR}/../man/empty.1 onepage.dir/man1/
110	makewhatis onepage.dir
111	man -kM onepage.dir title > onepage.mout
112	cp onepage.dir/mandoc.db onepage.db
113
114twopages.db twopages.mout: ${.CURDIR}/../man/empty.1
115	@echo creating $@
116	mkdir -p twopages.dir/man1
117	cp ${.CURDIR}/../man/empty.1 twopages.dir/man1/
118	cp ${.CURDIR}/../man/empty.1 twopages.dir/man1/second.1
119	makewhatis twopages.dir
120	(echo "> second"; man -wM twopages.dir second; \
121	  echo "> empty"; man -wM twopages.dir empty) \
122	  | sed 's#.*/twopages\.dir/##' > twopages.mout
123	cp twopages.dir/mandoc.db twopages.db
124
125threepages.db threepages.mout: ${.CURDIR}/../man/empty.1
126	@echo creating $@
127	mkdir -p threepages.dir/man1
128	cp ${.CURDIR}/../man/empty.1 threepages.dir/man1/
129	cp ${.CURDIR}/../man/empty.1 threepages.dir/man1/second.1
130	cp ${.CURDIR}/../man/empty.1 threepages.dir/man1/third.1
131	makewhatis threepages.dir
132	(echo "> second"; man -wM threepages.dir second; \
133	  echo "> third"; man -wM threepages.dir third; \
134	  echo "> empty"; man -wM threepages.dir empty) \
135	  | sed 's#.*/threepages.dir/##' > threepages.mout
136	cp threepages.dir/mandoc.db threepages.db
137
138threemacros.db threemacros.mout: ${.CURDIR}/../man/empty.1
139	@echo creating $@
140	mkdir -p threemacros.dir/man1
141	cp ${.CURDIR}/../man/empty.1 threemacros.dir/man1/
142	printf ".Sh SEE ALSO\n.Xr one 1\n.Xr two 2\n.Xr three 3" \
143		>> threemacros.dir/man1/empty.1
144	makewhatis threemacros.dir
145	(echo "> Xr=one"; \
146	  man -kwM threemacros.dir Xr=one | sed 's#.*/threemacros\.dir/##'; \
147	  echo "> Xr~^t"; man -kM threemacros.dir -O Xr Xr~^t) \
148	  > threemacros.mout
149	cp threemacros.dir/mandoc.db threemacros.db
150
151sortpages.db sortpages.mout: makeinodes ${.CURDIR}/../man/empty.1
152	@echo creating $@
153	./makeinodes sortpages.dir
154	cat ${.CURDIR}/../man/empty.1 >> sortpages.dir/man1/one.1
155	cat ${.CURDIR}/../man/empty.1 >> sortpages.dir/man1/two.1
156	makewhatis sortpages.dir
157	man -kM sortpages.dir Nm=empty > sortpages.mout
158	cp sortpages.dir/mandoc.db sortpages.db
159
160sortpages_rev.db sortpages_rev.mout: makeinodes ${.CURDIR}/../man/empty.1
161	@echo creating $@
162	rm -rf sortpages_rev.dir
163	./makeinodes -r sortpages_rev.dir
164	cat ${.CURDIR}/../man/empty.1 >> sortpages_rev.dir/man1/one.1
165	cat ${.CURDIR}/../man/empty.1 >> sortpages_rev.dir/man1/two.1
166	makewhatis sortpages_rev.dir
167	man -kM sortpages_rev.dir Nm=empty > sortpages_rev.mout
168	cp sortpages_rev.dir/mandoc.db sortpages_rev.db
169
170so.db so.mout: makeinodes ${.CURDIR}/../man/empty.1
171	@echo creating $@
172	./makeinodes so.dir
173	cat ${.CURDIR}/../man/empty.1 >> so.dir/man1/one.1
174	echo ".so man1/one.1" >> so.dir/man1/two.1
175	makewhatis so.dir
176	man -wM so.dir two | sed 's#.*/so\.dir/##' > so.mout
177	cp so.dir/mandoc.db so.db
178
179so_rev.db so_rev.mout: makeinodes ${.CURDIR}/../man/empty.1
180	@echo creating $@
181	./makeinodes -r so_rev.dir
182	cat ${.CURDIR}/../man/empty.1 >> so_rev.dir/man1/one.1
183	echo ".so man1/one.1" >> so_rev.dir/man1/two.1
184	makewhatis so_rev.dir
185	man -wM so_rev.dir two | sed 's#.*/so_rev\.dir/##' > so_rev.mout
186	cp so_rev.dir/mandoc.db so_rev.db
187
188sortnames.db sortnames.mout: ${.CURDIR}/../man/sortnames.1
189	@echo creating $@
190	mkdir -p sortnames.dir/man1
191	cp ${.CURDIR}/../man/sortnames.1 sortnames.dir/man1/
192	ln sortnames.dir/man1/sortnames.1 sortnames.dir/man1/link.1
193	makewhatis sortnames.dir
194	man -kM sortnames.dir Nm=onlysyn > sortnames.mout
195	cp sortnames.dir/mandoc.db sortnames.db
196
197twosect.db twosect.mout: ${.CURDIR}/../man/empty.1
198	@echo creating $@
199	mkdir -p twosect.dir/man1
200	mkdir -p twosect.dir/man8
201	cp ${.CURDIR}/../man/empty.1 twosect.dir/man1/
202	ln twosect.dir/man1/empty.1 twosect.dir/man8/empty.8
203	makewhatis twosect.dir
204	man -kM twosect.dir -s 1 title > twosect.mout
205	cp twosect.dir/mandoc.db twosect.db
206
207twoarch.db twoarch.mout: ${.CURDIR}/../man/empty.1
208	@echo creating $@
209	mkdir -p twoarch.dir/man1/i386
210	mkdir -p twoarch.dir/man1/amd64
211	cp ${.CURDIR}/../man/empty.1 twoarch.dir/man1/i386
212	ln twoarch.dir/man1/i386/empty.1 twoarch.dir/man1/amd64/empty.1
213	makewhatis twoarch.dir
214	man -kM twoarch.dir -S i386 title > twoarch.mout
215	cp twoarch.dir/mandoc.db twoarch.db
216
217threearch.db threearch.mout: ${.CURDIR}/../man/empty.1
218	@echo creating $@
219	mkdir -p threearch.dir/man1/amd64
220	mkdir -p threearch.dir/man1/i386
221	mkdir -p threearch.dir/man1/sgi
222	cp ${.CURDIR}/../man/empty.1 threearch.dir/man1/amd64/
223	cp ${.CURDIR}/../man/empty.1 threearch.dir/man1/i386/
224	cp ${.CURDIR}/../man/empty.1 threearch.dir/man1/sgi/
225	makewhatis threearch.dir
226	(echo "> amd64"; man -wM threearch.dir -S amd64 empty; \
227	  echo "> i386"; man -wM threearch.dir -S i386 empty; \
228	  echo "> sgi"; man -wM threearch.dir -S sgi empty) \
229	  | sed 's#.*/threearch\.dir/##' > threearch.mout
230	cp threearch.dir/mandoc.db threearch.db
231
232fn.db fn.mout: ${.CURDIR}/../man/fn.3
233	@echo creating $@
234	mkdir -p fn.dir/man3
235	cp ${.CURDIR}/../man/fn.3 fn.dir/man3/
236	makewhatis fn.dir
237	(echo "> fn_type"; man -kwM fn.dir Ft=fn_type; \
238	  echo "> fn_func"; man -kwM fn.dir Fn=fn_func; \
239	  echo "> fn_arg"; man -kwM fn.dir Fa=fn_arg; \
240	  echo "> fo_type"; man -kwM fn.dir Ft=fo_type; \
241 	  echo "> fo_name"; man -kwM fn.dir Fn=fo_name; \
242	  echo "> fo_arg"; man -kwM fn.dir Fa=fo_arg) \
243	  | sed 's#.*/fn\.dir/##' > fn.mout
244	cp fn.dir/mandoc.db fn.db
245
246in.db in.mout: ${.CURDIR}/../man/in.3
247	@echo creating $@
248	mkdir -p in.dir/man3
249	cp ${.CURDIR}/../man/in.3 in.dir/man3/
250	makewhatis in.dir
251	(echo "> In"; man -kwM in.dir In=in.h; \
252	  echo "> Fd"; man -kwM in.dir In=fd.h) \
253	  | sed 's#.*/in\.dir/##' > in.mout
254	cp in.dir/mandoc.db in.db
255
256va.db va.mout: ${.CURDIR}/../man/va.3
257	@echo creating $@
258	mkdir -p va.dir/man3
259	cp ${.CURDIR}/../man/va.3 va.dir/man3/
260	makewhatis va.dir
261	(echo "> b2"; man -kwM va.dir Va='block vt_two'; \
262	  echo "> t1"; man -kwM va.dir Vt='vt_one'; \
263	  echo "> a1"; man -kwM va.dir Va='va_one'; \
264	  echo "> t2"; man -kwM va.dir Vt='struct vt_two'; \
265	  echo "> a2"; man -kwM va.dir Va='int va_two') \
266	  | sed 's#.*/va\.dir/##' > va.mout
267	cp va.dir/mandoc.db va.db
268
269sh.db sh.mout: ${.CURDIR}/../man/sh.1
270	@echo creating $@
271	mkdir -p sh.dir/man1
272	cp ${.CURDIR}/../man/sh.1 sh.dir/man1/
273	makewhatis sh.dir
274	(echo "> Sh"; man -kwM sh.dir Sh=sh_title; \
275	  echo "> Ss"; man -kwM sh.dir Ss=ss_title) \
276	  | sed 's#.*/sh\.dir/##' > sh.mout
277	cp sh.dir/mandoc.db sh.db
278
279xr.db xr.mout: ${.CURDIR}/../man/xr.1
280	@echo creating $@
281	mkdir -p xr.dir/man1
282	cp ${.CURDIR}/../man/xr.1 xr.dir/man1/
283	makewhatis xr.dir
284	(echo "> bare"; man -kwM xr.dir 'Xr~^bare$$'; \
285	  echo "> page"; man -kwM xr.dir 'Xr=page(1)') \
286	  | sed 's#.*/xr\.dir/##' > xr.mout
287	cp xr.dir/mandoc.db xr.db
288
289badname0.mout badname0.merr: badname0.db
290	@echo creating $@
291	cp -pR onepage.dir badname0.dir
292	cp badname0.db badname0.dir/mandoc.db
293	man -wM badname0.dir empty > badname0.mout 2> badname0.merr
294	sed -i 's#.*/badname0\.dir/##' badname0.mout
295	sed -i 's#, run makewhatis.*##' badname0.merr
296
297badname.mout badname.merr: badname.db
298	@echo creating $@
299	cp -pR threepages.dir badname.dir
300	cp badname.db badname.dir/mandoc.db
301	man -wM badname.dir empty > badname.mout 2> badname.merr
302	sed -i 's#.*/badname\.dir/##' badname.mout
303	sed -i 's#, run makewhatis.*##' badname.merr
304
305badsect0.mout badsect0.merr: badsect0.db
306	@echo creating $@
307	cp -pR onepage.dir badsect0.dir
308	cp badsect0.db badsect0.dir/mandoc.db
309	man -wM badsect0.dir -s 1 empty > badsect0.mout 2> badsect0.merr
310	sed -i 's#.*/badsect0\.dir/##' badsect0.mout
311	sed -i 's#, run makewhatis.*##' badsect0.merr
312
313badsect.mout badsect.merr: badsect.db
314	@echo creating $@
315	cp -pR threepages.dir badsect.dir
316	cp badsect.db badsect.dir/mandoc.db
317	man -wM badsect.dir -s 1 empty > badsect.mout 2> badsect.merr
318	sed -i 's#.*/badsect\.dir/##' badsect.mout
319	sed -i 's#, run makewhatis.*##' badsect.merr
320
321badarch0.mout badarch0.merr: badarch0.db
322	@echo creating $@
323	cp -pR threearch.dir badarch0.dir
324	cp badarch0.db badarch0.dir/mandoc.db
325	man -wM badarch0.dir -S amd64 empty > badarch0.mout 2> badarch0.merr
326	sed -i 's#.*/badarch0\.dir/##' badarch0.mout
327	sed -i 's#, run makewhatis.*##' badarch0.merr
328
329badarch.mout badarch.merr: badarch.db
330	@echo creating $@
331	cp -pR threearch.dir badarch.dir
332	cp badarch.db badarch.dir/mandoc.db
333	man -wM badarch.dir -S i386 empty > badarch.mout 2> badarch.merr
334	sed -i 's#.*/badarch\.dir/##' badarch.mout
335	sed -i 's#, run makewhatis.*##' badarch.merr
336
337baddesc0.mout baddesc0.merr: baddesc0.db
338	@echo creating $@
339	cp -pR onepage.dir baddesc0.dir
340	cp baddesc0.db baddesc0.dir/mandoc.db
341	man -kM baddesc0.dir empty > baddesc0.mout 2> baddesc0.merr
342
343baddesc.mout baddesc0.merr: baddesc.db
344	@echo creating $@
345	cp -pR threepages.dir baddesc.dir
346	cp baddesc.db baddesc.dir/mandoc.db
347	man -kM baddesc.dir empty > baddesc.mout 2> baddesc.merr
348
349badfile0.mout badfile0.merr: badfile0.db
350	@echo creating $@
351	cp -pR onepage.dir badfile0.dir
352	cp badfile0.db badfile0.dir/mandoc.db
353	man -wM badfile0.dir empty > badfile0.mout 2> badfile0.merr
354	sed -i 's#.*/badfile0\.dir/##' badfile0.mout
355	sed -i 's#, run makewhatis.*##;s#/.*/mandoc/##' badfile0.merr
356
357badfile.mout badfile.merr: badfile.db
358	@echo creating $@
359	cp -pR threepages.dir badfile.dir
360	cp badfile.db badfile.dir/mandoc.db
361	man -wM badfile.dir empty > badfile.mout 2> badfile.merr
362	sed -i 's#.*/badfile\.dir/##' badfile.mout
363	sed -i 's#, run makewhatis.*##;s#/.*/mandoc/##' badfile.merr
364
365all.mout: ${MOB_TESTS:C/$/.mout/}
366	for f in ${MOB_TESTS}; \
367		do printf "\n>>> $$f\n"; cat $$f.mout || true; done > $@
368
369all.merr: ${MEB_TESTS:C/$/.merr/}
370	for f in ${MEB_TESTS}; \
371		do printf "\n>>> $$f\n"; cat $$f.merr || true; done > $@
372
373
374# === RUNNING BINEDIT ==================================================
375
376padipage.db: binedit twopages.db
377	./binedit c16rw1f < twopages.db > $@
378
379padfpage.db: binedit twopages.db
380	./binedit c16rw1s20c20w0w0w0w0w0f < twopages.db > $@
381
382padmpage.db: binedit threepages.db
383	./binedit c16rw2c20s20c20w0w0w0w0w0f < threepages.db > $@
384
385badname0.db: binedit onepage.db
386	./binedit c20rw-1f < onepage.db > $@
387
388badname.db: binedit threepages.db
389	./binedit c40rw-1f < threepages.db > $@
390
391badsect0.db: binedit onepage.db
392	./binedit c24rw-1f < onepage.db > $@
393
394badsect.db: binedit threepages.db
395	./binedit c44rw-1f < threepages.db > $@
396
397badarch0.db: binedit threearch.db
398	./binedit c28rw-1f < threearch.db > $@
399
400badarch.db: binedit threearch.db
401	./binedit c48rw-1f < threearch.db > $@
402
403baddesc0.db: binedit onepage.db
404	./binedit c32rw-1f < onepage.db > $@
405
406baddesc.db: binedit threepages.db
407	./binedit c52rw-1f < threepages.db > $@
408
409badfile0.db: binedit onepage.db
410	./binedit c36rw-1f < onepage.db > $@
411
412badfile.db: binedit threepages.db
413	./binedit c56rw-1f < threepages.db > $@
414
415padmacros.db: binedit onepage.db
416	./binedit c16rw0f < onepage.db > $@
417
418padimacro.db: binedit onepage.db
419	./binedit c8rdwri4wac4s4c136rwi4ww0f < onepage.db > $@
420
421padmmacro.db: binedit onepage.db
422	./binedit c8rdwri4wac8s4c132rwi4ww0f < onepage.db > $@
423
424padientry.db: binedit threemacros.db
425	./binedit c8rdwac4rdwarw2f < threemacros.db > $@
426
427padfentry.db: binedit threemacros.db
428	./binedit c8rdwac4rdwarw2s8c16w0w0f < threemacros.db > $@
429
430padmentry.db: binedit threemacros.db
431	./binedit c8rdwac4rdwarw2c8s8c8w0w0f < threemacros.db > $@
432
433padfmagic.db: binedit onepage.db
434	./binedit c12rdi4waw0f < onepage.db > $@
435
436nonexistent.db:
437	rm -rf nonexistent.db
438
439short.db:
440	echo 'sho' > $@
441
442badimagic.db: binedit onepage.db
443	./binedit riwf < onepage.db > $@
444
445badversion.db: binedit onepage.db
446	./binedit c4riwf < onepage.db > $@
447
448badmacrosp.db: binedit onepage.db
449	./binedit c8rw1000f < onepage.db > $@
450
451badendp.db: binedit onepage.db
452	./binedit c12riwf < onepage.db > $@
453
454badnpages.db: binedit onepage.db
455	./binedit c16rw-1f < onepage.db > $@
456
457badnmacros.db: binedit onepage.db
458	./binedit c8rdwariwf < onepage.db > $@
459
460badmacrop.db: binedit onepage.db
461	./binedit c8rdwac4rw1000f < onepage.db > $@
462
463badfmagic.db: binedit onepage.db
464	./binedit c12rdwariwf < onepage.db > $@
465
466
467# === GETTING ACCESS TO THE UTILITIES ==================================
468
469binedit dbm_dump makeinodes:
470	cd ${.CURDIR}/../$@ && make all
471	ln -sf ${.OBJDIR}/../$@/$@ .
472
473.include <bsd.regress.mk>
474
475# must come after the .include: <bsd.prog.mk> contains .if !target(clean)
476clean: clean_local
477
478clean_local:
479	rm -rf ${MOB_TESTS:C/$/.dir/}
480