Makefile.in 38.5 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
  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
33
  CFG_LDENV := LD_LIBRARY_PATH
34 35 36
endif

ifeq ($(CFG_OSTYPE), Linux)
37
  CFG_LIB_NAME=lib$(1).so
38 39 40 41 42 43 44
  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
45
  CFG_LDENV := LD_LIBRARY_PATH
46 47 48
endif

ifeq ($(CFG_OSTYPE), Darwin)
49
  CFG_LIB_NAME=lib$(1).dylib
50
  CFG_UNIXY := 1
51
  CFG_LDENV := DYLD_LIBRARY_PATH
52 53 54 55 56 57 58 59 60 61 62 63 64 65
  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

66
CFG_LDPATH :=$(CFG_BUILD_DIR)/rt
67
CFG_LDPATH :=$(CFG_LDPATH):$(CFG_BUILD_DIR)/rustllvm
68

69 70 71 72 73
ifdef CFG_WINDOWSY
  CFG_INFO := $(info cfg: windows-y environment)

  CFG_EXE_SUFFIX := .exe
  CFG_LIB_NAME=$(1).dll
74 75
  CFG_LDPATH :=$(CFG_LDPATH):$(CFG_LLVM_BINDIR)
  CFG_LDPATH :=$(CFG_LDPATH):$$PATH
76 77
  CFG_RUN_TEST=PATH="$(CFG_LDPATH)" $(1)
  CFG_RUN_TARG=PATH="$(CFG_LDPATH)" $(1)
78

79 80
  CFG_PATH_MUNGE := $(strip perl -i.bak -p             \
                           -e 's@\\(\S)@/\1@go;'       \
81
                           -e 's@^/([a-zA-Z])/@\1:/@o;')
82 83 84 85 86 87 88 89 90 91
  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)

92
  CFG_PATH_MUNGE := /bin/true
93
  CFG_EXE_SUFFIX :=
94
  CFG_LDPATH :=$(CFG_LDPATH):$(CFG_LLVM_LIBDIR)
95
  CFG_RUN_TARG=\
96
      $(CFG_LDENV)=$(dir $(firstword $(1))):$(CFG_LDPATH) $(1)
97
  CFG_RUN_TEST=\
98
      $(CFG_LDENV)=$(dir $(firstword $(1))):$(CFG_LDPATH) \
99
      $(CFG_VALGRIND) $(1)
100 101 102 103 104 105

  CFG_BOOT_NATIVE := 1

  ifdef MINGW_CROSS
    CFG_EXE_SUFFIX := .exe
    CFG_LIB_NAME=$(1).dll
106 107
    CFG_LDPATH :=$(CFG_LDPATH):$(CFG_LLVM_BINDIR)
    CFG_LDPATH :=$(CFG_LDPATH):$$PATH
108
    CFG_RUN_TARG=PATH=$(CFG_LDPATH) $(1)
109
    CFG_RUN_TEST=PATH=$(CFG_LDPATH) $(1)
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

    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 \
128
                    --suppressions=$(CFG_SRC_DIR)src/etc/x86.supp
129 130 131 132
  endif
endif

CFG_RUNTIME :=$(call CFG_LIB_NAME,rustrt)
133
CFG_RUSTLLVM :=$(call CFG_LIB_NAME,rustllvm)
134 135
CFG_STDLIB :=$(call CFG_LIB_NAME,std)

G
Graydon Hoare 已提交
136 137
CFG_LLC_CFLAGS := -march=x86

138 139 140 141 142 143 144 145 146 147
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)
else
  CFG_ERR := $(error please try on a system with gcc)
endif

148 149 150 151 152 153
ifdef CFG_WINDOWSY
  CFG_LINK_C = $(CFG_GCC_CROSS)g++ $(CFG_GCC_LINK_FLAGS) -o $(1) $(3) $(2)
else
  CFG_LINK_C = $(CFG_GCC_CROSS)g++ $(CFG_GCC_LINK_FLAGS) -o $(1) $(2)
endif

154
ifdef CFG_OCAMLC_OPT
155
  $(info cfg: have ocaml native compiler)
156 157
  OPT=.opt
else
158
  $(info cfg: have only ocaml bytecode compiler)
159 160
endif

161 162 163
ifdef BOOT_PROFILE
  $(info cfg: forcing native bootstrap compiler (BOOT_PROFILE))
  CFG_BOOT_NATIVE := 1
164 165 166
  CFG_OCAMLOPT_PROFILE_FLAGS := -p
endif

167 168 169
ifdef BOOT_DEBUG
  $(info cfg: forcing bytecode bootstrap compiler (DEBUG))
  CFG_BOOT_NATIVE :=
170 171
endif

172
ifdef CFG_BOOT_NATIVE
173 174 175 176 177 178
  $(info cfg: building native bootstrap compiler)
else
  $(info cfg: building bytecode bootstrap compiler)
endif

ifdef NO_VALGRIND
179 180 181 182
  $(info cfg: disabling valgrind (NO_VALGRIND))
  CFG_VALGRIND :=
endif

G
Graydon Hoare 已提交
183 184 185 186 187 188 189 190 191 192
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
193 194 195 196 197
  ifeq ($(CFG_TEX),)
    $(info cfg: no tex found, omitting doc/rust.pdf)
  else
    DOCS += doc/rust.pdf
  endif
G
Graydon Hoare 已提交
198 199 200
endif


201 202 203 204 205 206 207 208 209 210
######################################################################
# Target-and-rule "utility variables"
######################################################################

ifdef VERBOSE
  Q :=
  E =
else
  Q := @
  E = echo $(1)
211 212
endif

213 214 215 216 217 218 219
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.
220
BOOT := $(Q)OCAMLRUNPARAM="b1" boot/rustboot$(X) $(CFG_BOOT_FLAGS) -L boot
221 222 223 224
STAGE0 := $(Q)$(call CFG_RUN_TARG,\
                stage0/rustc$(X) $(CFG_RUSTC_FLAGS) -L stage0)
STAGE1 := $(Q)$(call CFG_RUN_TARG,\
                stage1/rustc$(X) $(CFG_RUSTC_FLAGS) -L stage1)
225 226 227 228 229 230 231 232 233 234 235

# "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.%
236 237 238 239 240 241 242 243 244 245

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

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

BOOT_MLS :=                                              \
    $(addsuffix .ml,                                     \
246 247
        boot/version                                     \
        $(addprefix boot/util/, fmt common bits)         \
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
        $(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)

G
Graydon Hoare 已提交
263
BS := $(S)src/boot
264 265 266 267 268 269 270 271

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
272

273 274 275
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
276 277
BOOT_OCAMLOPT_FLAGS := -g $(BOOT_ML_INCS) -w Ael -warn-error Ael

278 279 280 281
ifdef CFG_FLEXLINK
  BOOT_OCAMLOPT_FLAGS += -cclib -L/usr/lib
endif

282 283 284
######################################################################
# Runtime (C++) library variables
######################################################################
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 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
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 已提交
335
               rt/sync/lock_and_signal.h \
336 337 338 339 340 341 342 343 344
               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

345
RUNTIME_DEF := $(S)src/rt/rustrt.def
346 347
RUNTIME_INCS := -I $(S)src/rt/isaac -I $(S)src/rt/uthash
RUNTIME_OBJS := $(RUNTIME_CS:.cpp=.o)
348 349

######################################################################
350
# rustc LLVM-extensions (C++) library variables
351 352
######################################################################

353
RUSTLLVM_CS := $(addprefix rustllvm/, \
354
                MachOObjectFile.cpp Object.cpp RustWrapper.cpp)
355

356 357
RUSTLLVM_HDR := rustllvm/include/llvm-c/Object.h
RUSTLLVM_DEF := $(S)src/rustllvm/rustllvm.def
358

359 360 361 362
RUSTLLVM_INCS := -iquote $(CFG_LLVM_INCDIR) \
                 -iquote $(S)src/rustllvm/include
RUSTLLVM_OBJS := $(RUSTLLVM_CS:.cpp=.o)
RUSTLLVM_LIBS := $(CFG_LLVM_LDFLAGS) $(CFG_LLVM_LIBS)
363

364 365 366 367
######################################################################
# Standard library variables
######################################################################

G
Graydon Hoare 已提交
368
STDLIB_CRATE := $(S)src/lib/std.rc
369
STDLIB_INPUTS := $(wildcard $(addprefix $(S)src/lib/,*.rc *.rs */*.rs))
370 371

######################################################################
372
# rustc crate variables
373 374
######################################################################

G
Graydon Hoare 已提交
375
COMPILER_CRATE := $(S)src/comp/rustc.rc
376
COMPILER_INPUTS := $(wildcard $(addprefix $(S)src/comp/, \
377 378
                                rustc.rc *.rs */*.rs))

379
######################################################################
G
Graydon Hoare 已提交
380
# Test dependency variables
381 382
######################################################################

383
LREQ := rt/$(CFG_RUNTIME) rustllvm/$(CFG_RUSTLLVM)
384 385 386 387
BREQ := boot/rustboot$(X) boot/$(CFG_STDLIB)
SREQ0 := stage0/rustc$(X) $(LREQ)
SREQ1 := stage1/rustc$(X) $(LREQ)

G
Graydon Hoare 已提交
388

389 390 391
######################################################################
# Single-target rules
######################################################################
392

393
all: boot/rustboot$(X)          \
394
     boot/$(CFG_STDLIB)         \
395
     rt/$(CFG_RUNTIME)          \
396
     rustllvm/$(CFG_RUSTLLVM)   \
397
     stage0/rustc$(X)           \
G
Graydon Hoare 已提交
398
     stage0/glue.o              \
399
     stage0/$(CFG_STDLIB)       \
G
Graydon Hoare 已提交
400 401
     $(GENERATED)               \
     $(DOCS)
402

403
rt/$(CFG_RUNTIME): $(RUNTIME_OBJS) $(MKFILES) $(RUNTIME_HDR) $(RUNTIME_DEF)
404
	@$(call E, link: $@)
405
	$(Q)$(call CFG_LINK_C,$@,$(RUNTIME_OBJS),$(RUNTIME_DEF))
406

407 408
rustllvm/$(CFG_RUSTLLVM): $(RUSTLLVM_OBJS) $(MKFILES) $(RUSTLLVM_HDR) \
                          $(RUSTLLVM_DEF)
409
	@$(call E, link: $@)
410 411
	$(Q)$(call CFG_LINK_C,$@,$(CFG_LLVM_LDFLAGS) $(RUSTLLVM_OBJS) \
          $(CFG_LLVM_LIBS) $(CFG_LLVM_LDFLAGS),$(RUSTLLVM_DEF))
412 413

ifdef CFG_BOOT_NATIVE
414
boot/rustboot$(X): $(BOOT_CMXS) $(MKFILES)
415 416
	@$(call E, link: $@)
	$(Q)ocamlopt$(OPT) -o $@ $(BOOT_OCAMLOPT_FLAGS) $(BOOT_ML_NATIVE_LIBS) \
417 418
        $(BOOT_CMXS)
else
419
boot/rustboot$(X): $(BOOT_CMOS) $(MKFILES)
420
	@$(call E, link: $@)
421
	$(Q)ocamlc$(OPT) -o $@ $(BOOT_OCAMLC_FLAGS) $(BOOT_ML_LIBS) $(BOOT_CMOS)
422 423
endif

424 425
boot/version.ml: $(MKFILES)
	@$(call E, git: $@)
426 427
	$(Q)(cd $(S) && git log -1 \
      --pretty=format:'let version = "prerelease (%h %ci)";;') >$@ || exit 1
428

G
Graydon Hoare 已提交
429

430

G
Graydon Hoare 已提交
431
boot/$(CFG_STDLIB): $(STDLIB_CRATE) $(STDLIB_INPUTS) \
432
                    boot/rustboot$(X) $(MKFILES)
433 434 435
	@$(call E, compile: $@)
	$(BOOT) -shared -o $@ $<

G
Graydon Hoare 已提交
436
stage0/$(CFG_STDLIB): $(STDLIB_CRATE) $(STDLIB_INPUTS) \
G
Graydon Hoare 已提交
437 438 439 440
                      stage0/rustc$(X) $(MKFILES)
	@$(call E, compile: $@)
	$(STAGE0) -shared -o $@ $<

G
Graydon Hoare 已提交
441
stage1/$(CFG_STDLIB): $(STDLIB_CRATE) $(STDLIB_INPUTS) \
442 443 444 445
                      stage1/rustc$(X) $(MKFILES)
	@$(call E, compile: $@)
	$(STAGE1) -shared -o $@ $<

G
Graydon Hoare 已提交
446
stage2/$(CFG_STDLIB): $(STDLIB_CRATE) $(STDLIB_INPUTS) \
447 448 449 450 451
                      stage2/rustc$(X) $(MKFILES)
	@$(call E, compile: $@)
	$(STAGE2) -shared -o $@ $<


G
Graydon Hoare 已提交
452

G
Graydon Hoare 已提交
453
stage0/rustc$(X): $(COMPILER_CRATE) $(COMPILER_INPUTS) \
454
                  $(BREQ)
455 456 457 458
	@$(call E, compile: $@)
	$(BOOT) -minimal -o $@ $<
	$(Q)chmod 0755 $@

G
Graydon Hoare 已提交
459
stage1/rustc$(X): $(COMPILER_CRATE) $(COMPILER_INPUTS) \
460
                  $(SREQ0) stage0/$(CFG_STDLIB)
G
Graydon Hoare 已提交
461 462 463 464
	@$(call E, compile: $@)
	$(STAGE0) -o $@ $<
	$(Q)chmod 0755 $@

G
Graydon Hoare 已提交
465
stage2/rustc$(X): $(COMPILER_CRATE) $(COMPILER_INPUTS) \
466 467 468 469 470 471
                  $(SREQ1) stage1/$(CFG_STDLIB)
	@$(call E, compile: $@)
	$(STAGE1) -o $@ $<
	$(Q)chmod 0755 $@


G
Graydon Hoare 已提交
472

G
Graydon Hoare 已提交
473
stage0/glue.bc: stage0/rustc$(X) stage0/$(CFG_STDLIB) \
474
                rustllvm/$(CFG_RUSTLLVM) rt/$(CFG_RUNTIME)
475 476
	@$(call E, generate: $@)
	$(STAGE0) -o $@ -glue
477

G
Graydon Hoare 已提交
478
stage1/glue.bc: stage1/rustc$(X) stage1/$(CFG_STDLIB) \
479
                rustllvm/$(CFG_RUSTLLVM) rt/$(CFG_RUNTIME)
G
Graydon Hoare 已提交
480 481 482
	@$(call E, generate: $@)
	$(STAGE1) -o $@ -glue

483
stage2/glue.bc: stage2/rustc$(X) stage2/$(CFG_STDLIB) \
484
                rustllvm/$(CFG_RUSTLLVM) rt/$(CFG_RUNTIME)
485 486 487
	@$(call E, generate: $@)
	$(STAGE2) -o $@ -glue

488
######################################################################
489
# Library and boot rules
490 491 492 493 494 495
######################################################################

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

496
rustllvm/%.o: rustllvm/%.cpp $(MKFILES)
497
	@$(call E, compile: $@)
498
	$(Q)$(call CFG_COMPILE_C, $@, $(CFG_LLVM_CXXFLAGS) $(RUSTLLVM_INCS)) $<
499

500 501
%.cmo: %.ml $(MKFILES)
	@$(call E, compile: $@)
502
	$(Q)ocamlc$(OPT) -c -o $@ $(BOOT_OCAMLC_FLAGS) $<
503 504

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

506 507 508 509 510 511 512
%.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 $@ $<
513

514

G
Graydon Hoare 已提交
515 516 517 518 519
######################################################################
# Doc rules
######################################################################

doc/version.texi: $(MKFILES) rust.texi
520 521
	(cd $(S) && git log -1 \
      --pretty=format:'@macro gitversion%n%h %ci%n@end macro%n') >$@
G
Graydon Hoare 已提交
522 523 524 525 526 527 528 529 530 531 532

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 已提交
533 534 535 536
######################################################################
# Testing variables
######################################################################

537 538
# Float doesn't work in boot

539
FLOAT_XFAILS := $(S)src/test/run-pass/float.rs \
540 541
                $(S)src/test/run-pass/float2.rs \
                $(S)src/test/run-pass/float-signature.rs
542

G
Graydon Hoare 已提交
543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560
# 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 \
561
                 task-comm-chan-nil.rs \
G
Graydon Hoare 已提交
562 563 564 565 566 567 568
                 task-life-0.rs \
                 alt-type-simple.rs \
                 many.rs)

TEST_XFAILS_BOOT := $(TASK_XFAILS) \
                    $(NOMINAL_TAG_XFAILS) \
                    $(CONST_TAG_XFAILS) \
569
                    $(FLOAT_XFAILS) \
G
Graydon Hoare 已提交
570 571 572 573 574 575 576 577 578 579
                    $(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 \
G
Graydon Hoare 已提交
580
                      empty-mutable-vec.rs \
G
Graydon Hoare 已提交
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
                      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)

609 610
TEST_XFAILS_STAGE0 := $(FLOAT_XFAILS) \
                      $(addprefix $(S)src/test/run-pass/, \
G
Graydon Hoare 已提交
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 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756
                        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 := \
757 758
  $(subst $(S)src/,,$(TEST_RPASS_CRATES_BOOT:.rc=.boot$(X))) \
  $(subst $(S)src/,,$(TEST_RPASS_SOURCES_BOOT:.rs=.boot$(X)))
G
Graydon Hoare 已提交
759
TEST_RPASS_EXES_STAGE0 := \
760 761
  $(subst $(S)src/,,$(TEST_RPASS_CRATES_STAGE0:.rc=.stage0$(X))) \
  $(subst $(S)src/,,$(TEST_RPASS_SOURCES_STAGE0:.rs=.stage0$(X)))
G
Graydon Hoare 已提交
762 763

TEST_RPASS_OUTS_BOOT  := \
764
  $(TEST_RPASS_EXES_BOOT:.boot$(X)=.boot.out)
G
Graydon Hoare 已提交
765
TEST_RPASS_OUTS_STAGE0 := \
766
  $(TEST_RPASS_EXES_STAGE0:.stage0$(X)=.stage0.out)
G
Graydon Hoare 已提交
767 768 769 770

TEST_RPASS_TMPS_BOOT  := \
  $(TEST_RPASS_EXES_BOOT:.boot$(X)=.boot$(X).tmp)
TEST_RPASS_TMPS_STAGE0 := \
771
  $(TEST_RPASS_EXES_STAGE0:.stage0$(X)=.stage0$(X).tmp)
G
Graydon Hoare 已提交
772 773 774 775 776 777 778 779


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 := \
780 781
  $(subst $(S)src/,,$(TEST_RFAIL_CRATES_BOOT:.rc=.boot$(X))) \
  $(subst $(S)src/,,$(TEST_RFAIL_SOURCES_BOOT:.rs=.boot$(X)))
G
Graydon Hoare 已提交
782
TEST_RFAIL_EXES_STAGE0 := \
783 784
  $(subst $(S)src/,,$(TEST_RFAIL_CRATES_STAGE0:.rc=.stage0$(X))) \
  $(subst $(S)src/,,$(TEST_RFAIL_SOURCES_STAGE0:.rs=.stage0$(X)))
G
Graydon Hoare 已提交
785 786

TEST_RFAIL_OUTS_BOOT  := \
787
  $(TEST_RFAIL_EXES_BOOT:.boot$(X)=.boot.out)
G
Graydon Hoare 已提交
788
TEST_RFAIL_OUTS_STAGE0 := \
789
  $(TEST_RFAIL_EXES_STAGE0:.stage0$(X)=.stage0.out)
G
Graydon Hoare 已提交
790 791 792 793

TEST_RFAIL_TMPS_BOOT  := \
  $(TEST_RFAIL_EXES_BOOT:.boot$(X)=.boot$(X).tmp)
TEST_RFAIL_TMPS_STAGE0 := \
794
  $(TEST_RFAIL_EXES_STAGE0:.stage0$(X)=.stage0$(X).tmp)
G
Graydon Hoare 已提交
795 796 797 798 799 800 801 802


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 := \
803 804
  $(subst $(S)src/,,$(TEST_CFAIL_CRATES_BOOT:.rc=.boot$(X))) \
  $(subst $(S)src/,,$(TEST_CFAIL_SOURCES_BOOT:.rs=.boot$(X)))
G
Graydon Hoare 已提交
805
TEST_CFAIL_EXES_STAGE0 := \
806
  $(subst $(S)src/,,$(TEST_CFAIL_CRATES_STAGE0:.rc=.stage0$(X))) \
807
  $(subst $(S)src/,,$(TEST_CFAIL_SOURCES_STAGE0:.rs=.stage0$(X)))
G
Graydon Hoare 已提交
808 809

TEST_CFAIL_OUTS_BOOT := \
810
  $(TEST_CFAIL_EXES_BOOT:.boot$(X)=.boot.out)
G
Graydon Hoare 已提交
811
TEST_CFAIL_OUTS_STAGE0 := \
812
  $(TEST_CFAIL_EXES_STAGE0:.stage0$(X)=.stage0.out)
G
Graydon Hoare 已提交
813 814 815 816

TEST_CFAIL_TMPS_BOOT := \
  $(TEST_CFAIL_EXES_BOOT:.boot$(X)=.boot$(X).tmp)
TEST_CFAIL_TMPS_STAGE0 := \
817
  $(TEST_CFAIL_EXES_STAGE0:.stage0$(X)=.stage0$(X).tmp)
G
Graydon Hoare 已提交
818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859


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)


860 861 862 863
######################################################################
# Testing rules
######################################################################

864
%.stage0$(X): %.stage0.o rt/$(CFG_RUNTIME) stage0/glue.o
865 866
	@$(call E, link [gcc]: $@)
	$(Q)gcc $(CFG_GCC_CFLAGS) stage0/glue.o -o $@ $< -Lstage0 -Lrt -lrustrt
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 rt/$(CFG_RUNTIME) stage1/glue.o
873 874
	@$(call E, link [gcc]: $@)
	$(Q)gcc $(CFG_GCC_CFLAGS) stage1/glue.o -o $@ $< -Lstage1 -Lrt -lrustrt
875 876 877
	@# 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 已提交
878
	-$(Q)$(CFG_DSYMUTIL) $@
879

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



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

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

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

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

906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923
%.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 已提交
924 925 926 927 928 929 930 931 932 933 934 935
%.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 $@ $<

936 937 938 939 940 941
# Cancel the implicit .out rule in GNU make.
%.out: %

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

G
Graydon Hoare 已提交
942
test/run-pass/%.out.tmp: test/run-pass/%$(X) rt/$(CFG_RUNTIME)
943 944
	$(Q)rm -f $<.tmp
	@$(call E, run: $@)
945
	$(Q)$(call CFG_RUN_TEST, $<) > $@
946 947 948 949 950

test/bench/shootout/%.out.tmp: test/bench/shootout/%$(X) \
                               rt/$(CFG_RUNTIME)
	$(Q)rm -f $<.tmp
	@$(call E, run: $@)
951
	$(Q)$(call CFG_RUN_TEST, $<) > $@
952 953 954 955 956

test/bench/99-bottles/%.out.tmp: test/bench/99-bottles/%$(X) \
                                 rt/$(CFG_RUNTIME)
	$(Q)rm -f $<.tmp
	@$(call E, run: $@)
957
	$(Q)$(call CFG_RUN_TEST, $<) > $@
958 959 960 961 962 963 964

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 $@
965
	$(Q)$(call CFG_RUN_TEST, $<) >$@ 2>&1 ; X=$$? ; \
966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986
      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')" $@

987 988 989 990 991 992 993 994 995 996 997 998 999 1000

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

ML_DEPFILES := $(BOOT_MLS:%.ml=%.d)
C_DEPFILES := $(RUNTIME_CS:%.cpp=%.d) $(RUSTLLVM_CS:%.cpp=%.d)

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
1001
	$(Q)rm -f $@.tmp.bak
1002 1003 1004 1005 1006 1007 1008 1009
	$(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
1010
	$(Q)rm -f $@.tmp.bak
1011 1012 1013 1014 1015 1016
	$(Q)mv $@.tmp $@

%.d: %.ml $(MKFILES)
	@$(call E, dep: $@)
	$(Q)ocamldep$(OPT) -slash $(BOOT_ML_DEP_INCS) $< >$@.tmp
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
1017 1018 1019
	$(Q)rm -f $@.tmp.bak
	$(Q)perl -i.bak -pe "s@$(S)src/@@go" $@.tmp
	$(Q)rm -f $@.tmp.bak
1020 1021 1022 1023 1024 1025
	$(Q)mv $@.tmp $@

%.d: %.mli $(MKFILES)
	@$(call E, dep: $@)
	$(Q)ocamldep$(OPT) -slash $(BOOT_ML_DEP_INCS) $< >$@.tmp
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
1026 1027 1028
	$(Q)rm -f $@.tmp.bak
	$(Q)perl -i.bak -pe "s@$(S)src/@@go" $@.tmp
	$(Q)rm -f $@.tmp.bak
1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048
	$(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: $@)
	$(BOOT) -o $(patsubst %.d,%,$@) -shared -rdeps $< >$@.tmp
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
1049
	$(Q)rm -f $@.tmp.bak
1050 1051 1052 1053 1054 1055 1056
	$(Q)mv $@.tmp $@

stage0/rustc$(X).d: $(COMPILER_CRATE) $(COMPILER_INPUTS) \
                    $(STDLIB_CRATE) $(MKFILES) boot/rustboot$(X)
	@$(call E, dep: $@)
	$(BOOT) -o $(patsubst %.d,%,$@) -shared -rdeps $< >$@.tmp
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
1057
	$(Q)rm -f $@.tmp.bak
1058 1059 1060 1061 1062 1063
	$(Q)mv $@.tmp $@

%.d: %.rc $(MKFILES) boot/rustboot$(X)
	@$(call E, dep: $@)
	$(BOOT)  -o $(patsubst %.d,%,$@) -rdeps $< >$@.tmp
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
1064
	$(Q)rm -f $@.tmp.bak
1065 1066 1067 1068 1069 1070 1071 1072 1073
	$(Q)mv $@.tmp $@

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

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

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

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

1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096
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)             \
1097
      $(RUSTLLVM_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_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)
1152
	$(Q)rm -f $(RUNTIME_OBJS)
1153
	$(Q)rm -f $(RUSTLLVM_OBJS)
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 1168 1169 1170
	$(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,                          \
G
Graydon Hoare 已提交
1171
                        $(wildcard test/*/*.$(ext) test/bench/*/*.$(ext)))
G
Graydon Hoare 已提交
1172
	$(Q)rm -Rf $(foreach ext, \
1173
                 aux cp fn ky log pdf html pg toc tp vr cps texi, \
G
Graydon Hoare 已提交
1174
                 $(wildcard doc/*.$(ext)))