dpkg-compiler.m4 6.9 KB

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