X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=m4%2Fgetopt.m4;fp=m4%2Fgetopt.m4;h=a19805eaa4041a41462fd3001146e4dd70ad8f73;hb=a2016c1de6e4884f6c8ed5cc498f3bf821c25ca4;hp=8f0c36c51e222c8de5c60ae300f0864b98c659dc;hpb=c7e61475680fa226bd9b8bdd469cd66914e630f5;p=debian%2Fgzip diff --git a/m4/getopt.m4 b/m4/getopt.m4 index 8f0c36c..a19805e 100644 --- a/m4/getopt.m4 +++ b/m4/getopt.m4 @@ -1,5 +1,5 @@ -# 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. @@ -75,17 +75,20 @@ AC_DEFUN([gl_GETOPT_CHECK_HEADERS], 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 ]) + 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 ]]) 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], @@ -96,9 +99,7 @@ AC_DEFUN([gl_GETOPT_CHECK_HEADERS], #include #include -/* 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 @@ -116,6 +117,7 @@ main () argv[argc++] = "-a"; argv[argc++] = "foo"; argv[argc++] = "bar"; + argv[argc] = NULL; optind = OPTIND_MIN; opterr = 0; @@ -141,6 +143,7 @@ main () argv[argc++] = "duck"; argv[argc++] = "-a"; argv[argc++] = "bar"; + argv[argc] = NULL; optind = OPTIND_MIN; opterr = 0; @@ -182,11 +185,18 @@ main () 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 - #include - #include ]], - [[ + [# 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 + #include + #include + ]], [[ /* 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. */ @@ -201,9 +211,9 @@ main () } /* 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') @@ -215,16 +225,29 @@ main () 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