Makefile.in 39.6 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
CFG_GCC_CFLAGS := -fno-strict-aliasing
15 16
CFG_GCC_LINK_FLAGS :=
CFG_BOOT_FLAGS := $(BOOT_FLAGS)
17
ifdef CFG_DISABLE_OPTIMIZE
18
  $(info cfg: disabling rustc optimization (CFG_DISABLE_OPTIMIZE))
19
  CFG_RUSTC_FLAGS :=
20
else
21
  CFG_RUSTC_FLAGS := -O
22
endif
23

24
ifdef SAVE_TEMPS
25
  CFG_RUSTC_FLAGS += --save-temps
26
endif
27 28 29
ifdef TIME_PASSES
  CFG_RUSTC_FLAGS += --time-passes
endif
30

31 32 33 34 35 36
# 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)
37
  CFG_LIB_NAME=lib$(1).so
38
  CFG_GCC_CFLAGS += -fPIC -march=i686 -I/usr/local/include -O2
39 40 41 42 43 44
  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
45
  CFG_LDENV := LD_LIBRARY_PATH
46
  CFG_DEF_SUFFIX := .bsd.def
47 48 49
endif

ifeq ($(CFG_OSTYPE), Linux)
50
  CFG_LIB_NAME=lib$(1).so
51
  CFG_GCC_CFLAGS += -fPIC -march=i686 -O2
52
  CFG_GCC_LINK_FLAGS += -shared -fPIC -ldl -lpthread -lrt
53 54
  CFG_GCC_DEF_FLAG := -Wl,--export-dynamic,--dynamic-list=
  CFG_GCC_PRE_LIB_FLAGS := -Wl,-whole-archive
55
  CFG_GCC_POST_LIB_FLAGS := -Wl,-no-whole-archive
56 57 58 59 60
  ifeq ($(CFG_CPUTYPE), x86_64)
    CFG_GCC_CFLAGS += -m32
    CFG_GCC_LINK_FLAGS += -m32
  endif
  CFG_UNIXY := 1
61
  CFG_LDENV := LD_LIBRARY_PATH
62
  CFG_DEF_SUFFIX := .linux.def
63 64 65
endif

ifeq ($(CFG_OSTYPE), Darwin)
66
  CFG_LIB_NAME=lib$(1).dylib
67
  CFG_UNIXY := 1
68
  CFG_LDENV := DYLD_LIBRARY_PATH
69
  CFG_GCC_LINK_FLAGS += -dynamiclib -lpthread
70
  CFG_GCC_DEF_FLAG := -Wl,-exported_symbols_list,
71 72 73 74
  # 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!
75 76 77
  #
  # NB: Currently GCC's optimizer breaks rustrt (task-comm-1 hangs) on Darwin.
  CFG_GCC_CFLAGS += -m32 -O0
78 79
  CFG_GCC_LINK_FLAGS += -m32
  CFG_DSYMUTIL := dsymutil
80
  CFG_DEF_SUFFIX := .darwin.def
81 82 83 84 85 86
endif

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

87
CFG_LDPATH :=$(CFG_BUILD_DIR)/rt
88
CFG_LDPATH :=$(CFG_LDPATH):$(CFG_BUILD_DIR)/rustllvm
89
CFG_TESTLIB=$(dir $(firstword $(1))):$(patsubst .%,%,$(suffix $(1)))
90
CFG_EXE_TESTLIB=$(call CFG_TESTLIB,$(patsubst %.exe,%,$(1)))
91

92 93 94 95 96
ifdef CFG_WINDOWSY
  CFG_INFO := $(info cfg: windows-y environment)

  CFG_EXE_SUFFIX := .exe
  CFG_LIB_NAME=$(1).dll
97 98
  CFG_LDPATH :=$(CFG_LDPATH):$(CFG_LLVM_BINDIR)
  CFG_LDPATH :=$(CFG_LDPATH):$$PATH
99
  CFG_RUN_TEST=PATH="$(CFG_LDPATH):$(call CFG_EXE_TESTLIB,$(1))" $(1)
100
  CFG_RUN_TARG=PATH="$(CFG_BUILD_DIR)/$(1):$(CFG_LDPATH)" $(2)
101

102 103
  CFG_PATH_MUNGE := $(strip perl -i.bak -p             \
                           -e 's@\\(\S)@/\1@go;'       \
104
                           -e 's@^/([a-zA-Z])/@\1:/@o;')
105 106 107
  ifdef CFG_FLEXLINK
    CFG_BOOT_NATIVE := 1
  endif
108
  CFG_GCC_CFLAGS += -march=i686 -O2
109
  CFG_GCC_LINK_FLAGS += -shared -fPIC
110
  CFG_DEF_SUFFIX := .def
111 112 113 114 115
endif

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

116
  CFG_PATH_MUNGE := true
117
  CFG_EXE_SUFFIX :=
118
  CFG_LDPATH :=$(CFG_LDPATH):$(CFG_LLVM_LIBDIR)
119
  CFG_RUN_TARG=$(CFG_LDENV)=$(CFG_BUILD_DIR)/$(1):$(CFG_LDPATH) $(2)
120
  CFG_RUN_TEST=\
121
      $(CFG_LDENV)=$(call CFG_TESTLIB,$(1)):$(CFG_LDPATH) \
122
      $(CFG_VALGRIND) $(1)
123 124 125 126 127 128

  CFG_BOOT_NATIVE := 1

  ifdef MINGW_CROSS
    CFG_EXE_SUFFIX := .exe
    CFG_LIB_NAME=$(1).dll
129 130
    CFG_LDPATH :=$(CFG_LDPATH):$(CFG_LLVM_BINDIR)
    CFG_LDPATH :=$(CFG_LDPATH):$$PATH
131
    CFG_RUN_TARG=PATH=$(CFG_BUILD_DIR)/$(1):$(CFG_LDPATH) $(2)
132
    CFG_RUN_TEST=PATH=$(CFG_LDPATH):$(call CFG_EXE_TESTLIB,$(1)) $(1)
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150

    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 \
151
                    --suppressions=$(CFG_SRC_DIR)src/etc/x86.supp
152 153 154 155
  endif
endif

CFG_RUNTIME :=$(call CFG_LIB_NAME,rustrt)
156
CFG_RUSTLLVM :=$(call CFG_LIB_NAME,rustllvm)
157 158 159 160 161 162 163 164
CFG_STDLIB :=$(call CFG_LIB_NAME,std)

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_DEPEND_C = $(CFG_GCC_CROSS)g++ $(CFG_GCC_CFLAGS) -MT "$(1)" -MM $(2)
165
  CFG_LINK_C = $(CFG_GCC_CROSS)g++ $(CFG_GCC_LINK_FLAGS) -o $(1) \
166
               $(CFG_GCC_DEF_FLAG)$(3) $(2)
167 168 169 170
else
  CFG_ERR := $(error please try on a system with gcc)
endif

171
ifdef CFG_OCAMLC_OPT
172
  $(info cfg: have ocaml native compiler)
173 174
  OPT=.opt
else
175
  $(info cfg: have only ocaml bytecode compiler)
176 177
endif

178 179
ifdef CFG_BOOT_PROFILE
  $(info cfg: forcing native bootstrap compiler (CFG_BOOT_PROFILE))
180
  CFG_BOOT_NATIVE := 1
181 182 183
  CFG_OCAMLOPT_PROFILE_FLAGS := -p
endif

184 185
ifdef CFG_BOOT_DEBUG
  $(info cfg: forcing bytecode bootstrap compiler (CFG_BOOT_DEBUG))
186
  CFG_BOOT_NATIVE :=
187 188
endif

189
ifdef CFG_BOOT_NATIVE
190 191 192 193 194
  $(info cfg: building native bootstrap compiler)
else
  $(info cfg: building bytecode bootstrap compiler)
endif

195 196
ifdef CFG_DISABLE_VALGRIND
  $(info cfg: disabling valgrind (CFG_DISABLE_VALGRIND))
197 198 199
  CFG_VALGRIND :=
endif

G
Graydon Hoare 已提交
200 201 202 203 204 205 206 207 208 209
DOCS :=
ifeq ($(CFG_MAKEINFO),)
  $(info cfg: no makeinfo found, omitting doc/rust.html)
else
  DOCS += doc/rust.html
endif

ifeq ($(CFG_TEXI2PDF),)
  $(info cfg: no texi2pdf found, omitting doc/rust.pdf)
else
210 211 212 213 214
  ifeq ($(CFG_TEX),)
    $(info cfg: no tex found, omitting doc/rust.pdf)
  else
    DOCS += doc/rust.pdf
  endif
G
Graydon Hoare 已提交
215 216
endif

217 218 219 220
ifdef CFG_DISABLE_DOCS
  $(info cfg: disabling doc build (CFG_DISABLE_DOCS))
  DOCS :=
endif
G
Graydon Hoare 已提交
221

222 223 224 225 226 227 228 229 230 231
######################################################################
# Target-and-rule "utility variables"
######################################################################

ifdef VERBOSE
  Q :=
  E =
else
  Q := @
  E = echo $(1)
232 233
endif

234 235 236 237 238 239 240
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.
241
BOOT := $(Q)OCAMLRUNPARAM="b1" boot/rustboot$(X) $(CFG_BOOT_FLAGS) -L boot
242
STAGE0 := $(Q)$(call CFG_RUN_TARG,boot,\
243
                stage0/rustc$(X) $(CFG_RUSTC_FLAGS) -L stage0)
244
STAGE1 := $(Q)$(call CFG_RUN_TARG,stage0, \
245
                stage1/rustc$(X) $(CFG_RUSTC_FLAGS) -L stage1)
246 247
STAGE2 := $(Q)$(call CFG_RUN_TARG,stage1, \
                stage2/rustc$(X) $(CFG_RUSTC_FLAGS) -L stage2)
248 249 250 251 252 253 254 255 256 257 258

# "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.%
259 260 261 262 263 264 265 266 267 268

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

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

BOOT_MLS :=                                              \
    $(addsuffix .ml,                                     \
269 270
        boot/version                                     \
        $(addprefix boot/util/, fmt common bits)         \
271 272 273 274 275
        $(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  \
G
Graydon Hoare 已提交
276
          simplify type dead layer typestate             \
277 278 279 280 281 282 283 284 285
         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)

G
Graydon Hoare 已提交
286
BS := $(S)src/boot
287 288 289 290 291 292 293 294

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
295

296 297 298
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
299 300
BOOT_OCAMLOPT_FLAGS := -g $(BOOT_ML_INCS) -w Ael -warn-error Ael

301 302 303 304
ifdef CFG_FLEXLINK
  BOOT_OCAMLOPT_FLAGS += -cclib -L/usr/lib
endif

305 306 307
######################################################################
# Runtime (C++) library variables
######################################################################
308

309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
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 \
G
Graydon Hoare 已提交
358
               rt/sync/lock_and_signal.h \
359 360 361 362 363 364 365 366 367
               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

368
RUNTIME_DEF := rt/rustrt$(CFG_DEF_SUFFIX)
369 370
RUNTIME_INCS := -I $(S)src/rt/isaac -I $(S)src/rt/uthash
RUNTIME_OBJS := $(RUNTIME_CS:.cpp=.o)
371
RUNTIME_LIBS := $(CFG_GCC_POST_LIB_FLAGS)
372 373

######################################################################
374
# rustc LLVM-extensions (C++) library variables
375 376
######################################################################

377
RUSTLLVM_LIB_CS := $(addprefix rustllvm/, \
378
                     MachOObjectFile.cpp Passes.cpp)
379 380

RUSTLLVM_OBJS_CS := $(addprefix rustllvm/, RustWrapper.cpp)
381

382
RUSTLLVM_HDR := rustllvm/include/llvm-c/Object.h
383
RUSTLLVM_DEF := rustllvm/rustllvm$(CFG_DEF_SUFFIX)
384

385 386
RUSTLLVM_INCS := -iquote $(CFG_LLVM_INCDIR) \
                 -iquote $(S)src/rustllvm/include
387 388
RUSTLLVM_LIB_OBJS := $(RUSTLLVM_LIB_CS:.cpp=.o)
RUSTLLVM_OBJS_OBJS := $(RUSTLLVM_OBJS_CS:.cpp=.o)
389

390 391 392 393
######################################################################
# Standard library variables
######################################################################

G
Graydon Hoare 已提交
394
STDLIB_CRATE := $(S)src/lib/std.rc
395
STDLIB_INPUTS := $(wildcard $(addprefix $(S)src/lib/,*.rc *.rs */*.rs))
396 397

######################################################################
398
# rustc crate variables
399 400
######################################################################

G
Graydon Hoare 已提交
401
COMPILER_CRATE := $(S)src/comp/rustc.rc
402
COMPILER_INPUTS := $(wildcard $(addprefix $(S)src/comp/, \
403 404
                                rustc.rc *.rs */*.rs))

405
######################################################################
G
Graydon Hoare 已提交
406
# Test dependency variables
407 408
######################################################################

409
LREQ := rt/$(CFG_RUNTIME) rustllvm/$(CFG_RUSTLLVM)
410
BREQ := boot/rustboot$(X) boot/$(CFG_STDLIB)
411 412 413
SREQ0 := stage0/rustc$(X) $(LREQ) stage0/glue.o stage0/$(CFG_STDLIB)
SREQ1 := stage1/rustc$(X) $(LREQ) stage1/glue.o stage1/$(CFG_STDLIB)
SREQ2 := stage2/rustc$(X) $(LREQ) stage2/glue.o stage2/$(CFG_STDLIB)
414

G
Graydon Hoare 已提交
415

416 417 418
######################################################################
# Single-target rules
######################################################################
419

420
all: boot/rustboot$(X)          \
421
     boot/$(CFG_STDLIB)         \
422
     rt/$(CFG_RUNTIME)          \
423
     rustllvm/$(CFG_RUSTLLVM)   \
424
     stage0/rustc$(X)           \
G
Graydon Hoare 已提交
425
     stage0/glue.o              \
426
     stage0/$(CFG_STDLIB)       \
G
Graydon Hoare 已提交
427 428
     $(GENERATED)               \
     $(DOCS)
429

430
rt/$(CFG_RUNTIME): $(RUNTIME_OBJS) $(MKFILES) $(RUNTIME_HDR) $(RUNTIME_DEF)
431
	@$(call E, link: $@)
432
	$(Q)$(call CFG_LINK_C,$@,$(RUNTIME_LIBS) $(RUNTIME_OBJS),$(RUNTIME_DEF))
433

434 435 436
# FIXME: Building a .a is a hack so that we build with both older and newer
# versions of LLVM. In newer versions some of the bits of this library are
# already in LLVM itself, so they are skipped.
437
rustllvm/rustllvmbits.a: $(RUSTLLVM_LIB_OBJS)
438 439 440
	rm -f $@
	ar crs $@ $^

441 442
# Note: We pass $(CFG_LLVM_LIBS) twice to fix the windows link since
# it has no -whole-archive.
443 444
rustllvm/$(CFG_RUSTLLVM): rustllvm/rustllvmbits.a $(RUSTLLVM_OBJS_OBJS) \
                          $(MKFILES) $(RUSTLLVM_HDR) $(RUSTLLVM_DEF)
445
	@$(call E, link: $@)
446 447 448
	$(Q)$(call CFG_LINK_C,$@,$(RUSTLLVM_OBJS_OBJS) \
	  $(CFG_GCC_PRE_LIB_FLAGS) $(CFG_LLVM_LIBS) \
          $(CFG_GCC_POST_LIB_FLAGS) rustllvm/rustllvmbits.a \
449
	  $(CFG_LLVM_LIBS) \
450
          $(CFG_LLVM_LDFLAGS),$(RUSTLLVM_DEF))
451 452

ifdef CFG_BOOT_NATIVE
453
boot/rustboot$(X): $(BOOT_CMXS) $(MKFILES)
454 455
	@$(call E, link: $@)
	$(Q)ocamlopt$(OPT) -o $@ $(BOOT_OCAMLOPT_FLAGS) $(BOOT_ML_NATIVE_LIBS) \
456 457
        $(BOOT_CMXS)
else
458
boot/rustboot$(X): $(BOOT_CMOS) $(MKFILES)
459
	@$(call E, link: $@)
460
	$(Q)ocamlc$(OPT) -o $@ $(BOOT_OCAMLC_FLAGS) $(BOOT_ML_LIBS) $(BOOT_CMOS)
461 462
endif

463 464
boot/version.ml: $(MKFILES)
	@$(call E, git: $@)
465 466
	$(Q)(cd $(S) && git log -1 \
      --pretty=format:'let version = "prerelease (%h %ci)";;') >$@ || exit 1
467

G
Graydon Hoare 已提交
468

469

G
Graydon Hoare 已提交
470
boot/$(CFG_STDLIB): $(STDLIB_CRATE) $(STDLIB_INPUTS) \
471
                    boot/rustboot$(X) $(MKFILES)
472 473 474
	@$(call E, compile: $@)
	$(BOOT) -shared -o $@ $<

475
stage0/std.o: $(STDLIB_CRATE) $(STDLIB_INPUTS) stage0/rustc$(X) $(MKFILES)
G
Graydon Hoare 已提交
476
	@$(call E, compile: $@)
477
	$(STAGE0) -c --shared -o $@ $<
G
Graydon Hoare 已提交
478

479 480 481 482 483
stage0/$(CFG_STDLIB): stage0/std.o stage0/glue.o
	@$(call E, link: $@)
	$(Q)gcc $(CFG_GCC_CFLAGS) stage0/glue.o $(CFG_GCC_LINK_FLAGS) -o $@ $< \
		-Lstage0 -Lrt -lrustrt

484
stage1/std.o: $(STDLIB_CRATE) $(STDLIB_INPUTS) stage1/rustc$(X) $(MKFILES)
485
	@$(call E, compile: $@)
486
	$(STAGE1) -c --shared -o $@ $<
487

488 489 490 491 492
stage1/$(CFG_STDLIB): stage1/std.o stage1/glue.o
	@$(call E, link: $@)
	$(Q)gcc $(CFG_GCC_CFLAGS) stage1/glue.o $(CFG_GCC_LINK_FLAGS) -o $@ $< \
		-Lstage1 -Lrt -lrustrt

493
stage2/std.o: $(STDLIB_CRATE) $(STDLIB_INPUTS) stage2/rustc$(X) $(MKFILES)
494
	@$(call E, compile: $@)
495
	$(STAGE2) -c --shared -o $@ $<
496

497 498 499 500 501
stage2/$(CFG_STDLIB): stage2/std.o stage2/glue.o
	@$(call E, link: $@)
	$(Q)gcc $(CFG_GCC_CFLAGS) stage2/glue.o $(CFG_GCC_LINK_FLAGS) -o $@ $< \
		-Lstage2 -Lrt -lrustrt

502

G
Graydon Hoare 已提交
503

504
stage0/rustc$(X): $(COMPILER_CRATE) $(COMPILER_INPUTS) $(BREQ)
505 506 507 508
	@$(call E, compile: $@)
	$(BOOT) -minimal -o $@ $<
	$(Q)chmod 0755 $@

509
stage1/rustc.o: $(COMPILER_CRATE) $(COMPILER_INPUTS) $(SREQ0)
G
Graydon Hoare 已提交
510
	@$(call E, compile: $@)
511
	$(STAGE0) -c -o $@ $<
G
Graydon Hoare 已提交
512

513
stage2/rustc.o: $(COMPILER_CRATE) $(COMPILER_INPUTS) $(SREQ1)
514
	@$(call E, compile: $@)
515
	$(STAGE1) -c -o $@ $<
516 517


G
Graydon Hoare 已提交
518

519
stage0/glue.o: stage0/rustc$(X) boot/$(CFG_STDLIB) \
520
                rustllvm/$(CFG_RUSTLLVM) rt/$(CFG_RUNTIME)
521
	@$(call E, generate: $@)
522
	$(STAGE0) -c -o $@ --glue
523

524
stage1/glue.o: stage1/rustc$(X) stage0/$(CFG_STDLIB) \
525
                rustllvm/$(CFG_RUSTLLVM) rt/$(CFG_RUNTIME)
G
Graydon Hoare 已提交
526
	@$(call E, generate: $@)
527
	$(STAGE1) -c -o $@ --glue
G
Graydon Hoare 已提交
528

529
stage2/glue.o: stage2/rustc$(X) stage1/$(CFG_STDLIB) \
530
                rustllvm/$(CFG_RUSTLLVM) rt/$(CFG_RUNTIME)
531
	@$(call E, generate: $@)
532
	$(STAGE2) -c -o $@ --glue
533

534 535 536 537 538 539 540
# Due to make not wanting to run the same implicit rules twice on the same
# rule tree (implicit-rule recursion prevention, see "Chains of Implicit
# Rules" in GNU Make manual) we have to re-state the %.o and %.s patterns here
# for different directories, to handle cases where (say) a test relies on a
# compiler that relies on a .o file.

stage0/%.o: stage0/%.s
G
Graydon Hoare 已提交
541
	@$(call E, assemble [gcc]: $@)
542 543 544
	$(Q)gcc $(CFG_GCC_CFLAGS) -o $@ -c $<

stage1/%.o: stage1/%.s
G
Graydon Hoare 已提交
545
	@$(call E, assemble [gcc]: $@)
546 547 548
	$(Q)gcc $(CFG_GCC_CFLAGS) -o $@ -c $<

stage2/%.o: stage2/%.s
G
Graydon Hoare 已提交
549
	@$(call E, assemble [gcc]: $@)
550 551
	$(Q)gcc $(CFG_GCC_CFLAGS) -o $@ -c $<

G
Graydon Hoare 已提交
552 553 554
stage1/%$(X): stage1/%.o  $(SREQ0)
	@$(call E, link [gcc]: $@)
	$(Q)gcc $(CFG_GCC_CFLAGS) stage0/glue.o -o $@ $< \
555
      -Lstage0 -Lrustllvm -Lrt -lrustrt -lrustllvm -lstd -lm
G
Graydon Hoare 已提交
556 557 558 559 560 561 562 563
	@# dsymutil sometimes fails or prints a warning, but the
	@# program still runs.  Since it simplifies debugging other
	@# programs, I\'ll live with the noise.
	-$(Q)$(CFG_DSYMUTIL) $@

stage2/%$(X): stage2/%.o  $(SREQ1)
	@$(call E, link [gcc]: $@)
	$(Q)gcc $(CFG_GCC_CFLAGS) stage1/glue.o -o $@ $< \
564
      -Lstage1 -Lrustllvm -Lrt -lrustrt -lrustllvm -lstd -lm
G
Graydon Hoare 已提交
565 566 567 568 569
	@# dsymutil sometimes fails or prints a warning, but the
	@# program still runs.  Since it simplifies debugging other
	@# programs, I\'ll live with the noise.
	-$(Q)$(CFG_DSYMUTIL) $@

570 571


572
######################################################################
573
# Library and boot rules
574 575 576 577 578 579
######################################################################

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

580
rustllvm/%.o: rustllvm/%.cpp $(MKFILES)
581
	@$(call E, compile: $@)
582
	$(Q)$(call CFG_COMPILE_C, $@, $(CFG_LLVM_CXXFLAGS) $(RUSTLLVM_INCS)) $<
583

584 585
%.cmo: %.ml $(MKFILES)
	@$(call E, compile: $@)
586
	$(Q)ocamlc$(OPT) -c -o $@ $(BOOT_OCAMLC_FLAGS) $<
587 588

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

590 591 592 593 594 595 596
%.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 $@ $<
597

598

599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616
%.linux.def:    %.def.in $(MKFILES)
	@$(call E, def: $@)
	$(Q)echo "{" > $@
	$(Q)sed 's/.$$/&;/' $< >> $@
	$(Q)echo "};" >> $@

%.darwin.def:	%.def.in $(MKFILES)
	@$(call E, def: $@)
	$(Q)sed 's/^./_&/' $< > $@

ifdef CFG_WINDOWSY
%.def:	%.def.in $(MKFILES)
	@$(call E, def: $@)
	$(Q)echo LIBRARY $* > $@
	$(Q)echo EXPORTS >> $@
	$(Q)sed 's/^./    &/' $< >> $@
endif

G
Graydon Hoare 已提交
617 618 619 620 621
######################################################################
# Doc rules
######################################################################

doc/version.texi: $(MKFILES) rust.texi
622 623
	(cd $(S) && git log -1 \
      --pretty=format:'@macro gitversion%n%h %ci%n@end macro%n') >$@
G
Graydon Hoare 已提交
624 625 626 627 628 629 630 631 632 633 634

doc/%.pdf: %.texi doc/version.texi
	texi2pdf -I doc -o $@ --clean $<

doc/%.html: %.texi doc/version.texi
	makeinfo -I doc --html --ifhtml --force --no-split --output=$@ $<

docsnap: doc/rust.pdf
	mv $< doc/rust-$(shell date +"%Y-%m-%d")-snap.pdf


G
Graydon Hoare 已提交
635 636 637 638
######################################################################
# Testing variables
######################################################################

639 640 641 642 643 644
ALL_TEST_INPUTS = $(wildcard $(S)src/test/*/*.rs   \
                              $(S)src/test/*/*/*.rs \
                              $(S)src/test/*/*.rc)

TEST_XFAILS_BOOT = $(shell grep -l xfail-boot $(ALL_TEST_INPUTS))
TEST_XFAILS_STAGE0 = $(shell grep -l xfail-stage0 $(ALL_TEST_INPUTS))
645 646
TEST_XFAILS_STAGE1 = $(shell grep -l xfail-stage1 $(ALL_TEST_INPUTS))
TEST_XFAILS_STAGE2 = $(shell grep -l xfail-stage2 $(ALL_TEST_INPUTS))
G
Graydon Hoare 已提交
647 648 649 650

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
651 652
TEST_XFAILS_STAGE1 += $(S)src/test/run-pass/native-mod.rc
TEST_XFAILS_STAGE2 += $(S)src/test/run-pass/native-mod.rc
G
Graydon Hoare 已提交
653 654 655 656
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
657 658
TEST_XFAILS_STAGE1 += $(S)src/test/run-pass/native-mod.rc
TEST_XFAILS_STAGE2 += $(S)src/test/run-pass/native-mod.rc
G
Graydon Hoare 已提交
659 660
endif

661
BENCH_RS = $(wildcard $(S)src/test/bench/shootout/*.rs) \
G
Graydon Hoare 已提交
662
            $(wildcard $(S)src/test/bench/99-bottles/*.rs)
663 664 665 666 667 668
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)
G
Graydon Hoare 已提交
669 670

ifdef CHECK_XFAILS
671 672
TEST_RPASS_CRATES_BOOT = $(filter $(TEST_XFAILS_BOOT), $(RPASS_RC))
TEST_RPASS_CRATES_STAGE0 = $(filter $(TEST_XFAILS_STAGE0), $(RPASS_RC))
673 674
TEST_RPASS_CRATES_STAGE1 = $(filter $(TEST_XFAILS_STAGE1), $(RPASS_RC))
TEST_RPASS_CRATES_STAGE2 = $(filter $(TEST_XFAILS_STAGE2), $(RPASS_RC))
675 676
TEST_RPASS_SOURCES_BOOT = $(filter $(TEST_XFAILS_BOOT), $(RPASS_RS))
TEST_RPASS_SOURCES_STAGE0 = $(filter $(TEST_XFAILS_STAGE0), $(RPASS_RS))
677 678
TEST_RPASS_SOURCES_STAGE1 = $(filter $(TEST_XFAILS_STAGE1), $(RPASS_RS))
TEST_RPASS_SOURCES_STAGE2 = $(filter $(TEST_XFAILS_STAGE2), $(RPASS_RS))
G
Graydon Hoare 已提交
679
else
680 681
TEST_RPASS_CRATES_BOOT = $(filter-out $(TEST_XFAILS_BOOT), $(RPASS_RC))
TEST_RPASS_CRATES_STAGE0 = $(filter-out $(TEST_XFAILS_STAGE0), $(RPASS_RC))
682 683
TEST_RPASS_CRATES_STAGE1 = $(filter-out $(TEST_XFAILS_STAGE1), $(RPASS_RC))
TEST_RPASS_CRATES_STAGE1 = $(filter-out $(TEST_XFAILS_STAGE2), $(RPASS_RC))
684 685
TEST_RPASS_SOURCES_BOOT = $(filter-out $(TEST_XFAILS_BOOT), $(RPASS_RS))
TEST_RPASS_SOURCES_STAGE0 = $(filter-out $(TEST_XFAILS_STAGE0), $(RPASS_RS))
686 687
TEST_RPASS_SOURCES_STAGE1 = $(filter-out $(TEST_XFAILS_STAGE1), $(RPASS_RS))
TEST_RPASS_SOURCES_STAGE2 = $(filter-out $(TEST_XFAILS_STAGE2), $(RPASS_RS))
G
Graydon Hoare 已提交
688 689
endif

690
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)))
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)))
696 697 698 699 700 701
TEST_RPASS_EXES_STAGE1 = \
  $(subst $(S)src/,,$(TEST_RPASS_CRATES_STAGE1:.rc=.stage1$(X))) \
  $(subst $(S)src/,,$(TEST_RPASS_SOURCES_STAGE1:.rs=.stage1$(X)))
TEST_RPASS_EXES_STAGE2 = \
  $(subst $(S)src/,,$(TEST_RPASS_CRATES_STAGE1:.rc=.stage2$(X))) \
  $(subst $(S)src/,,$(TEST_RPASS_SOURCES_STAGE1:.rs=.stage2$(X)))
G
Graydon Hoare 已提交
702

703
TEST_RPASS_OUTS_BOOT  = \
704
  $(TEST_RPASS_EXES_BOOT:.boot$(X)=.boot.out)
705
TEST_RPASS_OUTS_STAGE0 = \
706
  $(TEST_RPASS_EXES_STAGE0:.stage0$(X)=.stage0.out)
707 708 709 710
TEST_RPASS_OUTS_STAGE1 = \
  $(TEST_RPASS_EXES_STAGE1:.stage1$(X)=.stage1.out)
TEST_RPASS_OUTS_STAGE2 = \
  $(TEST_RPASS_EXES_STAGE2:.stage2$(X)=.stage2.out)
G
Graydon Hoare 已提交
711

712
TEST_RPASS_TMPS_BOOT  = \
G
Graydon Hoare 已提交
713
  $(TEST_RPASS_EXES_BOOT:.boot$(X)=.boot$(X).tmp)
714
TEST_RPASS_TMPS_STAGE0 = \
715
  $(TEST_RPASS_EXES_STAGE0:.stage0$(X)=.stage0$(X).tmp)
716 717 718 719
TEST_RPASS_TMPS_STAGE1 = \
  $(TEST_RPASS_EXES_STAGE1:.stage1$(X)=.stage1$(X).tmp)
TEST_RPASS_TMPS_STAGE2 = \
  $(TEST_RPASS_EXES_STAGE2:.stage2$(X)=.stage2$(X).tmp)
G
Graydon Hoare 已提交
720 721


722 723
TEST_RFAIL_CRATES_BOOT = $(filter-out $(TEST_XFAILS_BOOT), $(RFAIL_RC))
TEST_RFAIL_CRATES_STAGE0 = $(filter-out $(TEST_XFAILS_STAGE0), $(RFAIL_RC))
724 725
TEST_RFAIL_CRATES_STAGE1 = $(filter-out $(TEST_XFAILS_STAGE1), $(RFAIL_RC))
TEST_RFAIL_CRATES_STAGE2 = $(filter-out $(TEST_XFAILS_STAGE2), $(RFAIL_RC))
726 727
TEST_RFAIL_SOURCES_BOOT = $(filter-out $(TEST_XFAILS_BOOT), $(RFAIL_RS))
TEST_RFAIL_SOURCES_STAGE0 = $(filter-out $(TEST_XFAILS_STAGE0), $(RFAIL_RS))
728 729
TEST_RFAIL_SOURCES_STAGE1 = $(filter-out $(TEST_XFAILS_STAGE1), $(RFAIL_RS))
TEST_RFAIL_SOURCES_STAGE2 = $(filter-out $(TEST_XFAILS_STAGE2), $(RFAIL_RS))
G
Graydon Hoare 已提交
730

731
TEST_RFAIL_EXES_BOOT = \
732 733
  $(subst $(S)src/,,$(TEST_RFAIL_CRATES_BOOT:.rc=.boot$(X))) \
  $(subst $(S)src/,,$(TEST_RFAIL_SOURCES_BOOT:.rs=.boot$(X)))
734
TEST_RFAIL_EXES_STAGE0 = \
735 736
  $(subst $(S)src/,,$(TEST_RFAIL_CRATES_STAGE0:.rc=.stage0$(X))) \
  $(subst $(S)src/,,$(TEST_RFAIL_SOURCES_STAGE0:.rs=.stage0$(X)))
737 738 739 740 741 742
TEST_RFAIL_EXES_STAGE1 = \
  $(subst $(S)src/,,$(TEST_RFAIL_CRATES_STAGE1:.rc=.stage1$(X))) \
  $(subst $(S)src/,,$(TEST_RFAIL_SOURCES_STAGE1:.rs=.stage1$(X)))
TEST_RFAIL_EXES_STAGE2 = \
  $(subst $(S)src/,,$(TEST_RFAIL_CRATES_STAGE2:.rc=.stage2$(X))) \
  $(subst $(S)src/,,$(TEST_RFAIL_SOURCES_STAGE2:.rs=.stage2$(X)))
G
Graydon Hoare 已提交
743

744
TEST_RFAIL_OUTS_BOOT  = \
745
  $(TEST_RFAIL_EXES_BOOT:.boot$(X)=.boot.out)
746
TEST_RFAIL_OUTS_STAGE0 = \
747
  $(TEST_RFAIL_EXES_STAGE0:.stage0$(X)=.stage0.out)
748 749 750 751
TEST_RFAIL_OUTS_STAGE1 = \
  $(TEST_RFAIL_EXES_STAGE0:.stage1$(X)=.stage1.out)
TEST_RFAIL_OUTS_STAGE2 = \
  $(TEST_RFAIL_EXES_STAGE0:.stage2$(X)=.stage2.out)
G
Graydon Hoare 已提交
752

753
TEST_RFAIL_TMPS_BOOT  = \
G
Graydon Hoare 已提交
754
  $(TEST_RFAIL_EXES_BOOT:.boot$(X)=.boot$(X).tmp)
755
TEST_RFAIL_TMPS_STAGE0 = \
756
  $(TEST_RFAIL_EXES_STAGE0:.stage0$(X)=.stage0$(X).tmp)
757 758 759 760
TEST_RFAIL_TMPS_STAGE1 = \
  $(TEST_RFAIL_EXES_STAGE1:.stage1$(X)=.stage1$(X).tmp)
TEST_RFAIL_TMPS_STAGE2 = \
  $(TEST_RFAIL_EXES_STAGE2:.stage2$(X)=.stage2$(X).tmp)
G
Graydon Hoare 已提交
761

762 763
TEST_CFAIL_CRATES_BOOT = $(filter-out $(TEST_XFAILS_BOOT), $(CFAIL_RC))
TEST_CFAIL_CRATES_STAGE0 = $(filter-out $(TEST_XFAILS_STAGE0), $(CFAIL_RC))
764 765
TEST_CFAIL_CRATES_STAGE1 = $(filter-out $(TEST_XFAILS_STAGE1), $(CFAIL_RC))
TEST_CFAIL_CRATES_STAGE2 = $(filter-out $(TEST_XFAILS_STAGE2), $(CFAIL_RC))
766 767
TEST_CFAIL_SOURCES_BOOT = $(filter-out $(TEST_XFAILS_BOOT), $(CFAIL_RS))
TEST_CFAIL_SOURCES_STAGE0 = $(filter-out $(TEST_XFAILS_STAGE0), $(CFAIL_RS))
768 769
TEST_CFAIL_SOURCES_STAGE1 = $(filter-out $(TEST_XFAILS_STAGE1), $(CFAIL_RS))
TEST_CFAIL_SOURCES_STAGE2 = $(filter-out $(TEST_XFAILS_STAGE2), $(CFAIL_RS))
G
Graydon Hoare 已提交
770

771
TEST_CFAIL_EXES_BOOT = \
772 773
  $(subst $(S)src/,,$(TEST_CFAIL_CRATES_BOOT:.rc=.boot$(X))) \
  $(subst $(S)src/,,$(TEST_CFAIL_SOURCES_BOOT:.rs=.boot$(X)))
774
TEST_CFAIL_EXES_STAGE0 = \
775
  $(subst $(S)src/,,$(TEST_CFAIL_CRATES_STAGE0:.rc=.stage0$(X))) \
776
  $(subst $(S)src/,,$(TEST_CFAIL_SOURCES_STAGE0:.rs=.stage0$(X)))
777 778 779 780 781 782
TEST_CFAIL_EXES_STAGE1 = \
  $(subst $(S)src/,,$(TEST_CFAIL_CRATES_STAGE1:.rc=.stage1$(X))) \
  $(subst $(S)src/,,$(TEST_CFAIL_SOURCES_STAGE1:.rs=.stage1$(X)))
TEST_CFAIL_EXES_STAGE2 = \
  $(subst $(S)src/,,$(TEST_CFAIL_CRATES_STAGE2:.rc=.stage2$(X))) \
  $(subst $(S)src/,,$(TEST_CFAIL_SOURCES_STAGE2:.rs=.stage2$(X)))
G
Graydon Hoare 已提交
783

784
TEST_CFAIL_OUTS_BOOT = \
785
  $(TEST_CFAIL_EXES_BOOT:.boot$(X)=.boot.out)
786
TEST_CFAIL_OUTS_STAGE0 = \
787
  $(TEST_CFAIL_EXES_STAGE0:.stage0$(X)=.stage0.out)
788 789 790 791
TEST_CFAIL_OUTS_STAGE1 = \
  $(TEST_CFAIL_EXES_STAGE1:.stage1$(X)=.stage1.out)
TEST_CFAIL_OUTS_STAGE2 = \
  $(TEST_CFAIL_EXES_STAGE0:.stage2$(X)=.stage2.out)
G
Graydon Hoare 已提交
792

793
TEST_CFAIL_TMPS_BOOT = \
G
Graydon Hoare 已提交
794
  $(TEST_CFAIL_EXES_BOOT:.boot$(X)=.boot$(X).tmp)
795
TEST_CFAIL_TMPS_STAGE0 = \
796
  $(TEST_CFAIL_EXES_STAGE0:.stage0$(X)=.stage0$(X).tmp)
797 798 799 800
TEST_CFAIL_TMPS_STAGE1 = \
  $(TEST_CFAIL_EXES_STAGE1:.stage1$(X)=.stage1$(X).tmp)
TEST_CFAIL_TMPS_STAGE0 = \
  $(TEST_CFAIL_EXES_STAGE2:.stage2$(X)=.stage2$(X).tmp)
G
Graydon Hoare 已提交
801 802


803
ALL_TEST_CRATES = $(TEST_CFAIL_CRATES_BOOT) \
G
Graydon Hoare 已提交
804 805 806 807
                   $(TEST_RFAIL_CRATES_BOOT) \
                   $(TEST_RPASS_CRATES_BOOT) \
                   $(TEST_CFAIL_CRATES_STAGE0) \
                   $(TEST_RFAIL_CRATES_STAGE0) \
808 809 810 811 812 813 814
                   $(TEST_RPASS_CRATES_STAGE0) \
                   $(TEST_CFAIL_CRATES_STAGE1) \
                   $(TEST_RFAIL_CRATES_STAGE1) \
                   $(TEST_RPASS_CRATES_STAGE1) \
                   $(TEST_CFAIL_CRATES_STAGE2) \
                   $(TEST_RFAIL_CRATES_STAGE2) \
                   $(TEST_RPASS_CRATES_STAGE2)
G
Graydon Hoare 已提交
815

816
ALL_TEST_SOURCES = $(TEST_CFAIL_SOURCES_BOOT) \
G
Graydon Hoare 已提交
817 818 819 820
                    $(TEST_RFAIL_SOURCES_BOOT) \
                    $(TEST_RPASS_SOURCES_BOOT) \
                    $(TEST_CFAIL_SOURCES_STAGE0) \
                    $(TEST_RFAIL_SOURCES_STAGE0) \
821 822 823 824 825 826 827
                    $(TEST_RPASS_SOURCES_STAGE0) \
                    $(TEST_CFAIL_SOURCES_STAGE1) \
                    $(TEST_RFAIL_SOURCES_STAGE1) \
                    $(TEST_RPASS_SOURCES_STAGE1) \
                    $(TEST_CFAIL_SOURCES_STAGE2) \
                    $(TEST_RFAIL_SOURCES_STAGE2) \
                    $(TEST_RPASS_SOURCES_STAGE2)
G
Graydon Hoare 已提交
828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843

# 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)
844 845 846 847 848 849
#       $(TEST_RPASS_EXES_STAGE1) $(TEST_RFAIL_EXES_STAGE1) \
#       $(TEST_RPASS_OUTS_STAGE1) $(TEST_RFAIL_OUTS_STAGE1) \
#       $(TEST_CFAIL_OUTS_STAGE1) \
#       $(TEST_RPASS_EXES_STAGE2) $(TEST_RFAIL_EXES_STAGE2) \
#       $(TEST_RPASS_OUTS_STAGE2) $(TEST_RFAIL_OUTS_STAGE2) \
#       $(TEST_CFAIL_OUTS_STAGE2)
G
Graydon Hoare 已提交
850 851 852 853


compile-check: tidy \
       $(TEST_RPASS_EXES_BOOT) $(TEST_RFAIL_EXES_BOOT) \
854 855 856
       $(TEST_RPASS_EXES_STAGE0) $(TEST_RFAIL_EXES_STAGE0) \
       $(TEST_RPASS_EXES_STAGE1) $(TEST_RFAIL_EXES_STAGE1) \
       $(TEST_RPASS_EXES_STAGE2) $(TEST_RFAIL_EXES_STAGE2)
G
Graydon Hoare 已提交
857 858


859 860 861 862
######################################################################
# Testing rules
######################################################################

863
%.stage0$(X): %.stage0.o  $(SREQ0)
864
	@$(call E, link [gcc]: $@)
865
	$(Q)gcc $(CFG_GCC_CFLAGS) stage0/glue.o -o $@ $< \
866
      -Lstage0 -Lrt -lrustrt -lstd -lm
867 868 869
	@# 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 已提交
870
	-$(Q)$(CFG_DSYMUTIL) $@
871

872
%.stage1$(X): %.stage1.o $(SREQ1)
873
	@$(call E, link [gcc]: $@)
874
	$(Q)gcc $(CFG_GCC_CFLAGS) stage1/glue.o -o $@ $< \
875
      -Lstage1 -Lrt -lrustrt -lstd -lm
876 877 878
	@# 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 已提交
879
	-$(Q)$(CFG_DSYMUTIL) $@
880

881
%.stage2$(X): %.stage2.o $(SREQ2)
882
	@$(call E, link [gcc]: $@)
883
	$(Q)gcc $(CFG_GCC_CFLAGS) stage2/glue.o -o $@ $< \
884
      -Lstage2 -Lrt -lrustrt -lstd -lm
885 886 887
	@# 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 已提交
888
	-$(Q)$(CFG_DSYMUTIL) $@
889 890 891 892 893 894 895 896 897 898 899



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

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

900
%.stage0.o: %.rc $(SREQ0)
901
	@$(call E, compile [stage0]: $@)
902
	$(STAGE0) -c -o $@ $<
903

904
%.stage0.o: %.rs $(SREQ0)
905
	@$(call E, compile [stage0]: $@)
906
	$(STAGE0) -c -o $@ $<
907

908
%.stage1.o: %.rc $(SREQ1)
909
	@$(call E, compile [stage1]: $@)
910
	$(STAGE1) -c -o $@ $<
911

912
%.stage1.o: %.rs $(SREQ1)
913
	@$(call E, compile [stage1]: $@)
914
	$(STAGE1) -c -o $@ $<
915

916
%.stage2.o: %.rc $(SREQ2)
917
	@$(call E, compile [stage2]: $@)
918
	$(STAGE2) -c -o $@ $<
919

920
%.stage2.o: %.rs $(SREQ2)
921
	@$(call E, compile [stage2]: $@)
922
	$(STAGE2) -c -o $@ $<
G
Graydon Hoare 已提交
923

924 925 926 927 928 929
# Cancel the implicit .out rule in GNU make.
%.out: %

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

G
Graydon Hoare 已提交
930
test/run-pass/%.out.tmp: test/run-pass/%$(X) rt/$(CFG_RUNTIME)
931 932
	$(Q)rm -f $<.tmp
	@$(call E, run: $@)
933
	$(Q)$(call CFG_RUN_TEST, $<) > $@
934 935 936 937 938

test/bench/shootout/%.out.tmp: test/bench/shootout/%$(X) \
                               rt/$(CFG_RUNTIME)
	$(Q)rm -f $<.tmp
	@$(call E, run: $@)
939
	$(Q)$(call CFG_RUN_TEST, $<) > $@
940 941 942 943 944

test/bench/99-bottles/%.out.tmp: test/bench/99-bottles/%$(X) \
                                 rt/$(CFG_RUNTIME)
	$(Q)rm -f $<.tmp
	@$(call E, run: $@)
945
	$(Q)$(call CFG_RUN_TEST, $<) > $@
946 947 948 949 950 951 952

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 $@
953
	$(Q)$(call CFG_RUN_TEST, $<) >$@ 2>&1 ; X=$$? ; \
954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974
      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')" $@

975 976 977 978 979 980

######################################################################
# Auto-dependency
######################################################################

ML_DEPFILES := $(BOOT_MLS:%.ml=%.d)
981 982
C_DEPFILES := $(RUNTIME_CS:%.cpp=%.d) $(RUSTLLVM_LIB_CS:%.cpp=%.d) \
              $(RUSTLLVM_OBJS_CS:%.cpp=%.d)
983 984 985 986 987 988 989

rt/%.d: rt/%.cpp $(MKFILES)
	@$(call E, dep: $@)
	$(Q)$(call CFG_DEPEND_C, $@ \
      $(subst $(S)src/,,$(patsubst %.cpp, %.o, $<)), \
      $(RUNTIME_INCS)) $< >$@.tmp
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
990
	$(Q)rm -f $@.tmp.bak
991 992 993 994 995 996 997 998
	$(Q)mv $@.tmp $@

rustllvm/%.d: rustllvm/%.cpp $(MKFILES)
	@$(call E, dep: $@)
	$(Q)$(call CFG_DEPEND_C, $@ \
      $(subst $(S)src/,,$(patsubst %.cpp, %.o, $<)), \
      $(CFG_LLVM_CXXFLAGS) $(RUSTLLVM_INCS)) $< >$@.tmp
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
999
	$(Q)rm -f $@.tmp.bak
1000 1001 1002 1003 1004 1005
	$(Q)mv $@.tmp $@

%.d: %.ml $(MKFILES)
	@$(call E, dep: $@)
	$(Q)ocamldep$(OPT) -slash $(BOOT_ML_DEP_INCS) $< >$@.tmp
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
1006 1007 1008
	$(Q)rm -f $@.tmp.bak
	$(Q)perl -i.bak -pe "s@$(S)src/@@go" $@.tmp
	$(Q)rm -f $@.tmp.bak
1009 1010 1011 1012 1013 1014
	$(Q)mv $@.tmp $@

%.d: %.mli $(MKFILES)
	@$(call E, dep: $@)
	$(Q)ocamldep$(OPT) -slash $(BOOT_ML_DEP_INCS) $< >$@.tmp
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
1015 1016 1017
	$(Q)rm -f $@.tmp.bak
	$(Q)perl -i.bak -pe "s@$(S)src/@@go" $@.tmp
	$(Q)rm -f $@.tmp.bak
1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035
	$(Q)mv $@.tmp $@

ifneq ($(MAKECMDGOALS),clean)
-include $(ML_DEPFILES) $(C_DEPFILES)
endif

RUSTBOOT_PROBE := $(wildcard boot/rustboot$(X))

ifneq ($(RUSTBOOT_PROBE),)
CFG_INFO := $(info cfg: using built boot/rustboot$(X) for rust deps)
CRATE_DEPFILES := $(subst $(S)src/,,$(ALL_TEST_CRATES:%.rc=%.d)) \
                  boot/$(CFG_STDLIB).d \
                  stage0/rustc$(X).d \
                  stage0/$(CFG_STDLIB).d

boot/$(CFG_STDLIB).d: $(STDLIB_CRATE) $(STDLIB_INPUTS) \
                      $(MKFILES) boot/rustboot$(X)
	@$(call E, dep: $@)
1036
	$(BOOT) -o $(patsubst %.d,%$(X),$@) -shared -rdeps $< >$@.tmp
1037
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
1038
	$(Q)rm -f $@.tmp.bak
1039 1040 1041 1042 1043
	$(Q)mv $@.tmp $@

stage0/rustc$(X).d: $(COMPILER_CRATE) $(COMPILER_INPUTS) \
                    $(STDLIB_CRATE) $(MKFILES) boot/rustboot$(X)
	@$(call E, dep: $@)
1044
	$(BOOT) -o $(patsubst %.d,%$(X),$@) -shared -rdeps $< >$@.tmp
1045
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
1046
	$(Q)rm -f $@.tmp.bak
1047 1048 1049 1050
	$(Q)mv $@.tmp $@

%.d: %.rc $(MKFILES) boot/rustboot$(X)
	@$(call E, dep: $@)
1051
	$(BOOT)  -o $(patsubst %.d,%$(X),$@) -rdeps $< >$@.tmp
1052
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
1053
	$(Q)rm -f $@.tmp.bak
1054 1055 1056 1057 1058 1059 1060 1061 1062
	$(Q)mv $@.tmp $@

ifneq ($(MAKECMDGOALS),clean)
-include $(CRATE_DEPFILES)
endif
endif

depend: boot/rustboot$(X) $(CRATE_DEPFILES) $(ML_DEPFILES) $(C_DEPFILES)

1063 1064 1065 1066 1067 1068 1069 1070 1071 1072

######################################################################
# Re-configuration
######################################################################

config.mk: $(S)configure $(S)Makefile.in
	@$(call E, cfg: reconfiguring)
	$(S)configure $(CFG_CONFIGURE_ARGS)


1073 1074 1075 1076 1077 1078 1079 1080 1081
######################################################################
# Distribution
######################################################################

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

1082 1083 1084 1085 1086 1087
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

1088
PKG_FILES = \
1089 1090 1091 1092 1093 1094 1095
    $(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)             \
1096 1097
      $(RUSTLLVM_LIB_CS) $(RUSTLLVM_OBJS_CS)   \
      $(RUSTLLVM_HDR)                          \
1098
      $(PKG_3RDPARTY))                         \
G
Graydon Hoare 已提交
1099 1100
    $(GENERATED)                               \
    $(S)src/boot/fe/lexer.ml                   \
1101 1102 1103 1104 1105 1106 1107
    $(COMPILER_INPUTS)                         \
    $(STDLIB_INPUTS)                           \
    $(ALL_TEST_INPUTS)                         \
    $(GENERATED)

dist: $(PKG_TAR)

G
Graydon Hoare 已提交
1108
$(PKG_TAR): $(GENERATED)
1109 1110 1111 1112 1113 1114 1115 1116
	@$(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)
G
Graydon Hoare 已提交
1117 1118 1119 1120
	$(Q)rm -Rf dist
	$(Q)mkdir -p dist
	@$(call E, unpacking $(PKG_TAR) in dist/$(PKG_DIR))
	$(Q)cd dist && tar -xzf ../$(PKG_TAR)
1121
	@$(call E, configuring in dist/$(PKG_DIR)-build)
G
Graydon Hoare 已提交
1122
	$(Q)mkdir -p dist/$(PKG_DIR)-build
1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133
	$(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 -----------------------------------------------

1134 1135 1136 1137 1138 1139 1140

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

.PHONY: clean

1141 1142
tidy:
	@$(call E, check: formatting)
1143
	$(Q)echo \
G
Graydon Hoare 已提交
1144
      $(filter-out $(GENERATED) $(addprefix $(S)src/, $(GENERATED)) \
1145 1146
        $(addprefix $(S)src/, $(RUSTLLVM_LIB_CS) $(RUSTLLVM_OBJS_CS) \
          $(RUSTLLVM_HDR) $(PKG_3RDPARTY)) \
1147 1148
        $(S)src/etc/%, $(PKG_FILES)) \
    | xargs -n 10 python $(S)src/etc/tidy.py
1149

1150 1151
clean:
	@$(call E, cleaning)
G
Graydon Hoare 已提交
1152
	$(Q)rm -f $(RUNTIME_OBJS) $(RUNTIME_DEF)
1153
	$(Q)rm -f $(RUSTLLVM_LIB_OBJS) $(RUSTLLVM_OBJS_OBJS) $(RUSTLLVM_DEF)
1154 1155 1156 1157 1158 1159 1160 1161 1162 1163
	$(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*
1164
	$(Q)rm -f rustllvm/$(CFG_RUSTLLVM) rt/$(CFG_RUNTIME)
1165 1166 1167
	$(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)))
G
Graydon Hoare 已提交
1168
	$(Q)rm -f $(foreach ext,o a d bc s exe,$(wildcard stage*/*.$(ext)))
1169 1170 1171
	$(Q)rm -Rf $(foreach ext,out out.tmp                               \
                             boot$(X) stage0$(X) stage1$(X) stage2$(X) \
                             bc o s exe dSYM,                          \
G
Graydon Hoare 已提交
1172
                        $(wildcard test/*/*.$(ext) test/bench/*/*.$(ext)))
G
Graydon Hoare 已提交
1173
	$(Q)rm -Rf $(foreach ext, \
1174
                 aux cp fn ky log pdf html pg toc tp vr cps, \
G
Graydon Hoare 已提交
1175
                 $(wildcard doc/*.$(ext)))
1176
	$(Q)rm -Rf doc/version.texi