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