Annotation of embedaddon/quagga/m4/ax_sys_weak_alias.m4, revision 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>