1#################################################
2### C variables
3CFLAGS.dflt.clang     =		-Qunused-arguments -Werror=implicit-function-declaration
4CFLAGS.dflt.icc       =		-we147 -we10006 # 147 is required for MKC_CHECK_PROTOTYPES
5CFLAGS.dflt.sunpro    =		-errtags -errwarn=E_ATTRIBUTE_UNKNOWN
6
7CFLAGS.warnerr.gcc    =		-Werror
8CFLAGS.warnerr.clang  =		-Werror
9CFLAGS.warnerr.icc    =		-Werror
10CFLAGS.warnerr.sunpro =		-errwarn=%all
11CFLAGS.warnerr.armcc  =		--diag_error=warning
12
13CFLAGS.warns.gcc.1 =		-Wall -Wstrict-prototypes -Wmissing-prototypes \
14				-Wpointer-arith -Wreturn-type
15CFLAGS.warns.gcc.2 =		${CFLAGS.warns.gcc.1} -Wswitch -Wshadow
16CFLAGS.warns.gcc.3 =		${CFLAGS.warns.gcc.2} -Wcast-qual -Wwrite-strings \
17				-Wno-unused-parameter
18CFLAGS.warns.gcc.4 =		${CFLAGS.warns.gcc.3}
19
20CFLAGS.warns.clang.1 =		${CFLAGS.warns.gcc.1}
21CFLAGS.warns.clang.2 =		${CFLAGS.warns.gcc.2}
22CFLAGS.warns.clang.3 =		${CFLAGS.warns.gcc.3}
23CFLAGS.warns.clang.4 =		${CFLAGS.warns.gcc.4}
24
25CFLAGS.warns.icc.1 =		-Wall -we1011
26CFLAGS.warns.icc.2 =		${CFLAGS.warns.icc.1}
27CFLAGS.warns.icc.3 =		${CFLAGS.warns.icc.2}
28CFLAGS.warns.icc.4 =		${CFLAGS.warns.icc.3}
29
30CFLAGS.warns.hpc.0 =		-w3
31CFLAGS.warns.hpc.1 =		-w2
32CFLAGS.warns.hpc.2 =		-w2
33CFLAGS.warns.hpc.3 =		-w2
34CFLAGS.warns.hpc.4 =		-w2
35
36_CSTD_LIST := c89 gnu89 c99 gnu99 c11 gnu11 c17 gnu17
37_CXXSTD_LIST := c++98 gnu++98 c++11 gnu++11 c++14 gnu++14 c++17 gnu++17
38
39.for c in C CXX
40. for std in ${_${c}STD_LIST}
41.  for t in gcc clang icc pcc sunpro
42${c}FLAGS.std.${std}.${t} :=		-std=${std}
43.  endfor
44. endfor
45.endfor
46
47CFLAGS.ssp.gcc =		-fstack-protector -Wstack-protector --param__ssp-buffer-size=1
48CFLAGS.ssp.clang =		${CFLAGS.ssp.gcc}
49CFLAGS.ssp.icc =		-fstack-security-check
50CFLAGS.ssp.ibmc =		-qstackprotect
51
52CFLAGS.pic.gcc =		-fPIC__-DPIC
53CFLAGS.pic.clang =		-fPIC__-DPIC
54CFLAGS.pic.icc =		-fPIC__-DPIC
55CFLAGS.pic.pcc =		-k -DPIC
56CFLAGS.pic.mipspro =		-KPIC
57CFLAGS.pic.sunpro =		-xcode=pic32 # -KPIC
58CFLAGS.pic.hpc =		+Z # +z
59CFLAGS.pic.ibmc =		-qpic=large # -qpic=small
60CFLAGS.pic.decc =		# ?
61
62CFLAGS.pie.gcc =		-fPIE__-DPIC
63CFLAGS.pie.clang =		${CFLAGS.pie.gcc}
64CFLAGS.pie.icc =		-fPIE__-DPIC
65
66LDFLAGS.relro  =		-Wl,-zrelro__-Wl,-znow
67
68_cc_vars += CFLAGS.dflt.${CC_TYPE} CFLAGS.warnerr.${CC_TYPE} CFLAGS.warns.${CC_TYPE}.1 \
69    CFLAGS.warns.${CC_TYPE}.2 CFLAGS.warns.${CC_TYPE}.3 CFLAGS.warns.${CC_TYPE}.4 \
70    CFLAGS.ssp.${CC_TYPE} CFLAGS.pic.${CC_TYPE} CFLAGS.pie.${CC_TYPE}
71
72.for std in ${_CSTD_LIST}
73_cc_vars +=	CFLAGS.std.${std}.${CC_TYPE}
74.endfor
75.for std in ${_CXXSTD_LIST}
76_cxx_vars +=	CXXFLAGS.std.${std}.${CXX_TYPE}
77.endfor
78
79.undef _CSTD_LIST
80.undef _CXXSTD_LIST
81
82LDFLAGS.pie.gcc   =		-fPIE__-DPIC__-pie
83LDFLAGS.pie.clang =		-fPIE__-DPIC__-pie
84
85_ccld_vars = LDFLAGS.pie.${CC_TYPE} LDFLAGS.relro
86
87### C++ variables
88CXXFLAGS.dflt.clang   =		${CFLAGS.dflt.clang}
89CXXFLAGS.dflt.icc     =		${CFLAGS.dflt.icc}
90
91CXXFLAGS.warnerr.gcc =		${CFLAGS.warnerr.gcc}
92CXXFLAGS.warnerr.clang =	${CXXFLAGS.warnerr.gcc}
93
94CXXFLAGS.warns.gcc.1 =		-Wold-style-cast -Wctor-dtor-privacy -Wreturn-type \
95				-Wnon-virtual-dtor -Wreorder -Wno-deprecated \
96				-Wno-non-template-friend -Woverloaded-virtual \
97				-Wno-pmf-conversions -Wsign-promo -Wsynth \
98				-Werror=return-type
99CXXFLAGS.warns.gcc.2 =		${CXXFLAGS.warns.gcc.1} -Wswitch -Wshadow
100CXXFLAGS.warns.gcc.3 =		${CXXFLAGS.warns.gcc.2} -Wcast-qual -Wwrite-strings \
101				-Wno-unused-parameter
102CXXFLAGS.warns.gcc.4 =		${CXXFLAGS.warns.gcc.3}
103
104CXXFLAGS.warns.clang.1 =	${CXXFLAGS.warns.gcc.1}
105CXXFLAGS.warns.clang.2 =	${CXXFLAGS.warns.gcc.2}
106CXXFLAGS.warns.clang.3 =	${CXXFLAGS.warns.gcc.3}
107CXXFLAGS.warns.clang.4 =	${CXXFLAGS.warns.gcc.4}
108
109CXXFLAGS.warns.hpc.0 =		${CFLAGS.warns.hpc.0}
110CXXFLAGS.warns.hpc.1 =		${CFLAGS.warns.hpc.1}
111CXXFLAGS.warns.hpc.2 =		${CFLAGS.warns.hpc.2}
112CXXFLAGS.warns.hpc.3 =		${CFLAGS.warns.hpc.3}
113CXXFLAGS.warns.hpc.4 =		${CFLAGS.warns.hpc.4}
114
115CXXFLAGS.warns.icc.1 =		${CFLAGS.warns.icc.1}
116CXXFLAGS.warns.icc.2 =		${CFLAGS.warns.icc.2}
117CXXFLAGS.warns.icc.3 =		${CFLAGS.warns.icc.3}
118CXXFLAGS.warns.icc.4 =		${CFLAGS.warns.icc.4}
119
120CXXFLAGS.ssp.gcc     =		${CFLAGS.ssp.gcc}
121CXXFLAGS.ssp.clang   =		${CFLAGS.ssp.clang}
122CXXFLAGS.ssp.icc     =		${CFLAGS.ssp.icc}
123CXXFLAGS.ssp.ibmc    =		${CFLAGS.ssp.ibmc}
124
125CXXFLAGS.pic.gcc     =		${CFLAGS.pic.gcc}
126CXXFLAGS.pic.clang   =		${CFLAGS.pic.clang}
127CXXFLAGS.pic.icc     =		${CFLAGS.pic.icc}
128CXXFLAGS.pic.pcc     =		${CFLAGS.pic.pcc}
129CXXFLAGS.pic.mipspro =		${CFLAGS.pic.mipspro}
130CXXFLAGS.pic.sunpro  =		${CFLAGS.pic.sunpro}
131CXXFLAGS.pic.hpc     =		${CFLAGS.pic.hpc}
132CXXFLAGS.pic.ibmc    =		${CFLAGS.pic.ibmc}
133CXXFLAGS.pic.decc    =		${CFLAGS.pic.decc}
134
135CXXFLAGS.pie.gcc     =		${CFLAGS.pie.gcc}
136CXXFLAGS.pie.clang   =		${CFLAGS.pie.clang}
137CXXFLAGS.pie.icc     =		${CFLAGS.pie.icc}
138
139_cxx_vars += CXXFLAGS.dflt.${CXX_TYPE} CXXFLAGS.warnerr.${CXX_TYPE} \
140    CXXFLAGS.warns.${CXX_TYPE}.1 CXXFLAGS.warns.${CXX_TYPE}.2 \
141    CXXFLAGS.warns.${CXX_TYPE}.3 CXXFLAGS.warns.${CXX_TYPE}.4 \
142    CXXFLAGS.ssp.${CXX_TYPE} CXXFLAGS.pic.${CXX_TYPE} CXXFLAGS.pie.${CXX_TYPE}
143
144_cxxld_vars = LDFLAGS.pie.${CXX_TYPE} LDFLAGS.relro
145
146#################################################
147.for c in cc cxx
148cc_cxx_capabilities_filename := mkc_imp.${c}_${${c:tu}_TYPE}-${${c:tu}_VERSION}.mk
149.if !empty(${c:tu})
150.   for v in ${_${c}_vars}
151MKC_CHECK_${c:tu}_OPTS +=	${${v}}
152.   endfor
153.   for v in ${_${c}ld_vars}
154MKC_CHECK_${c:tu}LD_OPTS +=	${${v}}
155.   endfor
156.   include "mkc.conf.mk"
157
158.   for v in ${_${c}_vars}
159.       for _opt in ${${v}}
160.           if ${HAVE_${c:tu}_OPT.${_opt:S/=/_/}:U} == 1
161${v}.new +=	${_opt:S/__/ /g}
162.           endif
163.       endfor
164.   endfor
165.   for v in ${_${c}ld_vars}
166.       for _opt in ${${v}}
167.           if ${HAVE_${c:tu}LD_OPT.${_opt:S/=/_/}:U} == 1
168${v}.new +=	${_opt:S/__/ /g}
169.           endif
170.       endfor
171.   endfor
172
173LDFLAGS.pie.gcc.new   :=	${LDFLAGS.pie.gcc.new:U:tW:S/-fPIE -DPIC //}
174LDFLAGS.pie.clang.new :=	${LDFLAGS.pie.clang.new:U:tW:S/-fPIE -DPIC //}
175
176######
177.ifdef RECURS
178all: post_all
179post_all: ${cc_cxx_capabilities_filename}
180${cc_cxx_capabilities_filename}: .PHONY # always regenerate!
181	@printf '' > $@.tmp;
182.   for v in ${_${c}_vars}
183	@echo ${v} = ${${v}.new} >> $@.tmp;
184.   endfor
185	@printf '' >> $@.tmp;
186.   for v in ${_${c}ld_vars}
187	@echo ${v} = ${${v}.new} >> $@.tmp;
188.   endfor
189	@mv $@.tmp $@
190
191.endif # RECURS
192.endif # !empty(${c:tu}
193.endfor # .for c in cc cxx
194
195#################################################
196USE_CC_COMPILERS  ?=	${CC}
197USE_CXX_COMPILERS ?=	${CXX}
198
199.ifndef RECURS
200post_all:
201.for CC in ${USE_CC_COMPILERS:U}
202	@env ${MAKE} ${MAKE_FLAGS} ${COMPILER_SETTINGS_MK:U} all USE_CXX_COMPILERS= \
203	    MKCHECKS=yes MKC_NOCACHE=1 RECURS=1 CC=${CC} CXX= src_type=cc
204.endfor # CC
205.for CXX in ${USE_CXX_COMPILERS:U}
206	@env ${MAKE} ${MAKE_FLAGS} ${COMPILER_SETTINGS_MK:U} all USE_CC_COMPILERS= \
207	    MKCHECKS=yes MKC_NOCACHE=1 RECURS=1 CC= CXX=${CXX} src_type=cxx
208.endfor # CXX
209.endif # RECURS
210