diff --git a/contrib/oid2name/oid2name.c b/contrib/oid2name/oid2name.c
index 67d79346b22e84187dacc7ccb79da5721f14b789..d8565941f90997726efe0dc5e141e6c957be0878 100644
--- a/contrib/oid2name/oid2name.c
+++ b/contrib/oid2name/oid2name.c
@@ -9,14 +9,8 @@
  */
 #include "postgres_fe.h"
 
-#include <unistd.h>
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-
-extern char *optarg;
-
 #include "libpq-fe.h"
+#include "pg_getopt.h"
 
 /* an extensible array to keep track of elements to show */
 typedef struct
diff --git a/contrib/pg_archivecleanup/pg_archivecleanup.c b/contrib/pg_archivecleanup/pg_archivecleanup.c
index f12331a62ecaef4b8966aa1d24e0847820dece1d..7b5484bb6ac9f2585ba819be92dbdfc3ae6ecb85 100644
--- a/contrib/pg_archivecleanup/pg_archivecleanup.c
+++ b/contrib/pg_archivecleanup/pg_archivecleanup.c
@@ -17,20 +17,9 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <signal.h>
-
-#ifndef WIN32
 #include <sys/time.h>
-#include <unistd.h>
-
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-#else							/* WIN32 */
-extern int	getopt(int argc, char *const argv[], const char *optstring);
-#endif   /* ! WIN32 */
 
-extern char *optarg;
-extern int	optind;
+#include "pg_getopt.h"
 
 const char *progname;
 
diff --git a/contrib/pg_standby/pg_standby.c b/contrib/pg_standby/pg_standby.c
index 059c820527994ee3409c0d0c10dfd7dbbd516842..144edd8a0728cf97719a86bbe9b666f6a6ea82ac 100644
--- a/contrib/pg_standby/pg_standby.c
+++ b/contrib/pg_standby/pg_standby.c
@@ -28,20 +28,9 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <signal.h>
-
-#ifdef WIN32
-int			getopt(int argc, char *const argv[], const char *optstring);
-#else
 #include <sys/time.h>
-#include <unistd.h>
-
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-#endif   /* ! WIN32 */
 
-extern char *optarg;
-extern int	optind;
+#include "pg_getopt.h"
 
 const char *progname;
 
diff --git a/contrib/pg_upgrade/option.c b/contrib/pg_upgrade/option.c
index 4c08e94ffd02abb7e7597bc05ce11f7e9eb22f37..cd9f66dd117d67490d7e2a2e975e392f98bccddf 100644
--- a/contrib/pg_upgrade/option.c
+++ b/contrib/pg_upgrade/option.c
@@ -10,10 +10,10 @@
 #include "postgres_fe.h"
 
 #include "miscadmin.h"
+#include "getopt_long.h"
 
 #include "pg_upgrade.h"
 
-#include <getopt_long.h>
 #include <time.h>
 #include <sys/types.h>
 #include <sys/stat.h>
diff --git a/contrib/pgbench/pgbench.c b/contrib/pgbench/pgbench.c
index 16b7ab5ddc7f93d63c5636b3bedae16ee75850a7..a836acfae9896aec6077696919808d83437ffb56 100644
--- a/contrib/pgbench/pgbench.c
+++ b/contrib/pgbench/pgbench.c
@@ -40,12 +40,7 @@
 #include <ctype.h>
 #include <math.h>
 #include <signal.h>
-
-#ifndef WIN32
 #include <sys/time.h>
-#include <unistd.h>
-#endif   /* ! WIN32 */
-
 #ifdef HAVE_SYS_SELECT_H
 #include <sys/select.h>
 #endif
@@ -89,9 +84,6 @@ static int	pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start
 static int	pthread_join(pthread_t th, void **thread_return);
 #endif
 
-extern char *optarg;
-extern int	optind;
-
 
 /********************************************************************
  * some configurable parameters */
diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 3981dd6260f41a7ff5d1e3123ae9dc94b3d9b213..c2e5bad438b6184159db5162d73cfd8773a423ea 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -22,15 +22,12 @@
 #endif
 
 #include "libpq-fe.h"
+#include "pg_getopt.h"
 
 #define atooid(x)  ((Oid) strtoul((x), NULL, 10))
 
 #define BUFSIZE			1024
 
-extern char *optarg;
-extern int	optind,
-			opterr;
-
 enum trivalue
 {
 	TRI_DEFAULT,
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index ef6311b075b8eb4829872e273f2d013079922cad..c36e71d80660f9fd17d499241f8d5b32cd59d3f8 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -17,9 +17,6 @@
 #include <time.h>
 #include <unistd.h>
 #include <signal.h>
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
 
 #include "access/htup_details.h"
 #include "bootstrap/bootstrap.h"
@@ -29,6 +26,7 @@
 #include "libpq/pqsignal.h"
 #include "miscadmin.h"
 #include "nodes/makefuncs.h"
+#include "pg_getopt.h"
 #include "postmaster/bgwriter.h"
 #include "postmaster/startup.h"
 #include "postmaster/walwriter.h"
@@ -46,9 +44,6 @@
 #include "utils/relmapper.h"
 #include "utils/tqual.h"
 
-extern int	optind;
-extern char *optarg;
-
 uint32		bootstrap_data_checksum_version = 0;		/* No checksum */
 
 
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 7adc410b43aaefa02777972115b8f27f74de7cca..6bb2a474857ce070a96b8c6e9deb5e36fb2e076e 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -83,10 +83,6 @@
 #include <sys/select.h>
 #endif
 
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-
 #ifdef USE_BONJOUR
 #include <dns_sd.h>
 #endif
@@ -101,6 +97,7 @@
 #include "libpq/libpq.h"
 #include "libpq/pqsignal.h"
 #include "miscadmin.h"
+#include "pg_getopt.h"
 #include "pgstat.h"
 #include "postmaster/autovacuum.h"
 #include "postmaster/bgworker_internals.h"
@@ -352,14 +349,6 @@ static volatile bool HaveCrashedWorker = false;
 static unsigned int random_seed = 0;
 static struct timeval random_start_time;
 
-extern char *optarg;
-extern int	optind,
-			opterr;
-
-#ifdef HAVE_INT_OPTRESET
-extern int	optreset;			/* might not be declared by system headers */
-#endif
-
 #ifdef USE_BONJOUR
 static DNSServiceRef bonjour_sdref = NULL;
 #endif
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index b7612b9b5f7c3ac324bc632b5985694c9c40649e..a230d7eda6955e1e57f641afe217e8dc3843faa0 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -32,9 +32,6 @@
 #include <sys/time.h>
 #include <sys/resource.h>
 #endif
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
 
 #ifndef HAVE_GETRUSAGE
 #include "rusagestub.h"
@@ -55,6 +52,7 @@
 #include "pg_trace.h"
 #include "parser/analyze.h"
 #include "parser/parser.h"
+#include "pg_getopt.h"
 #include "postmaster/autovacuum.h"
 #include "postmaster/postmaster.h"
 #include "replication/walsender.h"
@@ -77,14 +75,6 @@
 #include "mb/pg_wchar.h"
 
 
-extern char *optarg;
-extern int	optind;
-
-#ifdef HAVE_INT_OPTRESET
-extern int	optreset;			/* might not be declared by system headers */
-#endif
-
-
 /* ----------------
  *		global variables
  * ----------------
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 458a118dc02d2a8157658d06a81f52cad384943b..2ce8e6dd00f04989026904b8c197bf097bec3d81 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -63,10 +63,6 @@
 #include "dumputils.h"
 #include "parallel.h"
 
-extern char *optarg;
-extern int	optind,
-			opterr;
-
 
 typedef struct
 {
diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c
index bb652538a444a29036817fcef470373381ea4919..df9477b69fa97a02c000d1e50a21435f1a0d0653 100644
--- a/src/bin/pg_dump/pg_restore.c
+++ b/src/bin/pg_dump/pg_restore.c
@@ -43,6 +43,7 @@
 #include "pg_backup_utils.h"
 #include "dumputils.h"
 #include "parallel.h"
+#include "getopt_long.h"
 
 #include <ctype.h>
 
@@ -50,13 +51,6 @@
 #include <termios.h>
 #endif
 
-#include <unistd.h>
-
-#include "getopt_long.h"
-
-extern char *optarg;
-extern int	optind;
-
 #ifdef ENABLE_NLS
 #include <locale.h>
 #endif
diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c
index 03f2fad3f72ee6931fb4bd4621dcc2e2e6add812..54690af0311300510c399061cd18be0ed38afc28 100644
--- a/src/bin/pg_resetxlog/pg_resetxlog.c
+++ b/src/bin/pg_resetxlog/pg_resetxlog.c
@@ -44,9 +44,6 @@
 #include <sys/time.h>
 #include <time.h>
 #include <unistd.h>
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
 
 #include "access/transam.h"
 #include "access/tuptoaster.h"
@@ -55,9 +52,7 @@
 #include "catalog/catversion.h"
 #include "catalog/pg_control.h"
 #include "common/fe_memutils.h"
-
-extern int	optind;
-extern char *optarg;
+#include "pg_getopt.h"
 
 
 static ControlFileData ControlFile;		/* pg_control values */
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index 91948014e5a79c17da8307fb2080b50fb047433b..106199273f0b229f8ec6ce7a1265eb3cf3124b45 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -386,8 +386,6 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
 	};
 
 	int			optindex;
-	extern char *optarg;
-	extern int	optind;
 	int			c;
 
 	memset(options, 0, sizeof *options);
diff --git a/src/include/getopt_long.h b/src/include/getopt_long.h
index 563719b3f7c5e14f5c7960e747b6f3f508af9f9c..e23c21f333cadda7eb6130d8cff66419d3a3fbbd 100644
--- a/src/include/getopt_long.h
+++ b/src/include/getopt_long.h
@@ -9,15 +9,7 @@
 #ifndef GETOPT_LONG_H
 #define GETOPT_LONG_H
 
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-
-/* These are picked up from the system's getopt() facility. */
-extern int	opterr;
-extern int	optind;
-extern int	optopt;
-extern char *optarg;
+#include "pg_getopt.h"
 
 #ifndef HAVE_STRUCT_OPTION
 
diff --git a/src/include/pg_getopt.h b/src/include/pg_getopt.h
new file mode 100644
index 0000000000000000000000000000000000000000..648800414e3255c55786613350b44818f9cc3438
--- /dev/null
+++ b/src/include/pg_getopt.h
@@ -0,0 +1,42 @@
+/*
+ * Portions Copyright (c) 1987, 1993, 1994
+ * The Regents of the University of California.  All rights reserved.
+ *
+ * Portions Copyright (c) 2003-2014, PostgreSQL Global Development Group
+ *
+ * src/include/pg_getopt.h
+ */
+#ifndef PG_GETOPT_H
+#define PG_GETOPT_H
+
+/* POSIX says getopt() is provided by unistd.h */
+#include <unistd.h>
+
+/* rely on the system's getopt.h if present */
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+/*
+ * If we have <getopt.h>, assume it declares these variables, else do that
+ * ourselves.  (We used to just declare them unconditionally, but Cygwin
+ * doesn't like that.)
+ */
+#ifndef HAVE_GETOPT_H
+
+extern char *optarg;
+extern int	optind;
+extern int	opterr;
+extern int	optopt;
+
+#ifdef HAVE_INT_OPTRESET
+extern int	optreset;
+#endif
+
+#endif   /* HAVE_GETOPT_H */
+
+#ifndef HAVE_GETOPT
+extern int	getopt(int nargc, char *const * nargv, const char *ostr);
+#endif
+
+#endif   /* PG_GETOPT_H */
diff --git a/src/include/port.h b/src/include/port.h
index f50fbecf0109fcca47a10be182bf5463598d6ba5..aeb7754cb0940b4fb0355ba015f98f3ab40fc681 100644
--- a/src/include/port.h
+++ b/src/include/port.h
@@ -382,10 +382,6 @@ extern int	fls(int mask);
 #define ftello(a)		ftell(a)
 #endif
 
-#ifndef HAVE_GETOPT
-extern int	getopt(int nargc, char *const * nargv, const char *ostr);
-#endif
-
 #if !defined(HAVE_GETPEEREID) && !defined(WIN32)
 extern int	getpeereid(int sock, uid_t *uid, gid_t *gid);
 #endif
diff --git a/src/port/getopt.c b/src/port/getopt.c
index eb50cba1ca440d0de9f9d194dc0c792b0bfb293b..b81fba14b07ddd9ea0c4ca9be0a06454ea5a5bf2 100644
--- a/src/port/getopt.c
+++ b/src/port/getopt.c
@@ -32,6 +32,8 @@
 
 #include "c.h"
 
+#include "pg_getopt.h"
+
 #if defined(LIBC_SCCS) && !defined(lint)
 static char sccsid[] = "@(#)getopt.c	8.3 (Berkeley) 4/27/95";
 #endif   /* LIBC_SCCS and not lint */
@@ -49,20 +51,13 @@ int			opterr = 1,			/* if error message should be printed */
 			optind = 1,			/* index into parent argv vector */
 			optopt;				/* character checked for validity */
 char	   *optarg;				/* argument associated with option */
-#else
 
-extern int	opterr;
-extern int	optind;
-extern int	optopt;
-extern char *optarg;
 #endif
 
 #define BADCH	(int)'?'
 #define BADARG	(int)':'
 #define EMSG	""
 
-int			getopt(int nargc, char *const * nargv, const char *ostr);
-
 /*
  * getopt
  *	Parse argc/argv argument vector.
diff --git a/src/test/isolation/isolationtester.c b/src/test/isolation/isolationtester.c
index e936c01532f9848c39e37a85c5be43215be91d4f..ad6732aee783ccc3726d9df267d414ebbf171a01 100644
--- a/src/test/isolation/isolationtester.c
+++ b/src/test/isolation/isolationtester.c
@@ -10,29 +10,17 @@
 #ifdef WIN32
 #include <windows.h>
 #endif
-
-#ifndef WIN32
 #include <sys/time.h>
-#include <unistd.h>
-
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-#else
-int			getopt(int argc, char *const argv[], const char *optstring);
-#endif   /* ! WIN32 */
-
 #ifdef HAVE_SYS_SELECT_H
 #include <sys/select.h>
 #endif
 
 #include "libpq-fe.h"
 #include "pqexpbuffer.h"
+#include "pg_getopt.h"
 
 #include "isolationtester.h"
 
-extern int	optind;
-
 #define PREP_WAITING "isolationtester_waiting"
 
 /*
diff --git a/src/timezone/zic.c b/src/timezone/zic.c
index a399d1f0f194acfcda187091fce7f6fba08aadc5..cda704266add2b2878c9f924464dd484204e46b5 100644
--- a/src/timezone/zic.c
+++ b/src/timezone/zic.c
@@ -8,15 +8,11 @@
 
 #include "postgres_fe.h"
 
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif
 #include <limits.h>
 #include <locale.h>
 #include <time.h>
 
-extern int	optind;
-extern char *optarg;
+#include "pg_getopt.h"
 
 #include "private.h"
 #include "pgtz.h"