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>