###################################################################### # Residual auto-configuration ###################################################################### include config.mk MKFILES := Makefile config.mk $(wildcard $(CFG_SRC_DIR)/mk/*.mk) MKFILES += $(CFG_SRC_DIR)/src/rt/libuv/Makefile MKFILES += $(wildcard $(CFG_SRC_DIR)/src/rt/libuv/*.mk) ifneq ($(MAKE_RESTARTS),) CFG_INFO := $(info cfg: make restarts: $(MAKE_RESTARTS)) endif CFG_INFO := $(info cfg: shell host triple $(CFG_HOST_TRIPLE)) CFG_INFO := $(info cfg: llvm host triple $(CFG_LLVM_TRIPLE)) CFG_INFO := $(info cfg: llvm target triples $(CFG_LLVM_TRIPLES)) ifdef CFG_DISABLE_OPTIMIZE $(info cfg: disabling rustc optimization (CFG_DISABLE_OPTIMIZE)) CFG_RUSTC_FLAGS := else CFG_RUSTC_FLAGS := -O endif ifdef SAVE_TEMPS CFG_RUSTC_FLAGS += --save-temps endif ifdef TIME_PASSES CFG_RUSTC_FLAGS += --time-passes endif ifdef TIME_LLVM_PASSES CFG_RUSTC_FLAGS += --time-llvm-passes endif ifdef NO_TYPESTATE CFG_RUSTC_FLAGS += --no-typestate endif ifdef DEBUG CFG_RUSTC_FLAGS += -g endif # platform-specific auto-configuration include $(CFG_SRC_DIR)/mk/platform.mk # Run the stage1/2 compilers under valgrind ifdef VALGRIND_COMPILE CFG_VALGRIND_COMPILE :=$(CFG_VALGRIND) else CFG_VALGRIND_COMPILE := endif CFG_RUNTIME :=$(call CFG_LIB_NAME,rustrt) CFG_RUSTLLVM :=$(call CFG_LIB_NAME,rustllvm) CFG_STDLIB :=$(call CFG_LIB_NAME,std) CFG_LIBRUSTC :=$(call CFG_LIB_NAME,rustc) ifdef CFG_DISABLE_SHAREDSTD CFG_STDLIB_DEFAULT = $(1)/lib/libstd.rlib else CFG_STDLIB_DEFAULT = $(2)/$(CFG_STDLIB) endif # version-string calculation CFG_GIT_DIR := $(CFG_SRC_DIR).git CFG_VERSION = prerelease ifneq ($(wildcard $(CFG_GIT)),) ifneq ($(wildcard $(CFG_GIT_DIR)),) CFG_VERSION += $(shell git --git-dir=$(CFG_GIT_DIR) log -1 \ --pretty=format:'(%h %ci)') endif endif ifdef CFG_DISABLE_VALGRIND $(info cfg: disabling valgrind (CFG_DISABLE_VALGRIND)) CFG_VALGRIND := endif ifdef CFG_BAD_VALGRIND $(info cfg: disabling valgrind due to its unreliability on this platform) CFG_VALGRIND := endif 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 ifeq ($(CFG_TEX),) $(info cfg: no tex found, omitting doc/rust.pdf) else DOCS += doc/rust.pdf endif endif ifdef CFG_DISABLE_DOCS $(info cfg: disabling doc build (CFG_DISABLE_DOCS)) DOCS := endif ###################################################################### # Target-and-rule "utility variables" ###################################################################### ifdef VERBOSE Q := E = else Q := @ E = echo $(1) endif S := $(CFG_SRC_DIR) X := $(CFG_EXE_SUFFIX) # Look in doc and src dirs. VPATH := $(S)doc $(S)src # "Source" files we generate in builddir along the way. GENERATED := # Delete the built-in rules. .SUFFIXES: %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% ###################################################################### # Standard library variables ###################################################################### STDLIB_CRATE := $(S)src/lib/std.rc STDLIB_INPUTS := $(wildcard $(addprefix $(S)src/lib/,*.rc *.rs */*.rs)) ###################################################################### # rustc crate variables ###################################################################### COMPILER_CRATE := $(S)src/comp/rustc.rc COMPILER_INPUTS := $(wildcard $(addprefix $(S)src/comp/, \ rustc.rc *.rs */*.rs */*/*.rs)) ###################################################################### # Exports for sub-utilities ###################################################################### export CFG_SRC_DIR export CFG_BUILD_DIR export CFG_VERSION export CFG_LLVM_ROOT export CFG_ENABLE_MINGW_CROSS ###################################################################### # Subprograms ###################################################################### LLVM_AS := $(CFG_LLVM_BINDIR)/llvm-as$(X) LLC := $(CFG_LLVM_BINDIR)/llc$(X) ###################################################################### # Per-stage targets and runner ###################################################################### define SREQ ifdef CFG_DISABLE_SHAREDSTD SREQ$(1) = stage$(1)/rustc$(X) \ stage$(1)/$$(CFG_RUNTIME) \ $$(call CFG_STDLIB_DEFAULT,stage$(1),stage$(1)) \ stage$(1)/$$(CFG_RUSTLLVM) \ stage$(1)/lib/glue.o \ stage$(1)/lib/main.o \ stage$(1)/lib/$$(CFG_RUNTIME) \ $$(MKFILES) else SREQ$(1) = stage$(1)/rustc$(X) \ stage$(1)/$$(CFG_RUNTIME) \ $$(call CFG_STDLIB_DEFAULT,stage$(1),stage$(1)) \ stage$(1)/$$(CFG_RUSTLLVM) \ stage$(1)/lib/glue.o \ stage$(1)/lib/main.o \ stage$(1)/lib/$$(CFG_RUNTIME) \ stage$(1)/lib/$$(CFG_STDLIB) \ $$(MKFILES) endif ifeq ($(1),0) # Don't run the the stage0 compiler under valgrind - that ship has sailed CFG_VALGRIND_COMPILE$(1) = else CFG_VALGRIND_COMPILE$(1) = $$(CFG_VALGRIND_COMPILE) endif STAGE$(1) := $$(Q)$$(call CFG_RUN_TARG,stage$(1), \ $$(CFG_VALGRIND_COMPILE$(1)) stage$(1)/rustc$$(X) \ $$(CFG_RUSTC_FLAGS)) endef FUZZ := stage1/fuzzer$(X) $(eval $(call SREQ,0)) $(eval $(call SREQ,1)) $(eval $(call SREQ,2)) $(eval $(call SREQ,3)) ###################################################################### # Entrypoint rule ###################################################################### ifneq ($(CFG_IN_TRANSITION),) CFG_INFO := $(info cfg:) CFG_INFO := $(info cfg: *** compiler is in snapshot transition ***) CFG_INFO := $(info cfg: *** stage2 and later will not be built ***) CFG_INFO := $(info cfg:) all: $(SREQ0) $(SREQ1) $(GENERATED) $(DOCS) $(FUZZ) else all: $(SREQ0) $(SREQ1) $(SREQ2) $(SREQ3) $(GENERATED) $(DOCS) $(FUZZ) endif ###################################################################### # Re-configuration ###################################################################### config.mk: $(S)configure $(S)Makefile.in $(S)src/snapshots.txt @$(call E, cfg: reconfiguring) $(Q)$(S)configure $(CFG_CONFIGURE_ARGS) ###################################################################### # Primary-target makefiles ###################################################################### include $(CFG_SRC_DIR)/mk/intrinsics.mk include $(CFG_SRC_DIR)/mk/stageN.mk include $(CFG_SRC_DIR)/mk/stage0.mk include $(CFG_SRC_DIR)/mk/rt.mk include $(CFG_SRC_DIR)/mk/rustllvm.mk include $(CFG_SRC_DIR)/mk/autodep.mk include $(CFG_SRC_DIR)/mk/fuzzer.mk include $(CFG_SRC_DIR)/mk/docs.mk ###################################################################### # Secondary makefiles, conditionalized for speed ###################################################################### ifneq ($(strip $(findstring dist,$(MAKECMDGOALS)) \ $(findstring check,$(MAKECMDGOALS)) \ $(findstring test,$(MAKECMDGOALS)) \ $(findstring tidy,$(MAKECMDGOALS)) \ $(findstring clean,$(MAKECMDGOALS))),) CFG_INFO := $(info cfg: including dist rules) include $(CFG_SRC_DIR)/mk/dist.mk endif ifneq ($(strip $(findstring snap,$(MAKECMDGOALS)) \ $(findstring clean,$(MAKECMDGOALS))),) CFG_INFO := $(info cfg: including snap rules) include $(CFG_SRC_DIR)/mk/snap.mk endif ifneq ($(findstring reformat,$(MAKECMDGOALS)),) CFG_INFO := $(info cfg: including reformat rules) include $(CFG_SRC_DIR)/mk/pp.mk endif ifneq ($(strip $(findstring check,$(MAKECMDGOALS)) \ $(findstring test,$(MAKECMDGOALS)) \ $(findstring perf,$(MAKECMDGOALS)) \ $(findstring tidy,$(MAKECMDGOALS))),) CFG_INFO := $(info cfg: including test rules) include $(CFG_SRC_DIR)/mk/tests.mk endif ifneq ($(findstring perf,$(MAKECMDGOALS)),) CFG_INFO := $(info cfg: including perf rules) include $(CFG_SRC_DIR)/mk/perf.mk endif ifneq ($(findstring clean,$(MAKECMDGOALS)),) CFG_INFO := $(info cfg: including clean rules) include $(CFG_SRC_DIR)/mk/clean.mk endif