11.128Srillig#	$NetBSD: Makefile,v 1.128 2025/01/19 10:57:10 rillig Exp $
21.8Schristos#	@(#)Makefile	5.2 (Berkeley) 12/28/90
31.1Scgd
41.1ScgdPROG=	make
51.82SrilligSRCS=	arch.c
61.82SrilligSRCS+=  buf.c
71.82SrilligSRCS+=  compat.c
81.82SrilligSRCS+=  cond.c
91.82SrilligSRCS+=  dir.c
101.82SrilligSRCS+=  for.c
111.82SrilligSRCS+=  hash.c
121.82SrilligSRCS+=  job.c
131.82SrilligSRCS+=  lst.c
141.82SrilligSRCS+=  main.c
151.82SrilligSRCS+=	make.c
161.82SrilligSRCS+=  make_malloc.c
171.82SrilligSRCS+=  metachar.c
181.82SrilligSRCS+=  parse.c
191.82SrilligSRCS+=	str.c
201.82SrilligSRCS+=  suff.c
211.82SrilligSRCS+=  targ.c
221.82SrilligSRCS+=  trace.c
231.82SrilligSRCS+=  var.c
241.82SrilligSRCS+=  util.c
251.123SrilligWARNS=	6
261.40Sdsl
271.80Srillig# Whether to generate a coverage report after running the tests.
281.73SrilligUSE_COVERAGE?=	no		# works only with gcc; clang9 fails to link
291.73Srillig.if ${USE_COVERAGE} == "yes"
301.87SrilligGCOV?=		gcov
311.128SrilligCPPFLAGS+=	-DFORK_FUNCTION=fork
321.90SrilligCOPTS+=		--coverage -O0 -ggdb
331.111SrilligGCOV_PERL=	if (/^File '(?:.*\/)?(\S+)'/) {
341.107SrilligGCOV_PERL+=		$$file = $$1; $$func = "";
351.107SrilligGCOV_PERL+=	} elsif (/^Function '(\S+)'/) {
361.107SrilligGCOV_PERL+=		$$func = $$1;
371.111SrilligGCOV_PERL+=	} elsif (/^Lines executed:(\d+\.\d+)% of (\d+)/ && defined($$file)) {
381.111SrilligGCOV_PERL+=		my ($$percent, $$lines) = ($$1, $$2);
391.119SrilligGCOV_PERL+=		my $$uncovered =
401.119SrilligGCOV_PERL+=		    $$percent eq '100.00' ? '0'
411.119SrilligGCOV_PERL+=		    : $$file =~ /\.h$$/ ? '?'
421.115SrilligGCOV_PERL+=		    : `grep -c '\#\#\#\#\#:' < \$$(basename $$file.gcov)`;
431.115SrilligGCOV_PERL+=		chomp($$uncovered);
441.115SrilligGCOV_PERL+=		printf("%7.2f  %4s/%4d  %s%s\n",
451.111SrilligGCOV_PERL+=		    $$percent, $$uncovered, $$lines, $$file, $$func);
461.111SrilligGCOV_PERL+=		$$file = undef;
471.107SrilligGCOV_PERL+=	}
481.77SrilligLDADD+=		--coverage
491.73Srillig.endif
501.85SrilligCLEANFILES+=	*.gcda *.gcno *.gcov
511.73Srillig
521.80Srillig# Whether to compile using the Undefined Behavior Sanitizer (GCC, Clang).
531.77SrilligUSE_UBSAN?=	no
541.77Srillig.if ${USE_UBSAN} == "yes"
551.77SrilligCOPTS+=		-fsanitize=undefined
561.77SrilligLDADD+=		-fsanitize=undefined
571.77Srillig.endif
581.77Srillig
591.71SrilligUSE_META?=	yes
601.51Ssjg.if ${USE_META:tl} != "no"
611.68Sriastrad
621.71SrilligSRCS+=		meta.c
631.71SrilligCPPFLAGS+=	-DUSE_META
641.68Sriastrad
651.71SrilligUSE_FILEMON?=	ktrace
661.72Srillig.  if ${USE_FILEMON:tl} != "no"
671.68Sriastrad
681.67Sriastrad.PATH:	${.CURDIR}/filemon
691.71SrilligSRCS+=		filemon_${USE_FILEMON}.c
701.71SrilligCPPFLAGS+=	-DUSE_FILEMON
711.71SrilligCPPFLAGS+=	-DUSE_FILEMON_${USE_FILEMON:tu}
721.68Sriastrad
731.72Srillig.    if ${USE_FILEMON} == "dev"
741.71SrilligFILEMON_H?=	/usr/include/dev/filemon/filemon.h
751.72Srillig.      if exists(${FILEMON_H}) && ${FILEMON_H:T} == "filemon.h"
761.71SrilligCOPTS.filemon_dev.c+= \
771.71Srillig		-DHAVE_FILEMON_H -I${FILEMON_H:H}
781.72Srillig.      endif
791.72Srillig.    endif
801.72Srillig.  endif
811.65Smaxv.endif
821.51Ssjg
831.60SchristosSUBDIR.roff+=	PSD.doc
841.126Srillig.if make(obj) || make(clean) || make(cleandir)
851.71SrilligSUBDIR+=	unit-tests
861.29Ssjg.endif
871.1Scgd
881.112SrilligLINTFLAGS+=	-T	# strict bool mode, available since 2021-01-11
891.116SrilligLINTFLAGS+=	-w	# treat warnings as errors
901.114SrilligCLEANFILES+=	*.o	# for filemon objects
911.75Srillig
921.124SlukemCOPTS.arch.c+=	${CC_WNO_FORMAT_TRUNCATION}
931.124SlukemCOPTS.dir.c+=	${CC_WNO_FORMAT_TRUNCATION}
941.120SrilligCOPTS.job.c+=	-Wno-format-nonliteral	# custom shell templates
951.124SlukemCOPTS.main.c+=	${CC_WNO_FORMAT_TRUNCATION} ${CC_WNO_STRINGOP_TRUNCATION}
961.124SlukemCOPTS.meta.c+=	${CC_WNO_FORMAT_TRUNCATION}
971.120SrilligCOPTS.var.c+=	-Wno-format-nonliteral	# strftime
981.108Srillig
991.71SrilligCPPFLAGS+=	-DMAKE_NATIVE
1001.29Ssjg
1011.72Srillig.if defined(TOOLDIR)
1021.71Srillig# This is a native NetBSD build, use libutil rather than the local emalloc etc.
1031.71SrilligCPPFLAGS+=	-DUSE_EMALLOC
1041.71SrilligLDADD+=		-lutil
1051.71SrilligDPADD+=		${LIBUTIL}
1061.38Schristos.endif
1071.37Schristos
1081.79SrilligCOPTS+=		-Wdeclaration-after-statement
1091.79Srillig
1101.29Ssjg# A simple unit-test driver to help catch regressions
1111.91SsjgTEST_MAKE ?= ${.OBJDIR}/${PROG:T}
1121.73Srilligtest: .MAKE
1131.73Srillig	cd ${.CURDIR}/unit-tests \
1141.92Srillig	&& MAKEFLAGS= ${TEST_MAKE} -r -m / TEST_MAKE=${TEST_MAKE} ${TESTS:DTESTS=${TESTS:Q}} ${.TARGET}
1151.73Srillig.if ${USE_COVERAGE} == yes
1161.111Srillig	${MAKE} report-coverage
1171.73Srillig.endif
1181.73Srillig
1191.89Srilligaccept sync-mi: .MAKE
1201.96Srillig	cd ${.CURDIR}/unit-tests && ${.MAKE} ${.TARGET}
1211.76Srillig
1221.76Srilligretest:
1231.76Srillig	${.MAKE} -C ${.CURDIR}/unit-tests cleandir
1241.76Srillig.if ${USE_COVERAGE} == yes
1251.76Srillig	rm -f *.gcov *.gcda
1261.76Srillig.endif
1271.76Srillig	${.MAKE} test
1281.102Srillig
1291.102Srillig# Just out of curiosity, during development.
1301.102Srillig.SUFFIXES: .cpre .casm
1311.102Srillig.c.cpre:
1321.105Srillig	${COMPILE.c:S,^-c$,-E,} ${COPTS.${.IMPSRC}} ${.IMPSRC} -o ${.TARGET}
1331.102Srillig.c.casm:
1341.105Srillig	${COMPILE.c:S,^-c$,-S,} ${COPTS.${.IMPSRC}} ${.IMPSRC} -o ${.TARGET}
1351.109Srillig
1361.110Srilligtest-coverage: .PHONY
1371.110Srillig	@make -s clean cleandir
1381.110Srillig	@env USE_COVERAGE=yes COPTS="-O0 -ggdb" USER_CPPFLAGS="-DCLEANUP" \
1391.110Srillig		sh -c 'make -s all -j8 && make -s test'
1401.121Srillig	@env USE_COVERAGE=yes make report-coverage > coverage.txt
1411.110Srillig
1421.118Srillig.if ${USE_COVERAGE} == "yes"
1431.111Srilligreport-coverage: .PHONY
1441.111Srillig	@echo 'covered  uncovered  file'
1451.118Srillig	@${GCOV} ${GCOV_OPTS} *.gcda \
1461.111Srillig	| perl -ne ${GCOV_PERL:Q} \
1471.125Srillig	| sort -r -k4 \
1481.125Srillig	| sort -nr -k1
1491.127Srillig	@sed -i \
1501.127Srillig	    -e '1d' \
1511.127Srillig	    -e 's,^\([^:]*\): *[0-9]*:,\1: ,' \
1521.127Srillig	    -e 's, *$$,,g' \
1531.127Srillig	    *.gcov
1541.118Srillig.endif
1551.111Srillig
1561.109Srillig.include <bsd.prog.mk>
1571.109Srillig.include <bsd.subdir.mk>
1581.109Srillig
1591.109Srillig# For -DCLEANUP and similar feature toggles.
1601.109SrilligCPPFLAGS+=	${USER_CPPFLAGS}
1611.109Srillig# For overriding -std=gnu99 or similar options.
1621.109SrilligCFLAGS+=	${USER_CFLAGS}
163