Makefile.in 33.9 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 := -O2 -fno-strict-aliasing
15 16
CFG_GCC_LINK_FLAGS :=
CFG_BOOT_FLAGS := $(BOOT_FLAGS)
17
CFG_RUSTC_FLAGS := -nowarn -O
18 19 20 21 22 23 24

# 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
  CFG_DEF_SUFFIX := .bsd.def
35 36 37
endif

ifeq ($(CFG_OSTYPE), Linux)
38
  CFG_LIB_NAME=lib$(1).so
39 40
  CFG_GCC_CFLAGS += -fPIC -march=i686
  CFG_GCC_LINK_FLAGS += -shared -fPIC -ldl -lpthread -lrt
41 42
  CFG_GCC_DEF_FLAG := -Wl,-whole-archive,--export-dynamic,--dynamic-list=
  CFG_GCC_POST_LIB_FLAGS := -Wl,-no-whole-archive
43 44 45 46 47
  ifeq ($(CFG_CPUTYPE), x86_64)
    CFG_GCC_CFLAGS += -m32
    CFG_GCC_LINK_FLAGS += -m32
  endif
  CFG_UNIXY := 1
48
  CFG_LDENV := LD_LIBRARY_PATH
49
  CFG_DEF_SUFFIX := .linux.def
50 51 52
endif

ifeq ($(CFG_OSTYPE), Darwin)
53
  CFG_LIB_NAME=lib$(1).dylib
54
  CFG_UNIXY := 1
55
  CFG_LDENV := DYLD_LIBRARY_PATH
56
  CFG_GCC_LINK_FLAGS += -dynamiclib -lpthread
57
  CFG_GCC_DEF_FLAG := -Wl,-exported_symbols_list,
58 59 60 61 62 63 64
  # 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
65
  CFG_DEF_SUFFIX := .darwin.def
66 67 68 69 70 71
endif

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

72
CFG_LDPATH :=$(CFG_BUILD_DIR)/rt
73
CFG_LDPATH :=$(CFG_LDPATH):$(CFG_BUILD_DIR)/rustllvm
74
CFG_TESTLIB=$(dir $(firstword $(1))):$(patsubst .%,%,$(suffix $(1)))
75
CFG_EXE_TESTLIB=$(call CFG_TESTLIB,$(patsubst %.exe,%,$(1)))
76

77 78 79 80 81
ifdef CFG_WINDOWSY
  CFG_INFO := $(info cfg: windows-y environment)

  CFG_EXE_SUFFIX := .exe
  CFG_LIB_NAME=$(1).dll
82 83
  CFG_LDPATH :=$(CFG_LDPATH):$(CFG_LLVM_BINDIR)
  CFG_LDPATH :=$(CFG_LDPATH):$$PATH
84
  CFG_RUN_TEST=PATH="$(CFG_LDPATH):$(call CFG_EXE_TESTLIB,$(1))" $(1)
85
  CFG_RUN_TARG=PATH="$(CFG_LDPATH)" $(1)
86

87 88
  CFG_PATH_MUNGE := $(strip perl -i.bak -p             \
                           -e 's@\\(\S)@/\1@go;'       \
89
                           -e 's@^/([a-zA-Z])/@\1:/@o;')
90 91 92 93 94
  ifdef CFG_FLEXLINK
    CFG_BOOT_NATIVE := 1
  endif
  CFG_GCC_CFLAGS += -march=i686
  CFG_GCC_LINK_FLAGS += -shared -fPIC
95
  CFG_DEF_SUFFIX := .def
96 97 98 99 100
endif

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

101
  CFG_PATH_MUNGE := true
102
  CFG_EXE_SUFFIX :=
103
  CFG_LDPATH :=$(CFG_LDPATH):$(CFG_LLVM_LIBDIR)
104
  CFG_RUN_TARG=$(CFG_LDENV)=$(CFG_LDPATH) $(1)
105
  CFG_RUN_TEST=\
106
      $(CFG_LDENV)=$(call CFG_TESTLIB,$(1)):$(CFG_LDPATH) \
107
      $(CFG_VALGRIND) $(1)
108 109 110 111 112 113

  CFG_BOOT_NATIVE := 1

  ifdef MINGW_CROSS
    CFG_EXE_SUFFIX := .exe
    CFG_LIB_NAME=$(1).dll
114 115
    CFG_LDPATH :=$(CFG_LDPATH):$(CFG_LLVM_BINDIR)
    CFG_LDPATH :=$(CFG_LDPATH):$$PATH
116
    CFG_RUN_TARG=PATH=$(CFG_LDPATH) $(1)
117
    CFG_RUN_TEST=PATH=$(CFG_LDPATH):$(call CFG_EXE_TESTLIB,$(1)) $(1)
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135

    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 \
136
                    --suppressions=$(CFG_SRC_DIR)src/etc/x86.supp
137 138 139 140
  endif
endif

CFG_RUNTIME :=$(call CFG_LIB_NAME,rustrt)
141
CFG_RUSTLLVM :=$(call CFG_LIB_NAME,rustllvm)
142 143
CFG_STDLIB :=$(call CFG_LIB_NAME,std)

144
CFG_LLC_CFLAGS := -march=x86 -relocation-model=pic
G
Graydon Hoare 已提交
145

146 147 148 149 150 151
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)
152
  CFG_LINK_C = $(CFG_GCC_CROSS)g++ $(CFG_GCC_LINK_FLAGS) -o $(1) \
153
               $(CFG_GCC_DEF_FLAG)$(3) $(2)
154 155 156 157
else
  CFG_ERR := $(error please try on a system with gcc)
endif

158
ifdef CFG_OCAMLC_OPT
159
  $(info cfg: have ocaml native compiler)
160 161
  OPT=.opt
else
162
  $(info cfg: have only ocaml bytecode compiler)
163 164
endif

165 166
ifdef CFG_BOOT_PROFILE
  $(info cfg: forcing native bootstrap compiler (CFG_BOOT_PROFILE))
167
  CFG_BOOT_NATIVE := 1
168 169 170
  CFG_OCAMLOPT_PROFILE_FLAGS := -p
endif

171 172
ifdef CFG_BOOT_DEBUG
  $(info cfg: forcing bytecode bootstrap compiler (CFG_BOOT_DEBUG))
173
  CFG_BOOT_NATIVE :=
174 175
endif

176
ifdef CFG_BOOT_NATIVE
177 178 179 180 181
  $(info cfg: building native bootstrap compiler)
else
  $(info cfg: building bytecode bootstrap compiler)
endif

182 183
ifdef CFG_DISABLE_VALGRIND
  $(info cfg: disabling valgrind (CFG_DISABLE_VALGRIND))
184 185 186
  CFG_VALGRIND :=
endif

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

204 205 206 207
ifdef CFG_DISABLE_DOCS
  $(info cfg: disabling doc build (CFG_DISABLE_DOCS))
  DOCS :=
endif
G
Graydon Hoare 已提交
208

209 210 211 212 213 214 215 216 217 218
######################################################################
# Target-and-rule "utility variables"
######################################################################

ifdef VERBOSE
  Q :=
  E =
else
  Q := @
  E = echo $(1)
219 220
endif

221 222 223 224 225 226 227
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.
228
BOOT := $(Q)OCAMLRUNPARAM="b1" boot/rustboot$(X) $(CFG_BOOT_FLAGS) -L boot
229 230 231 232
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)
233 234 235 236 237 238 239 240 241 242 243

# "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.%
244 245 246 247 248 249 250 251 252 253

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

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

BOOT_MLS :=                                              \
    $(addsuffix .ml,                                     \
254 255
        boot/version                                     \
        $(addprefix boot/util/, fmt common bits)         \
256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
        $(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 已提交
271
BS := $(S)src/boot
272 273 274 275 276 277 278 279

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
280

281 282 283
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
284 285
BOOT_OCAMLOPT_FLAGS := -g $(BOOT_ML_INCS) -w Ael -warn-error Ael

286 287 288 289
ifdef CFG_FLEXLINK
  BOOT_OCAMLOPT_FLAGS += -cclib -L/usr/lib
endif

290 291 292
######################################################################
# Runtime (C++) library variables
######################################################################
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 335 336 337 338 339 340 341 342
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 已提交
343
               rt/sync/lock_and_signal.h \
344 345 346 347 348 349 350 351 352
               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

353
RUNTIME_DEF := rt/rustrt$(CFG_DEF_SUFFIX)
354 355
RUNTIME_INCS := -I $(S)src/rt/isaac -I $(S)src/rt/uthash
RUNTIME_OBJS := $(RUNTIME_CS:.cpp=.o)
356
RUNTIME_LIBS := $(CFG_GCC_POST_LIB_FLAGS)
357 358

######################################################################
359
# rustc LLVM-extensions (C++) library variables
360 361
######################################################################

362
RUSTLLVM_CS := $(addprefix rustllvm/, \
363
                MachOObjectFile.cpp Object.cpp RustWrapper.cpp)
364

365
RUSTLLVM_HDR := rustllvm/include/llvm-c/Object.h
366
RUSTLLVM_DEF := rustllvm/rustllvm$(CFG_DEF_SUFFIX)
367

368 369 370
RUSTLLVM_INCS := -iquote $(CFG_LLVM_INCDIR) \
                 -iquote $(S)src/rustllvm/include
RUSTLLVM_OBJS := $(RUSTLLVM_CS:.cpp=.o)
371 372
RUSTLLVM_LIBS := $(CFG_LLVM_LDFLAGS) $(CFG_LLVM_LIBS) \
                 $(CFG_GCC_POST_LIB_FLAGS)
373

374 375 376 377
######################################################################
# Standard library variables
######################################################################

G
Graydon Hoare 已提交
378
STDLIB_CRATE := $(S)src/lib/std.rc
379
STDLIB_INPUTS := $(wildcard $(addprefix $(S)src/lib/,*.rc *.rs */*.rs))
380 381

######################################################################
382
# rustc crate variables
383 384
######################################################################

G
Graydon Hoare 已提交
385
COMPILER_CRATE := $(S)src/comp/rustc.rc
386
COMPILER_INPUTS := $(wildcard $(addprefix $(S)src/comp/, \
387 388
                                rustc.rc *.rs */*.rs))

389
######################################################################
G
Graydon Hoare 已提交
390
# Test dependency variables
391 392
######################################################################

393
LREQ := rt/$(CFG_RUNTIME) rustllvm/$(CFG_RUSTLLVM)
394
BREQ := boot/rustboot$(X) boot/$(CFG_STDLIB)
395 396 397
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)
398

G
Graydon Hoare 已提交
399

400 401 402
######################################################################
# Single-target rules
######################################################################
403

404
all: boot/rustboot$(X)          \
405
     boot/$(CFG_STDLIB)         \
406
     rt/$(CFG_RUNTIME)          \
407
     rustllvm/$(CFG_RUSTLLVM)   \
408
     stage0/rustc$(X)           \
G
Graydon Hoare 已提交
409
     stage0/glue.o              \
410
     stage0/$(CFG_STDLIB)       \
G
Graydon Hoare 已提交
411 412
     $(GENERATED)               \
     $(DOCS)
413

414
rt/$(CFG_RUNTIME): $(RUNTIME_OBJS) $(MKFILES) $(RUNTIME_HDR) $(RUNTIME_DEF)
415
	@$(call E, link: $@)
416
	$(Q)$(call CFG_LINK_C,$@,$(RUNTIME_LIBS) $(RUNTIME_OBJS),$(RUNTIME_DEF))
417

418 419
rustllvm/$(CFG_RUSTLLVM): $(RUSTLLVM_OBJS) $(MKFILES) $(RUSTLLVM_HDR) \
                          $(RUSTLLVM_DEF)
420
	@$(call E, link: $@)
421
	$(Q)$(call CFG_LINK_C,$@,$(RUSTLLVM_LIBS) $(RUSTLLVM_OBJS) \
422
          $(CFG_LLVM_LIBS) $(CFG_LLVM_LDFLAGS),$(RUSTLLVM_DEF))
423 424

ifdef CFG_BOOT_NATIVE
425
boot/rustboot$(X): $(BOOT_CMXS) $(MKFILES)
426 427
	@$(call E, link: $@)
	$(Q)ocamlopt$(OPT) -o $@ $(BOOT_OCAMLOPT_FLAGS) $(BOOT_ML_NATIVE_LIBS) \
428 429
        $(BOOT_CMXS)
else
430
boot/rustboot$(X): $(BOOT_CMOS) $(MKFILES)
431
	@$(call E, link: $@)
432
	$(Q)ocamlc$(OPT) -o $@ $(BOOT_OCAMLC_FLAGS) $(BOOT_ML_LIBS) $(BOOT_CMOS)
433 434
endif

435 436
boot/version.ml: $(MKFILES)
	@$(call E, git: $@)
437 438
	$(Q)(cd $(S) && git log -1 \
      --pretty=format:'let version = "prerelease (%h %ci)";;') >$@ || exit 1
439

G
Graydon Hoare 已提交
440

441

G
Graydon Hoare 已提交
442
boot/$(CFG_STDLIB): $(STDLIB_CRATE) $(STDLIB_INPUTS) \
443
                    boot/rustboot$(X) $(MKFILES)
444 445 446
	@$(call E, compile: $@)
	$(BOOT) -shared -o $@ $<

447
stage0/std.bc: $(STDLIB_CRATE) $(STDLIB_INPUTS) stage0/rustc$(X) $(MKFILES)
G
Graydon Hoare 已提交
448 449 450
	@$(call E, compile: $@)
	$(STAGE0) -shared -o $@ $<

451 452 453 454 455 456
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

stage1/std.bc: $(STDLIB_CRATE) $(STDLIB_INPUTS) stage1/rustc$(X) $(MKFILES)
457 458 459
	@$(call E, compile: $@)
	$(STAGE1) -shared -o $@ $<

460 461 462 463 464 465
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

stage2/std.bc: $(STDLIB_CRATE) $(STDLIB_INPUTS) stage2/rustc$(X) $(MKFILES)
466 467 468
	@$(call E, compile: $@)
	$(STAGE2) -shared -o $@ $<

469 470 471 472 473
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

474

G
Graydon Hoare 已提交
475

476
stage0/rustc$(X): $(COMPILER_CRATE) $(COMPILER_INPUTS) $(BREQ)
477 478 479 480
	@$(call E, compile: $@)
	$(BOOT) -minimal -o $@ $<
	$(Q)chmod 0755 $@

481
stage1/rustc$(X): $(COMPILER_CRATE) $(COMPILER_INPUTS) $(SREQ0)
G
Graydon Hoare 已提交
482 483 484 485
	@$(call E, compile: $@)
	$(STAGE0) -o $@ $<
	$(Q)chmod 0755 $@

486
stage2/rustc$(X): $(COMPILER_CRATE) $(COMPILER_INPUTS) $(SREQ1)
487 488 489 490 491
	@$(call E, compile: $@)
	$(STAGE1) -o $@ $<
	$(Q)chmod 0755 $@


G
Graydon Hoare 已提交
492

493
stage0/glue.bc: stage0/rustc$(X) boot/$(CFG_STDLIB) \
494
                rustllvm/$(CFG_RUSTLLVM) rt/$(CFG_RUNTIME)
495 496
	@$(call E, generate: $@)
	$(STAGE0) -o $@ -glue
497

498
stage1/glue.bc: stage1/rustc$(X) stage0/$(CFG_STDLIB) \
499
                rustllvm/$(CFG_RUSTLLVM) rt/$(CFG_RUNTIME)
G
Graydon Hoare 已提交
500 501 502
	@$(call E, generate: $@)
	$(STAGE1) -o $@ -glue

503
stage2/glue.bc: stage2/rustc$(X) stage1/$(CFG_STDLIB) \
504
                rustllvm/$(CFG_RUSTLLVM) rt/$(CFG_RUNTIME)
505 506 507
	@$(call E, generate: $@)
	$(STAGE2) -o $@ -glue

508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539
# 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
	@$(call E, assemble [llvm]: $@)
	$(Q)gcc $(CFG_GCC_CFLAGS) -o $@ -c $<

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

stage1/%.o: stage1/%.s
	@$(call E, assemble [llvm]: $@)
	$(Q)gcc $(CFG_GCC_CFLAGS) -o $@ -c $<

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

stage2/%.o: stage2/%.s
	@$(call E, assemble [llvm]: $@)
	$(Q)gcc $(CFG_GCC_CFLAGS) -o $@ -c $<

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



540
######################################################################
541
# Library and boot rules
542 543 544 545 546 547
######################################################################

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

548
rustllvm/%.o: rustllvm/%.cpp $(MKFILES)
549
	@$(call E, compile: $@)
550
	$(Q)$(call CFG_COMPILE_C, $@, $(CFG_LLVM_CXXFLAGS) $(RUSTLLVM_INCS)) $<
551

552 553
%.cmo: %.ml $(MKFILES)
	@$(call E, compile: $@)
554
	$(Q)ocamlc$(OPT) -c -o $@ $(BOOT_OCAMLC_FLAGS) $<
555 556

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

558 559 560 561 562 563 564
%.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 $@ $<
565

566

567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584
%.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 已提交
585 586 587 588 589
######################################################################
# Doc rules
######################################################################

doc/version.texi: $(MKFILES) rust.texi
590 591
	(cd $(S) && git log -1 \
      --pretty=format:'@macro gitversion%n%h %ci%n@end macro%n') >$@
G
Graydon Hoare 已提交
592 593 594 595 596 597 598 599 600 601 602

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 已提交
603 604 605 606
######################################################################
# Testing variables
######################################################################

607 608 609 610 611 612
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))
G
Graydon Hoare 已提交
613 614 615 616 617 618 619 620 621 622

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

623
BENCH_RS = $(wildcard $(S)src/test/bench/shootout/*.rs) \
G
Graydon Hoare 已提交
624
            $(wildcard $(S)src/test/bench/99-bottles/*.rs)
625 626 627 628 629 630
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 已提交
631 632

ifdef CHECK_XFAILS
633 634 635 636
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))
G
Graydon Hoare 已提交
637
else
638 639 640 641
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))
G
Graydon Hoare 已提交
642 643
endif

644
TEST_RPASS_EXES_BOOT = \
645 646
  $(subst $(S)src/,,$(TEST_RPASS_CRATES_BOOT:.rc=.boot$(X))) \
  $(subst $(S)src/,,$(TEST_RPASS_SOURCES_BOOT:.rs=.boot$(X)))
647
TEST_RPASS_EXES_STAGE0 = \
648 649
  $(subst $(S)src/,,$(TEST_RPASS_CRATES_STAGE0:.rc=.stage0$(X))) \
  $(subst $(S)src/,,$(TEST_RPASS_SOURCES_STAGE0:.rs=.stage0$(X)))
G
Graydon Hoare 已提交
650

651
TEST_RPASS_OUTS_BOOT  = \
652
  $(TEST_RPASS_EXES_BOOT:.boot$(X)=.boot.out)
653
TEST_RPASS_OUTS_STAGE0 = \
654
  $(TEST_RPASS_EXES_STAGE0:.stage0$(X)=.stage0.out)
G
Graydon Hoare 已提交
655

656
TEST_RPASS_TMPS_BOOT  = \
G
Graydon Hoare 已提交
657
  $(TEST_RPASS_EXES_BOOT:.boot$(X)=.boot$(X).tmp)
658
TEST_RPASS_TMPS_STAGE0 = \
659
  $(TEST_RPASS_EXES_STAGE0:.stage0$(X)=.stage0$(X).tmp)
G
Graydon Hoare 已提交
660 661


662 663 664 665
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))
G
Graydon Hoare 已提交
666

667
TEST_RFAIL_EXES_BOOT = \
668 669
  $(subst $(S)src/,,$(TEST_RFAIL_CRATES_BOOT:.rc=.boot$(X))) \
  $(subst $(S)src/,,$(TEST_RFAIL_SOURCES_BOOT:.rs=.boot$(X)))
670
TEST_RFAIL_EXES_STAGE0 = \
671 672
  $(subst $(S)src/,,$(TEST_RFAIL_CRATES_STAGE0:.rc=.stage0$(X))) \
  $(subst $(S)src/,,$(TEST_RFAIL_SOURCES_STAGE0:.rs=.stage0$(X)))
G
Graydon Hoare 已提交
673

674
TEST_RFAIL_OUTS_BOOT  = \
675
  $(TEST_RFAIL_EXES_BOOT:.boot$(X)=.boot.out)
676
TEST_RFAIL_OUTS_STAGE0 = \
677
  $(TEST_RFAIL_EXES_STAGE0:.stage0$(X)=.stage0.out)
G
Graydon Hoare 已提交
678

679
TEST_RFAIL_TMPS_BOOT  = \
G
Graydon Hoare 已提交
680
  $(TEST_RFAIL_EXES_BOOT:.boot$(X)=.boot$(X).tmp)
681
TEST_RFAIL_TMPS_STAGE0 = \
682
  $(TEST_RFAIL_EXES_STAGE0:.stage0$(X)=.stage0$(X).tmp)
G
Graydon Hoare 已提交
683 684


685 686 687 688
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))
G
Graydon Hoare 已提交
689

690
TEST_CFAIL_EXES_BOOT = \
691 692
  $(subst $(S)src/,,$(TEST_CFAIL_CRATES_BOOT:.rc=.boot$(X))) \
  $(subst $(S)src/,,$(TEST_CFAIL_SOURCES_BOOT:.rs=.boot$(X)))
693
TEST_CFAIL_EXES_STAGE0 = \
694
  $(subst $(S)src/,,$(TEST_CFAIL_CRATES_STAGE0:.rc=.stage0$(X))) \
695
  $(subst $(S)src/,,$(TEST_CFAIL_SOURCES_STAGE0:.rs=.stage0$(X)))
G
Graydon Hoare 已提交
696

697
TEST_CFAIL_OUTS_BOOT = \
698
  $(TEST_CFAIL_EXES_BOOT:.boot$(X)=.boot.out)
699
TEST_CFAIL_OUTS_STAGE0 = \
700
  $(TEST_CFAIL_EXES_STAGE0:.stage0$(X)=.stage0.out)
G
Graydon Hoare 已提交
701

702
TEST_CFAIL_TMPS_BOOT = \
G
Graydon Hoare 已提交
703
  $(TEST_CFAIL_EXES_BOOT:.boot$(X)=.boot$(X).tmp)
704
TEST_CFAIL_TMPS_STAGE0 = \
705
  $(TEST_CFAIL_EXES_STAGE0:.stage0$(X)=.stage0$(X).tmp)
G
Graydon Hoare 已提交
706 707


708
ALL_TEST_CRATES = $(TEST_CFAIL_CRATES_BOOT) \
G
Graydon Hoare 已提交
709 710 711 712 713 714
                   $(TEST_RFAIL_CRATES_BOOT) \
                   $(TEST_RPASS_CRATES_BOOT) \
                   $(TEST_CFAIL_CRATES_STAGE0) \
                   $(TEST_RFAIL_CRATES_STAGE0) \
                   $(TEST_RPASS_CRATES_STAGE0)

715
ALL_TEST_SOURCES = $(TEST_CFAIL_SOURCES_BOOT) \
G
Graydon Hoare 已提交
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
                    $(TEST_RFAIL_SOURCES_BOOT) \
                    $(TEST_RPASS_SOURCES_BOOT) \
                    $(TEST_CFAIL_SOURCES_STAGE0) \
                    $(TEST_RFAIL_SOURCES_STAGE0) \
                    $(TEST_RPASS_SOURCES_STAGE0)

# 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)


744 745 746 747
######################################################################
# Testing rules
######################################################################

748
%.stage0$(X): %.stage0.o  $(SREQ0)
749
	@$(call E, link [gcc]: $@)
750 751
	$(Q)gcc $(CFG_GCC_CFLAGS) stage0/glue.o -o $@ $< \
      -Lstage0 -Lrt -lrustrt -lstd
752 753 754
	@# 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 已提交
755
	-$(Q)$(CFG_DSYMUTIL) $@
756

757
%.stage1(X): %.stage1.o $(SREQ1)
758
	@$(call E, link [gcc]: $@)
759 760
	$(Q)gcc $(CFG_GCC_CFLAGS) stage1/glue.o -o $@ $< \
      -Lstage1 -Lrt -lrustrt -lstd
761 762 763
	@# 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 已提交
764
	-$(Q)$(CFG_DSYMUTIL) $@
765

766
%.stage2$(X): %.stage2.o $(SREQ2)
767
	@$(call E, link [gcc]: $@)
768 769
	$(Q)gcc $(CFG_GCC_CFLAGS) stage2/glue.o -o $@ $< \
      -Lstage2 -Lrt -lrustrt -lstd
770 771 772
	@# 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 已提交
773
	-$(Q)$(CFG_DSYMUTIL) $@
774 775 776 777 778 779 780 781 782 783 784



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

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

785 786 787 788 789 790 791 792
%.stage0.bc: %.rc $(SREQ0)
	@$(call E, compile [stage0]: $@)
	$(STAGE0) -o $@ $<

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

793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810
%.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 已提交
811 812 813 814 815 816 817 818 819 820 821 822
%.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 $@ $<

823 824 825 826 827 828
# Cancel the implicit .out rule in GNU make.
%.out: %

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

G
Graydon Hoare 已提交
829
test/run-pass/%.out.tmp: test/run-pass/%$(X) rt/$(CFG_RUNTIME)
830 831
	$(Q)rm -f $<.tmp
	@$(call E, run: $@)
832
	$(Q)$(call CFG_RUN_TEST, $<) > $@
833 834 835 836 837

test/bench/shootout/%.out.tmp: test/bench/shootout/%$(X) \
                               rt/$(CFG_RUNTIME)
	$(Q)rm -f $<.tmp
	@$(call E, run: $@)
838
	$(Q)$(call CFG_RUN_TEST, $<) > $@
839 840 841 842 843

test/bench/99-bottles/%.out.tmp: test/bench/99-bottles/%$(X) \
                                 rt/$(CFG_RUNTIME)
	$(Q)rm -f $<.tmp
	@$(call E, run: $@)
844
	$(Q)$(call CFG_RUN_TEST, $<) > $@
845 846 847 848 849 850 851

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 $@
852
	$(Q)$(call CFG_RUN_TEST, $<) >$@ 2>&1 ; X=$$? ; \
853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873
      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')" $@

874 875 876 877 878 879 880 881 882 883 884 885 886 887

######################################################################
# 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
888
	$(Q)rm -f $@.tmp.bak
889 890 891 892 893 894 895 896
	$(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
897
	$(Q)rm -f $@.tmp.bak
898 899 900 901 902 903
	$(Q)mv $@.tmp $@

%.d: %.ml $(MKFILES)
	@$(call E, dep: $@)
	$(Q)ocamldep$(OPT) -slash $(BOOT_ML_DEP_INCS) $< >$@.tmp
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
904 905 906
	$(Q)rm -f $@.tmp.bak
	$(Q)perl -i.bak -pe "s@$(S)src/@@go" $@.tmp
	$(Q)rm -f $@.tmp.bak
907 908 909 910 911 912
	$(Q)mv $@.tmp $@

%.d: %.mli $(MKFILES)
	@$(call E, dep: $@)
	$(Q)ocamldep$(OPT) -slash $(BOOT_ML_DEP_INCS) $< >$@.tmp
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
913 914 915
	$(Q)rm -f $@.tmp.bak
	$(Q)perl -i.bak -pe "s@$(S)src/@@go" $@.tmp
	$(Q)rm -f $@.tmp.bak
916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933
	$(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: $@)
934
	$(BOOT) -o $(patsubst %.d,%$(X),$@) -shared -rdeps $< >$@.tmp
935
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
936
	$(Q)rm -f $@.tmp.bak
937 938 939 940 941
	$(Q)mv $@.tmp $@

stage0/rustc$(X).d: $(COMPILER_CRATE) $(COMPILER_INPUTS) \
                    $(STDLIB_CRATE) $(MKFILES) boot/rustboot$(X)
	@$(call E, dep: $@)
942
	$(BOOT) -o $(patsubst %.d,%$(X),$@) -shared -rdeps $< >$@.tmp
943
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
944
	$(Q)rm -f $@.tmp.bak
945 946 947 948
	$(Q)mv $@.tmp $@

%.d: %.rc $(MKFILES) boot/rustboot$(X)
	@$(call E, dep: $@)
949
	$(BOOT)  -o $(patsubst %.d,%$(X),$@) -rdeps $< >$@.tmp
950
	$(Q)$(CFG_PATH_MUNGE) $@.tmp
951
	$(Q)rm -f $@.tmp.bak
952 953 954 955 956 957 958 959 960
	$(Q)mv $@.tmp $@

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

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

961 962 963 964 965 966 967 968 969 970

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

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


971 972 973 974 975 976 977 978 979
######################################################################
# Distribution
######################################################################

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

980 981 982 983 984 985
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

986
PKG_FILES = \
987 988 989 990 991 992 993
    $(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)             \
994
      $(RUSTLLVM_CS) $(RUSTLLVM_HDR)           \
995
      $(PKG_3RDPARTY))                         \
G
Graydon Hoare 已提交
996 997
    $(GENERATED)                               \
    $(S)src/boot/fe/lexer.ml                   \
998 999 1000 1001 1002 1003 1004
    $(COMPILER_INPUTS)                         \
    $(STDLIB_INPUTS)                           \
    $(ALL_TEST_INPUTS)                         \
    $(GENERATED)

dist: $(PKG_TAR)

G
Graydon Hoare 已提交
1005
$(PKG_TAR): $(GENERATED)
1006 1007 1008 1009 1010 1011 1012 1013
	@$(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 已提交
1014 1015 1016 1017
	$(Q)rm -Rf dist
	$(Q)mkdir -p dist
	@$(call E, unpacking $(PKG_TAR) in dist/$(PKG_DIR))
	$(Q)cd dist && tar -xzf ../$(PKG_TAR)
1018
	@$(call E, configuring in dist/$(PKG_DIR)-build)
G
Graydon Hoare 已提交
1019
	$(Q)mkdir -p dist/$(PKG_DIR)-build
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030
	$(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 -----------------------------------------------

1031 1032 1033 1034 1035 1036 1037

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

.PHONY: clean

1038 1039
tidy:
	@$(call E, check: formatting)
1040
	$(Q)echo \
G
Graydon Hoare 已提交
1041
      $(filter-out $(GENERATED) $(addprefix $(S)src/, $(GENERATED)) \
1042 1043
        $(addprefix $(S)src/, $(RUSTLLVM_CS) $(RUSTLLVM_HDR) \
          $(PKG_3RDPARTY)) \
1044 1045
        $(S)src/etc/%, $(PKG_FILES)) \
    | xargs -n 10 python $(S)src/etc/tidy.py
1046

1047 1048
clean:
	@$(call E, cleaning)
G
Graydon Hoare 已提交
1049 1050
	$(Q)rm -f $(RUNTIME_OBJS) $(RUNTIME_DEF)
	$(Q)rm -f $(RUSTLLVM_OBJS) $(RUSTLLVM_DEF)
1051 1052 1053 1054 1055 1056 1057 1058 1059 1060
	$(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*
1061
	$(Q)rm -f rustllvm/$(CFG_RUSTLLVM) rt/$(CFG_RUNTIME)
1062 1063 1064
	$(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 已提交
1065
	$(Q)rm -f $(foreach ext,o a d bc s exe,$(wildcard stage*/*.$(ext)))
1066 1067 1068
	$(Q)rm -Rf $(foreach ext,out out.tmp                               \
                             boot$(X) stage0$(X) stage1$(X) stage2$(X) \
                             bc o s exe dSYM,                          \
G
Graydon Hoare 已提交
1069
                        $(wildcard test/*/*.$(ext) test/bench/*/*.$(ext)))
G
Graydon Hoare 已提交
1070
	$(Q)rm -Rf $(foreach ext, \
1071
                 aux cp fn ky log pdf html pg toc tp vr cps, \
G
Graydon Hoare 已提交
1072
                 $(wildcard doc/*.$(ext)))
1073
	$(Q)rm -Rf doc/version.texi