66
76
AC_CHECK_FUNCS([getopt_long_only], [], [gl_replace_getopt=yes])
69
dnl BSD getopt_long uses an incompatible method to reset option processing,
70
dnl but the testsuite does not show a need to use this 'optreset' variable.
71
if false && test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
72
AC_CHECK_DECL([optreset], [gl_replace_getopt=yes], [],
73
[#include <getopt.h>])
76
79
dnl mingw's getopt (in libmingwex.a) does weird things when the options
77
80
dnl strings starts with '+' and it's not the first call. Some internal state
78
81
dnl is left over from earlier calls, and neither setting optind = 0 nor
79
82
dnl setting optreset = 1 get rid of this internal state.
83
dnl POSIX is silent on optind vs. optreset, so we allow either behavior.
84
dnl POSIX 2008 does not specify leading '+' behavior, but see
85
dnl http://austingroupbugs.net/view.php?id=191 for a recommendation on
86
dnl the next version of POSIX. For now, we only guarantee leading '+'
87
dnl behavior with getopt-gnu.
80
88
if test -z "$gl_replace_getopt"; then
81
89
AC_CACHE_CHECK([whether getopt is POSIX compatible],
82
90
[gl_cv_func_getopt_posix],
84
dnl This test fails on mingw and succeeds on all other platforms.
92
dnl BSD getopt_long uses an incompatible method to reset option
93
dnl processing. Existence of the optreset variable, in and of
94
dnl itself, is not a reason to replace getopt, but knowledge
95
dnl of the variable is needed to determine how to reset and
96
dnl whether a reset reparses the environment. Solaris
97
dnl supports neither optreset nor optind=0, but keeps no state
98
dnl that needs a reset beyond setting optind=1; detect Solaris
102
[[#include <unistd.h>]],
103
[[int *p = &optreset; return optreset;]])],
107
[[#include <getopt.h>]],
108
[[return !getopt_clip;]])],
112
dnl This test fails on mingw and succeeds on many other platforms.
113
gl_save_CPPFLAGS=$CPPFLAGS
114
CPPFLAGS="$CPPFLAGS -DOPTIND_MIN=$gl_optind_min"
115
AC_RUN_IFELSE([AC_LANG_SOURCE([[
86
116
#include <unistd.h>
87
117
#include <stdlib.h>
88
118
#include <string.h>
90
/* The glibc implementation of getopt supports setting optind = 0 as a means
91
of clearing the internal state, but other implementations don't. */
124
static char program[] = "program";
125
static char a[] = "-a";
126
static char foo[] = "foo";
127
static char bar[] = "bar";
128
char *argv[] = { program, a, foo, bar, NULL };
106
argv[argc++] = "program";
108
argv[argc++] = "foo";
109
argv[argc++] = "bar";
110
131
optind = OPTIND_MIN;
113
c = getopt (argc, argv, "ab");
134
c = getopt (4, argv, "ab");
116
c = getopt (argc, argv, "ab");
137
c = getopt (4, argv, "ab");
119
140
if (!(optind == 2))
155
175
if (!(optind == 1))
178
/* Detect MacOS 10.5, AIX 7.1 bug. */
180
static char program[] = "program";
181
static char ab[] = "-ab";
182
char *argv[3] = { program, ab, NULL };
185
if (getopt (2, argv, "ab:") != 'a')
187
if (getopt (2, argv, "ab:") != '?')
162
198
[gl_cv_func_getopt_posix=yes], [gl_cv_func_getopt_posix=no],
163
199
[case "$host_os" in
164
mingw*) gl_cv_func_getopt_posix="guessing no";;
165
*) gl_cv_func_getopt_posix="guessing yes";;
200
mingw*) gl_cv_func_getopt_posix="guessing no";;
201
darwin* | aix*) gl_cv_func_getopt_posix="guessing no";;
202
*) gl_cv_func_getopt_posix="guessing yes";;
205
CPPFLAGS=$gl_save_CPPFLAGS
169
207
case "$gl_cv_func_getopt_posix" in
170
208
*no) gl_replace_getopt=yes ;;
174
212
if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
175
213
AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_getopt_gnu],
177
[AC_LANG_PROGRAM([[#include <getopt.h>
179
#include <string.h>]],
214
[# Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the
215
# optstring is necessary for programs like m4 that have POSIX-mandated
216
# semantics for supporting options interspersed with files.
217
# Also, since getopt_long is a GNU extension, we require optind=0.
218
# Bash ties 'set -o posix' to a non-exported POSIXLY_CORRECT;
219
# so take care to revert to the correct (non-)export state.
220
dnl GNU Coding Standards currently allow awk but not env; besides, env
221
dnl is ambiguous with environment values that contain newlines.
222
gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }'
223
case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" </dev/null` in
224
xx) gl_had_POSIXLY_CORRECT=exported ;;
225
x) gl_had_POSIXLY_CORRECT=yes ;;
226
*) gl_had_POSIXLY_CORRECT= ;;
229
export POSIXLY_CORRECT
231
[AC_LANG_PROGRAM([[#include <getopt.h>
181
240
/* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw,
182
241
and fails on MacOS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5,
183
242
OSF/1 5.1, Solaris 10. */
186
myargv[0] = "conftest";
244
static char conftest[] = "conftest";
245
static char plus[] = "-+";
246
char *argv[3] = { conftest, plus, NULL };
190
if (getopt (2, myargv, "+a") != '?')
248
if (getopt (2, argv, "+a") != '?')
193
251
/* This code succeeds on glibc 2.8, mingw,
194
252
and fails on MacOS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11,
195
IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin. */
253
IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x. */
197
char *argv[] = { "program", "-p", "foo", "bar" };
255
static char program[] = "program";
256
static char p[] = "-p";
257
static char foo[] = "foo";
258
static char bar[] = "bar";
259
char *argv[] = { program, p, foo, bar, NULL };
200
262
if (getopt (4, argv, "p::") != 'p')
204
if (getopt (4, argv, "p::") != -1)
211
[gl_cv_func_getopt_gnu=yes],
212
[gl_cv_func_getopt_gnu=no],
213
[dnl Cross compiling. Guess based on host and declarations.
215
*-gnu* | mingw*) gl_cv_func_getopt_gnu=no;;
216
*) gl_cv_func_getopt_gnu=yes;;
264
else if (optarg != NULL)
266
else if (getopt (4, argv, "p::") != -1)
268
else if (optind != 2)
271
/* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0. */
273
static char program[] = "program";
274
static char foo[] = "foo";
275
static char p[] = "-p";
276
char *argv[] = { program, foo, p, NULL };
278
if (getopt (3, argv, "-p") != 1)
280
else if (getopt (3, argv, "-p") != 'p')
283
/* This code fails on glibc 2.11. */
285
static char program[] = "program";
286
static char b[] = "-b";
287
static char a[] = "-a";
288
char *argv[] = { program, b, a, NULL };
290
if (getopt (3, argv, "+:a:b") != 'b')
292
else if (getopt (3, argv, "+:a:b") != ':')
295
/* This code dumps core on glibc 2.14. */
297
static char program[] = "program";
298
static char w[] = "-W";
299
static char dummy[] = "dummy";
300
char *argv[] = { program, w, dummy, NULL };
302
if (getopt (3, argv, "W;") != 'W')
307
[gl_cv_func_getopt_gnu=yes],
308
[gl_cv_func_getopt_gnu=no],
309
[dnl Cross compiling. Guess based on host and declarations.
310
case $host_os:$ac_cv_have_decl_optreset in
311
*-gnu*:* | mingw*:*) gl_cv_func_getopt_gnu=no;;
312
*:yes) gl_cv_func_getopt_gnu=no;;
313
*) gl_cv_func_getopt_gnu=yes;;
316
case $gl_had_POSIXLY_CORRECT in
318
yes) AS_UNSET([POSIXLY_CORRECT]); POSIXLY_CORRECT=1 ;;
319
*) AS_UNSET([POSIXLY_CORRECT]) ;;
220
322
if test "$gl_cv_func_getopt_gnu" = "no"; then
221
323
gl_replace_getopt=yes