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 for
|
---|
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 | ])
|
---|