1# Copyright (C) 1991-2022 Free Software Foundation, Inc.
2# This file is part of the GNU C Library.
3
4# The GNU C Library is free software; you can redistribute it and/or
5# modify it under the terms of the GNU Lesser General Public
6# License as published by the Free Software Foundation; either
7# version 2.1 of the License, or (at your option) any later version.
8
9# The GNU C Library is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12# Lesser General Public License for more details.
13
14# You should have received a copy of the GNU Lesser General Public
15# License along with the GNU C Library; if not, see
16# <https://www.gnu.org/licenses/>.
17
18#
19#	Makefile for stdlib routines
20#
21subdir	:= stdlib
22
23include ../Makeconfig
24
25headers := \
26  alloca.h \
27  bits/errno.h \
28  bits/indirect-return.h \
29  bits/monetary-ldbl.h \
30  bits/stdint-intn.h \
31  bits/stdint-uintn.h \
32  bits/stdlib-bsearch.h \
33  bits/stdlib-float.h \
34  bits/stdlib.h \
35  bits/stdlib-ldbl.h \
36  bits/time64.h \
37  bits/timesize.h \
38  bits/types/error_t.h \
39  bits/wordsize.h \
40  errno.h \
41  fmtmsg.h \
42  inttypes.h \
43  monetary.h \
44  stdint.h \
45  stdlib.h \
46  sys/errno.h \
47  sys/random.h \
48  sys/ucontext.h \
49  ucontext.h \
50  # headers
51
52routines := \
53  a64l \
54  abort \
55  abs \
56  arc4random \
57  arc4random_uniform \
58  at_quick_exit \
59  atof \
60  atoi \
61  atol\
62  atoll	\
63  bsearch \
64  canonicalize \
65  cxa_at_quick_exit \
66  cxa_atexit \
67  cxa_finalize \
68  cxa_thread_atexit_impl \
69  div \
70  drand48 \
71  drand48-iter \
72  drand48_r \
73  erand48 \
74  erand48_r \
75  exit \
76  fmtmsg \
77  getcontext \
78  getentropy \
79  getenv \
80  getrandom \
81  getsubopt \
82  jrand48 \
83  jrand48_r \
84  l64a \
85  labs \
86  lcong48 \
87  lcong48_r \
88  ldiv \
89  llabs \
90  lldiv \
91  lrand48 \
92  lrand48_r \
93  makecontext \
94  mblen \
95  mbstowcs \
96  mbtowc \
97  mrand48 \
98  mrand48_r \
99  msort \
100  nrand48 \
101  nrand48_r \
102  old_atexit  \
103  on_exit atexit \
104  putenv \
105  qsort \
106  quick_exit \
107  rand \
108  rand_r \
109  random \
110  random_r \
111  rpmatch \
112  secure-getenv \
113  seed48 \
114  seed48_r \
115  setcontext \
116  setenv \
117  srand48 \
118  srand48_r \
119  strfmon \
120  strfmon_l \
121  strfromd \
122  strfromf \
123  strfroml \
124  strtod \
125  strtod_l \
126  strtod_nan \
127  strtof \
128  strtof_l \
129  strtof_nan \
130  strtol \
131  strtol_l \
132  strtold \
133  strtold_l \
134  strtold_nan \
135  strtoll \
136  strtoll_l \
137  strtoul \
138  strtoul_l \
139  strtoull \
140  strtoull_l \
141  swapcontext \
142  system \
143  wcstombs \
144  wctomb  \
145  xpg_basename \
146  # routines
147
148aux = \
149  grouping \
150  groupingwc \
151  tens_in_limb \
152  # aux
153
154# These routines will be omitted from the libc shared object.
155# Instead the static object files will be included in a special archive
156# linked against when the shared library will be used.
157static-only-routines = \
158  atexit \
159  at_quick_exit \
160  # static-only-routines
161
162test-srcs := \
163  tst-fmtmsg \
164  #test-srcs
165
166tests := \
167  bug-fmtmsg1 \
168  bug-getcontext \
169  bug-strtod \
170  bug-strtod2 \
171  test-a64l \
172  test-at_quick_exit-race \
173  test-atexit-race \
174  test-bz22786 \
175  test-canon \
176  test-canon2 \
177  test-cxa_atexit-race \
178  test-cxa_atexit-race2 \
179  test-dlclose-exit-race \
180  test-on_exit-race \
181  testdiv \
182  testmb \
183  testmb2 \
184  testrand \
185  testsort \
186  tst-arc4random-fork \
187  tst-arc4random-stats \
188  tst-arc4random-thread \
189  tst-at_quick_exit \
190  tst-atexit \
191  tst-atof1 \
192  tst-atof2 \
193  tst-bsearch \
194  tst-bz20544 \
195  tst-canon-bz26341 \
196  tst-cxa_atexit \
197  tst-environ \
198  tst-getrandom \
199  tst-limits \
200  tst-makecontext \
201  tst-makecontext-align \
202  tst-makecontext2 \
203  tst-makecontext3 \
204  tst-on_exit \
205  tst-qsort \
206  tst-qsort2 \
207  tst-quick_exit \
208  tst-rand48 \
209  tst-rand48-2 \
210  tst-random \
211  tst-random2 \
212  tst-realpath \
213  tst-realpath-toolong \
214  tst-secure-getenv \
215  tst-setcontext \
216  tst-setcontext2 \
217  tst-setcontext3 \
218  tst-setcontext4 \
219  tst-setcontext5 \
220  tst-setcontext6 \
221  tst-setcontext7 \
222  tst-setcontext8 \
223  tst-setcontext9 \
224  tst-strfmon_l \
225  tst-strfrom \
226  tst-strfrom-locale \
227  tst-strtod \
228  tst-strtod-nan-locale \
229  tst-strtod-nan-sign \
230  tst-strtod-overflow \
231  tst-strtod-round \
232  tst-strtod-underflow \
233  tst-strtod2 \
234  tst-strtod5 \
235  tst-strtod6 \
236  tst-strtol \
237  tst-strtol-locale \
238  tst-strtoll \
239  tst-swapcontext1 \
240  tst-thread-quick_exit \
241  tst-tininess \
242  tst-unsetenv1 \
243  tst-width \
244  tst-width-stdint \
245  tst-xpg-basename \
246  # tests
247
248tests-internal := \
249  tst-strtod1i \
250  tst-strtod3 \
251  tst-strtod4 \
252  tst-strtod5i \
253  tst-tls-atexit \
254  tst-tls-atexit-nodelete \
255  # tests-internal
256
257tests-static := \
258  tst-secure-getenv \
259  # tests-static
260
261tests-container := \
262  tst-system \
263  #tests-container
264
265ifeq ($(build-hardcoded-path-in-tests),yes)
266tests += \
267  tst-empty-env \
268  # tests
269endif
270
271LDLIBS-test-atexit-race = $(shared-thread-library)
272LDLIBS-test-at_quick_exit-race = $(shared-thread-library)
273LDLIBS-test-cxa_atexit-race = $(shared-thread-library)
274LDLIBS-test-cxa_atexit-race2 = $(shared-thread-library)
275LDLIBS-test-on_exit-race = $(shared-thread-library)
276LDLIBS-tst-canon-bz26341 = $(shared-thread-library)
277LDLIBS-tst-arc4random-fork = $(shared-thread-library)
278LDLIBS-tst-arc4random-thread = $(shared-thread-library)
279
280LDLIBS-test-dlclose-exit-race = $(shared-thread-library)
281LDFLAGS-test-dlclose-exit-race = $(LDFLAGS-rdynamic)
282LDLIBS-test-dlclose-exit-race-helper.so = $(libsupport) $(shared-thread-library)
283
284ifeq ($(have-cxx-thread_local),yes)
285CFLAGS-tst-quick_exit.o = -std=c++11
286LDLIBS-tst-quick_exit = -lstdc++
287CFLAGS-tst-thread-quick_exit.o = -std=c++11
288LDLIBS-tst-thread-quick_exit = -lstdc++
289$(objpfx)tst-thread-quick_exit: $(shared-thread-library)
290else
291tests-unsupported += \
292  tst-quick_exit \
293  tst-thread-quick_exit \
294  # tests-unsupported
295endif
296
297modules-names = \
298  test-dlclose-exit-race-helper \
299  tst-tls-atexit-lib \
300  # modules-names
301extra-test-objs += $(addsuffix .os, $(modules-names))
302
303ifeq ($(build-shared),yes)
304tests += \
305  tst-putenv \
306  # tests
307endif
308
309# Several mpn functions from GNU MP are used by the strtod function.
310mpn-routines := \
311  add_n \
312  addmul_1 \
313  cmp \
314  divmod_1 \
315  divrem \
316  inlines \
317  lshift \
318  mod_1 \
319  mul \
320  mul_1 \
321  mul_n \
322  rshift \
323  sub_n \
324  submul_1 \
325  udiv_qrnnd \
326  # mpn-routines
327mpn-headers = \
328  asm-syntax.h \
329  gmp-impl.h \
330  gmp-mparam.h \
331  gmp.h \
332  longlong.h \
333  # mpn-headers
334
335routines := \
336  $(strip $(routines) $(mpn-routines)) \
337  dbl2mpn \
338  ldbl2mpn \
339  mpn2dbl \
340  mpn2flt \
341  mpn2ldbl \
342  # routines
343aux += \
344  fpioconst \
345  mp_clz_tab \
346  # aux
347
348tests-extras += \
349  tst-putenvmod \
350  # tests-extras
351
352extra-test-objs += \
353  tst-putenvmod.os \
354  # extra-test-objs
355
356generated += \
357  isomac \
358  isomac.out \
359  tst-putenvmod.so \
360  # generated
361
362CFLAGS-bsearch.c += $(uses-callbacks)
363CFLAGS-msort.c += $(uses-callbacks)
364CFLAGS-qsort.c += $(uses-callbacks)
365CFLAGS-system.c += -fexceptions
366CFLAGS-system.os = -fomit-frame-pointer
367CFLAGS-fmtmsg.c += -fexceptions
368
369CFLAGS-strfmon.c += $(libio-mtsafe)
370CFLAGS-strfmon_l.c += $(libio-mtsafe)
371
372# The strfrom class of functions call __printf_fp in order to convert the
373# floating-point value to characters.  This requires the value of IO_MTSAFE_IO.
374CFLAGS-strfromd.c += $(libio-mtsafe)
375CFLAGS-strfromf.c += $(libio-mtsafe)
376CFLAGS-strfroml.c += $(libio-mtsafe)
377
378CFLAGS-tst-bsearch.c += $(stack-align-test-flags)
379CFLAGS-tst-qsort.c += $(stack-align-test-flags)
380CFLAGS-tst-makecontext.c += -funwind-tables
381CFLAGS-tst-makecontext2.c += $(stack-align-test-flags)
382
383CFLAGS-testmb.c += -D_FORTIFY_SOURCE=2 -Wall -Werror
384
385
386# Run a test on the header files we use.
387tests-special += $(objpfx)isomac.out
388
389ifeq ($(run-built-tests),yes)
390tests-special += $(objpfx)tst-fmtmsg.out
391endif
392
393include ../Rules
394
395ifeq ($(run-built-tests),yes)
396LOCALES := \
397  cs_CZ.UTF-8 \
398  de_DE.UTF-8 \
399  el_GR.UTF-8 \
400  en_US.ISO-8859-1 \
401  hi_IN.UTF-8 \
402  hr_HR.UTF-8 \
403  tg_TJ.UTF-8 \
404  tr_TR.ISO-8859-9 \
405  tr_TR.UTF-8 \
406  # LOCALES
407include ../gen-locales.mk
408
409$(objpfx)bug-strtod2.out: $(gen-locales)
410$(objpfx)testmb2.out: $(gen-locales)
411$(objpfx)tst-strtod.out: $(gen-locales)
412$(objpfx)tst-strtod1i.out: $(gen-locales)
413$(objpfx)tst-strtod3.out: $(gen-locales)
414$(objpfx)tst-strtod4.out: $(gen-locales)
415$(objpfx)tst-strtod5.out: $(gen-locales)
416$(objpfx)tst-strtod5i.out: $(gen-locales)
417$(objpfx)tst-strtol-locale.out: $(gen-locales)
418$(objpfx)tst-strtod-nan-locale.out: $(gen-locales)
419$(objpfx)tst-strfmon_l.out: $(gen-locales)
420$(objpfx)tst-strfrom.out: $(gen-locales)
421$(objpfx)tst-strfrom-locale.out: $(gen-locales)
422$(objpfx)test-dlclose-exit-race.out: $(objpfx)test-dlclose-exit-race-helper.so
423endif
424
425# Testdir has to be named stdlib and needs to be writable
426test-canon-ARGS = --test-dir=${common-objpfx}stdlib
427
428bug-fmtmsg1-ENV = SEV_LEVEL=foo,11,newsev
429
430$(objpfx)isomac.out: $(objpfx)isomac
431	$(dir $<)$(notdir $<) '$(CC)'  \
432	'-I../include $(+sysdep-includes) $(sysincludes) -I..' > $@; \
433	$(evaluate-test)
434
435isomac-CFLAGS = -O
436$(objpfx)isomac: isomac.c
437	$(native-compile)
438
439$(objpfx)tst-fmtmsg.out: tst-fmtmsg.sh $(objpfx)tst-fmtmsg
440	$(SHELL) $< $(common-objpfx) '$(test-program-prefix-before-env)' \
441		 '$(run-program-env)' '$(test-program-prefix-after-env)' \
442		 $(common-objpfx)stdlib/; \
443	$(evaluate-test)
444
445$(objpfx)tst-putenv: $(objpfx)tst-putenvmod.so
446LDFLAGS-tst-putenv = -Wl,--no-as-needed
447
448$(objpfx)tst-putenvmod.so: $(objpfx)tst-putenvmod.os $(link-libc-deps)
449	$(build-module)
450libof-tst-putenvmod = extramodules
451
452$(objpfx)bug-getcontext: $(libm)
453$(objpfx)bug-strtod2: $(libm)
454$(objpfx)tst-strtod-round: $(libm)
455$(objpfx)tst-tininess: $(libm)
456$(objpfx)tst-strtod-underflow: $(libm)
457$(objpfx)tst-strtod6: $(libm)
458$(objpfx)tst-strtod-nan-locale: $(libm)
459$(objpfx)tst-strtod-nan-sign: $(libm)
460
461tst-tls-atexit-lib.so-no-z-defs = yes
462test-dlclose-exit-race-helper.so-no-z-defs = yes
463
464$(objpfx)tst-tls-atexit: $(shared-thread-library)
465$(objpfx)tst-tls-atexit.out: $(objpfx)tst-tls-atexit-lib.so
466
467$(objpfx)tst-tls-atexit-nodelete: $(shared-thread-library)
468$(objpfx)tst-tls-atexit-nodelete.out: $(objpfx)tst-tls-atexit-lib.so
469
470$(objpfx)tst-setcontext3.out: tst-setcontext3.sh $(objpfx)tst-setcontext3
471	$(SHELL) $< $(common-objpfx) '$(test-program-prefix-before-env)' \
472		 '$(run-program-env)' '$(test-program-prefix-after-env)' \
473		 $(common-objpfx)stdlib/; \
474	$(evaluate-test)
475