# Makefile for regression testing the GNU debugger.
# Copyright 1992-2021 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:
	$(DO_RUNTEST) $(RUNTESTFLAGS) $(expanded_tests_or_none) $(TIMESTAMP)

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 -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; \
	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
	-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
