Home | History | Annotate | Line # | Download | only in m4
      1 dnl Macros to check the presence of generic (non-typed) symbols.
      2 dnl Copyright (c) 2006-2008 Diego Petten <flameeyes gmail com>
      3 dnl Copyright (c) 2006-2008 xine project
      4 dnl Copyright (c) 2021 libuv project
      5 dnl
      6 dnl This program is free software; you can redistribute it and/or modify
      7 dnl it under the terms of the GNU General Public License as published by
      8 dnl the Free Software Foundation; either version 3, or (at your option)
      9 dnl any later version.
     10 dnl
     11 dnl This program is distributed in the hope that it will be useful,
     12 dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 dnl GNU General Public License for more details.
     15 dnl
     16 dnl You should have received a copy of the GNU General Public License
     17 dnl along with this program; if not, write to the Free Software
     18 dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
     19 dnl 02110-1301, USA.
     20 dnl
     21 dnl As a special exception, the copyright owners of the
     22 dnl macro gives unlimited permission to copy, distribute and modify the
     23 dnl configure scripts that are the output of Autoconf when processing the
     24 dnl Macro. You need not follow the terms of the GNU General Public
     25 dnl License when using or distributing such scripts, even though portions
     26 dnl of the text of the Macro appear in them. The GNU General Public
     27 dnl License (GPL) does govern all other use of the material that
     28 dnl constitutes the Autoconf Macro.
     29 dnl
     30 dnl This special exception to the GPL applies to versions of the
     31 dnl Autoconf Macro released by this project. When you make and
     32 dnl distribute a modified version of the Autoconf Macro, you may extend
     33 dnl this special exception to the GPL to apply to your modified version as
     34 dnl well.
     35 
     36 dnl Check if the flag is supported by compiler
     37 dnl CC_CHECK_CFLAGS_SILENT([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
     38 
     39 AC_DEFUN([CC_CHECK_CFLAGS_SILENT], [
     40   AC_CACHE_VAL(AS_TR_SH([cc_cv_cflags_$1]),
     41     [ac_save_CFLAGS="$CFLAGS"
     42      CFLAGS="$CFLAGS $1"
     43      AC_COMPILE_IFELSE([AC_LANG_SOURCE([int a;])],
     44        [eval "AS_TR_SH([cc_cv_cflags_$1])='yes'"],
     45        [eval "AS_TR_SH([cc_cv_cflags_$1])='no'"])
     46      CFLAGS="$ac_save_CFLAGS"
     47     ])
     48 
     49   AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes],
     50     [$2], [$3])
     51 ])
     52 
     53 dnl Check if the flag is supported by compiler (cacheable)
     54 dnl CC_CHECK_CFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
     55 
     56 AC_DEFUN([CC_CHECK_CFLAGS], [
     57   AC_CACHE_CHECK([if $CC supports $1 flag],
     58     AS_TR_SH([cc_cv_cflags_$1]),
     59     CC_CHECK_CFLAGS_SILENT([$1]) dnl Don't execute actions here!
     60   )
     61 
     62   AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes],
     63     [$2], [$3])
     64 ])
     65 
     66 dnl CC_CHECK_CFLAG_APPEND(FLAG, [action-if-found], [action-if-not-found])
     67 dnl Check for CFLAG and appends them to AM_CFLAGS if supported
     68 AC_DEFUN([CC_CHECK_CFLAG_APPEND], [
     69   AC_CACHE_CHECK([if $CC supports $1 flag],
     70     AS_TR_SH([cc_cv_cflags_$1]),
     71     CC_CHECK_CFLAGS_SILENT([$1]) dnl Don't execute actions here!
     72   )
     73 
     74   AS_IF([eval test x$]AS_TR_SH([cc_cv_cflags_$1])[ = xyes],
     75     [AM_CFLAGS="$AM_CFLAGS $1"; DEBUG_CFLAGS="$DEBUG_CFLAGS $1"; $2], [$3])
     76 
     77   AC_SUBST([AM_CFLAGS])
     78 ])
     79 
     80 dnl CC_CHECK_CFLAGS_APPEND([FLAG1 FLAG2], [action-if-found], [action-if-not])
     81 AC_DEFUN([CC_CHECK_CFLAGS_APPEND], [
     82   for flag in $1; do
     83     CC_CHECK_CFLAG_APPEND($flag, [$2], [$3])
     84   done
     85 ])
     86 
     87 dnl Check if the flag is supported by linker (cacheable)
     88 dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
     89 
     90 AC_DEFUN([CC_CHECK_LDFLAGS], [
     91   AC_CACHE_CHECK([if $CC supports $1 flag],
     92     AS_TR_SH([cc_cv_ldflags_$1]),
     93     [ac_save_LDFLAGS="$LDFLAGS"
     94      LDFLAGS="$LDFLAGS $1"
     95      AC_LANG_PUSH([C])
     96      AC_LINK_IFELSE([AC_LANG_SOURCE([int main() { return 1; }])],
     97        [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"],
     98        [eval "AS_TR_SH([cc_cv_ldflags_$1])="])
     99      AC_LANG_POP([C])
    100      LDFLAGS="$ac_save_LDFLAGS"
    101     ])
    102 
    103   AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes],
    104     [$2], [$3])
    105 ])
    106 
    107 dnl Check if flag is supported by both compiler and linker
    108 dnl If so, append it to AM_CFLAGS
    109 dnl CC_CHECK_FLAG_SUPPORTED_APPEND([FLAG])
    110 
    111 AC_DEFUN([CC_CHECK_FLAG_SUPPORTED_APPEND], [
    112   CC_CHECK_CFLAGS([$1],
    113     [CC_CHECK_LDFLAGS([$1],
    114         [AM_CFLAGS="$AM_CFLAGS $1";
    115          DEBUG_CFLAGS="$DEBUG_CFLAGS $1";
    116          AC_SUBST([AM_CFLAGS])
    117     ])
    118   ])
    119 ])
    120 
    121 dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for
    122 dnl the current linker to avoid undefined references in a shared object.
    123 AC_DEFUN([CC_NOUNDEFINED], [
    124   dnl We check $host for which systems to enable this for.
    125   AC_REQUIRE([AC_CANONICAL_HOST])
    126 
    127   case $host in
    128      dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads
    129      dnl are requested, as different implementations are present; to avoid problems
    130      dnl use -Wl,-z,defs only for those platform not behaving this way.
    131      *-freebsd* | *-openbsd*) ;;
    132      *)
    133         dnl First of all check for the --no-undefined variant of GNU ld. This allows
    134         dnl for a much more readable commandline, so that people can understand what
    135         dnl it does without going to look for what the heck -z defs does.
    136         for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do
    137           CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"])
    138 	  break
    139         done
    140 	;;
    141   esac
    142 
    143   AC_SUBST([LDFLAGS_NOUNDEFINED])
    144 ])
    145 
    146 dnl Check for a -Werror flag or equivalent. -Werror is the GCC
    147 dnl and ICC flag that tells the compiler to treat all the warnings
    148 dnl as fatal. We usually need this option to make sure that some
    149 dnl constructs (like attributes) are not simply ignored.
    150 dnl
    151 dnl Other compilers don't support -Werror per se, but they support
    152 dnl an equivalent flag:
    153 dnl  - Sun Studio compiler supports -errwarn=%all
    154 AC_DEFUN([CC_CHECK_WERROR], [
    155   AC_CACHE_CHECK(
    156     [for $CC way to treat warnings as errors],
    157     [cc_cv_werror],
    158     [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror],
    159       [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])])
    160     ])
    161 ])
    162 
    163 AC_DEFUN([CC_CHECK_ATTRIBUTE], [
    164   AC_REQUIRE([CC_CHECK_WERROR])
    165   AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))],
    166     AS_TR_SH([cc_cv_attribute_$1]),
    167     [ac_save_CFLAGS="$CFLAGS"
    168      CFLAGS="$CFLAGS $cc_cv_werror"
    169      AC_LANG_PUSH([C])
    170      AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])],
    171        [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"],
    172        [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"])
    173      AC_LANG_POP([C])
    174      CFLAGS="$ac_save_CFLAGS"
    175     ])
    176 
    177   AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes],
    178     [AC_DEFINE(
    179        AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1,
    180          [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))]
    181          )
    182      $4],
    183     [$5])
    184 ])
    185 
    186 AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [
    187   CC_CHECK_ATTRIBUTE(
    188     [constructor],,
    189     [void __attribute__((constructor)) ctor() { int a; }],
    190     [$1], [$2])
    191 ])
    192 
    193 AC_DEFUN([CC_ATTRIBUTE_FORMAT], [
    194   CC_CHECK_ATTRIBUTE(
    195     [format], [format(printf, n, n)],
    196     [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }],
    197     [$1], [$2])
    198 ])
    199 
    200 AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [
    201   CC_CHECK_ATTRIBUTE(
    202     [format_arg], [format_arg(printf)],
    203     [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }],
    204     [$1], [$2])
    205 ])
    206 
    207 AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [
    208   CC_CHECK_ATTRIBUTE(
    209     [visibility_$1], [visibility("$1")],
    210     [void __attribute__((visibility("$1"))) $1_function() { }],
    211     [$2], [$3])
    212 ])
    213 
    214 AC_DEFUN([CC_ATTRIBUTE_NONNULL], [
    215   CC_CHECK_ATTRIBUTE(
    216     [nonnull], [nonnull()],
    217     [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }],
    218     [$1], [$2])
    219 ])
    220 
    221 AC_DEFUN([CC_ATTRIBUTE_UNUSED], [
    222   CC_CHECK_ATTRIBUTE(
    223     [unused], ,
    224     [void some_function(void *foo, __attribute__((unused)) void *bar);],
    225     [$1], [$2])
    226 ])
    227 
    228 AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [
    229   CC_CHECK_ATTRIBUTE(
    230     [sentinel], ,
    231     [void some_function(void *foo, ...) __attribute__((sentinel));],
    232     [$1], [$2])
    233 ])
    234 
    235 AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [
    236   CC_CHECK_ATTRIBUTE(
    237     [deprecated], ,
    238     [void some_function(void *foo, ...) __attribute__((deprecated));],
    239     [$1], [$2])
    240 ])
    241 
    242 AC_DEFUN([CC_ATTRIBUTE_ALIAS], [
    243   CC_CHECK_ATTRIBUTE(
    244     [alias], [weak, alias],
    245     [void other_function(void *foo) { }
    246      void some_function(void *foo) __attribute__((weak, alias("other_function")));],
    247     [$1], [$2])
    248 ])
    249 
    250 AC_DEFUN([CC_ATTRIBUTE_MALLOC], [
    251   CC_CHECK_ATTRIBUTE(
    252     [malloc], ,
    253     [void * __attribute__((malloc)) my_alloc(int n);],
    254     [$1], [$2])
    255 ])
    256 
    257 AC_DEFUN([CC_ATTRIBUTE_PACKED], [
    258   CC_CHECK_ATTRIBUTE(
    259     [packed], ,
    260     [struct astructure { char a; int b; long c; void *d; } __attribute__((packed));],
    261     [$1], [$2])
    262 ])
    263 
    264 AC_DEFUN([CC_ATTRIBUTE_CONST], [
    265   CC_CHECK_ATTRIBUTE(
    266     [const], ,
    267     [int __attribute__((const)) twopow(int n) { return 1 << n; } ],
    268     [$1], [$2])
    269 ])
    270 
    271 AC_DEFUN([CC_FLAG_VISIBILITY], [
    272   AC_REQUIRE([CC_CHECK_WERROR])
    273   AC_CACHE_CHECK([if $CC supports -fvisibility=hidden],
    274     [cc_cv_flag_visibility],
    275     [cc_flag_visibility_save_CFLAGS="$CFLAGS"
    276      CFLAGS="$CFLAGS $cc_cv_werror"
    277      CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden],
    278 	cc_cv_flag_visibility='yes',
    279 	cc_cv_flag_visibility='no')
    280      CFLAGS="$cc_flag_visibility_save_CFLAGS"])
    281 
    282   AS_IF([test "x$cc_cv_flag_visibility" = "xyes"],
    283     [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1,
    284        [Define this if the compiler supports the -fvisibility flag])
    285      $1],
    286     [$2])
    287 ])
    288 
    289 AC_DEFUN([CC_FUNC_EXPECT], [
    290   AC_REQUIRE([CC_CHECK_WERROR])
    291   AC_CACHE_CHECK([if compiler has __builtin_expect function],
    292     [cc_cv_func_expect],
    293     [ac_save_CFLAGS="$CFLAGS"
    294      CFLAGS="$CFLAGS $cc_cv_werror"
    295      AC_LANG_PUSH([C])
    296      AC_COMPILE_IFELSE([AC_LANG_SOURCE(
    297        [int some_function() {
    298         int a = 3;
    299         return (int)__builtin_expect(a, 3);
    300 	}])],
    301        [cc_cv_func_expect=yes],
    302        [cc_cv_func_expect=no])
    303      AC_LANG_POP([C])
    304      CFLAGS="$ac_save_CFLAGS"
    305     ])
    306 
    307   AS_IF([test "x$cc_cv_func_expect" = "xyes"],
    308     [AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1,
    309      [Define this if the compiler supports __builtin_expect() function])
    310      $1],
    311     [$2])
    312 ])
    313 
    314 AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [
    315   AC_REQUIRE([CC_CHECK_WERROR])
    316   AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported],
    317     [cc_cv_attribute_aligned],
    318     [ac_save_CFLAGS="$CFLAGS"
    319      CFLAGS="$CFLAGS $cc_cv_werror"
    320      AC_LANG_PUSH([C])
    321      for cc_attribute_align_try in 64 32 16 8 4 2; do
    322         AC_COMPILE_IFELSE([AC_LANG_SOURCE([
    323           int main() {
    324             static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0;
    325             return c;
    326           }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break])
    327      done
    328      AC_LANG_POP([C])
    329      CFLAGS="$ac_save_CFLAGS"
    330   ])
    331 
    332   if test "x$cc_cv_attribute_aligned" != "x"; then
    333      AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned],
    334        [Define the highest alignment supported])
    335   fi
    336 ])
    337