]>
Commit | Line | Data |
---|---|---|
1 | # Copyright (C) 1991-2021 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 | # Rules for making a subdirectory in the GNU C library. | |
20 | # Each subdirectory Makefile defines some variables and includes this. | |
21 | # | |
22 | ifneq (,) | |
23 | This makefile requires GNU Make. | |
24 | endif | |
25 | ||
26 | all: # Don't let the default goal come from Makeconfig. | |
27 | ||
28 | include $(firstword $(..) ../)Makeconfig | |
29 | ||
30 | ifndef subdir | |
31 | Each subdirectory makefile must define the `subdir' variable. | |
32 | endif | |
33 | # This ` unconfuses emacs. | |
34 | # This is benign and useless in GNU make before 3.63. | |
35 | export subdir := $(subdir) | |
36 | \f | |
37 | # This is the default target; it makes the library and auxiliary programs. | |
38 | .PHONY: all | |
39 | all: objs lib others | |
40 | ||
41 | ifeq ($(build-programs),yes) | |
42 | others: $(addprefix $(objpfx),$(extra-objs) \ | |
43 | $(install-lib) \ | |
44 | $(install-bin) $(install-bin-script) \ | |
45 | $(install-rootsbin) $(install-sbin)) | |
46 | else | |
47 | others: $(addprefix $(objpfx),$(extra-objs) \ | |
48 | $(install-lib)) | |
49 | endif | |
50 | ||
51 | ifneq "$(findstring env,$(origin headers))" "" | |
52 | headers := | |
53 | endif | |
54 | ||
55 | ifneq "$(findstring env,$(origin generated))" "" | |
56 | generated := | |
57 | endif | |
58 | ||
59 | ifneq "$(findstring env,$(origin common-generated))" "" | |
60 | common-generated := | |
61 | endif | |
62 | ||
63 | # See below. This must be set before Makerules processes it. | |
64 | before-compile += $(common-objpfx)bits/stdio_lim.h | |
65 | ||
66 | include $(..)Makerules | |
67 | ||
68 | .PHONY: subdir_lib | |
69 | subdir_lib: lib-noranlib | |
70 | ||
71 | # Some subdirs need to install a dummy library. | |
72 | # They can use "$(objpfx)libfnord.a: $(dep-dummy-lib); $(make-dummy-lib)". | |
73 | dep-dummy-lib = $(common-objpfx)dummy.o | |
74 | define make-dummy-lib | |
75 | $(AR) cr$(verbose) $@ $< | |
76 | endef | |
77 | ||
78 | $(common-objpfx)dummy.c: | |
79 | rm -f $@ | |
80 | (echo 'extern void __dummy__ (void);'; \ | |
81 | echo 'void __dummy__ (void) { }') > $@ | |
82 | common-generated += dummy.o dummy.c | |
83 | ||
84 | ifneq "$(headers)" "" | |
85 | # Test that all of the headers installed by this directory can be compiled | |
86 | # in isolation. | |
87 | tests-special += $(objpfx)check-installed-headers-c.out | |
88 | libof-check-installed-headers-c := testsuite | |
89 | $(objpfx)check-installed-headers-c.out: \ | |
90 | $(..)scripts/check-installed-headers.sh $(headers) | |
91 | $(SHELL) $(..)scripts/check-installed-headers.sh c \ | |
92 | "$(CC) $(filter-out -std=%,$(CFLAGS)) -D_ISOMAC $(+includes)" \ | |
93 | $(headers) > $@; \ | |
94 | $(evaluate-test) | |
95 | ||
96 | ifneq "$(CXX)" "" | |
97 | # If a C++ compiler is available, also test that they can be compiled | |
98 | # in isolation as C++. | |
99 | tests-special += $(objpfx)check-installed-headers-cxx.out | |
100 | libof-check-installed-headers-cxx := testsuite | |
101 | $(objpfx)check-installed-headers-cxx.out: \ | |
102 | $(..)scripts/check-installed-headers.sh $(headers) | |
103 | $(SHELL) $(..)scripts/check-installed-headers.sh c++ \ | |
104 | "$(CXX) $(filter-out -std=%,$(CXXFLAGS)) -D_ISOMAC $(+includes)" \ | |
105 | $(headers) > $@; \ | |
106 | $(evaluate-test) | |
107 | endif # $(CXX) | |
108 | ||
109 | # Test that a wrapper header exists in include/ for each non-sysdeps header. | |
110 | # This script does not need $(py-env). | |
111 | tests-special += $(objpfx)check-wrapper-headers.out | |
112 | $(objpfx)check-wrapper-headers.out: \ | |
113 | $(..)scripts/check-wrapper-headers.py $(headers) | |
114 | $(PYTHON) $< --root=$(..) --subdir=$(subdir) $(headers) > $@; \ | |
115 | $(evaluate-test) | |
116 | ||
117 | # Test that none of the headers installed by this directory use certain | |
118 | # obsolete constructs (e.g. legacy BSD typedefs superseded by stdint.h). | |
119 | # This script does not need $(py-env). | |
120 | tests-special += $(objpfx)check-obsolete-constructs.out | |
121 | libof-check-obsolete-constructs := testsuite | |
122 | $(objpfx)check-obsolete-constructs.out: \ | |
123 | $(..)scripts/check-obsolete-constructs.py $(headers) | |
124 | $(PYTHON) $^ > $@ 2>&1; \ | |
125 | $(evaluate-test) | |
126 | ||
127 | endif # $(headers) | |
128 | \f | |
129 | # This makes all the auxiliary and test programs. | |
130 | ||
131 | .PHONY: others tests bench bench-build | |
132 | ||
133 | # Test programs for the pretty printers. | |
134 | tests-printers-programs := $(addprefix $(objpfx),$(tests-printers)) | |
135 | ||
136 | # .out files with the output of running the pretty printer tests. | |
137 | tests-printers-out := $(patsubst %,$(objpfx)%.out,$(tests-printers)) | |
138 | ||
139 | ifeq ($(build-programs),yes) | |
140 | others: $(addprefix $(objpfx),$(others) $(sysdep-others) $(extra-objs)) | |
141 | else | |
142 | others: $(addprefix $(objpfx),$(extra-objs)) | |
143 | endif | |
144 | ||
145 | # Generate constant files for Python pretty printers if required. | |
146 | others: $(py-const) | |
147 | ||
148 | ifeq ($(run-built-tests),no) | |
149 | tests: $(addprefix $(objpfx),$(filter-out $(tests-unsupported), \ | |
150 | $(tests) $(tests-internal) \ | |
151 | $(tests-container)) \ | |
152 | $(test-srcs)) $(tests-special) \ | |
153 | $(tests-printers-programs) | |
154 | xtests: tests $(xtests-special) | |
155 | else | |
156 | tests: $(tests:%=$(objpfx)%.out) $(tests-internal:%=$(objpfx)%.out) \ | |
157 | $(tests-container:%=$(objpfx)%.out) \ | |
158 | $(tests-mcheck:%=$(objpfx)%-mcheck.out) \ | |
159 | $(tests-special) $(tests-printers-out) | |
160 | xtests: tests $(xtests:%=$(objpfx)%.out) $(xtests-special) | |
161 | endif | |
162 | ||
163 | tests-special-notdir = $(patsubst $(objpfx)%, %, $(tests-special)) | |
164 | xtests-special-notdir = $(patsubst $(objpfx)%, %, $(xtests-special)) | |
165 | ifeq ($(run-built-tests),no) | |
166 | tests-expected = | |
167 | else | |
168 | tests-expected = $(tests) $(tests-internal) $(tests-printers) \ | |
169 | $(tests-container) $(tests-mcheck:%=%-mcheck) | |
170 | endif | |
171 | tests: | |
172 | $(..)scripts/merge-test-results.sh -s $(objpfx) $(subdir) \ | |
173 | $(sort $(tests-expected) $(tests-special-notdir:.out=)) \ | |
174 | > $(objpfx)subdir-tests.sum | |
175 | xtests: | |
176 | $(..)scripts/merge-test-results.sh -s $(objpfx) $(subdir) \ | |
177 | $(sort $(xtests) $(xtests-special-notdir:.out=)) \ | |
178 | > $(objpfx)subdir-xtests.sum | |
179 | ||
180 | ifeq ($(build-programs),yes) | |
181 | binaries-all-notests = $(others) $(sysdep-others) | |
182 | binaries-all-tests = $(tests) $(tests-internal) $(xtests) $(test-srcs) \ | |
183 | $(tests-container) | |
184 | binaries-all = $(binaries-all-notests) $(binaries-all-tests) | |
185 | binaries-static-notests = $(others-static) | |
186 | binaries-static-tests = $(tests-static) $(xtests-static) | |
187 | binaries-static = $(binaries-static-notests) $(binaries-static-tests) | |
188 | ifeq (yesyes,$(have-fpie)$(build-shared)) | |
189 | binaries-pie-tests = $(tests-pie) $(xtests-pie) | |
190 | binaries-pie-notests = $(others-pie) | |
191 | else | |
192 | binaries-pie-tests = | |
193 | binaries-pie-notests = | |
194 | endif | |
195 | binaries-mcheck-tests = $(tests-mcheck:%=%-mcheck) | |
196 | else | |
197 | binaries-all-notests = | |
198 | binaries-all-tests = $(tests) $(tests-internal) $(xtests) $(test-srcs) | |
199 | binaries-all = $(binaries-all-tests) | |
200 | binaries-static-notests = | |
201 | binaries-static-tests = | |
202 | binaries-static = | |
203 | binaries-pie-tests = | |
204 | binaries-pie-notests = | |
205 | binaries-mcheck-tests = | |
206 | endif | |
207 | ||
208 | binaries-pie = $(binaries-pie-tests) $(binaries-pie-notests) | |
209 | binaries-shared-tests = $(filter-out $(binaries-pie) $(binaries-static), \ | |
210 | $(binaries-all-tests)) | |
211 | binaries-shared-notests = $(filter-out $(binaries-pie) $(binaries-static), \ | |
212 | $(binaries-all-notests)) | |
213 | ||
214 | ifneq "$(strip $(binaries-shared-notests))" "" | |
215 | $(addprefix $(objpfx),$(binaries-shared-notests)): %: %.o \ | |
216 | $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \ | |
217 | $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) | |
218 | $(+link) | |
219 | endif | |
220 | ||
221 | ifneq "$(strip $(binaries-shared-tests))" "" | |
222 | $(addprefix $(objpfx),$(binaries-shared-tests)): %: %.o \ | |
223 | $(link-extra-libs-tests) \ | |
224 | $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \ | |
225 | $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) | |
226 | $(+link-tests) | |
227 | endif | |
228 | ||
229 | ifneq "$(strip $(binaries-mcheck-tests))" "" | |
230 | $(addprefix $(objpfx),$(binaries-mcheck-tests)): %-mcheck: %.o \ | |
231 | $(link-extra-libs-tests) \ | |
232 | $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \ | |
233 | $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) | |
234 | $(+link-tests) | |
235 | endif | |
236 | ||
237 | ifneq "$(strip $(binaries-pie-tests))" "" | |
238 | $(addprefix $(objpfx),$(binaries-pie-tests)): %: %.o \ | |
239 | $(link-extra-libs-tests) \ | |
240 | $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \ | |
241 | $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) | |
242 | $(+link-pie-tests) | |
243 | endif | |
244 | ||
245 | ifneq "$(strip $(binaries-pie-notests))" "" | |
246 | $(addprefix $(objpfx),$(binaries-pie-notests)): %: %.o \ | |
247 | $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \ | |
248 | $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) | |
249 | $(+link-pie) | |
250 | endif | |
251 | ||
252 | ifneq "$(strip $(binaries-static-notests))" "" | |
253 | $(addprefix $(objpfx),$(binaries-static-notests)): %: %.o \ | |
254 | $(sort $(filter $(common-objpfx)lib%,$(link-libc-static))) \ | |
255 | $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) | |
256 | $(+link-static) | |
257 | endif | |
258 | ||
259 | ifneq "$(strip $(binaries-static-tests))" "" | |
260 | $(addprefix $(objpfx),$(binaries-static-tests)): %: %.o \ | |
261 | $(link-extra-libs-tests) \ | |
262 | $(sort $(filter $(common-objpfx)lib%,$(link-libc-static-tests))) \ | |
263 | $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) | |
264 | $(+link-static-tests) | |
265 | endif | |
266 | ||
267 | # All mcheck tests will be run with MALLOC_CHECK_=3 | |
268 | define mcheck-ENVS | |
269 | $(1)-mcheck-ENV = MALLOC_CHECK_=3 | |
270 | endef | |
271 | $(foreach t,$(tests-mcheck),$(eval $(call mcheck-ENVS,$(t)))) | |
272 | ||
273 | ifneq "$(strip $(tests) $(tests-internal) $(xtests) $(test-srcs))" "" | |
274 | # These are the implicit rules for making test outputs | |
275 | # from the test programs and whatever input files are present. | |
276 | ||
277 | define make-test-out | |
278 | $(if $($*-ENV-only),$(test-wrapper-env-only) $($*-ENV-only),\ | |
279 | $(test-wrapper-env) $(run-program-env) $($*-ENV)) \ | |
280 | $(host-test-program-cmd) $($*-ARGS) | |
281 | endef | |
282 | $(objpfx)%.out: %.input $(objpfx)% | |
283 | $(make-test-out) > $@ < $(word 1,$^); \ | |
284 | $(evaluate-test) | |
285 | $(objpfx)%.out: /dev/null $(objpfx)% # Make it 2nd arg for canned sequence. | |
286 | $(make-test-out) > $@; \ | |
287 | $(evaluate-test) | |
288 | ||
289 | ||
290 | # Any tests that require an isolated container (filesystem, network | |
291 | # and pid namespaces) in which to run, should be added to | |
292 | # tests-container. | |
293 | $(tests-container:%=$(objpfx)%.out): $(objpfx)%.out : $(if $(wildcard $(objpfx)%.files),$(objpfx)%.files,/dev/null) $(objpfx)% | |
294 | $(test-wrapper-env) $(run-program-env) $(run-via-rtld-prefix) \ | |
295 | $(common-objpfx)support/test-container env $(run-program-env) $($*-ENV) \ | |
296 | $(host-test-program-cmd) $($*-ARGS) > $@; \ | |
297 | $(evaluate-test) | |
298 | ||
299 | ||
300 | # tests-unsupported lists tests that we will not try to build at all in | |
301 | # this configuration. Note this runs every time because it does not | |
302 | # actually create its target. The dependency on Makefile is meant to | |
303 | # ensure that it runs after a Makefile change to add a test to the list | |
304 | # when it previously ran and produced a .out file (probably for a failure). | |
305 | ifneq "$(strip $(tests-unsupported))" "" | |
306 | $(tests-unsupported:%=$(objpfx)%.out): $(objpfx)%.out: Makefile | |
307 | @rm -f $@ | |
308 | $(..)scripts/evaluate-test.sh $(patsubst $(common-objpfx)%.out,%,$@) \ | |
309 | 77 false false > $(@:.out=.test-result) | |
310 | endif | |
311 | ||
312 | endif # tests | |
313 | ||
314 | ifneq "$(strip $(tests-printers))" "" | |
315 | ||
316 | # Static pattern rule for building the test programs for the pretty printers. | |
317 | $(tests-printers-programs): %: %.o $(tests-printers-libs) \ | |
318 | $(sort $(filter $(common-objpfx)lib%,$(link-libc-static-tests))) \ | |
319 | $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) | |
320 | $(+link-printers-tests) | |
321 | ||
322 | # Add the paths to the generated constants file and test_common_printers.py | |
323 | # to PYTHONPATH so the test scripts can find them. | |
324 | py-env := PYTHONPATH=$(py-const-dir):$(..)scripts:$${PYTHONPATH} | |
325 | ||
326 | # Static pattern rule that matches the test-* targets to their .c and .py | |
327 | # prerequisites. It'll run the corresponding test script for each test program | |
328 | # we compiled and place its output in the corresponding .out file. | |
329 | # The pretty printer files and test_common_printers.py must be present for all. | |
330 | $(tests-printers-out): $(objpfx)%.out: $(objpfx)% %.py %.c $(pretty-printers) \ | |
331 | $(..)scripts/test_printers_common.py | |
332 | $(test-wrapper-env) $(py-env) \ | |
333 | $(PYTHON) $*.py $*.c $(objpfx)$* $(pretty-printers) > $@; \ | |
334 | $(evaluate-test) | |
335 | endif | |
336 | ||
337 | \f | |
338 | .PHONY: distclean realclean subdir_distclean subdir_realclean \ | |
339 | subdir_clean subdir_mostlyclean subdir_testclean | |
340 | subdir_mostlyclean: mostlyclean | |
341 | subdir_clean: clean | |
342 | subdir_distclean: distclean | |
343 | subdir_realclean: realclean | |
344 | subdir_testclean: do-tests-clean | |
345 | realclean: distclean | |
346 | distclean: clean | |
347 | ||
348 | # We want to install everything except the library itself, but update all | |
349 | # our portions of the library because the parent make will install it later | |
350 | # (likewise the stubs file). | |
351 | .PHONY: subdir_install | |
352 | subdir_install: install-no-libc.a lib-noranlib stubs | |
353 | ||
354 | .PHONY: subdir_objs subdir_stubs | |
355 | subdir_objs: objs | |
356 | subdir_stubs: stubs | |
357 | ||
358 | # Target required by the Hurd to ensure that all the MiG-generated | |
359 | # headers are in place before building a subdirectory. | |
360 | .PHONY: before-compile | |
361 | before-compile: $(before-compile) | |
362 | ||
363 | $(common-objpfx)dummy.o: $(common-objpfx)dummy.c $(before-compile); | |
364 | $(compile-command.c) | |
365 | ||
366 | # Local Variables: | |
367 | # mode: makefile | |
368 | # End: |