From ceefd491c7f0490515fadca2f3740cb24e3f449e Mon Sep 17 00:00:00 2001 From: Andrew Turner Date: Fri, 20 Oct 2023 16:45:06 +0100 Subject: [PATCH] tools/build: Support building with glibc 2.38 Ubuntu 23.10 uses glibc 2.38. This adds strlcpy and strlcmp so we need to remove them from the cross build environment. Reviewed by: jrtc27 (earlier version), arichardson Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D42303 --- tools/build/Makefile | 10 ++++++++-- tools/build/cross-build/include/linux/string.h | 3 +++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tools/build/Makefile b/tools/build/Makefile index a19d2bf64bc6..668a7198e228 100644 --- a/tools/build/Makefile +++ b/tools/build/Makefile @@ -196,9 +196,15 @@ SRCS+= strtonum.c merge.c heapsort.c reallocf.c SRCS+= rpmatch.c .if ${.MAKE.OS} == "Linux" -# On Linux, glibc does not provide strlcpy,strlcat or strmode. +# On Linux, glibc does not provide strmode. It only provides strlcpy +# and strlcat from glibc 2.38. .PATH: ${LIBC_SRCTOP}/string -SRCS+= strlcpy.c strlcat.c strmode.c +SRCS+= strmode.c +# Assume if strlcpy exists so does strlcat +_WITH_EXPLICIT_STRLCPY!= cat ${HOST_INCLUDE_ROOT}/strings.h ${HOST_INCLUDE_ROOT}/string.h | grep -c strlcpy || true +.if ${_WITH_EXPLICIT_STRLCPY} == 0 +SRCS+= strlcpy.c strlcat.c +.endif # On Linux, glibc provides ffs* but not fls* SRCS+= fls.c flsl.c flsll.c # Compile the fgetln/fgetwln/closefrom fallback code from libbsd: diff --git a/tools/build/cross-build/include/linux/string.h b/tools/build/cross-build/include/linux/string.h index 87347df1e9bf..8fac9e0fe083 100644 --- a/tools/build/cross-build/include/linux/string.h +++ b/tools/build/cross-build/include/linux/string.h @@ -47,8 +47,11 @@ #include __BEGIN_DECLS +#if !defined(__GLIBC__) || \ + (defined(__GLIBC__) && (!__GLIBC_PREREQ(2, 38) || !defined(_GNU_SOURCE))) size_t strlcpy(char *dst, const char *src, size_t siz); size_t strlcat(char *dst, const char *src, size_t siz); +#endif char *strnstr(const char *str, const char *find, size_t str_len); void strmode(mode_t mode, char *str);