external/postgresql/0001-Fix-detection-and-handling-of-strchrnul-for-macOS-15.patch.1 | 307 ++++++++++ external/postgresql/UnpackedTarball_postgresql.mk | 1 2 files changed, 308 insertions(+)
New commits: commit 66796473b8e2639e9ff2390663f3f2e4bd1d63be Author: Xisco Fauli <xiscofa...@libreoffice.org> AuthorDate: Mon Apr 7 11:09:01 2025 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Tue Apr 8 13:27:16 2025 +0200 postgresql: fix build with macOS 15.4 From https://github.com/postgres/postgres/commit/e4440a73c7ef5f19da9501eca06b61e252d392d0 Change-Id: If2d40ef5d4cced2cd72c401a2c103f55511dace5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183802 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-by: Patrick Luby <guibomac...@gmail.com> diff --git a/external/postgresql/0001-Fix-detection-and-handling-of-strchrnul-for-macOS-15.patch.1 b/external/postgresql/0001-Fix-detection-and-handling-of-strchrnul-for-macOS-15.patch.1 new file mode 100644 index 000000000000..142d8a4cc405 --- /dev/null +++ b/external/postgresql/0001-Fix-detection-and-handling-of-strchrnul-for-macOS-15.patch.1 @@ -0,0 +1,307 @@ +From e4440a73c7ef5f19da9501eca06b61e252d392d0 Mon Sep 17 00:00:00 2001 +From: Tom Lane <t...@sss.pgh.pa.us> +Date: Tue, 1 Apr 2025 16:49:51 -0400 +Subject: [PATCH] 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 <t...@sss.pgh.pa.us> +Co-authored-by: Peter Eisentraut <pe...@eisentraut.org> +Discussion: https://postgr.es/m/385134.1743523...@sss.pgh.pa.us +Backpatch-through: 13 +--- + configure | 110 ++++++++++++++++++++++++++++++++++++- + configure.in | 9 ++- + src/include/pg_config.h.in | 7 ++- + src/port/snprintf.c | 29 +++++----- + src/tools/msvc/Solution.pm | 2 +- + 5 files changed, 135 insertions(+), 22 deletions(-) + +diff --git a/configure b/configure +index 6b955aefd26..d44905b9d98 100755 +--- a/configure ++++ b/configure +@@ -5448,6 +5448,98 @@ if test x"$pgac_cv_prog_CC_cflags__Werror_vla" = x"yes"; then + fi + + ++ # On macOS, complain about usage of symbols newer than the deployment 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 +@@ -15697,7 +15789,7 @@ fi + LIBS_including_readline="$LIBS" + LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'` + +-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 setproctitle setproctitle_fast setsid shm_open strchrnul strsignal symlink sync_file_range uselocale wcstombs_l ++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 setproctitle setproctitle_fast setsid shm_open strsignal symlink sync_file_range uselocale wcstombs_l + do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` + ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +@@ -16214,6 +16306,22 @@ cat >>confdefs.h <<_ACEOF + #define HAVE_DECL_STRNLEN $ac_have_decl + _ACEOF + ++ ++# We can't use AC_REPLACE_FUNCS to replace these functions, because it ++# won't handle deployment target restrictions on macOS ++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 + ac_fn_c_check_decl "$LINENO" "F_FULLFSYNC" "ac_cv_have_decl_F_FULLFSYNC" "#include <fcntl.h> + " +diff --git a/configure.in b/configure.in +index 98bd1379401..3fa1fe0416d 100644 +--- a/configure.in ++++ b/configure.in +@@ -511,6 +511,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]) ++ # On macOS, complain about usage of symbols newer than the deployment 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]) +@@ -1758,7 +1761,6 @@ AC_CHECK_FUNCS(m4_normalize([ + setproctitle_fast + setsid + shm_open +- strchrnul + strsignal + symlink + sync_file_range +@@ -1793,6 +1795,11 @@ AC_CHECK_DECLS(posix_fadvise, [], [], [#include <fcntl.h>]) + + AC_CHECK_DECLS(fdatasync, [], [], [#include <unistd.h>]) + AC_CHECK_DECLS([strlcat, strlcpy, strnlen]) ++ ++# We can't use AC_REPLACE_FUNCS to replace these functions, because it ++# won't handle deployment target restrictions on macOS ++AC_CHECK_DECLS([strchrnul], [], [], [#include <string.h>]) ++ + # This is probably only present on macOS, but may as well check always + AC_CHECK_DECLS(F_FULLFSYNC, [], [], [#include <fcntl.h>]) + +diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in +index 39f583667f2..d7c7ecd5e30 100644 +--- a/src/include/pg_config.h.in ++++ b/src/include/pg_config.h.in +@@ -147,6 +147,10 @@ + don't. */ + #undef HAVE_DECL_RTLD_NOW + ++/* 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 + don't. */ + #undef HAVE_DECL_STRLCAT +@@ -497,9 +501,6 @@ + /* Define to 1 if you have the <stdlib.h> header file. */ + #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. */ + #undef HAVE_STRERROR_R + +diff --git a/src/port/snprintf.c b/src/port/snprintf.c +index 54c96665bba..ba04ad146e4 100644 +--- a/src/port/snprintf.c ++++ b/src/port/snprintf.c +@@ -348,13 +348,22 @@ static void leading_pad(int zpad, int signvalue, int *padlen, + static void trailing_pad(int padlen, PrintfTarget *target); + + /* +- * If strchrnul exists (it's a glibc-ism), it's a good bit faster than the +- * equivalent manual loop. If it doesn't exist, provide a replacement. ++ * If strchrnul exists (it's a glibc-ism, but since adopted by some other ++ * 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 + * 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 * + strchrnul(const char *s, int c) +@@ -364,19 +373,7 @@ strchrnul(const char *s, int c) + return s; + } + +-#else +- +-/* +- * 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 */ ++#endif /* !HAVE_DECL_STRCHRNUL */ + + + /* +diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm +index 644e9060520..d0f406afbbd 100644 +--- a/src/tools/msvc/Solution.pm ++++ b/src/tools/msvc/Solution.pm +@@ -243,6 +243,7 @@ sub GenerateFiles + HAVE_DECL_POSIX_FADVISE => 0, + HAVE_DECL_RTLD_GLOBAL => 0, + HAVE_DECL_RTLD_NOW => 0, ++ HAVE_DECL_STRCHRNUL => 0, + HAVE_DECL_STRLCAT => 0, + HAVE_DECL_STRLCPY => 0, + HAVE_DECL_STRNLEN => 1, +@@ -356,7 +357,6 @@ sub GenerateFiles + HAVE_SRANDOM => undef, + HAVE_STDINT_H => 1, + HAVE_STDLIB_H => 1, +- HAVE_STRCHRNUL => undef, + HAVE_STRERROR_R => undef, + HAVE_STRINGS_H => undef, + HAVE_STRING_H => 1, +-- +2.39.5 + diff --git a/external/postgresql/UnpackedTarball_postgresql.mk b/external/postgresql/UnpackedTarball_postgresql.mk index 11fb603ef34f..fa97e1e13391 100644 --- a/external/postgresql/UnpackedTarball_postgresql.mk +++ b/external/postgresql/UnpackedTarball_postgresql.mk @@ -17,6 +17,7 @@ $(eval $(call gb_UnpackedTarball_add_patches,postgresql, \ external/postgresql/windows.patch.0 \ external/postgresql/postgresql.exit.patch.0 \ external/postgresql/postgres-msvc-build.patch.1 \ + external/postgresql/0001-Fix-detection-and-handling-of-strchrnul-for-macOS-15.patch.1 \ $(if $(filter WNT_AARCH64,$(OS)_$(CPUNAME)), external/postgresql/arm64.patch.1) \ ))