xref: /freebsd/contrib/bmake/mk/warnings.mk (revision e48f47dd)
13cbdda60SSimon J. Gerraty# RCSid:
2*e48f47ddSSimon J. Gerraty#	$Id: warnings.mk,v 1.14 2016/04/05 15:58:37 sjg Exp $
33cbdda60SSimon J. Gerraty#
43cbdda60SSimon J. Gerraty#	@(#) Copyright (c) 2002, Simon J. Gerraty
53cbdda60SSimon J. Gerraty#
63cbdda60SSimon J. Gerraty#	This file is provided in the hope that it will
73cbdda60SSimon J. Gerraty#	be of use.  There is absolutely NO WARRANTY.
83cbdda60SSimon J. Gerraty#	Permission to copy, redistribute or otherwise
93cbdda60SSimon J. Gerraty#	use this file is hereby granted provided that
103cbdda60SSimon J. Gerraty#	the above copyright notice and this notice are
113cbdda60SSimon J. Gerraty#	left intact.
123cbdda60SSimon J. Gerraty#
133cbdda60SSimon J. Gerraty#	Please send copies of changes and bug-fixes to:
143cbdda60SSimon J. Gerraty#	sjg@crufty.net
153cbdda60SSimon J. Gerraty#
163cbdda60SSimon J. Gerraty
173cbdda60SSimon J. Gerraty.ifndef _w_cflags
18be19d90bSSimon J. Gerraty# make sure we get the behavior we expect
19be19d90bSSimon J. Gerraty.MAKE.SAVE_DOLLARS = no
203cbdda60SSimon J. Gerraty
213cbdda60SSimon J. Gerraty# Any number of warnings sets can be added.
22*e48f47ddSSimon J. Gerraty.-include <warnings-sets.mk>
233cbdda60SSimon J. Gerraty
243cbdda60SSimon J. Gerraty# Modest defaults - put more elaborate sets in warnings-sets.mk
253cbdda60SSimon J. Gerraty# -Wunused  etc are here so you can set
263cbdda60SSimon J. Gerraty# W_unused=-Wno-unused etc.
273cbdda60SSimon J. GerratyMIN_WARNINGS?= -Wall \
283cbdda60SSimon J. Gerraty	-Wformat \
293cbdda60SSimon J. Gerraty	-Wimplicit \
303cbdda60SSimon J. Gerraty	-Wunused \
313cbdda60SSimon J. Gerraty	-Wuninitialized
323cbdda60SSimon J. Gerraty
333cbdda60SSimon J. GerratyLOW_WARNINGS?= ${MIN_WARNINGS} -W -Wstrict-prototypes -Wmissing-prototypes
343cbdda60SSimon J. Gerraty
353cbdda60SSimon J. GerratyMEDIUM_WARNINGS?= ${LOW_WARNINGS} -Werror
363cbdda60SSimon J. Gerraty
373cbdda60SSimon J. GerratyHIGH_WARNINGS?= ${MEDIUM_WARNINGS} \
383cbdda60SSimon J. Gerraty	-Wcast-align \
393cbdda60SSimon J. Gerraty	-Wcast-qual \
403cbdda60SSimon J. Gerraty	-Wparentheses \
413cbdda60SSimon J. Gerraty	-Wpointer-arith \
423cbdda60SSimon J. Gerraty	-Wmissing-declarations \
433cbdda60SSimon J. Gerraty	-Wreturn-type \
443cbdda60SSimon J. Gerraty	-Wswitch \
453cbdda60SSimon J. Gerraty	-Wwrite-strings
463cbdda60SSimon J. Gerraty
475bcb7424SSimon J. GerratyEXTRA_WARNINGS?= ${HIGH_WARNINGS} -Wextra
485bcb7424SSimon J. Gerraty
493cbdda60SSimon J. Gerraty# The two step default makes it easier to test build with different defaults.
503cbdda60SSimon J. GerratyDEFAULT_WARNINGS_SET?= MIN
513cbdda60SSimon J. GerratyWARNINGS_SET?= ${DEFAULT_WARNINGS_SET}
523cbdda60SSimon J. Gerraty
53*e48f47ddSSimon J. Gerraty# There is always someone who wants more...
54*e48f47ddSSimon J. Gerraty.if !empty(WARNINGS_XTRAS)
55*e48f47ddSSimon J. Gerraty${WARNINGS_SET}_WARNINGS += ${WARNINGS_XTRAS}
56*e48f47ddSSimon J. Gerraty.endif
57*e48f47ddSSimon J. Gerraty
583cbdda60SSimon J. Gerraty# If you add sets, besure to list them (you don't have to touch this list).
595bcb7424SSimon J. GerratyALL_WARNINGS_SETS+= MIN LOW MEDIUM HIGH EXTRA
603cbdda60SSimon J. Gerraty
615bcb7424SSimon J. Gerraty.if !empty(WARNINGS_SET)
625bcb7424SSimon J. Gerraty.for ws in ${WARNINGS_SET}
635bcb7424SSimon J. Gerraty.if empty(${ws}_WARNINGS)
645bcb7424SSimon J. Gerraty.if ${MAKE_VERSION:[1]:C/.*-//} >= 20050530
653cbdda60SSimon J. Gerraty.BEGIN:	_empty_warnings
663cbdda60SSimon J. Gerraty_empty_warnings: .PHONY
673cbdda60SSimon J. Gerraty.else
683cbdda60SSimon J. Gerraty.BEGIN:
693cbdda60SSimon J. Gerraty.endif
705bcb7424SSimon J. Gerraty	@echo "ERROR: Invalid: WARNINGS_SET=${ws}"
713cbdda60SSimon J. Gerraty	@echo "ERROR: Try one of: ${ALL_WARNINGS_SETS:O:u}"; exit 1
723cbdda60SSimon J. Gerraty
733cbdda60SSimon J. Gerraty.endif
745bcb7424SSimon J. Gerraty.endfor
755bcb7424SSimon J. Gerraty.endif
763cbdda60SSimon J. Gerraty
773cbdda60SSimon J. Gerraty# Without -O or if we've set -O0 somewhere - to make debugging more effective,
783cbdda60SSimon J. Gerraty# we need to turn off -Wuninitialized as otherwise we get a warning that
793cbdda60SSimon J. Gerraty# -Werror turns into an error.  To be safe, set W_uninitialized blank.
80*e48f47ddSSimon J. Gerraty_w_cflags= ${CFLAGS} ${CFLAGS_LAST} ${CPPFLAGS}
813cbdda60SSimon J. Gerraty.if ${_w_cflags:M-O*} == "" || ${_w_cflags:M-O0} != ""
823cbdda60SSimon J. GerratyW_uninitialized=
833cbdda60SSimon J. Gerraty.endif
843cbdda60SSimon J. Gerraty
853cbdda60SSimon J. Gerraty
863cbdda60SSimon J. Gerraty# .for loops have the [dis]advantage of being evaluated when read,
873cbdda60SSimon J. Gerraty# so adding to WARNINGS_SET[_${MACHINE_ARCH}] after this file is
883cbdda60SSimon J. Gerraty# read has no effect.
893cbdda60SSimon J. Gerraty# Replacing the above .for loops with the WARNINGS+= below solves that
903cbdda60SSimon J. Gerraty# but tiggers a double free bug in bmake-20040118 and earlier.
913cbdda60SSimon J. Gerraty# Don't try and read this too fast!
923cbdda60SSimon J. Gerraty#
933cbdda60SSimon J. Gerraty# The first :@ "loop" handles multiple sets in WARNINGS_SET
943cbdda60SSimon J. Gerraty#
953cbdda60SSimon J. Gerraty# In the second :@ "loop", the ::?= noise sets W_foo?=-Wfoo etc
963cbdda60SSimon J. Gerraty# which makes it easy to turn off override individual flags
973cbdda60SSimon J. Gerraty# (see W_uninitialized above).
983cbdda60SSimon J. Gerraty#
993cbdda60SSimon J. Gerraty# The last bit expands to ${W_foo_${.TARGET:T}:U${W_foo}}
1003cbdda60SSimon J. Gerraty# which is the bit we ultimately want.  It allows W_* to be set on a
1013cbdda60SSimon J. Gerraty# per target basis.
1023cbdda60SSimon J. Gerraty#
1033cbdda60SSimon J. Gerraty# NOTE: that we force the target extension to be .o
1043cbdda60SSimon J. Gerraty#
1053cbdda60SSimon J. Gerraty
1065bcb7424SSimon J. Gerraty# define this once, we use it a couple of times below (hence the doubled $$).
1075bcb7424SSimon J. GerratyM_warnings_list = @s@$${$$s_WARNINGS}@:O:u:@w@$${$${w:C/-(.)/\1_/}::?=$$w} $${$${w:C/-(.)/\1_/}_${MACHINE_ARCH}_${.TARGET:T:R}.o:U$${$${w:C/-(.)/\1_/}_${.TARGET:T:R}.o:U$${$${w:C/-(.)/\1_/}_${MACHINE_ARCH}:U$${$${w:C/-(.)/\1_/}}}}}@
1085bcb7424SSimon J. Gerraty
1095bcb7424SSimon J. Gerraty# first a list of warnings from the chosen set
1105bcb7424SSimon J. Gerraty_warnings = ${WARNINGS_SET_${MACHINE_ARCH}:U${WARNINGS_SET}:${M_warnings_list}}
1115bcb7424SSimon J. Gerraty# now a list of all -Wno-* overrides not just those defined by WARNINGS_SET
1125bcb7424SSimon J. Gerraty# since things like -Wall imply lots of others.
1135bcb7424SSimon J. Gerraty# this should be a super-set of the -Wno-* in _warnings, but
1145bcb7424SSimon J. Gerraty# just in case...
1155bcb7424SSimon J. Gerraty_no_warnings = ${_warnings:M-Wno-*} ${ALL_WARNINGS_SETS:${M_warnings_list}:M-Wno-*}
1165bcb7424SSimon J. Gerraty# -Wno-* must follow any others
1175bcb7424SSimon J. GerratyWARNINGS += ${_warnings:N-Wno-*} ${_no_warnings:O:u}
1183cbdda60SSimon J. Gerraty
1193cbdda60SSimon J. Gerraty.ifndef NO_CFLAGS_WARNINGS
1203cbdda60SSimon J. Gerraty# Just ${WARNINGS} should do, but this is more flexible?
1213cbdda60SSimon J. GerratyCFLAGS+= ${WARNINGS_${.TARGET:T:R}.o:U${WARNINGS}}
1223cbdda60SSimon J. Gerraty.endif
1233cbdda60SSimon J. Gerraty
1243cbdda60SSimon J. Gerraty# it is rather silly that g++ blows up on some warning flags
1253cbdda60SSimon J. GerratyNO_CXX_WARNINGS+= \
126*e48f47ddSSimon J. Gerraty	implicit \
1273cbdda60SSimon J. Gerraty	missing-declarations \
1283cbdda60SSimon J. Gerraty	missing-prototypes \
1293cbdda60SSimon J. Gerraty	nested-externs \
1305bcb7424SSimon J. Gerraty	shadow \
1313cbdda60SSimon J. Gerraty	strict-prototypes
1323cbdda60SSimon J. Gerraty
1335bcb7424SSimon J. Gerraty.for s in ${SRCS:M*.c*:N*.c:N*h}
1343cbdda60SSimon J. Gerraty.for w in ${NO_CXX_WARNINGS}
1353cbdda60SSimon J. GerratyW_$w_${s:T:R}.o=
1363cbdda60SSimon J. Gerraty.endfor
1373cbdda60SSimon J. Gerraty.endfor
1383cbdda60SSimon J. Gerraty
1393cbdda60SSimon J. Gerraty.endif # _w_cflags
140