Re: [PATCH v3 1/1] Fix detection of preadv/pwritev support for OSX. - Mailing list pgsql-hackers
From | James Hilliard |
---|---|
Subject | Re: [PATCH v3 1/1] Fix detection of preadv/pwritev support for OSX. |
Date | |
Msg-id | CADvTj4pZy=BNW00dtOA5LTBDiSMo2bXaea_gh8UQSLOsn+mRNQ@mail.gmail.com Whole thread Raw |
In response to | [PATCH v3 1/1] Fix detection of preadv/pwritev support for OSX. (James Hilliard <james.hilliard1@gmail.com>) |
Responses |
Re: [PATCH v3 1/1] Fix detection of preadv/pwritev support for OSX.
|
List | pgsql-hackers |
On Fri, Jan 22, 2021 at 12:32 PM James Hilliard <james.hilliard1@gmail.com> 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@sss.pgh.pa.us 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 >
pgsql-hackers by date: