source: branches/samba-3.5.x/lib/replace/autoconf-2.60.m4@ 737

Last change on this file since 737 was 414, checked in by Herwig Bauernfeind, 15 years ago

Samba 3.5.0: Initial import

File size: 5.6 KB
Line 
1# AC_GNU_SOURCE
2# --------------
3AC_DEFUN([AC_GNU_SOURCE],
4[AH_VERBATIM([_GNU_SOURCE],
5[/* Enable GNU extensions on systems that have them. */
6#ifndef _GNU_SOURCE
7# undef _GNU_SOURCE
8#endif])dnl
9AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl
10AC_BEFORE([$0], [AC_RUN_IFELSE])dnl
11AC_DEFINE([_GNU_SOURCE])
12])
13
14# _AC_C_STD_TRY(STANDARD, TEST-PROLOGUE, TEST-BODY, OPTION-LIST,
15# ACTION-IF-AVAILABLE, ACTION-IF-UNAVAILABLE)
16# --------------------------------------------------------------
17# Check whether the C compiler accepts features of STANDARD (e.g `c89', `c99')
18# by trying to compile a program of TEST-PROLOGUE and TEST-BODY. If this fails,
19# try again with each compiler option in the space-separated OPTION-LIST; if one
20# helps, append it to CC. If eventually successful, run ACTION-IF-AVAILABLE,
21# else ACTION-IF-UNAVAILABLE.
22AC_DEFUN([_AC_C_STD_TRY],
23[AC_MSG_CHECKING([for $CC option to accept ISO ]m4_translit($1, [c], [C]))
24AC_CACHE_VAL(ac_cv_prog_cc_$1,
25[ac_cv_prog_cc_$1=no
26ac_save_CC=$CC
27AC_LANG_CONFTEST([AC_LANG_PROGRAM([$2], [$3])])
28for ac_arg in '' $4
29do
30 CC="$ac_save_CC $ac_arg"
31 _AC_COMPILE_IFELSE([], [ac_cv_prog_cc_$1=$ac_arg])
32 test "x$ac_cv_prog_cc_$1" != "xno" && break
33done
34rm -f conftest.$ac_ext
35CC=$ac_save_CC
36])# AC_CACHE_VAL
37case "x$ac_cv_prog_cc_$1" in
38 x)
39 AC_MSG_RESULT([none needed]) ;;
40 xno)
41 AC_MSG_RESULT([unsupported]) ;;
42 *)
43 CC="$CC $ac_cv_prog_cc_$1"
44 AC_MSG_RESULT([$ac_cv_prog_cc_$1]) ;;
45esac
46AS_IF([test "x$ac_cv_prog_cc_$1" != xno], [$5], [$6])
47])# _AC_C_STD_TRY
48
49# _AC_PROG_CC_C99 ([ACTION-IF-AVAILABLE], [ACTION-IF-UNAVAILABLE])
50# ----------------------------------------------------------------
51# If the C compiler is not in ISO C99 mode by default, try to add an
52# option to output variable CC to make it so. This macro tries
53# various options that select ISO C99 on some system or another. It
54# considers the compiler to be in ISO C99 mode if it handles mixed
55# code and declarations, _Bool, inline and restrict.
56AC_DEFUN([_AC_PROG_CC_C99],
57[_AC_C_STD_TRY([c99],
58[[#include <stdarg.h>
59#include <stdbool.h>
60#include <stdlib.h>
61#include <wchar.h>
62#include <stdio.h>
63
64struct incomplete_array
65{
66 int datasize;
67 double data[];
68};
69
70struct named_init {
71 int number;
72 const wchar_t *name;
73 double average;
74};
75
76typedef const char *ccp;
77
78static inline int
79test_restrict(ccp restrict text)
80{
81 // See if C++-style comments work.
82 // Iterate through items via the restricted pointer.
83 // Also check for declarations in for loops.
84 for (unsigned int i = 0; *(text+i) != '\0'; ++i)
85 continue;
86 return 0;
87}
88
89// Check varargs and va_copy work.
90static void
91test_varargs(const char *format, ...)
92{
93 va_list args;
94 va_start(args, format);
95 va_list args_copy;
96 va_copy(args_copy, args);
97
98 const char *str;
99 int number;
100 float fnumber;
101
102 while (*format)
103 {
104 switch (*format++)
105 {
106 case 's': // string
107 str = va_arg(args_copy, const char *);
108 break;
109 case 'd': // int
110 number = va_arg(args_copy, int);
111 break;
112 case 'f': // float
113 fnumber = (float) va_arg(args_copy, double);
114 break;
115 default:
116 break;
117 }
118 }
119 va_end(args_copy);
120 va_end(args);
121}
122]],
123[[
124 // Check bool and long long datatypes.
125 _Bool success = false;
126 long long int bignum = -1234567890LL;
127 unsigned long long int ubignum = 1234567890uLL;
128
129 // Check restrict.
130 if (test_restrict("String literal") != 0)
131 success = true;
132 char *restrict newvar = "Another string";
133
134 // Check varargs.
135 test_varargs("s, d' f .", "string", 65, 34.234);
136
137 // Check incomplete arrays work.
138 struct incomplete_array *ia =
139 malloc(sizeof(struct incomplete_array) + (sizeof(double) * 10));
140 ia->datasize = 10;
141 for (int i = 0; i < ia->datasize; ++i)
142 ia->data[i] = (double) i * 1.234;
143
144 // Check named initialisers.
145 struct named_init ni = {
146 .number = 34,
147 .name = L"Test wide string",
148 .average = 543.34343,
149 };
150
151 ni.number = 58;
152
153 int dynamic_array[ni.number];
154 dynamic_array[43] = 543;
155
156 // work around unused variable warnings
157 return bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x';
158]],
159dnl Try
160dnl GCC -std=gnu99 (unused restrictive modes: -std=c99 -std=iso9899:1999)
161dnl AIX -qlanglvl=extc99 (unused restrictive mode: -qlanglvl=stdc99)
162dnl Intel ICC -c99
163dnl IRIX -c99
164dnl Solaris (unused because it causes the compiler to assume C99 semantics for
165dnl library functions, and this is invalid before Solaris 10: -xc99)
166dnl Tru64 -c99
167dnl with extended modes being tried first.
168[[-std=gnu99 -c99 -qlanglvl=extc99]], [$1], [$2])[]dnl
169])# _AC_PROG_CC_C99
170
171# AC_PROG_CC_C99
172# --------------
173AC_DEFUN([AC_PROG_CC_C99],
174[ AC_REQUIRE([AC_PROG_CC])dnl
175 _AC_PROG_CC_C99
176])
177
178# AC_USE_SYSTEM_EXTENSIONS
179# ------------------------
180# Enable extensions on systems that normally disable them,
181# typically due to standards-conformance issues.
182m4_ifndef([AC_USE_SYSTEM_EXTENSIONS],[
183AC_DEFUN([AC_USE_SYSTEM_EXTENSIONS],
184[
185 AC_BEFORE([$0], [AC_COMPILE_IFELSE])
186 AC_BEFORE([$0], [AC_RUN_IFELSE])
187
188 AC_REQUIRE([AC_GNU_SOURCE])
189 AC_REQUIRE([AC_AIX])
190 AC_REQUIRE([AC_MINIX])
191
192 AH_VERBATIM([__EXTENSIONS__],
193[/* Enable extensions on Solaris. */
194#ifndef __EXTENSIONS__
195# undef __EXTENSIONS__
196#endif
197#ifndef _POSIX_PTHREAD_SEMANTICS
198# undef _POSIX_PTHREAD_SEMANTICS
199#endif])
200 AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__],
201 [ac_cv_safe_to_define___extensions__],
202 [AC_COMPILE_IFELSE(
203 [AC_LANG_PROGRAM([
204# define __EXTENSIONS__ 1
205 AC_INCLUDES_DEFAULT])],
206 [ac_cv_safe_to_define___extensions__=yes],
207 [ac_cv_safe_to_define___extensions__=no])])
208 test $ac_cv_safe_to_define___extensions__ = yes &&
209 AC_DEFINE([__EXTENSIONS__])
210 AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])
211])
212])
Note: See TracBrowser for help on using the repository browser.