@@ -70,7 +70,7 @@ ifdef CFG_WINDOWSY
70
70
CFG_LIB_NAME =$(1 ) .dll
71
71
CFG_LDPATH :=$(CFG_LDPATH ) :$(CFG_LLVM_BINDIR )
72
72
CFG_LDPATH :=$(CFG_LDPATH ) :$$PATH
73
- CFG_RUN_PROGRAM =PATH =$(CFG_LDPATH ) $(1 )
73
+ CFG_RUN_TARG =PATH =$(CFG_LDPATH ) $(1 )
74
74
75
75
CFG_PATH_MUNGE := $(strip | perl -p \
76
76
-e 's@\\(.) @/\1@go;' \
@@ -87,7 +87,7 @@ ifdef CFG_UNIXY
87
87
88
88
CFG_EXE_SUFFIX :=
89
89
CFG_LDPATH :=$(CFG_LDPATH ) :$(CFG_LLVM_LIBDIR )
90
- CFG_RUN_PROGRAM =\
90
+ CFG_RUN_TARG =\
91
91
LD_LIBRARY_PATH=$(dir $(1 ) ) :$(CFG_LDPATH ) $(CFG_VALGRIND ) $(1 )
92
92
93
93
CFG_BOOT_NATIVE := 1
@@ -97,7 +97,7 @@ ifdef CFG_UNIXY
97
97
CFG_LIB_NAME =$(1 ) .dll
98
98
CFG_LDPATH :=$(CFG_LDPATH ) :$(CFG_LLVM_BINDIR )
99
99
CFG_LDPATH :=$(CFG_LDPATH ) :$$PATH
100
- CFG_RUN_PROGRAM =PATH =$(CFG_LDPATH ) $(1 )
100
+ CFG_RUN_TARG =PATH =$(CFG_LDPATH ) $(1 )
101
101
102
102
CFG_INFO := $(info cfg: mingw-cross)
103
103
CFG_GCC_CROSS := i586-mingw32msvc-
178
178
E = echo $(1 )
179
179
endif
180
180
181
- R := $(CFG_RUN_PROGRAM )
181
+ R := $(CFG_RUN_TARG )
182
182
S := $(CFG_SRC_DIR )
183
183
X := $(CFG_EXE_SUFFIX )
184
184
@@ -187,8 +187,8 @@ VPATH := $(S)doc $(S)src
187
187
188
188
# Compilers we build, we now know how to run.
189
189
BOOT := $(Q ) OCAMLRUNPARAM="b1" boot/rustboot$(X ) $(CFG_BOOT_FLAGS ) -L stage0
190
- STAGE0 := $(Q )$(CFG_RUN_PROGRAM ) stage0/rustc$(X ) $(CFG_RUSTC_FLAGS ) -L stage1
191
- STAGE1 := $(Q )$(CFG_RUN_PROGRAM ) stage1/rustc$(X ) $(CFG_RUSTC_FLAGS ) -L stage2
190
+ STAGE0 := $(Q )$(CFG_RUN_TARG ) stage0/rustc$(X ) $(CFG_RUSTC_FLAGS ) -L stage1
191
+ STAGE1 := $(Q )$(CFG_RUN_TARG ) stage1/rustc$(X ) $(CFG_RUSTC_FLAGS ) -L stage2
192
192
193
193
# "Source" files we generate in builddir along the way.
194
194
GENERATED := boot/fe/lexer.ml boot/version.ml
@@ -336,17 +336,26 @@ COMPILER_CRATE := comp/rustc.rc
336
336
COMPILER_INPUTS := $(wildcard $(addprefix $(S ) src/comp/, \
337
337
rustc.rc * .rs * /* .rs) )
338
338
339
+ # #####################################################################
340
+ # test dependency variables
341
+ # #####################################################################
342
+
343
+ LREQ := rt/$(CFG_RUNTIME ) llvmext/$(CFG_LLVMEXT )
344
+ BREQ := boot/rustboot$(X ) boot/$(CFG_STDLIB )
345
+ SREQ0 := stage0/rustc$(X ) $(LREQ )
346
+ SREQ1 := stage1/rustc$(X ) $(LREQ )
347
+
339
348
# #####################################################################
340
349
# Single-target rules
341
350
# #####################################################################
342
351
343
352
all : boot/rustboot$(X ) \
353
+ boot/$(CFG_STDLIB) \
344
354
rt/$(CFG_RUNTIME) \
345
355
llvmext/$(CFG_LLVMEXT) \
346
- stage0/$(CFG_STDLIB) \
347
- stage1/$(CFG_STDLIB) \
348
356
stage0/rustc$(X) \
349
357
stage0/glue.o \
358
+ stage0/$(CFG_STDLIB) \
350
359
$(GENERATED)
351
360
352
361
rt/$(CFG_RUNTIME ) : $(RUNTIME_OBJS ) $(MKFILES ) $(RUNTIME_HDR )
@@ -375,27 +384,25 @@ boot/version.ml: $(MKFILES)
375
384
--pretty =format:'let version = "prerelease (%h %ci)";;' >$@ || exit 1
376
385
377
386
378
- stage0 /$(CFG_STDLIB ) : $(S ) src/$(STDLIB_CRATE ) $(STDLIB_INPUTS ) \
379
- boot/rustboot$(X) $(MKFILES)
387
+ boot /$(CFG_STDLIB ) : $(S ) src/$(STDLIB_CRATE ) $(STDLIB_INPUTS ) \
388
+ boot/rustboot$(X) $(MKFILES)
380
389
@$(call E, compile: $@)
381
390
$(BOOT) -shared -o $@ $<
382
391
383
- stage1 /$(CFG_STDLIB ) : $(S ) src/$(STDLIB_CRATE ) $(STDLIB_INPUTS ) \
392
+ stage0 /$(CFG_STDLIB ) : $(S ) src/$(STDLIB_CRATE ) $(STDLIB_INPUTS ) \
384
393
stage0/rustc$(X) $(MKFILES)
385
394
@$(call E, compile: $@)
386
395
$(STAGE0) -shared -o $@ $<
387
396
388
397
389
398
stage0/rustc$(X ) : $(S ) src/$(COMPILER_CRATE ) $(COMPILER_INPUTS ) \
390
- boot/rustboot$(X) rt/$(CFG_RUNTIME) \
391
- stage0/$(CFG_STDLIB)
399
+ $(BREQ)
392
400
@$(call E, compile: $@)
393
401
$(BOOT) -minimal -o $@ $<
394
402
$(Q)chmod 0755 $@
395
403
396
404
stage1/rustc$(X ) : $(S ) src/$(COMPILER_CRATE ) $(COMPILER_INPUTS ) \
397
- stage0/rustc$(X) rt/$(CFG_RUNTIME) \
398
- stage1/$(CFG_STDLIB)
405
+ $(SREQ0) stage0/$(CFG_STDLIB)
399
406
@$(call E, compile: $@)
400
407
$(STAGE0) -o $@ $<
401
408
$(Q)chmod 0755 $@
@@ -412,7 +419,7 @@ stage1/glue.bc: stage1/rustc$(X) stage1/$(CFG_STDLIB) \
412
419
$(STAGE1) -o $@ -glue
413
420
414
421
# #####################################################################
415
- # Pattern rules
422
+ # Library and boot rules
416
423
# #####################################################################
417
424
418
425
rt/% .o : rt/% .cpp $(MKFILES )
@@ -437,6 +444,35 @@ llvmext/%.o: llvmext/%.cpp $(MKFILES)
437
444
@$(call E, lex-gen: $@ )
438
445
$(Q ) ocamllex$(OPT ) -q -o $@ $<
439
446
447
+
448
+ # #####################################################################
449
+ # Testing rules
450
+ # #####################################################################
451
+
452
+ % .boot$(X ) : % .rs $(BREQ )
453
+ @$(call E, compile [boot]: $@ )
454
+ $(BOOT ) -o $@ $<
455
+
456
+ % .boot$(X ) : % .rc $(BREQ )
457
+ @$(call E, compile [boot]: $@ )
458
+ $(BOOT ) -o $@ $<
459
+
460
+ % .stage0$(X ) : % .o rt/$(CFG_RUNTIME ) stage0/glue.o
461
+ @$(call E, link [llvm]: $@ )
462
+ $(Q ) gcc $(CFG_GCC_CFLAGS ) stage0/glue.o -o $@ $< -Lstage0 -lrustrt
463
+ @# dsymutil sometimes fails or prints a warning, but the
464
+ @# program still runs. Since it simplifies debugging other
465
+ @# programs, I\'ll live with the noise.
466
+ -$(Q )$(DSYMUTIL ) $@
467
+
468
+ % .stage0.bc : % .rc $(SREQ0 )
469
+ @$(call E, compile [stage0]: $@ )
470
+ $(STAGE0 ) -o $@ $<
471
+
472
+ % .stage0.bc : % .rs $(SREQ0 )
473
+ @$(call E, compile [stage0]: $@ )
474
+ $(STAGE0 ) -o $@ $<
475
+
440
476
% .o : % .s
441
477
@$(call E, assemble [llvm]: $@ )
442
478
$(Q ) gcc $(CFG_GCC_CFLAGS ) -o $@ -c $<
@@ -445,11 +481,61 @@ llvmext/%.o: llvmext/%.cpp $(MKFILES)
445
481
@$(call E, dis [llvm]: $@ )
446
482
$(Q )$(CFG_LLVM_BINDIR ) /llvm-dis -o $@ $<
447
483
448
-
449
484
% .s : % .bc
450
485
@$(call E, compile [llvm]: $@ )
451
486
$(Q )$(CFG_LLVM_BINDIR ) /llc $(CFG_LLC_CFLAGS ) -o $@ $<
452
487
488
+ # Cancel the implicit .out rule in GNU make.
489
+ % .out : %
490
+
491
+ % .out : % .out.tmp
492
+ $(Q ) mv $< $@
493
+
494
+ test/run-pass/% .out.tmp : test/run-pass/% $(CFG_EXE_SUFFIX ) rt/$(CFG_RUNTIME )
495
+ $(Q ) rm -f $< .tmp
496
+ @$(call E, run: $@ )
497
+ $(Q )$(call CFG_RUN_TARG, $< ) > $@
498
+
499
+ test/bench/shootout/% .out.tmp : test/bench/shootout/% $(X ) \
500
+ rt/$(CFG_RUNTIME)
501
+ $(Q)rm -f $<.tmp
502
+ @$(call E, run: $@)
503
+ $(Q)$(call CFG_RUN_TARG, $<) > $@
504
+
505
+ test/bench/99-bottles/% .out.tmp : test/bench/99-bottles/% $(X ) \
506
+ rt/$(CFG_RUNTIME)
507
+ $(Q)rm -f $<.tmp
508
+ @$(call E, run: $@)
509
+ $(Q)$(call CFG_RUN_TARG, $<) > $@
510
+
511
+ test/run-fail/% .out.tmp : test/run-fail/% $(X ) \
512
+ rt/$(CFG_RUNTIME)
513
+ $(Q)rm -f $<.tmp
514
+ @$(call E, run: $@)
515
+ $(Q)grep -q error-pattern $(S)src/test/run-fail/$(basename $*).rs
516
+ $(Q)rm -f $@
517
+ $(Q)$(call CFG_RUN_TARG, $<) >$@ 2>&1 ; X=$$? ; \
518
+ if [ $$X -eq 0 ] ; then exit 1 ; else exit 0 ; fi
519
+ $(Q)grep --text --quiet \
520
+ "$$(grep error-pattern $(S)src/test/run-fail/$(basename $*).rs \
521
+ | cut -d : -f 2- | tr -d '\n\r')" $@
522
+
523
+ test/compile-fail/% .boot.out.tmp : test/compile-fail/% .rs $(BREQ )
524
+ @$(call E, compile [boot]: $@ )
525
+ $(Q ) grep -q error-pattern $<
526
+ $(Q ) rm -f $@
527
+ $(BOOT ) -o $(@:.out=$(X ) ) $< > $@ 2>&1 ; test $$? -ne 0
528
+ $(Q ) grep --text --quiet \
529
+ "$$(grep error-pattern $< | cut -d : -f 2- | tr -d '\n\r')" $@
530
+
531
+ test/compile-fail/% .stage0.out.tmp : test/compile-fail/% .rs $(SREQ0 )
532
+ @$(call E, compile [stage0]: $@ )
533
+ $(Q ) grep -q error-pattern $<
534
+ $(Q ) rm -f $@
535
+ $(STAGE0 ) -o $(@:.out=$(X ) ) $< > $@ 2>&1 ; test $$? -ne 0
536
+ $(Q ) grep --text --quiet \
537
+ "$$(grep error-pattern $< | cut -d : -f 2- | tr -d '\n\r')" $@
538
+
453
539
454
540
# #####################################################################
455
541
# Cleanup
0 commit comments