Annotation of embedaddon/quagga/m4/ax_sys_weak_alias.m4, revision 1.1.1.1

1.1       misho       1: # ===========================================================================
                      2: # http://www.gnu.org/software/autoconf-archive/ax_sys_weak_alias.html
                      3: # ===========================================================================
                      4: #
                      5: # SYNOPSIS
                      6: #
                      7: #   AX_SYS_WEAK_ALIAS
                      8: #
                      9: # DESCRIPTION
                     10: #
                     11: #   Determines whether weak aliases are supported on the system, and if so,
                     12: #   what scheme is used to declare them. Also checks to see if aliases can
                     13: #   cross object file boundaries, as some systems don't permit them to.
                     14: #
                     15: #   Most systems permit something called a "weak alias" or "weak symbol."
                     16: #   These aliases permit a library to provide a stub form of a routine
                     17: #   defined in another library, thus allowing the first library to operate
                     18: #   even if the other library is not linked. This macro will check for
                     19: #   support of weak aliases, figure out what schemes are available, and
                     20: #   determine some characteristics of the weak alias support -- primarily,
                     21: #   whether a weak alias declared in one object file may be referenced from
                     22: #   another object file.
                     23: #
                     24: #   There are four known schemes of declaring weak symbols; each scheme is
                     25: #   checked in turn, and the first one found is prefered. Note that only one
                     26: #   of the mentioned preprocessor macros will be defined!
                     27: #
                     28: #   1. Function attributes
                     29: #
                     30: #   This scheme was first introduced by the GNU C compiler, and attaches
                     31: #   attributes to particular functions. It is among the easiest to use, and
                     32: #   so is the first one checked. If this scheme is detected, the
                     33: #   preprocessor macro HAVE_SYS_WEAK_ALIAS_ATTRIBUTE will be defined to 1.
                     34: #   This scheme is used as in the following code fragment:
                     35: #
                     36: #     void __weakf(int c)
                     37: #     {
                     38: #       /* Function definition... */
                     39: #     }
                     40: #
                     41: #     void weakf(int c) __attribute__((weak, alias("__weakf")));
                     42: #
                     43: #   2. #pragma weak
                     44: #
                     45: #   This scheme is in use by many compilers other than the GNU C compiler.
                     46: #   It is also particularly easy to use, and fairly portable -- well, as
                     47: #   portable as these things get. If this scheme is detected first, the
                     48: #   preprocessor macro HAVE_SYS_WEAK_ALIAS_PRAGMA will be defined to 1. This
                     49: #   scheme is used as in the following code fragment:
                     50: #
                     51: #     extern void weakf(int c);
                     52: #     #pragma weak weakf = __weakf
                     53: #     void __weakf(int c)
                     54: #     {
                     55: #       /* Function definition... */
                     56: #     }
                     57: #
                     58: #   3. #pragma _HP_SECONDARY_DEF
                     59: #
                     60: #   This scheme appears to be in use by the HP compiler. As it is rather
                     61: #   specialized, this is one of the last schemes checked. If it is the first
                     62: #   one detected, the preprocessor macro HAVE_SYS_WEAK_ALIAS_HPSECONDARY
                     63: #   will be defined to 1. This scheme is used as in the following code
                     64: #   fragment:
                     65: #
                     66: #     extern void weakf(int c);
                     67: #     #pragma _HP_SECONDARY_DEF __weakf weakf
                     68: #     void __weakf(int c)
                     69: #     {
                     70: #       /* Function definition... */
                     71: #     }
                     72: #
                     73: #   4. #pragma _CRI duplicate
                     74: #
                     75: #   This scheme appears to be in use by the Cray compiler. As it is rather
                     76: #   specialized, it too is one of the last schemes checked. If it is the
                     77: #   first one detected, the preprocessor macro
                     78: #   HAVE_SYS_WEAK_ALIAS_CRIDUPLICATE will be defined to 1. This scheme is
                     79: #   used as in the following code fragment:
                     80: #
                     81: #     extern void weakf(int c);
                     82: #     #pragma _CRI duplicate weakf as __weakf
                     83: #     void __weakf(int c)
                     84: #     {
                     85: #       /* Function definition... */
                     86: #     }
                     87: #
                     88: #   In addition to the preprocessor macros listed above, if any scheme is
                     89: #   found, the preprocessor macro HAVE_SYS_WEAK_ALIAS will also be defined
                     90: #   to 1.
                     91: #
                     92: #   Once a weak aliasing scheme has been found, a check will be performed to
                     93: #   see if weak aliases are honored across object file boundaries. If they
                     94: #   are, the HAVE_SYS_WEAK_ALIAS_CROSSFILE preprocessor macro is defined to
                     95: #   1.
                     96: #
                     97: #   This Autoconf macro also makes two substitutions. The first, WEAK_ALIAS,
                     98: #   contains the name of the scheme found (one of "attribute", "pragma",
                     99: #   "hpsecondary", or "criduplicate"), or "no" if no weak aliasing scheme
                    100: #   was found. The second, WEAK_ALIAS_CROSSFILE, is set to "yes" or "no"
                    101: #   depending on whether or not weak aliases may cross object file
                    102: #   boundaries.
                    103: #
                    104: # LICENSE
                    105: #
                    106: #   Copyright (c) 2008 Kevin L. Mitchell <klmitch@mit.edu>
                    107: #
                    108: #   Copying and distribution of this file, with or without modification, are
                    109: #   permitted in any medium without royalty provided the copyright notice
                    110: #   and this notice are preserved. This file is offered as-is, without any
                    111: #   warranty.
                    112: 
                    113: #serial 6
                    114: 
                    115: AU_ALIAS([KLM_SYS_WEAK_ALIAS], [AX_SYS_WEAK_ALIAS])
                    116: AC_DEFUN([AX_SYS_WEAK_ALIAS], [
                    117:   # starting point: no aliasing scheme yet...
                    118:   ax_sys_weak_alias=no
                    119: 
                    120:   # Figure out what kind of aliasing may be supported...
                    121:   _AX_SYS_WEAK_ALIAS_ATTRIBUTE
                    122:   _AX_SYS_WEAK_ALIAS_PRAGMA
                    123:   _AX_SYS_WEAK_ALIAS_HPSECONDARY
                    124:   _AX_SYS_WEAK_ALIAS_CRIDUPLICATE
                    125: 
                    126:   # Do we actually support aliasing?
                    127:   AC_CACHE_CHECK([how to create weak aliases with $CC],
                    128:                  [ax_cv_sys_weak_alias],
                    129:  [ax_cv_sys_weak_alias=$ax_sys_weak_alias])
                    130: 
                    131:   # OK, set a #define
                    132:   AS_IF([test $ax_cv_sys_weak_alias != no], [
                    133:     AC_DEFINE([HAVE_SYS_WEAK_ALIAS], 1,
                    134:               [Define this if your system can create weak aliases])
                    135:   ])
                    136: 
                    137:   # Can aliases cross object file boundaries?
                    138:   _AX_SYS_WEAK_ALIAS_CROSSFILE
                    139: 
                    140:   # OK, remember the results
                    141:   AC_SUBST([WEAK_ALIAS], [$ax_cv_sys_weak_alias])
                    142:   AC_SUBST([WEAK_ALIAS_CROSSFILE], [$ax_cv_sys_weak_alias_crossfile])
                    143: ])
                    144: 
                    145: AC_DEFUN([_AX_SYS_WEAK_ALIAS_ATTRIBUTE],
                    146: [ # Test whether compiler accepts __attribute__ form of weak aliasing
                    147:   AC_CACHE_CHECK([whether $CC accepts function __attribute__((weak,alias()))],
                    148:   [ax_cv_sys_weak_alias_attribute], [
                    149:     # We add -Werror if it's gcc to force an error exit if the weak attribute
                    150:     # isn't understood
                    151:     AS_IF([test $GCC = yes], [
                    152:       save_CFLAGS=$CFLAGS
                    153:       CFLAGS=-Werror])
                    154: 
                    155:     # Try linking with a weak alias...
                    156:     AC_LINK_IFELSE([
                    157:       AC_LANG_PROGRAM([
                    158: void __weakf(int c) {}
                    159: void weakf(int c) __attribute__((weak, alias("__weakf")));],
                    160:         [weakf(0)])],
                    161:       [ax_cv_sys_weak_alias_attribute=yes],
                    162:       [ax_cv_sys_weak_alias_attribute=no])
                    163: 
                    164:     # Restore original CFLAGS
                    165:     AS_IF([test $GCC = yes], [
                    166:       CFLAGS=$save_CFLAGS])
                    167:   ])
                    168: 
                    169:   # What was the result of the test?
                    170:   AS_IF([test $ax_cv_sys_weak_alias_attribute = yes], [
                    171:     test $ax_sys_weak_alias = no && ax_sys_weak_alias=attribute
                    172:     AC_DEFINE([HAVE_SYS_WEAK_ALIAS_ATTRIBUTE], 1,
                    173:               [Define this if weak aliases may be created with __attribute__])
                    174:   ])
                    175: ])
                    176: 
                    177: AC_DEFUN([_AX_SYS_WEAK_ALIAS_PRAGMA],
                    178: [ # Test whether compiler accepts #pragma form of weak aliasing
                    179:   AC_CACHE_CHECK([whether $CC supports @%:@pragma weak],
                    180:   [ax_cv_sys_weak_alias_pragma], [
                    181: 
                    182:     # Try linking with a weak alias...
                    183:     AC_LINK_IFELSE([
                    184:       AC_LANG_PROGRAM([
                    185: extern void weakf(int c);
                    186: @%:@pragma weak weakf = __weakf
                    187: void __weakf(int c) {}],
                    188:         [weakf(0)])],
                    189:       [ax_cv_sys_weak_alias_pragma=yes],
                    190:       [ax_cv_sys_weak_alias_pragma=no])
                    191:   ])
                    192: 
                    193:   # What was the result of the test?
                    194:   AS_IF([test $ax_cv_sys_weak_alias_pragma = yes], [
                    195:     test $ax_sys_weak_alias = no && ax_sys_weak_alias=pragma
                    196:     AC_DEFINE([HAVE_SYS_WEAK_ALIAS_PRAGMA], 1,
                    197:               [Define this if weak aliases may be created with @%:@pragma weak])
                    198:   ])
                    199: ])
                    200: 
                    201: AC_DEFUN([_AX_SYS_WEAK_ALIAS_HPSECONDARY],
                    202: [ # Test whether compiler accepts _HP_SECONDARY_DEF pragma from HP...
                    203:   AC_CACHE_CHECK([whether $CC supports @%:@pragma _HP_SECONDARY_DEF],
                    204:   [ax_cv_sys_weak_alias_hpsecondary], [
                    205: 
                    206:     # Try linking with a weak alias...
                    207:     AC_LINK_IFELSE([
                    208:       AC_LANG_PROGRAM([
                    209: extern void weakf(int c);
                    210: @%:@pragma _HP_SECONDARY_DEF __weakf weakf
                    211: void __weakf(int c) {}],
                    212:         [weakf(0)])],
                    213:       [ax_cv_sys_weak_alias_hpsecondary=yes],
                    214:       [ax_cv_sys_weak_alias_hpsecondary=no])
                    215:   ])
                    216: 
                    217:   # What was the result of the test?
                    218:   AS_IF([test $ax_cv_sys_weak_alias_hpsecondary = yes], [
                    219:     test $ax_sys_weak_alias = no && ax_sys_weak_alias=hpsecondary
                    220:     AC_DEFINE([HAVE_SYS_WEAK_ALIAS_HPSECONDARY], 1,
                    221:               [Define this if weak aliases may be created with @%:@pragma _HP_SECONDARY_DEF])
                    222:   ])
                    223: ])
                    224: 
                    225: AC_DEFUN([_AX_SYS_WEAK_ALIAS_CRIDUPLICATE],
                    226: [ # Test whether compiler accepts "_CRI duplicate" pragma from Cray
                    227:   AC_CACHE_CHECK([whether $CC supports @%:@pragma _CRI duplicate],
                    228:   [ax_cv_sys_weak_alias_criduplicate], [
                    229: 
                    230:     # Try linking with a weak alias...
                    231:     AC_LINK_IFELSE([
                    232:       AC_LANG_PROGRAM([
                    233: extern void weakf(int c);
                    234: @%:@pragma _CRI duplicate weakf as __weakf
                    235: void __weakf(int c) {}],
                    236:         [weakf(0)])],
                    237:       [ax_cv_sys_weak_alias_criduplicate=yes],
                    238:       [ax_cv_sys_weak_alias_criduplicate=no])
                    239:   ])
                    240: 
                    241:   # What was the result of the test?
                    242:   AS_IF([test $ax_cv_sys_weak_alias_criduplicate = yes], [
                    243:     test $ax_sys_weak_alias = no && ax_sys_weak_alias=criduplicate
                    244:     AC_DEFINE([HAVE_SYS_WEAK_ALIAS_CRIDUPLICATE], 1,
                    245:               [Define this if weak aliases may be created with @%:@pragma _CRI duplicate])
                    246:   ])
                    247: ])
                    248: 
                    249: dnl Note: This macro is modeled closely on AC_LINK_IFELSE, and in fact
                    250: dnl depends on some implementation details of that macro, particularly
                    251: dnl its use of _AC_MSG_LOG_CONFTEST to log the failed test program and
                    252: dnl its use of ac_link for running the linker.
                    253: AC_DEFUN([_AX_SYS_WEAK_ALIAS_CROSSFILE],
                    254: [ # Check to see if weak aliases can cross object file boundaries
                    255:   AC_CACHE_CHECK([whether $CC supports weak aliases across object file boundaries],
                    256:   [ax_cv_sys_weak_alias_crossfile], [
                    257:     AS_IF([test $ax_cv_sys_weak_alias = no],
                    258:           [ax_cv_sys_weak_alias_crossfile=no], [
                    259: dnl Must build our own test files...
                    260:       # conftest1 contains our weak alias definition...
                    261:       cat >conftest1.$ac_ext <<_ACEOF
                    262: /* confdefs.h.  */
                    263: _ACEOF
                    264:       cat confdefs.h >>conftest1.$ac_ext
                    265:       cat >>conftest1.$ac_ext <<_ACEOF
                    266: /* end confdefs.h.  */
                    267: 
                    268: @%:@ifndef HAVE_SYS_WEAK_ALIAS_ATTRIBUTE
                    269: extern void weakf(int c);
                    270: @%:@if defined(HAVE_SYS_WEAK_ALIAS_PRAGMA)
                    271: @%:@pragma weak weakf = __weakf
                    272: @%:@elif defined(HAVE_SYS_WEAK_ALIAS_HPSECONDARY)
                    273: @%:@pragma _HP_SECONDARY_DEF __weakf weakf
                    274: @%:@elif defined(HAVE_SYS_WEAK_ALIAS_CRIDUPLICATE)
                    275: @%:@pragma _CRI duplicate weakf as __weakf
                    276: @%:@endif
                    277: @%:@endif
                    278: void __weakf(int c) {}
                    279: @%:@ifdef HAVE_SYS_WEAK_ALIAS_ATTRIBUTE
                    280: void weakf(int c) __attribute((weak, alias("__weakf")));
                    281: @%:@endif
                    282: _ACEOF
                    283:       # And conftest2 contains our main routine that calls it
                    284:       cat >conftest2.$ac_ext <<_ACEOF
                    285: /* confdefs.h.  */
                    286: _ACEOF
                    287:       cat confdefs.h >> conftest2.$ac_ext
                    288:       cat >>conftest2.$ac_ext <<_ACEOF
                    289: /* end confdefs.h.  */
                    290: 
                    291: extern void weakf(int c);
                    292: int
                    293: main ()
                    294: {
                    295:   weakf(0);
                    296:   return 0;
                    297: }
                    298: _ACEOF
                    299:       # We must remove the object files (if any) ourselves...
                    300:       rm -f conftest2.$ac_objext conftest$ac_exeext
                    301: 
                    302:       # Change ac_link to compile *2* files together
                    303:       save_aclink=$ac_link
                    304:       ac_link=`echo "$ac_link" | \
                    305:                sed -e 's/conftest\(\.\$ac_ext\)/conftest1\1 conftest2\1/'`
                    306: dnl Substitute our own routine for logging the conftest
                    307: m4_pushdef([_AC_MSG_LOG_CONFTEST],
                    308: [echo "$as_me: failed program was:" >&AS_MESSAGE_LOG_FD
                    309: echo ">>> conftest1.$ac_ext" >&AS_MESSAGE_LOG_FD
                    310: sed "s/^/| /" conftest1.$ac_ext >&AS_MESSAGE_LOG_FD
                    311: echo ">>> conftest2.$ac_ext" >&AS_MESSAGE_LOG_FD
                    312: sed "s/^/| /" conftest2.$ac_ext >&AS_MESSAGE_LOG_FD
                    313: ])dnl
                    314:       # Since we created the files ourselves, don't use SOURCE argument
                    315:       AC_LINK_IFELSE(, [ax_cv_sys_weak_alias_crossfile=yes],
                    316:                      [ax_cv_sys_weak_alias_crossfile=no])
                    317: dnl Restore _AC_MSG_LOG_CONFTEST
                    318: m4_popdef([_AC_MSG_LOG_CONFTEST])dnl
                    319:       # Restore ac_link
                    320:       ac_link=$save_aclink
                    321: 
                    322:       # We must remove the object files (if any) and C files ourselves...
                    323:       rm -f conftest1.$ac_ext conftest2.$ac_ext \
                    324:             conftest1.$ac_objext conftest2.$ac_objext
                    325:     ])
                    326:   ])
                    327: 
                    328:   # What were the results of the test?
                    329:   AS_IF([test $ax_cv_sys_weak_alias_crossfile = yes], [
                    330:     AC_DEFINE([HAVE_SYS_WEAK_ALIAS_CROSSFILE], 1,
                    331:               [Define this if weak aliases in other files are honored])
                    332:   ])
                    333: ])

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>