mirror of
https://github.com/postgres/postgres.git
synced 2025-04-18 13:44:19 +03:00
Fix detection and handling of strchrnul() for macOS 15.4.
As of 15.4, macOS has strchrnul(), but access to it is blocked behind a check for MACOSX_DEPLOYMENT_TARGET >= 15.4. But our does-it-link configure check finds it, so we try to use it, and fail with the present default deployment target (namely 15.0). This accounts for today's buildfarm failures on indri and sifaka. This is the identical problem that we faced some years ago when Apple introduced preadv and pwritev in the same way. We solved that in commit f014b1b9b by using AC_CHECK_DECLS instead of AC_CHECK_FUNCS to check the functions' availability. So do the same now for strchrnul(). Interestingly, we already had a workaround for "the link check doesn't agree with <string.h>" cases with glibc, which we no longer need since only the header declaration is being checked. Testing this revealed that the meson version of this check has never worked, because it failed to use "-Werror=unguarded-availability-new". (Apparently nobody's tried to build with meson on macOS versions that lack preadv/pwritev as standard.) Adjust that while at it. Also, we had never put support for "-Werror=unguarded-availability-new" into v13, but we need that now. Co-authored-by: Tom Lane <tgl@sss.pgh.pa.us> Co-authored-by: Peter Eisentraut <peter@eisentraut.org> Discussion: https://postgr.es/m/385134.1743523038@sss.pgh.pa.us Backpatch-through: 13
This commit is contained in:
parent
c313fa4602
commit
6da2ba1d8a
14
configure
vendored
14
configure
vendored
@ -15401,7 +15401,7 @@ fi
|
|||||||
LIBS_including_readline="$LIBS"
|
LIBS_including_readline="$LIBS"
|
||||||
LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
|
LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
|
||||||
|
|
||||||
for ac_func in backtrace_symbols copyfile copy_file_range elf_aux_info getauxval getifaddrs getpeerucred inet_pton kqueue localeconv_l mbstowcs_l memset_s posix_fallocate ppoll pthread_is_threaded_np setproctitle setproctitle_fast strchrnul strsignal syncfs sync_file_range uselocale wcstombs_l
|
for ac_func in backtrace_symbols copyfile copy_file_range elf_aux_info getauxval getifaddrs getpeerucred inet_pton kqueue localeconv_l mbstowcs_l memset_s posix_fallocate ppoll pthread_is_threaded_np setproctitle setproctitle_fast strsignal syncfs sync_file_range uselocale wcstombs_l
|
||||||
do :
|
do :
|
||||||
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||||
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
|
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
|
||||||
@ -15955,6 +15955,18 @@ cat >>confdefs.h <<_ACEOF
|
|||||||
#define HAVE_DECL_PWRITEV $ac_have_decl
|
#define HAVE_DECL_PWRITEV $ac_have_decl
|
||||||
_ACEOF
|
_ACEOF
|
||||||
|
|
||||||
|
ac_fn_c_check_decl "$LINENO" "strchrnul" "ac_cv_have_decl_strchrnul" "#include <string.h>
|
||||||
|
"
|
||||||
|
if test "x$ac_cv_have_decl_strchrnul" = xyes; then :
|
||||||
|
ac_have_decl=1
|
||||||
|
else
|
||||||
|
ac_have_decl=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define HAVE_DECL_STRCHRNUL $ac_have_decl
|
||||||
|
_ACEOF
|
||||||
|
|
||||||
|
|
||||||
# This is probably only present on macOS, but may as well check always
|
# This is probably only present on macOS, but may as well check always
|
||||||
ac_fn_c_check_decl "$LINENO" "F_FULLFSYNC" "ac_cv_have_decl_F_FULLFSYNC" "#include <fcntl.h>
|
ac_fn_c_check_decl "$LINENO" "F_FULLFSYNC" "ac_cv_have_decl_F_FULLFSYNC" "#include <fcntl.h>
|
||||||
|
@ -1772,7 +1772,6 @@ AC_CHECK_FUNCS(m4_normalize([
|
|||||||
pthread_is_threaded_np
|
pthread_is_threaded_np
|
||||||
setproctitle
|
setproctitle
|
||||||
setproctitle_fast
|
setproctitle_fast
|
||||||
strchrnul
|
|
||||||
strsignal
|
strsignal
|
||||||
syncfs
|
syncfs
|
||||||
sync_file_range
|
sync_file_range
|
||||||
@ -1812,6 +1811,7 @@ AC_CHECK_DECLS([strlcat, strlcpy, strnlen, strsep])
|
|||||||
# won't handle deployment target restrictions on macOS
|
# won't handle deployment target restrictions on macOS
|
||||||
AC_CHECK_DECLS([preadv], [], [], [#include <sys/uio.h>])
|
AC_CHECK_DECLS([preadv], [], [], [#include <sys/uio.h>])
|
||||||
AC_CHECK_DECLS([pwritev], [], [], [#include <sys/uio.h>])
|
AC_CHECK_DECLS([pwritev], [], [], [#include <sys/uio.h>])
|
||||||
|
AC_CHECK_DECLS([strchrnul], [], [], [#include <string.h>])
|
||||||
|
|
||||||
# This is probably only present on macOS, but may as well check always
|
# This is probably only present on macOS, but may as well check always
|
||||||
AC_CHECK_DECLS(F_FULLFSYNC, [], [], [#include <fcntl.h>])
|
AC_CHECK_DECLS(F_FULLFSYNC, [], [], [#include <fcntl.h>])
|
||||||
|
21
meson.build
21
meson.build
@ -2577,6 +2577,7 @@ decl_checks = [
|
|||||||
decl_checks += [
|
decl_checks += [
|
||||||
['preadv', 'sys/uio.h'],
|
['preadv', 'sys/uio.h'],
|
||||||
['pwritev', 'sys/uio.h'],
|
['pwritev', 'sys/uio.h'],
|
||||||
|
['strchrnul', 'string.h'],
|
||||||
]
|
]
|
||||||
|
|
||||||
# Check presence of some optional LLVM functions.
|
# Check presence of some optional LLVM functions.
|
||||||
@ -2593,8 +2594,23 @@ foreach c : decl_checks
|
|||||||
args = c.get(2, {})
|
args = c.get(2, {})
|
||||||
varname = 'HAVE_DECL_' + func.underscorify().to_upper()
|
varname = 'HAVE_DECL_' + func.underscorify().to_upper()
|
||||||
|
|
||||||
found = cc.has_header_symbol(header, func,
|
found = cc.compiles('''
|
||||||
args: test_c_args, include_directories: postgres_inc,
|
#include <@0@>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
#ifndef @1@
|
||||||
|
(void) @1@;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
'''.format(header, func),
|
||||||
|
name: 'test whether @0@ is declared'.format(func),
|
||||||
|
# need to add cflags_warn to get at least
|
||||||
|
# -Werror=unguarded-availability-new if applicable
|
||||||
|
args: test_c_args + cflags_warn,
|
||||||
|
include_directories: postgres_inc,
|
||||||
kwargs: args)
|
kwargs: args)
|
||||||
cdata.set10(varname, found, description:
|
cdata.set10(varname, found, description:
|
||||||
'''Define to 1 if you have the declaration of `@0@', and to 0 if you
|
'''Define to 1 if you have the declaration of `@0@', and to 0 if you
|
||||||
@ -2802,7 +2818,6 @@ func_checks = [
|
|||||||
['shm_unlink', {'dependencies': [rt_dep], 'define': false}],
|
['shm_unlink', {'dependencies': [rt_dep], 'define': false}],
|
||||||
['shmget', {'dependencies': [cygipc_dep], 'define': false}],
|
['shmget', {'dependencies': [cygipc_dep], 'define': false}],
|
||||||
['socket', {'dependencies': [socket_dep], 'define': false}],
|
['socket', {'dependencies': [socket_dep], 'define': false}],
|
||||||
['strchrnul'],
|
|
||||||
['strerror_r', {'dependencies': [thread_dep]}],
|
['strerror_r', {'dependencies': [thread_dep]}],
|
||||||
['strlcat'],
|
['strlcat'],
|
||||||
['strlcpy'],
|
['strlcpy'],
|
||||||
|
@ -103,6 +103,10 @@
|
|||||||
don't. */
|
don't. */
|
||||||
#undef HAVE_DECL_PWRITEV
|
#undef HAVE_DECL_PWRITEV
|
||||||
|
|
||||||
|
/* Define to 1 if you have the declaration of `strchrnul', and to 0 if you
|
||||||
|
don't. */
|
||||||
|
#undef HAVE_DECL_STRCHRNUL
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `strlcat', and to 0 if you
|
/* Define to 1 if you have the declaration of `strlcat', and to 0 if you
|
||||||
don't. */
|
don't. */
|
||||||
#undef HAVE_DECL_STRLCAT
|
#undef HAVE_DECL_STRLCAT
|
||||||
@ -373,9 +377,6 @@
|
|||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||||
#undef HAVE_STDLIB_H
|
#undef HAVE_STDLIB_H
|
||||||
|
|
||||||
/* Define to 1 if you have the `strchrnul' function. */
|
|
||||||
#undef HAVE_STRCHRNUL
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strerror_r' function. */
|
/* Define to 1 if you have the `strerror_r' function. */
|
||||||
#undef HAVE_STRERROR_R
|
#undef HAVE_STRERROR_R
|
||||||
|
|
||||||
|
@ -338,13 +338,22 @@ static void leading_pad(int zpad, int signvalue, int *padlen,
|
|||||||
static void trailing_pad(int padlen, PrintfTarget *target);
|
static void trailing_pad(int padlen, PrintfTarget *target);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If strchrnul exists (it's a glibc-ism), it's a good bit faster than the
|
* If strchrnul exists (it's a glibc-ism, but since adopted by some other
|
||||||
* equivalent manual loop. If it doesn't exist, provide a replacement.
|
* platforms), it's a good bit faster than the equivalent manual loop.
|
||||||
|
* Use it if possible, and if it doesn't exist, use this replacement.
|
||||||
*
|
*
|
||||||
* Note: glibc declares this as returning "char *", but that would require
|
* Note: glibc declares this as returning "char *", but that would require
|
||||||
* casting away const internally, so we don't follow that detail.
|
* casting away const internally, so we don't follow that detail.
|
||||||
|
*
|
||||||
|
* Note: macOS has this too as of Sequoia 15.4, but it's hidden behind
|
||||||
|
* a deployment-target check that causes compile errors if the deployment
|
||||||
|
* target isn't high enough. So !HAVE_DECL_STRCHRNUL may mean "yes it's
|
||||||
|
* declared, but it doesn't compile". To avoid failing in that scenario,
|
||||||
|
* use a macro to avoid matching <string.h>'s name.
|
||||||
*/
|
*/
|
||||||
#ifndef HAVE_STRCHRNUL
|
#if !HAVE_DECL_STRCHRNUL
|
||||||
|
|
||||||
|
#define strchrnul pg_strchrnul
|
||||||
|
|
||||||
static inline const char *
|
static inline const char *
|
||||||
strchrnul(const char *s, int c)
|
strchrnul(const char *s, int c)
|
||||||
@ -354,19 +363,7 @@ strchrnul(const char *s, int c)
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#endif /* !HAVE_DECL_STRCHRNUL */
|
||||||
|
|
||||||
/*
|
|
||||||
* glibc's <string.h> declares strchrnul only if _GNU_SOURCE is defined.
|
|
||||||
* While we typically use that on glibc platforms, configure will set
|
|
||||||
* HAVE_STRCHRNUL whether it's used or not. Fill in the missing declaration
|
|
||||||
* so that this file will compile cleanly with or without _GNU_SOURCE.
|
|
||||||
*/
|
|
||||||
#ifndef _GNU_SOURCE
|
|
||||||
extern char *strchrnul(const char *s, int c);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* HAVE_STRCHRNUL */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user