rust/Makefile.in

424 lines
14 KiB
Makefile
Raw Normal View History

# An explanation of how the build is structured:
#
# There are multiple build stages (0-3) needed to verify that the
# compiler is properly self-hosting. Each stage is divided between
# 'host' artifacts and 'target' artifacts, where the stageN host
# compiler builds artifacts for 1 or more stageN target architectures.
# Once the stageN target compiler has been built for the host
# architecture it is promoted (copied) to a stageN+1 host artifact.
#
# The stage3 host compiler is a compiler that successfully builds
# itself and should (in theory) be bitwise identical to the stage2
# host compiler. The process is bootstrapped using a stage0 host
# compiler downloaded from a previous snapshot.
#
# At no time should stageN artifacts be interacting with artifacts
# from other stages. For consistency, we use the 'promotion' logic
# for all artifacts, even those that don't make sense on non-host
# architectures.
#
# The directory layout for a stage is intended to match the layout
# of the installed compiler, and looks like the following:
#
# stageN - this is the system root, corresponding to, e.g. /usr
# bin - binaries compiled for the host
# lib - libraries used by the host compiler
# rustc - rustc's own place to organize libraries
# $(target) - target-specific artifacts
# bin - binaries for target architectures
# lib - libraries for target architectures
#
# A note about host libraries:
#
# The only libraries that get promoted to stageN/lib are those needed
2011-11-03 18:53:49 +01:00
# by rustc. In general, rust programs, even those compiled for the
# host architecture will use libraries from the target
# directories. This gives rust some freedom to experiment with how
# libraries are managed and versioned without polluting the common
# areas of the filesystem.
#
# General rust binaries may stil live in the host bin directory; they
# will just link against the libraries in the target lib directory.
#
# Admittedly this is a little convoluted.
2011-03-16 17:17:32 +01:00
######################################################################
# Residual auto-configuration
######################################################################
include config.mk
2011-10-06 02:41:01 +02:00
OUR_MKFILES := Makefile config.mk $(wildcard $(CFG_SRC_DIR)/mk/*.mk)
2011-11-08 23:36:19 +01:00
3RDPARTY_MKFILES := $(CFG_SRC_DIR)/src/libuv/Makefile \
$(wildcard $(CFG_SRC_DIR)/src/libuv/*.mk)
2011-10-14 02:11:28 +02:00
GEN_MKFILES := $(wildcard $(CFG_SRC_DIR)/mk/libuv/*/*/*) \
2011-11-08 23:36:19 +01:00
$(wildcard $(CFG_SRC_DIR)/mk/libuv/mac/src/libuv/*) \
$(wildcard $(CFG_SRC_DIR)/mk/libuv/mac/src/libuv/*) \
$(wildcard $(CFG_SRC_DIR)/mk/libuv/mac/src/libuv/*)
2011-10-06 02:41:01 +02:00
MKFILES := $(OUR_MKFILES) $(3RDPARTY_MKFILES) $(GEN_MKFILES)
2011-03-16 17:17:32 +01:00
ifneq ($(MAKE_RESTARTS),)
CFG_INFO := $(info cfg: make restarts: $(MAKE_RESTARTS))
endif
CFG_INFO := $(info cfg: shell host triple $(CFG_HOST_TRIPLE))
2011-03-16 17:17:32 +01:00
2011-04-09 00:44:41 +02:00
ifdef CFG_DISABLE_OPTIMIZE
$(info cfg: disabling rustc optimization (CFG_DISABLE_OPTIMIZE))
CFG_RUSTC_FLAGS :=
2011-04-09 00:44:41 +02:00
else
CFG_RUSTC_FLAGS := -O
2011-04-09 00:44:41 +02:00
endif
ifdef SAVE_TEMPS
CFG_RUSTC_FLAGS += --save-temps
endif
2011-04-29 20:55:32 +02:00
ifdef TIME_PASSES
CFG_RUSTC_FLAGS += --time-passes
endif
ifdef TIME_LLVM_PASSES
CFG_RUSTC_FLAGS += --time-llvm-passes
endif
ifdef DEBUG
CFG_RUSTC_FLAGS += -g
endif
2011-05-01 22:18:52 +02:00
# 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,ruststd)
CFG_LIBRUSTC :=$(call CFG_LIB_NAME,rustc)
# version-string calculation
CFG_GIT_DIR := $(CFG_SRC_DIR).git
2011-06-25 21:23:27 +02:00
CFG_VERSION = prerelease
2011-06-13 23:45:26 +02:00
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
2011-06-13 23:45:26 +02:00
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
2011-03-23 18:37:35 +01:00
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
2011-03-23 18:37:35 +01:00
endif
2011-10-27 23:59:22 +02:00
ifeq ($(CFG_NATURALDOCS),)
2011-10-28 00:04:29 +02:00
$(info cfg: no naturaldocs found, omitting doc/std/index.html)
2011-10-27 23:59:22 +02:00
else
DOCS += doc/std/index.html
endif
ifdef CFG_DISABLE_DOCS
$(info cfg: disabling doc build (CFG_DISABLE_DOCS))
DOCS :=
endif
2011-03-23 18:37:35 +01:00
######################################################################
# Target-and-rule "utility variables"
######################################################################
ifdef VERBOSE
Q :=
E =
else
Q := @
E = echo $(1)
2011-03-16 17:17:32 +01:00
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.
2011-05-01 22:18:52 +02:00
GENERATED :=
# Delete the built-in rules.
.SUFFIXES:
%:: %,v
%:: RCS/%,v
%:: RCS/%
%:: s.%
%:: SCCS/s.%
2011-03-16 17:17:32 +01:00
######################################################################
# Standard library variables
######################################################################
2011-03-21 21:42:29 +01:00
STDLIB_CRATE := $(S)src/lib/std.rc
STDLIB_INPUTS := $(wildcard $(addprefix $(S)src/lib/,*.rc *.rs */*.rs))
2011-03-16 17:17:32 +01:00
######################################################################
# rustc crate variables
2011-03-16 17:17:32 +01:00
######################################################################
2011-03-21 21:42:29 +01:00
COMPILER_CRATE := $(S)src/comp/rustc.rc
COMPILER_INPUTS := $(wildcard $(addprefix $(S)src/comp/, \
rustc.rc *.rs */*.rs */*/*.rs))
2011-11-02 01:09:44 +01:00
######################################################################
# LLVM macros
######################################################################
define DEF_LLVM_VARS
# The configure script defines these variables with the target triples
# separated by Z. This defines new ones with the expected format.
CFG_LLVM_BUILD_DIR_$(1):=$$(CFG_LLVM_BUILD_DIR_$(subst -,_,$(1)))
CFG_LLVM_INST_DIR_$(1):=$$(CFG_LLVM_INST_DIR_$(subst -,_,$(1)))
# Any rules that depend on LLVM should depend on LLVM_CONFIG
LLVM_CONFIG_$(1):=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-config
LLVM_VERSION_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --version)
LLVM_BINDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --bindir)
LLVM_INCDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --includedir)
LLVM_LIBDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --libdir)
LLVM_LIBS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --libs)
LLVM_LDFLAGS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --ldflags)
LLVM_CXXFLAGS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --cxxflags)
LLVM_HOST_TRIPLE_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --host-target)
LLVM_AS_$(1)=$$(LLVM_BINDIR_$(1))/llvm-as$$(X)
LLC_$(1)=$$(LLVM_BINDIR_$(1))/llc$$(X)
endef
$(foreach target,$(CFG_TARGET_TRIPLES), \
$(eval $(call DEF_LLVM_VARS,$(target))))
2011-11-02 01:09:44 +01:00
2011-05-03 08:37:52 +02:00
######################################################################
# Exports for sub-utilities
######################################################################
# Note that any variable that re-configure should pick up needs to be
# exported
2011-05-03 08:37:52 +02:00
export CFG_SRC_DIR
export CFG_BUILD_DIR
export CFG_VERSION
export CFG_HOST_TRIPLE
export CFG_LLVM_ROOT
export CFG_ENABLE_MINGW_CROSS
export CFG_PREFIX
2011-05-03 08:37:52 +02:00
2011-05-05 03:28:30 +02:00
######################################################################
# Subprograms
######################################################################
######################################################################
# Per-stage targets and runner
######################################################################
define SREQ
2011-09-30 21:08:51 +02:00
# Destinations of artifacts for the host compiler
HOST_ROOT$(1) = stage$(1)
HOST_BIN$(1) = $$(HOST_ROOT$(1))/bin
HOST_LIB$(1) = $$(HOST_ROOT$(1))/lib
# Destinations of artifacts for target architectures
TARGET_ROOT$(1)$(2) = $$(HOST_LIB$(1))/rustc/$(2)
TARGET_BIN$(1)$(2) = $$(TARGET_ROOT$(1)$(2))/bin
TARGET_LIB$(1)$(2) = $$(TARGET_ROOT$(1)$(2))/lib
# The target locations of artifacts for the host architecture (used for
# promoting target binaries to host binaries)
TARGET_HOST_ROOT$(1) = $$(TARGET_ROOT$(1)$$(CFG_HOST_TRIPLE))
TARGET_HOST_BIN$(1) = $$(TARGET_BIN$(1)$$(CFG_HOST_TRIPLE))
TARGET_HOST_LIB$(1) = $$(TARGET_LIB$(1)$$(CFG_HOST_TRIPLE))
2011-09-30 21:08:51 +02:00
# The name of the standard library used by rustc
ifdef CFG_DISABLE_SHAREDSTD
HOST_STDLIB_DEFAULT$(1) = $$(HOST_LIB$(1))/libstd.rlib
TARGET_STDLIB_DEFAULT$(1)$(2) = $$(TARGET_LIB$(1)$(2))/libstd.rlib
else
HOST_STDLIB_DEFAULT$(1) = $$(HOST_LIB$(1))/$(CFG_STDLIB)
TARGET_STDLIB_DEFAULT$(1)$(2) = $$(TARGET_LIB$(1)$(2))/$(CFG_STDLIB)
endif
# Preqrequisites for using the stageN compiler
HOST_SREQ$(1) = \
$$(HOST_BIN$(1))/rustc$$(X) \
$$(HOST_LIB$(1))/$$(CFG_RUNTIME) \
$$(HOST_LIB$(1))/$$(CFG_RUSTLLVM) \
$$(HOST_STDLIB_DEFAULT$(1)) \
$$(MKFILES)
# Prerequisites for using the stageN compiler to build target artifacts
TARGET_SREQ$(1)$(2) = \
$$(HOST_SREQ$(1)) \
$$(TARGET_LIB$(1)$(2))/$$(CFG_RUNTIME) \
$$(TARGET_LIB$(1)$(2))/intrinsics.bc
# Prerequisites for complete stageN targets
SREQ$(1)$(2) = \
$$(TARGET_SREQ$(1)$(2)) \
$$(TARGET_LIB$(1)$(2))/$$(CFG_STDLIB)
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)_$(2) := $$(Q)$$(call CFG_RUN_TARG,$(1), \
$$(CFG_VALGRIND_COMPILE$(1)) $$(HOST_BIN$(1))/rustc$$(X) \
$$(CFG_RUSTC_FLAGS) --target=$(2))
PERF_STAGE$(1)_$(2) := $$(Q)$$(call CFG_RUN_TARG,$(1), \
$$(CFG_PERF_TOOL) $$(HOST_BIN$(1))/rustc$$(X) \
$$(CFG_RUSTC_FLAGS) --target=$(2))
endef
$(foreach target,$(CFG_TARGET_TRIPLES), \
$(eval $(call SREQ,0,$(target))) \
$(eval $(call SREQ,1,$(target))) \
$(eval $(call SREQ,2,$(target))) \
$(eval $(call SREQ,3,$(target))))
######################################################################
# Entrypoint rule
######################################################################
2011-03-16 17:17:32 +01:00
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: $(SREQ1$(CFG_HOST_TRIPLE)) $(GENERATED) $(DOCS)
2011-10-01 01:15:02 +02:00
else
2011-09-30 05:27:28 +02:00
TARGET_SREQS := $(foreach target,$(CFG_TARGET_TRIPLES),$(SREQ3$(target)))
FUZZ := $(HOST_BIN3)/fuzzer$(X)
#all: $(SREQ3$(CFG_HOST_TRIPLE)) $(GENERATED) $(DOCS) $(FUZZ)
all: $(TARGET_SREQS) $(GENERATED) $(DOCS) $(FUZZ)
2011-09-30 05:27:28 +02:00
endif
######################################################################
# Re-configuration
######################################################################
# This is a pretty expensive operation but I don't see any way to avoid it
SUBMODULE_STATUS=$(shell cd "$(CFG_SRC_DIR)" && "$(CFG_GIT)" submodule status)
# Look through for submodules prefixed with '-' (need init), or '+' (need update)
NEED_GIT_RECONFIG=$(shell echo "$(SUBMODULE_STATUS)" | grep -c '^\(+\|-\)')
ifeq ($(NEED_GIT_RECONFIG),0)
else
# If the submodules have changed then always execute config.mk
.PHONY: config.mk
endif
config.mk: $(S)configure $(S)Makefile.in $(S)src/snapshots.txt
@$(call E, cfg: reconfiguring)
2011-06-30 22:41:20 +02:00
$(Q)$(S)configure $(CFG_CONFIGURE_ARGS)
2011-03-21 19:23:19 +01:00
######################################################################
2011-06-25 21:23:27 +02:00
# Primary-target makefiles
2011-03-21 19:23:19 +01:00
######################################################################
include $(CFG_SRC_DIR)/mk/target.mk
include $(CFG_SRC_DIR)/mk/host.mk
include $(CFG_SRC_DIR)/mk/stage0.mk
2011-05-01 22:18:52 +02:00
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/tools.mk
2011-06-25 21:23:27 +02:00
include $(CFG_SRC_DIR)/mk/docs.mk
2011-11-01 01:34:31 +01:00
include $(CFG_SRC_DIR)/mk/llvm.mk
2011-06-25 21:23:27 +02:00
######################################################################
# Secondary makefiles, conditionalized for speed
######################################################################
2011-06-30 22:41:20 +02:00
ifneq ($(strip $(findstring dist,$(MAKECMDGOALS)) \
$(findstring check,$(MAKECMDGOALS)) \
$(findstring test,$(MAKECMDGOALS)) \
$(findstring tidy,$(MAKECMDGOALS)) \
2011-06-30 22:41:20 +02:00
$(findstring clean,$(MAKECMDGOALS))),)
CFG_INFO := $(info cfg: including dist rules)
2011-06-25 21:23:27 +02:00
include $(CFG_SRC_DIR)/mk/dist.mk
endif
2011-06-30 22:41:20 +02:00
ifneq ($(strip $(findstring snap,$(MAKECMDGOALS)) \
$(findstring clean,$(MAKECMDGOALS))),)
CFG_INFO := $(info cfg: including snap rules)
2011-06-25 21:23:27 +02:00
include $(CFG_SRC_DIR)/mk/snap.mk
endif
ifneq ($(findstring reformat,$(MAKECMDGOALS)),)
2011-06-30 22:41:20 +02:00
CFG_INFO := $(info cfg: including reformat rules)
2011-06-25 21:23:27 +02:00
include $(CFG_SRC_DIR)/mk/pp.mk
endif
2011-06-30 22:41:20 +02:00
ifneq ($(strip $(findstring check,$(MAKECMDGOALS)) \
$(findstring test,$(MAKECMDGOALS)) \
$(findstring perf,$(MAKECMDGOALS)) \
2011-06-30 22:41:20 +02:00
$(findstring tidy,$(MAKECMDGOALS))),)
CFG_INFO := $(info cfg: including test rules)
2011-06-25 21:23:27 +02:00
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
2011-06-25 21:23:27 +02:00
ifneq ($(findstring clean,$(MAKECMDGOALS)),)
2011-06-30 22:41:20 +02:00
CFG_INFO := $(info cfg: including clean rules)
2011-06-25 21:23:27 +02:00
include $(CFG_SRC_DIR)/mk/clean.mk
endif
ifneq ($(findstring install,$(MAKECMDGOALS)),)
CFG_INFO := $(info cfg: including install rules)
include $(CFG_SRC_DIR)/mk/install.mk
endif
ifneq ($(strip $(findstring TAGS.emacs,$(MAKECMDGOALS)) \
$(findstring TAGS.vi,$(MAKECMDGOALS))),)
CFG_INFO := $(info cfg: including ctags rules)
include $(CFG_SRC_DIR)/mk/ctags.mk
endif