2a31c6236d
This integrates Jan Kratochvil's nice race reproducer from PR testsuite/12649 into the testsuite infrustructure directly. With this, one only has to do either 'make check-read1' or 'make check READ1="1"' to preload the read1.so library into expect. Currently only enabled for glibc/GNU systems, and if build==host==target. gdb/testsuite/ChangeLog: * Makefile.in (EXTRA_RULES, CC): New variables, get from configure. (EXPECT): Handle READ1 being set. (all): Depend on EXTRA_RULES. (check-read1, expect-read1, read1.so, read1): New rules. * README (Testsuite Parameters): Document the READ1 make variable. (Race detection): New section. * configure: Regenerate. * configure.ac: If build==host==target, and running under a GNU/glibc system, add read1 to the extra Makefile rules. (EXTRA_RULES): AC_SUBST it. * lib/read1.c: New file. gdb/ChangeLog: * Makefile.in (check-read1): New rule.
302 lines
10 KiB
Makefile
302 lines
10 KiB
Makefile
# Makefile for regression testing the GNU debugger.
|
|
# Copyright 1992-2014 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@
|
|
|
|
target_alias = @target_noncanonical@
|
|
program_transform_name = @program_transform_name@
|
|
build_canonical = @build@
|
|
host_canonical = @host@
|
|
target_canonical = @target@
|
|
|
|
SHELL = @SHELL@
|
|
EXEEXT = @EXEEXT@
|
|
SUBDIRS = @subdirs@
|
|
RPATH_ENVVAR = @RPATH_ENVVAR@
|
|
ALL_SUBDIRS = gdb.ada gdb.arch gdb.asm gdb.base gdb.btrace gdb.cell gdb.cp \
|
|
gdb.disasm gdb.dlang gdb.dwarf2 gdb.fortran gdb.gdb gdb.go gdb.hp \
|
|
gdb.java gdb.linespec gdb.mi gdb.modula2 gdb.multi \
|
|
gdb.objc gdb.opencl gdb.opt gdb.pascal gdb.python gdb.server \
|
|
gdb.stabs gdb.reverse gdb.threads gdb.trace gdb.xml \
|
|
$(SUBDIRS)
|
|
|
|
EXTRA_RULES = @EXTRA_RULES@
|
|
|
|
CC=@CC@
|
|
|
|
EXPECT = `if [ "$${READ1}" != "" ] ; then \
|
|
echo $${rootme}/expect-read1; \
|
|
elif [ -f $${rootme}/../../expect/expect ] ; then \
|
|
echo $${rootme}/../../expect/expect ; \
|
|
else \
|
|
echo expect ; \
|
|
fi`
|
|
|
|
RUNTEST = $(RUNTEST_FOR_TARGET)
|
|
|
|
RUNTESTFLAGS =
|
|
|
|
FORCE_PARALLEL =
|
|
|
|
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: $(EXTRA_RULES)
|
|
@echo "Nothing to be done for 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: ./config.status Makefile
|
|
@echo "Making a new config file..."
|
|
-@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 ${srcdir}" >> ./tmp0
|
|
@echo "set tool gdb" >> ./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. 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.
|
|
@GMAKE_TRUE@saw_dash_j = $(or $(findstring j,$(firstword $(MAKEFLAGS))),$(filter -j,$(MAKEFLAGS)))
|
|
|
|
# For GNU make, 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. For a non-GNU make, do not parallelize.
|
|
@GMAKE_TRUE@CHECK_TARGET = $(if $(FORCE_PARALLEL),check-parallel,$(if $(RUNTESTFLAGS),check-single,$(if $(saw_dash_j),check-parallel,check-single)))
|
|
@GMAKE_FALSE@CHECK_TARGET = check-single
|
|
|
|
# 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:
|
|
$(MAKE) READ1="1" check
|
|
|
|
# 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 ; \
|
|
$(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)
|
|
|
|
# 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".
|
|
@GMAKE_TRUE@TESTS :=
|
|
@GMAKE_FALSE@TESTS =
|
|
|
|
@GMAKE_TRUE@ifeq ($(strip $(TESTS)),)
|
|
@GMAKE_TRUE@expanded_tests_or_none :=
|
|
@GMAKE_TRUE@else
|
|
@GMAKE_TRUE@expanded_tests := $(patsubst $(srcdir)/%,%,$(wildcard $(addprefix $(srcdir)/,$(TESTS))))
|
|
@GMAKE_TRUE@expanded_tests_or_none := $(or $(expanded_tests),no-matching-tests-found)
|
|
@GMAKE_TRUE@endif
|
|
@GMAKE_FALSE@expanded_tests_or_none = $(TESTS)
|
|
|
|
check-single:
|
|
$(DO_RUNTEST) $(RUNTESTFLAGS) $(expanded_tests_or_none)
|
|
|
|
check-parallel:
|
|
-rm -rf cache outputs temp
|
|
$(MAKE) -k do-check-parallel; \
|
|
$(SHELL) $(srcdir)/dg-extract-results.sh \
|
|
`find outputs -name gdb.sum -print` > gdb.sum; \
|
|
$(SHELL) $(srcdir)/dg-extract-results.sh -L \
|
|
`find outputs -name gdb.log -print` > gdb.log
|
|
@sed -n '/=== gdb Summary ===/,$$ p' gdb.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.
|
|
@GMAKE_TRUE@ifeq ($(strip $(TESTS)),)
|
|
slow_tests = gdb.base/break-interp.exp gdb.base/interp.exp \
|
|
gdb.base/multi-forks.exp
|
|
@GMAKE_TRUE@all_tests := $(shell cd $(srcdir) && find gdb.* -name '*.exp' -print)
|
|
@GMAKE_TRUE@reordered_tests := $(slow_tests) $(filter-out $(slow_tests),$(all_tests))
|
|
@GMAKE_TRUE@TEST_TARGETS := $(addprefix check/,$(reordered_tests))
|
|
@GMAKE_TRUE@else
|
|
@GMAKE_TRUE@TEST_TARGETS := $(addprefix check/,$(expanded_tests_or_none))
|
|
@GMAKE_TRUE@endif
|
|
|
|
do-check-parallel: $(TEST_TARGETS)
|
|
@:
|
|
|
|
@GMAKE_TRUE@check/%.exp:
|
|
@GMAKE_TRUE@ -mkdir -p outputs/$*
|
|
@GMAKE_TRUE@ @$(DO_RUNTEST) GDB_PARALLEL=yes --outdir=outputs/$* $*.exp $(RUNTESTFLAGS)
|
|
|
|
check/no-matching-tests-found:
|
|
@echo ""
|
|
@echo "No matching tests found."
|
|
@echo ""
|
|
|
|
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=both $(RUNTESTFLAGS)
|
|
|
|
force:;
|
|
|
|
clean mostlyclean:
|
|
-rm -f *~ core *.o a.out xgdb *.x *.grt bigcore.corefile .gdb_history
|
|
-rm -f core.* *.tf *.cl *.py tracecommandsscript copy1.txt zzz-gdbscript
|
|
-rm -f *.dwo *.dwp
|
|
-rm -rf outputs temp cache
|
|
-rm -f read1.so expect-read1
|
|
if [ x"${ALL_SUBDIRS}" != x ] ; then \
|
|
for dir in ${ALL_SUBDIRS}; \
|
|
do \
|
|
echo "$$dir:"; \
|
|
if [ -d $$dir ]; then \
|
|
(cd $$dir; $(MAKE) clean); \
|
|
fi; \
|
|
done ; \
|
|
else true; fi
|
|
|
|
distclean maintainer-clean realclean: clean
|
|
-rm -f *~ core
|
|
-rm -f Makefile config.status *-init.exp
|
|
-rm -fr *.log summary detail *.plog *.sum *.psum site.*
|
|
if [ x"${ALL_SUBDIRS}" != x ] ; then \
|
|
for dir in ${ALL_SUBDIRS}; \
|
|
do \
|
|
echo "$$dir:"; \
|
|
if [ -d $$dir ]; then \
|
|
(cd $$dir; $(MAKE) distclean); \
|
|
fi; \
|
|
done ; \
|
|
else true; fi
|
|
|
|
Makefile : Makefile.in config.status $(host_makefile_frag)
|
|
$(SHELL) config.status
|
|
|
|
config.status: configure
|
|
$(SHELL) config.status --recheck
|
|
|
|
TAGS: force
|
|
find $(srcdir) -name '*.exp' -print | \
|
|
etags --regex='/proc[ \t]+\([^ \t]+\)/\1/' -
|
|
|
|
# Build the expect wrapper script that preloads the read1.so library.
|
|
expect-read1:
|
|
@echo Making expect-read1
|
|
@rm -f expect-read1-tmp
|
|
@touch expect-read1-tmp
|
|
@echo "# THIS FILE IS GENERATED -*- buffer-read-only: t -*- \n" >>expect-read1-tmp
|
|
@echo "# vi:set ro: */\n\n" >>expect-read1-tmp
|
|
@echo "# To regenerate this file, run:\n" >>expect-read1-tmp
|
|
@echo "# make clean; make/\n" >>expect-read1-tmp
|
|
@echo "export LD_PRELOAD=`pwd`/read1.so" >>expect-read1-tmp
|
|
@echo 'exec expect "$$@"' >>expect-read1-tmp
|
|
@chmod +x expect-read1-tmp
|
|
@mv expect-read1-tmp expect-read1
|
|
|
|
# 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
|
|
$(CC) -o $@ ${srcdir}/lib/read1.c -Wall -g -shared -fPIC $(CFLAGS)
|
|
|
|
# Build the read1 machinery.
|
|
.PHONY: read1
|
|
read1: read1.so expect-read1
|