On Tue, Jan 19, 2021 at 10:29 AM Tom Lane <t...@sss.pgh.pa.us> wrote: > > James Hilliard <james.hillia...@gmail.com> writes: > > Fixes: > > fd.c:3661:10: warning: 'pwritev' is only available on macOS 11.0 or newer > > [-Wunguarded-availability-new] > > It's still missing preadv, and it still has nonzero chance of breaking > successful detection of pwritev on platforms other than yours, and it's > still really ugly. Setting -Werror=unguarded-availability-new should in theory always ensure that configure checks fail if the symbol is unavailable or marked as requiring a target newer than the MACOSX_DEPLOYMENT_TARGET. > > But the main reason I don't want to go this way is that I don't think > it'll stop with preadv/pwritev. If we make it our job to build > successfully even when using the wrong SDK version for the target > platform, we're going to be in for more and more pain with other > kernel APIs. This issue really has nothing to do with the SDK version at all, it's the MACOSX_DEPLOYMENT_TARGET that matters which must be taken into account during configure in some way, this is what my patch does by triggering the pwritev compile test error by setting -Werror=unguarded-availability-new.
It's expected that MACOSX_DEPLOYMENT_TARGET=10.15 with a MacOSX11.1.sdk will produce a binary that can run on OSX 10.15. The MacOSX11.1.sdk is not the wrong SDK for a 10.15 target and is fully capable of producing 10.15 compatible binaries. > > We could, of course, do what Apple wants us to do and try to build > executables that work across versions. I do not intend to put up > with the sort of invasive, error-prone source-code-level runtime test > they recommend ... but given that there is weak linking involved here, > I wonder if there is a way to silently sub in src/port/pwritev.c > when executing on a pre-11 macOS, by dint of marking it a weak > symbol? The check I added is strictly a compile time check still, not runtime. I also don't think this is a weak symbol. >From the header file it is not have __attribute__((weak_import)): 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)); > > regards, tom lane