xref: /freebsd/contrib/bmake/mk/warnings.mk (revision c59c3bf3)
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