dpkg-compiler.m4 6.5 KB

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