linux: Use fchmodat2 on fchmod for flags different than 0 (BZ 26401)
[glibc.git] / stdlib / Makefile
blob6af606136e557910adbf5763a272ac374dcab19f
1 # Copyright (C) 1991-2023 Free Software Foundation, Inc.
2 # This file is part of the GNU C Library.
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.
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.
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/>.
19 # Makefile for stdlib routines
21 subdir := stdlib
23 include ../Makeconfig
25 headers := \
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-ldbl.h \
35 bits/stdlib.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
52 routines := \
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 nrand48 \
100 nrand48_r \
101 old_atexit \
102 on_exit atexit \
103 putenv \
104 qsort \
105 quick_exit \
106 rand \
107 rand_r \
108 random \
109 random_r \
110 rpmatch \
111 secure-getenv \
112 seed48 \
113 seed48_r \
114 setcontext \
115 setenv \
116 srand48 \
117 srand48_r \
118 strfmon \
119 strfmon_l \
120 strfromd \
121 strfromf \
122 strfroml \
123 strtod \
124 strtod_l \
125 strtod_nan \
126 strtof \
127 strtof_l \
128 strtof_nan \
129 strtol \
130 strtol_l \
131 strtold \
132 strtold_l \
133 strtold_nan \
134 strtoll \
135 strtoll_l \
136 strtoul \
137 strtoul_l \
138 strtoull \
139 strtoull_l \
140 swapcontext \
141 system \
142 wcstombs \
143 wctomb \
144 xpg_basename \
145 # routines
147 # Exclude fortified routines from being built with _FORTIFY_SOURCE
148 routines_no_fortify += \
149 mbstowcs \
150 wcstombs \
151 wctomb \
152 # routines_no_fortify
154 aux = \
155 grouping \
156 groupingwc \
157 tens_in_limb \
158 # aux
160 # These routines will be omitted from the libc shared object.
161 # Instead the static object files will be included in a special archive
162 # linked against when the shared library will be used.
163 static-only-routines = \
164 at_quick_exit \
165 atexit \
166 # static-only-routines
168 test-srcs := \
169 tst-fmtmsg \
170 #test-srcs
172 tests := \
173 bug-fmtmsg1 \
174 bug-getcontext \
175 bug-strtod \
176 bug-strtod2 \
177 test-a64l \
178 test-at_quick_exit-race \
179 test-atexit-race \
180 test-atexit-recursive \
181 test-bz22786 \
182 test-canon \
183 test-canon2 \
184 test-cxa_atexit-race \
185 test-cxa_atexit-race2 \
186 test-dlclose-exit-race \
187 test-on_exit-race \
188 testdiv \
189 testmb \
190 testmb2 \
191 testrand \
192 testsort \
193 tst-abs \
194 tst-arc4random-fork \
195 tst-arc4random-stats \
196 tst-arc4random-thread \
197 tst-at_quick_exit \
198 tst-atexit \
199 tst-atof1 \
200 tst-atof2 \
201 tst-bsearch \
202 tst-bz20544 \
203 tst-canon-bz26341 \
204 tst-cxa_atexit \
205 tst-environ \
206 tst-getrandom \
207 tst-labs \
208 tst-limits \
209 tst-llabs \
210 tst-makecontext \
211 tst-makecontext-align \
212 tst-makecontext2 \
213 tst-makecontext3 \
214 tst-on_exit \
215 tst-qsort \
216 tst-qsort2 \
217 tst-qsort3 \
218 tst-quick_exit \
219 tst-rand48 \
220 tst-rand48-2 \
221 tst-random \
222 tst-random2 \
223 tst-realpath \
224 tst-realpath-toolong \
225 tst-secure-getenv \
226 tst-setcontext \
227 tst-setcontext2 \
228 tst-setcontext3 \
229 tst-setcontext4 \
230 tst-setcontext5 \
231 tst-setcontext6 \
232 tst-setcontext7 \
233 tst-setcontext8 \
234 tst-setcontext9 \
235 tst-strfmon_l \
236 tst-strfrom \
237 tst-strfrom-locale \
238 tst-strtod \
239 tst-strtod-nan-locale \
240 tst-strtod-nan-sign \
241 tst-strtod-overflow \
242 tst-strtod-round \
243 tst-strtod-underflow \
244 tst-strtod2 \
245 tst-strtod5 \
246 tst-strtod6 \
247 tst-strtol \
248 tst-strtol-binary-c11 \
249 tst-strtol-binary-c2x \
250 tst-strtol-binary-gnu11 \
251 tst-strtol-binary-gnu2x \
252 tst-strtol-locale \
253 tst-strtoll \
254 tst-swapcontext1 \
255 tst-thread-quick_exit \
256 tst-tininess \
257 tst-unsetenv1 \
258 tst-width \
259 tst-width-stdint \
260 tst-xpg-basename \
261 # tests
263 tests-internal := \
264 tst-strtod1i \
265 tst-strtod3 \
266 tst-strtod4 \
267 tst-strtod5i \
268 tst-tls-atexit \
269 tst-tls-atexit-nodelete \
270 # tests-internal
272 tests-static := \
273 tst-secure-getenv \
274 # tests-static
276 tests-container := \
277 tst-system \
278 #tests-container
280 ifeq ($(build-hardcoded-path-in-tests),yes)
281 tests += \
282 tst-empty-env \
283 # tests
284 endif
286 LDLIBS-test-atexit-race = $(shared-thread-library)
287 LDLIBS-test-at_quick_exit-race = $(shared-thread-library)
288 LDLIBS-test-cxa_atexit-race = $(shared-thread-library)
289 LDLIBS-test-cxa_atexit-race2 = $(shared-thread-library)
290 LDLIBS-test-on_exit-race = $(shared-thread-library)
291 LDLIBS-tst-canon-bz26341 = $(shared-thread-library)
292 LDLIBS-tst-arc4random-fork = $(shared-thread-library)
293 LDLIBS-tst-arc4random-thread = $(shared-thread-library)
294 LDLIBS-tst-system = $(shared-thread-library)
296 LDLIBS-test-dlclose-exit-race = $(shared-thread-library)
297 LDFLAGS-test-dlclose-exit-race = $(LDFLAGS-rdynamic)
298 LDLIBS-test-dlclose-exit-race-helper.so = $(libsupport) $(shared-thread-library)
300 CFLAGS-tst-abs.c += -fno-builtin
301 CFLAGS-tst-labs.c += -fno-builtin
302 CFLAGS-tst-llabs.c += -fno-builtin
304 ifeq ($(have-cxx-thread_local),yes)
305 CFLAGS-tst-quick_exit.o = -std=c++11
306 LDLIBS-tst-quick_exit = -lstdc++
307 CFLAGS-tst-thread-quick_exit.o = -std=c++11
308 LDLIBS-tst-thread-quick_exit = -lstdc++
309 $(objpfx)tst-thread-quick_exit: $(shared-thread-library)
310 else
311 tests-unsupported += \
312 tst-quick_exit \
313 tst-thread-quick_exit \
314 # tests-unsupported
315 endif
317 modules-names = \
318 test-dlclose-exit-race-helper \
319 tst-tls-atexit-lib \
320 # modules-names
321 extra-test-objs += $(addsuffix .os, $(modules-names))
323 ifeq ($(build-shared),yes)
324 tests += \
325 tst-putenv \
326 # tests
327 endif
329 # Several mpn functions from GNU MP are used by the strtod function.
330 mpn-routines := \
331 add_n \
332 addmul_1 \
333 cmp \
334 divmod_1 \
335 divrem \
336 inlines \
337 lshift \
338 mod_1 \
339 mul \
340 mul_1 \
341 mul_n \
342 rshift \
343 sub_n \
344 submul_1 \
345 udiv_qrnnd \
346 # mpn-routines
347 mpn-headers = \
348 asm-syntax.h \
349 gmp-impl.h \
350 gmp-mparam.h \
351 gmp.h \
352 longlong.h \
353 # mpn-headers
355 routines := \
356 $(strip $(routines) $(mpn-routines)) \
357 dbl2mpn \
358 ldbl2mpn \
359 mpn2dbl \
360 mpn2flt \
361 mpn2ldbl \
362 # routines
363 aux += \
364 fpioconst \
365 mp_clz_tab \
366 # aux
368 tests-extras += \
369 tst-putenvmod \
370 # tests-extras
372 extra-test-objs += \
373 tst-putenvmod.os \
374 # extra-test-objs
376 generated += \
377 isomac \
378 isomac.out \
379 tst-putenvmod.so \
380 # generated
382 CFLAGS-bsearch.c += $(uses-callbacks)
383 CFLAGS-qsort.c += $(uses-callbacks)
384 CFLAGS-system.c += -fexceptions
385 CFLAGS-system.os = -fomit-frame-pointer
386 CFLAGS-fmtmsg.c += -fexceptions
388 CFLAGS-strfmon.c += $(libio-mtsafe)
389 CFLAGS-strfmon_l.c += $(libio-mtsafe)
391 # The strfrom class of functions call __printf_fp in order to convert the
392 # floating-point value to characters. This requires the value of IO_MTSAFE_IO.
393 CFLAGS-strfromd.c += $(libio-mtsafe)
394 CFLAGS-strfromf.c += $(libio-mtsafe)
395 CFLAGS-strfroml.c += $(libio-mtsafe)
397 CFLAGS-strtol.c += $(config-cflags-wno-ignored-attributes)
398 CFLAGS-strtoul.c += $(config-cflags-wno-ignored-attributes)
399 CFLAGS-strtoll.c += $(config-cflags-wno-ignored-attributes)
400 CFLAGS-strtoull.c += $(config-cflags-wno-ignored-attributes)
401 CFLAGS-strtof.c += $(config-cflags-wno-ignored-attributes)
402 CFLAGS-strtof_l.c += $(config-cflags-wno-ignored-attributes)
403 CFLAGS-strtod.c += $(config-cflags-wno-ignored-attributes)
404 CFLAGS-strtod_l.c += $(config-cflags-wno-ignored-attributes)
405 CFLAGS-strtold.c += $(config-cflags-wno-ignored-attributes)
406 CFLAGS-strtold_l.c += $(config-cflags-wno-ignored-attributes)
407 CFLAGS-secure-getenv.c += $(config-cflags-wno-ignored-attributes)
409 CFLAGS-tst-bsearch.c += $(stack-align-test-flags)
410 CFLAGS-tst-qsort.c += $(stack-align-test-flags)
411 CFLAGS-tst-makecontext.c += -funwind-tables
412 CFLAGS-tst-makecontext2.c += $(stack-align-test-flags)
414 CFLAGS-testmb.c += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -Wall -Werror
416 # Some versions of GCC supported for building glibc do not support -std=c2x
417 # or -std=gnu2x, so the tests for those versions use -std=c11 and -std=gnu11
418 # and then _ISOC2X_SOURCE is defined in the test as needed.
419 CFLAGS-tst-strtol-binary-c11.c += -std=c11
420 CFLAGS-tst-strtol-binary-c2x.c += -std=c11
421 CFLAGS-tst-strtol-binary-gnu11.c += -std=gnu11
422 CFLAGS-tst-strtol-binary-gnu2x.c += -std=gnu11
425 # Run a test on the header files we use.
426 tests-special += $(objpfx)isomac.out
428 ifeq ($(run-built-tests),yes)
429 tests-special += $(objpfx)tst-fmtmsg.out
430 endif
432 include ../Rules
434 ifeq ($(run-built-tests),yes)
435 LOCALES := \
436 cs_CZ.UTF-8 \
437 de_DE.UTF-8 \
438 el_GR.UTF-8 \
439 en_US.ISO-8859-1 \
440 hi_IN.UTF-8 \
441 hr_HR.UTF-8 \
442 tg_TJ.UTF-8 \
443 tr_TR.ISO-8859-9 \
444 tr_TR.UTF-8 \
445 # LOCALES
446 include ../gen-locales.mk
448 $(objpfx)bug-strtod2.out: $(gen-locales)
449 $(objpfx)testmb2.out: $(gen-locales)
450 $(objpfx)tst-strtod.out: $(gen-locales)
451 $(objpfx)tst-strtod1i.out: $(gen-locales)
452 $(objpfx)tst-strtod3.out: $(gen-locales)
453 $(objpfx)tst-strtod4.out: $(gen-locales)
454 $(objpfx)tst-strtod5.out: $(gen-locales)
455 $(objpfx)tst-strtod5i.out: $(gen-locales)
456 $(objpfx)tst-strtol-locale.out: $(gen-locales)
457 $(objpfx)tst-strtod-nan-locale.out: $(gen-locales)
458 $(objpfx)tst-strfmon_l.out: $(gen-locales)
459 $(objpfx)tst-strfrom.out: $(gen-locales)
460 $(objpfx)tst-strfrom-locale.out: $(gen-locales)
461 $(objpfx)test-dlclose-exit-race.out: $(objpfx)test-dlclose-exit-race-helper.so
462 endif
464 # Testdir has to be named stdlib and needs to be writable
465 test-canon-ARGS = --test-dir=${common-objpfx}stdlib
467 bug-fmtmsg1-ENV = SEV_LEVEL=foo,11,newsev
469 $(objpfx)isomac.out: $(objpfx)isomac
470 $(dir $<)$(notdir $<) '$(CC)' \
471 '-I../include $(+sysdep-includes) $(sysincludes) -I..' > $@; \
472 $(evaluate-test)
474 isomac-CFLAGS = -O
475 $(objpfx)isomac: isomac.c
476 $(native-compile)
478 $(objpfx)tst-fmtmsg.out: tst-fmtmsg.sh $(objpfx)tst-fmtmsg
479 $(SHELL) $< $(common-objpfx) '$(test-program-prefix-before-env)' \
480 '$(run-program-env)' '$(test-program-prefix-after-env)' \
481 $(common-objpfx)stdlib/; \
482 $(evaluate-test)
484 $(objpfx)tst-putenv: $(objpfx)tst-putenvmod.so
485 LDFLAGS-tst-putenv = -Wl,--no-as-needed
487 $(objpfx)tst-putenvmod.so: $(objpfx)tst-putenvmod.os $(link-libc-deps)
488 $(build-module)
489 libof-tst-putenvmod = extramodules
491 $(objpfx)bug-getcontext: $(libm)
492 $(objpfx)bug-strtod2: $(libm)
493 $(objpfx)tst-strtod-round: $(libm)
494 $(objpfx)tst-tininess: $(libm)
495 $(objpfx)tst-strtod-underflow: $(libm)
496 $(objpfx)tst-strtod6: $(libm)
497 $(objpfx)tst-strtod-nan-locale: $(libm)
498 $(objpfx)tst-strtod-nan-sign: $(libm)
500 tst-tls-atexit-lib.so-no-z-defs = yes
501 test-dlclose-exit-race-helper.so-no-z-defs = yes
503 $(objpfx)tst-tls-atexit: $(shared-thread-library)
504 $(objpfx)tst-tls-atexit.out: $(objpfx)tst-tls-atexit-lib.so
506 $(objpfx)tst-tls-atexit-nodelete: $(shared-thread-library)
507 $(objpfx)tst-tls-atexit-nodelete.out: $(objpfx)tst-tls-atexit-lib.so
509 $(objpfx)tst-setcontext3.out: tst-setcontext3.sh $(objpfx)tst-setcontext3
510 $(SHELL) $< $(common-objpfx) '$(test-program-prefix-before-env)' \
511 '$(run-program-env)' '$(test-program-prefix-after-env)' \
512 $(common-objpfx)stdlib/; \
513 $(evaluate-test)