Makefile.in 33.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
######################################################################
# Residual auto-configuration
######################################################################

include config.mk
MKFILES := Makefile config.mk

ifneq ($(MAKE_RESTARTS),)
CFG_INFO := $(info cfg: make restarts: $(MAKE_RESTARTS))
endif

CFG_INFO := $(info cfg: building on $(CFG_OSTYPE) $(CFG_CPUTYPE))

14 15 16 17 18 19 20 21 22 23 24
CFG_GCC_CFLAGS :=
CFG_GCC_LINK_FLAGS :=
CFG_BOOT_FLAGS := $(BOOT_FLAGS)
CFG_RUSTC_FLAGS := -nowarn

# On Darwin, we need to run dsymutil so the debugging information ends
# up in the right place.  On other platforms, it automatically gets
# embedded into the executable, so use a no-op command.
CFG_DSYMUTIL := true

ifeq ($(CFG_OSTYPE), FreeBSD)
25
  CFG_LIB_NAME=lib$(1).so
26 27 28 29 30 31 32 33 34 35
  CFG_GCC_CFLAGS += -fPIC -march=i686 -I/usr/local/include
  CFG_GCC_LINK_FLAGS += -shared -fPIC -lpthread -lrt
  ifeq ($(CFG_CPUTYPE), x86_64)
    CFG_GCC_CFLAGS += -m32
    CFG_GCC_LINK_FLAGS += -m32
  endif
  CFG_UNIXY := 1
endif

ifeq ($(CFG_OSTYPE), Linux)
36
  CFG_LIB_NAME=lib$(1).so
37 38 39 40 41 42 43 44 45 46
  CFG_GCC_CFLAGS += -fPIC -march=i686
  CFG_GCC_LINK_FLAGS += -shared -fPIC -ldl -lpthread -lrt
  ifeq ($(CFG_CPUTYPE), x86_64)
    CFG_GCC_CFLAGS += -m32
    CFG_GCC_LINK_FLAGS += -m32
  endif
  CFG_UNIXY := 1
endif

ifeq ($(CFG_OSTYPE), Darwin)
47
  CFG_LIB_NAME=lib$(1).dylib
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
  CFG_UNIXY := 1
  CFG_GCC_LINK_FLAGS += -dynamiclib -lpthread
  # Darwin has a very blurry notion of "64 bit", and claims it's running
  # "on an i386" when the whole userspace is 64-bit and the compiler
  # emits 64-bit binaries by default. So we just force -m32 here. Smarter
  # approaches welcome!
  CFG_GCC_CFLAGS += -m32
  CFG_GCC_LINK_FLAGS += -m32
  CFG_DSYMUTIL := dsymutil
endif

ifneq ($(findstring MINGW,$(CFG_OSTYPE)),)
  CFG_WINDOWSY := 1
endif

63 64 65
CFG_LDPATH :=$(CFG_BUILD_DIR)/rt
CFG_LDPATH :=$(CFG_LDPATH):$(CFG_BUILD_DIR)/llvmext

66 67 68 69 70
ifdef CFG_WINDOWSY
  CFG_INFO := $(info cfg: windows-y environment)

  CFG_EXE_SUFFIX := .exe
  CFG_LIB_NAME=$(1).dll
71 72
  CFG_LDPATH :=$(CFG_LDPATH):$(CFG_LLVM_BINDIR)
  CFG_LDPATH :=$(CFG_LDPATH):$$PATH
73 74
  CFG_RUN_TEST=PATH="$(CFG_LDPATH)" $(1)
  CFG_RUN_TARG=PATH="$(CFG_LDPATH)" $(1)
75

76 77 78
  CFG_PATH_MUNGE := $(strip | perl -p                  \
                           -e 's@\\(.)@/\1@go;'        \
                           -e 's@^/([a-zA-Z])/@\1:/@o;')
79 80 81 82 83 84 85 86 87 88 89
  ifdef CFG_FLEXLINK
    CFG_BOOT_NATIVE := 1
  endif
  CFG_GCC_CFLAGS += -march=i686
  CFG_GCC_LINK_FLAGS += -shared -fPIC
endif

ifdef CFG_UNIXY
  CFG_INFO := $(info cfg: unix-y environment)

  CFG_EXE_SUFFIX :=
90
  CFG_LDPATH :=$(CFG_LDPATH):$(CFG_LLVM_LIBDIR)
91
  CFG_RUN_TARG=\
92 93
      LD_LIBRARY_PATH=$(dir $(1)):$(CFG_LDPATH) $(1)
  CFG_RUN_TEST=\
94
      LD_LIBRARY_PATH=$(dir $(1)):$(CFG_LDPATH) $(CFG_VALGRIND) $(1)
95 96 97 98 99 100

  CFG_BOOT_NATIVE := 1

  ifdef MINGW_CROSS
    CFG_EXE_SUFFIX := .exe
    CFG_LIB_NAME=$(1).dll
101 102
    CFG_LDPATH :=$(CFG_LDPATH):$(CFG_LLVM_BINDIR)
    CFG_LDPATH :=$(CFG_LDPATH):$$PATH
103
    CFG_RUN_TARG=PATH=$(CFG_LDPATH) $(1)
104
    CFG_RUN_TEST=PATH=$(CFG_LDPATH) $(1)
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

    CFG_INFO := $(info cfg: mingw-cross)
    CFG_GCC_CROSS := i586-mingw32msvc-
    CFG_BOOT_FLAGS += -t win32-x86-pe
    ifdef CFG_VALGRIND
      CFG_VALGRIND += wine
    endif
    CFG_GCC_CFLAGS := -march=i686
    CFG_GCC_LINK_FLAGS := -shared
    ifeq ($(CFG_CPUTYPE), x86_64)
      CFG_GCC_CFLAGS += -m32
      CFG_GCC_LINK_FLAGS += -m32
    endif
  endif
  ifdef CFG_VALGRIND
    CFG_VALGRIND += --leak-check=full \
                    --error-exitcode=1 \
                    --quiet --vex-iropt-level=0 \
123
                    --suppressions=$(CFG_SRC_DIR)src/etc/x86.supp
124 125 126 127 128 129 130
  endif
endif

CFG_RUNTIME :=$(call CFG_LIB_NAME,rustrt)
CFG_LLVMEXT :=$(call CFG_LIB_NAME,llvmext)
CFG_STDLIB :=$(call CFG_LIB_NAME,std)

G
Graydon Hoare 已提交
131 132
CFG_LLC_CFLAGS := -march=x86

133 134 135 136 137 138 139 140 141 142 143
ifdef CFG_GCC
  CFG_INFO := $(info cfg: using gcc)
  CFG_GCC_CFLAGS += -Wall -Werror -fno-rtti -fno-exceptions -g
  CFG_GCC_LINK_FLAGS += -g
  CFG_COMPILE_C = $(CFG_GCC_CROSS)g++ $(CFG_GCC_CFLAGS) -c -o $(1) $(2)
  CFG_LINK_C = $(CFG_GCC_CROSS)g++ $(CFG_GCC_LINK_FLAGS) -o $(1)
  CFG_DEPEND_C = $(CFG_GCC_CROSS)g++ $(CFG_GCC_CFLAGS) -MT "$(1)" -MM $(2)
else
  CFG_ERR := $(error please try on a system with gcc)
endif

144
ifdef CFG_OCAMLC_OPT
145
  $(info cfg: have ocaml native compiler)
146 147
  OPT=.opt
else
148
  $(info cfg: have only ocaml bytecode compiler)
149 150
endif

151 152 153
ifdef BOOT_PROFILE
  $(info cfg: forcing native bootstrap compiler (BOOT_PROFILE))
  CFG_BOOT_NATIVE := 1
154 155 156
  CFG_OCAMLOPT_PROFILE_FLAGS := -p
endif

157 158 159
ifdef BOOT_DEBUG
  $(info cfg: forcing bytecode bootstrap compiler (DEBUG))
  CFG_BOOT_NATIVE :=
160 161
endif

162
ifdef CFG_BOOT_NATIVE
163 164 165 166 167 168
  $(info cfg: building native bootstrap compiler)
else
  $(info cfg: building bytecode bootstrap compiler)
endif

ifdef NO_VALGRIND
169 170 171 172 173 174 175 176 177 178 179 180 181 182
  $(info cfg: disabling valgrind (NO_VALGRIND))
  CFG_VALGRIND :=
endif

######################################################################
# Target-and-rule "utility variables"
######################################################################

ifdef VERBOSE
  Q :=
  E =
else
  Q := @
  E = echo $(1)
183 184
endif

185
R := $(CFG_RUN_TARG)
186
T := $(CFG_RUN_TEST)
187 188 189 190 191 192 193
S := $(CFG_SRC_DIR)
X := $(CFG_EXE_SUFFIX)

# Look in doc and src dirs.
VPATH := $(S)doc $(S)src

# Compilers we build, we now know how to run.
194
BOOT := $(Q)OCAMLRUNPARAM="b1" boot/rustboot$(X) $(CFG_BOOT_FLAGS) -L boot
195 196
STAGE0 := $(Q)$(R) stage0/rustc$(X) $(CFG_RUSTC_FLAGS) -L stage0
STAGE1 := $(Q)$(R) stage1/rustc$(X) $(CFG_RUSTC_FLAGS) -L stage1
197 198 199 200 201 202 203 204 205 206 207

# "Source" files we generate in builddir along the way.
GENERATED := boot/fe/lexer.ml boot/version.ml

# Delete the built-in rules.
.SUFFIXES:
%:: %,v
%:: RCS/%,v
%:: RCS/%
%:: s.%
%:: SCCS/s.%
208 209 210 211 212 213 214 215 216 217

######################################################################
# Bootstrap compiler variables
######################################################################

# We must list them in link order.
# Nobody calculates the link-order DAG automatically, sadly.

BOOT_MLS :=                                              \
    $(addsuffix .ml,                                     \
218 219
        boot/version                                     \
        $(addprefix boot/util/, fmt common bits)         \
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
        $(addprefix boot/driver/, session)               \
        $(addprefix boot/fe/, ast token lexer parser     \
          extfmt pexp item cexp fuzz)                    \
        $(addprefix boot/be/, asm il abi)                \
        $(addprefix boot/me/, walk semant resolve alias  \
          simplify type dead layer effect typestate      \
         loop layout transutil trans dwarf)              \
        $(addprefix boot/be/, x86 ra pe elf macho)       \
        $(addprefix boot/driver/, lib glue main))        \

BOOT_CMOS := $(BOOT_MLS:.ml=.cmo)
BOOT_CMXS := $(BOOT_MLS:.ml=.cmx)
BOOT_OBJS := $(BOOT_MLS:.ml=.o)
BOOT_CMIS := $(BOOT_MLS:.ml=.cmi)

235
BS := $(S)src/boot/
236 237 238 239 240 241 242 243

BOOT_ML_DEP_INCS := -I $(BS)/fe   -I $(BS)/me      \
                    -I $(BS)/be   -I $(BS)/driver  \
                    -I $(BS)/util -I boot

BOOT_ML_INCS    :=  -I boot/fe   -I boot/me      \
                    -I boot/be   -I boot/driver  \
                    -I boot/util -I boot
244

245 246 247
BOOT_ML_LIBS        := unix.cma  nums.cma  bigarray.cma
BOOT_ML_NATIVE_LIBS := unix.cmxa nums.cmxa bigarray.cmxa
BOOT_OCAMLC_FLAGS   := -g $(BOOT_ML_INCS) -w Ael -warn-error Ael
248 249 250 251 252
BOOT_OCAMLOPT_FLAGS := -g $(BOOT_ML_INCS) -w Ael -warn-error Ael

######################################################################
# Runtime (C++) library variables
######################################################################
253

254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313
RUNTIME_CS := rt/sync/timer.cpp \
              rt/sync/sync.cpp \
              rt/sync/lock_and_signal.cpp \
              rt/rust.cpp \
              rt/rust_builtin.cpp \
              rt/rust_run_program.cpp \
              rt/rust_crate.cpp \
              rt/rust_crate_cache.cpp \
              rt/rust_crate_reader.cpp \
              rt/rust_comm.cpp \
              rt/rust_dom.cpp \
              rt/rust_task.cpp \
              rt/rust_task_list.cpp \
              rt/rust_proxy.cpp \
              rt/rust_chan.cpp \
              rt/rust_port.cpp \
              rt/rust_upcall.cpp \
              rt/rust_log.cpp \
              rt/rust_message.cpp \
              rt/rust_timer.cpp \
              rt/circular_buffer.cpp \
              rt/isaac/randport.cpp \
              rt/rust_srv.cpp \
              rt/rust_kernel.cpp \
              rt/memory_region.cpp \
              rt/test/rust_test_harness.cpp \
              rt/test/rust_test_runtime.cpp \
              rt/test/rust_test_util.cpp

RUNTIME_HDR := rt/globals.h \
               rt/rust.h \
               rt/rust_dwarf.h \
               rt/rust_internal.h \
               rt/rust_util.h \
               rt/rust_chan.h \
               rt/rust_port.h \
               rt/rust_dom.h \
               rt/rust_task.h \
               rt/rust_task_list.h \
               rt/rust_proxy.h \
               rt/rust_log.h \
               rt/rust_message.h \
               rt/circular_buffer.h \
               rt/util/array_list.h \
               rt/util/indexed_list.h \
               rt/util/synchronized_indexed_list.h \
               rt/util/hash_map.h \
               rt/sync/sync.h \
               rt/sync/timer.h \
               rt/sync/lock_free_queue.h \
               rt/rust_srv.h \
               rt/rust_kernel.h \
               rt/memory_region.h \
               rt/memory.h \
               rt/test/rust_test_harness.h \
               rt/test/rust_test_runtime.h \
               rt/test/rust_test_util.h

RUNTIME_INCS := -I $(S)src/rt/isaac -I $(S)src/rt/uthash
RUNTIME_OBJS := $(RUNTIME_CS:.cpp=.o)
314 315

######################################################################
316
# rustc LLVM-extensions (C++) library variables
317 318
######################################################################

319 320
LLVMEXT_CS := $(addprefix llvmext/, \
                MachOObjectFile.cpp Object.cpp RustWrapper.cpp)
321

322
LLVMEXT_HDR := llvmext/include/llvm-c/Object.h
323

324
LLVMEXT_INCS := -iquote $(CFG_LLVM_INCDIR) \
325
                -iquote $(S)src/llvmext/include
326 327
LLVMEXT_OBJS := $(LLVMEXT_CS:.cpp=.o)
LLVMEXT_LIBS := $(CFG_LLVM_LDFLAGS) $(CFG_LLVM_LIBS)
328

329 330 331 332
######################################################################
# Standard library variables
######################################################################

G
Graydon Hoare 已提交
333
STDLIB_CRATE := $(S)src/lib/std.rc
334
STDLIB_INPUTS := $(wildcard $(addprefix $(S)src/lib/,*.rc *.rs */*.rs))
335 336

######################################################################
337
# rustc crate variables
338 339
######################################################################

G
Graydon Hoare 已提交
340
COMPILER_CRATE := $(S)src/comp/rustc.rc
341
COMPILER_INPUTS := $(wildcard $(addprefix $(S)src/comp/, \
342 343
                                rustc.rc *.rs */*.rs))

344 345 346 347 348 349 350 351 352
######################################################################
# test dependency variables
######################################################################

LREQ := rt/$(CFG_RUNTIME) llvmext/$(CFG_LLVMEXT)
BREQ := boot/rustboot$(X) boot/$(CFG_STDLIB)
SREQ0 := stage0/rustc$(X) $(LREQ)
SREQ1 := stage1/rustc$(X) $(LREQ)

353 354 355
######################################################################
# Single-target rules
######################################################################
356

357
all: boot/rustboot$(X)          \
358
     boot/$(CFG_STDLIB)         \
359 360 361
     rt/$(CFG_RUNTIME)          \
     llvmext/$(CFG_LLVMEXT)     \
     stage0/rustc$(X)           \
G
Graydon Hoare 已提交
362
     stage0/glue.o              \
363
     stage0/$(CFG_STDLIB)       \
364
     $(GENERATED)
365 366 367 368 369 370 371 372 373 374 375

rt/$(CFG_RUNTIME): $(RUNTIME_OBJS) $(MKFILES) $(RUNTIME_HDR)
	@$(call E, link: $@)
	$(Q)$(call CFG_LINK_C, $@) $(RUNTIME_OBJS)

llvmext/$(CFG_LLVMEXT): $(LLVMEXT_OBJS) $(MKFILES) $(LLVMEXT_HDR)
	@$(call E, link: $@)
	$(Q)$(call CFG_LINK_C, $@ $(LLVMEXT_OBJS) \
        $(CFG_LLVM_LIBS) $(CFG_LLVM_LDFLAGS))

ifdef CFG_BOOT_NATIVE
376
boot/rustboot$(X): $(BOOT_CMXS) $(MKFILES)
377 378
	@$(call E, link: $@)
	$(Q)ocamlopt$(OPT) -o $@ $(BOOT_OCAMLOPT_FLAGS) $(BOOT_ML_NATIVE_LIBS) \
379 380
        $(BOOT_CMXS)
else
381
boot/rustboot$(X): $(BOOT_CMOS) $(MKFILES)
382
	@$(call E, link: $@)
383
	$(Q)ocamlc$(OPT) -o $@ $(BOOT_OCAMLC_FLAGS) $(BOOT_ML_LIBS) $(BOOT_CMOS)
384 385
endif

386 387
boot/version.ml: $(MKFILES)
	@$(call E, git: $@)
388 389 390
	$(Q)git log -1 \
      --pretty=format:'let version = "prerelease (%h %ci)";;' >$@ || exit 1

G
Graydon Hoare 已提交
391

392

G
Graydon Hoare 已提交
393
boot/$(CFG_STDLIB): $(STDLIB_CRATE) $(STDLIB_INPUTS) \
394
                    boot/rustboot$(X) $(MKFILES)
395 396 397
	@$(call E, compile: $@)
	$(BOOT) -shared -o $@ $<

G
Graydon Hoare 已提交
398
stage0/$(CFG_STDLIB): $(STDLIB_CRATE) $(STDLIB_INPUTS) \
G
Graydon Hoare 已提交
399 400 401 402
                      stage0/rustc$(X) $(MKFILES)
	@$(call E, compile: $@)
	$(STAGE0) -shared -o $@ $<

G
Graydon Hoare 已提交
403
stage1/$(CFG_STDLIB): $(STDLIB_CRATE) $(STDLIB_INPUTS) \
404 405 406 407
                      stage1/rustc$(X) $(MKFILES)
	@$(call E, compile: $@)
	$(STAGE1) -shared -o $@ $<

G
Graydon Hoare 已提交
408
stage2/$(CFG_STDLIB): $(STDLIB_CRATE) $(STDLIB_INPUTS) \
409 410 411 412 413
                      stage2/rustc$(X) $(MKFILES)
	@$(call E, compile: $@)
	$(STAGE2) -shared -o $@ $<


G
Graydon Hoare 已提交
414

G
Graydon Hoare 已提交
415
stage0/rustc$(X): $(COMPILER_CRATE) $(COMPILER_INPUTS) \
416
                  $(BREQ)
417 418 419 420
	@$(call E, compile: $@)
	$(BOOT) -minimal -o $@ $<
	$(Q)chmod 0755 $@

G
Graydon Hoare 已提交
421
stage1/rustc$(X): $(COMPILER_CRATE) $(COMPILER_INPUTS) \
422
                  $(SREQ0) stage0/$(CFG_STDLIB)
G
Graydon Hoare 已提交
423 424 425 426
	@$(call E, compile: $@)
	$(STAGE0) -o $@ $<
	$(Q)chmod 0755 $@

G
Graydon Hoare 已提交
427
stage2/rustc$(X): $(COMPILER_CRATE) $(COMPILER_INPUTS) \
428 429 430 431 432 433
                  $(SREQ1) stage1/$(CFG_STDLIB)
	@$(call E, compile: $@)
	$(STAGE1) -o $@ $<
	$(Q)chmod 0755 $@


G
Graydon Hoare 已提交
434

G
Graydon Hoare 已提交
435 436
stage0/glue.bc: stage0/rustc$(X) stage0/$(CFG_STDLIB) \
                llvmext/$(CFG_LLVMEXT) rt/$(CFG_RUNTIME)
437 438
	@$(call E, generate: $@)
	$(STAGE0) -o $@ -glue
439

G
Graydon Hoare 已提交
440 441 442 443 444
stage1/glue.bc: stage1/rustc$(X) stage1/$(CFG_STDLIB) \
                llvmext/$(CFG_LLVMEXT) rt/$(CFG_RUNTIME)
	@$(call E, generate: $@)
	$(STAGE1) -o $@ -glue

445 446 447 448 449
stage2/glue.bc: stage2/rustc$(X) stage2/$(CFG_STDLIB) \
                llvmext/$(CFG_LLVMEXT) rt/$(CFG_RUNTIME)
	@$(call E, generate: $@)
	$(STAGE2) -o $@ -glue

450
######################################################################
451
# Library and boot rules
452 453 454 455 456 457 458 459
######################################################################

rt/%.o: rt/%.cpp $(MKFILES)
	@$(call E, compile: $@)
	$(Q)$(call CFG_COMPILE_C, $@, $(RUNTIME_INCS)) $<

llvmext/%.o: llvmext/%.cpp $(MKFILES)
	@$(call E, compile: $@)
460
	$(Q)$(call CFG_COMPILE_C, $@, $(CFG_LLVM_CXXFLAGS) $(LLVMEXT_INCS)) $<
461

462 463
%.cmo: %.ml $(MKFILES)
	@$(call E, compile: $@)
464
	$(Q)ocamlc$(OPT) -c -o $@ $(BOOT_OCAMLC_FLAGS) $<
465 466

%.cmo: %.cmi $(MKFILES)
467

468 469 470 471 472 473 474
%.cmx %.o: %.ml $(MKFILES)
	@$(call E, compile: $@)
	$(Q)ocamlopt$(OPT) -c -o $@ $(BOOT_OCAMLOPT_FLAGS) $<

%.ml: %.mll $(MKFILES)
	@$(call E, lex-gen: $@)
	$(Q)ocamllex$(OPT) -q -o $@ $<
475

476

G
Graydon Hoare 已提交
477 478 479 480 481 482 483 484 485 486 487 488 489 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 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690
######################################################################
# Testing variables
######################################################################

# Temporarily xfail tests broken by the nominal-tags change.

NOMINAL_TAG_XFAILS := $(S)src/test/run-pass/mlist.rs

# Temporarily xfail tests broken by the constant-tags change.

CONST_TAG_XFAILS := $(S)src/test/run-pass/generic-tag.rs

# Temporarily xfail some of the task tests, while debugging the
# overhauled inter-domain messaging system.

TASK_XFAILS := $(addprefix $(S)src/test/run-pass/, \
                 task-comm-8.rs \
                 task-comm-10.rs \
                 task-comm-15.rs \
                 task-comm-12.rs \
                 task-comm-2.rs \
                 task-comm-9.rs \
                 task-life-0.rs \
                 alt-type-simple.rs \
                 many.rs)

TEST_XFAILS_BOOT := $(TASK_XFAILS) \
                    $(NOMINAL_TAG_XFAILS) \
                    $(CONST_TAG_XFAILS) \
                    $(addprefix $(S)src/test/run-pass/, \
                      arith-unsigned.rs \
                      box-compare.rs \
                      child-outlives-parent.rs \
                      clone-with-exterior.rs \
                      constrained-type.rs \
                      destructor-ordering.rs \
                      obj-as.rs \
                      vec-slice.rs \
                      fn-lval.rs \
                      generic-bind-2.rs \
                      generic-fn-box.rs \
                      generic-tup.rs \
                      iter-ret.rs \
                      leak-tag-copy.rs \
                      lib-io.rs \
                      maybe-mutable.rs \
                      mlist-cycle.rs \
                      obj-as.rs \
                      seq-compare.rs \
                      task-comm.rs \
                      task-comm-3.rs \
                      vec-slice.rs \
                      while-and-do-while.rs) \
                    $(addprefix $(S)src/test/run-fail/, \
                      task-comm-14.rs) \
                    $(addprefix $(S)src/test/compile-fail/, \
                      bad-expr-path.rs \
                      import.rs \
                      import2.rs \
                      import3.rs \
                      import4.rs \
                      bad-recv.rs \
                      bad-send.rs \
                      infinite-vec-type-recursion.rs \
                      tail-non-call.rs \
                      writing-through-read-alias.rs)

TEST_XFAILS_STAGE0 := $(addprefix $(S)src/test/run-pass/, \
                        acyclic-unwind.rs \
                        alt-pattern-drop.rs \
                        alt-type-simple.rs \
                        basic-1.rs \
                        basic-2.rs \
                        basic.rs \
                        child-outlives-parent.rs \
                        clone-with-exterior.rs \
                        comm.rs \
                        constrained-type.rs \
                        destructor-ordering.rs \
                        iter-ret.rs \
                        lazychan.rs \
                        lib-bitv.rs \
                        lib-deque.rs \
                        lib-int.rs \
                        lib-io.rs \
                        lib-map.rs \
                        lib-rand.rs \
                        lib-sha1.rs \
                        lib-sort.rs \
                        lib-str.rs \
                        lib-str-buf.rs \
                        lib-task.rs \
                        lib-uint.rs \
                        lib-vec-str-conversions.rs \
                        lib-vec.rs \
                        many.rs \
                        mlist-cycle.rs \
                        mlist.rs \
                        mutable-alias-vec.rs \
                        obj-as.rs \
                        obj-dtor.rs \
                        pred.rs \
                        preempt.rs \
                        rt-circular-buffer.rs \
                        size-and-align.rs \
                        spawn-fn.rs \
                        spawn-module-qualified.rs \
                        spawn.rs \
                        str-append.rs \
                        syntax-extension-fmt.rs \
                        syntax-extension-shell.rs \
                        task-comm-0.rs \
                        task-comm-1.rs \
                        task-comm-10.rs \
                        task-comm-11.rs \
                        task-comm-12.rs \
                        task-comm-13-thread.rs \
                        task-comm-13.rs \
                        task-comm-15.rs \
                        task-comm-2.rs \
                        task-comm-3.rs \
                        task-comm-4.rs \
                        task-comm-5.rs \
                        task-comm-6.rs \
                        task-comm-7.rs \
                        task-comm-8.rs \
                        task-comm-9.rs \
                        task-comm.rs \
                        task-killjoin.rs \
                        task-life-0.rs \
                        threads.rs \
                        type-sizes.rs \
                        typestate-cfg-nesting.rs \
                        user.rs \
                        utf8.rs \
                        vec-alloc-append.rs \
                        vec-append.rs \
                        vec-slice.rs \
                        while-with-break.rs \
                        yield.rs \
                        yield2.rs \
                        multi.rc \
                        native-mod.rc \
                        native.rc \
                        ) \
                     $(filter-out \
                      $(addprefix $(S)src/test/compile-fail/, \
                        alt-tag-nullary.rs \
                        alt-tag-unary.rs \
                        arg-count-mismatch.rs \
                        arg-type-mismatch.rs \
                        bad-expr-path.rs \
                        bad-expr-path2.rs \
                        bogus-tag.rs \
                        fru-extra-field.rs \
                        import.rs \
                        import2.rs \
                        import3.rs \
                        import4.rs \
                        import-loop.rs \
                        import-loop-2.rs \
                        multiline-comment-line-tracking.rs \
                        output-type-mismatch.rs \
                        rec-missing-fields.rs \
                        reserved-dec.rs \
                        reserved-f128.rs \
                        reserved-f16.rs \
                        reserved-f80.rs \
                        reserved-m128.rs \
                        reserved-m32.rs \
                        reserved-m64.rs \
                        tail-non-call.rs \
                        tail-typeck.rs \
                        type-shadow.rs \
                        while-type-error.rs \
                        wrong-ret-type.rs \
                        ), \
                     $(wildcard $(S)src/test/*fail/*.rs test/*fail/*.rc)) \
                     $(S)src/test/bench/shootout/fannkuchredux.rs \
                     $(S)src/test/bench/shootout/fasta.rs \
                     $(S)src/test/bench/shootout/binarytrees.rs \
                     $(wildcard $(S)src/test/bench/99-bottles/*rs)

ifdef MINGW_CROSS
TEST_XFAILS_BOOT += $(S)src/test/run-pass/native-mod.rc
TEST_XFAILS_STAGE0 += $(S)src/test/run-pass/native-mod.rc
endif
ifdef CFG_WINDOWSY
TEST_XFAILS_BOOT += $(S)src/test/run-pass/native-mod.rc
TEST_XFAILS_STAGE0 += $(S)src/test/run-pass/native-mod.rc
endif

BENCH_RS := $(wildcard $(S)src/test/bench/shootout/*.rs) \
            $(wildcard $(S)src/test/bench/99-bottles/*.rs)
RPASS_RC := $(wildcard $(S)src/test/run-pass/*.rc)
RPASS_RS := $(wildcard $(S)src/test/run-pass/*.rs) $(BENCH_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)

ifdef CHECK_XFAILS
TEST_RPASS_CRATES_BOOT := $(filter $(TEST_XFAILS_BOOT), $(RPASS_RC))
TEST_RPASS_CRATES_STAGE0 := $(filter $(TEST_XFAILS_STAGE0), $(RPASS_RC))
TEST_RPASS_SOURCES_BOOT := $(filter $(TEST_XFAILS_BOOT), $(RPASS_RS))
TEST_RPASS_SOURCES_STAGE0 := $(filter $(TEST_XFAILS_STAGE0), $(RPASS_RS))
else
TEST_RPASS_CRATES_BOOT := $(filter-out $(TEST_XFAILS_BOOT), $(RPASS_RC))
TEST_RPASS_CRATES_STAGE0 := $(filter-out $(TEST_XFAILS_STAGE0), $(RPASS_RC))
TEST_RPASS_SOURCES_BOOT := $(filter-out $(TEST_XFAILS_BOOT), $(RPASS_RS))
TEST_RPASS_SOURCES_STAGE0 := $(filter-out $(TEST_XFAILS_STAGE0), $(RPASS_RS))
endif

TEST_RPASS_EXES_BOOT := \
691 692
  $(subst $(S)src/,,$(TEST_RPASS_CRATES_BOOT:.rc=.boot$(X))) \
  $(subst $(S)src/,,$(TEST_RPASS_SOURCES_BOOT:.rs=.boot$(X)))
G
Graydon Hoare 已提交
693
TEST_RPASS_EXES_STAGE0 := \
694 695
  $(subst $(S)src/,,$(TEST_RPASS_CRATES_STAGE0:.rc=.stage0$(X))) \
  $(subst $(S)src/,,$(TEST_RPASS_SOURCES_STAGE0:.rs=.stage0$(X)))
G
Graydon Hoare 已提交
696 697

TEST_RPASS_OUTS_BOOT  := \
698
  $(TEST_RPASS_EXES_BOOT:.boot$(X)=.boot.out)
G
Graydon Hoare 已提交
699
TEST_RPASS_OUTS_STAGE0 := \
700
  $(TEST_RPASS_EXES_STAGE0:.stage0$(X)=.stage0.out)
G
Graydon Hoare 已提交
701 702 703 704

TEST_RPASS_TMPS_BOOT  := \
  $(TEST_RPASS_EXES_BOOT:.boot$(X)=.boot$(X).tmp)
TEST_RPASS_TMPS_STAGE0 := \
705
  $(TEST_RPASS_EXES_STAGE0:.stage0$(X)=.stage0$(X).tmp)
G
Graydon Hoare 已提交
706 707 708 709 710 711 712 713


TEST_RFAIL_CRATES_BOOT := $(filter-out $(TEST_XFAILS_BOOT), $(RFAIL_RC))
TEST_RFAIL_CRATES_STAGE0 := $(filter-out $(TEST_XFAILS_STAGE0), $(RFAIL_RC))
TEST_RFAIL_SOURCES_BOOT := $(filter-out $(TEST_XFAILS_BOOT), $(RFAIL_RS))
TEST_RFAIL_SOURCES_STAGE0 := $(filter-out $(TEST_XFAILS_STAGE0), $(RFAIL_RS))

TEST_RFAIL_EXES_BOOT := \
714 715
  $(subst $(S)src/,,$(TEST_RFAIL_CRATES_BOOT:.rc=.boot$(X))) \
  $(subst $(S)src/,,$(TEST_RFAIL_SOURCES_BOOT:.rs=.boot$(X)))
G
Graydon Hoare 已提交
716
TEST_RFAIL_EXES_STAGE0 := \
717 718
  $(subst $(S)src/,,$(TEST_RFAIL_CRATES_STAGE0:.rc=.stage0$(X))) \
  $(subst $(S)src/,,$(TEST_RFAIL_SOURCES_STAGE0:.rs=.stage0$(X)))
G
Graydon Hoare 已提交
719 720

TEST_RFAIL_OUTS_BOOT  := \
721
  $(TEST_RFAIL_EXES_BOOT:.boot$(X)=.boot.out)
G
Graydon Hoare 已提交
722
TEST_RFAIL_OUTS_STAGE0 := \
723
  $(TEST_RFAIL_EXES_STAGE0:.stage0$(X)=.stage0.out)
G
Graydon Hoare 已提交
724 725 726 727

TEST_RFAIL_TMPS_BOOT  := \
  $(TEST_RFAIL_EXES_BOOT:.boot$(X)=.boot$(X).tmp)
TEST_RFAIL_TMPS_STAGE0 := \
728
  $(TEST_RFAIL_EXES_STAGE0:.stage0$(X)=.stage0(X).tmp)
G
Graydon Hoare 已提交
729 730 731 732 733 734 735 736


TEST_CFAIL_CRATES_BOOT := $(filter-out $(TEST_XFAILS_BOOT), $(CFAIL_RC))
TEST_CFAIL_CRATES_STAGE0 := $(filter-out $(TEST_XFAILS_STAGE0), $(CFAIL_RC))
TEST_CFAIL_SOURCES_BOOT := $(filter-out $(TEST_XFAILS_BOOT), $(CFAIL_RS))
TEST_CFAIL_SOURCES_STAGE0 := $(filter-out $(TEST_XFAILS_STAGE0), $(CFAIL_RS))

TEST_CFAIL_EXES_BOOT := \
737 738
  $(subst $(S)src/,,$(TEST_CFAIL_CRATES_BOOT:.rc=.boot$(X))) \
  $(subst $(S)src/,,$(TEST_CFAIL_SOURCES_BOOT:.rs=.boot$(X)))
G
Graydon Hoare 已提交
739
TEST_CFAIL_EXES_STAGE0 := \
740 741
  $(subst $(S)src/,,$(TEST_CFAIL_CRATES_STAGE0:.rc=.stage0(X))) \
  $(subst $(S)src/,,$(TEST_CFAIL_SOURCES_STAGE0:.rs=.stage0$(X)))
G
Graydon Hoare 已提交
742 743

TEST_CFAIL_OUTS_BOOT := \
744
  $(TEST_CFAIL_EXES_BOOT:.boot$(X)=.boot.out)
G
Graydon Hoare 已提交
745
TEST_CFAIL_OUTS_STAGE0 := \
746
  $(TEST_CFAIL_EXES_STAGE0:.stage0$(X)=.stage0.out)
G
Graydon Hoare 已提交
747 748 749 750

TEST_CFAIL_TMPS_BOOT := \
  $(TEST_CFAIL_EXES_BOOT:.boot$(X)=.boot$(X).tmp)
TEST_CFAIL_TMPS_STAGE0 := \
751
  $(TEST_CFAIL_EXES_STAGE0:.stage0$(X)=.stage0$(X).tmp)
G
Graydon Hoare 已提交
752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793


ALL_TEST_CRATES := $(TEST_CFAIL_CRATES_BOOT) \
                   $(TEST_RFAIL_CRATES_BOOT) \
                   $(TEST_RPASS_CRATES_BOOT) \
                   $(TEST_CFAIL_CRATES_STAGE0) \
                   $(TEST_RFAIL_CRATES_STAGE0) \
                   $(TEST_RPASS_CRATES_STAGE0)

ALL_TEST_SOURCES := $(TEST_CFAIL_SOURCES_BOOT) \
                    $(TEST_RFAIL_SOURCES_BOOT) \
                    $(TEST_RPASS_SOURCES_BOOT) \
                    $(TEST_CFAIL_SOURCES_STAGE0) \
                    $(TEST_RFAIL_SOURCES_STAGE0) \
                    $(TEST_RPASS_SOURCES_STAGE0)

ALL_TEST_INPUTS := $(wildcard $(S)src/test/*/*.rs   \
                              $(S)src/test/*/*/*.rs \
                              $(S)src/test/*/*.rc)

# The test suite currently relies on logging to validate results so
# make sure that logging uses the default configuration
unexport RUST_LOG


check_nocompile: $(TEST_CFAIL_OUTS_BOOT) \
                 $(TEST_CFAIL_OUTS_STAGE0)

check: tidy \
       $(TEST_RPASS_EXES_BOOT) $(TEST_RFAIL_EXES_BOOT) \
       $(TEST_RPASS_OUTS_BOOT) $(TEST_RFAIL_OUTS_BOOT) \
       $(TEST_CFAIL_OUTS_BOOT) \
       $(TEST_RPASS_EXES_STAGE0) $(TEST_RFAIL_EXES_STAGE0) \
       $(TEST_RPASS_OUTS_STAGE0) $(TEST_RFAIL_OUTS_STAGE0) \
       $(TEST_CFAIL_OUTS_STAGE0)


compile-check: tidy \
       $(TEST_RPASS_EXES_BOOT) $(TEST_RFAIL_EXES_BOOT) \
       $(TEST_RPASS_EXES_STAGE0) $(TEST_RFAIL_EXES_STAGE0)


794 795 796 797
######################################################################
# Testing rules
######################################################################

798
%.stage0$(X): %.stage0.o rt/$(CFG_RUNTIME) stage0/glue.o
799 800
	@$(call E, link [gcc]: $@)
	$(Q)gcc $(CFG_GCC_CFLAGS) stage0/glue.o -o $@ $< -Lstage0 -Lrt -lrustrt
801 802 803
	@# dsymutil sometimes fails or prints a warning, but the
	@# program still runs.  Since it simplifies debugging other
	@# programs, I\'ll live with the noise.
G
Graydon Hoare 已提交
804
	-$(Q)$(CFG_DSYMUTIL) $@
805

806
%.stage1(X): %.stage1.o rt/$(CFG_RUNTIME) stage1/glue.o
807 808
	@$(call E, link [gcc]: $@)
	$(Q)gcc $(CFG_GCC_CFLAGS) stage1/glue.o -o $@ $< -Lstage1 -Lrt -lrustrt
809 810 811
	@# dsymutil sometimes fails or prints a warning, but the
	@# program still runs.  Since it simplifies debugging other
	@# programs, I\'ll live with the noise.
G
Graydon Hoare 已提交
812
	-$(Q)$(CFG_DSYMUTIL) $@
813 814

%.stage2(X): %.stage2.o rt/$(CFG_RUNTIME) stage2/glue.o
815 816
	@$(call E, link [gcc]: $@)
	$(Q)gcc $(CFG_GCC_CFLAGS) stage2/glue.o -o $@ $< -Lstage2 -Lrt -lrustrt
817 818 819
	@# dsymutil sometimes fails or prints a warning, but the
	@# program still runs.  Since it simplifies debugging other
	@# programs, I\'ll live with the noise.
G
Graydon Hoare 已提交
820
	-$(Q)$(CFG_DSYMUTIL) $@
821 822 823 824 825 826 827 828 829 830 831



%.boot$(X): %.rs $(BREQ)
	@$(call E, compile [boot]: $@)
	$(BOOT) -o $@ $<

%.boot$(X): %.rc $(BREQ)
	@$(call E, compile [boot]: $@)
	$(BOOT) -o $@ $<

832 833 834 835 836 837 838 839
%.stage0.bc: %.rc $(SREQ0)
	@$(call E, compile [stage0]: $@)
	$(STAGE0) -o $@ $<

%.stage0.bc: %.rs $(SREQ0)
	@$(call E, compile [stage0]: $@)
	$(STAGE0) -o $@ $<

840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857
%.stage1.bc: %.rc $(SREQ1)
	@$(call E, compile [stage1]: $@)
	$(STAGE1) -o $@ $<

%.stage1.bc: %.rs $(SREQ1)
	@$(call E, compile [stage1]: $@)
	$(STAGE1) -o $@ $<

%.stage2.bc: %.rc $(SREQ2)
	@$(call E, compile [stage2]: $@)
	$(STAGE2) -o $@ $<

%.stage2.bc: %.rs $(SREQ2)
	@$(call E, compile [stage2]: $@)
	$(STAGE2) -o $@ $<



G
Graydon Hoare 已提交
858 859 860 861 862 863 864 865 866 867 868 869
%.o: %.s
	@$(call E, assemble [llvm]: $@)
	$(Q)gcc $(CFG_GCC_CFLAGS) -o $@ -c $<

%.ll: %.bc
	@$(call E, dis [llvm]: $@)
	$(Q)$(CFG_LLVM_BINDIR)/llvm-dis -o $@ $<

%.s: %.bc
	@$(call E, compile [llvm]: $@)
	$(Q)$(CFG_LLVM_BINDIR)/llc $(CFG_LLC_CFLAGS) -o $@ $<

870 871 872 873 874 875
# Cancel the implicit .out rule in GNU make.
%.out: %

%.out: %.out.tmp
	$(Q)mv $< $@

G
Graydon Hoare 已提交
876
test/run-pass/%.out.tmp: test/run-pass/%$(X) rt/$(CFG_RUNTIME)
877 878
	$(Q)rm -f $<.tmp
	@$(call E, run: $@)
879
	$(Q)$(call T, $<) > $@
880 881 882 883 884

test/bench/shootout/%.out.tmp: test/bench/shootout/%$(X) \
                               rt/$(CFG_RUNTIME)
	$(Q)rm -f $<.tmp
	@$(call E, run: $@)
885
	$(Q)$(call T, $<) > $@
886 887 888 889 890

test/bench/99-bottles/%.out.tmp: test/bench/99-bottles/%$(X) \
                                 rt/$(CFG_RUNTIME)
	$(Q)rm -f $<.tmp
	@$(call E, run: $@)
891
	$(Q)$(call T, $<) > $@
892 893 894 895 896 897 898

test/run-fail/%.out.tmp: test/run-fail/%$(X) \
                         rt/$(CFG_RUNTIME)
	$(Q)rm -f $<.tmp
	@$(call E, run: $@)
	$(Q)grep -q error-pattern $(S)src/test/run-fail/$(basename $*).rs
	$(Q)rm -f $@
899
	$(Q)$(call T, $<) >$@ 2>&1 ; X=$$? ; \
900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920
      if [ $$X -eq 0 ] ; then exit 1 ; else exit 0 ; fi
	$(Q)grep --text --quiet \
      "$$(grep error-pattern $(S)src/test/run-fail/$(basename $*).rs \
        | cut -d : -f 2- | tr -d '\n\r')" $@

test/compile-fail/%.boot.out.tmp: test/compile-fail/%.rs $(BREQ)
	@$(call E, compile [boot]: $@)
	$(Q)grep -q error-pattern $<
	$(Q)rm -f $@
	$(BOOT) -o $(@:.out=$(X)) $< >$@ 2>&1; test $$? -ne 0
	$(Q)grep --text --quiet \
      "$$(grep error-pattern $< | cut -d : -f 2- | tr -d '\n\r')" $@

test/compile-fail/%.stage0.out.tmp: test/compile-fail/%.rs $(SREQ0)
	@$(call E, compile [stage0]: $@)
	$(Q)grep -q error-pattern $<
	$(Q)rm -f $@
	$(STAGE0) -o $(@:.out=$(X)) $< >$@ 2>&1; test $$? -ne 0
	$(Q)grep --text --quiet \
      "$$(grep error-pattern $< | cut -d : -f 2- | tr -d '\n\r')" $@

921 922 923 924 925 926 927 928 929
######################################################################
# Distribution
######################################################################

PKG_NAME := rust
PKG_VER  = $(shell date +"%Y-%m-%d")-snap
PKG_DIR = $(PKG_NAME)-$(PKG_VER)
PKG_TAR = $(PKG_DIR).tar.gz

930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975
PKG_3RDPARTY := rt/valgrind.h rt/memcheck.h \
                rt/isaac/rand.h rt/isaac/standard.h \
                rt/uthash/uthash.h rt/uthash/utlist.h \
                rt/bigint/bigint.h rt/bigint/bigint_int.cpp \
                rt/bigint/bigint_ext.cpp rt/bigint/low_primes.h

PKG_FILES :=\
    $(wildcard $(S)src/etc/*.*)                \
    $(S)LICENSE.txt $(S)README                 \
    $(S)configure $(S)Makefile.in              \
    $(addprefix $(S)src/,                      \
      README boot/README comp/README           \
      $(filter-out $(GENERATED), $(BOOT_MLS))  \
      $(RUNTIME_CS) $(RUNTIME_HDR)             \
      $(LLVMEXT_CS) $(LLVMEXT_HDR)             \
      $(PKG_3RDPARTY))                         \
    $(COMPILER_INPUTS)                         \
    $(STDLIB_INPUTS)                           \
    $(ALL_TEST_INPUTS)                         \
    $(GENERATED)

dist: $(PKG_TAR)

$(PKG_TAR):
	@$(call E, making dist dir)
	$(Q)rm -Rf dist
	$(Q)mkdir -p dist/$(PKG_DIR)
	$(Q)tar -c $(PKG_FILES) | tar -x -C dist/$(PKG_DIR)
	$(Q)tar -czf $(PKG_TAR) -C dist $(PKG_DIR)
	$(Q)rm -Rf dist

distcheck: $(PKG_TAR)
	$(Q)tar -c $(PKG_FILES) | tar -x -C dist/$(PKG_DIR)
	@$(call E, configuring in dist/$(PKG_DIR)-build)
	$(Q)mkdir -p dist/build
	$(Q)cd dist/$(PKG_DIR)-build && ../$(PKG_DIR)/configure
	@$(call E, making 'check' in dist/$(PKG_DIR)-build)
	$(Q)make -C dist/$(PKG_DIR)-build check
	@$(call E, making 'clean' in dist/$(PKG_DIR)-build)
	$(Q)make -C dist/$(PKG_DIR)-build clean
	$(Q)rm -Rf dist
	@echo
	@echo -----------------------------------------------
	@echo $(PKG_TAR) ready for distribution
	@echo -----------------------------------------------

976 977 978 979 980 981 982

######################################################################
# Cleanup
######################################################################

.PHONY: clean

983 984 985 986 987 988 989
tidy:
	@$(call E, check: formatting)
	$(Q)python $(S)src/etc/tidy.py \
      $(filter-out $(GENERATED) \
        $(addprefix $(S)src/, $(LLVMEXT_CS) $(LLVMEXT_HDR) $(PKG_3RDPARTY)) \
        $(S)src/etc/%, $(PKG_FILES))

990 991
clean:
	@$(call E, cleaning)
992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011
	$(Q)rm -f $(RUNTIME_OBJS)
	$(Q)rm -f $(LLVMEXT_OBJS)
	$(Q)rm -f $(BOOT_CMOS) $(BOOT_CMIS) $(BOOT_CMXS) $(BOOT_OBJS)
	$(Q)rm -f $(ML_DEPFILES) $(C_DEPFILES) $(CRATE_DEPFILES)
	$(Q)rm -f $(ML_DEPFILES:%.d=%.d.tmp)
	$(Q)rm -f $(C_DEPFILES:%.d=%.d.tmp)
	$(Q)rm -f $(CRATE_DEPFILES:%.d=%.d.tmp)
	$(Q)rm -f $(GENERATED)
	$(Q)rm -f boot/rustboot$(X) boot/$(CFG_STDLIB)
	$(Q)rm -f stage0/rustc$(X) stage0/$(CFG_STDLIB) stage0/glue*
	$(Q)rm -f stage1/rustc$(X) stage1/$(CFG_STDLIB) stage1/glue*
	$(Q)rm -f stage2/rustc$(X) stage2/$(CFG_STDLIB) stage2/glue*
	$(Q)rm -f llvmext/$(CFG_LLVMEXT) rt/$(CFG_RUNTIME)
	$(Q)rm -Rf $(PKG_NAME)-*.tar.gz dist
	$(Q)rm -f $(foreach ext,cmx cmi cmo cma bc o a d exe,\
                        $(wildcard boot/*/*.$(ext) boot/*/*/*.$(ext)))
	$(Q)rm -Rf $(foreach ext,out out.tmp                               \
                             boot$(X) stage0$(X) stage1$(X) stage2$(X) \
                             bc o s exe dSYM,                          \
                        $(wildcard test/*/*.$(ext)))