summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorM Joonas Pihlaja <jpihlaja@cc.helsinki.fi>2009-09-02 04:10:39 +0100
committerM Joonas Pihlaja <jpihlaja@cc.helsinki.fi>2009-09-02 06:35:14 +0300
commitf081a5ff554267eebecea4652bb483eea11d1484 (patch)
tree0cccb7fac031c14ba9f64b30a65dad914e79b961
parentc87b366bfec4eeda2646b33cb8a33822a301456c (diff)
[build] Refine the -Wno-attribute test to check our use cases.
We don't actually check that -Wno-attribute does what we think it does. On clang it doesn't since it happily seems to recognize but ignore the attribute. This patch factors out a silent version of CAIRO_CC_TRY_FLAG which accepts an optional program argument and actually tests that the compiler doesn't produce any warning messages. It is then used to check that -Wno-attribute doesn't complain when the __warn_unused_result__ attribute is applied to void functions or variables.
-rw-r--r--build/aclocal.cairo.m442
-rw-r--r--build/configure.ac.analysis2
-rw-r--r--build/configure.ac.warnings10
3 files changed, 41 insertions, 13 deletions
diff --git a/build/aclocal.cairo.m4 b/build/aclocal.cairo.m4
index 1c898b96..021c22fc 100644
--- a/build/aclocal.cairo.m4
+++ b/build/aclocal.cairo.m4
@@ -75,21 +75,47 @@ AC_DEFUN([CAIRO_CONFIG_COMMANDS],
], $3)
])
-dnl check compiler flags
-AC_DEFUN([CAIRO_CC_TRY_FLAG],
-[dnl
- AC_MSG_CHECKING([whether $CC supports $1])
+dnl check compiler flags with a program and no muttering.
+AC_DEFUN([CAIRO_CC_TRY_FLAG_SILENT],
+[dnl (flags..., optional program, true-action, false-action)
+
+ _compile_program='$2'
+ if test "x$_compile_program" = "x"; then
+ # AC_LANG_PROGRAM() produces a main() w/o args,
+ # but -Wold-style-definition doesn't like that.
+ # We need _some_ program so that we don't get
+ # warnings about empty compilation units.
+ _compile_program='
+ int main(int c, char **v) {
+ (void)c; (void)v; return 0; }'
+ fi
_save_cflags="$CFLAGS"
- CFLAGS="$CFLAGS -Werror $1"
- AC_COMPILE_IFELSE([ ], [cairo_cc_flag=yes], [cairo_cc_flag=no])
+ CFLAGS="$CFLAGS $1"
+ AC_COMPILE_IFELSE(
+ [$_compile_program],
+ [cairo_cc_stderr=`test -f conftest.err && cat conftest.err`
+ cairo_cc_flag=yes],
+ [cairo_cc_stderr=`test -f conftest.err && cat conftest.err`
+ cairo_cc_flag=no])
CFLAGS="$_save_cflags"
+ if test "x$cairo_cc_stderr" != "x"; then
+ cairo_cc_flag=no
+ fi
+
if test "x$cairo_cc_flag" = "xyes"; then
- ifelse([$2], , :, [$2])
- else
ifelse([$3], , :, [$3])
+ else
+ ifelse([$4], , :, [$4])
fi
+])
+
+dnl check compiler flags possibly using -Werror if available.
+AC_DEFUN([CAIRO_CC_TRY_FLAG],
+[dnl (flags..., optional program, true-action, false-action)
+ AC_MSG_CHECKING([whether $CC supports $1])
+ CAIRO_CC_TRY_FLAG_SILENT([-Werror $1], [$2], [$3], [$4])
AC_MSG_RESULT([$cairo_cc_flag])
])
diff --git a/build/configure.ac.analysis b/build/configure.ac.analysis
index 4e8a02da..11c52e70 100644
--- a/build/configure.ac.analysis
+++ b/build/configure.ac.analysis
@@ -72,7 +72,7 @@ dnl PHP_ADD_MAKEFILE_FRAGMENT($abs_srcdir/Makefile.gcov, $abs_srcdir)
dnl In order to workaround a debian bug in libtool where they strip
dnl $dependency_libs from the link line and CFLAGS, we need to pass
dnl --coverage via LDFLAGS.
- CAIRO_CC_TRY_FLAG([--coverage],
+ CAIRO_CC_TRY_FLAG([--coverage],,
[
CAIRO_CFLAGS="$CAIRO_CFLAGS -O0 --coverage"
CAIRO_LDFLAGS="$CAIRO_LDFLAGS -O0 --coverage"
diff --git a/build/configure.ac.warnings b/build/configure.ac.warnings
index b7d6eab6..7bd4144f 100644
--- a/build/configure.ac.warnings
+++ b/build/configure.ac.warnings
@@ -46,7 +46,7 @@ AC_CACHE_CHECK([for supported warning flags], cairo_cv_warn_cflags, [
# last.
for W in $MAYBE_WARN; do
- CAIRO_CC_TRY_FLAG([$W], [WARN_CFLAGS="$WARN_CFLAGS $W"])
+ CAIRO_CC_TRY_FLAG([$W],, [WARN_CFLAGS="$WARN_CFLAGS $W"])
done
cairo_cv_warn_cflags=$WARN_CFLAGS
@@ -63,9 +63,11 @@ CAIRO_CFLAGS="$CAIRO_CFLAGS $WARN_CFLAGS"
AC_CACHE_CHECK([how to enable unused result warnings], cairo_cv_warn_unused_result, [
cairo_cv_warn_unused_result=""
if echo $WARN_CFLAGS | grep -e '-Wno-attributes' >/dev/null; then
- AC_TRY_COMPILE([__attribute__((__warn_unused_result__))
- int f (int i) { return i; }], [],
- [cairo_cv_warn_unused_result="__attribute__((__warn_unused_result__))"])
+ 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],