Fix up getopt() reset management so it works on recent mingw.
authorTom Lane <[email protected]>
Thu, 16 Dec 2010 04:51:02 +0000 (23:51 -0500)
committerTom Lane <[email protected]>
Thu, 16 Dec 2010 04:51:02 +0000 (23:51 -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 316f9bb3d3724de0278e005b155778d9c985ad5d..cd4f2f1746803fb31e76ee2d9add30f09af34411 100755 (executable)
--- a/configure
+++ b/configure
@@ -17192,6 +17192,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
 
index ef9d5efe3da26e736fbedf9ff9fe87db59648fca..a9b22a3e01a76b428aa1a6804cf730d1724a863a 100644 (file)
@@ -1128,6 +1128,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)
index e58d1ecd23fa656afd1ebfaaf309ae940ef2052e..ba51d932d559aa6fd2f5092961db5007ab91d6e3 100644 (file)
@@ -284,7 +284,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
 
@@ -721,7 +722,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