mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-21 04:42:53 +08:00
e83907ff5f
If GDB, GDBserver, a testcase program, Valgrind, etc. unexpectedly crash while running the GDB testsuite, and you've setup your machine such that core files are dumped in the current directory instead of being shoved somewhere by abrt, apport, or similar (as you should for proper GDB testing), you'll end up with an unexpected core file in the $build/gdb/testsuite/ directory. It can happen that GDB, GDBserver, etc. even crashes _after_ gdb_exit, during teardown, and thus such a crash won't be noticed by looking at the gdb.sum file at all. This commit aims at improving that, by including a new "unexpected core files" line in the testrun summary. For example, here's what I get on x86-64 Ubuntu 20.04, with this patch: === gdb Summary === # of unexpected core files 12 << new info # of expected passes 107557 # of unexpected failures 35 # of expected failures 77 # of unknown successes 2 # of known failures 114 # of untested testcases 31 # of unsupported tests 139 I have my core pattern setup like this: $ cat /proc/sys/kernel/core_pattern core.%e.%p.%h.%t That's: %e: executable filename %p: pid %h: hostname %t: UNIX time of dump and so I get these core files: $ ls -1 testsuite/core.* testsuite/core.connect-with-no.216191.nelson.1656002431 testsuite/core.connect-with-no.217729.nelson.1656002431 testsuite/core.gdb.194247.nelson.1656002423 testsuite/core.gdb.226014.nelson.1656002435 testsuite/core.gdb.232078.nelson.1656002438 testsuite/core.gdb.352268.nelson.1656002441 testsuite/core.gdb.4152093.nelson.1656002337 testsuite/core.gdb.4154515.nelson.1656002338 testsuite/core.gdb.4156668.nelson.1656002339 testsuite/core.gdb.4158871.nelson.1656002341 testsuite/core.gdb.468495.nelson.1656002444 testsuite/core.vgdb.4192247.nelson.1656002366 where we can see that GDB crashed a number of times, but also Valgrind's vgdb, and a couple testcase programs. Neither of which is good. If your core_pattern is just "core" (but why??), then I guess that you may end up with just a single core file in testsuite/. Still, that is one core file too many. Above, we see a couple cores for "connect-with-no", which are the result of gdb.server/connect-with-no-symbol-file.exp. This is a case mentioned above -- while the program crashed, that happens during testcase teardown, and it goes unnoticed (without this commit) by gdb.sum results. Vis: $ make check TESTS="gdb.server/connect-with-no-symbol-file.exp" ... === gdb Summary === # of unexpected core files 2 # of expected passes 8 ... $ The tests fully passed, but still the testcase program crashed somehow: $ ls -1 testsuite/core.* testsuite/core.connect-with-no.941561.nelson.1656003317 testsuite/core.connect-with-no.941682.nelson.1656003317 Against --target_board=native-extended-gdbserver it's even worse. I get: # of unexpected core files 26 and note that when GDBserver hits an assertion failure, it exits with error, instead of crashing with SIGABRT. I think that should be changed, at least on development builds, but that would be for another patch. After such patch, I suspect the number of unexpected cores will be higher, as there are likely teardown GDBserver assertions that we're not noticing. I decided to put this new info in the "gdb Summary" section, as that's a place people already are used to looking at, either when looking at the tail of gdb.sum, or when diffing gdb.sum files, and we've already extended this section before, to include the count of DUPLICATE and PATH problems, so there's precedent. Implementation-wise, the new line is appended after DejaGnu is finished, with a shell script that is invoked by the Makefile. It is done this way so that serial and parallel testing work the same way. My initial cut at an implementation was in TCL, straight in testsuite/lib/check-test-names.exp, where DUPLICATES and PATH are handled, like so: @@ -148,6 +159,10 @@ namespace eval ::CheckTestNames { $counts(paths,$which) maybe_show_count "# of duplicate test names\t" \ $counts(duplicates,$which) + + set cores [glob -nocomplain -directory $::objdir core*] + maybe_show_count "# of unexpected core files\t" \ + [llength $cores] } But that would only work for serial testing, as in parallel testing, the final gdb.sum is generated by aggregating the results of all the individual gdb.sum files, and dg-extract-results.sh doesn't know about our new summary line. And I don't think that dg-extract-results.sh should be taught about it, since the count of core files is not something that we want to count many times, once per testcase, and then add up the subcounts at the end. Every time we count the core files, we're already counting the final count. I considered using the Tcl implementation in serial mode, and the script approach for parallel testing, but that has the obvious downside of implementing and maintaining the same thing twice. In the end, I settled on the script approach for serial mode too, which requires making the "check-single" rule print the tail end of the gdb.sum file, with a side effect being that if you look at the terminal after a run (instead of at the gdb.sum file), you'll see the "gdb Summary" section twice, once without the unexpected core lines printed, and then another with. IMO, this isn't an issue; when testing in parallel mode, if you look at the terminal after "make -jN check", you'll also see multiple "gdb Summary" sections printed. Change-Id: I190b8d41856d49ad143854b6e3e6ccd7caa04491
420 lines
15 KiB
Makefile
420 lines
15 KiB
Makefile
# Makefile for regression testing the GNU debugger.
|
|
# Copyright 1992-2022 Free Software Foundation, Inc.
|
|
|
|
# This file is part of GDB.
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
VPATH = @srcdir@
|
|
srcdir = @srcdir@
|
|
prefix = @prefix@
|
|
exec_prefix = @exec_prefix@
|
|
abs_builddir = @abs_builddir@
|
|
abs_srcdir = @abs_srcdir@
|
|
|
|
target_alias = @target_noncanonical@
|
|
program_transform_name = @program_transform_name@
|
|
build_canonical = @build@
|
|
host_canonical = @host@
|
|
target_canonical = @target@
|
|
enable_libctf = @enable_libctf@
|
|
|
|
SHELL = @SHELL@
|
|
EXEEXT = @EXEEXT@
|
|
SUBDIRS = @subdirs@
|
|
RPATH_ENVVAR = @RPATH_ENVVAR@
|
|
|
|
CC=@CC@
|
|
|
|
EXPECT = `if [ "$${READ1}" != "" ] ; then \
|
|
echo $${rootme}/expect-read1; \
|
|
elif [ "$${READMORE}" != "" ] ; then \
|
|
echo $${rootme}/expect-readmore; \
|
|
elif [ -f $${rootme}/../../expect/expect ] ; then \
|
|
echo $${rootme}/../../expect/expect ; \
|
|
else \
|
|
echo expect ; \
|
|
fi`
|
|
|
|
RUNTEST = $(RUNTEST_FOR_TARGET)
|
|
|
|
RUNTESTFLAGS =
|
|
|
|
FORCE_PARALLEL =
|
|
|
|
GDB_DEBUG =
|
|
GDBSERVER_DEBUG =
|
|
|
|
# Default number of iterations that we will use to run the testsuite
|
|
# if the user does not specify the RACY_ITER environment variable
|
|
# (e.g., when the user calls the make rule directly from the command
|
|
# line).
|
|
DEFAULT_RACY_ITER = 3
|
|
|
|
RUNTEST_FOR_TARGET = `\
|
|
if [ -f $${srcdir}/../../dejagnu/runtest ]; then \
|
|
echo $${srcdir}/../../dejagnu/runtest; \
|
|
else \
|
|
if [ "$(host_canonical)" = "$(target_canonical)" ]; then \
|
|
echo runtest; \
|
|
else \
|
|
t='$(program_transform_name)'; echo runtest | sed -e $$t; \
|
|
fi; \
|
|
fi`
|
|
|
|
#### host, target, and site specific Makefile frags come in here.
|
|
|
|
# The use of $$(x_FOR_TARGET) reduces the command line length by not
|
|
# duplicating the lengthy definition.
|
|
|
|
TARGET_FLAGS_TO_PASS = \
|
|
"prefix=$(prefix)" \
|
|
"exec_prefix=$(exec_prefix)" \
|
|
"against=$(against)" \
|
|
'CC=$$(CC_FOR_TARGET)' \
|
|
"CC_FOR_TARGET=$(CC_FOR_TARGET)" \
|
|
"CFLAGS=$(TESTSUITE_CFLAGS)" \
|
|
'CXX=$$(CXX_FOR_TARGET)' \
|
|
"CXX_FOR_TARGET=$(CXX_FOR_TARGET)" \
|
|
"CXXFLAGS=$(CXXFLAGS)" \
|
|
"MAKEINFO=$(MAKEINFO)" \
|
|
"INSTALL=$(INSTALL)" \
|
|
"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
|
|
"INSTALL_DATA=$(INSTALL_DATA)" \
|
|
"LDFLAGS=$(LDFLAGS)" \
|
|
"LIBS=$(LIBS)" \
|
|
"RUNTEST=$(RUNTEST)" \
|
|
"RUNTESTFLAGS=$(RUNTESTFLAGS)"
|
|
|
|
all:
|
|
@:
|
|
|
|
.NOEXPORT:
|
|
INFODIRS=doc
|
|
info:
|
|
install-info:
|
|
dvi:
|
|
pdf:
|
|
install-pdf:
|
|
html:
|
|
install-html:
|
|
|
|
install:
|
|
|
|
uninstall: force
|
|
|
|
# Use absolute `site.exp' path everywhere to suppress VPATH lookups for it.
|
|
# Bare `site.exp' is used as a target here if user requests it explicitly.
|
|
# $(RUNTEST) is looking up `site.exp' only in the current directory.
|
|
|
|
$(abs_builddir)/site.exp site.exp: Makefile
|
|
$(ECHO_GEN) \
|
|
rm -f ./tmp?; \
|
|
touch site.exp; \
|
|
mv site.exp site.bak; \
|
|
echo "## these variables are automatically generated by make ##" > ./tmp0; \
|
|
echo "# Do not edit here. If you wish to override these values" >> ./tmp0; \
|
|
echo "# add them to the last section" >> ./tmp0; \
|
|
echo "set host_triplet ${host_canonical}" >> ./tmp0; \
|
|
echo "set target_alias $(target_alias)" >> ./tmp0; \
|
|
echo "set target_triplet ${target_canonical}" >> ./tmp0; \
|
|
echo "set build_triplet ${build_canonical}" >> ./tmp0; \
|
|
echo "set srcdir ${abs_srcdir}" >> ./tmp0; \
|
|
echo "set tool gdb" >> ./tmp0; \
|
|
echo "set enable_libctf ${enable_libctf}" >> ./tmp0; \
|
|
echo 'source $${srcdir}/lib/append_gdb_boards_dir.exp' >> ./tmp0; \
|
|
echo "## All variables above are generated by configure. Do Not Edit ##" >> ./tmp0; \
|
|
cat ./tmp0 > site.exp; \
|
|
cat site.bak | sed \
|
|
-e '1,/^## All variables above are.*##/ d' >> site.exp; \
|
|
rm -f ./tmp?
|
|
|
|
installcheck:
|
|
|
|
# See whether -j was given to make. Before GNU make 4.2, either it was
|
|
# given with no arguments, and appears as "j" in the first word, or it was
|
|
# given an argument and appears as "-j" in a separate word. Starting with
|
|
# GNU make 4.2, it always appears as "-j"/"-jN" in a separate word.
|
|
saw_dash_j = $(or $(findstring j,$(firstword $(MAKEFLAGS))),$(filter -j%,$(MAKEFLAGS)))
|
|
|
|
# Try to run the tests in parallel if any -j option is given. If RUNTESTFLAGS
|
|
# is not empty, then by default the tests will be serialized. This can be
|
|
# overridden by setting FORCE_PARALLEL to any non-empty value.
|
|
CHECK_TARGET_TMP = $(if $(FORCE_PARALLEL),check-parallel,$(if $(RUNTESTFLAGS),check-single,$(if $(saw_dash_j),check-parallel,check-single)))
|
|
CHECK_TARGET = $(if $(RACY_ITER),$(addsuffix -racy,$(CHECK_TARGET_TMP)),$(CHECK_TARGET_TMP))
|
|
|
|
# Note that we must resort to a recursive make invocation here,
|
|
# because GNU make 3.82 has a bug preventing MAKEFLAGS from being used
|
|
# in conditions.
|
|
check: all $(abs_builddir)/site.exp
|
|
$(MAKE) $(CHECK_TARGET)
|
|
|
|
check-read1: read1.so expect-read1
|
|
$(MAKE) READ1="1" check
|
|
|
|
check-readmore: readmore.so expect-readmore
|
|
$(MAKE) READMORE="1" check
|
|
|
|
# Check whether we need to print the timestamp for each line of
|
|
# status.
|
|
TIMESTAMP = $(if $(TS),| $(srcdir)/print-ts.py $(if $(TS_FORMAT),$(TS_FORMAT),),)
|
|
|
|
gdb_debug = $(if $(GDB_DEBUG),GDB_DEBUG=$(GDB_DEBUG) ; export GDB_DEBUG ;,)
|
|
gdbserver_debug = $(if $(GDBSERVER_DEBUG),GDBSERVER_DEBUG=$(GDBSERVER_DEBUG) ; export GDBSERVER_DEBUG ;,)
|
|
|
|
|
|
# All the hair to invoke dejagnu. A given invocation can just append
|
|
# $(RUNTESTFLAGS)
|
|
DO_RUNTEST = \
|
|
rootme=`pwd`; export rootme; \
|
|
srcdir=${srcdir} ; export srcdir ; \
|
|
EXPECT=${EXPECT} ; export EXPECT ; \
|
|
EXEEXT=${EXEEXT} ; export EXEEXT ; $(gdb_debug) $(gdbserver_debug) \
|
|
$(RPATH_ENVVAR)=$$rootme/../../expect:$$rootme/../../libstdc++:$$rootme/../../tk/unix:$$rootme/../../tcl/unix:$$rootme/../../bfd:$$rootme/../../opcodes:$$$(RPATH_ENVVAR); \
|
|
export $(RPATH_ENVVAR); \
|
|
if [ -f $${rootme}/../../expect/expect ] ; then \
|
|
TCL_LIBRARY=$${srcdir}/../../tcl/library ; \
|
|
export TCL_LIBRARY ; fi ; \
|
|
$(RUNTEST) --status
|
|
|
|
# TESTS exists for the user to pass on the command line to easily
|
|
# say "Only run these tests." With check-single it's not necessary, but
|
|
# with check-parallel there's no other way to (easily) specify a subset
|
|
# of tests. For consistency we support it for check-single as well.
|
|
# To specify all tests in a subdirectory, use TESTS=gdb.subdir/*.exp.
|
|
# E.g., make check TESTS="gdb.server/*.exp gdb.threads/*.exp".
|
|
TESTS :=
|
|
|
|
ifeq ($(strip $(TESTS)),)
|
|
expanded_tests_or_none :=
|
|
else
|
|
expanded_tests := $(patsubst $(srcdir)/%,%,$(wildcard $(addprefix $(srcdir)/,$(TESTS))))
|
|
expanded_tests_or_none := $(or $(expanded_tests),no-matching-tests-found)
|
|
endif
|
|
|
|
# Shorthand for running all the tests in a single directory.
|
|
check-gdb.%:
|
|
$(MAKE) check TESTS="gdb.$*/*.exp"
|
|
|
|
check-single:
|
|
-rm -f *core*
|
|
$(DO_RUNTEST) $(RUNTESTFLAGS) $(expanded_tests_or_none) $(TIMESTAMP); \
|
|
result=$$?; \
|
|
$(SHELL) $(srcdir)/lib/dg-add-core-file-count.sh; \
|
|
sed -n '/=== gdb Summary ===/,$$ p' gdb.sum; \
|
|
exit $$result
|
|
|
|
check-single-racy:
|
|
-rm -rf cache racy_outputs temp
|
|
mkdir -p racy_outputs; \
|
|
racyiter="$(RACY_ITER)"; \
|
|
test "x$$racyiter" = "x" && \
|
|
racyiter=$(DEFAULT_RACY_ITER); \
|
|
if test $$racyiter -lt 2 ; then \
|
|
echo "RACY_ITER must be at least 2."; \
|
|
exit 1; \
|
|
fi; \
|
|
trap "exit" INT; \
|
|
for n in `seq $$racyiter` ; do \
|
|
mkdir -p racy_outputs/$$n; \
|
|
$(DO_RUNTEST) --outdir=racy_outputs/$$n $(RUNTESTFLAGS) \
|
|
$(expanded_tests_or_none) $(TIMESTAMP); \
|
|
done; \
|
|
$(srcdir)/analyze-racy-logs.py \
|
|
`ls racy_outputs/*/gdb.sum` > racy.sum; \
|
|
sed -n '/=== gdb Summary ===/,$$ p' racy.sum
|
|
|
|
check-parallel:
|
|
-rm -f *core*
|
|
-rm -rf cache outputs temp
|
|
$(MAKE) -k do-check-parallel; \
|
|
result=$$?; \
|
|
$(SHELL) $(srcdir)/../../contrib/dg-extract-results.sh \
|
|
`find outputs -name gdb.sum -print` > gdb.sum; \
|
|
$(SHELL) $(srcdir)/../../contrib/dg-extract-results.sh -L \
|
|
`find outputs -name gdb.log -print` > gdb.log; \
|
|
$(SHELL) $(srcdir)/lib/dg-add-core-file-count.sh; \
|
|
sed -n '/=== gdb Summary ===/,$$ p' gdb.sum; \
|
|
exit $$result
|
|
|
|
check-parallel-racy:
|
|
-rm -rf cache racy_outputs temp
|
|
racyiter="$(RACY_ITER)"; \
|
|
test "x$$racyiter" = "x" && \
|
|
racyiter=$(DEFAULT_RACY_ITER); \
|
|
if test $$racyiter -lt 2 ; then \
|
|
echo "RACY_ITER must be at least 2."; \
|
|
exit 1; \
|
|
fi; \
|
|
trap "exit" INT; \
|
|
for n in `seq $$racyiter` ; do \
|
|
$(MAKE) -k do-check-parallel-racy \
|
|
RACY_OUTPUT_N=$$n; \
|
|
$(SHELL) $(srcdir)/../../contrib/dg-extract-results.sh \
|
|
`find racy_outputs/$$n -name gdb.sum -print` > \
|
|
racy_outputs/$$n/gdb.sum; \
|
|
$(SHELL) $(srcdir)/../../contrib/dg-extract-results.sh -L \
|
|
`find racy_outputs/$$n -name gdb.log -print` > \
|
|
racy_outputs/$$n/gdb.log; \
|
|
sed -n '/=== gdb Summary ===/,$$ p' racy_outputs/$$n/gdb.sum; \
|
|
done; \
|
|
$(srcdir)/analyze-racy-logs.py \
|
|
`ls racy_outputs/*/gdb.sum` > racy.sum; \
|
|
sed -n '/=== gdb Summary ===/,$$ p' racy.sum
|
|
|
|
# Turn a list of .exp files into "check/" targets. Only examine .exp
|
|
# files appearing in a gdb.* directory -- we don't want to pick up
|
|
# lib/ by mistake. For example, gdb.linespec/linespec.exp becomes
|
|
# check/gdb.linespec/linespec.exp. The list is generally sorted
|
|
# alphabetically, but we take a few tests known to be slow and push
|
|
# them to the front of the list to try to lessen the overall time
|
|
# taken by the test suite -- if one of these tests happens to be run
|
|
# late, it will cause the overall time to increase.
|
|
ifeq ($(strip $(TESTS)),)
|
|
slow_tests = gdb.base/break-interp.exp gdb.base/interp.exp \
|
|
gdb.base/multi-forks.exp
|
|
all_tests := $(shell cd $(srcdir) && find gdb.* -name '*.exp' -print)
|
|
reordered_tests := $(slow_tests) $(filter-out $(slow_tests),$(all_tests))
|
|
TEST_TARGETS := $(addprefix $(if $(RACY_ITER),check-racy,check)/,$(reordered_tests))
|
|
else
|
|
TEST_TARGETS := $(addprefix $(if $(RACY_ITER),check-racy,check)/,$(expanded_tests_or_none))
|
|
endif
|
|
|
|
do-check-parallel: $(TEST_TARGETS)
|
|
@:
|
|
|
|
check/%.exp:
|
|
-mkdir -p outputs/$*
|
|
@$(DO_RUNTEST) GDB_PARALLEL=yes --outdir=outputs/$* $*.exp $(RUNTESTFLAGS) $(TIMESTAMP)
|
|
|
|
do-check-parallel-racy: $(TEST_TARGETS)
|
|
@:
|
|
|
|
check-racy/%.exp:
|
|
-mkdir -p racy_outputs/$(RACY_OUTPUT_N)/$*
|
|
$(DO_RUNTEST) GDB_PARALLEL=yes \
|
|
--outdir=racy_outputs/$(RACY_OUTPUT_N)/$* $*.exp \
|
|
$(RUNTESTFLAGS) $(TIMESTAMP)
|
|
|
|
check/no-matching-tests-found:
|
|
@echo ""
|
|
@echo "No matching tests found."
|
|
@echo ""
|
|
|
|
# Utility rule invoked by step 2 of the build-perf rule.
|
|
workers/%.worker:
|
|
mkdir -p gdb.perf/outputs/$*
|
|
$(DO_RUNTEST) --outdir=gdb.perf/outputs/$* lib/build-piece.exp WORKER=$* GDB_PARALLEL=gdb.perf $(RUNTESTFLAGS) GDB_PERFTEST_MODE=compile GDB_PERFTEST_SUBMODE=build-pieces $(TIMESTAMP)
|
|
|
|
# Utility rule to build tests that support it in parallel.
|
|
# The build is broken into 3 steps distinguished by GDB_PERFTEST_SUBMODE:
|
|
# gen-workers, build-pieces, final.
|
|
#
|
|
# GDB_PERFTEST_MODE appears *after* RUNTESTFLAGS here because we don't want
|
|
# anything in RUNTESTFLAGS to override it.
|
|
#
|
|
# We don't delete the outputs directory here as these programs can take
|
|
# awhile to build, and perftest.exp has support for deciding whether to
|
|
# recompile them. If you want to remove these directories, make clean.
|
|
#
|
|
# The point of step 1 is to construct the set of worker tasks for step 2.
|
|
# All of the information needed by build-piece.exp is contained in the name
|
|
# of the generated .worker file.
|
|
build-perf: $(abs_builddir)/site.exp
|
|
rm -rf gdb.perf/workers
|
|
mkdir -p gdb.perf/workers
|
|
@: Step 1: Generate the build .worker files.
|
|
$(DO_RUNTEST) --directory=gdb.perf --outdir gdb.perf/workers GDB_PARALLEL=gdb.perf $(RUNTESTFLAGS) GDB_PERFTEST_MODE=compile GDB_PERFTEST_SUBMODE=gen-workers $(TIMESTAMP)
|
|
@: Step 2: Compile the pieces. Here is the build parallelism.
|
|
$(MAKE) $$(cd gdb.perf && echo workers/*/*.worker)
|
|
@: Step 3: Do the final link.
|
|
$(DO_RUNTEST) --directory=gdb.perf --outdir gdb.perf GDB_PARALLEL=gdb.perf $(RUNTESTFLAGS) GDB_PERFTEST_MODE=compile GDB_PERFTEST_SUBMODE=final $(TIMESTAMP)
|
|
|
|
# The default is to both compile and run the tests.
|
|
GDB_PERFTEST_MODE = both
|
|
|
|
check-perf: all $(abs_builddir)/site.exp
|
|
@if test ! -d gdb.perf; then mkdir gdb.perf; fi
|
|
$(DO_RUNTEST) --directory=gdb.perf --outdir gdb.perf GDB_PERFTEST_MODE=$(GDB_PERFTEST_MODE) $(RUNTESTFLAGS) $(TIMESTAMP)
|
|
|
|
force:;
|
|
|
|
clean mostlyclean:
|
|
-rm -f *~ core *.o a.out xgdb *.x *.grt bigcore.corefile .gdb_history
|
|
-rm -f core.* *.tf *.cl tracecommandsscript copy1.txt zzz-gdbscript
|
|
-rm -f *.dwo *.dwp
|
|
-rm -rf outputs temp cache
|
|
-rm -rf gdb.perf/workers gdb.perf/outputs gdb.perf/temp gdb.perf/cache
|
|
-rm -f read1.so expect-read1 readmore.so expect-readmore
|
|
|
|
distclean maintainer-clean realclean: clean
|
|
-rm -f *~ core
|
|
-rm -f Makefile config.status *-init.exp lib/pdtrace
|
|
-rm -fr *.log summary detail *.plog *.sum *.psum site.*
|
|
|
|
Makefile : Makefile.in config.status $(host_makefile_frag)
|
|
$(SHELL) config.status Makefile
|
|
|
|
lib/pdtrace: pdtrace.in config.status
|
|
$(SHELL) config.status lib/pdtrace
|
|
|
|
config.status: configure
|
|
$(SHELL) config.status --recheck
|
|
|
|
TAGS: force
|
|
find $(srcdir) -name '*.exp' -print | \
|
|
etags \
|
|
--regex='/\(proc\|proc_with_prefix\|gdb_caching_proc\)[ \t]+\([^ \t]+\)/\2/' \
|
|
-
|
|
|
|
# Build the expect wrapper script that preloads the read1.so library.
|
|
expect-read1 expect-readmore:
|
|
$(ECHO_GEN) \
|
|
rm -f $@-tmp; \
|
|
touch $@-tmp; \
|
|
echo "# THIS FILE IS GENERATED -*- buffer-read-only: t -*- \n" >>$@-tmp; \
|
|
echo "# vi:set ro: */\n\n" >>$@-tmp; \
|
|
echo "# To regenerate this file, run:\n" >>$@-tmp; \
|
|
echo "# make clean; make/\n" >>$@-tmp; \
|
|
if [ $@ = expect-read1 ]; then \
|
|
echo "export LD_PRELOAD=`pwd`/read1.so" >>$@-tmp; \
|
|
else \
|
|
echo "export LD_PRELOAD=`pwd`/readmore.so" >>$@-tmp; \
|
|
fi; \
|
|
echo 'exec expect "$$@"' >>$@-tmp; \
|
|
chmod +x $@-tmp; \
|
|
mv $@-tmp $@
|
|
|
|
# Build the read1.so preload library. This overrides the `read'
|
|
# function, making it read one byte at a time. Running the testsuite
|
|
# with this catches racy tests.
|
|
read1.so: lib/read1.c
|
|
$(ECHO_CC) $(CC) -o $@ ${srcdir}/lib/read1.c -Wall -g -shared -fPIC $(CFLAGS)
|
|
|
|
# Build the readmore.so preload library. This overrides the `read'
|
|
# function, making it try harder to read more at a time. Running the
|
|
# testsuite with this catches racy tests.
|
|
readmore.so: lib/read1.c
|
|
$(ECHO_CC) $(CC) -o $@ ${srcdir}/lib/read1.c -Wall -g -shared -fPIC \
|
|
$(CFLAGS) -DREADMORE
|
|
|
|
# Build the read1 machinery.
|
|
.PHONY: read1 readmore
|
|
read1: read1.so expect-read1
|
|
readmore: readmore.so expect-readmore
|
|
|
|
# Disable implicit make rules.
|
|
include $(srcdir)/../disable-implicit-rules.mk
|
|
include $(srcdir)/../silent-rules.mk
|