Fix up getopt() reset management so it works on recent mingw.
authorTom Lane <[email protected]>
Thu, 16 Dec 2010 04:50:56 +0000 (23:50 -0500)
committerTom Lane <[email protected]>
Thu, 16 Dec 2010 04:50:56 +0000 (23:50 -0500)
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
configure.in
src/backend/postmaster/postmaster.c

index 55c06f5e4c963bbb2b590ed4f0f264ee8724a4ba..2bc14f1a11a175a5f20543cdcdfe782376b20bce 100755 (executable)
--- a/configure
+++ b/configure
@@ -19017,6 +19017,23 @@ esac
 
 fi
 
+# 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 "* ) ;;
+  *) LIBOBJS="$LIBOBJS getopt.$ac_objext"
+ ;;
+esac
+
+  case " $LIBOBJS " in
+  *" getopt_long.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS getopt_long.$ac_objext"
+ ;;
+esac
+
+fi
+
 # Win32 support
 if test "$PORTNAME" = "win32"; then
 
index 4d7cc3b4ef3c54a0be5a373b8bd41150954e3e4c..88890243576cd4e1093be639a05fbbd2dec2187c 100644 (file)
@@ -1314,6 +1314,13 @@ if test "$PORTNAME" = "solaris"; then
   AC_LIBOBJ(getopt)
 fi
 
+# 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)
index 463ed8197667b6fce4db3ba7299e3059c07d909d..04ee6c7954fdbff85d60f443e9e62d32850cfa57 100644 (file)
@@ -305,7 +305,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;                       /* might not be declared by system headers */
 #endif
 
@@ -722,7 +723,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