13cbdda60SSimon J. Gerraty# RCSid: 2*be19d90bSSimon J. Gerraty# $Id: warnings.mk,v 1.9 2016/02/20 02:00:58 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 18*be19d90bSSimon J. Gerraty# make sure we get the behavior we expect 19*be19d90bSSimon J. Gerraty.MAKE.SAVE_DOLLARS = no 203cbdda60SSimon J. Gerraty 213cbdda60SSimon J. Gerraty# Any number of warnings sets can be added. 223cbdda60SSimon 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 533cbdda60SSimon J. Gerraty# If you add sets, besure to list them (you don't have to touch this list). 545bcb7424SSimon J. GerratyALL_WARNINGS_SETS+= MIN LOW MEDIUM HIGH EXTRA 553cbdda60SSimon J. Gerraty 565bcb7424SSimon J. Gerraty.if !empty(WARNINGS_SET) 575bcb7424SSimon J. Gerraty.for ws in ${WARNINGS_SET} 585bcb7424SSimon J. Gerraty.if empty(${ws}_WARNINGS) 595bcb7424SSimon J. Gerraty.if ${MAKE_VERSION:[1]:C/.*-//} >= 20050530 603cbdda60SSimon J. Gerraty.BEGIN: _empty_warnings 613cbdda60SSimon J. Gerraty_empty_warnings: .PHONY 623cbdda60SSimon J. Gerraty.else 633cbdda60SSimon J. Gerraty.BEGIN: 643cbdda60SSimon J. Gerraty.endif 655bcb7424SSimon J. Gerraty @echo "ERROR: Invalid: WARNINGS_SET=${ws}" 663cbdda60SSimon J. Gerraty @echo "ERROR: Try one of: ${ALL_WARNINGS_SETS:O:u}"; exit 1 673cbdda60SSimon J. Gerraty 683cbdda60SSimon J. Gerraty.endif 695bcb7424SSimon J. Gerraty.endfor 705bcb7424SSimon J. Gerraty.endif 713cbdda60SSimon J. Gerraty 723cbdda60SSimon J. Gerraty# Without -O or if we've set -O0 somewhere - to make debugging more effective, 733cbdda60SSimon J. Gerraty# we need to turn off -Wuninitialized as otherwise we get a warning that 743cbdda60SSimon J. Gerraty# -Werror turns into an error. To be safe, set W_uninitialized blank. 753cbdda60SSimon J. Gerraty_w_cflags:= ${CFLAGS} ${CPPFLAGS} 763cbdda60SSimon J. Gerraty.if ${_w_cflags:M-O*} == "" || ${_w_cflags:M-O0} != "" 773cbdda60SSimon J. GerratyW_uninitialized= 783cbdda60SSimon J. Gerraty.endif 793cbdda60SSimon J. Gerraty 803cbdda60SSimon J. Gerraty 813cbdda60SSimon J. Gerraty# .for loops have the [dis]advantage of being evaluated when read, 823cbdda60SSimon J. Gerraty# so adding to WARNINGS_SET[_${MACHINE_ARCH}] after this file is 833cbdda60SSimon J. Gerraty# read has no effect. 843cbdda60SSimon J. Gerraty# Replacing the above .for loops with the WARNINGS+= below solves that 853cbdda60SSimon J. Gerraty# but tiggers a double free bug in bmake-20040118 and earlier. 863cbdda60SSimon J. Gerraty# Don't try and read this too fast! 873cbdda60SSimon J. Gerraty# 883cbdda60SSimon J. Gerraty# The first :@ "loop" handles multiple sets in WARNINGS_SET 893cbdda60SSimon J. Gerraty# 903cbdda60SSimon J. Gerraty# In the second :@ "loop", the ::?= noise sets W_foo?=-Wfoo etc 913cbdda60SSimon J. Gerraty# which makes it easy to turn off override individual flags 923cbdda60SSimon J. Gerraty# (see W_uninitialized above). 933cbdda60SSimon J. Gerraty# 943cbdda60SSimon J. Gerraty# The last bit expands to ${W_foo_${.TARGET:T}:U${W_foo}} 953cbdda60SSimon J. Gerraty# which is the bit we ultimately want. It allows W_* to be set on a 963cbdda60SSimon J. Gerraty# per target basis. 973cbdda60SSimon J. Gerraty# 983cbdda60SSimon J. Gerraty# NOTE: that we force the target extension to be .o 993cbdda60SSimon J. Gerraty# 1003cbdda60SSimon J. Gerraty 1015bcb7424SSimon J. Gerraty# define this once, we use it a couple of times below (hence the doubled $$). 1025bcb7424SSimon 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_/}}}}}@ 1035bcb7424SSimon J. Gerraty 1045bcb7424SSimon J. Gerraty# first a list of warnings from the chosen set 1055bcb7424SSimon J. Gerraty_warnings = ${WARNINGS_SET_${MACHINE_ARCH}:U${WARNINGS_SET}:${M_warnings_list}} 1065bcb7424SSimon J. Gerraty# now a list of all -Wno-* overrides not just those defined by WARNINGS_SET 1075bcb7424SSimon J. Gerraty# since things like -Wall imply lots of others. 1085bcb7424SSimon J. Gerraty# this should be a super-set of the -Wno-* in _warnings, but 1095bcb7424SSimon J. Gerraty# just in case... 1105bcb7424SSimon J. Gerraty_no_warnings = ${_warnings:M-Wno-*} ${ALL_WARNINGS_SETS:${M_warnings_list}:M-Wno-*} 1115bcb7424SSimon J. Gerraty# -Wno-* must follow any others 1125bcb7424SSimon J. GerratyWARNINGS += ${_warnings:N-Wno-*} ${_no_warnings:O:u} 1133cbdda60SSimon J. Gerraty 1143cbdda60SSimon J. Gerraty.ifndef NO_CFLAGS_WARNINGS 1153cbdda60SSimon J. Gerraty# Just ${WARNINGS} should do, but this is more flexible? 1163cbdda60SSimon J. GerratyCFLAGS+= ${WARNINGS_${.TARGET:T:R}.o:U${WARNINGS}} 1173cbdda60SSimon J. Gerraty.endif 1183cbdda60SSimon J. Gerraty 1193cbdda60SSimon J. Gerraty# it is rather silly that g++ blows up on some warning flags 1203cbdda60SSimon J. GerratyNO_CXX_WARNINGS+= \ 1213cbdda60SSimon J. Gerraty missing-declarations \ 1223cbdda60SSimon J. Gerraty missing-prototypes \ 1233cbdda60SSimon J. Gerraty nested-externs \ 1245bcb7424SSimon J. Gerraty shadow \ 1253cbdda60SSimon J. Gerraty strict-prototypes 1263cbdda60SSimon J. Gerraty 1275bcb7424SSimon J. Gerraty.for s in ${SRCS:M*.c*:N*.c:N*h} 1283cbdda60SSimon J. Gerraty.for w in ${NO_CXX_WARNINGS} 1293cbdda60SSimon J. GerratyW_$w_${s:T:R}.o= 1303cbdda60SSimon J. Gerraty.endfor 1313cbdda60SSimon J. Gerraty.endfor 1323cbdda60SSimon J. Gerraty 1333cbdda60SSimon J. Gerraty.endif # _w_cflags 134