1 # Copyright © 2004 Scott James Remnant <scott@netsplit.com>
2 # Copyright © 2006, 2009-2011, 2013-2016 Guillem Jover <guillem@debian.org>
4 # DPKG_CHECK_COMPILER_FLAG
5 # ------------------------
6 AC_DEFUN([DPKG_CHECK_COMPILER_FLAG], [
7 m4_define([dpkg_check_flag], [m4_default([$2], [$1])])
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])
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])
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"])
30 AS_VAR_SET([dpkg_varname_cache], [yes])
32 AS_VAR_SET([dpkg_varname_cache], [no])
34 AS_VAR_COPY([dpkg_varname], [dpkg_varname_save])
36 AS_VAR_IF([dpkg_varname_cache], [yes], [
37 AS_VAR_APPEND([dpkg_varname_export], [" $1"])
39 AS_VAR_POPDEF([dpkg_varname_cache])
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])
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])
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])
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])
96 AS_IF([test "x$enable_compiler_warnings" = "xyes"], [
97 DPKG_CHECK_COMPILER_WARNINGS
99 DPKG_CHECK_COMPILER_WARNINGS
102 CFLAGS="$COMPILER_CFLAGS $CFLAGS"
103 CXXFLAGS="$COMPILER_CXXFLAGS $CXXFLAGS"
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])
116 AS_IF([test "x$enable_compiler_optimizations" = "xno"], [
117 CFLAGS=$(echo "$CFLAGS" | sed -e "s/ -O[[1-9]]*\b/ -O0/g")
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], [
127 #include <inttypes.h>
131 /* Variadic macro arguments. */
132 #define variadic_macro(foo, ...) printf(foo, __VA_ARGS__)
136 /* Designated initializers. */
137 struct { int a, b; } foo = { .a = 1, .b = 2 };
139 /* Compound literals. */
140 struct point { int x, y; } p = (struct point){ .x = 0, .y = 1 };
141 p = (struct point){ .x = 2, .y = 4 };
143 /* Trailing comma in enum. */
144 enum { FIRST, SECOND, } quux;
149 /* Specific size type. */
151 size_t size = SIZE_MAX;
152 intmax_t imax = INTMAX_MAX;
154 /* Format modifiers. */
155 rc = printf("%jd", imax);
158 rc = printf("%zu", size);
162 /* Magic __func__ variable. */
163 printf("%s", __func__);
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])
175 AS_IF([test "x$dpkg_cv_c99" != "xyes"], [
176 AC_CACHE_CHECK([for $CC option to accept C99 features], [dpkg_cv_c99_arg], [
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])
185 AS_IF([test "x$dpkg_arg_worked" = "xyes"], [
186 dpkg_cv_c99_arg="$arg"
191 AS_IF([test "x$dpkg_cv_c99_arg" != "xnone"], [
192 CC="$CC $dpkg_cv_c99_arg"
196 AS_IF([test "x$dpkg_cv_c99" = "xyes"], [
197 AC_DEFINE([HAVE_C99], 1, [Define to 1 if the compiler supports C99.])
199 AC_MSG_ERROR([unsupported required C99 extensions])
203 # DPKG_TRY_CXX11([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
205 # Try compiling some C++11 code to see whether it works.
206 AC_DEFUN([DPKG_TRY_CXX11], [
211 // Null pointer keyword.
215 AC_LANG_POP([C++])dnl
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])
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
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])
234 AS_IF([test "x$dpkg_arg_worked" = "xyes"], [
235 dpkg_cv_cxx11_arg="$arg"; break
239 AS_IF([test "x$dpkg_cv_cxx11_arg" != "xnone"], [
240 CXX="$CXX $dpkg_cv_cxx11_arg"
244 AS_IF([test "x$dpkg_cv_cxx11" = "xyes"], [
245 AC_DEFINE([HAVE_CXX11], 1, [Define to 1 if the compiler supports C++11.])