| dnl Use lots of warning flags with with gcc and compatible compilers |
| |
| dnl Note: if you change the following variable, the cache is automatically |
| dnl skipped and all flags rechecked. So there's no need to do anything |
| dnl else. If for any reason you need to force a recheck, just change |
| dnl MAYBE_WARN in an ignorable way (like adding whitespace) |
| |
| # -Wcast-align generates lots of false positive reports we need to |
| # cast image data from uint8_t to uin32_t. |
| |
| # -Wlogical-op causes too much noise from strcmp("literal", str) |
| |
| MAYBE_WARN="-Wall -Wextra \ |
| -Wmissing-declarations -Werror-implicit-function-declaration \ |
| -Wpointer-arith -Wwrite-strings -Wsign-compare -Wpacked \ |
| -Wswitch-enum -Wmissing-format-attribute -Wvolatile-register-var \ |
| -Wstrict-aliasing=2 -Winit-self -Wunsafe-loop-optimizations \ |
| -Wno-missing-field-initializers -Wno-unused-parameter \ |
| -Wno-attributes -Wno-long-long -Winline" |
| |
| MAYBE_C_SPECIFIC_WARN="-Wold-style-definition \ |
| -Wdeclaration-after-statement -Wstrict-prototypes \ |
| -Wmissing-prototypes -Wbad-function-cast -Wnested-externs" |
| |
| # New -Wno options should be added here |
| # gcc-4.4 and later accept every -Wno- option but may complain later that this |
| # option is unknow each time another warning happen. |
| # -Wunused-but-set-variable is too noisy at present |
| NO_WARN="unused-but-set-variable" |
| |
| dnl Sun Studio 12 likes to rag at us for abusing enums like |
| dnl having cairo_status_t variables hold cairo_int_status_t |
| dnl values. It's bad, we know. Now please be quiet. |
| MAYBE_WARN="$MAYBE_WARN -erroff=E_ENUM_TYPE_MISMATCH_ARG \ |
| -erroff=E_ENUM_TYPE_MISMATCH_OP" |
| |
| dnl We also abuse the warning-flag facility to enable other compiler |
| dnl options. Namely, the following: |
| MAYBE_WARN="$MAYBE_WARN -fno-strict-aliasing -fno-common" |
| |
| dnl Also to turn various gcc/glibc-specific preprocessor checks |
| MAYBE_WARN="$MAYBE_WARN -Wp,-D_FORTIFY_SOURCE=2" |
| |
| # invalidate cached value if MAYBE_WARN has changed |
| if test "x$cairo_cv_warn_maybe" != "x$MAYBE_WARN"; then |
| unset cairo_cv_warn_cflags |
| fi |
| AC_CACHE_CHECK([for supported warning flags], cairo_cv_warn_cflags, [ |
| echo |
| WARN_CFLAGS="" |
| |
| # Some warning options are not supported by all versions of |
| # gcc, so test all desired options against the current |
| # compiler. |
| # |
| # Note that there are some order dependencies |
| # here. Specifically, an option that disables a warning will |
| # have no net effect if a later option then enables that |
| # warnings, (perhaps implicitly). So we put some grouped |
| # options (-Wall and -Wextra) up front and the -Wno options |
| # last. |
| |
| for W in $MAYBE_WARN; do |
| CAIRO_CC_TRY_FLAG([$W],, [WARN_CFLAGS="$WARN_CFLAGS $W"]) |
| done |
| for W in $NO_WARN; do |
| CAIRO_CC_TRY_FLAG([-W$W -Wno-$W],, [WARN_CFLAGS="$WARN_CFLAGS -Wno-$W"]) |
| done |
| cairo_cv_warn_cflags=$WARN_CFLAGS |
| cairo_cv_warn_maybe="$MAYBE_WARN $MAYBE_C_SPECIFIC_WARN" |
| |
| AC_MSG_CHECKING([which warning flags were supported]) |
| ]) |
| WARN_CFLAGS="$cairo_cv_warn_cflags" |
| CAIRO_CFLAGS="$CAIRO_CFLAGS $WARN_CFLAGS" |
| |
| # We only wish to enable attribute(warn_unused_result) if we can prevent |
| # gcc from generating thousands of warnings about the misapplication of the |
| # attribute to void functions and variables. |
| AC_CACHE_CHECK([how to enable unused result warnings], cairo_cv_warn_unused_result, [ |
| AC_REQUIRE([AC_PROG_GREP]) |
| cairo_cv_warn_unused_result="" |
| if echo $WARN_CFLAGS | $GREP -e '-Wno-attributes' >/dev/null; then |
| CAIRO_CC_TRY_FLAG_SILENT( |
| [-Wno-attributes], |
| [__attribute__((__warn_unused_result__)) void f (void) {} |
| __attribute__((__warn_unused_result__)) int g;], |
| [cairo_cv_warn_unused_result="__attribute__((__warn_unused_result__))"]) |
| fi |
| ]) |
| AC_DEFINE_UNQUOTED([WARN_UNUSED_RESULT], [$cairo_cv_warn_unused_result], |
| [Define to the value your compiler uses to support the warn-unused-result attribute]) |
| |
| dnl check linker flags |
| AC_CACHE_CHECK([how to allow undefined symbols in shared libraries used by test suite], cairo_cv_test_undefined_ldflags, |
| [CAIRO_CC_TRY_FLAG_SILENT([-Wl,--allow-shlib-undefined], [], |
| [cairo_cv_test_undefined_ldflags="-Wl,--allow-shlib-undefined]")]) |
| CAIRO_TEST_UNDEFINED_LDFLAGS="$cairo_cv_test_undefined_ldflags" |
| AC_SUBST(CAIRO_TEST_UNDEFINED_LDFLAGS) |