1# Copyright (C) 1999-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#	Sub-makefile for conform portion of the library.
20#
21subdir	:= conform
22
23include ../Makeconfig
24
25conformtest-headers-data := $(wildcard data/*.h-data) \
26			    $(wildcard data/*/*.h-data)
27
28conformtest-standards := ISO ISO99 ISO11 POSIX XPG4 XPG42 UNIX98 XOPEN2K \
29			 POSIX2008 XOPEN2K8
30
31conformtest-headers-ISO := assert.h ctype.h errno.h float.h limits.h locale.h \
32			   math.h setjmp.h signal.h stdarg.h stddef.h stdio.h \
33			   stdlib.h string.h time.h
34conformtest-headers-ISO99 := $(conformtest-headers-ISO) complex.h fenv.h \
35			     inttypes.h iso646.h stdbool.h stdint.h tgmath.h \
36			     wchar.h wctype.h
37# Missing ISO11 expectations for: stdatomic.h
38conformtest-headers-ISO11 := $(conformtest-headers-ISO99) stdalign.h \
39			     stdnoreturn.h threads.h uchar.h
40conformtest-headers-POSIX := $(conformtest-headers-ISO) aio.h dirent.h \
41			     fcntl.h fnmatch.h glob.h grp.h mqueue.h \
42			     pthread.h pwd.h regex.h sched.h semaphore.h \
43			     sys/mman.h sys/stat.h sys/times.h sys/types.h \
44			     sys/utsname.h sys/wait.h tar.h termios.h \
45			     unistd.h utime.h wordexp.h
46# Missing XPG4 expectations for: regexp.h wchar.h.
47conformtest-headers-XPG4 := $(conformtest-headers-ISO) cpio.h dirent.h \
48			    fcntl.h fnmatch.h ftw.h glob.h grp.h iconv.h \
49			    langinfo.h monetary.h nl_types.h pwd.h regex.h \
50			    search.h sys/ipc.h sys/msg.h sys/sem.h sys/shm.h \
51			    sys/stat.h sys/times.h sys/types.h sys/utsname.h \
52			    sys/wait.h tar.h termios.h ulimit.h unistd.h \
53			    utime.h varargs.h wordexp.h
54# Missing XPG42 expectations for: re_comp.h regexp.h wchar.h.
55# XPG42 includes XTI and STREAMS, but those are not implemented by glibc.
56conformtest-headers-XPG42 := $(conformtest-headers-XPG4) arpa/inet.h fmtmsg.h \
57			    libgen.h ndbm.h netdb.h netinet/in.h poll.h \
58			    strings.h sys/mman.h sys/resource.h \
59			    sys/socket.h sys/statvfs.h sys/time.h sys/timeb.h \
60			    sys/uio.h sys/un.h syslog.h ucontext.h utmpx.h
61# Missing UNIX98 expectations for: inttypes.h re_comp.h regexp.h.
62# The online UNIX98 includes XCURSES, but curses.h, term.h and
63# unctrl.h are outside the scope of these tests.  It also includes
64# XTI and STREAMS, but those are not implemented by glibc.
65conformtest-headers-UNIX98 := $(conformtest-headers-POSIX) arpa/inet.h cpio.h \
66			      dlfcn.h fmtmsg.h ftw.h iconv.h iso646.h \
67			      langinfo.h libgen.h monetary.h ndbm.h netdb.h \
68			      netinet/in.h nl_types.h poll.h search.h \
69			      strings.h sys/ipc.h sys/msg.h \
70			      sys/resource.h sys/sem.h sys/shm.h sys/socket.h \
71			      sys/statvfs.h sys/time.h sys/timeb.h sys/uio.h \
72			      sys/un.h syslog.h ucontext.h ulimit.h utmpx.h \
73			      varargs.h wchar.h wctype.h
74# Missing XOPEN2K expectations for: trace.h, stropts.h.
75conformtest-headers-XOPEN2K := $(conformtest-headers-POSIX) arpa/inet.h \
76			       complex.h cpio.h dlfcn.h fenv.h fmtmsg.h ftw.h \
77			       iconv.h inttypes.h iso646.h langinfo.h \
78			       libgen.h monetary.h ndbm.h net/if.h netdb.h \
79			       netinet/in.h netinet/tcp.h nl_types.h poll.h \
80			       search.h spawn.h stdbool.h stdint.h strings.h \
81			       sys/ipc.h sys/msg.h sys/resource.h \
82			       sys/select.h sys/sem.h sys/shm.h sys/socket.h \
83			       sys/statvfs.h sys/time.h sys/timeb.h sys/uio.h \
84			       sys/un.h syslog.h tgmath.h ucontext.h ulimit.h \
85			       utmpx.h wchar.h wctype.h
86# Missing POSIX2008 expectations for: trace.h, stropts.h.
87conformtest-headers-POSIX2008 := $(conformtest-headers-POSIX) arpa/inet.h \
88				 complex.h cpio.h dlfcn.h fenv.h iconv.h \
89				 inttypes.h iso646.h langinfo.h monetary.h \
90				 net/if.h netdb.h netinet/in.h netinet/tcp.h \
91				 nl_types.h poll.h spawn.h stdbool.h stdint.h \
92				 strings.h sys/select.h \
93				 sys/socket.h sys/statvfs.h sys/un.h tgmath.h \
94				 wchar.h wctype.h
95# Missing XOPEN2K8 expectations for: trace.h.
96conformtest-headers-XOPEN2K8 := $(conformtest-headers-POSIX2008) fmtmsg.h \
97				ftw.h libgen.h ndbm.h search.h sys/ipc.h \
98				sys/msg.h sys/resource.h sys/sem.h sys/shm.h \
99				sys/time.h sys/uio.h syslog.h ulimit.h utmpx.h
100
101conformtest-header-list-base := $(foreach std,$(conformtest-standards),\
102					      header-list-$(std).out)
103conformtest-header-list-tests := $(addprefix $(objpfx),\
104					     $(conformtest-header-list-base))
105tests-special += $(conformtest-header-list-tests)
106generated += $(conformtest-header-list-base)
107
108conformtest-header-base := $(foreach std,\
109				     $(conformtest-standards),\
110				     $(foreach h,\
111					       $(conformtest-headers-$(std)),\
112					       $(std)/$(h)/conform.out))
113conformtest-header-tests := $(addprefix $(objpfx),$(conformtest-header-base))
114ifneq (yes,$(fast-check))
115tests-special += $(conformtest-header-tests)
116generated += $(conformtest-header-base)
117endif
118
119linknamespace-symlists-base := $(foreach std,$(conformtest-standards),\
120					     symlist-$(std))
121linknamespace-symlists-tests := $(addprefix $(objpfx),\
122					    $(linknamespace-symlists-base))
123tests-special += $(linknamespace-symlists-tests)
124
125linknamespace-symlist-stdlibs-base := $(foreach std,$(conformtest-standards),\
126						    symlist-stdlibs-$(std))
127linknamespace-symlist-stdlibs-tests := \
128	$(addprefix $(objpfx),\
129		    $(linknamespace-symlist-stdlibs-base))
130
131tests-special += $(linknamespace-symlist-stdlibs-tests)
132
133linknamespace-header-base := $(foreach std,\
134				       $(conformtest-standards),\
135				       $(foreach h,\
136						 $(conformtest-headers-$(std)),\
137						 $(std)/$(h)/linknamespace.out))
138linknamespace-header-tests := $(addprefix $(objpfx),\
139					  $(linknamespace-header-base))
140tests-special += $(linknamespace-header-tests)
141
142include ../Rules
143
144$(conformtest-header-list-tests): $(objpfx)header-list-%.out: \
145				  check-header-lists.sh \
146				  $(conformtest-headers-data)
147	$(SHELL) $< "$*" "$(CC)" "$(strip $(conformtest-headers-$*))" \
148		 "$(conformtest-headers-data)" > $@; \
149	$(evaluate-test)
150
151# Pre-standard C feature no longer supported by GCC (obsoleted in
152# newer POSIX standards).
153test-xfail-XPG4/varargs.h/conform = yes
154test-xfail-XPG42/varargs.h/conform = yes
155test-xfail-UNIX98/varargs.h/conform = yes
156
157# Header not provided by glibc.
158test-xfail-XPG42/ndbm.h/conform = yes
159test-xfail-UNIX98/ndbm.h/conform = yes
160test-xfail-XOPEN2K/ndbm.h/conform = yes
161test-xfail-XOPEN2K8/ndbm.h/conform = yes
162
163conformtest-cc-flags = -I../include $(+sysdep-includes) $(sysincludes) -I..
164# conformtest-xfail-conds may be set by a sysdeps Makefile fragment to
165# a list of conditions that are considered to be true when encountered
166# in xfail[cond]- lines in test expectations.
167conformtest-xfail = $(if $(conformtest-xfail-conds),\
168			 --xfail='$(conformtest-xfail-conds)')
169ifeq (no,$(cross-compiling))
170conformtest-cross =
171else
172conformtest-cross = --cross
173endif
174$(conformtest-header-tests): $(objpfx)%/conform.out: \
175			     conformtest.py $(conformtest-headers-data)
176	(set -e; std_hdr=$*; std=$${std_hdr%%/*}; hdr=$${std_hdr#*/}; \
177	 mkdir -p $(@D); \
178	 $(PYTHON) $< --cc='$(CC) $(pie-default)' \
179		   --flags='$(conformtest-cc-flags)' \
180		   --ldflags='$(+link-tests-before-inputs)' \
181		   --libs='$(+link-tests-after-inputs)' \
182		   --run-program-prefix='$(run-program-prefix)' \
183		   --standard=$$std --header=$$hdr $(conformtest-xfail) \
184		   $(conformtest-cross) \
185		   > $@ 2>&1); \
186	$(evaluate-test)
187
188$(linknamespace-symlists-tests): $(objpfx)symlist-%: list-header-symbols.py
189	$(PYTHON) $< --cc='$(CC)' --flags='$(conformtest-cc-flags)' \
190		  --standard=$* --headers="$(strip $(conformtest-headers-$*))" \
191		  > $@ 2> $@.err; \
192	$(evaluate-test)
193
194linknamespace-libs-isoc = $(common-objpfx)libc.a $(common-objpfx)math/libm.a
195linknamespace-libs-thr = $(linknamespace-libs-isoc) \
196			 $(common-objpfx)rt/librt.a \
197			 $(filter-out %_syms.a,$(static-thread-library))
198linknamespace-libs-posix = $(linknamespace-libs-thr) \
199			   $(common-objpfx)dlfcn/libdl.a
200linknamespace-libs-xsi = $(linknamespace-libs-posix)
201linknamespace-libs-ISO = $(linknamespace-libs-isoc)
202linknamespace-libs-ISO99 = $(linknamespace-libs-isoc)
203linknamespace-libs-ISO11 = $(linknamespace-libs-isoc) \
204			   $(filter-out %_syms.a,$(static-thread-library))
205linknamespace-libs-XPG4 = $(linknamespace-libs-isoc)
206linknamespace-libs-XPG42 = $(linknamespace-libs-XPG4)
207linknamespace-libs-POSIX = $(linknamespace-libs-thr)
208linknamespace-libs-UNIX98 = $(linknamespace-libs-xsi)
209linknamespace-libs-XOPEN2K = $(linknamespace-libs-xsi)
210linknamespace-libs-POSIX2008 = $(linknamespace-libs-posix)
211linknamespace-libs-XOPEN2K8 = $(linknamespace-libs-xsi)
212linknamespace-libs = $(foreach std,$(conformtest-standards),\
213				   $(linknamespace-libs-$(std)))
214
215ifeq ($(build-crypt),yes)
216linknamespace-libs-xsi += $(common-objpfx)crypt/libcrypt.a
217linknamespace-libs-XPG4 += $(common-objpfx)crypt/libcrypt.a
218endif
219
220$(linknamespace-symlist-stdlibs-tests): $(objpfx)symlist-stdlibs-%: \
221					$(linknamespace-libs)
222	LC_ALL=C $(READELF) -W -s $(linknamespace-libs-$*) > $@; \
223	$(evaluate-test)
224
225$(linknamespace-header-tests): $(objpfx)%/linknamespace.out: \
226			       linknamespace.py \
227			       $(linknamespace-symlists-tests) \
228			       $(linknamespace-symlist-stdlibs-tests)
229	(set -e; std_hdr=$*; std=$${std_hdr%%/*}; hdr=$${std_hdr#*/}; \
230	 mkdir -p $(@D); \
231	 $(PYTHON) $< --cc='$(CC)' --flags='$(conformtest-cc-flags)' \
232		   --standard=$$std --stdsyms=$(objpfx)symlist-$$std \
233		   --header=$$hdr --libsyms=$(objpfx)symlist-stdlibs-$$std \
234		   --readelf='$(READELF)' \
235		   > $@ 2>&1); \
236	$(evaluate-test)
237
238# Pre-standard C feature no longer supported by GCC (obsoleted in
239# newer POSIX standards).
240test-xfail-XPG4/varargs.h/linknamespace = yes
241test-xfail-XPG42/varargs.h/linknamespace = yes
242test-xfail-UNIX98/varargs.h/linknamespace = yes
243
244# Header not provided by glibc.
245test-xfail-XPG42/ndbm.h/linknamespace = yes
246test-xfail-UNIX98/ndbm.h/linknamespace = yes
247test-xfail-XOPEN2K/ndbm.h/linknamespace = yes
248test-xfail-XOPEN2K8/ndbm.h/linknamespace = yes
249