Commit | Line | Data |
---|---|---|
1479465f GJ |
1 | # Copyright © 2004 Scott James Remnant <scott@netsplit.com> |
2 | # Copyright © 2006, 2009-2011, 2013-2016 Guillem Jover <guillem@debian.org> | |
3 | ||
4 | # DPKG_CHECK_COMPILER_FLAG | |
5 | # ------------------------ | |
6 | AC_DEFUN([DPKG_CHECK_COMPILER_FLAG], [ | |
7 | m4_define([dpkg_check_flag], [m4_default([$2], [$1])]) | |
8 | ||
9 | AC_LANG_CASE( | |
10 | [C], [ | |
11 | m4_define([dpkg_compiler], [$CC]) | |
12 | m4_define([dpkg_varname], [CFLAGS]) | |
13 | m4_define([dpkg_varname_save], [dpkg_save_CFLAGS]) | |
14 | m4_define([dpkg_varname_export], [COMPILER_CFLAGS]) | |
15 | AS_VAR_PUSHDEF([dpkg_varname_cache], [dpkg_cv_cflags_$1]) | |
16 | ], | |
17 | [C++], [ | |
18 | m4_define([dpkg_compiler], [$CXX]) | |
19 | m4_define([dpkg_varname], [CXXFLAGS]) | |
20 | m4_define([dpkg_varname_save], [dpkg_save_CXXFLAGS]) | |
21 | m4_define([dpkg_varname_export], [COMPILER_CXXFLAGS]) | |
22 | AS_VAR_PUSHDEF([dpkg_varname_cache], [dpkg_cv_cxxflags_$1]) | |
23 | ]) | |
24 | AC_CACHE_CHECK([whether ]dpkg_compiler[ accepts $1], [dpkg_varname_cache], [ | |
25 | AS_VAR_COPY([dpkg_varname_save], [dpkg_varname]) | |
26 | AS_VAR_SET([dpkg_varname], ["-Werror dpkg_check_flag"]) | |
27 | AC_COMPILE_IFELSE([ | |
28 | AC_LANG_SOURCE([[]]) | |
29 | ], [ | |
30 | AS_VAR_SET([dpkg_varname_cache], [yes]) | |
31 | ], [ | |
32 | AS_VAR_SET([dpkg_varname_cache], [no]) | |
33 | ]) | |
34 | AS_VAR_COPY([dpkg_varname], [dpkg_varname_save]) | |
35 | ]) | |
36 | AS_VAR_IF([dpkg_varname_cache], [yes], [ | |
37 | AS_VAR_APPEND([dpkg_varname_export], [" $1"]) | |
38 | ]) | |
39 | AS_VAR_POPDEF([dpkg_varname_cache]) | |
40 | ]) | |
41 | ||
42 | # DPKG_CHECK_COMPILER_WARNINGS | |
43 | # ---------------------------- | |
44 | # Add configure option to disable additional compiler warnings. | |
45 | AC_DEFUN([DPKG_CHECK_COMPILER_WARNINGS], [ | |
46 | DPKG_CHECK_COMPILER_FLAG([-Wall]) | |
47 | DPKG_CHECK_COMPILER_FLAG([-Wextra]) | |
48 | DPKG_CHECK_COMPILER_FLAG([-Wno-unused-parameter], [-Wunused-parameter]) | |
49 | DPKG_CHECK_COMPILER_FLAG([-Wno-missing-field-initializers], | |
50 | [-Wmissing-field-initializers]) | |
51 | DPKG_CHECK_COMPILER_FLAG([-Wno-tautological-constant-out-of-range-compare], | |
52 | [-Wtautological-constant-out-of-range-compare]) | |
53 | DPKG_CHECK_COMPILER_FLAG([-Wmissing-declarations]) | |
54 | DPKG_CHECK_COMPILER_FLAG([-Wmissing-format-attribute]) | |
55 | DPKG_CHECK_COMPILER_FLAG([-Wformat -Wformat-security]) | |
56 | DPKG_CHECK_COMPILER_FLAG([-Wsizeof-array-argument]) | |
57 | DPKG_CHECK_COMPILER_FLAG([-Wpointer-arith]) | |
58 | DPKG_CHECK_COMPILER_FLAG([-Wlogical-op]) | |
59 | DPKG_CHECK_COMPILER_FLAG([-Wlogical-not-parentheses]) | |
60 | DPKG_CHECK_COMPILER_FLAG([-Wswitch-bool]) | |
61 | DPKG_CHECK_COMPILER_FLAG([-Wvla]) | |
62 | DPKG_CHECK_COMPILER_FLAG([-Winit-self]) | |
63 | DPKG_CHECK_COMPILER_FLAG([-Wwrite-strings]) | |
64 | DPKG_CHECK_COMPILER_FLAG([-Wcast-align]) | |
65 | DPKG_CHECK_COMPILER_FLAG([-Wshadow]) | |
66 | DPKG_CHECK_COMPILER_FLAG([-Wduplicated-cond]) | |
67 | DPKG_CHECK_COMPILER_FLAG([-Wnull-dereference]) | |
68 | ||
69 | AC_LANG_CASE( | |
70 | [C], [ | |
71 | DPKG_CHECK_COMPILER_FLAG([-Wdeclaration-after-statement]) | |
72 | DPKG_CHECK_COMPILER_FLAG([-Wnested-externs]) | |
73 | DPKG_CHECK_COMPILER_FLAG([-Wbad-function-cast]) | |
74 | DPKG_CHECK_COMPILER_FLAG([-Wstrict-prototypes]) | |
75 | DPKG_CHECK_COMPILER_FLAG([-Wmissing-prototypes]) | |
76 | DPKG_CHECK_COMPILER_FLAG([-Wold-style-definition]) | |
77 | DPKG_CHECK_COMPILER_FLAG([-Wc99-c11-compat]) | |
78 | ], | |
79 | [C++], [ | |
80 | DPKG_CHECK_COMPILER_FLAG([-Wc++11-compat]) | |
81 | AS_IF([test "x$dpkg_cv_cxx11" = "xyes"], [ | |
82 | DPKG_CHECK_COMPILER_FLAG([-Wzero-as-null-pointer-constant]) | |
83 | ]) | |
84 | ]) | |
85 | ]) | |
86 | ||
87 | # DPKG_COMPILER_WARNINGS | |
88 | # ---------------------- | |
89 | # Add configure option to disable additional compiler warnings. | |
90 | AC_DEFUN([DPKG_COMPILER_WARNINGS], [ | |
91 | AC_ARG_ENABLE([compiler-warnings], | |
92 | [AS_HELP_STRING([--disable-compiler-warnings], | |
93 | [Disable (detected) additional compiler warnings])], | |
94 | [], [enable_compiler_warnings=yes]) | |
95 | ||
96 | AS_IF([test "x$enable_compiler_warnings" = "xyes"], [ | |
97 | DPKG_CHECK_COMPILER_WARNINGS | |
98 | AC_LANG_PUSH([C++]) | |
99 | DPKG_CHECK_COMPILER_WARNINGS | |
100 | AC_LANG_POP([C++]) | |
101 | ||
102 | CFLAGS="$COMPILER_CFLAGS $CFLAGS" | |
103 | CXXFLAGS="$COMPILER_CXXFLAGS $CXXFLAGS" | |
104 | ]) | |
105 | ]) | |
106 | ||
107 | # DPKG_COMPILER_OPTIMIZATIONS | |
108 | # --------------------------- | |
109 | # Add configure option to disable optimizations. | |
110 | AC_DEFUN([DPKG_COMPILER_OPTIMIZATIONS], [ | |
111 | AC_ARG_ENABLE([compiler-optimizations], | |
112 | [AS_HELP_STRING([--disable-compiler-optimizations], | |
113 | [Disable (detected) compiler optimizations])], | |
114 | [], [enable_compiler_optimizations=yes]) | |
115 | ||
116 | AS_IF([test "x$enable_compiler_optimizations" = "xno"], [ | |
117 | CFLAGS=$(echo "$CFLAGS" | sed -e "s/ -O[[1-9]]*\b/ -O0/g") | |
118 | ]) | |
119 | ]) | |
120 | ||
121 | # DPKG_TRY_C99([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) | |
122 | # ------------------------------------------------------ | |
123 | # Try compiling some C99 code to see whether it works | |
124 | AC_DEFUN([DPKG_TRY_C99], [ | |
125 | AC_COMPILE_IFELSE([ | |
126 | AC_LANG_PROGRAM([[ | |
127 | #include <inttypes.h> | |
128 | #include <stdbool.h> | |
129 | #include <stdio.h> | |
130 | ||
131 | /* Variadic macro arguments. */ | |
132 | #define variadic_macro(foo, ...) printf(foo, __VA_ARGS__) | |
133 | ]], [[ | |
134 | int rc; | |
135 | ||
136 | /* Designated initializers. */ | |
137 | struct { int a, b; } foo = { .a = 1, .b = 2 }; | |
138 | ||
139 | /* Compound literals. */ | |
140 | struct point { int x, y; } p = (struct point){ .x = 0, .y = 1 }; | |
141 | p = (struct point){ .x = 2, .y = 4 }; | |
142 | ||
143 | /* Trailing comma in enum. */ | |
144 | enum { FIRST, SECOND, } quux; | |
145 | ||
146 | /* Boolean type. */ | |
147 | bool bar = false; | |
148 | ||
149 | /* Specific size type. */ | |
150 | uint32_t baz = 0; | |
151 | size_t size = SIZE_MAX; | |
152 | intmax_t imax = INTMAX_MAX; | |
153 | ||
154 | /* Format modifiers. */ | |
155 | rc = printf("%jd", imax); | |
156 | if (rc == 3) | |
157 | return 1; | |
158 | rc = printf("%zu", size); | |
159 | if (rc == 3) | |
160 | return 1; | |
161 | ||
162 | /* Magic __func__ variable. */ | |
163 | printf("%s", __func__); | |
164 | ]]) | |
165 | ], [$1], [$2])dnl | |
166 | ])# DPKG_TRY_C99 | |
167 | ||
168 | # DPKG_C_C99 | |
169 | # ---------- | |
170 | # Check whether the compiler can do C99 | |
171 | AC_DEFUN([DPKG_C_C99], [ | |
172 | AC_CACHE_CHECK([whether $CC supports C99 features], [dpkg_cv_c99], [ | |
173 | DPKG_TRY_C99([dpkg_cv_c99=yes], [dpkg_cv_c99=no]) | |
174 | ]) | |
175 | AS_IF([test "x$dpkg_cv_c99" != "xyes"], [ | |
176 | AC_CACHE_CHECK([for $CC option to accept C99 features], [dpkg_cv_c99_arg], [ | |
177 | dpkg_cv_c99_arg=none | |
178 | dpkg_save_CC="$CC" | |
179 | for arg in "-std=gnu99" "-std=c99" "-c99" "-AC99" "-xc99=all" \ | |
180 | "-qlanglvl=extc99"; do | |
181 | CC="$dpkg_save_CC $arg" | |
182 | DPKG_TRY_C99([dpkg_arg_worked=yes], [dpkg_arg_worked=no]) | |
183 | CC="$dpkg_save_CC" | |
184 | ||
185 | AS_IF([test "x$dpkg_arg_worked" = "xyes"], [ | |
186 | dpkg_cv_c99_arg="$arg" | |
187 | break | |
188 | ]) | |
189 | done | |
190 | ]) | |
191 | AS_IF([test "x$dpkg_cv_c99_arg" != "xnone"], [ | |
192 | CC="$CC $dpkg_cv_c99_arg" | |
193 | dpkg_cv_c99=1 | |
194 | ]) | |
195 | ]) | |
196 | AS_IF([test "x$dpkg_cv_c99" = "xyes"], [ | |
197 | AC_DEFINE([HAVE_C99], 1, [Define to 1 if the compiler supports C99.]) | |
198 | ], [ | |
199 | AC_MSG_ERROR([unsupported required C99 extensions]) | |
200 | ]) | |
201 | ])# DPKG_C_C99 | |
202 | ||
203 | # DPKG_TRY_CXX11([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) | |
204 | # -------------- | |
205 | # Try compiling some C++11 code to see whether it works. | |
206 | AC_DEFUN([DPKG_TRY_CXX11], [ | |
207 | AC_LANG_PUSH([C++]) | |
208 | AC_COMPILE_IFELSE([ | |
209 | AC_LANG_PROGRAM([[ | |
210 | ]], [[ | |
211 | // Null pointer keyword. | |
212 | void *ptr = nullptr; | |
213 | ]]) | |
214 | ], [$1], [$2]) | |
215 | AC_LANG_POP([C++])dnl | |
216 | ])# DPKG_TRY_CXX11 | |
217 | ||
218 | # DPKG_CXX_CXX11 | |
219 | # -------------- | |
220 | # Check whether the compiler can do C++11. | |
221 | AC_DEFUN([DPKG_CXX_CXX11], [ | |
222 | AC_CACHE_CHECK([whether $CXX supports C++11], [dpkg_cv_cxx11], [ | |
223 | DPKG_TRY_CXX11([dpkg_cv_cxx11=yes], [dpkg_cv_cxx11=no]) | |
224 | ]) | |
225 | AS_IF([test "x$dpkg_cv_cxx11" != "xyes"], [ | |
226 | AC_CACHE_CHECK([for $CXX option to accept C++11], [dpkg_cv_cxx11_arg], [ | |
227 | dpkg_cv_cxx11_arg=none | |
228 | dpkg_save_CXX="$CXX" | |
229 | for arg in "-std=gnu++11" "-std=c++11"; do | |
230 | CXX="$dpkg_save_CXX $arg" | |
231 | DPKG_TRY_CXX11([dpkg_arg_worked=yes], [dpkg_arg_worked=no]) | |
232 | CXX="$dpkg_save_CXX" | |
233 | ||
234 | AS_IF([test "x$dpkg_arg_worked" = "xyes"], [ | |
235 | dpkg_cv_cxx11_arg="$arg"; break | |
236 | ]) | |
237 | done | |
238 | ]) | |
239 | AS_IF([test "x$dpkg_cv_cxx11_arg" != "xnone"], [ | |
240 | CXX="$CXX $dpkg_cv_cxx11_arg" | |
241 | dpkg_cv_cxx11=yes | |
242 | ]) | |
243 | ]) | |
244 | AS_IF([test "x$dpkg_cv_cxx11" = "xyes"], [ | |
245 | AC_DEFINE([HAVE_CXX11], 1, [Define to 1 if the compiler supports C++11.]) | |
246 | ])[]dnl | |
247 | ])# DPKG_CXX_CXX11 |