warnings.mk revision 303975
1251875Speter# RCSid:
2251875Speter#	$Id: warnings.mk,v 1.14 2016/04/05 15:58:37 sjg Exp $
3251875Speter#
4251875Speter#	@(#) Copyright (c) 2002, Simon J. Gerraty
5251875Speter#
6251875Speter#	This file is provided in the hope that it will
7251875Speter#	be of use.  There is absolutely NO WARRANTY.
8251875Speter#	Permission to copy, redistribute or otherwise
9251875Speter#	use this file is hereby granted provided that 
10251875Speter#	the above copyright notice and this notice are
11251875Speter#	left intact. 
12251875Speter#      
13251875Speter#	Please send copies of changes and bug-fixes to:
14251875Speter#	sjg@crufty.net
15251875Speter#
16251875Speter
17251875Speter.ifndef _w_cflags
18251875Speter# make sure we get the behavior we expect
19251875Speter.MAKE.SAVE_DOLLARS = no
20251875Speter
21251875Speter# Any number of warnings sets can be added.
22251875Speter.-include <warnings-sets.mk>
23251875Speter
24251875Speter# Modest defaults - put more elaborate sets in warnings-sets.mk
25251875Speter# -Wunused  etc are here so you can set
26251875Speter# W_unused=-Wno-unused etc.
27251875SpeterMIN_WARNINGS?= -Wall \
28251875Speter	-Wformat \
29251875Speter	-Wimplicit \
30251875Speter	-Wunused \
31251875Speter	-Wuninitialized 
32251875Speter
33251875SpeterLOW_WARNINGS?= ${MIN_WARNINGS} -W -Wstrict-prototypes -Wmissing-prototypes
34251875Speter 
35251875SpeterMEDIUM_WARNINGS?= ${LOW_WARNINGS} -Werror
36251875Speter
37251875SpeterHIGH_WARNINGS?= ${MEDIUM_WARNINGS} \
38251875Speter	-Wcast-align \
39251875Speter	-Wcast-qual \
40251875Speter	-Wparentheses \
41251875Speter	-Wpointer-arith \
42251875Speter	-Wmissing-declarations \
43251875Speter	-Wreturn-type \
44251875Speter	-Wswitch \
45251875Speter	-Wwrite-strings
46251875Speter
47251875SpeterEXTRA_WARNINGS?= ${HIGH_WARNINGS} -Wextra
48251875Speter
49251875Speter# The two step default makes it easier to test build with different defaults.
50251875SpeterDEFAULT_WARNINGS_SET?= MIN
51251875SpeterWARNINGS_SET?= ${DEFAULT_WARNINGS_SET}
52251875Speter
53251875Speter# There is always someone who wants more...
54251875Speter.if !empty(WARNINGS_XTRAS)
55251875Speter${WARNINGS_SET}_WARNINGS += ${WARNINGS_XTRAS}
56251875Speter.endif
57251875Speter
58251875Speter# If you add sets, besure to list them (you don't have to touch this list).
59251875SpeterALL_WARNINGS_SETS+= MIN LOW MEDIUM HIGH EXTRA
60251875Speter
61251875Speter.if !empty(WARNINGS_SET)
62251875Speter.for ws in ${WARNINGS_SET}
63251875Speter.if empty(${ws}_WARNINGS)
64251875Speter.if ${MAKE_VERSION:[1]:C/.*-//} >= 20050530
65251875Speter.BEGIN:	_empty_warnings
66251875Speter_empty_warnings: .PHONY
67251875Speter.else
68251875Speter.BEGIN:
69251875Speter.endif
70251875Speter	@echo "ERROR: Invalid: WARNINGS_SET=${ws}"
71251875Speter	@echo "ERROR: Try one of: ${ALL_WARNINGS_SETS:O:u}"; exit 1
72251875Speter
73251875Speter.endif
74251875Speter.endfor
75251875Speter.endif
76251875Speter
77251875Speter# Without -O or if we've set -O0 somewhere - to make debugging more effective,
78251875Speter# we need to turn off -Wuninitialized as otherwise we get a warning that
79251875Speter# -Werror turns into an error.  To be safe, set W_uninitialized blank.
80251875Speter_w_cflags= ${CFLAGS} ${CFLAGS_LAST} ${CPPFLAGS}
81251875Speter.if ${_w_cflags:M-O*} == "" || ${_w_cflags:M-O0} != ""
82251875SpeterW_uninitialized=
83251875Speter.endif
84251875Speter
85251875Speter
86251875Speter# .for loops have the [dis]advantage of being evaluated when read,
87251875Speter# so adding to WARNINGS_SET[_${MACHINE_ARCH}] after this file is 
88251875Speter# read has no effect.
89251875Speter# Replacing the above .for loops with the WARNINGS+= below solves that
90251875Speter# but tiggers a double free bug in bmake-20040118 and earlier.
91251875Speter# Don't try and read this too fast!
92251875Speter#
93251875Speter# The first :@ "loop" handles multiple sets in WARNINGS_SET
94251875Speter#
95251875Speter# In the second :@ "loop", the ::?= noise sets W_foo?=-Wfoo etc
96251875Speter# which makes it easy to turn off override individual flags
97251875Speter# (see W_uninitialized above).
98251875Speter# 
99251875Speter# The last bit expands to ${W_foo_${.TARGET:T}:U${W_foo}}
100251875Speter# which is the bit we ultimately want.  It allows W_* to be set on a
101251875Speter# per target basis.
102251875Speter# 
103251875Speter# NOTE: that we force the target extension to be .o
104251875Speter#
105251875Speter
106251875Speter# define this once, we use it a couple of times below (hence the doubled $$).
107251875SpeterM_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_/}}}}}@
108251875Speter
109251875Speter# first a list of warnings from the chosen set
110251875Speter_warnings = ${WARNINGS_SET_${MACHINE_ARCH}:U${WARNINGS_SET}:${M_warnings_list}}
111251875Speter# now a list of all -Wno-* overrides not just those defined by WARNINGS_SET
112251875Speter# since things like -Wall imply lots of others.
113251875Speter# this should be a super-set of the -Wno-* in _warnings, but 
114251875Speter# just in case...
115251875Speter_no_warnings = ${_warnings:M-Wno-*} ${ALL_WARNINGS_SETS:${M_warnings_list}:M-Wno-*}
116251875Speter# -Wno-* must follow any others
117251875SpeterWARNINGS += ${_warnings:N-Wno-*} ${_no_warnings:O:u}
118251875Speter
119251875Speter.ifndef NO_CFLAGS_WARNINGS
120251875Speter# Just ${WARNINGS} should do, but this is more flexible?
121251875SpeterCFLAGS+= ${WARNINGS_${.TARGET:T:R}.o:U${WARNINGS}}
122251875Speter.endif
123251875Speter
124251875Speter# it is rather silly that g++ blows up on some warning flags
125251875SpeterNO_CXX_WARNINGS+= \
126251875Speter	implicit \
127251875Speter	missing-declarations \
128251875Speter	missing-prototypes \
129251875Speter	nested-externs \
130251875Speter	shadow \
131251875Speter	strict-prototypes
132251875Speter
133251875Speter.for s in ${SRCS:M*.c*:N*.c:N*h}
134251875Speter.for w in ${NO_CXX_WARNINGS}
135251875SpeterW_$w_${s:T:R}.o=
136251875Speter.endfor
137251875Speter.endfor
138251875Speter
139251875Speter.endif # _w_cflags
140251875Speter