# Copyright (C) 1991-2022 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
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.

# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# 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, see
# <https://www.gnu.org/licenses/>.

#
#	Sub-makefile for string portion of library.
#
subdir	:= string

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 \
  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

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-strlen \
  test-strncasecmp \
  test-strncat \
  test-strncmp \
  test-strncpy \
  test-strnlen \
  test-strpbrk \
  test-strrchr \
  test-strspn \
  test-strstr \
  testcopy \
  tester \
  tst-bswap \
  tst-cmp \
  tst-endian \
  tst-inlcall \
  tst-memmove-overflow \
  tst-strfry \
  tst-strlen \
  tst-strtok \
  tst-strtok_r \
  tst-strxfrm \
  tst-strxfrm2 \
  tst-svc \
  tst-svc2 \
  tst-xbzero-opt \
# tests

# 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

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)

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