tests.mk 28.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
# Copyright 2012 The Rust Project Developers. See the COPYRIGHT
# file at the top-level directory of this distribution and at
# http://rust-lang.org/COPYRIGHT.
#
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
# option. This file may not be copied, modified, or distributed
# except according to those terms.

11

G
Graydon Hoare 已提交
12
######################################################################
13
# Test variables
G
Graydon Hoare 已提交
14 15
######################################################################

16
# The names of crates that must be tested
17
TEST_TARGET_CRATES = std extra
18
TEST_HOST_CRATES = rust rusti rustpkg rustc rustdoc syntax
19
TEST_CRATES = $(TEST_TARGET_CRATES) $(TEST_HOST_CRATES)
G
Graydon Hoare 已提交
20

21
# Markdown files under doc/ that should have their code extracted and run
G
Graydon Hoare 已提交
22 23
DOC_TEST_NAMES = tutorial tutorial-ffi tutorial-macros tutorial-borrowed-ptr \
                 tutorial-tasks tutorial-conditions rust
24

25 26 27
######################################################################
# Environment configuration
######################################################################
28

B
Brian Anderson 已提交
29 30 31 32 33 34 35 36 37
# The arguments to all test runners
ifdef TESTNAME
  TESTARGS += $(TESTNAME)
endif

ifdef CHECK_XFAILS
  TESTARGS += --ignored
endif

38
TEST_BENCH = --bench
39

B
Brian Anderson 已提交
40 41 42
# Arguments to the cfail/rfail/rpass/bench tests
ifdef CFG_VALGRIND
  CTEST_RUNTOOL = --runtool "$(CFG_VALGRIND)"
43
  TEST_BENCH =
B
Brian Anderson 已提交
44
endif
45

46 47
ifdef NO_BENCH
  TEST_BENCH =
B
Brian Anderson 已提交
48
endif
49

50 51 52 53 54
# Arguments to the perf tests
ifdef CFG_PERF_TOOL
  CTEST_PERF_RUNTOOL = --runtool "$(CFG_PERF_TOOL)"
endif

B
Brian Anderson 已提交
55
CTEST_TESTARGS := $(TESTARGS)
G
Graydon Hoare 已提交
56

B
Brian Anderson 已提交
57 58 59
ifdef VERBOSE
  CTEST_TESTARGS += --verbose
endif
60

61 62 63 64 65 66 67
# If we're running perf then set this environment variable
# to put the benchmarks into 'hard mode'
ifeq ($(MAKECMDGOALS),perf)
  RUST_BENCH=1
  export RUST_BENCH
endif

68 69
TEST_LOG_FILE=tmp/check-stage$(1)-T-$(2)-H-$(3)-$(4).log
TEST_OK_FILE=tmp/check-stage$(1)-T-$(2)-H-$(3)-$(4).ok
70

71 72 73 74 75 76
TEST_RATCHET_FILE=tmp/check-stage$(1)-T-$(2)-H-$(3)-$(4)-metrics.json
TEST_RATCHET_NOISE_PERCENT=10.0

# Whether to ratchet or merely save benchmarks
ifdef CFG_RATCHET_BENCH
CRATE_TEST_BENCH_ARGS=\
77
  --test $(TEST_BENCH) \
78 79 80 81
  --ratchet-metrics $(call TEST_RATCHET_FILE,$(1),$(2),$(3),$(4)) \
  --ratchet-noise-percent $(TEST_RATCHET_NOISE_PERCENT)
else
CRATE_TEST_BENCH_ARGS=\
82
  --test $(TEST_BENCH) \
83 84 85
  --save-metrics $(call TEST_RATCHET_FILE,$(1),$(2),$(3),$(4))
endif

86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
define DEF_TARGET_COMMANDS

ifdef CFG_UNIXY_$(1)
  CFG_RUN_TEST_$(1)=$$(call CFG_RUN_$(1),,$$(CFG_VALGRIND) $$(1))
endif

ifdef CFG_WINDOWSY_$(1)
  CFG_TESTLIB_$(1)=$$(CFG_BUILD_DIR)/$$(2)/$$(strip \
   $$(if $$(findstring stage0,$$(1)), \
       stage0/$$(CFG_LIBDIR), \
      $$(if $$(findstring stage1,$$(1)), \
           stage1/$$(CFG_LIBDIR), \
          $$(if $$(findstring stage2,$$(1)), \
               stage2/$$(CFG_LIBDIR), \
               $$(if $$(findstring stage3,$$(1)), \
                    stage3/$$(CFG_LIBDIR), \
               )))))/rustc/$$(CFG_BUILD_TRIPLE)/$$(CFG_LIBDIR)
  CFG_RUN_TEST_$(1)=$$(call CFG_RUN_$(1),$$(call CFG_TESTLIB_$(1),$$(1),$$(3)),$$(1))
endif

# Run the compiletest runner itself under valgrind
ifdef CTEST_VALGRIND
CFG_RUN_CTEST_$(1)=$$(call CFG_RUN_TEST_$$(CFG_BUILD_TRIPLE),$$(2),$$(3))
else
CFG_RUN_CTEST_$(1)=$$(call CFG_RUN_$$(CFG_BUILD_TRIPLE),$$(TLIB$$(1)_T_$$(3)_H_$$(3)),$$(2))
endif

endef

$(foreach target,$(CFG_TARGET_TRIPLES), \
  $(eval $(call DEF_TARGET_COMMANDS,$(target))))

D
Daniel Micay 已提交
118
# Target platform specific variables
119
# for arm-linux-androidabi
120 121
define DEF_ADB_DEVICE_STATUS
CFG_ADB_DEVICE_STATUS=$(1)
122 123 124
endef

$(foreach target,$(CFG_TARGET_TRIPLES), \
125 126
  $(if $(findstring $(target),"arm-linux-androideabi"), \
    $(if $(findstring adb,$(CFG_ADB)), \
127
      $(if $(findstring device,$(shell $(CFG_ADB) devices 2>/dev/null | grep -E '^[_A-Za-z0-9-]+[[:blank:]]+device')), \
128 129 130 131 132 133
        $(info check: $(target) test enabled \
          $(info check: android device attached) \
          $(eval $(call DEF_ADB_DEVICE_STATUS, true))), \
        $(info check: $(target) test disabled \
          $(info check: android device not attached) \
          $(eval $(call DEF_ADB_DEVICE_STATUS, false))) \
134
      ), \
135 136 137 138
      $(info check: $(target) test disabled \
        $(info check: adb not found) \
        $(eval $(call DEF_ADB_DEVICE_STATUS, false))) \
    ), \
139 140 141
  ) \
)

142 143
ifeq ($(CFG_ADB_DEVICE_STATUS),true)
CFG_ADB_TEST_DIR=/data/tmp
144

145 146 147
$(info check: android device test dir $(CFG_ADB_TEST_DIR) ready \
 $(shell adb remount 1>/dev/null) \
 $(shell adb shell mkdir $(CFG_ADB_TEST_DIR) 1>/dev/null) \
148
 $(shell adb shell rm -rf $(CFG_ADB_TEST_DIR)/* 1>/dev/null) \
149
 $(shell adb push $(S)src/etc/adb_run_wrapper.sh $(CFG_ADB_TEST_DIR) 1>/dev/null) \
150 151
 $(shell adb push $(CFG_ANDROID_CROSS_PATH)/arm-linux-androideabi/lib/armv7-a/libgnustl_shared.so \
                  $(CFG_ADB_TEST_DIR) 1>/dev/null) \
152 153 154 155 156 157
 $(shell adb push $(TLIB2_T_arm-linux-androideabi_H_$(CFG_BUILD_TRIPLE))/$(CFG_RUNTIME_arm-linux-androideabi) \
                  $(CFG_ADB_TEST_DIR)) \
 $(shell adb push $(TLIB2_T_arm-linux-androideabi_H_$(CFG_BUILD_TRIPLE))/$(STDLIB_GLOB_arm-linux-androideabi) \
                  $(CFG_ADB_TEST_DIR)) \
 $(shell adb push $(TLIB2_T_arm-linux-androideabi_H_$(CFG_BUILD_TRIPLE))/$(EXTRALIB_GLOB_arm-linux-androideabi) \
                  $(CFG_ADB_TEST_DIR)) \
158
 )
159 160
else
CFG_ADB_TEST_DIR=
161
endif
162 163


B
Brian Anderson 已提交
164 165 166 167
######################################################################
# Main test targets
######################################################################

168 169 170 171 172 173 174 175 176 177 178 179 180 181
check: cleantestlibs cleantmptestlogs tidy all check-stage2
	$(Q)$(CFG_PYTHON) $(S)src/etc/check-summary.py tmp/*.log

check-notidy: cleantestlibs cleantmptestlogs all check-stage2
	$(Q)$(CFG_PYTHON) $(S)src/etc/check-summary.py tmp/*.log

check-full: cleantestlibs cleantmptestlogs tidy \
            all check-stage1 check-stage2 check-stage3
	$(Q)$(CFG_PYTHON) $(S)src/etc/check-summary.py tmp/*.log

check-test: cleantestlibs cleantmptestlogs all check-stage2-rfail
	$(Q)$(CFG_PYTHON) $(S)src/etc/check-summary.py tmp/*.log

check-lite: cleantestlibs cleantmptestlogs \
182
	check-stage2-std check-stage2-extra check-stage2-rpass \
A
Alex Crichton 已提交
183
	check-stage2-rustpkg check-stage2-rusti \
184 185 186
	check-stage2-rfail check-stage2-cfail
	$(Q)$(CFG_PYTHON) $(S)src/etc/check-summary.py tmp/*.log

187 188
.PHONY: cleantmptestlogs cleantestlibs

189 190
cleantmptestlogs:
	$(Q)rm -f tmp/*.log
191

192
cleantestlibs:
193
	$(Q)find $(CFG_BUILD_TRIPLE)/test \
194 195 196 197 198 199 200
         -name '*.[odasS]' -o \
         -name '*.so' -o      \
         -name '*.dylib' -o   \
         -name '*.dll' -o     \
         -name '*.def' -o     \
         -name '*.bc' -o      \
         -name '*.dSYM' -o    \
201
         -name '*.libaux' -o      \
202
         -name '*.out' -o     \
B
Brian Leibig 已提交
203 204
         -name '*.err' -o     \
	 -name '*.debugger.script' \
205
         | xargs rm -rf
206

207

208 209 210
######################################################################
# Tidy
######################################################################
B
Brian Anderson 已提交
211

212
ifdef CFG_NOTIDY
B
Brian Anderson 已提交
213
tidy:
214
else
215 216 217 218

ALL_CS := $(wildcard $(S)src/rt/*.cpp \
                     $(S)src/rt/*/*.cpp \
                     $(S)src/rt/*/*/*.cpp \
219
                     $(S)src/rustllvm/*.cpp)
220
ALL_CS := $(filter-out $(S)src/rt/miniz.cpp \
221
                       $(S)src/rt/linenoise/linenoise.c \
B
Brian Anderson 已提交
222
                       $(S)src/rt/linenoise/utf8.c \
223 224 225 226
	,$(ALL_CS))
ALL_HS := $(wildcard $(S)src/rt/*.h \
                     $(S)src/rt/*/*.h \
                     $(S)src/rt/*/*/*.h \
227
                     $(S)src/rustllvm/*.h)
228 229 230 231 232
ALL_HS := $(filter-out $(S)src/rt/vg/valgrind.h \
                       $(S)src/rt/vg/memcheck.h \
                       $(S)src/rt/msvc/typeof.h \
                       $(S)src/rt/msvc/stdint.h \
                       $(S)src/rt/msvc/inttypes.h \
233
                       $(S)src/rt/linenoise/linenoise.h \
B
Brian Anderson 已提交
234
                       $(S)src/rt/linenoise/utf8.h \
235 236
	,$(ALL_HS))

237
# Run the tidy script in multiple parts to avoid huge 'echo' commands
238 239
tidy:
		@$(call E, check: formatting)
240
		$(Q)find $(S)src -name '*.r[sc]' \
241
		| grep '^$(S)src/test' -v \
242
		| xargs -n 10 $(CFG_PYTHON) $(S)src/etc/tidy.py
243
		$(Q)find $(S)src/etc -name '*.py' \
244
		| xargs -n 10 $(CFG_PYTHON) $(S)src/etc/tidy.py
245
		$(Q)echo $(ALL_CS) \
246
		| xargs -n 10 $(CFG_PYTHON) $(S)src/etc/tidy.py
247
		$(Q)echo $(ALL_HS) \
248
		| xargs -n 10 $(CFG_PYTHON) $(S)src/etc/tidy.py
249

250
endif
251

252

B
Brian Anderson 已提交
253
######################################################################
254
# Sets of tests
B
Brian Anderson 已提交
255 256
######################################################################

257 258 259 260 261 262 263 264 265
define DEF_TEST_SETS

check-stage$(1)-T-$(2)-H-$(3)-exec:     				\
	check-stage$(1)-T-$(2)-H-$(3)-rpass-exec			\
	check-stage$(1)-T-$(2)-H-$(3)-rfail-exec			\
	check-stage$(1)-T-$(2)-H-$(3)-cfail-exec			\
	check-stage$(1)-T-$(2)-H-$(3)-rpass-full-exec			\
        check-stage$(1)-T-$(2)-H-$(3)-crates-exec                      \
	check-stage$(1)-T-$(2)-H-$(3)-bench-exec			\
266
	check-stage$(1)-T-$(2)-H-$(3)-debuginfo-exec \
267
	check-stage$(1)-T-$(2)-H-$(3)-codegen-exec \
268 269 270
	check-stage$(1)-T-$(2)-H-$(3)-doc-exec \
	check-stage$(1)-T-$(2)-H-$(3)-pretty-exec

271 272 273 274
# Only test the compiler-dependent crates when the target is
# able to build a compiler (when the target triple is in the set of host triples)
ifneq ($$(findstring $(2),$$(CFG_HOST_TRIPLES)),)

275 276 277 278
check-stage$(1)-T-$(2)-H-$(3)-crates-exec: \
	$$(foreach crate,$$(TEST_CRATES), \
           check-stage$(1)-T-$(2)-H-$(3)-$$(crate)-exec)

279 280 281 282 283 284 285 286
else

check-stage$(1)-T-$(2)-H-$(3)-crates-exec: \
	$$(foreach crate,$$(TEST_TARGET_CRATES), \
           check-stage$(1)-T-$(2)-H-$(3)-$$(crate)-exec)

endif

287 288 289 290 291 292 293 294 295 296
check-stage$(1)-T-$(2)-H-$(3)-doc-exec: \
        $$(foreach docname,$$(DOC_TEST_NAMES), \
           check-stage$(1)-T-$(2)-H-$(3)-doc-$$(docname)-exec)

check-stage$(1)-T-$(2)-H-$(3)-pretty-exec: \
	check-stage$(1)-T-$(2)-H-$(3)-pretty-rpass-exec	\
	check-stage$(1)-T-$(2)-H-$(3)-pretty-rpass-full-exec	\
	check-stage$(1)-T-$(2)-H-$(3)-pretty-rfail-exec	\
	check-stage$(1)-T-$(2)-H-$(3)-pretty-bench-exec	\
	check-stage$(1)-T-$(2)-H-$(3)-pretty-pretty-exec
297

B
Brian Anderson 已提交
298 299
endef

300
$(foreach host,$(CFG_HOST_TRIPLES), \
301 302 303 304
 $(foreach target,$(CFG_TARGET_TRIPLES), \
  $(foreach stage,$(STAGES), \
    $(eval $(call DEF_TEST_SETS,$(stage),$(target),$(host))))))

B
Brian Anderson 已提交
305

306
######################################################################
307
# Crate testing
308 309
######################################################################

310
define TEST_RUNNER
311

312 313
# If NO_REBUILD is set then break the dependencies on extra so we can
# test crates without rebuilding std and extra first
314
ifeq ($(NO_REBUILD),)
315 316
STDTESTDEP_$(1)_$(2)_$(3) = $$(SREQ$(1)_T_$(2)_H_$(3)) \
                            $$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_EXTRALIB_$(2))
317 318 319 320
else
STDTESTDEP_$(1)_$(2)_$(3) =
endif

321 322
$(3)/stage$(1)/test/stdtest-$(2)$$(X_$(2)):			\
		$$(STDLIB_CRATE) $$(STDLIB_INPUTS)	\
323
		$$(STDTESTDEP_$(1)_$(2)_$(3))
324
	@$$(call E, compile_and_link: $$@)
325
	$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test
326

327 328
$(3)/stage$(1)/test/extratest-$(2)$$(X_$(2)):			\
		$$(EXTRALIB_CRATE) $$(EXTRALIB_INPUTS)	\
329
		$$(STDTESTDEP_$(1)_$(2)_$(3))
B
Brian Anderson 已提交
330
	@$$(call E, compile_and_link: $$@)
N
Niko Matsakis 已提交
331
	$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test
332

A
Alex Crichton 已提交
333
$(3)/stage$(1)/test/syntaxtest-$(2)$$(X_$(2)):			\
334
		$$(LIBSYNTAX_CRATE) $$(LIBSYNTAX_INPUTS)	\
335
		$$(STDTESTDEP_$(1)_$(2)_$(3))
336 337 338
	@$$(call E, compile_and_link: $$@)
	$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test

339
$(3)/stage$(1)/test/rustctest-$(2)$$(X_$(2)): CFG_COMPILER_TRIPLE = $(2)
A
Alex Crichton 已提交
340
$(3)/stage$(1)/test/rustctest-$(2)$$(X_$(2)):					\
341
		$$(COMPILER_CRATE) $$(COMPILER_INPUTS) \
342
		$$(SREQ$(1)_T_$(2)_H_$(3)) \
B
Brian Anderson 已提交
343 344
		$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_RUSTLLVM_$(2)) \
                $$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBSYNTAX_$(2))
B
Brian Anderson 已提交
345
	@$$(call E, compile_and_link: $$@)
N
Niko Matsakis 已提交
346
	$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test
347

A
Alex Crichton 已提交
348
$(3)/stage$(1)/test/rustpkgtest-$(2)$$(X_$(2)):					\
349
		$$(RUSTPKG_LIB) $$(RUSTPKG_INPUTS)		\
350
		$$(SREQ$(1)_T_$(2)_H_$(3)) \
351
		$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBSYNTAX_$(2)) \
352
		$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBRUSTC_$(2)) \
353 354
		$$(TBIN$(1)_T_$(2)_H_$(3))/rustpkg$$(X_$(2)) \
		$$(TBIN$(1)_T_$(2)_H_$(3))/rustc$$(X_$(2))
355 356
	@$$(call E, compile_and_link: $$@)
	$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test
357

A
Alex Crichton 已提交
358
$(3)/stage$(1)/test/rustitest-$(2)$$(X_$(2)):					\
359
		$$(RUSTI_LIB) $$(RUSTI_INPUTS)		\
360
		$$(SREQ$(1)_T_$(2)_H_$(3)) \
361
		$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBSYNTAX_$(2)) \
B
Brian Anderson 已提交
362
		$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBRUSTC_$(2))
363 364
	@$$(call E, compile_and_link: $$@)
	$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test
365

A
Alex Crichton 已提交
366
$(3)/stage$(1)/test/rusttest-$(2)$$(X_$(2)):					\
367
		$$(RUST_LIB) $$(RUST_INPUTS)		\
368
		$$(SREQ$(1)_T_$(2)_H_$(3)) \
369 370 371
		$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBRUSTPKG_$(2)) \
		$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBRUSTDOC_$(2)) \
		$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBRUSTI_$(2)) \
B
Brian Anderson 已提交
372
		$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBRUSTC_$(2))
373 374 375
	@$$(call E, compile_and_link: $$@)
	$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test

A
Alex Crichton 已提交
376
$(3)/stage$(1)/test/rustdoctest-$(2)$$(X_$(2)):					\
377
		$$(RUSTDOC_LIB) $$(RUSTDOC_INPUTS)		\
378
		$$(SREQ$(1)_T_$(2)_H_$(3)) \
379
		$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBSYNTAX_$(2)) \
B
Brian Anderson 已提交
380
		$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBRUSTC_$(2))
381 382 383
	@$$(call E, compile_and_link: $$@)
	$$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --test

384 385
endef

386
$(foreach host,$(CFG_HOST_TRIPLES), \
387 388 389 390 391
 $(eval $(foreach target,$(CFG_TARGET_TRIPLES), \
  $(eval $(foreach stage,$(STAGES), \
   $(eval $(call TEST_RUNNER,$(stage),$(target),$(host))))))))

define DEF_TEST_CRATE_RULES
392 393
check-stage$(1)-T-$(2)-H-$(3)-$(4)-exec: $$(call TEST_OK_FILE,$(1),$(2),$(3),$(4))

394 395
check-stage$(1)-T-$(2)-H-$(3)-$(4)-exec: $$(call TEST_OK_FILE,$(1),$(2),$(3),$(4))

396
$$(call TEST_OK_FILE,$(1),$(2),$(3),$(4)): \
A
Alex Crichton 已提交
397
		$(3)/stage$(1)/test/$(4)test-$(2)$$(X_$(2))
398
	@$$(call E, run: $$<)
399
	$$(Q)$$(call CFG_RUN_TEST_$(2),$$<,$(2),$(3)) $$(TESTARGS)	\
400
	--logfile $$(call TEST_LOG_FILE,$(1),$(2),$(3),$(4)) \
401
	$$(call CRATE_TEST_BENCH_ARGS,$(1),$(2),$(3),$(4)) \
402
	&& touch $$@
403
endef
404

405 406 407 408
define DEF_TEST_CRATE_RULES_arm-linux-androideabi
check-stage$(1)-T-$(2)-H-$(3)-$(4)-exec: $$(call TEST_OK_FILE,$(1),$(2),$(3),$(4))

$$(call TEST_OK_FILE,$(1),$(2),$(3),$(4)): \
A
Alex Crichton 已提交
409
		$(3)/stage$(1)/test/$(4)test-$(2)$$(X_$(2))
410
	@$$(call E, run: $$< via adb)
411 412 413
	@$(CFG_ADB) push $$< $(CFG_ADB_TEST_DIR)
	@$(CFG_ADB) shell LD_LIBRARY_PATH=$(CFG_ADB_TEST_DIR) \
        $(CFG_ADB_TEST_DIR)/`echo $$< | sed 's/.*\///'` \
414 415 416 417
		--logfile $(CFG_ADB_TEST_DIR)/check-stage$(1)-T-$(2)-H-$(3)-$(4).log > \
		tmp/check-stage$(1)-T-$(2)-H-$(3)-$(4).tmp
	@cat tmp/check-stage$(1)-T-$(2)-H-$(3)-$(4).tmp
	@touch tmp/check-stage$(1)-T-$(2)-H-$(3)-$(4).log
418 419
	@$(CFG_ADB) pull $(CFG_ADB_TEST_DIR)/check-stage$(1)-T-$(2)-H-$(3)-$(4).log tmp/
	@$(CFG_ADB) shell rm $(CFG_ADB_TEST_DIR)/check-stage$(1)-T-$(2)-H-$(3)-$(4).log
420 421 422 423 424 425 426 427 428 429 430 431 432 433
	@if grep -q "result: ok" tmp/check-stage$(1)-T-$(2)-H-$(3)-$(4).tmp; \
	then \
		rm tmp/check-stage$(1)-T-$(2)-H-$(3)-$(4).tmp; \
		touch $$@; \
	else \
		rm tmp/check-stage$(1)-T-$(2)-H-$(3)-$(4).tmp; \
		exit 101; \
	fi
endef

define DEF_TEST_CRATE_RULES_null
check-stage$(1)-T-$(2)-H-$(3)-$(4)-exec: $$(call TEST_OK_FILE,$(1),$(2),$(3),$(4))

$$(call TEST_OK_FILE,$(1),$(2),$(3),$(4)): \
A
Alex Crichton 已提交
434
		$(3)/stage$(1)/test/$(4)test-$(2)$$(X_$(2))
435 436 437 438
	@$$(call E, run: skipped $$< )
	@touch $$@
endef

439
$(foreach host,$(CFG_HOST_TRIPLES), \
440 441 442
 $(foreach target,$(CFG_TARGET_TRIPLES), \
  $(foreach stage,$(STAGES), \
   $(foreach crate, $(TEST_CRATES), \
443 444 445
    $(if $(findstring $(target),$(CFG_BUILD_TRIPLE)), \
     $(eval $(call DEF_TEST_CRATE_RULES,$(stage),$(target),$(host),$(crate))), \
     $(if $(findstring $(target),"arm-linux-androideabi"), \
446
      $(if $(findstring $(CFG_ADB_DEVICE_STATUS),"true"), \
447 448 449
       $(eval $(call DEF_TEST_CRATE_RULES_arm-linux-androideabi,$(stage),$(target),$(host),$(crate))), \
       $(eval $(call DEF_TEST_CRATE_RULES_null,$(stage),$(target),$(host),$(crate))) \
      ), \
450
      $(eval $(call DEF_TEST_CRATE_RULES,$(stage),$(target),$(host),$(crate))) \
D
Daniel Micay 已提交
451
     ))))))
452 453


454 455 456 457 458 459 460 461 462 463 464 465 466 467
######################################################################
# Rules for the compiletest tests (rpass, rfail, etc.)
######################################################################

RPASS_RC := $(wildcard $(S)src/test/run-pass/*.rc)
RPASS_RS := $(wildcard $(S)src/test/run-pass/*.rs)
RPASS_FULL_RC := $(wildcard $(S)src/test/run-pass-fulldeps/*.rc)
RPASS_FULL_RS := $(wildcard $(S)src/test/run-pass-fulldeps/*.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)
B
Brian Anderson 已提交
468
DEBUGINFO_RS := $(wildcard $(S)src/test/debug-info/*.rs)
469 470
CODEGEN_RS := $(wildcard $(S)src/test/codegen/*.rs)
CODEGEN_CC := $(wildcard $(S)src/test/codegen/*.cc)
471

472 473 474
# perf tests are the same as bench tests only they run under
# a performance monitor.
PERF_RS := $(wildcard $(S)src/test/bench/*.rs)
475

476 477 478 479 480 481 482
RPASS_TESTS := $(RPASS_RC) $(RPASS_RS)
RPASS_FULL_TESTS := $(RPASS_FULL_RC) $(RPASS_FULL_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)
B
Brian Leibig 已提交
483
DEBUGINFO_TESTS := $(DEBUGINFO_RS)
484
CODEGEN_TESTS := $(CODEGEN_RS) $(CODEGEN_CC)
B
Brian Anderson 已提交
485

486 487 488 489
CTEST_SRC_BASE_rpass = run-pass
CTEST_BUILD_BASE_rpass = run-pass
CTEST_MODE_rpass = run-pass
CTEST_RUNTOOL_rpass = $(CTEST_RUNTOOL)
B
Brian Anderson 已提交
490

491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
CTEST_SRC_BASE_rpass-full = run-pass-full
CTEST_BUILD_BASE_rpass-full = run-pass-full
CTEST_MODE_rpass-full = run-pass
CTEST_RUNTOOL_rpass-full = $(CTEST_RUNTOOL)

CTEST_SRC_BASE_rfail = run-fail
CTEST_BUILD_BASE_rfail = run-fail
CTEST_MODE_rfail = run-fail
CTEST_RUNTOOL_rfail = $(CTEST_RUNTOOL)

CTEST_SRC_BASE_cfail = compile-fail
CTEST_BUILD_BASE_cfail = compile-fail
CTEST_MODE_cfail = compile-fail
CTEST_RUNTOOL_cfail = $(CTEST_RUNTOOL)

CTEST_SRC_BASE_bench = bench
CTEST_BUILD_BASE_bench = bench
CTEST_MODE_bench = run-pass
CTEST_RUNTOOL_bench = $(CTEST_RUNTOOL)

CTEST_SRC_BASE_perf = bench
CTEST_BUILD_BASE_perf = perf
CTEST_MODE_perf = run-pass
CTEST_RUNTOOL_perf = $(CTEST_PERF_RUNTOOL)

B
Brian Leibig 已提交
516 517 518 519 520
CTEST_SRC_BASE_debuginfo = debug-info
CTEST_BUILD_BASE_debuginfo = debug-info
CTEST_MODE_debuginfo = debug-info
CTEST_RUNTOOL_debuginfo = $(CTEST_RUNTOOL)

521 522 523 524 525
CTEST_SRC_BASE_codegen = codegen
CTEST_BUILD_BASE_codegen = codegen
CTEST_MODE_codegen = codegen
CTEST_RUNTOOL_codegen = $(CTEST_RUNTOOL)

526 527 528 529
ifeq ($(CFG_GDB),)
CTEST_DISABLE_debuginfo = "no gdb found"
endif

530 531 532 533
ifeq ($(CFG_CLANG),)
CTEST_DISABLE_codegen = "no clang found"
endif

534 535 536 537
ifeq ($(CFG_OSTYPE),apple-darwin)
CTEST_DISABLE_debuginfo = "gdb on darwing needs root"
endif

538 539 540 541 542 543 544 545 546 547 548
define DEF_CTEST_VARS

# All the per-stage build rules you might want to call from the
# command line.
#
# $(1) is the stage number
# $(2) is the target triple to test
# $(3) is the host triple to test

# Prerequisites for compiletest tests
TEST_SREQ$(1)_T_$(2)_H_$(3) = \
549
	$$(HBIN$(1)_H_$(3))/compiletest$$(X_$(3)) \
550
	$$(SREQ$(1)_T_$(2)_H_$(3))
B
Brian Anderson 已提交
551

B
Brian Anderson 已提交
552
# Rules for the cfail/rfail/rpass/bench/perf test runner
553

554 555
# The tests select when to use debug configuration on their own;
# remove directive, if present, from CFG_RUSTC_FLAGS (issue #7898).
556 557 558 559 560 561 562 563 564
CTEST_RUSTC_FLAGS := $$(subst --cfg debug,,$$(CFG_RUSTC_FLAGS))

# The tests can not be optimized while the rest of the compiler is optimized, so
# filter out the optimization (if any) from rustc and then figure out if we need
# to be optimized
CTEST_RUSTC_FLAGS := $$(subst -O,,$$(CTEST_RUSTC_FLAGS))
ifndef CFG_DISABLE_OPTIMIZE_TESTS
CTEST_RUSTC_FLAGS += -O
endif
565

N
Niko Matsakis 已提交
566
CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3) :=						\
N
Niko Matsakis 已提交
567 568
		--compile-lib-path $$(HLIB$(1)_H_$(3))				\
        --run-lib-path $$(TLIB$(1)_T_$(2)_H_$(3))			\
569
        --rustc-path $$(HBIN$(1)_H_$(3))/rustc$$(X_$(3))			\
570 571
        --clang-path $(if $(CFG_CLANG),$(CFG_CLANG),clang) \
        --llvm-bin-path $(CFG_LLVM_INST_DIR_$(CFG_BUILD_TRIPLE))/bin \
572
        --aux-base $$(S)src/test/auxiliary/                 \
N
Niko Matsakis 已提交
573
        --stage-id stage$(1)-$(2)							\
574
        --target $(2)                                       \
575
        --adb-path=$(CFG_ADB)                          \
576
        --adb-test-dir=$(CFG_ADB_TEST_DIR)                  \
577
        --rustcflags "$(RUSTC_FLAGS_$(2)) $$(CTEST_RUSTC_FLAGS) --target=$(2)" \
N
Niko Matsakis 已提交
578 579
        $$(CTEST_TESTARGS)

580 581 582 583 584 585
CTEST_DEPS_rpass_$(1)-T-$(2)-H-$(3) = $$(RPASS_TESTS)
CTEST_DEPS_rpass_full_$(1)-T-$(2)-H-$(3) = $$(RPASS_FULL_TESTS) $$(TLIBRUSTC_DEFAULT$(1)_T_$(2)_H_$(3))
CTEST_DEPS_rfail_$(1)-T-$(2)-H-$(3) = $$(RFAIL_TESTS)
CTEST_DEPS_cfail_$(1)-T-$(2)-H-$(3) = $$(CFAIL_TESTS)
CTEST_DEPS_bench_$(1)-T-$(2)-H-$(3) = $$(BENCH_TESTS)
CTEST_DEPS_perf_$(1)-T-$(2)-H-$(3) = $$(PERF_TESTS)
B
Brian Leibig 已提交
586
CTEST_DEPS_debuginfo_$(1)-T-$(2)-H-$(3) = $$(DEBUGINFO_TESTS)
587
CTEST_DEPS_codegen_$(1)-T-$(2)-H-$(3) = $$(CODEGEN_TESTS)
N
Niko Matsakis 已提交
588

589
endef
N
Niko Matsakis 已提交
590

591
$(foreach host,$(CFG_HOST_TRIPLES), \
592 593 594
 $(eval $(foreach target,$(CFG_TARGET_TRIPLES), \
  $(eval $(foreach stage,$(STAGES), \
   $(eval $(call DEF_CTEST_VARS,$(stage),$(target),$(host))))))))
N
Niko Matsakis 已提交
595

596
define DEF_RUN_COMPILETEST
597

598 599 600 601
CTEST_ARGS$(1)-T-$(2)-H-$(3)-$(4) := \
        $$(CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3))	\
        --src-base $$(S)src/test/$$(CTEST_SRC_BASE_$(4))/ \
        --build-base $(3)/test/$$(CTEST_BUILD_BASE_$(4))/ \
602
        --ratchet-metrics $(call TEST_RATCHET_FILE,$(1),$(2),$(3),$(4)) \
603 604
        --mode $$(CTEST_MODE_$(4)) \
	$$(CTEST_RUNTOOL_$(4))
N
Niko Matsakis 已提交
605

606 607
check-stage$(1)-T-$(2)-H-$(3)-$(4)-exec: $$(call TEST_OK_FILE,$(1),$(2),$(3),$(4))

608 609
ifeq ($$(CTEST_DISABLE_$(4)),)

610
$$(call TEST_OK_FILE,$(1),$(2),$(3),$(4)): \
611 612
		$$(TEST_SREQ$(1)_T_$(2)_H_$(3)) \
                $$(CTEST_DEPS_$(4)_$(1)-T-$(2)-H-$(3))
613
	@$$(call E, run $(4) [$(2)]: $$<)
614
	$$(Q)$$(call CFG_RUN_CTEST_$(2),$(1),$$<,$(3)) \
615
		$$(CTEST_ARGS$(1)-T-$(2)-H-$(3)-$(4)) \
616 617
		--logfile $$(call TEST_LOG_FILE,$(1),$(2),$(3),$(4)) \
                && touch $$@
N
Niko Matsakis 已提交
618

619 620 621 622 623
else

$$(call TEST_OK_FILE,$(1),$(2),$(3),$(4)): \
		$$(TEST_SREQ$(1)_T_$(2)_H_$(3)) \
                $$(CTEST_DEPS_$(4)_$(1)-T-$(2)-H-$(3))
624
	@$$(call E, run $(4) [$(2)]: $$<)
625 626 627 628 629
	@$$(call E, warning: tests disabled: $$(CTEST_DISABLE_$(4)))
	touch $$@

endif

630
endef
N
Niko Matsakis 已提交
631

632
CTEST_NAMES = rpass rpass-full rfail cfail bench perf debuginfo codegen
633

634
$(foreach host,$(CFG_HOST_TRIPLES), \
635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654
 $(eval $(foreach target,$(CFG_TARGET_TRIPLES), \
  $(eval $(foreach stage,$(STAGES), \
   $(eval $(foreach name,$(CTEST_NAMES), \
   $(eval $(call DEF_RUN_COMPILETEST,$(stage),$(target),$(host),$(name))))))))))

PRETTY_NAMES = pretty-rpass pretty-rpass-full pretty-rfail pretty-bench pretty-pretty
PRETTY_DEPS_pretty-rpass = $(RPASS_TESTS)
PRETTY_DEPS_pretty-rpass-full = $(RPASS_FULL_TESTS)
PRETTY_DEPS_pretty-rfail = $(RFAIL_TESTS)
PRETTY_DEPS_pretty-bench = $(BENCH_TESTS)
PRETTY_DEPS_pretty-pretty = $(PRETTY_TESTS)
PRETTY_DIRNAME_pretty-rpass = run-pass
PRETTY_DIRNAME_pretty-rpass-full = run-pass-full
PRETTY_DIRNAME_pretty-rfail = run-fail
PRETTY_DIRNAME_pretty-bench = bench
PRETTY_DIRNAME_pretty-pretty = pretty

define DEF_RUN_PRETTY_TEST

PRETTY_ARGS$(1)-T-$(2)-H-$(3)-$(4) :=			\
N
Niko Matsakis 已提交
655
		$$(CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3))	\
656 657
        --src-base $$(S)src/test/$$(PRETTY_DIRNAME_$(4))/ \
        --build-base $(3)/test/$$(PRETTY_DIRNAME_$(4))/ \
N
Niko Matsakis 已提交
658 659
        --mode pretty

660 661 662
check-stage$(1)-T-$(2)-H-$(3)-$(4)-exec: $$(call TEST_OK_FILE,$(1),$(2),$(3),$(4))

$$(call TEST_OK_FILE,$(1),$(2),$(3),$(4)): \
663 664
	        $$(TEST_SREQ$(1)_T_$(2)_H_$(3))		\
	        $$(PRETTY_DEPS_$(4))
665
	@$$(call E, run pretty-rpass [$(2)]: $$<)
666
	$$(Q)$$(call CFG_RUN_CTEST_$(2),$(1),$$<,$(3)) \
667
		$$(PRETTY_ARGS$(1)-T-$(2)-H-$(3)-$(4)) \
668 669
		--logfile $$(call TEST_LOG_FILE,$(1),$(2),$(3),$(4)) \
                && touch $$@
N
Niko Matsakis 已提交
670

671
endef
N
Niko Matsakis 已提交
672

673
$(foreach host,$(CFG_HOST_TRIPLES), \
674 675 676 677
 $(foreach target,$(CFG_TARGET_TRIPLES), \
  $(foreach stage,$(STAGES), \
   $(foreach pretty-name,$(PRETTY_NAMES), \
    $(eval $(call DEF_RUN_PRETTY_TEST,$(stage),$(target),$(host),$(pretty-name)))))))
B
Brian Anderson 已提交
678

679
define DEF_RUN_DOC_TEST
680

681
DOC_TEST_ARGS$(1)-T-$(2)-H-$(3)-doc-$(4) := \
682 683 684
        $$(CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3))	\
        --src-base $(3)/test/doc-$(4)/	\
        --build-base $(3)/test/doc-$(4)/	\
685 686
        --mode run-pass

687
check-stage$(1)-T-$(2)-H-$(3)-doc-$(4)-exec: $$(call TEST_OK_FILE,$(1),$(2),$(3),doc-$(4))
688

689
$$(call TEST_OK_FILE,$(1),$(2),$(3),doc-$(4)): \
690 691
	        $$(TEST_SREQ$(1)_T_$(2)_H_$(3))		\
                doc-$(4)-extract$(3)
692
	@$$(call E, run doc-$(4) [$(2)]: $$<)
693
	$$(Q)$$(call CFG_RUN_CTEST_$(2),$(1),$$<,$(3)) \
694
                $$(DOC_TEST_ARGS$(1)-T-$(2)-H-$(3)-doc-$(4)) \
695 696
		--logfile $$(call TEST_LOG_FILE,$(1),$(2),$(3),doc-$(4)) \
                && touch $$@
697

698
endef
699

700
$(foreach host,$(CFG_HOST_TRIPLES), \
701 702 703 704
 $(foreach target,$(CFG_TARGET_TRIPLES), \
  $(foreach stage,$(STAGES), \
   $(foreach docname,$(DOC_TEST_NAMES), \
    $(eval $(call DEF_RUN_DOC_TEST,$(stage),$(target),$(host),$(docname)))))))
705

706

707 708 709
######################################################################
# Extracting tests for docs
######################################################################
B
Brian Anderson 已提交
710

711
EXTRACT_TESTS := "$(CFG_PYTHON)" $(S)src/etc/extract-tests.py
B
Brian Anderson 已提交
712

713
define DEF_DOC_TEST_HOST
714

715 716 717 718
doc-$(2)-extract$(1):
	@$$(call E, extract: $(2) tests)
	$$(Q)rm -f $(1)/test/doc-$(2)/*.rs
	$$(Q)$$(EXTRACT_TESTS) $$(S)doc/$(2).md $(1)/test/doc-$(2)
719

720
endef
721

722
$(foreach host,$(CFG_HOST_TRIPLES), \
723 724
 $(foreach docname,$(DOC_TEST_NAMES), \
  $(eval $(call DEF_DOC_TEST_HOST,$(host),$(docname)))))
725

726

727 728 729
######################################################################
# Shortcut rules
######################################################################
730

731 732 733 734 735 736 737 738 739
TEST_GROUPS = \
	crates \
	$(foreach crate,$(TEST_CRATES),$(crate)) \
	rpass \
	rpass-full \
	rfail \
	cfail \
	bench \
	perf \
B
Brian Leibig 已提交
740
	debuginfo \
741
	codegen \
742
	doc \
743
	$(foreach docname,$(DOC_TEST_NAMES),doc-$(docname)) \
744 745 746 747 748 749 750 751 752 753 754
	pretty \
	pretty-rpass \
	pretty-rpass-full \
	pretty-rfail \
	pretty-bench \
	pretty-pretty \
	$(NULL)

define DEF_CHECK_FOR_STAGE_AND_TARGET_AND_HOST
check-stage$(1)-T-$(2)-H-$(3): check-stage$(1)-T-$(2)-H-$(3)-exec
endef
755

756 757
$(foreach stage,$(STAGES), \
 $(foreach target,$(CFG_TARGET_TRIPLES), \
758
  $(foreach host,$(CFG_HOST_TRIPLES), \
759
   $(eval $(call DEF_CHECK_FOR_STAGE_AND_TARGET_AND_HOST,$(stage),$(target),$(host))))))
760

761 762 763
define DEF_CHECK_FOR_STAGE_AND_TARGET_AND_HOST_AND_GROUP
check-stage$(1)-T-$(2)-H-$(3)-$(4): check-stage$(1)-T-$(2)-H-$(3)-$(4)-exec
endef
B
Brian Anderson 已提交
764

765 766
$(foreach stage,$(STAGES), \
 $(foreach target,$(CFG_TARGET_TRIPLES), \
767
  $(foreach host,$(CFG_HOST_TRIPLES), \
768 769
   $(foreach group,$(TEST_GROUPS), \
    $(eval $(call DEF_CHECK_FOR_STAGE_AND_TARGET_AND_HOST_AND_GROUP,$(stage),$(target),$(host),$(group)))))))
770

771
define DEF_CHECK_FOR_STAGE
772
check-stage$(1): check-stage$(1)-H-$$(CFG_BUILD_TRIPLE)
773
check-stage$(1)-H-all: $$(foreach target,$$(CFG_TARGET_TRIPLES), \
774 775
                           check-stage$(1)-H-$$(target))
endef
776

777 778
$(foreach stage,$(STAGES), \
 $(eval $(call DEF_CHECK_FOR_STAGE,$(stage))))
779

780
define DEF_CHECK_FOR_STAGE_AND_GROUP
781
check-stage$(1)-$(2): check-stage$(1)-H-$$(CFG_BUILD_TRIPLE)-$(2)
782
check-stage$(1)-H-all-$(2): $$(foreach target,$$(CFG_TARGET_TRIPLES), \
783 784
                               check-stage$(1)-H-$$(target)-$(2))
endef
785

786 787 788
$(foreach stage,$(STAGES), \
 $(foreach group,$(TEST_GROUPS), \
  $(eval $(call DEF_CHECK_FOR_STAGE_AND_GROUP,$(stage),$(group)))))
789

790 791

define DEF_CHECK_FOR_STAGE_AND_HOSTS
792
check-stage$(1)-H-$(2): $$(foreach target,$$(CFG_TARGET_TRIPLES), \
793
                           check-stage$(1)-T-$$(target)-H-$(2))
B
Brian Anderson 已提交
794
endef
795

796
$(foreach stage,$(STAGES), \
797
 $(foreach host,$(CFG_HOST_TRIPLES), \
798 799 800
  $(eval $(call DEF_CHECK_FOR_STAGE_AND_HOSTS,$(stage),$(host)))))

define DEF_CHECK_FOR_STAGE_AND_HOSTS_AND_GROUP
801
check-stage$(1)-H-$(2)-$(3): $$(foreach target,$$(CFG_TARGET_TRIPLES), \
802 803 804 805
                                check-stage$(1)-T-$$(target)-H-$(2)-$(3))
endef

$(foreach stage,$(STAGES), \
806
 $(foreach host,$(CFG_HOST_TRIPLES), \
807 808
  $(foreach group,$(TEST_GROUPS), \
   $(eval $(call DEF_CHECK_FOR_STAGE_AND_HOSTS_AND_GROUP,$(stage),$(host),$(group))))))
809

N
Niko Matsakis 已提交
810
######################################################################
811
# check-fast rules
N
Niko Matsakis 已提交
812
######################################################################
813

814
FT := run_pass_stage2
815
FT_LIB := $(call CFG_LIB_NAME_$(CFG_BUILD_TRIPLE),$(FT))
816 817
FT_DRIVER := $(FT)_driver

818
GENERATED += tmp/$(FT).rc tmp/$(FT_DRIVER).rs
N
Niko Matsakis 已提交
819

N
Niko Matsakis 已提交
820
tmp/$(FT).rc tmp/$(FT_DRIVER).rs: \
821
		$(RPASS_TESTS) \
N
Niko Matsakis 已提交
822 823
		$(S)src/etc/combine-tests.py
	@$(call E, check: building combined stage2 test runner)
824
	$(Q)$(CFG_PYTHON) $(S)src/etc/combine-tests.py
N
Niko Matsakis 已提交
825 826 827 828 829 830 831 832 833 834

define DEF_CHECK_FAST_FOR_T_H
# $(1) unused
# $(2) target triple
# $(3) host triple

$$(TLIB2_T_$(2)_H_$(3))/$$(FT_LIB): \
		tmp/$$(FT).rc \
		$$(SREQ2_T_$(2)_H_$(3))
	@$$(call E, compile_and_link: $$@)
N
Niko Matsakis 已提交
835
	$$(STAGE2_T_$(2)_H_$(3)) --lib -o $$@ $$<
N
Niko Matsakis 已提交
836

837
$(3)/test/$$(FT_DRIVER)-$(2)$$(X_$(2)): \
N
Niko Matsakis 已提交
838 839 840 841
		tmp/$$(FT_DRIVER).rs \
		$$(TLIB2_T_$(2)_H_$(3))/$$(FT_LIB) \
		$$(SREQ2_T_$(2)_H_$(3))
	@$$(call E, compile_and_link: $$@ $$<)
842
	$$(STAGE2_T_$(2)_H_$(3)) -o $$@ $$<
N
Niko Matsakis 已提交
843

N
Niko Matsakis 已提交
844
$(3)/test/$$(FT_DRIVER)-$(2).out: \
845
		$(3)/test/$$(FT_DRIVER)-$(2)$$(X_$(2)) \
N
Niko Matsakis 已提交
846
		$$(SREQ2_T_$(2)_H_$(3))
847
	$$(Q)$$(call CFG_RUN_TEST_$(2),$$<,$(2),$(3)) \
848
	--logfile tmp/$$(FT_DRIVER)-$(2).log
N
Niko Matsakis 已提交
849

850
check-fast-T-$(2)-H-$(3):     			\
N
Niko Matsakis 已提交
851
	$(3)/test/$$(FT_DRIVER)-$(2).out
N
Niko Matsakis 已提交
852 853 854

endef

855
$(foreach host,$(CFG_HOST_TRIPLES), \
N
Niko Matsakis 已提交
856 857 858
 $(eval $(foreach target,$(CFG_TARGET_TRIPLES), \
   $(eval $(call DEF_CHECK_FAST_FOR_T_H,,$(target),$(host))))))

859
check-fast: tidy check-fast-H-$(CFG_BUILD_TRIPLE)
N
Niko Matsakis 已提交
860 861 862 863 864 865

define DEF_CHECK_FAST_FOR_H

check-fast-H-$(1): 		check-fast-T-$(1)-H-$(1)

endef
N
Niko Matsakis 已提交
866

867 868
$(foreach host,$(CFG_HOST_TRIPLES),			\
 $(eval $(call DEF_CHECK_FAST_FOR_H,$(host))))