rust/mk/tests.mk
2011-10-11 08:54:20 -07:00

317 lines
10 KiB
Makefile

######################################################################
# Testing variables
######################################################################
ALL_TEST_INPUTS = $(wildcard $(S)src/test/*/*.rs \
$(S)src/test/*/*/*.rs \
$(S)src/test/*/*.rc)
RPASS_RC := $(wildcard $(S)src/test/run-pass/*.rc)
RPASS_RS := $(wildcard $(S)src/test/run-pass/*.rs)
RFAIL_RC := $(wildcard $(S)src/test/run-fail/*.rc)
RFAIL_RS := $(wildcard $(S)src/test/run-fail/*.rs)
CFAIL_RC := $(wildcard $(S)src/test/compile-fail/*.rc)
CFAIL_RS := $(wildcard $(S)src/test/compile-fail/*.rs)
BENCH_RS := $(wildcard $(S)src/test/bench/*.rs)
PRETTY_RS := $(wildcard $(S)src/test/pretty/*.rs)
# perf tests are the same as bench tests only they run under
# a performance monitor.
PERF_RS := $(wildcard $(S)src/test/bench/*.rs)
RPASS_TESTS := $(RPASS_RC) $(RPASS_RS)
RFAIL_TESTS := $(RFAIL_RC) $(RFAIL_RS)
CFAIL_TESTS := $(CFAIL_RC) $(CFAIL_RS)
BENCH_TESTS := $(BENCH_RS)
PERF_TESTS := $(PERF_RS)
PRETTY_TESTS := $(PRETTY_RS)
FT := run_pass_stage2
FT_LIB := $(call CFG_LIB_NAME,$(FT))
FT_DRIVER := $(FT)_driver
GENERATED += test/$(FT).rc test/$(FT_DRIVER).rs
# The arguments to all test runners
ifdef TESTNAME
TESTARGS += $(TESTNAME)
endif
ifdef CHECK_XFAILS
TESTARGS += --ignored
endif
# Arguments to the cfail/rfail/rpass/bench tests
ifdef CFG_VALGRIND
CTEST_RUNTOOL = --runtool "$(CFG_VALGRIND)"
endif
# Arguments to the perf tests
ifdef CFG_PERF_TOOL
CTEST_PERF_RUNTOOL = --runtool "$(CFG_PERF_TOOL)"
endif
CTEST_TESTARGS := $(TESTARGS)
ifdef VERBOSE
CTEST_TESTARGS += --verbose
endif
# The standard library test crate
STDTEST_CRATE := $(S)src/test/stdtest/stdtest.rc
STDTEST_INPUTS := $(wildcard $(S)src/test/stdtest/*rs)
# Run the compiletest runner itself under valgrind
ifdef CTEST_VALGRIND
CFG_RUN_CTEST=$(call CFG_RUN_TEST,$(2))
else
CFG_RUN_CTEST=$(call CFG_RUN,$(TARGET_HOST_LIB$(1)),$(2))
endif
######################################################################
# Main test targets
######################################################################
check: tidy check-stage2 \
check-full: tidy check-stage1 check-stage2 check-stage3 \
check-fast: tidy \
check-stage2-rustc check-stage2-std \
test/$(FT_DRIVER).out \
tidy:
@$(call E, check: formatting)
$(Q)echo \
$(filter-out $(GENERATED) $(addprefix $(S)src/, $(GENERATED)) \
$(addprefix $(S)src/, $(RUSTLLVM_LIB_CS) $(RUSTLLVM_OBJS_CS) \
$(RUSTLLVM_HDR) $(PKG_3RDPARTY) \
$(RUNTIME_CS) $(RUNTIME_HDR) $(RUNTIME_S)) \
$(S)src/etc/%, \
$(COMPILER_CRATE) \
$(COMPILER_INPUTS) \
$(STDLIB_CRATE) \
$(STDLIB_INPUTS) \
$(COMPILETEST_CRATE) \
$(COMPILETEST_INPUTS) \
$(ALL_TEST_INPUTS)) \
| xargs -n 10 python $(S)src/etc/tidy.py
######################################################################
# Rules for the test runners
######################################################################
define TEST_STAGEN
# All the per-stage build rules you might want to call from the
# command line
check-stage$(1): tidy \
check-stage$(1)-rustc \
check-stage$(1)-std \
check-stage$(1)-rpass \
check-stage$(1)-rfail \
check-stage$(1)-cfail \
check-stage$(1)-bench \
check-stage$(1)-pretty
check-stage$(1)-std: check-stage$(1)-std-dummy
check-stage$(1)-rustc: check-stage$(1)-rustc-dummy
check-stage$(1)-cfail: check-stage$(1)-cfail-dummy
check-stage$(1)-rfail: check-stage$(1)-rfail-dummy
check-stage$(1)-rpass: check-stage$(1)-rpass-dummy
check-stage$(1)-bench: check-stage$(1)-bench-dummy
check-stage$(1)-perf: check-stage$(1)-perf-dummy
check-stage$(1)-pretty: check-stage$(1)-pretty-rpass \
check-stage$(1)-pretty-rfail \
check-stage$(1)-pretty-bench \
check-stage$(1)-pretty-pretty
check-stage$(1)-pretty-rpass: check-stage$(1)-pretty-rpass-dummy
check-stage$(1)-pretty-rfail: check-stage$(1)-pretty-rfail-dummy
check-stage$(1)-pretty-bench: check-stage$(1)-pretty-bench-dummy
check-stage$(1)-pretty-pretty: check-stage$(1)-pretty-pretty-dummy
# Rules for the standard library test runner
test/stdtest.stage$(1)$$(X): $$(STDTEST_CRATE) $$(STDTEST_INPUTS) \
$$(SREQ$(1)$$(CFG_HOST_TRIPLE))
@$$(call E, compile_and_link: $$@)
$$(STAGE$(1)) -o $$@ $$< --test
check-stage$(1)-std-dummy: test/stdtest.stage$(1)$$(X)
@$$(call E, run: $$<)
$$(Q)$$(call CFG_RUN_TEST,$$<) $$(TESTARGS)
# Rules for the rustc test runner
test/rustctest.stage$(1)$$(X): \
$$(COMPILER_CRATE) $$(COMPILER_INPUTS) \
$$(TARGET_SREQ$(1)$$(CFG_HOST_TRIPLE)) \
$$(HOST_LIB$(1))/$$(CFG_RUSTLLVM) \
$$(TARGET_LIB$(1)$$(CFG_HOST_TRIPLE))/$$(CFG_RUSTLLVM) \
$$(TARGET_LIB$(1)$$(CFG_HOST_TRIPLE))/$$(CFG_STDLIB)
@$$(call E, compile_and_link: $$@)
$$(STAGE$(1)) -o $$@ $$< --test
check-stage$(1)-rustc-dummy: test/rustctest.stage$(1)$$(X)
@$$(call E, run: $$<)
$$(Q)$$(call CFG_RUN_TEST,$$<) \
$$(TESTARGS)
# Rules for the cfail/rfail/rpass/bench/perf test runner
CTEST_COMMON_ARGS$(1) := --compile-lib-path $$(HOST_LIB$(1)) \
--run-lib-path $$(TARGET_LIB$(1)$$(CFG_HOST_TRIPLE)) \
--rustc-path $$(HOST_BIN$(1))/rustc$$(X) \
--stage-id stage$(1) \
--rustcflags "$$(CFG_RUSTC_FLAGS)" \
$$(CTEST_TESTARGS) \
CFAIL_ARGS$(1) := $$(CTEST_COMMON_ARGS$(1)) \
--src-base $$(S)src/test/compile-fail/ \
--build-base test/compile-fail/ \
--mode compile-fail \
RFAIL_ARGS$(1) := $$(CTEST_COMMON_ARGS$(1)) \
--src-base $$(S)src/test/run-fail/ \
--build-base test/run-fail/ \
--mode run-fail \
$$(CTEST_RUNTOOL) \
RPASS_ARGS$(1) := $$(CTEST_COMMON_ARGS$(1)) \
--src-base $$(S)src/test/run-pass/ \
--build-base test/run-pass/ \
--mode run-pass \
$$(CTEST_RUNTOOL) \
BENCH_ARGS$(1) := $$(CTEST_COMMON_ARGS$(1)) \
--src-base $$(S)src/test/bench/ \
--build-base test/bench/ \
--mode run-pass \
$$(CTEST_RUNTOOL) \
PERF_ARGS$(1) := $$(CTEST_COMMON_ARGS$(1)) \
--src-base $$(S)src/test/bench/ \
--build-base test/perf/ \
--mode run-pass \
$$(CTEST_PERF_RUNTOOL) \
PRETTY_RPASS_ARGS$(1) := $$(CTEST_COMMON_ARGS$(1)) \
--src-base $$(S)src/test/run-pass/ \
--build-base test/run-pass/ \
--mode pretty \
PRETTY_RFAIL_ARGS$(1) := $$(CTEST_COMMON_ARGS$(1)) \
--src-base $$(S)src/test/run-fail/ \
--build-base test/run-fail/ \
--mode pretty \
PRETTY_BENCH_ARGS$(1) := $$(CTEST_COMMON_ARGS$(1)) \
--src-base $$(S)src/test/bench/ \
--build-base test/bench/ \
--mode pretty \
PRETTY_PRETTY_ARGS$(1) := $$(CTEST_COMMON_ARGS$(1)) \
--src-base $$(S)src/test/pretty/ \
--build-base test/pretty/ \
--mode pretty \
check-stage$(1)-cfail-dummy: $$(HOST_BIN$(1))/compiletest$$(X) \
$$(SREQ$(1)$$(CFG_HOST_TRIPLE)) \
$$(CFAIL_TESTS)
@$$(call E, run: $$<)
$$(Q)$$(call CFG_RUN_CTEST,$(1),$$<) $$(CFAIL_ARGS$(1))
check-stage$(1)-rfail-dummy: $$(HOST_BIN$(1))/compiletest$$(X) \
$$(SREQ$(1)$$(CFG_HOST_TRIPLE)) \
$$(RFAIL_TESTS)
@$$(call E, run: $$<)
$$(Q)$$(call CFG_RUN_CTEST,$(1),$$<) $$(RFAIL_ARGS$(1))
check-stage$(1)-rpass-dummy: $$(HOST_BIN$(1))/compiletest$$(X) \
$$(SREQ$(1)$$(CFG_HOST_TRIPLE)) \
$$(RPASS_TESTS)
@$$(call E, run: $$<)
$$(Q)$$(call CFG_RUN_CTEST,$(1),$$<) $$(RPASS_ARGS$(1))
check-stage$(1)-bench-dummy: $$(HOST_BIN$(1))/compiletest$$(X) \
$$(SREQ$(1)$$(CFG_HOST_TRIPLE)) \
$$(BENCH_TESTS)
@$$(call E, run: $$<)
$$(Q)$$(call CFG_RUN_CTEST,$(1),$$<) $$(BENCH_ARGS$(1))
check-stage$(1)-perf-dummy: $$(HOST_BIN$(1))/compiletest$$(X) \
$$(SREQ$(1)$$(CFG_HOST_TRIPLE)) \
$$(BENCH_TESTS)
@$$(call E, perf: $$<)
$$(Q)$$(call CFG_RUN_CTEST,$(1),$$<) $$(PERF_ARGS$(1))
check-stage$(1)-pretty-rpass-dummy: $$(HOST_BIN$(1))/compiletest$$(X) \
$$(SREQ$(1)$$(CFG_HOST_TRIPLE)) \
$$(RPASS_TESTS)
@$$(call E, run: $$<)
$$(Q)$$(call CFG_RUN_CTEST,$(1),$$<) $$(PRETTY_RPASS_ARGS$(1))
check-stage$(1)-pretty-rfail-dummy: $$(HOST_BIN$(1))/compiletest$$(X) \
$$(SREQ$(1)$$(CFG_HOST_TRIPLE)) \
$$(RFAIL_TESTS)
@$$(call E, run: $$<)
$$(Q)$$(call CFG_RUN_CTEST,$(1),$$<) $$(PRETTY_RFAIL_ARGS$(1))
check-stage$(1)-pretty-bench-dummy: $$(HOST_BIN$(1))/compiletest$$(X) \
$$(SREQ$(1)$$(CFG_HOST_TRIPLE)) \
$$(BENCH_TESTS)
@$$(call E, run: $$<)
$$(Q)$$(call CFG_RUN_CTEST,$(1),$$<) $$(PRETTY_BENCH_ARGS$(1))
check-stage$(1)-pretty-pretty-dummy: $$(HOST_BIN$(1))/compiletest$$(X) \
$$(SREQ$(1)$$(CFG_HOST_TRIPLE)) \
$$(PRETTY_TESTS)
@$$(call E, run: $$<)
$$(Q)$$(call CFG_RUN_CTEST,$(1),$$<) $$(PRETTY_PRETTY_ARGS$(1))
endef
# Instantiate the template for stage 0, 1, 2, 3
$(eval $(call TEST_STAGEN,0))
$(eval $(call TEST_STAGEN,1))
$(eval $(call TEST_STAGEN,2))
$(eval $(call TEST_STAGEN,3))
######################################################################
# Fast-test rules
######################################################################
test/$(FT).rc test/$(FT_DRIVER).rs: $(TEST_RPASS_SOURCES_STAGE2) \
$(S)src/etc/combine-tests.py
@$(call E, check: building combined stage2 test runner)
$(Q)$(S)src/etc/combine-tests.py
$(TARGET_HOST_LIB2)/$(FT_LIB): test/$(FT).rc $(SREQ2$(CFG_HOST_TRIPLE))
@$(call E, compile_and_link: $@)
$(STAGE2) --lib -o $@ $<
test/$(FT_DRIVER)$(X): test/$(FT_DRIVER).rs $(TARGET_HOST_LIB2)/$(FT_LIB) \
$(SREQ2$(CFG_HOST_TRIPLE))
@$(call E, compile_and_link: $@)
$(STAGE2) -L $(HOST_LIB2) -o $@ $<
test/$(FT_DRIVER).out: test/$(FT_DRIVER)$(X) $(SREQ2$(CFG_HOST_TRIPLE))
$(Q)$(call CFG_RUN_TEST, $<)