chiark / gitweb /
awful debugging hacking
[dpkg] / m4 / dpkg-compiler.m4
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