This is an automated email from the ASF dual-hosted git repository.

mgreber pushed a commit to branch branch-1.18.x
in repository https://gitbox.apache.org/repos/asf/kudu.git

commit 54c604e4de9e23b6530ff1f3d9cfa848a1056298
Author: Jeffrey Smith <[email protected]>
AuthorDate: Sat Jul 19 14:24:55 2025 -0400

    KUDU-3678: Fix PostgreSQL build on MacOS 15
    
    This pulls in a slightly modified patch from postgres to fix detection
    of strchrnul() in MacOS 15. MacOS 15.4 now has that function, but
    only when MACOSX_DEPLOYMENT_TARGET >= 15.4. Postgres' current
    deployment target is 15.0, causing the build to fail.
    
    Change-Id: Idb27f2d401360da69a6d49b5f33fd472c7083065
    Reviewed-on: http://gerrit.cloudera.org:8080/23197
    Tested-by: Alexey Serbin <[email protected]>
    Reviewed-by: Alexey Serbin <[email protected]>
    (cherry picked from commit 3e93df43ae1b9bfff21af6dd8a0c5c0d43202cf0)
    Reviewed-on: http://gerrit.cloudera.org:8080/23200
    Reviewed-by: Marton Greber <[email protected]>
    Tested-by: Marton Greber <[email protected]>
---
 thirdparty/download-thirdparty.sh                  |   6 +-
 .../postgres-fix-strchrnul-macos-check.patch       | 214 +++++++++++++++++++++
 2 files changed, 218 insertions(+), 2 deletions(-)

diff --git a/thirdparty/download-thirdparty.sh 
b/thirdparty/download-thirdparty.sh
index 6984b1824..2029a3e8e 100755
--- a/thirdparty/download-thirdparty.sh
+++ b/thirdparty/download-thirdparty.sh
@@ -460,13 +460,15 @@ fetch_and_patch \
  $GUMBO_QUERY_PATCHLEVEL \
  "patch -p1 < $TP_DIR/patches/gumbo-query-namespace.patch"
 
-POSTGRES_PATCHLEVEL=1
+POSTGRES_PATCHLEVEL=2
 fetch_and_patch \
  $POSTGRES_NAME.tar.gz \
  $POSTGRES_SOURCE \
  $POSTGRES_PATCHLEVEL \
  "patch -p0 < $TP_DIR/patches/postgres-root-can-run-initdb.patch" \
- "patch -p0 < $TP_DIR/patches/postgres-no-check-root.patch"
+ "patch -p0 < $TP_DIR/patches/postgres-no-check-root.patch" \
+ "patch -p1 < $TP_DIR/patches/postgres-fix-strchrnul-macos-check.patch"
+
 
 POSTGRES_JDBC_PATCHLEVEL=0
 fetch_and_patch \
diff --git a/thirdparty/patches/postgres-fix-strchrnul-macos-check.patch 
b/thirdparty/patches/postgres-fix-strchrnul-macos-check.patch
new file mode 100644
index 000000000..fce778249
--- /dev/null
+++ b/thirdparty/patches/postgres-fix-strchrnul-macos-check.patch
@@ -0,0 +1,214 @@
+From 6da2ba1d8a031984eb016fed6741bb2ac945f19d Mon Sep 17 00:00:00 2001
+From: Tom Lane <[email protected]>
+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 <[email protected]>
+Co-authored-by: Peter Eisentraut <[email protected]>
+Discussion: https://postgr.es/m/[email protected]
+Backpatch-through: 13
+---
+ configure                  | 14 +++++++++++++-
+ configure.ac               |  2 +-
+ meson.build                | 21 ++++++++++++++++++---
+ src/include/pg_config.h.in |  7 ++++---
+ src/port/snprintf.c        | 29 +++++++++++++----------------
+ 5 files changed, 49 insertions(+), 24 deletions(-)
+
+diff --git a/configure b/configure
+index 30d949c3c4660..3d0e701c74513 100755
+--- a/configure        2025-07-18 15:13:39
++++ b/configure        2025-07-18 15:13:57
+@@ -15263,7 +15263,7 @@
+ LIBS_including_readline="$LIBS"
+ LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
+ 
+-for ac_func in backtrace_symbols copyfile copy_file_range getifaddrs 
getpeerucred inet_pton kqueue 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 :
+   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ 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
+ _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
+ ac_fn_c_check_decl "$LINENO" "F_FULLFSYNC" "ac_cv_have_decl_F_FULLFSYNC" 
"#include <fcntl.h>
+diff --git a/configure.ac b/configure.ac
+index 25cdfcf65af71..47a287926bc5d 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1772,7 +1772,6 @@ AC_CHECK_FUNCS(m4_normalize([
+       pthread_is_threaded_np
+       setproctitle
+       setproctitle_fast
+-      strchrnul
+       strsignal
+       syncfs
+       sync_file_range
+@@ -1812,6 +1811,7 @@ AC_CHECK_DECLS([strlcat, strlcpy, strnlen, strsep])
+ # won't handle deployment target restrictions on macOS
+ AC_CHECK_DECLS([preadv], [], [], [#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
+ AC_CHECK_DECLS(F_FULLFSYNC, [], [], [#include <fcntl.h>])
+diff --git a/meson.build b/meson.build
+index b8da4966297d8..ba7916d149337 100644
+--- a/meson.build
++++ b/meson.build
+@@ -2577,6 +2577,7 @@ decl_checks = [
+ decl_checks += [
+   ['preadv', 'sys/uio.h'],
+   ['pwritev', 'sys/uio.h'],
++  ['strchrnul', 'string.h'],
+ ]
+ 
+ # Check presence of some optional LLVM functions.
+@@ -2593,8 +2594,23 @@ foreach c : decl_checks
+   args = c.get(2, {})
+   varname = 'HAVE_DECL_' + func.underscorify().to_upper()
+ 
+-  found = cc.has_header_symbol(header, func,
+-    args: test_c_args, include_directories: postgres_inc,
++  found = cc.compiles('''
++#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)
+   cdata.set10(varname, found, description:
+ '''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}],
+   ['shmget', {'dependencies': [cygipc_dep], 'define': false}],
+   ['socket', {'dependencies': [socket_dep], 'define': false}],
+-  ['strchrnul'],
+   ['strerror_r', {'dependencies': [thread_dep]}],
+   ['strlcat'],
+   ['strlcpy'],
+diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
+index 92f0616c4007f..2ac6157588369 100644
+--- a/src/include/pg_config.h.in
++++ b/src/include/pg_config.h.in
+@@ -103,6 +103,10 @@
+    don't. */
+ #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
+    don't. */
+ #undef HAVE_DECL_STRLCAT
+@@ -373,9 +377,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 f8f2018ea0c14..d7f18b42d19ac 100644
+--- a/src/port/snprintf.c
++++ b/src/port/snprintf.c
+@@ -338,13 +338,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)
+@@ -354,19 +363,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 */
+ 
+ 
+ /*
+

Reply via email to