Chris@69: dnl Macros to check the presence of generic (non-typed) symbols. Chris@69: dnl Copyright (c) 2006-2007 Diego Pettenò Chris@69: dnl Copyright (c) 2006-2007 xine project Chris@69: dnl Chris@69: dnl This program is free software; you can redistribute it and/or modify Chris@69: dnl it under the terms of the GNU General Public License as published by Chris@69: dnl the Free Software Foundation; either version 2, or (at your option) Chris@69: dnl any later version. Chris@69: dnl Chris@69: dnl This program is distributed in the hope that it will be useful, Chris@69: dnl but WITHOUT ANY WARRANTY; without even the implied warranty of Chris@69: dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Chris@69: dnl GNU General Public License for more details. Chris@69: dnl Chris@69: dnl You should have received a copy of the GNU General Public License Chris@69: dnl along with this program; if not, write to the Free Software Chris@69: dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA Chris@69: dnl 02110-1301, USA. Chris@69: dnl Chris@69: dnl As a special exception, the copyright owners of the Chris@69: dnl macro gives unlimited permission to copy, distribute and modify the Chris@69: dnl configure scripts that are the output of Autoconf when processing the Chris@69: dnl Macro. You need not follow the terms of the GNU General Public Chris@69: dnl License when using or distributing such scripts, even though portions Chris@69: dnl of the text of the Macro appear in them. The GNU General Public Chris@69: dnl License (GPL) does govern all other use of the material that Chris@69: dnl constitutes the Autoconf Macro. Chris@69: dnl Chris@69: dnl This special exception to the GPL applies to versions of the Chris@69: dnl Autoconf Macro released by this project. When you make and Chris@69: dnl distribute a modified version of the Autoconf Macro, you may extend Chris@69: dnl this special exception to the GPL to apply to your modified version as Chris@69: dnl well. Chris@69: Chris@69: dnl Check if the flag is supported by compiler Chris@69: dnl CC_CHECK_CFLAGS_SILENT([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) Chris@69: Chris@69: AC_DEFUN([CC_CHECK_CFLAGS_SILENT], [ Chris@69: AC_CACHE_VAL(AS_TR_SH([cc_cv_cflags_$1]), Chris@69: [ac_save_CFLAGS="$CFLAGS" Chris@69: CFLAGS="$CFLAGS $1" Chris@69: AC_LINK_IFELSE([AC_LANG_SOURCE([int main() { return 0; }])], Chris@69: [eval "AS_TR_SH([cc_cv_cflags_$1])='yes'"], Chris@69: [eval "AS_TR_SH([cc_cv_cflags_$1])='no'"]) Chris@69: CFLAGS="$ac_save_CFLAGS" Chris@69: ]) Chris@69: Chris@69: AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], Chris@69: [$2], [$3]) Chris@69: ]) Chris@69: Chris@69: dnl Check if the flag is supported by compiler (cacheable) Chris@69: dnl CC_CHECK_CFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) Chris@69: Chris@69: AC_DEFUN([CC_CHECK_CFLAGS], [ Chris@69: AC_CACHE_CHECK([if $CC supports $1 flag], Chris@69: AS_TR_SH([cc_cv_cflags_$1]), Chris@69: CC_CHECK_CFLAGS_SILENT([$1]) dnl Don't execute actions here! Chris@69: ) Chris@69: Chris@69: AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], Chris@69: [$2], [$3]) Chris@69: ]) Chris@69: Chris@69: dnl CC_CHECK_CFLAG_APPEND(FLAG, [action-if-found], [action-if-not-found]) Chris@69: dnl Check for CFLAG and appends them to CFLAGS if supported Chris@69: AC_DEFUN([CC_CHECK_CFLAG_APPEND], [ Chris@69: AC_CACHE_CHECK([if $CC supports $1 flag], Chris@69: AS_TR_SH([cc_cv_cflags_$1]), Chris@69: CC_CHECK_CFLAGS_SILENT([$1]) dnl Don't execute actions here! Chris@69: ) Chris@69: Chris@69: AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes], Chris@69: [CFLAGS="$CFLAGS $1"; $2], [$3]) Chris@69: ]) Chris@69: Chris@69: dnl CC_CHECK_CFLAGS_APPEND([FLAG1 FLAG2], [action-if-found], [action-if-not]) Chris@69: AC_DEFUN([CC_CHECK_CFLAGS_APPEND], [ Chris@69: for flag in $1; do Chris@69: CC_CHECK_CFLAG_APPEND($flag, [$2], [$3]) Chris@69: done Chris@69: ]) Chris@69: Chris@69: dnl Check if the flag is supported by linker (cacheable) Chris@69: dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) Chris@69: Chris@69: AC_DEFUN([CC_CHECK_LDFLAGS], [ Chris@69: AC_CACHE_CHECK([if $CC supports $1 flag], Chris@69: AS_TR_SH([cc_cv_ldflags_$1]), Chris@69: [ac_save_LDFLAGS="$LDFLAGS" Chris@69: LDFLAGS="$LDFLAGS $1" Chris@69: AC_LINK_IFELSE([AC_LANG_SOURCE([int main() { return 1; }])], Chris@69: [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"], Chris@69: [eval "AS_TR_SH([cc_cv_ldflags_$1])="]) Chris@69: LDFLAGS="$ac_save_LDFLAGS" Chris@69: ]) Chris@69: Chris@69: AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes], Chris@69: [$2], [$3]) Chris@69: ]) Chris@69: Chris@69: dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for Chris@69: dnl the current linker to avoid undefined references in a shared object. Chris@69: AC_DEFUN([CC_NOUNDEFINED], [ Chris@69: dnl We check $host for which systems to enable this for. Chris@69: AC_REQUIRE([AC_CANONICAL_HOST]) Chris@69: Chris@69: case $host in Chris@69: dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads Chris@69: dnl are requested, as different implementations are present; to avoid problems Chris@69: dnl use -Wl,-z,defs only for those platform not behaving this way. Chris@69: *-freebsd* | *-openbsd*) ;; Chris@69: *) Chris@69: dnl First of all check for the --no-undefined variant of GNU ld. This allows Chris@69: dnl for a much more readable commandline, so that people can understand what Chris@69: dnl it does without going to look for what the heck -z defs does. Chris@69: for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do Chris@69: CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"]) Chris@69: break Chris@69: done Chris@69: ;; Chris@69: esac Chris@69: Chris@69: AC_SUBST([LDFLAGS_NOUNDEFINED]) Chris@69: ]) Chris@69: Chris@69: dnl Check for a -Werror flag or equivalent. -Werror is the GCC Chris@69: dnl and ICC flag that tells the compiler to treat all the warnings Chris@69: dnl as fatal. We usually need this option to make sure that some Chris@69: dnl constructs (like attributes) are not simply ignored. Chris@69: dnl Chris@69: dnl Other compilers don't support -Werror per se, but they support Chris@69: dnl an equivalent flag: Chris@69: dnl - Sun Studio compiler supports -errwarn=%all Chris@69: AC_DEFUN([CC_CHECK_WERROR], [ Chris@69: AC_CACHE_CHECK( Chris@69: [for $CC way to treat warnings as errors], Chris@69: [cc_cv_werror], Chris@69: [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror], Chris@69: [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])]) Chris@69: ]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_CHECK_ATTRIBUTE], [ Chris@69: AC_REQUIRE([CC_CHECK_WERROR]) Chris@69: AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))], Chris@69: AS_TR_SH([cc_cv_attribute_$1]), Chris@69: [ac_save_CFLAGS="$CFLAGS" Chris@69: CFLAGS="$CFLAGS $cc_cv_werror" Chris@69: AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])], Chris@69: [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"], Chris@69: [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"]) Chris@69: CFLAGS="$ac_save_CFLAGS" Chris@69: ]) Chris@69: Chris@69: AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes], Chris@69: [AC_DEFINE( Chris@69: AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1, Chris@69: [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))] Chris@69: ) Chris@69: $4], Chris@69: [$5]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [ Chris@69: CC_CHECK_ATTRIBUTE( Chris@69: [constructor],, Chris@69: [extern void foo(); Chris@69: void __attribute__((constructor)) ctor() { foo(); }], Chris@69: [$1], [$2]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_ATTRIBUTE_DESTRUCTOR], [ Chris@69: CC_CHECK_ATTRIBUTE( Chris@69: [destructor],, Chris@69: [extern void foo(); Chris@69: void __attribute__((destructor)) dtor() { foo(); }], Chris@69: [$1], [$2]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_ATTRIBUTE_FORMAT], [ Chris@69: CC_CHECK_ATTRIBUTE( Chris@69: [format], [format(printf, n, n)], Chris@69: [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }], Chris@69: [$1], [$2]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [ Chris@69: CC_CHECK_ATTRIBUTE( Chris@69: [format_arg], [format_arg(printf)], Chris@69: [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }], Chris@69: [$1], [$2]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [ Chris@69: CC_CHECK_ATTRIBUTE( Chris@69: [visibility_$1], [visibility("$1")], Chris@69: [void __attribute__((visibility("$1"))) $1_function() { }], Chris@69: [$2], [$3]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_ATTRIBUTE_NONNULL], [ Chris@69: CC_CHECK_ATTRIBUTE( Chris@69: [nonnull], [nonnull()], Chris@69: [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }], Chris@69: [$1], [$2]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_ATTRIBUTE_UNUSED], [ Chris@69: CC_CHECK_ATTRIBUTE( Chris@69: [unused], , Chris@69: [void some_function(void *foo, __attribute__((unused)) void *bar);], Chris@69: [$1], [$2]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [ Chris@69: CC_CHECK_ATTRIBUTE( Chris@69: [sentinel], , Chris@69: [void some_function(void *foo, ...) __attribute__((sentinel));], Chris@69: [$1], [$2]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [ Chris@69: CC_CHECK_ATTRIBUTE( Chris@69: [deprecated], , Chris@69: [void some_function(void *foo, ...) __attribute__((deprecated));], Chris@69: [$1], [$2]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_ATTRIBUTE_ALIAS], [ Chris@69: CC_CHECK_ATTRIBUTE( Chris@69: [alias], [weak, alias], Chris@69: [void other_function(void *foo) { } Chris@69: void some_function(void *foo) __attribute__((weak, alias("other_function")));], Chris@69: [$1], [$2]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_ATTRIBUTE_MALLOC], [ Chris@69: CC_CHECK_ATTRIBUTE( Chris@69: [malloc], , Chris@69: [void * __attribute__((malloc)) my_alloc(int n);], Chris@69: [$1], [$2]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_ATTRIBUTE_PACKED], [ Chris@69: CC_CHECK_ATTRIBUTE( Chris@69: [packed], , Chris@69: [struct astructure { char a; int b; long c; void *d; } __attribute__((packed)); Chris@69: char assert@<:@(sizeof(struct astructure) == (sizeof(char)+sizeof(int)+sizeof(long)+sizeof(void*)))-1@:>@;], Chris@69: [$1], [$2]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_ATTRIBUTE_CONST], [ Chris@69: CC_CHECK_ATTRIBUTE( Chris@69: [const], , Chris@69: [int __attribute__((const)) twopow(int n) { return 1 << n; } ], Chris@69: [$1], [$2]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_FLAG_VISIBILITY], [ Chris@69: AC_REQUIRE([CC_CHECK_WERROR]) Chris@69: AC_CACHE_CHECK([if $CC supports -fvisibility=hidden], Chris@69: [cc_cv_flag_visibility], Chris@69: [cc_flag_visibility_save_CFLAGS="$CFLAGS" Chris@69: CFLAGS="$CFLAGS $cc_cv_werror" Chris@69: CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden], Chris@69: cc_cv_flag_visibility='yes', Chris@69: cc_cv_flag_visibility='no') Chris@69: CFLAGS="$cc_flag_visibility_save_CFLAGS"]) Chris@69: Chris@69: AS_IF([test "x$cc_cv_flag_visibility" = "xyes"], Chris@69: [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1, Chris@69: [Define this if the compiler supports the -fvisibility flag]) Chris@69: $1], Chris@69: [$2]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_FUNC_EXPECT], [ Chris@69: AC_REQUIRE([CC_CHECK_WERROR]) Chris@69: AC_CACHE_CHECK([if compiler has __builtin_expect function], Chris@69: [cc_cv_func_expect], Chris@69: [ac_save_CFLAGS="$CFLAGS" Chris@69: CFLAGS="$CFLAGS $cc_cv_werror" Chris@69: AC_COMPILE_IFELSE([AC_LANG_SOURCE( Chris@69: [int some_function() { Chris@69: int a = 3; Chris@69: return (int)__builtin_expect(a, 3); Chris@69: }])], Chris@69: [cc_cv_func_expect=yes], Chris@69: [cc_cv_func_expect=no]) Chris@69: CFLAGS="$ac_save_CFLAGS" Chris@69: ]) Chris@69: Chris@69: AS_IF([test "x$cc_cv_func_expect" = "xyes"], Chris@69: [AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1, Chris@69: [Define this if the compiler supports __builtin_expect() function]) Chris@69: $1], Chris@69: [$2]) Chris@69: ]) Chris@69: Chris@69: AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [ Chris@69: AC_REQUIRE([CC_CHECK_WERROR]) Chris@69: AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported], Chris@69: [cc_cv_attribute_aligned], Chris@69: [ac_save_CFLAGS="$CFLAGS" Chris@69: CFLAGS="$CFLAGS $cc_cv_werror" Chris@69: for cc_attribute_align_try in 64 32 16 8 4 2; do Chris@69: AC_COMPILE_IFELSE([AC_LANG_SOURCE([ Chris@69: int main() { Chris@69: static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0; Chris@69: return c; Chris@69: }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break]) Chris@69: done Chris@69: CFLAGS="$ac_save_CFLAGS" Chris@69: ]) Chris@69: Chris@69: if test "x$cc_cv_attribute_aligned" != "x"; then Chris@69: AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned], Chris@69: [Define the highest alignment supported]) Chris@69: fi Chris@69: ])