1# Makefile.am -- Backtrace Makefile.
2# Copyright (C) 2012-2022 Free Software Foundation, Inc.
3
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions are
6# met:
7
8#     (1) Redistributions of source code must retain the above copyright
9#     notice, this list of conditions and the following disclaimer.
10
11#     (2) Redistributions in binary form must reproduce the above copyright
12#     notice, this list of conditions and the following disclaimer in
13#     the documentation and/or other materials provided with the
14#     distribution.
15
16#     (3) The name of the author may not be used to
17#     endorse or promote products derived from this software without
18#     specific prior written permission.
19
20# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
24# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
29# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30# POSSIBILITY OF SUCH DAMAGE.
31
32ACLOCAL_AMFLAGS = -I .. -I ../config
33
34AM_CPPFLAGS = -I $(top_srcdir)/../include -I $(top_srcdir)/../libgcc \
35	-I ../libgcc
36
37AM_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) $(PIC_FLAG) $(CET_HOST_FLAGS)
38
39noinst_LTLIBRARIES = libbacktrace.la
40
41libbacktrace_la_SOURCES = \
42	backtrace.h \
43	atomic.c \
44	dwarf.c \
45	fileline.c \
46	internal.h \
47	posix.c \
48	print.c \
49	sort.c \
50	state.c
51
52BACKTRACE_FILES = \
53	backtrace.c \
54	simple.c \
55	nounwind.c
56
57FORMAT_FILES = \
58	elf.c \
59	macho.c \
60	pecoff.c \
61	unknown.c \
62	xcoff.c
63
64VIEW_FILES = \
65	read.c \
66	mmapio.c
67
68ALLOC_FILES = \
69	alloc.c \
70	mmap.c
71
72EXTRA_libbacktrace_la_SOURCES = \
73	$(BACKTRACE_FILES) \
74	$(FORMAT_FILES) \
75	$(VIEW_FILES) \
76	$(ALLOC_FILES)
77
78libbacktrace_la_LIBADD = \
79	$(BACKTRACE_FILE) \
80	$(FORMAT_FILE) \
81	$(VIEW_FILE) \
82	$(ALLOC_FILE)
83
84libbacktrace_la_DEPENDENCIES = $(libbacktrace_la_LIBADD)
85
86# Testsuite.
87
88# Add a test to this variable if you want it to be built.
89check_PROGRAMS =
90
91# Add a test to this variable if you want it to be run.
92TESTS =
93
94# Add a test to this variable if you want it to be built and run.
95BUILDTESTS =
96
97# Add a file to this variable if you want it to be built for testing.
98check_DATA =
99
100# Flags to use when compiling test programs.
101libbacktrace_TEST_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) -g
102
103if USE_DSYMUTIL
104
105%.dSYM: %
106	$(DSYMUTIL) $<
107
108endif USE_DSYMUTIL
109
110if NATIVE
111check_LTLIBRARIES = libbacktrace_alloc.la
112
113libbacktrace_alloc_la_SOURCES = $(libbacktrace_la_SOURCES)
114libbacktrace_alloc_la_LIBADD = $(BACKTRACE_FILE) $(FORMAT_FILE) read.lo alloc.lo
115
116libbacktrace_alloc_la_DEPENDENCIES = $(libbacktrace_alloc_la_LIBADD)
117
118check_LTLIBRARIES += libbacktrace_noformat.la
119
120libbacktrace_noformat_la_SOURCES = $(libbacktrace_la_SOURCES)
121libbacktrace_noformat_la_LIBADD = $(BACKTRACE_FILE) $(VIEW_FILE) $(ALLOC_FILE)
122
123libbacktrace_noformat_la_DEPENDENCIES = $(libbacktrace_noformat_la_LIBADD)
124
125if HAVE_ELF
126if HAVE_OBJCOPY_DEBUGLINK
127
128TEST_BUILD_ID_DIR=$(abs_builddir)/usr/lib/debug/.build-id/
129
130check_LTLIBRARIES += libbacktrace_elf_for_test.la
131
132libbacktrace_elf_for_test_la_SOURCES = $(libbacktrace_la_SOURCES)
133libbacktrace_elf_for_test_la_LIBADD = $(BACKTRACE_FILE) elf_for_test.lo \
134	$(VIEW_FILE) $(ALLOC_FILE)
135
136elf_for_test.c: elf.c
137	SEARCH='^#define SYSTEM_BUILD_ID_DIR.*$$'; \
138	REPLACE="#define SYSTEM_BUILD_ID_DIR \"$(TEST_BUILD_ID_DIR)\""; \
139	$(SED) "s%$$SEARCH%$$REPLACE%" \
140		$< \
141		> $@.tmp
142	mv $@.tmp $@
143
144endif HAVE_OBJCOPY_DEBUGLINK
145endif HAVE_ELF
146
147elf_%.c: elf.c
148	nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"; \
149	SEARCH='#error "Unknown BACKTRACE_ELF_SIZE"'; \
150	REPLACE="#undef BACKTRACE_ELF_SIZE\\$${nl}#define BACKTRACE_ELF_SIZE"; \
151	$(SED) "s/^$$SEARCH\$$/$$REPLACE $*/" \
152		$< \
153		> $@.tmp
154	mv $@.tmp $@
155
156xcoff_%.c: xcoff.c
157	nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"; \
158	SEARCH='#error "Unknown BACKTRACE_XCOFF_SIZE"'; \
159	REPLACE="#undef BACKTRACE_XCOFF_SIZE\\$${nl}#define BACKTRACE_XCOFF_SIZE"; \
160	$(SED) "s/^$$SEARCH\$$/$$REPLACE $*/" \
161		$< \
162		> $@.tmp
163	mv $@.tmp $@
164
165test_elf_32_SOURCES = test_format.c testlib.c
166test_elf_32_CFLAGS = $(libbacktrace_TEST_CFLAGS)
167test_elf_32_LDADD = libbacktrace_noformat.la elf_32.lo
168
169BUILDTESTS += test_elf_32
170
171test_elf_64_SOURCES = test_format.c testlib.c
172test_elf_64_CFLAGS = $(libbacktrace_TEST_CFLAGS)
173test_elf_64_LDADD = libbacktrace_noformat.la elf_64.lo
174
175BUILDTESTS += test_elf_64
176
177test_macho_SOURCES = test_format.c testlib.c
178test_macho_CFLAGS = $(libbacktrace_TEST_CFLAGS)
179test_macho_LDADD = libbacktrace_noformat.la macho.lo
180
181BUILDTESTS += test_macho
182
183test_xcoff_32_SOURCES = test_format.c testlib.c
184test_xcoff_32_CFLAGS = $(libbacktrace_TEST_CFLAGS)
185test_xcoff_32_LDADD = libbacktrace_noformat.la xcoff_32.lo
186
187BUILDTESTS += test_xcoff_32
188
189test_xcoff_64_SOURCES = test_format.c testlib.c
190test_xcoff_64_CFLAGS = $(libbacktrace_TEST_CFLAGS)
191test_xcoff_64_LDADD = libbacktrace_noformat.la xcoff_64.lo
192
193BUILDTESTS += test_xcoff_64
194
195test_pecoff_SOURCES = test_format.c testlib.c
196test_pecoff_CFLAGS = $(libbacktrace_TEST_CFLAGS)
197test_pecoff_LDADD = libbacktrace_noformat.la pecoff.lo
198
199BUILDTESTS += test_pecoff
200
201test_unknown_SOURCES = test_format.c testlib.c
202test_unknown_CFLAGS = $(libbacktrace_TEST_CFLAGS)
203test_unknown_LDADD = libbacktrace_noformat.la unknown.lo
204
205BUILDTESTS += test_unknown
206
207unittest_SOURCES = unittest.c testlib.c
208unittest_CFLAGS = $(libbacktrace_TEST_CFLAGS)
209unittest_LDADD = libbacktrace.la
210
211BUILDTESTS += unittest
212
213unittest_alloc_SOURCES = $(unittest_SOURCES)
214unittest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS)
215unittest_alloc_LDADD = libbacktrace_alloc.la
216
217BUILDTESTS += unittest_alloc
218
219check_LTLIBRARIES += libbacktrace_instrumented_alloc.la
220
221libbacktrace_instrumented_alloc_la_SOURCES = $(libbacktrace_la_SOURCES)
222libbacktrace_instrumented_alloc_la_LIBADD = $(BACKTRACE_FILE) $(FORMAT_FILE) \
223	read.lo instrumented_alloc.lo
224
225libbacktrace_instrumented_alloc_la_DEPENDENCIES = \
226	$(libbacktrace_instrumented_alloc_la_LIBADD)
227
228instrumented_alloc.lo: alloc.c
229
230allocfail_SOURCES = allocfail.c testlib.c
231allocfail_CFLAGS = $(libbacktrace_TEST_CFLAGS)
232allocfail_LDADD = libbacktrace_instrumented_alloc.la
233
234check_PROGRAMS += allocfail
235
236allocfail.sh: allocfail
237
238TESTS += allocfail.sh
239
240if USE_DSYMUTIL
241check_DATA += allocfail.dSYM
242endif USE_DSYMUTIL
243
244if HAVE_ELF
245if HAVE_OBJCOPY_DEBUGLINK
246
247b2test_SOURCES = $(btest_SOURCES)
248b2test_CFLAGS = $(libbacktrace_TEST_CFLAGS)
249b2test_LDFLAGS = -Wl,--build-id
250b2test_LDADD = libbacktrace_elf_for_test.la
251
252check_PROGRAMS += b2test
253TESTS += b2test_buildid
254
255if HAVE_DWZ
256
257b3test_SOURCES = $(btest_SOURCES)
258b3test_CFLAGS = $(libbacktrace_TEST_CFLAGS)
259b3test_LDFLAGS = -Wl,--build-id
260b3test_LDADD = libbacktrace_elf_for_test.la
261
262check_PROGRAMS += b3test
263TESTS += b3test_dwz_buildid
264
265endif HAVE_DWZ
266
267endif HAVE_OBJCOPY_DEBUGLINK
268endif HAVE_ELF
269
270btest_SOURCES = btest.c testlib.c
271btest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -O
272btest_LDADD = libbacktrace.la
273
274BUILDTESTS += btest
275
276if USE_DSYMUTIL
277check_DATA += btest.dSYM
278endif USE_DSYMUTIL
279
280if HAVE_ELF
281
282btest_lto_SOURCES = btest.c testlib.c
283btest_lto_CFLAGS = $(libbacktrace_TEST_CFLAGS) -O -flto
284btest_lto_LDADD = libbacktrace.la
285
286BUILDTESTS += btest_lto
287
288endif HAVE_ELF
289
290btest_alloc_SOURCES = $(btest_SOURCES)
291btest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS)
292btest_alloc_LDADD = libbacktrace_alloc.la
293
294BUILDTESTS += btest_alloc
295
296if USE_DSYMUTIL
297check_DATA += btest_alloc.dSYM
298endif USE_DSYMUTIL
299
300if HAVE_DWZ
301
302%_dwz: %
303	rm -f $@ $@_common.debug
304	cp $< $@_1
305	cp $< $@_2
306	if $(DWZ) -m $@_common.debug $@_1 $@_2; then \
307	  rm -f $@_2; \
308	  mv $@_1 $@; \
309	else \
310	  echo "Ignoring dwz errors, assuming that test passes"; \
311	  cp $< $@; \
312	fi
313
314TESTS += btest_dwz
315
316if HAVE_OBJCOPY_DEBUGLINK
317
318TESTS += btest_dwz_gnudebuglink
319
320endif HAVE_OBJCOPY_DEBUGLINK
321
322endif HAVE_DWZ
323
324stest_SOURCES = stest.c
325stest_CFLAGS = $(libbacktrace_TEST_CFLAGS)
326stest_LDADD = libbacktrace.la
327
328BUILDTESTS += stest
329
330if USE_DSYMUTIL
331check_DATA += stest.dSYM
332endif USE_DSYMUTIL
333
334stest_alloc_SOURCES = $(stest_SOURCES)
335stest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS)
336stest_alloc_LDADD = libbacktrace_alloc.la
337
338BUILDTESTS += stest_alloc
339
340if USE_DSYMUTIL
341check_DATA += stest_alloc.dSYM
342endif USE_DSYMUTIL
343
344if HAVE_ELF
345
346ztest_SOURCES = ztest.c testlib.c
347ztest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -DSRCDIR=\"$(srcdir)\"
348ztest_LDADD = libbacktrace.la
349ztest_alloc_LDADD = libbacktrace_alloc.la
350
351if HAVE_ZLIB
352ztest_LDADD += -lz
353ztest_alloc_LDADD += -lz
354endif
355ztest_LDADD += $(CLOCK_GETTIME_LINK)
356ztest_alloc_LDADD += $(CLOCK_GETTIME_LINK)
357
358BUILDTESTS += ztest
359
360ztest_alloc_SOURCES = $(ztest_SOURCES)
361ztest_alloc_CFLAGS = $(ztest_CFLAGS)
362
363BUILDTESTS += ztest_alloc
364
365endif HAVE_ELF
366
367edtest_SOURCES = edtest.c edtest2_build.c testlib.c
368edtest_CFLAGS = $(libbacktrace_TEST_CFLAGS)
369edtest_LDADD = libbacktrace.la
370
371BUILDTESTS += edtest
372
373if USE_DSYMUTIL
374check_DATA += edtest.dSYM
375endif USE_DSYMUTIL
376
377edtest_alloc_SOURCES = $(edtest_SOURCES)
378edtest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS)
379edtest_alloc_LDADD = libbacktrace_alloc.la
380
381if USE_DSYMUTIL
382check_DATA += edtest_alloc.dSYM
383endif USE_DSYMUTIL
384
385BUILDTESTS += edtest_alloc
386
387edtest2_build.c: gen_edtest2_build; @true
388gen_edtest2_build: $(srcdir)/edtest2.c
389	cat $(srcdir)/edtest2.c > tmp-edtest2_build.c
390	$(SHELL) $(srcdir)/../move-if-change tmp-edtest2_build.c edtest2_build.c
391	echo timestamp > $@
392
393if HAVE_PTHREAD
394
395BUILDTESTS += ttest
396
397ttest_SOURCES = ttest.c testlib.c
398ttest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -pthread
399ttest_LDADD = libbacktrace.la
400
401if USE_DSYMUTIL
402check_DATA += ttest.dSYM
403endif USE_DSYMUTIL
404
405BUILDTESTS += ttest_alloc
406
407ttest_alloc_SOURCES = $(ttest_SOURCES)
408ttest_alloc_CFLAGS = $(ttest_CFLAGS)
409ttest_alloc_LDADD = libbacktrace_alloc.la
410
411if USE_DSYMUTIL
412check_DATA += ttest_alloc.dSYM
413endif USE_DSYMUTIL
414
415endif HAVE_PTHREAD
416
417if HAVE_OBJCOPY_DEBUGLINK
418
419TESTS += btest_gnudebuglink
420
421%_gnudebuglink: %
422	$(OBJCOPY) --only-keep-debug $< $@.debug
423	$(OBJCOPY) --strip-debug --add-gnu-debuglink=$@.debug $< $@
424
425endif HAVE_OBJCOPY_DEBUGLINK
426
427%_buildid: %
428	./install-debuginfo-for-buildid.sh \
429	  "$(TEST_BUILD_ID_DIR)" \
430	  $<
431	$(OBJCOPY) --strip-debug $< $@
432
433if HAVE_COMPRESSED_DEBUG
434
435ctestg_SOURCES = btest.c testlib.c
436ctestg_CFLAGS = $(libbacktrace_TEST_CFLAGS)
437ctestg_LDFLAGS = -Wl,--compress-debug-sections=zlib-gnu
438ctestg_LDADD = libbacktrace.la
439
440ctesta_SOURCES = btest.c testlib.c
441ctesta_CFLAGS = $(libbacktrace_TEST_CFLAGS)
442ctesta_LDFLAGS = -Wl,--compress-debug-sections=zlib-gabi
443ctesta_LDADD = libbacktrace.la
444
445BUILDTESTS += ctestg ctesta
446
447ctestg_alloc_SOURCES = $(ctestg_SOURCES)
448ctestg_alloc_CFLAGS = $(ctestg_CFLAGS)
449ctestg_alloc_LDFLAGS = $(ctestg_LDFLAGS)
450ctestg_alloc_LDADD = libbacktrace_alloc.la
451
452ctesta_alloc_SOURCES = $(ctesta_SOURCES)
453ctesta_alloc_CFLAGS = $(ctesta_CFLAGS)
454ctesta_alloc_LDFLAGS = $(ctesta_LDFLAGS)
455ctesta_alloc_LDADD = libbacktrace_alloc.la
456
457BUILDTESTS += ctestg_alloc ctesta_alloc
458
459endif
460
461if HAVE_DWARF5
462
463dwarf5_SOURCES = btest.c testlib.c
464dwarf5_CFLAGS = $(libbacktrace_TEST_CFLAGS) -gdwarf-5
465dwarf5_LDADD = libbacktrace.la
466
467BUILDTESTS += dwarf5
468
469if USE_DSYMUTIL
470check_DATA += dwarf5.dSYM
471endif USE_DSYMUTIL
472
473dwarf5_alloc_SOURCES = $(dwarf5_SOURCES)
474dwarf5_alloc_CFLAGS = $(dwarf5_CFLAGS)
475dwarf5_alloc_LDADD = libbacktrace_alloc.la
476
477BUILDTESTS += dwarf5_alloc
478
479if USE_DSYMUTIL
480check_DATA += dwarf5_alloc.dSYM
481endif USE_DSYMUTIL
482
483endif
484
485mtest_SOURCES = mtest.c testlib.c
486mtest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -O
487mtest_LDADD = libbacktrace.la
488
489BUILDTESTS += mtest
490
491if USE_DSYMUTIL
492check_DATA += mtest.dSYM
493endif USE_DSYMUTIL
494
495if HAVE_MINIDEBUG
496
497TESTS += mtest_minidebug
498
499%_minidebug: %
500	$(NM) -D $< -P --defined-only | $(AWK) '{ print $$1 }' | sort > $<.dsyms
501	$(NM) $< -P --defined-only | $(AWK) '{ if ($$2 == "T" || $$2 == "t" || $$2 == "D") print $$1 }' | sort > $<.fsyms
502	$(COMM) -13 $<.dsyms $<.fsyms > $<.keepsyms
503	$(OBJCOPY) --only-keep-debug $< $<.dbg
504	$(OBJCOPY) -S --remove-section .gdb_index --remove-section .comment --keep-symbols=$<.keepsyms $<.dbg $<.mdbg
505	$(OBJCOPY) --strip-all --remove-section ..comment $< $<.strip
506	rm -f $<.mdbg.xz
507	$(XZ) $<.mdbg
508	$(OBJCOPY) --add-section .gnu_debugdata=$<.mdbg.xz $<.strip
509	mv $<.strip $@
510
511endif HAVE_MINIDEBUG
512
513endif NATIVE
514
515if HAVE_ELF
516
517xztest_SOURCES = xztest.c testlib.c
518xztest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -DSRCDIR=\"$(srcdir)\"
519xztest_LDADD = libbacktrace.la
520
521xztest_alloc_SOURCES = $(xztest_SOURCES)
522xztest_alloc_CFLAGS = $(xztest_CFLAGS)
523xztest_alloc_LDADD = libbacktrace_alloc.la
524
525if HAVE_LIBLZMA
526xztest_LDADD += -llzma
527xztest_alloc_LDADD += -llzma
528endif
529
530xztest_LDADD += $(CLOCK_GETTIME_LINK)
531xztest_alloc_LDADD += $(CLOCK_GETTIME_LINK)
532
533BUILDTESTS += xztest xztest_alloc
534
535endif HAVE_ELF
536
537check_PROGRAMS += $(BUILDTESTS)
538
539TESTS += $(BUILDTESTS)
540
541CLEANFILES = \
542	$(TESTS) *.debug elf_for_test.c edtest2_build.c gen_edtest2_build \
543	*.dsyms *.fsyms *.keepsyms *.dbg *.mdbg *.mdbg.xz *.strip
544
545clean-local:
546	-rm -rf usr
547
548# We can't use automake's automatic dependency tracking, because it
549# breaks when using bootstrap-lean.  Automatic dependency tracking
550# with GCC bootstrap will cause some of the objects to depend on
551# header files in prev-gcc/include, e.g., stddef.h and stdarg.h.  When
552# using bootstrap-lean, prev-gcc is removed after each stage.  When
553# running "make install", those header files will be gone, causing the
554# library to be rebuilt at install time.  That may not succeed.
555
556# These manual dependencies do not include dependencies on unwind.h,
557# even though that is part of GCC, because where to find it depends on
558# whether we are being built as a host library or a target library.
559
560INCDIR = $(top_srcdir)/../include
561alloc.lo: config.h backtrace.h internal.h
562backtrace.lo: config.h backtrace.h internal.h
563btest.lo: $(INCDIR)/filenames.h backtrace.h backtrace-supported.h
564dwarf.lo: config.h $(INCDIR)/dwarf2.h $(INCDIR)/dwarf2.def \
565	$(INCDIR)/filenames.h backtrace.h internal.h
566elf.lo: config.h backtrace.h internal.h
567fileline.lo: config.h backtrace.h internal.h
568macho.lo: config.h backtrace.h internal.h
569mmap.lo: config.h backtrace.h internal.h
570mmapio.lo: config.h backtrace.h internal.h
571mtest.lo: backtrace.h backtrace-supported.h
572nounwind.lo: config.h internal.h
573pecoff.lo: config.h backtrace.h internal.h
574posix.lo: config.h backtrace.h internal.h
575print.lo: config.h backtrace.h internal.h
576read.lo: config.h backtrace.h internal.h
577simple.lo: config.h backtrace.h internal.h
578sort.lo: config.h backtrace.h internal.h
579stest.lo: config.h backtrace.h internal.h
580state.lo: config.h backtrace.h backtrace-supported.h internal.h
581unknown.lo: config.h backtrace.h internal.h
582xcoff.lo: config.h backtrace.h internal.h
583xztest.lo: config.h backtrace.h backtrace-supported.h internal.h testlib.h
584ztest.lo: config.h backtrace.h backtrace-supported.h internal.h testlib.h
585
586include $(top_srcdir)/../multilib.am
587