1*c59c3bf3SSimon J. Gerraty# SPDX-License-Identifier: BSD-2-Clause 2*c59c3bf3SSimon J. Gerraty# 33cbdda60SSimon J. Gerraty# RCSid: 4*c59c3bf3SSimon J. Gerraty# $Id: warnings.mk,v 1.18 2024/02/17 17:26:57 sjg Exp $ 53cbdda60SSimon J. Gerraty# 68c973ee2SSimon J. Gerraty# @(#) Copyright (c) 2002-2023, Simon J. Gerraty 73cbdda60SSimon J. Gerraty# 83cbdda60SSimon J. Gerraty# This file is provided in the hope that it will 93cbdda60SSimon J. Gerraty# be of use. There is absolutely NO WARRANTY. 103cbdda60SSimon J. Gerraty# Permission to copy, redistribute or otherwise 113cbdda60SSimon J. Gerraty# use this file is hereby granted provided that 123cbdda60SSimon J. Gerraty# the above copyright notice and this notice are 133cbdda60SSimon J. Gerraty# left intact. 143cbdda60SSimon J. Gerraty# 153cbdda60SSimon J. Gerraty# Please send copies of changes and bug-fixes to: 163cbdda60SSimon J. Gerraty# sjg@crufty.net 173cbdda60SSimon J. Gerraty# 183cbdda60SSimon J. Gerraty 193cbdda60SSimon J. Gerraty.ifndef _w_cflags 20be19d90bSSimon J. Gerraty# make sure we get the behavior we expect 21be19d90bSSimon J. Gerraty.MAKE.SAVE_DOLLARS = no 223cbdda60SSimon J. Gerraty 233cbdda60SSimon J. Gerraty# Any number of warnings sets can be added. 24e48f47ddSSimon J. Gerraty.-include <warnings-sets.mk> 258c973ee2SSimon J. Gerraty# This is more in keeping with our current practice 268c973ee2SSimon J. Gerraty.-include <local.warnings.mk> 273cbdda60SSimon J. Gerraty 283cbdda60SSimon J. Gerraty# Modest defaults - put more elaborate sets in warnings-sets.mk 293cbdda60SSimon J. Gerraty# -Wunused etc are here so you can set 303cbdda60SSimon J. Gerraty# W_unused=-Wno-unused etc. 313cbdda60SSimon J. GerratyMIN_WARNINGS ?= -Wall \ 323cbdda60SSimon J. Gerraty -Wformat \ 333cbdda60SSimon J. Gerraty -Wimplicit \ 343cbdda60SSimon J. Gerraty -Wunused \ 353cbdda60SSimon J. Gerraty -Wuninitialized 363cbdda60SSimon J. Gerraty 373cbdda60SSimon J. GerratyLOW_WARNINGS ?= ${MIN_WARNINGS} -W -Wstrict-prototypes -Wmissing-prototypes 383cbdda60SSimon J. Gerraty 398c973ee2SSimon J. GerratyMEDIUM_WARNINGS ?= ${LOW_WARNINGS} 403cbdda60SSimon J. Gerraty 413cbdda60SSimon J. GerratyHIGH_WARNINGS ?= ${MEDIUM_WARNINGS} \ 423cbdda60SSimon J. Gerraty -Wcast-align \ 433cbdda60SSimon J. Gerraty -Wcast-qual \ 443cbdda60SSimon J. Gerraty -Wparentheses \ 453cbdda60SSimon J. Gerraty -Wpointer-arith \ 463cbdda60SSimon J. Gerraty -Wmissing-declarations \ 473cbdda60SSimon J. Gerraty -Wreturn-type \ 483cbdda60SSimon J. Gerraty -Wswitch \ 493cbdda60SSimon J. Gerraty -Wwrite-strings 503cbdda60SSimon J. Gerraty 515bcb7424SSimon J. GerratyEXTRA_WARNINGS ?= ${HIGH_WARNINGS} -Wextra 525bcb7424SSimon J. Gerraty 533cbdda60SSimon J. Gerraty# The two step default makes it easier to test build with different defaults. 543cbdda60SSimon J. GerratyDEFAULT_WARNINGS_SET ?= MIN 553cbdda60SSimon J. GerratyWARNINGS_SET ?= ${DEFAULT_WARNINGS_SET} 563cbdda60SSimon J. Gerraty 57e48f47ddSSimon J. Gerraty# There is always someone who wants more... 58e48f47ddSSimon J. Gerraty.if !empty(WARNINGS_XTRAS) 59e48f47ddSSimon J. Gerraty${WARNINGS_SET}_WARNINGS += ${WARNINGS_XTRAS} 60e48f47ddSSimon J. Gerraty.endif 61e48f47ddSSimon J. Gerraty 628c973ee2SSimon J. Gerraty# Keep this list ordered! 638c973ee2SSimon J. GerratyWARNINGS_SET_LIST ?= MIN LOW MEDIUM HIGH EXTRA 648c973ee2SSimon J. Gerraty 658c973ee2SSimon J. Gerraty# We assume WARNINGS_SET_LIST is an ordered list. 668c973ee2SSimon J. Gerraty# if WARNINGS_SET is < WERROR_SET we add WARNINGS_NO_ERROR 678c973ee2SSimon J. Gerraty# otherwise we add WARNINGS_ERROR 688c973ee2SSimon J. GerratyDEFAULT_WERROR_SET ?= MEDIUM 698c973ee2SSimon J. GerratyWERROR_SET ?= ${DEFAULT_WERROR_SET} 708c973ee2SSimon J. GerratyWARNINGS_ERROR ?= -Werror 718c973ee2SSimon J. GerratyWARNINGS_NO_ERROR ?= 728c973ee2SSimon J. Gerraty 738c973ee2SSimon J. Gerraty.if ${MAKE_VERSION} >= 20170130 748c973ee2SSimon J. Gerraty.for i in ${WARNINGS_SET_LIST:range} 758c973ee2SSimon J. Gerraty.if ${WARNINGS_SET_LIST:[$i]} == ${WARNINGS_SET} 768c973ee2SSimon J. GerratyWARNINGS_SETx = $i 778c973ee2SSimon J. Gerraty.endif 788c973ee2SSimon J. Gerraty.if ${WARNINGS_SET_LIST:[$i]} == ${WERROR_SET} 798c973ee2SSimon J. GerratyWERROR_SETx = $i 808c973ee2SSimon J. Gerraty.if ${MAKE_VERSION} >= 20220924 818c973ee2SSimon J. Gerraty.break 828c973ee2SSimon J. Gerraty.endif 838c973ee2SSimon J. Gerraty.endif 848c973ee2SSimon J. Gerraty.endfor 858c973ee2SSimon J. Gerraty.if ${WARNINGS_SETx:U${WERROR_SETx:U0}} < ${WERROR_SETx:U0} 868c973ee2SSimon J. Gerraty${WARNINGS_SET}_WARNINGS += ${WARNINGS_NO_ERROR:U} 878c973ee2SSimon J. Gerraty.else 888c973ee2SSimon J. Gerraty${WARNINGS_SET}_WARNINGS += ${WARNINGS_ERROR} 898c973ee2SSimon J. Gerraty.endif 908c973ee2SSimon J. Gerraty.endif 913cbdda60SSimon J. Gerraty 925bcb7424SSimon J. Gerraty.if !empty(WARNINGS_SET) 935bcb7424SSimon J. Gerraty.for ws in ${WARNINGS_SET} 945bcb7424SSimon J. Gerraty.if empty(${ws}_WARNINGS) 955bcb7424SSimon J. Gerraty.if ${MAKE_VERSION:[1]:C/.*-//} >= 20050530 963cbdda60SSimon J. Gerraty.BEGIN: _empty_warnings 973cbdda60SSimon J. Gerraty_empty_warnings: .PHONY 983cbdda60SSimon J. Gerraty.else 993cbdda60SSimon J. Gerraty.BEGIN: 1003cbdda60SSimon J. Gerraty.endif 1015bcb7424SSimon J. Gerraty @echo "ERROR: Invalid: WARNINGS_SET=${ws}" 1028c973ee2SSimon J. Gerraty @echo "ERROR: Try one of: ${WARNINGS_SET_LIST}"; exit 1 1033cbdda60SSimon J. Gerraty 1043cbdda60SSimon J. Gerraty.endif 1055bcb7424SSimon J. Gerraty.endfor 1065bcb7424SSimon J. Gerraty.endif 1073cbdda60SSimon J. Gerraty 1083cbdda60SSimon J. Gerraty# Without -O or if we've set -O0 somewhere - to make debugging more effective, 1093cbdda60SSimon J. Gerraty# we need to turn off -Wuninitialized as otherwise we get a warning that 1103cbdda60SSimon J. Gerraty# -Werror turns into an error. To be safe, set W_uninitialized blank. 111e48f47ddSSimon J. Gerraty_w_cflags= ${CFLAGS} ${CFLAGS_LAST} ${CPPFLAGS} 1123cbdda60SSimon J. Gerraty.if ${_w_cflags:M-O*} == "" || ${_w_cflags:M-O0} != "" 1133cbdda60SSimon J. GerratyW_uninitialized= 1143cbdda60SSimon J. Gerraty.endif 1153cbdda60SSimon J. Gerraty 1163cbdda60SSimon J. Gerraty 1173cbdda60SSimon J. Gerraty# .for loops have the [dis]advantage of being evaluated when read, 1183cbdda60SSimon J. Gerraty# so adding to WARNINGS_SET[_${MACHINE_ARCH}] after this file is 1193cbdda60SSimon J. Gerraty# read has no effect. 1203cbdda60SSimon J. Gerraty# Replacing the above .for loops with the WARNINGS+= below solves that 1213cbdda60SSimon J. Gerraty# but tiggers a double free bug in bmake-20040118 and earlier. 1223cbdda60SSimon J. Gerraty# Don't try and read this too fast! 1233cbdda60SSimon J. Gerraty# 1243cbdda60SSimon J. Gerraty# The first :@ "loop" handles multiple sets in WARNINGS_SET 1253cbdda60SSimon J. Gerraty# 1263cbdda60SSimon J. Gerraty# In the second :@ "loop", the ::?= noise sets W_foo?=-Wfoo etc 1273cbdda60SSimon J. Gerraty# which makes it easy to turn off override individual flags 1283cbdda60SSimon J. Gerraty# (see W_uninitialized above). 1293cbdda60SSimon J. Gerraty# 1308c973ee2SSimon J. Gerraty# The last bit expands to 1318c973ee2SSimon J. Gerraty# ${W_foo_${.TARGET:T:${TARGET_PREFIX_FILTER:ts:}}:U${W_foo}} 1323cbdda60SSimon J. Gerraty# which is the bit we ultimately want. It allows W_* to be set on a 1333cbdda60SSimon J. Gerraty# per target basis. 1343cbdda60SSimon J. Gerraty# 1353cbdda60SSimon J. Gerraty# NOTE: that we force the target extension to be .o 1368c973ee2SSimon J. Gerraty# TARGET_PREFIX_FILTER defaults to R 1373cbdda60SSimon J. Gerraty# 1383cbdda60SSimon J. Gerraty 1398c973ee2SSimon J. GerratyTARGET_PREFIX_FILTER ?= R 1408c973ee2SSimon J. Gerraty 1415bcb7424SSimon J. Gerraty# define this once, we use it a couple of times below (hence the doubled $$). 1428c973ee2SSimon J. GerratyM_warnings_list = @s@$${$$s_WARNINGS} $${$$s_WARNINGS.${COMPILER_TYPE}:U}@:O:u:@w@$${$${w:C/-(.)/\1_/}::?=$$w} $${$${w:C/-(.)/\1_/}_${MACHINE_ARCH}_${.TARGET:T:${TARGET_PREFIX_FILTER:ts:}}.o:U$${$${w:C/-(.)/\1_/}_${.TARGET:T:${TARGET_PREFIX_FILTER:ts:}}.o:U$${$${w:C/-(.)/\1_/}_${MACHINE_ARCH}:U$${$${w:C/-(.)/\1_/}}}}}@ 1435bcb7424SSimon J. Gerraty 1445bcb7424SSimon J. Gerraty# first a list of warnings from the chosen set 1455bcb7424SSimon J. Gerraty_warnings = ${WARNINGS_SET_${MACHINE_ARCH}:U${WARNINGS_SET}:${M_warnings_list}} 1465bcb7424SSimon J. Gerraty# now a list of all -Wno-* overrides not just those defined by WARNINGS_SET 1475bcb7424SSimon J. Gerraty# since things like -Wall imply lots of others. 1485bcb7424SSimon J. Gerraty# this should be a super-set of the -Wno-* in _warnings, but 1495bcb7424SSimon J. Gerraty# just in case... 1508c973ee2SSimon J. Gerraty_no_warnings = ${_warnings:M-Wno-*} ${WARNINGS_SET_LIST:${M_warnings_list}:M-Wno-*} 1515bcb7424SSimon J. Gerraty# -Wno-* must follow any others 1525bcb7424SSimon J. GerratyWARNINGS += ${_warnings:N-Wno-*} ${_no_warnings:O:u} 1533cbdda60SSimon J. Gerraty 1543cbdda60SSimon J. Gerraty.ifndef NO_CFLAGS_WARNINGS 1553cbdda60SSimon J. Gerraty# Just ${WARNINGS} should do, but this is more flexible? 1568c973ee2SSimon J. GerratyCFLAGS+= ${WARNINGS_${.TARGET:T:${TARGET_PREFIX_FILTER:ts:}}.o:U${WARNINGS}} 1573cbdda60SSimon J. Gerraty.endif 1583cbdda60SSimon J. Gerraty 1593cbdda60SSimon J. Gerraty# it is rather silly that g++ blows up on some warning flags 1603cbdda60SSimon J. GerratyNO_CXX_WARNINGS+= \ 161e48f47ddSSimon J. Gerraty implicit \ 1623cbdda60SSimon J. Gerraty missing-declarations \ 1633cbdda60SSimon J. Gerraty missing-prototypes \ 1643cbdda60SSimon J. Gerraty nested-externs \ 1655bcb7424SSimon J. Gerraty shadow \ 1663cbdda60SSimon J. Gerraty strict-prototypes 1673cbdda60SSimon J. Gerraty 1688c973ee2SSimon J. GerratyWARNINGS_CXX_SRCS += ${SRCS:M*.c*:N*.c:N*h} 1698c973ee2SSimon J. Gerraty.for s in ${WARNINGS_CXX_SRCS:O:u} 1703cbdda60SSimon J. Gerraty.for w in ${NO_CXX_WARNINGS} 1718c973ee2SSimon J. GerratyW_$w_${s:T:${TARGET_PREFIX_FILTER:ts:}}.o= 1723cbdda60SSimon J. Gerraty.endfor 1733cbdda60SSimon J. Gerraty.endfor 1743cbdda60SSimon J. Gerraty 1753cbdda60SSimon J. Gerraty.endif # _w_cflags 176