dpkg-compiler.m4 7.7 KB

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