xref: /freebsd/contrib/bmake/mk/warnings.mk (revision 3cbdda60ff509264469d6894d4e838b0d2ccea5c)
1*3cbdda60SSimon J. Gerraty# RCSid:
2*3cbdda60SSimon J. Gerraty#	$Id: warnings.mk,v 1.7 2009/12/11 17:06:03 sjg Exp $
3*3cbdda60SSimon J. Gerraty#
4*3cbdda60SSimon J. Gerraty#	@(#) Copyright (c) 2002, Simon J. Gerraty
5*3cbdda60SSimon J. Gerraty#
6*3cbdda60SSimon J. Gerraty#	This file is provided in the hope that it will
7*3cbdda60SSimon J. Gerraty#	be of use.  There is absolutely NO WARRANTY.
8*3cbdda60SSimon J. Gerraty#	Permission to copy, redistribute or otherwise
9*3cbdda60SSimon J. Gerraty#	use this file is hereby granted provided that
10*3cbdda60SSimon J. Gerraty#	the above copyright notice and this notice are
11*3cbdda60SSimon J. Gerraty#	left intact.
12*3cbdda60SSimon J. Gerraty#
13*3cbdda60SSimon J. Gerraty#	Please send copies of changes and bug-fixes to:
14*3cbdda60SSimon J. Gerraty#	sjg@crufty.net
15*3cbdda60SSimon J. Gerraty#
16*3cbdda60SSimon J. Gerraty
17*3cbdda60SSimon J. Gerraty.ifndef _w_cflags
18*3cbdda60SSimon J. Gerraty
19*3cbdda60SSimon J. Gerraty# Any number of warnings sets can be added.
20*3cbdda60SSimon J. Gerraty.-include "warnings-sets.mk"
21*3cbdda60SSimon J. Gerraty
22*3cbdda60SSimon J. Gerraty# Modest defaults - put more elaborate sets in warnings-sets.mk
23*3cbdda60SSimon J. Gerraty# -Wunused  etc are here so you can set
24*3cbdda60SSimon J. Gerraty# W_unused=-Wno-unused etc.
25*3cbdda60SSimon J. GerratyMIN_WARNINGS?= -Wall \
26*3cbdda60SSimon J. Gerraty	-Wformat \
27*3cbdda60SSimon J. Gerraty	-Wimplicit \
28*3cbdda60SSimon J. Gerraty	-Wunused \
29*3cbdda60SSimon J. Gerraty	-Wuninitialized
30*3cbdda60SSimon J. Gerraty
31*3cbdda60SSimon J. GerratyLOW_WARNINGS?= ${MIN_WARNINGS} -W -Wstrict-prototypes -Wmissing-prototypes
32*3cbdda60SSimon J. Gerraty
33*3cbdda60SSimon J. GerratyMEDIUM_WARNINGS?= ${LOW_WARNINGS} -Werror
34*3cbdda60SSimon J. Gerraty
35*3cbdda60SSimon J. GerratyHIGH_WARNINGS?= ${MEDIUM_WARNINGS} \
36*3cbdda60SSimon J. Gerraty	-Wcast-align \
37*3cbdda60SSimon J. Gerraty	-Wcast-qual \
38*3cbdda60SSimon J. Gerraty	-Wparentheses \
39*3cbdda60SSimon J. Gerraty	-Wpointer-arith \
40*3cbdda60SSimon J. Gerraty	-Wmissing-declarations \
41*3cbdda60SSimon J. Gerraty	-Wreturn-type \
42*3cbdda60SSimon J. Gerraty	-Wswitch \
43*3cbdda60SSimon J. Gerraty	-Wwrite-strings
44*3cbdda60SSimon J. Gerraty
45*3cbdda60SSimon J. Gerraty# The two step default makes it easier to test build with different defaults.
46*3cbdda60SSimon J. GerratyDEFAULT_WARNINGS_SET?= MIN
47*3cbdda60SSimon J. GerratyWARNINGS_SET?= ${DEFAULT_WARNINGS_SET}
48*3cbdda60SSimon J. Gerraty
49*3cbdda60SSimon J. Gerraty# If you add sets, besure to list them (you don't have to touch this list).
50*3cbdda60SSimon J. GerratyALL_WARNINGS_SETS+= MIN LOW MEDIUM HIGH
51*3cbdda60SSimon J. Gerraty
52*3cbdda60SSimon J. Gerraty.if empty(${WARNINGS_SET}_WARNINGS)
53*3cbdda60SSimon J. Gerraty.if ${MAKE_VERSION:U0:[1]:C/.*-//} >= 20050530
54*3cbdda60SSimon J. Gerraty.BEGIN:	_empty_warnings
55*3cbdda60SSimon J. Gerraty_empty_warnings: .PHONY
56*3cbdda60SSimon J. Gerraty.else
57*3cbdda60SSimon J. Gerraty.BEGIN:
58*3cbdda60SSimon J. Gerraty.endif
59*3cbdda60SSimon J. Gerraty	@echo "ERROR: Invalid: WARNINGS_SET=${WARNINGS_SET}"
60*3cbdda60SSimon J. Gerraty	@echo "ERROR: Try one of: ${ALL_WARNINGS_SETS:O:u}"; exit 1
61*3cbdda60SSimon J. Gerraty
62*3cbdda60SSimon J. Gerraty.endif
63*3cbdda60SSimon J. Gerraty
64*3cbdda60SSimon J. Gerraty# Without -O or if we've set -O0 somewhere - to make debugging more effective,
65*3cbdda60SSimon J. Gerraty# we need to turn off -Wuninitialized as otherwise we get a warning that
66*3cbdda60SSimon J. Gerraty# -Werror turns into an error.  To be safe, set W_uninitialized blank.
67*3cbdda60SSimon J. Gerraty_w_cflags:= ${CFLAGS} ${CPPFLAGS}
68*3cbdda60SSimon J. Gerraty.if ${_w_cflags:M-O*} == "" || ${_w_cflags:M-O0} != ""
69*3cbdda60SSimon J. GerratyW_uninitialized=
70*3cbdda60SSimon J. Gerraty.endif
71*3cbdda60SSimon J. Gerraty
72*3cbdda60SSimon J. Gerraty.if ${MAKE_VERSION:U0:[1]:C/.*-//} <= 20040118
73*3cbdda60SSimon J. Gerraty# This version uses .for loops to avoid a double free bug in old bmake's
74*3cbdda60SSimon J. Gerraty# but the .for loops are sensitive to when this file is read.
75*3cbdda60SSimon J. Gerraty
76*3cbdda60SSimon J. Gerraty# first, make a list of all the warning flags - doesn't matter if
77*3cbdda60SSimon J. Gerraty# its redundant - we'll sort -u
78*3cbdda60SSimon J. Gerraty_all_sets= ${WARNINGS_SET_${MACHINE_ARCH}} ${WARNINGS_SET} ${ALL_WARNINGS_SETS}
79*3cbdda60SSimon J. Gerraty_all_warnings= ${WARNINGS} ${_all_sets:O:u:@s@${$s_WARNINGS}@}
80*3cbdda60SSimon J. Gerraty
81*3cbdda60SSimon J. Gerraty# we want to set W_* for each warning so they are easy to turn off.
82*3cbdda60SSimon J. Gerraty# :O:u does a sort -u
83*3cbdda60SSimon J. Gerraty# using :C allows us to handle -f* -w* etc as well as -W*
84*3cbdda60SSimon J. Gerraty.for w in ${_all_warnings:O:u}
85*3cbdda60SSimon J. Gerraty${w:C/-(.)/\1_/} ?= $w
86*3cbdda60SSimon J. Gerraty.endfor
87*3cbdda60SSimon J. Gerraty
88*3cbdda60SSimon J. Gerraty# Allow for per-target warnings
89*3cbdda60SSimon J. Gerraty# Warning: the WARNINGS+= line below,
90*3cbdda60SSimon J. Gerraty# may make your brain hurt - trust me; it works --sjg
91*3cbdda60SSimon J. Gerraty# the idea is that you can set WARNINGS_SET[_${MACHINE_ARCH}]=HIGH
92*3cbdda60SSimon J. Gerraty# and use one of
93*3cbdda60SSimon J. Gerraty# W_format_mips_foo.o=
94*3cbdda60SSimon J. Gerraty# W_format_foo.o=
95*3cbdda60SSimon J. Gerraty# to turn off -Wformat for foo.o (on mips only in the first case), or
96*3cbdda60SSimon J. Gerraty# W_format_foo.o=-Wformat=2
97*3cbdda60SSimon J. Gerraty# for stricter checking.
98*3cbdda60SSimon J. Gerraty#
99*3cbdda60SSimon J. Gerraty# NOTE: that we force the target extension to be .o
100*3cbdda60SSimon J. Gerraty#
101*3cbdda60SSimon J. Gerraty.for w in ${WARNINGS_SET_${MACHINE_ARCH}:U${WARNINGS_SET}:@s@${$s_WARNINGS}@:O:u}
102*3cbdda60SSimon J. GerratyWARNINGS+= ${${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_/}}}}}
103*3cbdda60SSimon J. Gerraty.endfor
104*3cbdda60SSimon J. Gerraty
105*3cbdda60SSimon J. Gerraty.else
106*3cbdda60SSimon J. Gerraty
107*3cbdda60SSimon J. Gerraty# .for loops have the [dis]advantage of being evaluated when read,
108*3cbdda60SSimon J. Gerraty# so adding to WARNINGS_SET[_${MACHINE_ARCH}] after this file is
109*3cbdda60SSimon J. Gerraty# read has no effect.
110*3cbdda60SSimon J. Gerraty# Replacing the above .for loops with the WARNINGS+= below solves that
111*3cbdda60SSimon J. Gerraty# but tiggers a double free bug in bmake-20040118 and earlier.
112*3cbdda60SSimon J. Gerraty# Don't try and read this too fast!
113*3cbdda60SSimon J. Gerraty#
114*3cbdda60SSimon J. Gerraty# The first :@ "loop" handles multiple sets in WARNINGS_SET
115*3cbdda60SSimon J. Gerraty#
116*3cbdda60SSimon J. Gerraty# In the second :@ "loop", the ::?= noise sets W_foo?=-Wfoo etc
117*3cbdda60SSimon J. Gerraty# which makes it easy to turn off override individual flags
118*3cbdda60SSimon J. Gerraty# (see W_uninitialized above).
119*3cbdda60SSimon J. Gerraty#
120*3cbdda60SSimon J. Gerraty# The last bit expands to ${W_foo_${.TARGET:T}:U${W_foo}}
121*3cbdda60SSimon J. Gerraty# which is the bit we ultimately want.  It allows W_* to be set on a
122*3cbdda60SSimon J. Gerraty# per target basis.
123*3cbdda60SSimon J. Gerraty#
124*3cbdda60SSimon J. Gerraty# NOTE: that we force the target extension to be .o
125*3cbdda60SSimon J. Gerraty#
126*3cbdda60SSimon J. GerratyWARNINGS+= ${WARNINGS_SET_${MACHINE_ARCH}:U${WARNINGS_SET}:@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_/}}}}}@}
127*3cbdda60SSimon J. Gerraty
128*3cbdda60SSimon J. Gerraty.endif
129*3cbdda60SSimon J. Gerraty
130*3cbdda60SSimon J. Gerraty.ifndef NO_CFLAGS_WARNINGS
131*3cbdda60SSimon J. Gerraty# Just ${WARNINGS} should do, but this is more flexible?
132*3cbdda60SSimon J. GerratyCFLAGS+= ${WARNINGS_${.TARGET:T:R}.o:U${WARNINGS}}
133*3cbdda60SSimon J. Gerraty.endif
134*3cbdda60SSimon J. Gerraty
135*3cbdda60SSimon J. Gerraty# it is rather silly that g++ blows up on some warning flags
136*3cbdda60SSimon J. GerratyNO_CXX_WARNINGS+= \
137*3cbdda60SSimon J. Gerraty	missing-declarations \
138*3cbdda60SSimon J. Gerraty	missing-prototypes \
139*3cbdda60SSimon J. Gerraty	nested-externs \
140*3cbdda60SSimon J. Gerraty	strict-prototypes
141*3cbdda60SSimon J. Gerraty
142*3cbdda60SSimon J. Gerraty.for s in ${SRCS:M*.cc}
143*3cbdda60SSimon J. Gerraty.for w in ${NO_CXX_WARNINGS}
144*3cbdda60SSimon J. GerratyW_$w_${s:T:R}.o=
145*3cbdda60SSimon J. Gerraty.endfor
146*3cbdda60SSimon J. Gerraty.endfor
147*3cbdda60SSimon J. Gerraty
148*3cbdda60SSimon J. Gerraty.endif # _w_cflags
149