-# Copyright (C) 1991-2002, 2005-2008, 2009, 2010 Free Software Foundation, Inc.
+# Copyright (C) 1991-2024 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
-# License along with the GNU C Library; if not, write to the Free
-# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-# 02111-1307 USA.
+# License along with the GNU C Library; if not, see
+# <https://www.gnu.org/licenses/>.
#
# Sub-makefile for string portion of library.
#
subdir := string
-headers := string.h strings.h memory.h endian.h bits/endian.h \
- argz.h envz.h byteswap.h bits/byteswap.h bits/string.h \
- bits/string2.h bits/string3.h
-
-routines := strcat strchr strcmp strcoll strcpy strcspn \
- strverscmp strdup strndup \
- strerror _strerror strlen strnlen \
- strncat strncmp strncpy \
- strrchr strpbrk strsignal strspn strstr strtok \
- strtok_r strxfrm memchr memcmp memmove memset \
- mempcpy bcopy bzero ffs ffsll stpcpy stpncpy \
- strcasecmp strncase strcasecmp_l strncase_l \
- memccpy memcpy wordcopy strsep strcasestr \
- swab strfry memfrob memmem rawmemchr strchrnul \
- $(addprefix argz-,append count create ctsep next \
- delete extract insert stringify \
- addsep replace) \
- envz basename \
- strcoll_l strxfrm_l string-inlines memrchr \
- xpg-strerror strerror_l
-
-# Gcc internally generates calls to unbounded memcpy and memset
-# for -fbounded-pointer compiles. Glibc uses memchr for explicit checks.
-o-objects.ob := memcpy.o memset.o memchr.o
-
-strop-tests := memchr memcmp memcpy memmove mempcpy memset memccpy \
- stpcpy stpncpy strcat strchr strcmp strcpy strcspn \
- strlen strncmp strncpy strpbrk strrchr strspn memmem \
- strstr strcasestr strnlen
-tests := tester inl-tester noinl-tester testcopy test-ffs \
- tst-strlen stratcliff tst-svc tst-inlcall \
- bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \
- tst-strtok tst-strxfrm bug-strcoll1 tst-strfry \
- bug-strtok1 $(addprefix test-,$(strop-tests)) \
- bug-envz1 tst-strxfrm2 tst-endian tst-svc2
-distribute := memcopy.h pagecopy.h tst-svc.expect test-string.h \
- str-two-way.h
+include ../Makeconfig
+headers := \
+ argz.h \
+ bits/byteswap.h \
+ bits/endian.h \
+ bits/endianness.h \
+ bits/string_fortified.h \
+ bits/strings_fortified.h \
+ bits/uintn-identity.h \
+ byteswap.h \
+ endian.h \
+ envz.h \
+ memory.h \
+ string.h \
+ strings.h \
+# headers
+
+routines := \
+ _strerror \
+ argz-addsep \
+ argz-append \
+ argz-count \
+ argz-create \
+ argz-ctsep \
+ argz-delete \
+ argz-extract \
+ argz-insert \
+ argz-next \
+ argz-replace \
+ argz-stringify \
+ basename \
+ bcopy \
+ bzero \
+ envz \
+ explicit_bzero \
+ ffs \
+ ffsll \
+ memccpy \
+ memchr \
+ memcmp \
+ memcmpeq \
+ memcpy \
+ memfrob \
+ memmem \
+ memmove \
+ mempcpy \
+ memrchr \
+ memset \
+ rawmemchr \
+ sigabbrev_np \
+ sigdescr_np \
+ stpcpy \
+ stpncpy \
+ strcasecmp \
+ strcasecmp_l \
+ strcasestr \
+ strcat \
+ strchr \
+ strchrnul \
+ strcmp \
+ strcoll \
+ strcoll_l \
+ strcpy \
+ strcspn \
+ strdup \
+ strerror \
+ strerror_l \
+ strerrordesc_np \
+ strerrorname_np \
+ strfry \
+ string-inlines \
+ strlcat \
+ strlcpy \
+ strlen \
+ strncase \
+ strncase_l \
+ strncat \
+ strncmp \
+ strncpy \
+ strndup \
+ strnlen \
+ strpbrk \
+ strrchr \
+ strsep \
+ strsignal \
+ strspn \
+ strstr \
+ strtok \
+ strtok_r \
+ strverscmp \
+ strxfrm \
+ strxfrm_l \
+ swab \
+ wordcopy \
+ xpg-strerror \
+# routines
+
+# Exclude fortified routines from being built with _FORTIFY_SOURCE
+routines_no_fortify += \
+ explicit_bzero \
+ memcpy \
+ memmove \
+ mempcpy \
+ memset \
+ stpcpy \
+ stpncpy \
+ strcat \
+ strcpy \
+ strlcat \
+ strlcpy \
+ strncat \
+ strncpy \
+ # routines_no_fortify
+
+tests := \
+ bug-envz1 \
+ bug-strcoll1 \
+ bug-strcoll2 \
+ bug-strncat1 \
+ bug-strpbrk1 \
+ bug-strspn1 \
+ bug-strtok1 \
+ inl-tester \
+ noinl-tester \
+ stratcliff \
+ test-bcopy \
+ test-bzero \
+ test-endian-file-scope \
+ test-endian-sign-conversion \
+ test-endian-types \
+ test-explicit_bzero \
+ test-ffs \
+ test-memccpy \
+ test-memchr \
+ test-memcmp \
+ test-memcmpeq \
+ test-memcpy \
+ test-memcpy-large \
+ test-memmem \
+ test-memmove \
+ test-mempcpy \
+ test-memrchr \
+ test-memset \
+ test-rawmemchr \
+ test-sig_np \
+ test-stpcpy \
+ test-stpncpy \
+ test-strcasecmp \
+ test-strcasestr \
+ test-strcat \
+ test-strchr \
+ test-strchrnul \
+ test-strcmp \
+ test-strcpy \
+ test-strcspn \
+ test-strdup \
+ test-strlen \
+ test-strncasecmp \
+ test-strncat \
+ test-strncmp \
+ test-strncpy \
+ test-strndup \
+ test-strnlen \
+ test-strpbrk \
+ test-strrchr \
+ test-strspn \
+ test-strstr \
+ testcopy \
+ tester \
+ tst-bswap \
+ tst-cmp \
+ tst-endian \
+ tst-inlcall \
+ tst-memmove-overflow \
+ tst-strerror-fail \
+ tst-strfry \
+ tst-strlcat \
+ tst-strlcat2 \
+ tst-strlcpy \
+ tst-strlcpy2 \
+ tst-strlen \
+ tst-strtok \
+ tst-strtok_r \
+ tst-strxfrm \
+ tst-strxfrm2 \
+ tst-svc \
+ tst-svc2 \
+ tst-xbzero-opt \
+# tests
+
+tests-static-internal := \
+ test-memswap \
+# tests-static-internal
+
+tests-internal := \
+ $(tests-static-internal) \
+ # tests-internal
+
+tests-static := \
+ $(tests-static-internal) \
+ # tests-static
+
+# Both tests require the .mo translation files generated by msgfmt.
+tests-translation := \
+ tst-strerror \
+ tst-strsignal \
+# tests-translation
+
+tests-container += $(tests-translation)
+ifeq ($(MSGFMT),:)
+tests-unsupported += $(tests-translation)
+endif
+
+# This test allocates a lot of memory and can run for a long time.
+xtests = tst-strcoll-overflow
+
+# This test needs libdl.
+ifeq (yes,$(build-shared))
+tests += test-strerror-errno
+endif
+
+ifeq ($(run-built-tests),yes)
+tests-special += $(objpfx)tst-svc-cmp.out
+endif
include ../Rules
-tester-ENV = LANGUAGE=C
-inl-tester-ENV = LANGUAGE=C
-noinl-tester-ENV = LANGUAGE=C
-tst-strxfrm-ENV = LOCPATH=$(common-objpfx)localedata
-tst-strxfrm2-ENV = LOCPATH=$(common-objpfx)localedata
-bug-strcoll1-ENV = LOCPATH=$(common-objpfx)localedata
-CFLAGS-inl-tester.c = -fno-builtin
-CFLAGS-noinl-tester.c = -fno-builtin
-CFLAGS-tst-strlen.c = -fno-builtin
-CFLAGS-stratcliff.c = -fno-builtin
-CFLAGS-test-ffs.c = -fno-builtin
-CFLAGS-tst-inlcall.c = -fno-builtin
-
-ifeq ($(cross-compiling),no)
-tests: $(objpfx)tst-svc.out
-$(objpfx)tst-svc.out: tst-svc.input $(objpfx)tst-svc
- GCONV_PATH=$(common-objpfx)iconvdata LC_ALL=C \
- $(built-program-cmd) < $(word 1,$^) > $@
- @cmp tst-svc.expect $(objpfx)tst-svc.out
+CFLAGS-inl-tester.c += -fno-builtin
+CFLAGS-noinl-tester.c += -fno-builtin
+CFLAGS-tst-strlen.c += -fno-builtin
+CFLAGS-stratcliff.c += -fno-builtin
+CFLAGS-test-ffs.c += -fno-builtin
+CFLAGS-tst-inlcall.c += -fno-builtin
+CFLAGS-tst-xbzero-opt.c += -O3
+CFLAGS-test-endian-sign-conversion.c += -Werror -Wsign-conversion
+# BZ 21006: Resolve all functions but at least explicit_bzero at startup.
+# Otherwise the test fails on s390x as the memcpy in prepare_test_buffer is
+# done by loading r4 / r5 with the test_pattern and using store multiple
+# instruction to store r4 / r5 to buf. If explicit_bzero would be resolved in
+# setup_explicit_clear, r4 / r5 would be stored to stack by _dl_runtime_resolve
+# and the call to memmem in count_test_patterns will find a hit of the
+# test_pattern on the stack.
+LDFLAGS-tst-xbzero-opt = -z now
+
+# Called during TLS initialization.
+CFLAGS-memcpy.c += $(no-stack-protector)
+CFLAGS-wordcopy.c += $(no-stack-protector)
+# Called during static initialization
+CFLAGS-strncmp.c += $(no-stack-protector)
+CFLAGS-memset.c += $(no-stack-protector)
+
+CFLAGS-argz-next.c += $(config-cflags-wno-ignored-attributes)
+CFLAGS-basename.c += $(config-cflags-wno-ignored-attributes)
+CFLAGS-ffs.c += $(config-cflags-wno-ignored-attributes)
+CFLAGS-memmem.c += $(config-cflags-wno-ignored-attributes)
+CFLAGS-memchr.c += $(config-cflags-wno-ignored-attributes)
+CFLAGS-mempcpy.c += $(config-cflags-wno-ignored-attributes)
+CFLAGS-stpcpy.c += $(config-cflags-wno-ignored-attributes)
+CFLAGS-strnlen.c += $(config-cflags-wno-ignored-attributes)
+
+ifeq ($(run-built-tests),yes)
+$(objpfx)tst-svc-cmp.out: tst-svc.expect $(objpfx)tst-svc.out
+ cmp $^ > $@; \
+ $(evaluate-test)
+
+LOCALES := de_DE.UTF-8 en_US.ISO-8859-1 en_US.UTF-8 \
+ tr_TR.ISO-8859-9 tr_TR.UTF-8 cs_CZ.UTF-8 \
+ da_DK.ISO-8859-1 en_GB.UTF-8 pt_BR.UTF-8
+include ../gen-locales.mk
+
+$(objpfx)test-strcasecmp.out: $(gen-locales)
+$(objpfx)test-strncasecmp.out: $(gen-locales)
+$(objpfx)tst-strxfrm.out: $(gen-locales)
+$(objpfx)tst-strxfrm2.out: $(gen-locales)
+# bug-strcoll2 needs cs_CZ.UTF-8 and da_DK.ISO-8859-1.
+$(objpfx)bug-strcoll2.out: $(gen-locales)
+$(objpfx)tst-strcoll-overflow.out: $(gen-locales)
+$(objpfx)tst-strsignal.out: $(gen-locales)
+$(objpfx)tst-strerror.out: $(gen-locales)
+
endif