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