OLD | NEW |
| (Empty) |
1 # AC_GNU_SOURCE | |
2 # -------------- | |
3 AC_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 | |
9 AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl | |
10 AC_BEFORE([$0], [AC_RUN_IFELSE])dnl | |
11 AC_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. | |
22 AC_DEFUN([_AC_C_STD_TRY], | |
23 [AC_MSG_CHECKING([for $CC option to accept ISO ]m4_translit($1, [c], [C])) | |
24 AC_CACHE_VAL(ac_cv_prog_cc_$1, | |
25 [ac_cv_prog_cc_$1=no | |
26 ac_save_CC=$CC | |
27 AC_LANG_CONFTEST([AC_LANG_PROGRAM([$2], [$3])]) | |
28 for ac_arg in '' $4 | |
29 do | |
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 | |
33 done | |
34 rm -f conftest.$ac_ext | |
35 CC=$ac_save_CC | |
36 ])# AC_CACHE_VAL | |
37 case "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]) ;; | |
45 esac | |
46 AS_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. | |
56 AC_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 | |
64 struct incomplete_array | |
65 { | |
66 int datasize; | |
67 double data[]; | |
68 }; | |
69 | |
70 struct named_init { | |
71 int number; | |
72 const wchar_t *name; | |
73 double average; | |
74 }; | |
75 | |
76 typedef const char *ccp; | |
77 | |
78 static inline int | |
79 test_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. | |
90 static void | |
91 test_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 ]], | |
159 dnl Try | |
160 dnl GCC -std=gnu99 (unused restrictive modes: -std=c99 -std=iso9899:1999
) | |
161 dnl AIX -qlanglvl=extc99 (unused restrictive mode: -qlanglvl=stdc99) | |
162 dnl Intel ICC -c99 | |
163 dnl IRIX -c99 | |
164 dnl Solaris (unused because it causes the compiler to assume C99 semantics f
or | |
165 dnl library functions, and this is invalid before Solaris 10: -xc99) | |
166 dnl Tru64 -c99 | |
167 dnl 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 # -------------- | |
173 AC_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. | |
182 m4_ifndef([AC_USE_SYSTEM_EXTENSIONS],[ | |
183 AC_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 ]) | |
OLD | NEW |