-# getopt.m4 serial 23
-dnl Copyright (C) 2002-2006, 2008-2009 Free Software Foundation, Inc.
+# getopt.m4 serial 24
+dnl Copyright (C) 2002-2006, 2008-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
AC_CHECK_FUNCS([getopt_long_only], [], [gl_replace_getopt=yes])
fi
- dnl BSD getopt_long uses an incompatible method to reset option processing,
- dnl but the testsuite does not show a need to use this 'optreset' variable.
- if false && test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
- AC_CHECK_DECL([optreset], [gl_replace_getopt=yes], [],
- [#include <getopt.h>])
+ dnl BSD getopt_long uses an incompatible method to reset option processing.
+ dnl Existence of the variable, in and of itself, is not a reason to replace
+ dnl getopt, but knowledge of the variable is needed to determine how to
+ dnl reset and whether a reset reparses the environment.
+ if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
+ AC_CHECK_DECLS([optreset], [], [],
+ [[#include <getopt.h>]])
fi
dnl mingw's getopt (in libmingwex.a) does weird things when the options
dnl strings starts with '+' and it's not the first call. Some internal state
dnl is left over from earlier calls, and neither setting optind = 0 nor
dnl setting optreset = 1 get rid of this internal state.
+ dnl POSIX is silent on optind vs. optreset, so we allow either behavior.
if test -z "$gl_replace_getopt"; then
AC_CACHE_CHECK([whether getopt is POSIX compatible],
[gl_cv_func_getopt_posix],
#include <stdlib.h>
#include <string.h>
-/* The glibc implementation of getopt supports setting optind = 0 as a means
- of clearing the internal state, but other implementations don't. */
-#if (__GLIBC__ >= 2)
+#if !HAVE_DECL_OPTRESET
# define OPTIND_MIN 0
#else
# define OPTIND_MIN 1
argv[argc++] = "-a";
argv[argc++] = "foo";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = OPTIND_MIN;
opterr = 0;
argv[argc++] = "duck";
argv[argc++] = "-a";
argv[argc++] = "bar";
+ argv[argc] = NULL;
optind = OPTIND_MIN;
opterr = 0;
if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_getopt_gnu],
- [AC_RUN_IFELSE(
- [AC_LANG_PROGRAM([[#include <getopt.h>
- #include <stddef.h>
- #include <string.h>]],
- [[
+ [# Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the
+ # optstring is necessary for programs like m4 that have POSIX-mandated
+ # semantics for supporting options interspersed with files.
+ # Also, since getopt_long is a GNU extension, we require optind=0.
+ gl_had_POSIXLY_CORRECT=${POSIXLY_CORRECT:+yes}
+ POSIXLY_CORRECT=1
+ export POSIXLY_CORRECT
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([[#include <getopt.h>
+ #include <stddef.h>
+ #include <string.h>
+ ]], [[
/* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw,
and fails on MacOS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5,
OSF/1 5.1, Solaris 10. */
}
/* This code succeeds on glibc 2.8, mingw,
and fails on MacOS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11,
- IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin. */
+ IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x. */
{
- char *argv[] = { "program", "-p", "foo", "bar" };
+ char *argv[] = { "program", "-p", "foo", "bar", NULL };
optind = 1;
if (getopt (4, argv, "p::") != 'p')
if (optind != 2)
return 5;
}
+ /* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0. */
+ {
+ char *argv[] = { "program", "foo", "-p", NULL };
+ optind = 0;
+ if (getopt (3, argv, "-p") != 1)
+ return 6;
+ if (getopt (3, argv, "-p") != 'p')
+ return 7;
+ }
return 0;
- ]])],
- [gl_cv_func_getopt_gnu=yes],
- [gl_cv_func_getopt_gnu=no],
- [dnl Cross compiling. Guess based on host and declarations.
- case "$host_os" in
- *-gnu* | mingw*) gl_cv_func_getopt_gnu=no;;
- *) gl_cv_func_getopt_gnu=yes;;
+ ]])],
+ [gl_cv_func_getopt_gnu=yes],
+ [gl_cv_func_getopt_gnu=no],
+ [dnl Cross compiling. Guess based on host and declarations.
+ case $host_os:$ac_cv_have_decl_optreset in
+ *-gnu*:* | mingw*:*) gl_cv_func_getopt_gnu=no;;
+ *:yes) gl_cv_func_getopt_gnu=no;;
+ *) gl_cv_func_getopt_gnu=yes;;
esac
])
+ if test "$gl_had_POSIXLY_CORRECT" != yes; then
+ AS_UNSET([POSIXLY_CORRECT])
+ fi
])
if test "$gl_cv_func_getopt_gnu" = "no"; then
gl_replace_getopt=yes