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