#===- test/Makefile ----------------------------------------*- Makefile -*--===#
#
#                     The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
#
#===------------------------------------------------------------------------===#

LEVEL = ..
DIRS  =

#
# Make Dejagnu the default for testing
#
all:: check-local

# Include other test rules
include Makefile.tests

#===------------------------------------------------------------------------===#
# DejaGNU testing support
#===------------------------------------------------------------------------===#

ifneq ($(GREP_OPTIONS),)
$(warning GREP_OPTIONS environment variable may interfere with test results)
endif

ifdef VERBOSE
RUNTESTFLAGS := $(VERBOSE)
endif

ifdef TESTSUITE
CLEANED_TESTSUITE := $(patsubst %/,%,$(TESTSUITE))
CLEANED_TESTSUITE := $(patsubst test/%,%,$(CLEANED_TESTSUITE))
RUNTESTFLAGS += --tool $(CLEANED_TESTSUITE)
endif

ifdef VG
VALGRIND := valgrind --tool=memcheck --quiet --trace-children=yes --error-exitcode=3 --leak-check=full
endif

IGNORE_TESTS :=

ifndef RUNLLVM2CPP
IGNORE_TESTS += llvm2cpp.exp
endif

IGNORE_TESTS += $(filter-out $(BINDINGS_TO_BUILD:=.exp),$(ALL_BINDINGS:=.exp))

ifdef IGNORE_TESTS
RUNTESTFLAGS += --ignore "$(strip $(IGNORE_TESTS))"
endif

# Both AuroraUX & Solaris do not have the -m flag for ulimit
ifeq ($(HOST_OS),SunOS)
ULIMIT=ulimit -t 600 ; ulimit -d 512000 ; ulimit -v 512000 ;
else
ULIMIT=ulimit -t 600 ; ulimit -d 512000 ; ulimit -m 512000 ; ulimit -v 512000 ;
endif

ifneq ($(RUNTEST),)
check-local:: site.exp
	( $(ULIMIT) \
	  PATH="$(LLVMToolDir):$(LLVM_SRC_ROOT)/test/Scripts:$(PATH)" \
	  $(RUNTEST) $(RUNTESTFLAGS) )
else
check-local:: site.exp
	@echo "*** dejagnu not found.  Make sure 'runtest' is in your PATH, then reconfigure LLVM."
endif

ifdef TESTONE
CLEANED_TESTONE := $(patsubst %/,%,$(TESTONE))
CLEANED_TESTONE := $(patsubst test/%,%,$(CLEANED_TESTONE))
SUBDIR := $(shell dirname $(CLEANED_TESTONE))
TESTPATH := $(LLVM_SRC_ROOT)/test/$(CLEANED_TESTONE)
check-one: site.exp $(TCLSH)
	$(Verb)( echo "source $(LLVM_OBJ_ROOT)/test/site.exp" ; \
	  echo "set subdir $(SUBDIR)" ; \
	  echo "proc pass  { msg } { puts \"PASS: \$$msg\" } "; \
	  echo "proc fail  { msg } { puts \"FAIL: \$$msg\" }" ; \
	  echo "proc xfail { msg } { puts \"XFAIL: \$$msg\" }" ; \
	  echo "proc xpass { msg } { puts \"XPASS: \$$msg\" }" ; \
	  echo "proc verbose args { }" ; \
	  echo "source $(LLVM_SRC_ROOT)/test/lib/llvm.exp" ; \
	  echo "RunLLVMTests $(TESTPATH)" ) | \
	( $(ULIMIT) \
	  PATH="$(LLVMToolDir):$(LLVM_SRC_ROOT)/test/Scripts:$(PATH)" \
	  $(TCLSH) )
endif

clean::
	$(RM) -rf `find $(LLVM_OBJ_ROOT)/test -name Output -type d -print`

# dsymutil is used on the Darwin to manipulate DWARF debugging information.
ifeq ($(TARGET_OS),Darwin)
DSYMUTIL=dsymutil
else
DSYMUTIL=true
endif
ifdef TargetCommonOpts
BUGPOINT_TOPTS="-gcc-tool-args $(TargetCommonOpts)"
else
BUGPOINT_TOPTS=""
endif

ifneq ($(OCAMLC),)
CC_FOR_OCAMLC := $(shell $(OCAMLC) -config | grep native_c_compiler | sed -e 's/native_c_compiler: //')
CXX_FOR_OCAMLC := $(subst gcc,g++,$(CC_FOR_OCAMLC))
endif

FORCE:

site.exp: FORCE
	@echo 'Making a new site.exp file...'
	@echo '## these variables are automatically generated by make ##' >site.tmp
	@echo '# Do not edit here.  If you wish to override these values' >>site.tmp
	@echo '# edit the last section' >>site.tmp
	@echo 'set target_triplet "$(TARGET_TRIPLE)"' >> site.tmp
	@echo 'set TARGETS_TO_BUILD "$(TARGETS_TO_BUILD)"' >> site.tmp
	@echo 'set llvmgcc_langs "$(LLVMGCC_LANGS)"' >> site.tmp
	@echo 'set llvmgcc_version "$(LLVMGCC_VERSION)"' >> site.tmp
	@echo 'set prcontext "$(TCLSH) $(LLVM_SRC_ROOT)/test/Scripts/prcontext.tcl"' >> site.tmp
	@echo 'set llvmtoolsdir "$(ToolDir)"' >>site.tmp
	@echo 'set llvmlibsdir "$(LibDir)"' >>site.tmp
	@echo 'set srcroot "$(LLVM_SRC_ROOT)"' >>site.tmp
	@echo 'set objroot "$(LLVM_OBJ_ROOT)"' >>site.tmp
	@echo 'set srcdir "$(LLVM_SRC_ROOT)/test"' >>site.tmp
	@echo 'set objdir "$(LLVM_OBJ_ROOT)/test"' >>site.tmp
	@echo 'set gccpath "$(CC)"' >>site.tmp
	@echo 'set gxxpath "$(CXX)"' >>site.tmp
	@echo 'set compile_c "' $(CC) $(CPP.Flags) $(TargetCommonOpts) $(CompileCommonOpts) -c '"' >>site.tmp
	@echo 'set compile_cxx "' $(CXX) $(CPP.Flags) $(CXX.Flags) $(TargetCommonOpts) $(CompileCommonOpts) -c '"' >> site.tmp
	@echo 'set link "' $(CXX) $(CPP.Flags) $(CXX.Flags) $(TargetCommonOpts) $(CompileCommonOpts) $(LD.Flags) '"' >>site.tmp
	@echo 'set llvmgcc "$(LLVMGCC) $(TargetCommonOpts) $(EXTRA_OPTIONS)"' >> site.tmp
	@echo 'set llvmgxx "$(LLVMGCC) $(TargetCommonOpts) $(EXTRA_OPTIONS)"' >> site.tmp
	@echo 'set llvmgccmajvers "$(LLVMGCC_MAJVERS)"' >> site.tmp
	@echo 'set bugpoint_topts $(BUGPOINT_TOPTS)' >> site.tmp
	@echo 'set shlibext "$(SHLIBEXT)"' >> site.tmp
	@echo 'set ocamlc "$(OCAMLC) -cc \"$(CXX_FOR_OCAMLC)\" -I $(LibDir)/ocaml"' >> site.tmp
	@echo 'set valgrind "$(VALGRIND)"' >> site.tmp
	@echo 'set grep "$(GREP)"' >>site.tmp
	@echo 'set gas "$(GAS)"' >>site.tmp
	@echo 'set llvmdsymutil "$(DSYMUTIL)"' >>site.tmp
	@echo '## All variables above are generated by configure. Do Not Edit ## ' >>site.tmp
	@test ! -f site.exp || \
	sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp
	@-rm -f site.bak
	@test ! -f site.exp || mv site.exp site.bak
	@mv site.tmp site.exp
