diff options
author | Diederik de Groot <ddegroot@talon.nl> | 2015-04-20 20:03:56 +0200 |
---|---|---|
committer | Diederik de Groot <ddegroot@talon.nl> | 2015-04-30 10:42:36 +0200 |
commit | 9c3ed428759a83a2b80106e605fe43dda0569425 (patch) | |
tree | 76098be0b493c61d10f190047e193618d245a981 /configure | |
parent | 1da9ec969ddfbc9a1450e698af20913df92e5fd9 (diff) |
Update configure.ac/Makefile for clang
Created autoconf/ast_check_raii.m4: contains AST_CHECK_RAII which
checks compiler requirements for RAII:
gcc: -fnested-functions support
clang: -fblocks (and if required -lBlocksRuntime)
The original check was implemented in configure.ac and now has it's
own file. This function also sets C_COMPILER_FAMILY to either gcc or
clang for use by makefile
Created autoconf/ast_check_strsep_array_bounds.m4 (contains
AST_CHECK_STRSEP_ARRAY_BOUNDS):
which checks if clang is able to handle the optimized strsep & strcmp
functions (linux). If not, the standard libc implementation should be
used instead. Clang + the optimized macro's work with:
strsep(char *, char []), but not with strsepo(char *, char *).
Instead of replacing all the occurences throughout the source code,
not using the optimized macro version seemed easier
See 'define __strcmp_gc(s1, s2, l2) in bits/string2.h':
llvm-comment: Normally, this array-bounds warning are suppressed for
macros, so that unused paths like the one that accesses __s1[3] are
not warned about. But if you preprocess manually, and feed the
result to another instance of clang, it will warn about all the
possible forks of this particular if statement. Instead of switching
of this optimization, another solution would be to run the preproces-
sing step with -frewrite-includes, which should preserve enough
information so that clang should still be able to suppress the diag-
nostic at the compile step later on.
See also "https://llvm.org/bugs/show_bug.cgi?id=20144"
See also "https://llvm.org/bugs/show_bug.cgi?id=11536"
Makefile.rules: If C_COMPILER_FAMILY=clang then add two warning
suppressions:
-Wno-unused-value
-Wno-parentheses-equality
In an earlier review (reviewboard: 4550 and 4554), they were deemed a
nuisace and less than benefitial.
configure.ac:
Added AST_CHECK_RAII() see earlier
Added AST_CHECK_STRSEP_ARRAY_BOUNDS() see earlier
Removed moved content
ASTERISK-24917
Change-Id: I12ea29d3bda2254ad3908e279b7effbbac6a97cb
Diffstat (limited to 'configure')
-rwxr-xr-x | configure | 217 |
1 files changed, 145 insertions, 72 deletions
@@ -1,5 +1,5 @@ #! /bin/sh -# From configure.ac Revision: 432281 . +# From configure.ac Revision. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for asterisk trunk. # @@ -687,9 +687,6 @@ PBX_RTLD_NOLOAD PBX_GLOB_BRACE PBX_GLOB_NOMAGIC AST_RPATH -AST_CLANG_BLOCKS -AST_CLANG_BLOCKS_LIBS -AST_NESTED_FUNCTIONS AST_NATIVE_ARCH AST_SHADOW_WARNINGS AST_NO_STRICT_OVERFLOW @@ -1140,6 +1137,10 @@ PBX_ALSA ALSA_DIR ALSA_INCLUDE ALSA_LIB +AST_C_COMPILER_FAMILY +AST_CLANG_BLOCKS +AST_CLANG_BLOCKS_LIBS +AST_NESTED_FUNCTIONS AST_CODE_COVERAGE AST_DEVMODE_STRICT AST_DEVMODE @@ -8217,6 +8218,146 @@ fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RAII support" >&5 +$as_echo_n "checking for RAII support... " >&6; } + AST_C_COMPILER_FAMILY="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + int main() { + #if defined(__clang__) + choke + #endif + return 0; + } + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc -fnested-functions" >&5 +$as_echo_n "checking for gcc -fnested-functions... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +auto void foo(void); void foo(void) {} + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + AST_NESTED_FUNCTIONS="" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +else + + AST_NESTED_FUNCTIONS="-fnested-functions" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + AST_C_COMPILER_FAMILY="gcc" + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clang -fblocks" >&5 +$as_echo_n "checking for clang -fblocks... " >&6; } + if test "`echo "int main(){return ^{return 42;}();}" | ${CC} -o /dev/null -fblocks -x c - 2>&1`" = ""; then + AST_CLANG_BLOCKS_LIBS="" + AST_CLANG_BLOCKS="-Wno-unknown-warning-option -fblocks" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + elif test "`echo "int main(){return ^{return 42;}();}" | ${CC} -o /dev/null -fblocks -x c -lBlocksRuntime - 2>&1`" = ""; then + AST_CLANG_BLOCKS_LIBS="-lBlocksRuntime" + AST_CLANG_BLOCKS="-fblocks" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + as_fn_error $? "BlocksRuntime is required for clang, please install libblocksruntime" "$LINENO" 5 + fi + + + AST_C_COMPILER_FAMILY="clang" + + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "${AST_C_COMPILER_FAMILY}"; then + as_fn_error $? "Compiler ${CC} not supported. Mminimum required gcc-4.3 / llvm-gcc-4.3 / clang-3.3 + libblocksruntime-dev" "$LINENO" 5 + fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clang strsep/strcmp optimization" >&5 +$as_echo_n "checking for clang strsep/strcmp optimization... " >&6; } + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -O1 -Werror=array-bounds" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + #include <stdio.h> + #include <string.h> + + /* fails with clang and -O1 */ + void test_strsep_strcmp (void) { + char *haystackstr = "test1,test2"; + char *outstr; + if (!strcmp(haystackstr, ",")) { + printf("fail\n"); + } + if ((outstr = strsep(&haystackstr, ","))) { + printf("fail:%s\n", outstr); + } + } + int main(int argc, char *argv) { + test_strsep_strcmp(); + return 0; + } + + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +else + + +$as_echo "#define _HAVE_STRING_ARCH_strcmp 1" >>confdefs.h + + +$as_echo "#define _HAVE_STRING_ARCH_strsep 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: prevent use of __string2_1bptr_p / strsep / strcmp from bits/string2.h" >&5 +$as_echo "prevent use of __string2_1bptr_p / strsep / strcmp from bits/string2.h" >&6; } + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + + # AST_EXT_LIB_SETUP is used to tell configure to handle variables for # various packages. # $1 is the prefix for the variables in makeopts and autoconfig.h @@ -17376,74 +17517,6 @@ $as_echo "no" >&6; } fi -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - #if defined(__clang__) - choke - #endif - - ; - return 0; -} - -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc -fnested-functions" >&5 -$as_echo_n "checking for gcc -fnested-functions... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -auto void foo(void); void foo(void) {} - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - AST_NESTED_FUNCTIONS= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - AST_NESTED_FUNCTIONS=-fnested-functions - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - - -else - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clang -fblocks" >&5 -$as_echo_n "checking for clang -fblocks... " >&6; } - if test "`echo "int main(){return ^{return 42;}();}" | ${CC} -o /dev/null -fblocks -x c - 2>&1`" = ""; then - AST_CLANG_BLOCKS_LIBS="" - AST_CLANG_BLOCKS="-Wno-unknown-warning-option -fblocks" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - elif test "`echo "int main(){return ^{return 42;}();}" | ${CC} -o /dev/null -fblocks -x c -lBlocksRuntime - 2>&1`" = ""; then - AST_CLANG_BLOCKS_LIBS="-lBlocksRuntime" - AST_CLANG_BLOCKS="-fblocks" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - as_fn_error $? "\"BlocksRuntime is required for clang\"" "$LINENO" 5 - fi - - - - -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : |