Makefile revision 1.125
11.125Srillig#	$NetBSD: Makefile,v 1.125 2023/06/19 20:14:45 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.90SrilligCOPTS+=		--coverage -O0 -ggdb
321.111SrilligGCOV_PERL=	if (/^File '(?:.*\/)?(\S+)'/) {
331.107SrilligGCOV_PERL+=		$$file = $$1; $$func = "";
341.107SrilligGCOV_PERL+=	} elsif (/^Function '(\S+)'/) {
351.107SrilligGCOV_PERL+=		$$func = $$1;
361.111SrilligGCOV_PERL+=	} elsif (/^Lines executed:(\d+\.\d+)% of (\d+)/ && defined($$file)) {
371.111SrilligGCOV_PERL+=		my ($$percent, $$lines) = ($$1, $$2);
381.119SrilligGCOV_PERL+=		my $$uncovered =
391.119SrilligGCOV_PERL+=		    $$percent eq '100.00' ? '0'
401.119SrilligGCOV_PERL+=		    : $$file =~ /\.h$$/ ? '?'
411.115SrilligGCOV_PERL+=		    : `grep -c '\#\#\#\#\#:' < \$$(basename $$file.gcov)`;
421.115SrilligGCOV_PERL+=		chomp($$uncovered);
431.115SrilligGCOV_PERL+=		printf("%7.2f  %4s/%4d  %s%s\n",
441.111SrilligGCOV_PERL+=		    $$percent, $$uncovered, $$lines, $$file, $$func);
451.111SrilligGCOV_PERL+=		$$file = undef;
461.107SrilligGCOV_PERL+=	}
471.77SrilligLDADD+=		--coverage
481.73Srillig.endif
491.85SrilligCLEANFILES+=	*.gcda *.gcno *.gcov
501.73Srillig
511.80Srillig# Whether to compile using the Undefined Behavior Sanitizer (GCC, Clang).
521.77SrilligUSE_UBSAN?=	no
531.77Srillig.if ${USE_UBSAN} == "yes"
541.77SrilligCOPTS+=		-fsanitize=undefined
551.77SrilligLDADD+=		-fsanitize=undefined
561.77Srillig.endif
571.77Srillig
581.71SrilligUSE_META?=	yes
591.51Ssjg.if ${USE_META:tl} != "no"
601.68Sriastrad
611.71SrilligSRCS+=		meta.c
621.71SrilligCPPFLAGS+=	-DUSE_META
631.68Sriastrad
641.71SrilligUSE_FILEMON?=	ktrace
651.72Srillig.  if ${USE_FILEMON:tl} != "no"
661.68Sriastrad
671.67Sriastrad.PATH:	${.CURDIR}/filemon
681.71SrilligSRCS+=		filemon_${USE_FILEMON}.c
691.71SrilligCPPFLAGS+=	-DUSE_FILEMON
701.71SrilligCPPFLAGS+=	-DUSE_FILEMON_${USE_FILEMON:tu}
711.68Sriastrad
721.72Srillig.    if ${USE_FILEMON} == "dev"
731.71SrilligFILEMON_H?=	/usr/include/dev/filemon/filemon.h
741.72Srillig.      if exists(${FILEMON_H}) && ${FILEMON_H:T} == "filemon.h"
751.71SrilligCOPTS.filemon_dev.c+= \
761.71Srillig		-DHAVE_FILEMON_H -I${FILEMON_H:H}
771.72Srillig.      endif
781.72Srillig.    endif
791.72Srillig.  endif
801.65Smaxv.endif
811.51Ssjg
821.60SchristosSUBDIR.roff+=	PSD.doc
831.29Ssjg.if make(obj) || make(clean)
841.71SrilligSUBDIR+=	unit-tests
851.29Ssjg.endif
861.1Scgd
871.112SrilligLINTFLAGS+=	-T	# strict bool mode, available since 2021-01-11
881.116SrilligLINTFLAGS+=	-w	# treat warnings as errors
891.114SrilligCLEANFILES+=	*.o	# for filemon objects
901.75Srillig
911.124SlukemCOPTS.arch.c+=	${CC_WNO_FORMAT_TRUNCATION}
921.124SlukemCOPTS.dir.c+=	${CC_WNO_FORMAT_TRUNCATION}
931.120SrilligCOPTS.job.c+=	-Wno-format-nonliteral	# custom shell templates
941.124SlukemCOPTS.main.c+=	${CC_WNO_FORMAT_TRUNCATION} ${CC_WNO_STRINGOP_TRUNCATION}
951.124SlukemCOPTS.meta.c+=	${CC_WNO_FORMAT_TRUNCATION}
961.120SrilligCOPTS.var.c+=	-Wno-format-nonliteral	# strftime
971.108Srillig
981.71SrilligCPPFLAGS+=	-DMAKE_NATIVE
991.29Ssjg
1001.72Srillig.if defined(TOOLDIR)
1011.71Srillig# This is a native NetBSD build, use libutil rather than the local emalloc etc.
1021.71SrilligCPPFLAGS+=	-DUSE_EMALLOC
1031.71SrilligLDADD+=		-lutil
1041.71SrilligDPADD+=		${LIBUTIL}
1051.38Schristos.endif
1061.37Schristos
1071.79SrilligCOPTS+=		-Wdeclaration-after-statement
1081.79Srillig
1091.29Ssjg# A simple unit-test driver to help catch regressions
1101.91SsjgTEST_MAKE ?= ${.OBJDIR}/${PROG:T}
1111.73Srilligtest: .MAKE
1121.73Srillig	cd ${.CURDIR}/unit-tests \
1131.92Srillig	&& MAKEFLAGS= ${TEST_MAKE} -r -m / TEST_MAKE=${TEST_MAKE} ${TESTS:DTESTS=${TESTS:Q}} ${.TARGET}
1141.73Srillig.if ${USE_COVERAGE} == yes
1151.111Srillig	${MAKE} report-coverage
1161.73Srillig.endif
1171.73Srillig
1181.89Srilligaccept sync-mi: .MAKE
1191.96Srillig	cd ${.CURDIR}/unit-tests && ${.MAKE} ${.TARGET}
1201.76Srillig
1211.76Srilligretest:
1221.76Srillig	${.MAKE} -C ${.CURDIR}/unit-tests cleandir
1231.76Srillig.if ${USE_COVERAGE} == yes
1241.76Srillig	rm -f *.gcov *.gcda
1251.76Srillig.endif
1261.76Srillig	${.MAKE} test
1271.102Srillig
1281.102Srillig# Just out of curiosity, during development.
1291.102Srillig.SUFFIXES: .cpre .casm
1301.102Srillig.c.cpre:
1311.105Srillig	${COMPILE.c:S,^-c$,-E,} ${COPTS.${.IMPSRC}} ${.IMPSRC} -o ${.TARGET}
1321.102Srillig.c.casm:
1331.105Srillig	${COMPILE.c:S,^-c$,-S,} ${COPTS.${.IMPSRC}} ${.IMPSRC} -o ${.TARGET}
1341.109Srillig
1351.110Srilligtest-coverage: .PHONY
1361.110Srillig	@make -s clean cleandir
1371.110Srillig	@env USE_COVERAGE=yes COPTS="-O0 -ggdb" USER_CPPFLAGS="-DCLEANUP" \
1381.110Srillig		sh -c 'make -s all -j8 && make -s test'
1391.121Srillig	@env USE_COVERAGE=yes make report-coverage > coverage.txt
1401.110Srillig
1411.118Srillig.if ${USE_COVERAGE} == "yes"
1421.111Srilligreport-coverage: .PHONY
1431.111Srillig	@echo 'covered  uncovered  file'
1441.118Srillig	@${GCOV} ${GCOV_OPTS} *.gcda \
1451.111Srillig	| perl -ne ${GCOV_PERL:Q} \
1461.125Srillig	| sort -r -k4 \
1471.125Srillig	| sort -nr -k1
1481.111Srillig	@sed -i 's,^\([^:]*\): *[0-9]*:,\1: ,' *.gcov
1491.118Srillig.endif
1501.111Srillig
1511.109Srillig.include <bsd.prog.mk>
1521.109Srillig.include <bsd.subdir.mk>
1531.109Srillig
1541.109Srillig# For -DCLEANUP and similar feature toggles.
1551.109SrilligCPPFLAGS+=	${USER_CPPFLAGS}
1561.109Srillig# For overriding -std=gnu99 or similar options.
1571.109SrilligCFLAGS+=	${USER_CFLAGS}
158