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