From 6a61d58ca8d28b1d0e49a6906ac61ab86f12493c Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 15 Dec 2010 23:51:07 -0500 Subject: [PATCH] Fix up getopt() reset management so it works on recent mingw. The mingw people don't appear to care about compatibility with non-GNU versions of getopt, so force use of our own copy of getopt on Windows. Also, ensure that we make use of optreset when using our own copy. Per report from Andrew Dunstan. Back-patch to all versions supported on Windows. --- configure | 21 +++++++++++++++++++++ configure.in | 7 +++++++ src/backend/postmaster/postmaster.c | 5 +++-- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/configure b/configure index e8890b18100..8af662acb90 100755 --- a/configure +++ b/configure @@ -15047,6 +15047,27 @@ case $host_os in bsdi*|netbsd*) ac_cv_func_fseeko=yes esac +# mingw has adopted a GNU-centric interpretation of optind/optreset, +# so always use our version on Windows. +if test "$PORTNAME" = "win32"; then + case $LIBOBJS in + "getopt.$ac_objext" | \ + *" getopt.$ac_objext" | \ + "getopt.$ac_objext "* | \ + *" getopt.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getopt.$ac_objext" ;; +esac + + case $LIBOBJS in + "getopt_long.$ac_objext" | \ + *" getopt_long.$ac_objext" | \ + "getopt_long.$ac_objext "* | \ + *" getopt_long.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getopt_long.$ac_objext" ;; +esac + +fi + # Win32 support if test "$PORTNAME" = "win32"; then diff --git a/configure.in b/configure.in index 99f62812492..4d6ad04f75e 100644 --- a/configure.in +++ b/configure.in @@ -1019,6 +1019,13 @@ case $host_os in bsdi*|netbsd*) ac_cv_func_fseeko=yes esac +# mingw has adopted a GNU-centric interpretation of optind/optreset, +# so always use our version on Windows. +if test "$PORTNAME" = "win32"; then + AC_LIBOBJ(getopt) + AC_LIBOBJ(getopt_long) +fi + # Win32 support if test "$PORTNAME" = "win32"; then AC_REPLACE_FUNCS(gettimeofday) diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 21ed2eaf669..6148f286636 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -232,7 +232,8 @@ extern char *optarg; extern int optind, opterr; -#ifdef HAVE_INT_OPTRESET +/* If not HAVE_GETOPT, we are using src/port/getopt.c, which has optreset */ +#if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT) extern int optreset; #endif @@ -658,7 +659,7 @@ PostmasterMain(int argc, char *argv[]) * getopt(3) library so that it will work correctly in subprocesses. */ optind = 1; -#ifdef HAVE_INT_OPTRESET +#if defined(HAVE_INT_OPTRESET) || !defined(HAVE_GETOPT) optreset = 1; /* some systems need this too */ #endif