[PATCH v3 1/1] Fix detection of preadv/pwritev support for OSX.

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH v3 1/1] Fix detection of preadv/pwritev support for OSX.

James Hilliard
Fixes:
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -Wno-unused-command-line-argument -O2 -I../../../../src/include  -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk    -c -o fd.o fd.c
fd.c:3661:10: warning: 'pwritev' is only available on macOS 11.0 or newer [-Wunguarded-availability-new]
                part = pg_pwritev(fd, iov, iovcnt, offset);
                       ^~~~~~~~~~
../../../../src/include/port/pg_iovec.h:49:20: note: expanded from macro 'pg_pwritev'
                   ^~~~~~~
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk/usr/include/sys/uio.h:104:9: note: 'pwritev' has been marked as being introduced in macOS 11.0
      here, but the deployment target is macOS 10.15.0
ssize_t pwritev(int, const struct iovec *, int, off_t) __DARWIN_NOCANCEL(pwritev) __API_AVAILABLE(macos(11.0), ios(14.0), watchos(7.0), tvos(14.0));
        ^
fd.c:3661:10: note: enclose 'pwritev' in a __builtin_available check to silence this warning
                part = pg_pwritev(fd, iov, iovcnt, offset);
                       ^~~~~~~~~~
../../../../src/include/port/pg_iovec.h:49:20: note: expanded from macro 'pg_pwritev'
                   ^~~~~~~
1 warning generated.

This results in a runtime error:
running bootstrap script ... dyld: lazy symbol binding failed: Symbol not found: _pwritev
  Referenced from: /usr/local/pgsql/bin/postgres
  Expected in: /usr/lib/libSystem.B.dylib

dyld: Symbol not found: _pwritev
  Referenced from: /usr/local/pgsql/bin/postgres
  Expected in: /usr/lib/libSystem.B.dylib

child process was terminated by signal 6: Abort trap: 6

To fix this we set -Werror=unguarded-availability-new so that a declaration
check for preadv/pwritev will fail if the symbol is unavailable on the requested
SDK version.
---
Changes v2 -> v3:
  - Replace compile check with AC_CHECK_DECLS
  - Fix preadv detection as well
Changes v1 -> v2:
  - Add AC_LIBOBJ(pwritev) when pwritev not available
  - set -Werror=unguarded-availability-new for CXX flags as well
---
 configure                   | 164 ++++++++++++++++++++++++++++++------
 configure.ac                |   9 +-
 src/include/pg_config.h.in  |  14 +--
 src/include/port/pg_iovec.h |   4 +-
 src/tools/msvc/Solution.pm  |   4 +-
 5 files changed, 157 insertions(+), 38 deletions(-)

diff --git a/configure b/configure
index 8af4b99021..07a9b08d80 100755
--- a/configure
+++ b/configure
@@ -5373,6 +5373,98 @@ if test x"$pgac_cv_prog_CC_cflags__Werror_vla" = x"yes"; then
 fi
 
 
+  # Prevent usage of symbols marked as newer than our target.
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -Werror=unguarded-availability-new, for CFLAGS" >&5
+$as_echo_n "checking whether ${CC} supports -Werror=unguarded-availability-new, for CFLAGS... " >&6; }
+if ${pgac_cv_prog_CC_cflags__Werror_unguarded_availability_new+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  pgac_save_CFLAGS=$CFLAGS
+pgac_save_CC=$CC
+CC=${CC}
+CFLAGS="${CFLAGS} -Werror=unguarded-availability-new"
+ac_save_c_werror_flag=$ac_c_werror_flag
+ac_c_werror_flag=yes
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  pgac_cv_prog_CC_cflags__Werror_unguarded_availability_new=yes
+else
+  pgac_cv_prog_CC_cflags__Werror_unguarded_availability_new=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_c_werror_flag=$ac_save_c_werror_flag
+CFLAGS="$pgac_save_CFLAGS"
+CC="$pgac_save_CC"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CC_cflags__Werror_unguarded_availability_new" >&5
+$as_echo "$pgac_cv_prog_CC_cflags__Werror_unguarded_availability_new" >&6; }
+if test x"$pgac_cv_prog_CC_cflags__Werror_unguarded_availability_new" = x"yes"; then
+  CFLAGS="${CFLAGS} -Werror=unguarded-availability-new"
+fi
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -Werror=unguarded-availability-new, for CXXFLAGS" >&5
+$as_echo_n "checking whether ${CXX} supports -Werror=unguarded-availability-new, for CXXFLAGS... " >&6; }
+if ${pgac_cv_prog_CXX_cxxflags__Werror_unguarded_availability_new+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  pgac_save_CXXFLAGS=$CXXFLAGS
+pgac_save_CXX=$CXX
+CXX=${CXX}
+CXXFLAGS="${CXXFLAGS} -Werror=unguarded-availability-new"
+ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+ac_cxx_werror_flag=yes
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  pgac_cv_prog_CXX_cxxflags__Werror_unguarded_availability_new=yes
+else
+  pgac_cv_prog_CXX_cxxflags__Werror_unguarded_availability_new=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+CXXFLAGS="$pgac_save_CXXFLAGS"
+CXX="$pgac_save_CXX"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CXX_cxxflags__Werror_unguarded_availability_new" >&5
+$as_echo "$pgac_cv_prog_CXX_cxxflags__Werror_unguarded_availability_new" >&6; }
+if test x"$pgac_cv_prog_CXX_cxxflags__Werror_unguarded_availability_new" = x"yes"; then
+  CXXFLAGS="${CXXFLAGS} -Werror=unguarded-availability-new"
+fi
+
+
   # -Wvla is not applicable for C++
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -Wendif-labels, for CFLAGS" >&5
@@ -15646,6 +15738,52 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
+# AC_REPLACE_FUNCS does not respect the deployment target on macOS
+ac_fn_c_check_decl "$LINENO" "preadv" "ac_cv_have_decl_preadv" "#include <sys/uio.h>
+"
+if test "x$ac_cv_have_decl_preadv" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_PREADV $ac_have_decl
+_ACEOF
+if test $ac_have_decl = 1; then :
+
+else
+  case " $LIBOBJS " in
+  *" preadv.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS preadv.$ac_objext"
+ ;;
+esac
+
+fi
+
+ac_fn_c_check_decl "$LINENO" "pwritev" "ac_cv_have_decl_pwritev" "#include <sys/uio.h>
+"
+if test "x$ac_cv_have_decl_pwritev" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_PWRITEV $ac_have_decl
+_ACEOF
+if test $ac_have_decl = 1; then :
+
+else
+  case " $LIBOBJS " in
+  *" pwritev.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS pwritev.$ac_objext"
+ ;;
+esac
+
+fi
+
+
 ac_fn_c_check_decl "$LINENO" "RTLD_GLOBAL" "ac_cv_have_decl_RTLD_GLOBAL" "#include <dlfcn.h>
 "
 if test "x$ac_cv_have_decl_RTLD_GLOBAL" = xyes; then :
@@ -15845,19 +15983,6 @@ esac
 
 fi
 
-ac_fn_c_check_func "$LINENO" "preadv" "ac_cv_func_preadv"
-if test "x$ac_cv_func_preadv" = xyes; then :
-  $as_echo "#define HAVE_PREADV 1" >>confdefs.h
-
-else
-  case " $LIBOBJS " in
-  *" preadv.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS preadv.$ac_objext"
- ;;
-esac
-
-fi
-
 ac_fn_c_check_func "$LINENO" "pwrite" "ac_cv_func_pwrite"
 if test "x$ac_cv_func_pwrite" = xyes; then :
   $as_echo "#define HAVE_PWRITE 1" >>confdefs.h
@@ -15871,19 +15996,6 @@ esac
 
 fi
 
-ac_fn_c_check_func "$LINENO" "pwritev" "ac_cv_func_pwritev"
-if test "x$ac_cv_func_pwritev" = xyes; then :
-  $as_echo "#define HAVE_PWRITEV 1" >>confdefs.h
-
-else
-  case " $LIBOBJS " in
-  *" pwritev.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS pwritev.$ac_objext"
- ;;
-esac
-
-fi
-
 ac_fn_c_check_func "$LINENO" "random" "ac_cv_func_random"
 if test "x$ac_cv_func_random" = xyes; then :
   $as_echo "#define HAVE_RANDOM 1" >>confdefs.h
diff --git a/configure.ac b/configure.ac
index 868a94c9ba..0cd1ee8909 100644
--- a/configure.ac
+++ b/configure.ac
@@ -494,6 +494,9 @@ if test "$GCC" = yes -a "$ICC" = no; then
   AC_SUBST(PERMIT_DECLARATION_AFTER_STATEMENT)
   # Really don't want VLAs to be used in our dialect of C
   PGAC_PROG_CC_CFLAGS_OPT([-Werror=vla])
+  # Prevent usage of symbols marked as newer than our target.
+  PGAC_PROG_CC_CFLAGS_OPT([-Werror=unguarded-availability-new])
+  PGAC_PROG_CXX_CFLAGS_OPT([-Werror=unguarded-availability-new])
   # -Wvla is not applicable for C++
   PGAC_PROG_CC_CFLAGS_OPT([-Wendif-labels])
   PGAC_PROG_CXX_CFLAGS_OPT([-Wendif-labels])
@@ -1705,6 +1708,10 @@ AC_CHECK_DECLS([strlcat, strlcpy, strnlen])
 # This is probably only present on macOS, but may as well check always
 AC_CHECK_DECLS(F_FULLFSYNC, [], [], [#include <fcntl.h>])
 
+# AC_REPLACE_FUNCS does not respect the deployment target on macOS
+AC_CHECK_DECLS([preadv], [], [AC_LIBOBJ(preadv)], [#include <sys/uio.h>])
+AC_CHECK_DECLS([pwritev], [], [AC_LIBOBJ(pwritev)], [#include <sys/uio.h>])
+
 AC_CHECK_DECLS([RTLD_GLOBAL, RTLD_NOW], [], [], [#include <dlfcn.h>])
 
 AC_CHECK_TYPE([struct sockaddr_in6],
@@ -1737,9 +1744,7 @@ AC_REPLACE_FUNCS(m4_normalize([
  link
  mkdtemp
  pread
- preadv
  pwrite
- pwritev
  random
  srandom
  strlcat
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index f4d9f3b408..9c30d008c9 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -142,6 +142,14 @@
    don't. */
 #undef HAVE_DECL_POSIX_FADVISE
 
+/* Define to 1 if you have the declaration of `preadv', and to 0 if you don't.
+   */
+#undef HAVE_DECL_PREADV
+
+/* Define to 1 if you have the declaration of `pwritev', and to 0 if you
+   don't. */
+#undef HAVE_DECL_PWRITEV
+
 /* Define to 1 if you have the declaration of `RTLD_GLOBAL', and to 0 if you
    don't. */
 #undef HAVE_DECL_RTLD_GLOBAL
@@ -412,9 +420,6 @@
 /* Define to 1 if you have the `pread' function. */
 #undef HAVE_PREAD
 
-/* Define to 1 if you have the `preadv' function. */
-#undef HAVE_PREADV
-
 /* Define to 1 if you have the `pstat' function. */
 #undef HAVE_PSTAT
 
@@ -433,9 +438,6 @@
 /* Define to 1 if you have the `pwrite' function. */
 #undef HAVE_PWRITE
 
-/* Define to 1 if you have the `pwritev' function. */
-#undef HAVE_PWRITEV
-
 /* Define to 1 if you have the `random' function. */
 #undef HAVE_RANDOM
 
diff --git a/src/include/port/pg_iovec.h b/src/include/port/pg_iovec.h
index 365d605a9b..760ec4980c 100644
--- a/src/include/port/pg_iovec.h
+++ b/src/include/port/pg_iovec.h
@@ -39,13 +39,13 @@ struct iovec
 /* Define a reasonable maximum that is safe to use on the stack. */
 #define PG_IOV_MAX Min(IOV_MAX, 32)
 
-#ifdef HAVE_PREADV
+#if HAVE_DECL_PREADV
 #define pg_preadv preadv
 #else
 extern ssize_t pg_preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);
 #endif
 
-#ifdef HAVE_PWRITEV
+#if HAVE_DECL_PWRITEV
 #define pg_pwritev pwritev
 #else
 extern ssize_t pg_pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset);
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 2f28de0355..7c235f227d 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -329,14 +329,14 @@ sub GenerateFiles
  HAVE_PPC_LWARX_MUTEX_HINT   => undef,
  HAVE_PPOLL                  => undef,
  HAVE_PREAD                  => undef,
- HAVE_PREADV                 => undef,
+ HAVE_DECL_PREADV            => 0,
  HAVE_PSTAT                  => undef,
  HAVE_PS_STRINGS             => undef,
  HAVE_PTHREAD                => undef,
  HAVE_PTHREAD_IS_THREADED_NP => undef,
  HAVE_PTHREAD_PRIO_INHERIT   => undef,
  HAVE_PWRITE                 => undef,
- HAVE_PWRITEV                => undef,
+ HAVE_DECL_PWRITEV           => 0,
  HAVE_RANDOM                 => undef,
  HAVE_READLINE_H             => undef,
  HAVE_READLINE_HISTORY_H     => undef,
--
2.30.0



Reply | Threaded
Open this post in threaded view
|

Re: [PATCH v3 1/1] Fix detection of preadv/pwritev support for OSX.

James Hilliard
On Fri, Jan 22, 2021 at 12:32 PM James Hilliard
<[hidden email]> wrote:

>
> Fixes:
> gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -Wno-unused-command-line-argument -O2 -I../../../../src/include  -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk    -c -o fd.o fd.c
> fd.c:3661:10: warning: 'pwritev' is only available on macOS 11.0 or newer [-Wunguarded-availability-new]
>                 part = pg_pwritev(fd, iov, iovcnt, offset);
>                        ^~~~~~~~~~
> ../../../../src/include/port/pg_iovec.h:49:20: note: expanded from macro 'pg_pwritev'
>                    ^~~~~~~
> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk/usr/include/sys/uio.h:104:9: note: 'pwritev' has been marked as being introduced in macOS 11.0
>       here, but the deployment target is macOS 10.15.0
> ssize_t pwritev(int, const struct iovec *, int, off_t) __DARWIN_NOCANCEL(pwritev) __API_AVAILABLE(macos(11.0), ios(14.0), watchos(7.0), tvos(14.0));
>         ^
> fd.c:3661:10: note: enclose 'pwritev' in a __builtin_available check to silence this warning
>                 part = pg_pwritev(fd, iov, iovcnt, offset);
>                        ^~~~~~~~~~
> ../../../../src/include/port/pg_iovec.h:49:20: note: expanded from macro 'pg_pwritev'
>                    ^~~~~~~
> 1 warning generated.
>
> This results in a runtime error:
> running bootstrap script ... dyld: lazy symbol binding failed: Symbol not found: _pwritev
>   Referenced from: /usr/local/pgsql/bin/postgres
>   Expected in: /usr/lib/libSystem.B.dylib
>
> dyld: Symbol not found: _pwritev
>   Referenced from: /usr/local/pgsql/bin/postgres
>   Expected in: /usr/lib/libSystem.B.dylib
>
> child process was terminated by signal 6: Abort trap: 6
>
> To fix this we set -Werror=unguarded-availability-new so that a declaration
> check for preadv/pwritev will fail if the symbol is unavailable on the requested
> SDK version.
> ---
> Changes v2 -> v3:
>   - Replace compile check with AC_CHECK_DECLS
>   - Fix preadv detection as well
> Changes v1 -> v2:
>   - Add AC_LIBOBJ(pwritev) when pwritev not available
>   - set -Werror=unguarded-availability-new for CXX flags as well
> ---
>  configure                   | 164 ++++++++++++++++++++++++++++++------
>  configure.ac                |   9 +-
>  src/include/pg_config.h.in  |  14 +--
>  src/include/port/pg_iovec.h |   4 +-
>  src/tools/msvc/Solution.pm  |   4 +-
>  5 files changed, 157 insertions(+), 38 deletions(-)
>
> diff --git a/configure b/configure
> index 8af4b99021..07a9b08d80 100755
> --- a/configure
> +++ b/configure
> @@ -5373,6 +5373,98 @@ if test x"$pgac_cv_prog_CC_cflags__Werror_vla" = x"yes"; then
>  fi
>
>
> +  # Prevent usage of symbols marked as newer than our target.
> +
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -Werror=unguarded-availability-new, for CFLAGS" >&5
> +$as_echo_n "checking whether ${CC} supports -Werror=unguarded-availability-new, for CFLAGS... " >&6; }
> +if ${pgac_cv_prog_CC_cflags__Werror_unguarded_availability_new+:} false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  pgac_save_CFLAGS=$CFLAGS
> +pgac_save_CC=$CC
> +CC=${CC}
> +CFLAGS="${CFLAGS} -Werror=unguarded-availability-new"
> +ac_save_c_werror_flag=$ac_c_werror_flag
> +ac_c_werror_flag=yes
> +cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h.  */
> +
> +int
> +main ()
> +{
> +
> +  ;
> +  return 0;
> +}
> +_ACEOF
> +if ac_fn_c_try_compile "$LINENO"; then :
> +  pgac_cv_prog_CC_cflags__Werror_unguarded_availability_new=yes
> +else
> +  pgac_cv_prog_CC_cflags__Werror_unguarded_availability_new=no
> +fi
> +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> +ac_c_werror_flag=$ac_save_c_werror_flag
> +CFLAGS="$pgac_save_CFLAGS"
> +CC="$pgac_save_CC"
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CC_cflags__Werror_unguarded_availability_new" >&5
> +$as_echo "$pgac_cv_prog_CC_cflags__Werror_unguarded_availability_new" >&6; }
> +if test x"$pgac_cv_prog_CC_cflags__Werror_unguarded_availability_new" = x"yes"; then
> +  CFLAGS="${CFLAGS} -Werror=unguarded-availability-new"
> +fi
> +
> +
> +  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -Werror=unguarded-availability-new, for CXXFLAGS" >&5
> +$as_echo_n "checking whether ${CXX} supports -Werror=unguarded-availability-new, for CXXFLAGS... " >&6; }
> +if ${pgac_cv_prog_CXX_cxxflags__Werror_unguarded_availability_new+:} false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  pgac_save_CXXFLAGS=$CXXFLAGS
> +pgac_save_CXX=$CXX
> +CXX=${CXX}
> +CXXFLAGS="${CXXFLAGS} -Werror=unguarded-availability-new"
> +ac_save_cxx_werror_flag=$ac_cxx_werror_flag
> +ac_cxx_werror_flag=yes
> +ac_ext=cpp
> +ac_cpp='$CXXCPP $CPPFLAGS'
> +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
> +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
> +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
> +
> +cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h.  */
> +
> +int
> +main ()
> +{
> +
> +  ;
> +  return 0;
> +}
> +_ACEOF
> +if ac_fn_cxx_try_compile "$LINENO"; then :
> +  pgac_cv_prog_CXX_cxxflags__Werror_unguarded_availability_new=yes
> +else
> +  pgac_cv_prog_CXX_cxxflags__Werror_unguarded_availability_new=no
> +fi
> +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> +ac_ext=c
> +ac_cpp='$CPP $CPPFLAGS'
> +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
> +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
> +ac_compiler_gnu=$ac_cv_c_compiler_gnu
> +
> +ac_cxx_werror_flag=$ac_save_cxx_werror_flag
> +CXXFLAGS="$pgac_save_CXXFLAGS"
> +CXX="$pgac_save_CXX"
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CXX_cxxflags__Werror_unguarded_availability_new" >&5
> +$as_echo "$pgac_cv_prog_CXX_cxxflags__Werror_unguarded_availability_new" >&6; }
> +if test x"$pgac_cv_prog_CXX_cxxflags__Werror_unguarded_availability_new" = x"yes"; then
> +  CXXFLAGS="${CXXFLAGS} -Werror=unguarded-availability-new"
> +fi
> +
> +
>    # -Wvla is not applicable for C++
>
>  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -Wendif-labels, for CFLAGS" >&5
> @@ -15646,6 +15738,52 @@ cat >>confdefs.h <<_ACEOF
>  _ACEOF
>
>
> +# AC_REPLACE_FUNCS does not respect the deployment target on macOS
> +ac_fn_c_check_decl "$LINENO" "preadv" "ac_cv_have_decl_preadv" "#include <sys/uio.h>
> +"
> +if test "x$ac_cv_have_decl_preadv" = xyes; then :
> +  ac_have_decl=1
> +else
> +  ac_have_decl=0
> +fi
> +
> +cat >>confdefs.h <<_ACEOF
> +#define HAVE_DECL_PREADV $ac_have_decl
> +_ACEOF
> +if test $ac_have_decl = 1; then :
> +
> +else
> +  case " $LIBOBJS " in
> +  *" preadv.$ac_objext "* ) ;;
> +  *) LIBOBJS="$LIBOBJS preadv.$ac_objext"
> + ;;
> +esac
> +
> +fi
> +
> +ac_fn_c_check_decl "$LINENO" "pwritev" "ac_cv_have_decl_pwritev" "#include <sys/uio.h>
> +"
> +if test "x$ac_cv_have_decl_pwritev" = xyes; then :
> +  ac_have_decl=1
> +else
> +  ac_have_decl=0
> +fi
> +
> +cat >>confdefs.h <<_ACEOF
> +#define HAVE_DECL_PWRITEV $ac_have_decl
> +_ACEOF
> +if test $ac_have_decl = 1; then :
> +
> +else
> +  case " $LIBOBJS " in
> +  *" pwritev.$ac_objext "* ) ;;
> +  *) LIBOBJS="$LIBOBJS pwritev.$ac_objext"
> + ;;
> +esac
> +
> +fi
> +
> +
>  ac_fn_c_check_decl "$LINENO" "RTLD_GLOBAL" "ac_cv_have_decl_RTLD_GLOBAL" "#include <dlfcn.h>
>  "
>  if test "x$ac_cv_have_decl_RTLD_GLOBAL" = xyes; then :
> @@ -15845,19 +15983,6 @@ esac
>
>  fi
>
> -ac_fn_c_check_func "$LINENO" "preadv" "ac_cv_func_preadv"
> -if test "x$ac_cv_func_preadv" = xyes; then :
> -  $as_echo "#define HAVE_PREADV 1" >>confdefs.h
> -
> -else
> -  case " $LIBOBJS " in
> -  *" preadv.$ac_objext "* ) ;;
> -  *) LIBOBJS="$LIBOBJS preadv.$ac_objext"
> - ;;
> -esac
> -
> -fi
> -
>  ac_fn_c_check_func "$LINENO" "pwrite" "ac_cv_func_pwrite"
>  if test "x$ac_cv_func_pwrite" = xyes; then :
>    $as_echo "#define HAVE_PWRITE 1" >>confdefs.h
> @@ -15871,19 +15996,6 @@ esac
>
>  fi
>
> -ac_fn_c_check_func "$LINENO" "pwritev" "ac_cv_func_pwritev"
> -if test "x$ac_cv_func_pwritev" = xyes; then :
> -  $as_echo "#define HAVE_PWRITEV 1" >>confdefs.h
> -
> -else
> -  case " $LIBOBJS " in
> -  *" pwritev.$ac_objext "* ) ;;
> -  *) LIBOBJS="$LIBOBJS pwritev.$ac_objext"
> - ;;
> -esac
> -
> -fi
> -
>  ac_fn_c_check_func "$LINENO" "random" "ac_cv_func_random"
>  if test "x$ac_cv_func_random" = xyes; then :
>    $as_echo "#define HAVE_RANDOM 1" >>confdefs.h
> diff --git a/configure.ac b/configure.ac
> index 868a94c9ba..0cd1ee8909 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -494,6 +494,9 @@ if test "$GCC" = yes -a "$ICC" = no; then
>    AC_SUBST(PERMIT_DECLARATION_AFTER_STATEMENT)
>    # Really don't want VLAs to be used in our dialect of C
>    PGAC_PROG_CC_CFLAGS_OPT([-Werror=vla])
> +  # Prevent usage of symbols marked as newer than our target.
> +  PGAC_PROG_CC_CFLAGS_OPT([-Werror=unguarded-availability-new])
> +  PGAC_PROG_CXX_CFLAGS_OPT([-Werror=unguarded-availability-new])
>    # -Wvla is not applicable for C++
>    PGAC_PROG_CC_CFLAGS_OPT([-Wendif-labels])
>    PGAC_PROG_CXX_CFLAGS_OPT([-Wendif-labels])
> @@ -1705,6 +1708,10 @@ AC_CHECK_DECLS([strlcat, strlcpy, strnlen])
>  # This is probably only present on macOS, but may as well check always
>  AC_CHECK_DECLS(F_FULLFSYNC, [], [], [#include <fcntl.h>])
>
> +# AC_REPLACE_FUNCS does not respect the deployment target on macOS
> +AC_CHECK_DECLS([preadv], [], [AC_LIBOBJ(preadv)], [#include <sys/uio.h>])
> +AC_CHECK_DECLS([pwritev], [], [AC_LIBOBJ(pwritev)], [#include <sys/uio.h>])
Does this approach using a different standard autoconf probe adequately address
the maintainability issue regarding the AC_LANG_PROGRAM autoconf probes in my
previous patch brought up in https://postgr.es/m/915981.1611254324@...
or should I look for another alternative?

> +
>  AC_CHECK_DECLS([RTLD_GLOBAL, RTLD_NOW], [], [], [#include <dlfcn.h>])
>
>  AC_CHECK_TYPE([struct sockaddr_in6],
> @@ -1737,9 +1744,7 @@ AC_REPLACE_FUNCS(m4_normalize([
>         link
>         mkdtemp
>         pread
> -       preadv
>         pwrite
> -       pwritev
>         random
>         srandom
>         strlcat
> diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
> index f4d9f3b408..9c30d008c9 100644
> --- a/src/include/pg_config.h.in
> +++ b/src/include/pg_config.h.in
> @@ -142,6 +142,14 @@
>     don't. */
>  #undef HAVE_DECL_POSIX_FADVISE
>
> +/* Define to 1 if you have the declaration of `preadv', and to 0 if you don't.
> +   */
> +#undef HAVE_DECL_PREADV
> +
> +/* Define to 1 if you have the declaration of `pwritev', and to 0 if you
> +   don't. */
> +#undef HAVE_DECL_PWRITEV
> +
>  /* Define to 1 if you have the declaration of `RTLD_GLOBAL', and to 0 if you
>     don't. */
>  #undef HAVE_DECL_RTLD_GLOBAL
> @@ -412,9 +420,6 @@
>  /* Define to 1 if you have the `pread' function. */
>  #undef HAVE_PREAD
>
> -/* Define to 1 if you have the `preadv' function. */
> -#undef HAVE_PREADV
> -
>  /* Define to 1 if you have the `pstat' function. */
>  #undef HAVE_PSTAT
>
> @@ -433,9 +438,6 @@
>  /* Define to 1 if you have the `pwrite' function. */
>  #undef HAVE_PWRITE
>
> -/* Define to 1 if you have the `pwritev' function. */
> -#undef HAVE_PWRITEV
> -
>  /* Define to 1 if you have the `random' function. */
>  #undef HAVE_RANDOM
>
> diff --git a/src/include/port/pg_iovec.h b/src/include/port/pg_iovec.h
> index 365d605a9b..760ec4980c 100644
> --- a/src/include/port/pg_iovec.h
> +++ b/src/include/port/pg_iovec.h
> @@ -39,13 +39,13 @@ struct iovec
>  /* Define a reasonable maximum that is safe to use on the stack. */
>  #define PG_IOV_MAX Min(IOV_MAX, 32)
>
> -#ifdef HAVE_PREADV
> +#if HAVE_DECL_PREADV
I could rework this to use HAVE_PWRITEV like before if that is
preferable, I just
went with this since it is the default for AC_CHECK_DECLS.

>  #define pg_preadv preadv
>  #else
>  extern ssize_t pg_preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);
>  #endif
>
> -#ifdef HAVE_PWRITEV
> +#if HAVE_DECL_PWRITEV
>  #define pg_pwritev pwritev
>  #else
>  extern ssize_t pg_pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset);
> diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
> index 2f28de0355..7c235f227d 100644
> --- a/src/tools/msvc/Solution.pm
> +++ b/src/tools/msvc/Solution.pm
> @@ -329,14 +329,14 @@ sub GenerateFiles
>                 HAVE_PPC_LWARX_MUTEX_HINT   => undef,
>                 HAVE_PPOLL                  => undef,
>                 HAVE_PREAD                  => undef,
> -               HAVE_PREADV                 => undef,
> +               HAVE_DECL_PREADV            => 0,
>                 HAVE_PSTAT                  => undef,
>                 HAVE_PS_STRINGS             => undef,
>                 HAVE_PTHREAD                => undef,
>                 HAVE_PTHREAD_IS_THREADED_NP => undef,
>                 HAVE_PTHREAD_PRIO_INHERIT   => undef,
>                 HAVE_PWRITE                 => undef,
> -               HAVE_PWRITEV                => undef,
> +               HAVE_DECL_PWRITEV           => 0,
>                 HAVE_RANDOM                 => undef,
>                 HAVE_READLINE_H             => undef,
>                 HAVE_READLINE_HISTORY_H     => undef,
> --
> 2.30.0
>