Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1l1uHJ-0003fN-3H for pgsql-hackers@arkaria.postgresql.org; Tue, 19 Jan 2021 16:54:49 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1l1uHI-0003OO-01 for pgsql-hackers@arkaria.postgresql.org; Tue, 19 Jan 2021 16:54:48 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1l1uHH-0003OH-Ks for pgsql-hackers@lists.postgresql.org; Tue, 19 Jan 2021 16:54:47 +0000 Received: from mail-io1-xd2a.google.com ([2607:f8b0:4864:20::d2a]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1l1uHB-0003po-9O for pgsql-hackers@lists.postgresql.org; Tue, 19 Jan 2021 16:54:46 +0000 Received: by mail-io1-xd2a.google.com with SMTP id e22so40901858iom.5 for ; Tue, 19 Jan 2021 08:54:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=8sJyC0z9DKtI82PqsClQ5EP0lBh1UPmLWN+bnA2y41A=; b=VzG3TKKKmed1a9tmlzBpyAKvm8uYt1dhcCcdx0RWHH/d2k1TT3PvMQcMhmO47MefSg QU8HM4o7j4tFHWbwKydT4fIAX3opWXbM7U6+PaqONV2KnIKznGc1WgzcfHYPuMnAB3f+ AyKc0CSqu4q66GGCvEC38x8qdQ4UnpaEgv5t1mkEjNWr54eVmZdwuUWVZtdNVnq3fl/l peeE/ifUZ0QQUiZZ4EQucQvI8xfzaluHcRHI4pxiQChlecDx58hfBNPwZqpKaOMqfVVW U61lqQLlE93ouXIOmEQpL6XAJ6guTk55q24CrMvRgvjOJ9iNBOdSUiPCfuHGq79eOJJz TbyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=8sJyC0z9DKtI82PqsClQ5EP0lBh1UPmLWN+bnA2y41A=; b=klAiWFlLgm+/Q8kfiNHzkww1hby3gAyuoXFp7u4fBgjM0iMNHf1/PwHlWsaugvTHBr Pcmds+FjH4ACLHtSxlRzvkc8daye4HKZONpY+rWy0cSsLxdJWzYDmyyPLvDo1618O/2Q LoyMrMLr3JvoIjQOTZ0g4IHXcH118nJxVMiMB4a5en8HTU7RZODPYCXDf8KsSwv2TXSw Atahsggf16meNRtbJpTqq8N+PR9rhoO10X8iInif9Swd6L2oDHp3vh67wRjdgS20sMBO ezQ89PbBupzE75uHro03xArrsCADoc5l0iDAVzacWvu5pEB8tbiYblFuF6JBQY12PIC3 mSgA== X-Gm-Message-State: AOAM530C86KKhiPgRT9LbvchhkrdeFSmNXiDh1J9CO/xqxB47aMZyj4Z BYEa9lEQ8LPoyHYiq0f656ypGl+IKcw8Yg== X-Google-Smtp-Source: ABdhPJySGAvn1Z7W90oi66JQEpCgd3zl0QZfkZZ2Lgm7qROxQDDLVfMAPx4oD6H6DvQVLwDLwkrGnQ== X-Received: by 2002:a92:d24f:: with SMTP id v15mr4155189ilg.7.1611075280021; Tue, 19 Jan 2021 08:54:40 -0800 (PST) Received: from MacBook-Pro.localdomain (97-118-190-247.hlrn.qwest.net. [97.118.190.247]) by smtp.gmail.com with ESMTPSA id g9sm7394161ilp.49.2021.01.19.08.54.39 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Jan 2021 08:54:39 -0800 (PST) From: James Hilliard To: pgsql-hackers@lists.postgresql.org Cc: Tom Lane , Sergey Shinderuk , Thomas Munro , James Hilliard Subject: [PATCH v2 1/1] Fix detection of pwritev support for OSX. Date: Tue, 19 Jan 2021 09:54:35 -0700 Message-Id: <20210119165435.45411-1-james.hilliard1@gmail.com> X-Mailer: git-send-email 2.30.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk 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 compile test for pwritev will fail if the symbol is unavailable on the requested SDK version. --- Changes v1 -> v2: - Add AC_LIBOBJ(pwritev) when pwritev not available - set -Werror=unguarded-availability-new for CXX flags as well --- configure | 145 ++++++++++++++++++++++++++++++++++++++++++++++----- configure.ac | 21 +++++++- 2 files changed, 152 insertions(+), 14 deletions(-) diff --git a/configure b/configure index 8af4b99021..662b0ae9ce 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 @@ -15715,6 +15807,46 @@ $as_echo "#define HAVE_PS_STRINGS 1" >>confdefs.h fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pwritev" >&5 +$as_echo_n "checking for pwritev... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_UIO_H +#include +#endif +int +main () +{ +struct iovec *iov; +off_t offset; +offset = 0; +pwritev(0, iov, 0, offset); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +$as_echo "#define HAVE_PWRITEV 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +case " $LIBOBJS " in + *" pwritev.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS pwritev.$ac_objext" + ;; +esac + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : $as_echo "#define HAVE_DLOPEN 1" >>confdefs.h @@ -15871,19 +16003,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..724881a7f0 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]) @@ -1726,6 +1729,23 @@ if test "$pgac_cv_var_PS_STRINGS" = yes ; then AC_DEFINE([HAVE_PS_STRINGS], 1, [Define to 1 if the PS_STRINGS thing exists.]) fi +AC_MSG_CHECKING([for pwritev]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM( +[#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_UIO_H +#include +#endif], +[struct iovec *iov; +off_t offset; +offset = 0; +pwritev(0, iov, 0, offset); +])], [AC_MSG_RESULT(yes) +AC_DEFINE([HAVE_PWRITEV], 1, [Define to 1 if you have the `pwritev' function.])], +[AC_MSG_RESULT(no) +AC_LIBOBJ(pwritev)]) + AC_REPLACE_FUNCS(m4_normalize([ dlopen explicit_bzero @@ -1739,7 +1759,6 @@ AC_REPLACE_FUNCS(m4_normalize([ pread preadv pwrite - pwritev random srandom strlcat -- 2.30.0