Skip to content

Commit 71790ae

Browse files
tglsfdcpetere
andcommitted
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 f014b1b 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
1 parent 5ff8273 commit 71790ae

File tree

5 files changed

+32
-22
lines changed

5 files changed

+32
-22
lines changed

configure

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16037,7 +16037,7 @@ fi
1603716037
LIBS_including_readline="$LIBS"
1603816038
LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
1603916039

16040-
for ac_func in backtrace_symbols clock_gettime copyfile fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memset_s poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink readv setproctitle setproctitle_fast setsid shm_open strchrnul strsignal symlink syncfs sync_file_range uselocale wcstombs_l writev
16040+
for ac_func in backtrace_symbols clock_gettime copyfile fdatasync getifaddrs getpeerucred getrlimit kqueue mbstowcs_l memset_s poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink readv setproctitle setproctitle_fast setsid shm_open strsignal symlink syncfs sync_file_range uselocale wcstombs_l writev
1604116041
do :
1604216042
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
1604316043
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -16601,6 +16601,18 @@ esac
1660116601

1660216602
fi
1660316603

16604+
ac_fn_c_check_decl "$LINENO" "strchrnul" "ac_cv_have_decl_strchrnul" "#include <string.h>
16605+
"
16606+
if test "x$ac_cv_have_decl_strchrnul" = xyes; then :
16607+
ac_have_decl=1
16608+
else
16609+
ac_have_decl=0
16610+
fi
16611+
16612+
cat >>confdefs.h <<_ACEOF
16613+
#define HAVE_DECL_STRCHRNUL $ac_have_decl
16614+
_ACEOF
16615+
1660416616

1660516617
# This is probably only present on macOS, but may as well check always
1660616618
ac_fn_c_check_decl "$LINENO" "F_FULLFSYNC" "ac_cv_have_decl_F_FULLFSYNC" "#include <fcntl.h>

configure.ac

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1807,7 +1807,6 @@ AC_CHECK_FUNCS(m4_normalize([
18071807
setproctitle_fast
18081808
setsid
18091809
shm_open
1810-
strchrnul
18111810
strsignal
18121811
symlink
18131812
syncfs
@@ -1849,6 +1848,7 @@ AC_CHECK_DECLS([strlcat, strlcpy, strnlen])
18491848
# won't handle deployment target restrictions on macOS
18501849
AC_CHECK_DECLS([preadv], [], [AC_LIBOBJ(preadv)], [#include <sys/uio.h>])
18511850
AC_CHECK_DECLS([pwritev], [], [AC_LIBOBJ(pwritev)], [#include <sys/uio.h>])
1851+
AC_CHECK_DECLS([strchrnul], [], [], [#include <string.h>])
18521852

18531853
# This is probably only present on macOS, but may as well check always
18541854
AC_CHECK_DECLS(F_FULLFSYNC, [], [], [#include <fcntl.h>])

src/include/pg_config.h.in

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@
155155
don't. */
156156
#undef HAVE_DECL_RTLD_NOW
157157

158+
/* Define to 1 if you have the declaration of `strchrnul', and to 0 if you
159+
don't. */
160+
#undef HAVE_DECL_STRCHRNUL
161+
158162
/* Define to 1 if you have the declaration of `strlcat', and to 0 if you
159163
don't. */
160164
#undef HAVE_DECL_STRLCAT
@@ -523,9 +527,6 @@
523527
/* Define to 1 if you have the <stdlib.h> header file. */
524528
#undef HAVE_STDLIB_H
525529

526-
/* Define to 1 if you have the `strchrnul' function. */
527-
#undef HAVE_STRCHRNUL
528-
529530
/* Define to 1 if you have the `strerror_r' function. */
530531
#undef HAVE_STRERROR_R
531532

src/port/snprintf.c

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -348,13 +348,22 @@ static void leading_pad(int zpad, int signvalue, int *padlen,
348348
static void trailing_pad(int padlen, PrintfTarget *target);
349349

350350
/*
351-
* If strchrnul exists (it's a glibc-ism), it's a good bit faster than the
352-
* equivalent manual loop. If it doesn't exist, provide a replacement.
351+
* If strchrnul exists (it's a glibc-ism, but since adopted by some other
352+
* platforms), it's a good bit faster than the equivalent manual loop.
353+
* Use it if possible, and if it doesn't exist, use this replacement.
353354
*
354355
* Note: glibc declares this as returning "char *", but that would require
355356
* casting away const internally, so we don't follow that detail.
357+
*
358+
* Note: macOS has this too as of Sequoia 15.4, but it's hidden behind
359+
* a deployment-target check that causes compile errors if the deployment
360+
* target isn't high enough. So !HAVE_DECL_STRCHRNUL may mean "yes it's
361+
* declared, but it doesn't compile". To avoid failing in that scenario,
362+
* use a macro to avoid matching <string.h>'s name.
356363
*/
357-
#ifndef HAVE_STRCHRNUL
364+
#if !HAVE_DECL_STRCHRNUL
365+
366+
#define strchrnul pg_strchrnul
358367

359368
static inline const char *
360369
strchrnul(const char *s, int c)
@@ -364,19 +373,7 @@ strchrnul(const char *s, int c)
364373
return s;
365374
}
366375

367-
#else
368-
369-
/*
370-
* glibc's <string.h> declares strchrnul only if _GNU_SOURCE is defined.
371-
* While we typically use that on glibc platforms, configure will set
372-
* HAVE_STRCHRNUL whether it's used or not. Fill in the missing declaration
373-
* so that this file will compile cleanly with or without _GNU_SOURCE.
374-
*/
375-
#ifndef _GNU_SOURCE
376-
extern char *strchrnul(const char *s, int c);
377-
#endif
378-
379-
#endif /* HAVE_STRCHRNUL */
376+
#endif /* !HAVE_DECL_STRCHRNUL */
380377

381378

382379
/*

src/tools/msvc/Solution.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ sub GenerateFiles
248248
HAVE_DECL_PWRITEV => 0,
249249
HAVE_DECL_RTLD_GLOBAL => 0,
250250
HAVE_DECL_RTLD_NOW => 0,
251+
HAVE_DECL_STRCHRNUL => 0,
251252
HAVE_DECL_STRLCAT => 0,
252253
HAVE_DECL_STRLCPY => 0,
253254
HAVE_DECL_STRNLEN => 1,
@@ -367,7 +368,6 @@ sub GenerateFiles
367368
HAVE_SRANDOM => undef,
368369
HAVE_STDINT_H => 1,
369370
HAVE_STDLIB_H => 1,
370-
HAVE_STRCHRNUL => undef,
371371
HAVE_STRERROR_R => undef,
372372
HAVE_STRINGS_H => undef,
373373
HAVE_STRING_H => 1,

0 commit comments

Comments
 (0)