From: Mark Wielaard Date: Tue, 14 Apr 2015 08:18:37 +0000 (+0200) Subject: configure: Add explicit checks for all GNU99 extensions used. X-Git-Tag: elfutils-0.162~91 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=aba6d762ed1f3a9c318ebee20cd08bcd069a3f75;p=thirdparty%2Felfutils.git configure: Add explicit checks for all GNU99 extensions used. Some compilers (clang) claim to support -std=gnu99 but don't actually implement all extensions we use in the code. Producing really hard to parse errors. Add explicit checks for some of the other language extensions we use, Nested Functions and Arrays of Variable Length, to the configure check to catch such issues early. https://bugzilla.redhat.com/show_bug.cgi?id=1211357 Signed-off-by: Mark Wielaard --- diff --git a/ChangeLog b/ChangeLog index 5c8e1c24e..9a0a82db1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2015-04-14 Mark Wielaard + + * configure.ac (ac_cv_c99): Add explicit checks for all GNU99 + extensions used. + 2015-03-13 Mark Wielaard * configure.ac (ac_cv_c99): Add explicit return. diff --git a/configure.ac b/configure.ac index c4b818d02..ed2c96441 100644 --- a/configure.ac +++ b/configure.ac @@ -79,15 +79,38 @@ m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) AC_CHECK_TOOL([READELF], [readelf]) AC_CHECK_TOOL([NM], [nm]) -AC_CACHE_CHECK([for gcc with C99 support], ac_cv_c99, [dnl +# We use -std=gnu99 but have explicit checks for some language constructs +# and GNU extensions since some compilers claim GNU99 support, but don't +# really support all language extensions. In particular we need +# Mixed Declarations and Code +# https://gcc.gnu.org/onlinedocs/gcc/Mixed-Declarations.html +# Nested Functions +# https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html +# Arrays of Variable Length +# https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html +AC_CACHE_CHECK([for gcc with GNU99 support], ac_cv_c99, [dnl old_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -std=gnu99" AC_COMPILE_IFELSE([AC_LANG_SOURCE([dnl -int foo (int a) { for (int i = 0; i < a; ++i) if (i % 4) break; int s = a; return s;}])], +int foo (int a) +{ + for (int i = 0; i < a; ++i) if (i % 4) break; int s = a; return s; +} + +double bar (double a, double b) +{ + double square (double z) { return z * z; } + return square (a) + square (b); +} + +void baz (int n) +{ + struct S { int x[[n]]; }; +}])], ac_cv_c99=yes, ac_cv_c99=no) CFLAGS="$old_CFLAGS"]) AS_IF([test "x$ac_cv_c99" != xyes], - AC_MSG_ERROR([gcc with C99 support required])) + AC_MSG_ERROR([gcc with GNU99 support required])) AC_CACHE_CHECK([for __thread support], ac_cv_tls, [dnl # Use the same flags that we use for our DSOs, so the test is representative.