2012-12-11 02:32:48 +01:00
|
|
|
# Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
|
|
|
# file at the top-level directory of this distribution and at
|
|
|
|
# http://rust-lang.org/COPYRIGHT.
|
|
|
|
#
|
|
|
|
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
# option. This file may not be copied, modified, or distributed
|
|
|
|
# except according to those terms.
|
|
|
|
|
2011-10-02 05:12:08 +02:00
|
|
|
# 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
|
2011-10-02 05:12:08 +02:00
|
|
|
# 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-11-21 22:11:40 +01:00
|
|
|
STAGES = 0 1 2 3
|
|
|
|
|
2011-03-16 17:17:32 +01:00
|
|
|
######################################################################
|
|
|
|
# Residual auto-configuration
|
|
|
|
######################################################################
|
|
|
|
|
2012-03-27 01:04:37 +02:00
|
|
|
# Recursive wildcard function
|
|
|
|
# http://blog.jgc.org/2011/07/gnu-make-recursive-wildcard-function.html
|
|
|
|
rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) \
|
|
|
|
$(filter $(subst *,%,$2),$d))
|
2011-03-16 17:17:32 +01:00
|
|
|
|
2012-03-27 01:04:37 +02:00
|
|
|
include config.mk
|
2011-11-24 00:20:28 +01:00
|
|
|
|
2012-06-14 20:07:19 +02:00
|
|
|
# We track all of the object files we might build so that we can find
|
|
|
|
# and include all of the .d files in one fell swoop.
|
|
|
|
ALL_OBJ_FILES :=
|
|
|
|
|
2012-03-27 01:04:37 +02:00
|
|
|
MKFILE_DEPS := config.stamp $(call rwildcard,$(CFG_SRC_DIR)mk/,*)
|
2013-10-21 11:18:21 +02:00
|
|
|
NON_BUILD_HOST = $(filter-out $(CFG_BUILD),$(CFG_HOST))
|
|
|
|
NON_BUILD_TARGET = $(filter-out $(CFG_BUILD),$(CFG_TARGET))
|
2011-11-22 22:04:52 +01:00
|
|
|
|
2011-03-16 17:17:32 +01:00
|
|
|
ifneq ($(MAKE_RESTARTS),)
|
|
|
|
CFG_INFO := $(info cfg: make restarts: $(MAKE_RESTARTS))
|
|
|
|
endif
|
|
|
|
|
2013-10-21 11:18:21 +02:00
|
|
|
CFG_INFO := $(info cfg: build triple $(CFG_BUILD))
|
|
|
|
CFG_INFO := $(info cfg: host triples $(CFG_HOST))
|
|
|
|
CFG_INFO := $(info cfg: target triples $(CFG_TARGET))
|
2012-03-27 01:05:49 +02:00
|
|
|
|
2013-10-21 11:18:21 +02:00
|
|
|
ifneq ($(wildcard $(NON_BUILD_HOST)),)
|
|
|
|
CFG_INFO := $(info cfg: non-build host triples $(NON_BUILD_HOST))
|
2013-02-22 01:15:01 +01:00
|
|
|
endif
|
2013-10-21 11:18:21 +02:00
|
|
|
ifneq ($(wildcard $(NON_BUILD_TARGET)),)
|
|
|
|
CFG_INFO := $(info cfg: non-build target triples $(NON_BUILD_TARGET))
|
2012-03-27 01:05:49 +02:00
|
|
|
endif
|
2011-03-16 17:17:32 +01:00
|
|
|
|
2013-10-19 01:01:40 +02:00
|
|
|
CFG_RUSTC_FLAGS := $(RUSTFLAGS)
|
2012-03-30 04:10:38 +02:00
|
|
|
CFG_GCCISH_CFLAGS :=
|
|
|
|
CFG_GCCISH_LINK_FLAGS :=
|
|
|
|
|
2011-04-09 00:44:41 +02:00
|
|
|
ifdef CFG_DISABLE_OPTIMIZE
|
2011-04-09 01:29:19 +02:00
|
|
|
$(info cfg: disabling rustc optimization (CFG_DISABLE_OPTIMIZE))
|
2012-03-30 04:10:38 +02:00
|
|
|
CFG_RUSTC_FLAGS +=
|
2011-04-09 00:44:41 +02:00
|
|
|
else
|
2013-08-17 08:14:55 +02:00
|
|
|
# The rtopt cfg turns off runtime sanity checks
|
|
|
|
CFG_RUSTC_FLAGS += -O --cfg rtopt
|
2012-03-30 04:10:38 +02:00
|
|
|
endif
|
|
|
|
|
2013-09-21 10:49:38 +02:00
|
|
|
ifdef CFG_DISABLE_DEBUG
|
2013-09-18 06:02:11 +02:00
|
|
|
CFG_RUSTC_FLAGS += --cfg ndebug
|
2012-03-30 04:10:38 +02:00
|
|
|
CFG_GCCISH_CFLAGS += -DRUST_NDEBUG
|
2013-09-21 10:49:38 +02:00
|
|
|
else
|
|
|
|
$(info cfg: enabling more debugging (CFG_ENABLE_DEBUG))
|
|
|
|
CFG_RUSTC_FLAGS += --cfg debug
|
|
|
|
CFG_GCCISH_CFLAGS += -DRUST_DEBUG
|
2011-04-09 00:44:41 +02:00
|
|
|
endif
|
2011-03-18 07:51:45 +01:00
|
|
|
|
2011-04-25 23:20:28 +02:00
|
|
|
ifdef SAVE_TEMPS
|
2011-04-26 20:32:08 +02:00
|
|
|
CFG_RUSTC_FLAGS += --save-temps
|
2011-04-25 23:20:28 +02:00
|
|
|
endif
|
2013-05-04 20:29:32 +02:00
|
|
|
ifdef ASM_COMMENTS
|
2013-06-16 02:15:38 +02:00
|
|
|
CFG_RUSTC_FLAGS += -Z asm-comments
|
2013-05-04 20:29:32 +02:00
|
|
|
endif
|
2011-04-29 20:55:32 +02:00
|
|
|
ifdef TIME_PASSES
|
2012-05-18 06:53:49 +02:00
|
|
|
CFG_RUSTC_FLAGS += -Z time-passes
|
2011-04-29 20:55:32 +02:00
|
|
|
endif
|
2011-06-19 02:26:41 +02:00
|
|
|
ifdef TIME_LLVM_PASSES
|
2012-05-18 06:53:49 +02:00
|
|
|
CFG_RUSTC_FLAGS += -Z time-llvm-passes
|
2011-06-19 02:26:41 +02:00
|
|
|
endif
|
2012-08-29 00:54:45 +02:00
|
|
|
ifdef TRACE
|
|
|
|
CFG_RUSTC_FLAGS += -Z trace
|
|
|
|
endif
|
2013-05-15 23:01:54 +02:00
|
|
|
ifndef DEBUG_BORROWS
|
2013-10-29 11:14:59 +01:00
|
|
|
RUSTFLAGS_STAGE0 += -Z no-debug-borrows
|
2013-05-15 23:01:54 +02:00
|
|
|
RUSTFLAGS_STAGE1 += -Z no-debug-borrows
|
|
|
|
RUSTFLAGS_STAGE2 += -Z no-debug-borrows
|
|
|
|
endif
|
2011-04-25 23:20:28 +02:00
|
|
|
|
Add generation of static libraries to rustc
This commit implements the support necessary for generating both intermediate
and result static rust libraries. This is an implementation of my thoughts in
https://mail.mozilla.org/pipermail/rust-dev/2013-November/006686.html.
When compiling a library, we still retain the "lib" option, although now there
are "rlib", "staticlib", and "dylib" as options for crate_type (and these are
stackable). The idea of "lib" is to generate the "compiler default" instead of
having too choose (although all are interchangeable). For now I have left the
"complier default" to be a dynamic library for size reasons.
Of the rust libraries, lib{std,extra,rustuv} will bootstrap with an
rlib/dylib pair, but lib{rustc,syntax,rustdoc,rustpkg} will only be built as a
dynamic object. I chose this for size reasons, but also because you're probably
not going to be embedding the rustc compiler anywhere any time soon.
Other than the options outlined above, there are a few defaults/preferences that
are now opinionated in the compiler:
* If both a .dylib and .rlib are found for a rust library, the compiler will
prefer the .rlib variant. This is overridable via the -Z prefer-dynamic option
* If generating a "lib", the compiler will generate a dynamic library. This is
overridable by explicitly saying what flavor you'd like (rlib, staticlib,
dylib).
* If no options are passed to the command line, and no crate_type is found in
the destination crate, then an executable is generated
With this change, you can successfully build a rust program with 0 dynamic
dependencies on rust libraries. There is still a dynamic dependency on
librustrt, but I plan on removing that in a subsequent commit.
This change includes no tests just yet. Our current testing
infrastructure/harnesses aren't very amenable to doing flavorful things with
linking, so I'm planning on adding a new mode of testing which I believe belongs
as a separate commit.
Closes #552
2013-11-15 23:03:29 +01:00
|
|
|
# The executables crated during this compilation process have no need to include
|
|
|
|
# static copies of libstd and libextra. We also generate dynamic versions of all
|
|
|
|
# libraries, so in the interest of space, prefer dynamic linking throughout the
|
|
|
|
# compilation process.
|
2013-12-01 01:38:07 +01:00
|
|
|
RUSTFLAGS_STAGE0 += -Z prefer-dynamic
|
Add generation of static libraries to rustc
This commit implements the support necessary for generating both intermediate
and result static rust libraries. This is an implementation of my thoughts in
https://mail.mozilla.org/pipermail/rust-dev/2013-November/006686.html.
When compiling a library, we still retain the "lib" option, although now there
are "rlib", "staticlib", and "dylib" as options for crate_type (and these are
stackable). The idea of "lib" is to generate the "compiler default" instead of
having too choose (although all are interchangeable). For now I have left the
"complier default" to be a dynamic library for size reasons.
Of the rust libraries, lib{std,extra,rustuv} will bootstrap with an
rlib/dylib pair, but lib{rustc,syntax,rustdoc,rustpkg} will only be built as a
dynamic object. I chose this for size reasons, but also because you're probably
not going to be embedding the rustc compiler anywhere any time soon.
Other than the options outlined above, there are a few defaults/preferences that
are now opinionated in the compiler:
* If both a .dylib and .rlib are found for a rust library, the compiler will
prefer the .rlib variant. This is overridable via the -Z prefer-dynamic option
* If generating a "lib", the compiler will generate a dynamic library. This is
overridable by explicitly saying what flavor you'd like (rlib, staticlib,
dylib).
* If no options are passed to the command line, and no crate_type is found in
the destination crate, then an executable is generated
With this change, you can successfully build a rust program with 0 dynamic
dependencies on rust libraries. There is still a dynamic dependency on
librustrt, but I plan on removing that in a subsequent commit.
This change includes no tests just yet. Our current testing
infrastructure/harnesses aren't very amenable to doing flavorful things with
linking, so I'm planning on adding a new mode of testing which I believe belongs
as a separate commit.
Closes #552
2013-11-15 23:03:29 +01:00
|
|
|
RUSTFLAGS_STAGE1 += -Z prefer-dynamic
|
|
|
|
RUSTFLAGS_STAGE2 += -Z prefer-dynamic
|
|
|
|
RUSTFLAGS_STAGE3 += -Z prefer-dynamic
|
|
|
|
|
2011-05-01 22:18:52 +02:00
|
|
|
# platform-specific auto-configuration
|
2012-03-27 01:05:33 +02:00
|
|
|
include $(CFG_SRC_DIR)mk/platform.mk
|
2011-03-18 07:51:45 +01:00
|
|
|
|
2011-05-14 05:20:34 +02:00
|
|
|
# Run the stage1/2 compilers under valgrind
|
|
|
|
ifdef VALGRIND_COMPILE
|
|
|
|
CFG_VALGRIND_COMPILE :=$(CFG_VALGRIND)
|
|
|
|
else
|
|
|
|
CFG_VALGRIND_COMPILE :=
|
|
|
|
endif
|
|
|
|
|
2011-05-06 20:21:51 +02:00
|
|
|
# version-string calculation
|
|
|
|
CFG_GIT_DIR := $(CFG_SRC_DIR).git
|
2013-09-27 03:18:42 +02:00
|
|
|
CFG_RELEASE = 0.9-pre
|
2012-01-18 01:49:44 +01:00
|
|
|
CFG_VERSION = $(CFG_RELEASE)
|
2013-06-28 00:36:05 +02:00
|
|
|
# windows exe's need numeric versions - don't use anything but
|
|
|
|
# numbers and dots here
|
2013-09-27 03:18:42 +02:00
|
|
|
CFG_VERSION_WIN = 0.9
|
2012-01-18 01:49:44 +01:00
|
|
|
|
2013-10-07 11:15:50 +02:00
|
|
|
# since $(CFG_GIT) may contain spaces (especially on Windows),
|
|
|
|
# we need to escape them. (" " to r"\ ")
|
|
|
|
# Note that $(subst ...) ignores space after `subst`,
|
|
|
|
# so we use a hack: define $(SPACE) which contains space character.
|
|
|
|
SPACE :=
|
|
|
|
SPACE +=
|
|
|
|
ifneq ($(wildcard $(subst $(SPACE),\$(SPACE),$(CFG_GIT))),)
|
|
|
|
ifneq ($(wildcard $(subst $(SPACE),\$(SPACE),$(CFG_GIT_DIR))),)
|
|
|
|
CFG_VERSION += $(shell git --git-dir='$(CFG_GIT_DIR)' log -1 \
|
2011-05-06 20:21:51 +02:00
|
|
|
--pretty=format:'(%h %ci)')
|
2013-10-07 11:15:50 +02:00
|
|
|
CFG_VER_HASH = $(shell git --git-dir='$(CFG_GIT_DIR)' rev-parse HEAD)
|
2011-05-06 20:21:51 +02:00
|
|
|
endif
|
2011-06-13 23:45:26 +02:00
|
|
|
endif
|
2011-05-06 20:21:51 +02:00
|
|
|
|
2012-10-20 23:27:56 +02:00
|
|
|
ifdef CFG_ENABLE_VALGRIND
|
|
|
|
$(info cfg: enabling valgrind (CFG_ENABLE_VALGRIND))
|
|
|
|
else
|
2011-03-18 07:51:45 +01:00
|
|
|
CFG_VALGRIND :=
|
|
|
|
endif
|
2011-05-06 03:11:40 +02:00
|
|
|
ifdef CFG_BAD_VALGRIND
|
|
|
|
$(info cfg: disabling valgrind due to its unreliability on this platform)
|
|
|
|
CFG_VALGRIND :=
|
|
|
|
endif
|
2011-03-18 07:51:45 +01:00
|
|
|
|
2011-03-23 18:37:35 +01:00
|
|
|
|
2011-03-18 07:51:45 +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
|
|
|
|
|
2011-03-18 07:51:45 +01:00
|
|
|
S := $(CFG_SRC_DIR)
|
2013-03-02 13:25:12 +01:00
|
|
|
|
|
|
|
define DEF_X
|
|
|
|
X_$(1) := $(CFG_EXE_SUFFIX_$(1))
|
|
|
|
endef
|
2013-10-21 11:18:21 +02:00
|
|
|
$(foreach target,$(CFG_TARGET),\
|
2013-03-02 13:25:12 +01:00
|
|
|
$(eval $(call DEF_X,$(target))))
|
2011-03-18 07:51:45 +01:00
|
|
|
|
|
|
|
# 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 :=
|
2011-03-18 07:51:45 +01:00
|
|
|
|
|
|
|
# Delete the built-in rules.
|
|
|
|
.SUFFIXES:
|
|
|
|
%:: %,v
|
|
|
|
%:: RCS/%,v
|
|
|
|
%:: RCS/%
|
|
|
|
%:: s.%
|
|
|
|
%:: SCCS/s.%
|
2011-03-16 17:17:32 +01:00
|
|
|
|
2013-03-02 13:25:12 +01:00
|
|
|
|
|
|
|
######################################################################
|
|
|
|
# Crates
|
|
|
|
######################################################################
|
|
|
|
|
|
|
|
define DEF_LIBS
|
|
|
|
|
2013-11-16 11:02:07 +01:00
|
|
|
CFG_RUNTIME_$(1) :=$(call CFG_STATIC_LIB_NAME_$(1),rustrt)
|
2013-03-02 13:25:12 +01:00
|
|
|
CFG_RUSTLLVM_$(1) :=$(call CFG_LIB_NAME_$(1),rustllvm)
|
|
|
|
CFG_STDLIB_$(1) :=$(call CFG_LIB_NAME_$(1),std)
|
2013-05-17 19:45:09 +02:00
|
|
|
CFG_EXTRALIB_$(1) :=$(call CFG_LIB_NAME_$(1),extra)
|
2013-03-02 13:25:12 +01:00
|
|
|
CFG_LIBRUSTC_$(1) :=$(call CFG_LIB_NAME_$(1),rustc)
|
|
|
|
CFG_LIBSYNTAX_$(1) :=$(call CFG_LIB_NAME_$(1),syntax)
|
|
|
|
CFG_LIBRUSTPKG_$(1) :=$(call CFG_LIB_NAME_$(1),rustpkg)
|
|
|
|
CFG_LIBRUSTDOC_$(1) :=$(call CFG_LIB_NAME_$(1),rustdoc)
|
2013-10-23 00:13:18 +02:00
|
|
|
CFG_LIBRUSTUV_$(1) :=$(call CFG_LIB_NAME_$(1),rustuv)
|
2013-03-02 13:25:12 +01:00
|
|
|
|
2013-05-18 00:28:44 +02:00
|
|
|
EXTRALIB_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),extra)
|
|
|
|
STDLIB_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),std)
|
2013-03-02 13:25:12 +01:00
|
|
|
LIBRUSTC_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),rustc)
|
|
|
|
LIBSYNTAX_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),syntax)
|
|
|
|
LIBRUSTPKG_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),rustpkg)
|
|
|
|
LIBRUSTDOC_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),rustdoc)
|
2013-10-23 00:13:18 +02:00
|
|
|
LIBRUSTUV_GLOB_$(1) :=$(call CFG_LIB_GLOB_$(1),rustuv)
|
2013-05-17 19:45:09 +02:00
|
|
|
EXTRALIB_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),extra)
|
2013-03-02 13:25:12 +01:00
|
|
|
STDLIB_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),std)
|
|
|
|
LIBRUSTC_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),rustc)
|
|
|
|
LIBSYNTAX_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),syntax)
|
|
|
|
LIBRUSTPKG_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),rustpkg)
|
|
|
|
LIBRUSTDOC_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),rustdoc)
|
2013-10-23 00:13:18 +02:00
|
|
|
LIBRUSTUV_DSYM_GLOB_$(1) :=$(call CFG_LIB_DSYM_GLOB_$(1),rustuv)
|
2013-03-02 13:25:12 +01:00
|
|
|
|
Add generation of static libraries to rustc
This commit implements the support necessary for generating both intermediate
and result static rust libraries. This is an implementation of my thoughts in
https://mail.mozilla.org/pipermail/rust-dev/2013-November/006686.html.
When compiling a library, we still retain the "lib" option, although now there
are "rlib", "staticlib", and "dylib" as options for crate_type (and these are
stackable). The idea of "lib" is to generate the "compiler default" instead of
having too choose (although all are interchangeable). For now I have left the
"complier default" to be a dynamic library for size reasons.
Of the rust libraries, lib{std,extra,rustuv} will bootstrap with an
rlib/dylib pair, but lib{rustc,syntax,rustdoc,rustpkg} will only be built as a
dynamic object. I chose this for size reasons, but also because you're probably
not going to be embedding the rustc compiler anywhere any time soon.
Other than the options outlined above, there are a few defaults/preferences that
are now opinionated in the compiler:
* If both a .dylib and .rlib are found for a rust library, the compiler will
prefer the .rlib variant. This is overridable via the -Z prefer-dynamic option
* If generating a "lib", the compiler will generate a dynamic library. This is
overridable by explicitly saying what flavor you'd like (rlib, staticlib,
dylib).
* If no options are passed to the command line, and no crate_type is found in
the destination crate, then an executable is generated
With this change, you can successfully build a rust program with 0 dynamic
dependencies on rust libraries. There is still a dynamic dependency on
librustrt, but I plan on removing that in a subsequent commit.
This change includes no tests just yet. Our current testing
infrastructure/harnesses aren't very amenable to doing flavorful things with
linking, so I'm planning on adding a new mode of testing which I believe belongs
as a separate commit.
Closes #552
2013-11-15 23:03:29 +01:00
|
|
|
EXTRALIB_RGLOB_$(1) :=$(call CFG_RLIB_GLOB,extra)
|
|
|
|
STDLIB_RGLOB_$(1) :=$(call CFG_RLIB_GLOB,std)
|
|
|
|
LIBRUSTUV_RGLOB_$(1) :=$(call CFG_RLIB_GLOB,rustuv)
|
|
|
|
|
2013-03-02 13:25:12 +01:00
|
|
|
endef
|
|
|
|
|
2013-07-04 16:51:45 +02:00
|
|
|
# $(1) is the path for directory to match against
|
|
|
|
# $(2) is the glob to use in the match
|
|
|
|
# $(3) is filename (usually the target being created) to filter out from match
|
|
|
|
# (i.e. filename is not out-of-date artifact from prior Rust version/build)
|
2013-07-08 18:35:47 +02:00
|
|
|
#
|
|
|
|
# Note that a common bug is to accidentally construct the glob denoted
|
|
|
|
# by $(2) with a space character prefix, which invalidates the
|
|
|
|
# construction $(1)$(2).
|
2013-07-04 16:51:45 +02:00
|
|
|
define CHECK_FOR_OLD_GLOB_MATCHES_EXCEPT
|
2013-11-01 23:28:12 +01:00
|
|
|
$(Q)MATCHES="$(filter-out %$(3),$(wildcard $(1)/$(2)))"; if [ -n "$$MATCHES" ] ; then echo "warning: there are previous" \'$(2)\' "libraries:" $$MATCHES; fi
|
2013-07-04 16:51:45 +02:00
|
|
|
endef
|
|
|
|
|
|
|
|
# Same interface as above, but deletes rather than just listing the files.
|
|
|
|
define REMOVE_ALL_OLD_GLOB_MATCHES_EXCEPT
|
2013-11-01 23:28:12 +01:00
|
|
|
$(Q)MATCHES="$(filter-out %$(3),$(wildcard $(1)/$(2)))"; if [ -n "$$MATCHES" ] ; then echo "warning: removing previous" \'$(2)\' "libraries:" $$MATCHES; rm $$MATCHES ; fi
|
2013-07-04 16:51:45 +02:00
|
|
|
endef
|
|
|
|
|
2013-07-08 18:35:47 +02:00
|
|
|
# We use a different strategy for LIST_ALL_OLD_GLOB_MATCHES_EXCEPT
|
|
|
|
# than in the macros above because it needs the result of running the
|
|
|
|
# `ls` command after other rules in the command list have run; the
|
|
|
|
# macro-expander for $(wildcard ...) would deliver its results too
|
|
|
|
# soon. (This is in contrast to the macros above, which are meant to
|
|
|
|
# be run at the outset of a command list in a rule.)
|
2013-07-04 16:51:45 +02:00
|
|
|
ifdef VERBOSE
|
|
|
|
define LIST_ALL_OLD_GLOB_MATCHES_EXCEPT
|
2013-11-01 23:28:12 +01:00
|
|
|
@echo "info: now are following matches for" '$(2)' "libraries:"
|
2013-07-04 16:51:45 +02:00
|
|
|
@( cd $(1) && ( ls $(2) 2>/dev/null || true ) | grep -v $(3) || true )
|
|
|
|
endef
|
|
|
|
else
|
|
|
|
define LIST_ALL_OLD_GLOB_MATCHES_EXCEPT
|
|
|
|
endef
|
|
|
|
endif
|
|
|
|
|
2013-10-21 11:18:21 +02:00
|
|
|
$(foreach target,$(CFG_TARGET),\
|
2013-03-02 13:25:12 +01:00
|
|
|
$(eval $(call DEF_LIBS,$(target))))
|
|
|
|
|
2011-12-06 01:46:37 +01:00
|
|
|
######################################################################
|
2013-05-17 19:45:09 +02:00
|
|
|
# Standard library variables
|
2011-12-06 01:46:37 +01:00
|
|
|
######################################################################
|
|
|
|
|
Rename files to match current recommendations.
New standards have arisen in recent months, mostly for the use of
rustpkg, but the main Rust codebase has not been altered to match these
new specifications. This changeset rectifies most of these issues.
- Renamed the crate source files `src/libX/X.rs` to `lib.rs`, for
consistency with current styles; this affects extra, rustc, rustdoc,
rustpkg, rustuv, std, syntax.
- Renamed `X/X.rs` to `X/mod.rs,` as is now recommended style, for
`std::num` and `std::terminfo`.
- Shifted `src/libstd/str/ascii.rs` out of the otherwise unused `str`
directory, to be consistent with its import path of `std::ascii`;
libstd is flat at present so it's more appropriate thus.
While this removes some `#[path = "..."]` directives, it does not remove
all of them, and leaves certain other inconsistencies, such as `std::u8`
et al. which are actually stored in `src/libstd/num/` (one subdirectory
down). No quorum has been reached on this issue, so I felt it best to
leave them all alone at present. #9208 deals with the possibility of
making libstd more hierarchical (such as changing the crate to match the
current filesystem structure, which would make the module path
`std::num::u8`).
There is one thing remaining in which this repository is not
rustpkg-compliant: rustpkg would have `src/std/` et al. rather than
`src/libstd/` et al. I have not endeavoured to change that at this point
as it would guarantee prompt bitrot and confusion. A change of that
magnitude needs to be discussed first.
2013-10-29 07:22:49 +01:00
|
|
|
STDLIB_CRATE := $(S)src/libstd/lib.rs
|
2013-05-17 19:45:09 +02:00
|
|
|
STDLIB_INPUTS := $(wildcard $(addprefix $(S)src/libstd/, \
|
2013-06-10 22:00:38 +02:00
|
|
|
*.rs */*.rs */*/*rs */*/*/*rs))
|
2011-12-06 01:46:37 +01:00
|
|
|
|
2011-03-18 07:51:45 +01:00
|
|
|
######################################################################
|
2013-05-17 19:45:09 +02:00
|
|
|
# Extra library variables
|
2011-03-18 07:51:45 +01:00
|
|
|
######################################################################
|
|
|
|
|
Rename files to match current recommendations.
New standards have arisen in recent months, mostly for the use of
rustpkg, but the main Rust codebase has not been altered to match these
new specifications. This changeset rectifies most of these issues.
- Renamed the crate source files `src/libX/X.rs` to `lib.rs`, for
consistency with current styles; this affects extra, rustc, rustdoc,
rustpkg, rustuv, std, syntax.
- Renamed `X/X.rs` to `X/mod.rs,` as is now recommended style, for
`std::num` and `std::terminfo`.
- Shifted `src/libstd/str/ascii.rs` out of the otherwise unused `str`
directory, to be consistent with its import path of `std::ascii`;
libstd is flat at present so it's more appropriate thus.
While this removes some `#[path = "..."]` directives, it does not remove
all of them, and leaves certain other inconsistencies, such as `std::u8`
et al. which are actually stored in `src/libstd/num/` (one subdirectory
down). No quorum has been reached on this issue, so I felt it best to
leave them all alone at present. #9208 deals with the possibility of
making libstd more hierarchical (such as changing the crate to match the
current filesystem structure, which would make the module path
`std::num::u8`).
There is one thing remaining in which this repository is not
rustpkg-compliant: rustpkg would have `src/std/` et al. rather than
`src/libstd/` et al. I have not endeavoured to change that at this point
as it would guarantee prompt bitrot and confusion. A change of that
magnitude needs to be discussed first.
2013-10-29 07:22:49 +01:00
|
|
|
EXTRALIB_CRATE := $(S)src/libextra/lib.rs
|
2013-05-17 19:45:09 +02:00
|
|
|
EXTRALIB_INPUTS := $(wildcard $(addprefix $(S)src/libextra/, \
|
2013-06-10 22:00:38 +02:00
|
|
|
*.rs */*.rs))
|
2011-03-16 17:17:32 +01:00
|
|
|
|
2013-10-23 00:13:18 +02:00
|
|
|
######################################################################
|
|
|
|
# Rust UV library variables
|
|
|
|
######################################################################
|
|
|
|
|
Rename files to match current recommendations.
New standards have arisen in recent months, mostly for the use of
rustpkg, but the main Rust codebase has not been altered to match these
new specifications. This changeset rectifies most of these issues.
- Renamed the crate source files `src/libX/X.rs` to `lib.rs`, for
consistency with current styles; this affects extra, rustc, rustdoc,
rustpkg, rustuv, std, syntax.
- Renamed `X/X.rs` to `X/mod.rs,` as is now recommended style, for
`std::num` and `std::terminfo`.
- Shifted `src/libstd/str/ascii.rs` out of the otherwise unused `str`
directory, to be consistent with its import path of `std::ascii`;
libstd is flat at present so it's more appropriate thus.
While this removes some `#[path = "..."]` directives, it does not remove
all of them, and leaves certain other inconsistencies, such as `std::u8`
et al. which are actually stored in `src/libstd/num/` (one subdirectory
down). No quorum has been reached on this issue, so I felt it best to
leave them all alone at present. #9208 deals with the possibility of
making libstd more hierarchical (such as changing the crate to match the
current filesystem structure, which would make the module path
`std::num::u8`).
There is one thing remaining in which this repository is not
rustpkg-compliant: rustpkg would have `src/std/` et al. rather than
`src/libstd/` et al. I have not endeavoured to change that at this point
as it would guarantee prompt bitrot and confusion. A change of that
magnitude needs to be discussed first.
2013-10-29 07:22:49 +01:00
|
|
|
LIBRUSTUV_CRATE := $(S)src/librustuv/lib.rs
|
2013-10-23 00:13:18 +02:00
|
|
|
LIBRUSTUV_INPUTS := $(wildcard $(addprefix $(S)src/librustuv/, \
|
|
|
|
*.rs */*.rs))
|
|
|
|
|
2011-03-16 17:17:32 +01:00
|
|
|
######################################################################
|
2011-03-18 07:51:45 +01:00
|
|
|
# rustc crate variables
|
2011-03-16 17:17:32 +01:00
|
|
|
######################################################################
|
|
|
|
|
Rename files to match current recommendations.
New standards have arisen in recent months, mostly for the use of
rustpkg, but the main Rust codebase has not been altered to match these
new specifications. This changeset rectifies most of these issues.
- Renamed the crate source files `src/libX/X.rs` to `lib.rs`, for
consistency with current styles; this affects extra, rustc, rustdoc,
rustpkg, rustuv, std, syntax.
- Renamed `X/X.rs` to `X/mod.rs,` as is now recommended style, for
`std::num` and `std::terminfo`.
- Shifted `src/libstd/str/ascii.rs` out of the otherwise unused `str`
directory, to be consistent with its import path of `std::ascii`;
libstd is flat at present so it's more appropriate thus.
While this removes some `#[path = "..."]` directives, it does not remove
all of them, and leaves certain other inconsistencies, such as `std::u8`
et al. which are actually stored in `src/libstd/num/` (one subdirectory
down). No quorum has been reached on this issue, so I felt it best to
leave them all alone at present. #9208 deals with the possibility of
making libstd more hierarchical (such as changing the crate to match the
current filesystem structure, which would make the module path
`std::num::u8`).
There is one thing remaining in which this repository is not
rustpkg-compliant: rustpkg would have `src/std/` et al. rather than
`src/libstd/` et al. I have not endeavoured to change that at this point
as it would guarantee prompt bitrot and confusion. A change of that
magnitude needs to be discussed first.
2013-10-29 07:22:49 +01:00
|
|
|
COMPILER_CRATE := $(S)src/librustc/lib.rs
|
2012-11-07 04:44:58 +01:00
|
|
|
COMPILER_INPUTS := $(wildcard $(addprefix $(S)src/librustc/, \
|
2013-06-10 22:00:38 +02:00
|
|
|
*.rs */*.rs */*/*.rs */*/*/*.rs))
|
2011-12-20 11:17:13 +01:00
|
|
|
|
Rename files to match current recommendations.
New standards have arisen in recent months, mostly for the use of
rustpkg, but the main Rust codebase has not been altered to match these
new specifications. This changeset rectifies most of these issues.
- Renamed the crate source files `src/libX/X.rs` to `lib.rs`, for
consistency with current styles; this affects extra, rustc, rustdoc,
rustpkg, rustuv, std, syntax.
- Renamed `X/X.rs` to `X/mod.rs,` as is now recommended style, for
`std::num` and `std::terminfo`.
- Shifted `src/libstd/str/ascii.rs` out of the otherwise unused `str`
directory, to be consistent with its import path of `std::ascii`;
libstd is flat at present so it's more appropriate thus.
While this removes some `#[path = "..."]` directives, it does not remove
all of them, and leaves certain other inconsistencies, such as `std::u8`
et al. which are actually stored in `src/libstd/num/` (one subdirectory
down). No quorum has been reached on this issue, so I felt it best to
leave them all alone at present. #9208 deals with the possibility of
making libstd more hierarchical (such as changing the crate to match the
current filesystem structure, which would make the module path
`std::num::u8`).
There is one thing remaining in which this repository is not
rustpkg-compliant: rustpkg would have `src/std/` et al. rather than
`src/libstd/` et al. I have not endeavoured to change that at this point
as it would guarantee prompt bitrot and confusion. A change of that
magnitude needs to be discussed first.
2013-10-29 07:22:49 +01:00
|
|
|
LIBSYNTAX_CRATE := $(S)src/libsyntax/lib.rs
|
2012-05-30 06:35:12 +02:00
|
|
|
LIBSYNTAX_INPUTS := $(wildcard $(addprefix $(S)src/libsyntax/, \
|
2013-07-20 16:37:47 +02:00
|
|
|
*.rs */*.rs */*/*.rs */*/*/*.rs))
|
2012-03-22 23:27:35 +01:00
|
|
|
|
2012-11-07 04:44:58 +01:00
|
|
|
DRIVER_CRATE := $(S)src/driver/driver.rs
|
2011-03-18 07:51:45 +01:00
|
|
|
|
2011-11-02 01:09:44 +01:00
|
|
|
######################################################################
|
|
|
|
# LLVM macros
|
|
|
|
######################################################################
|
|
|
|
|
2011-11-27 07:38:36 +01:00
|
|
|
# FIXME: x86-ism
|
2013-01-29 15:28:08 +01:00
|
|
|
LLVM_COMPONENTS=x86 arm mips ipo bitreader bitwriter linker asmparser jit mcjit \
|
2013-05-28 01:15:31 +02:00
|
|
|
interpreter instrumentation
|
2011-11-27 07:38:36 +01:00
|
|
|
|
2011-11-03 00:21:17 +01:00
|
|
|
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)))
|
|
|
|
|
2011-11-02 23:10:19 +01:00
|
|
|
# Any rules that depend on LLVM should depend on LLVM_CONFIG
|
2013-03-02 13:25:12 +01:00
|
|
|
LLVM_CONFIG_$(1):=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-config$$(X_$(1))
|
|
|
|
LLVM_MC_$(1):=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-mc$$(X_$(1))
|
2011-11-03 00:21:17 +01:00
|
|
|
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)
|
2011-11-27 07:38:36 +01:00
|
|
|
LLVM_LIBS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --libs $$(LLVM_COMPONENTS))
|
2011-11-03 00:21:17 +01:00
|
|
|
LLVM_LDFLAGS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --ldflags)
|
2012-01-26 10:13:57 +01:00
|
|
|
# On FreeBSD, it may search wrong headers (that are for pre-installed LLVM),
|
|
|
|
# so we replace -I with -iquote to ensure that it searches bundled LLVM first.
|
|
|
|
LLVM_CXXFLAGS_$(1)=$$(subst -I, -iquote , $$(shell "$$(LLVM_CONFIG_$(1))" --cxxflags))
|
2011-11-03 00:21:17 +01:00
|
|
|
LLVM_HOST_TRIPLE_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --host-target)
|
|
|
|
|
2013-03-02 13:25:12 +01:00
|
|
|
LLVM_AS_$(1)=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-as$$(X_$(1))
|
|
|
|
LLC_$(1)=$$(CFG_LLVM_INST_DIR_$(1))/bin/llc$$(X_$(1))
|
2011-11-03 00:21:17 +01:00
|
|
|
|
|
|
|
endef
|
|
|
|
|
2013-10-21 11:18:21 +02:00
|
|
|
$(foreach host,$(CFG_HOST), \
|
2013-02-22 01:15:01 +01:00
|
|
|
$(eval $(call DEF_LLVM_VARS,$(host))))
|
2011-11-03 00:21:17 +01:00
|
|
|
|
2011-05-03 08:37:52 +02:00
|
|
|
######################################################################
|
|
|
|
# Exports for sub-utilities
|
|
|
|
######################################################################
|
|
|
|
|
2011-10-02 05:12:08 +02:00
|
|
|
# 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
|
2011-07-23 21:26:47 +02:00
|
|
|
export CFG_BUILD_DIR
|
2011-05-06 20:21:51 +02:00
|
|
|
export CFG_VERSION
|
2013-06-28 00:36:05 +02:00
|
|
|
export CFG_VERSION_WIN
|
2013-10-21 11:18:21 +02:00
|
|
|
export CFG_BUILD
|
2011-05-18 21:00:26 +02:00
|
|
|
export CFG_LLVM_ROOT
|
2011-06-28 20:18:25 +02:00
|
|
|
export CFG_ENABLE_MINGW_CROSS
|
2011-10-02 05:12:08 +02:00
|
|
|
export CFG_PREFIX
|
2012-01-11 02:45:03 +01:00
|
|
|
export CFG_LIBDIR
|
2011-05-03 08:37:52 +02:00
|
|
|
|
2011-05-05 03:28:30 +02:00
|
|
|
######################################################################
|
|
|
|
# Subprograms
|
|
|
|
######################################################################
|
|
|
|
|
2011-03-18 07:51:45 +01:00
|
|
|
######################################################################
|
2011-07-16 01:12:41 +02:00
|
|
|
# Per-stage targets and runner
|
|
|
|
######################################################################
|
|
|
|
|
|
|
|
define SREQ
|
2011-11-21 22:11:40 +01:00
|
|
|
# $(1) is the stage number
|
|
|
|
# $(2) is the target triple
|
2011-11-30 04:28:15 +01:00
|
|
|
# $(3) is the host triple
|
2011-09-30 21:08:51 +02:00
|
|
|
|
2011-09-30 21:24:28 +02:00
|
|
|
# Destinations of artifacts for the host compiler
|
2011-11-21 22:11:40 +01:00
|
|
|
HROOT$(1)_H_$(3) = $(3)/stage$(1)
|
|
|
|
HBIN$(1)_H_$(3) = $$(HROOT$(1)_H_$(3))/bin
|
2012-01-11 02:45:03 +01:00
|
|
|
HLIB$(1)_H_$(3) = $$(HROOT$(1)_H_$(3))/$$(CFG_LIBDIR)
|
2011-09-30 21:24:28 +02:00
|
|
|
|
2011-10-01 04:00:19 +02:00
|
|
|
# Destinations of artifacts for target architectures
|
2011-11-21 22:11:40 +01:00
|
|
|
TROOT$(1)_T_$(2)_H_$(3) = $$(HLIB$(1)_H_$(3))/rustc/$(2)
|
|
|
|
TBIN$(1)_T_$(2)_H_$(3) = $$(TROOT$(1)_T_$(2)_H_$(3))/bin
|
2012-01-11 02:45:03 +01:00
|
|
|
TLIB$(1)_T_$(2)_H_$(3) = $$(TROOT$(1)_T_$(2)_H_$(3))/$$(CFG_LIBDIR)
|
2011-09-30 21:08:51 +02:00
|
|
|
|
2013-05-17 19:45:09 +02:00
|
|
|
# The name of the standard and extra libraries used by rustc
|
Add generation of static libraries to rustc
This commit implements the support necessary for generating both intermediate
and result static rust libraries. This is an implementation of my thoughts in
https://mail.mozilla.org/pipermail/rust-dev/2013-November/006686.html.
When compiling a library, we still retain the "lib" option, although now there
are "rlib", "staticlib", and "dylib" as options for crate_type (and these are
stackable). The idea of "lib" is to generate the "compiler default" instead of
having too choose (although all are interchangeable). For now I have left the
"complier default" to be a dynamic library for size reasons.
Of the rust libraries, lib{std,extra,rustuv} will bootstrap with an
rlib/dylib pair, but lib{rustc,syntax,rustdoc,rustpkg} will only be built as a
dynamic object. I chose this for size reasons, but also because you're probably
not going to be embedding the rustc compiler anywhere any time soon.
Other than the options outlined above, there are a few defaults/preferences that
are now opinionated in the compiler:
* If both a .dylib and .rlib are found for a rust library, the compiler will
prefer the .rlib variant. This is overridable via the -Z prefer-dynamic option
* If generating a "lib", the compiler will generate a dynamic library. This is
overridable by explicitly saying what flavor you'd like (rlib, staticlib,
dylib).
* If no options are passed to the command line, and no crate_type is found in
the destination crate, then an executable is generated
With this change, you can successfully build a rust program with 0 dynamic
dependencies on rust libraries. There is still a dynamic dependency on
librustrt, but I plan on removing that in a subsequent commit.
This change includes no tests just yet. Our current testing
infrastructure/harnesses aren't very amenable to doing flavorful things with
linking, so I'm planning on adding a new mode of testing which I believe belongs
as a separate commit.
Closes #552
2013-11-15 23:03:29 +01:00
|
|
|
HSTDLIB_DEFAULT$(1)_H_$(3) = \
|
|
|
|
$$(HLIB$(1)_H_$(3))/$(CFG_STDLIB_$(3))
|
|
|
|
TSTDLIB_DEFAULT$(1)_T_$(2)_H_$(3) = \
|
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_STDLIB_$(2))
|
|
|
|
|
|
|
|
HEXTRALIB_DEFAULT$(1)_H_$(3) = \
|
|
|
|
$$(HLIB$(1)_H_$(3))/$(CFG_EXTRALIB_$(3))
|
|
|
|
TEXTRALIB_DEFAULT$(1)_T_$(2)_H_$(3) = \
|
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_EXTRALIB_$(2))
|
|
|
|
|
|
|
|
HLIBRUSTC_DEFAULT$(1)_H_$(3) = \
|
|
|
|
$$(HLIB$(1)_H_$(3))/$(CFG_LIBRUSTC_$(3))
|
|
|
|
TLIBRUSTC_DEFAULT$(1)_T_$(2)_H_$(3) = \
|
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTC_$(2))
|
|
|
|
|
|
|
|
HLIBRUSTUV_DEFAULT$(1)_H_$(3) = \
|
|
|
|
$$(HLIB$(1)_H_$(3))/$(CFG_LIBRUSTUV_$(3))
|
|
|
|
TLIBRUSTUV_DEFAULT$(1)_T_$(2)_H_$(3) = \
|
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTUV_$(2))
|
2011-10-01 01:11:47 +02:00
|
|
|
|
2011-10-02 05:12:08 +02:00
|
|
|
# Preqrequisites for using the stageN compiler
|
2011-11-21 22:11:40 +01:00
|
|
|
HSREQ$(1)_H_$(3) = \
|
2013-03-02 13:25:12 +01:00
|
|
|
$$(HBIN$(1)_H_$(3))/rustc$$(X_$(3)) \
|
2013-02-27 06:53:35 +01:00
|
|
|
$$(HLIB$(1)_H_$(3))/$(CFG_RUNTIME_$(3)) \
|
|
|
|
$$(HLIB$(1)_H_$(3))/$(CFG_RUSTLLVM_$(3)) \
|
2011-11-21 22:11:40 +01:00
|
|
|
$$(HSTDLIB_DEFAULT$(1)_H_$(3)) \
|
2013-05-17 19:45:09 +02:00
|
|
|
$$(HEXTRALIB_DEFAULT$(1)_H_$(3)) \
|
2012-11-13 22:32:49 +01:00
|
|
|
$$(HLIBSYNTAX_DEFAULT$(1)_H_$(3)) \
|
2011-12-17 02:21:18 +01:00
|
|
|
$$(HLIBRUSTC_DEFAULT$(1)_H_$(3)) \
|
2013-10-23 00:13:18 +02:00
|
|
|
$$(HLIBRUSTUV_DEFAULT$(1)_H_$(3)) \
|
2011-11-29 21:42:05 +01:00
|
|
|
$$(MKFILE_DEPS)
|
2011-10-02 05:12:08 +02:00
|
|
|
|
|
|
|
# Prerequisites for using the stageN compiler to build target artifacts
|
2011-11-21 22:11:40 +01:00
|
|
|
TSREQ$(1)_T_$(2)_H_$(3) = \
|
|
|
|
$$(HSREQ$(1)_H_$(3)) \
|
2013-02-27 06:53:35 +01:00
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_RUNTIME_$(2)) \
|
2011-11-21 22:11:40 +01:00
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/libmorestack.a
|
2011-10-02 05:12:08 +02:00
|
|
|
|
2012-11-16 03:13:37 +01:00
|
|
|
# Prerequisites for a working stageN compiler and libraries, for a specific target
|
2011-11-21 22:11:40 +01:00
|
|
|
SREQ$(1)_T_$(2)_H_$(3) = \
|
|
|
|
$$(TSREQ$(1)_T_$(2)_H_$(3)) \
|
2013-05-17 19:45:09 +02:00
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_STDLIB_$(2)) \
|
2013-10-23 00:13:18 +02:00
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_EXTRALIB_$(2)) \
|
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTUV_$(2))
|
2012-11-13 22:32:49 +01:00
|
|
|
|
2012-11-16 03:13:37 +01:00
|
|
|
# Prerequisites for a working stageN compiler and libraries, for a specific target
|
2012-11-13 22:32:49 +01:00
|
|
|
CSREQ$(1)_T_$(2)_H_$(3) = \
|
|
|
|
$$(TSREQ$(1)_T_$(2)_H_$(3)) \
|
2013-03-02 13:25:12 +01:00
|
|
|
$$(HBIN$(1)_H_$(3))/rustpkg$$(X_$(3)) \
|
|
|
|
$$(HBIN$(1)_H_$(3))/rustdoc$$(X_$(3)) \
|
2013-02-27 06:53:35 +01:00
|
|
|
$$(HLIB$(1)_H_$(3))/$(CFG_LIBRUSTPKG_$(3)) \
|
|
|
|
$$(HLIB$(1)_H_$(3))/$(CFG_LIBRUSTDOC_$(3)) \
|
2013-05-17 19:45:09 +02:00
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_STDLIB_$(2)) \
|
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_EXTRALIB_$(2)) \
|
2013-03-02 13:25:12 +01:00
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBSYNTAX_$(2)) \
|
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTC_$(2)) \
|
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTPKG_$(2)) \
|
2013-10-23 00:13:18 +02:00
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTDOC_$(2)) \
|
|
|
|
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTUV_$(2))
|
2011-07-16 01:12:41 +02:00
|
|
|
|
2011-08-26 20:11:49 +02:00
|
|
|
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
|
|
|
|
|
2012-06-28 01:01:19 +02:00
|
|
|
# Add RUSTFLAGS_STAGEN values to the build command
|
|
|
|
EXTRAFLAGS_STAGE$(1) = $$(RUSTFLAGS_STAGE$(1))
|
|
|
|
|
2012-09-23 23:05:44 +02:00
|
|
|
CFGFLAG$(1)_T_$(2)_H_$(3) = stage$(1)
|
|
|
|
|
2012-09-26 23:57:35 +02:00
|
|
|
# Pass --cfg stage0 only for the build->host part of stage0;
|
|
|
|
# if you're building a cross config, the host->* parts are
|
|
|
|
# effectively stage1, since it uses the just-built stage0.
|
|
|
|
ifeq ($(1),0)
|
2013-10-21 11:18:21 +02:00
|
|
|
ifneq ($(strip $(CFG_BUILD)),$(strip $(3)))
|
2012-09-26 23:57:35 +02:00
|
|
|
CFGFLAG$(1)_T_$(2)_H_$(3) = stage1
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
2011-11-21 22:11:40 +01:00
|
|
|
STAGE$(1)_T_$(2)_H_$(3) := \
|
2013-03-02 13:25:12 +01:00
|
|
|
$$(Q)$$(call CFG_RUN_TARG_$(3),$(1), \
|
2012-10-20 23:27:56 +02:00
|
|
|
$$(CFG_VALGRIND_COMPILE$(1)) \
|
2013-03-02 13:25:12 +01:00
|
|
|
$$(HBIN$(1)_H_$(3))/rustc$$(X_$(3)) \
|
2012-09-23 23:05:44 +02:00
|
|
|
--cfg $$(CFGFLAG$(1)_T_$(2)_H_$(3)) \
|
2013-03-02 13:25:12 +01:00
|
|
|
$$(CFG_RUSTC_FLAGS) $$(EXTRAFLAGS_STAGE$(1)) --target=$(2)) \
|
|
|
|
$$(RUSTC_FLAGS_$(2))
|
2011-09-29 21:06:37 +02:00
|
|
|
|
2011-11-21 22:11:40 +01:00
|
|
|
PERF_STAGE$(1)_T_$(2)_H_$(3) := \
|
2013-03-02 13:25:12 +01:00
|
|
|
$$(Q)$$(call CFG_RUN_TARG_$(3),$(1), \
|
2011-11-21 22:11:40 +01:00
|
|
|
$$(CFG_PERF_TOOL) \
|
2013-03-02 13:25:12 +01:00
|
|
|
$$(HBIN$(1)_H_$(3))/rustc$$(X_$(3)) \
|
2012-09-23 23:05:44 +02:00
|
|
|
--cfg $$(CFGFLAG$(1)_T_$(2)_H_$(3)) \
|
2013-03-02 13:25:12 +01:00
|
|
|
$$(CFG_RUSTC_FLAGS) $$(EXTRAFLAGS_STAGE$(1)) --target=$(2)) \
|
|
|
|
$$(RUSTC_FLAGS_$(2))
|
2011-09-29 21:06:37 +02:00
|
|
|
|
2011-07-16 01:12:41 +02:00
|
|
|
endef
|
|
|
|
|
2013-10-21 11:18:21 +02:00
|
|
|
$(foreach build,$(CFG_HOST), \
|
|
|
|
$(eval $(foreach target,$(CFG_TARGET), \
|
2011-11-21 22:11:40 +01:00
|
|
|
$(eval $(foreach stage,$(STAGES), \
|
|
|
|
$(eval $(call SREQ,$(stage),$(target),$(build))))))))
|
2011-07-16 01:12:41 +02:00
|
|
|
|
2011-12-03 01:04:27 +01:00
|
|
|
######################################################################
|
|
|
|
# rustc-H-targets
|
|
|
|
#
|
|
|
|
# Builds a functional Rustc for the given host.
|
|
|
|
######################################################################
|
|
|
|
|
2011-12-06 23:02:03 +01:00
|
|
|
define DEF_RUSTC_STAGE_TARGET
|
2011-12-03 01:04:27 +01:00
|
|
|
# $(1) == architecture
|
2011-12-06 23:02:03 +01:00
|
|
|
# $(2) == stage
|
2011-12-03 01:04:27 +01:00
|
|
|
|
2011-12-06 23:02:03 +01:00
|
|
|
rustc-stage$(2)-H-$(1): \
|
2013-10-21 11:18:21 +02:00
|
|
|
$$(foreach target,$$(CFG_TARGET), \
|
2011-12-06 23:02:03 +01:00
|
|
|
$$(SREQ$(2)_T_$$(target)_H_$(1)))
|
|
|
|
|
|
|
|
endef
|
|
|
|
|
2013-10-21 11:18:21 +02:00
|
|
|
$(foreach host,$(CFG_HOST), \
|
2011-12-06 23:02:03 +01:00
|
|
|
$(eval $(foreach stage,1 2 3, \
|
|
|
|
$(eval $(call DEF_RUSTC_STAGE_TARGET,$(host),$(stage))))))
|
|
|
|
|
2013-10-21 11:18:21 +02:00
|
|
|
rustc-stage1: rustc-stage1-H-$(CFG_BUILD)
|
|
|
|
rustc-stage2: rustc-stage2-H-$(CFG_BUILD)
|
|
|
|
rustc-stage3: rustc-stage3-H-$(CFG_BUILD)
|
2011-12-09 17:16:04 +01:00
|
|
|
|
2011-12-06 23:02:03 +01:00
|
|
|
define DEF_RUSTC_TARGET
|
|
|
|
# $(1) == architecture
|
|
|
|
|
2012-01-16 06:42:03 +01:00
|
|
|
rustc-H-$(1): rustc-stage2-H-$(1)
|
2011-12-03 01:04:27 +01:00
|
|
|
endef
|
|
|
|
|
2013-10-21 11:18:21 +02:00
|
|
|
$(foreach host,$(CFG_TARGET), \
|
2011-12-03 01:04:27 +01:00
|
|
|
$(eval $(call DEF_RUSTC_TARGET,$(host))))
|
|
|
|
|
2013-10-21 11:18:21 +02:00
|
|
|
rustc-stage1: rustc-stage1-H-$(CFG_BUILD)
|
|
|
|
rustc-stage2: rustc-stage2-H-$(CFG_BUILD)
|
|
|
|
rustc-stage3: rustc-stage3-H-$(CFG_BUILD)
|
|
|
|
rustc: rustc-H-$(CFG_BUILD)
|
2011-12-13 05:28:35 +01:00
|
|
|
|
2013-10-21 11:18:21 +02:00
|
|
|
rustc-H-all: $(foreach host,$(CFG_HOST),rustc-H-$(host))
|
2011-12-03 01:04:27 +01:00
|
|
|
|
2011-07-16 01:12:41 +02:00
|
|
|
######################################################################
|
|
|
|
# Entrypoint rule
|
2011-03-18 07:51:45 +01:00
|
|
|
######################################################################
|
2011-03-16 17:17:32 +01:00
|
|
|
|
2011-12-13 21:02:17 +01:00
|
|
|
.DEFAULT_GOAL := all
|
|
|
|
|
2011-05-14 02:00:43 +02:00
|
|
|
ifneq ($(CFG_IN_TRANSITION),)
|
|
|
|
|
2011-05-17 00:14:58 +02:00
|
|
|
CFG_INFO := $(info cfg:)
|
2011-05-14 02:00:43 +02:00
|
|
|
CFG_INFO := $(info cfg: *** compiler is in snapshot transition ***)
|
|
|
|
CFG_INFO := $(info cfg: *** stage2 and later will not be built ***)
|
2011-05-17 00:14:58 +02:00
|
|
|
CFG_INFO := $(info cfg:)
|
2011-05-14 02:00:43 +02:00
|
|
|
|
2012-11-16 03:13:37 +01:00
|
|
|
#XXX This is surely busted
|
2013-10-21 11:18:21 +02:00
|
|
|
all: $(SREQ1$(CFG_BUILD)) $(GENERATED) docs
|
2011-10-01 01:15:02 +02:00
|
|
|
|
2011-05-14 02:00:43 +02:00
|
|
|
else
|
2011-09-30 05:27:28 +02:00
|
|
|
|
2012-11-16 03:13:37 +01:00
|
|
|
define ALL_TARGET_N
|
2013-10-21 11:18:21 +02:00
|
|
|
ifneq ($$(findstring $(1),$$(CFG_HOST)),)
|
2013-02-22 01:15:01 +01:00
|
|
|
# This is a host
|
2012-11-16 03:13:37 +01:00
|
|
|
all-target-$(1)-host-$(2): $$(CSREQ2_T_$(1)_H_$(2))
|
2013-02-22 01:15:01 +01:00
|
|
|
else
|
|
|
|
# This is a target only
|
|
|
|
all-target-$(1)-host-$(2): $$(SREQ2_T_$(1)_H_$(2))
|
|
|
|
endif
|
2012-11-16 03:13:37 +01:00
|
|
|
endef
|
|
|
|
|
2013-10-21 11:18:21 +02:00
|
|
|
$(foreach target,$(CFG_TARGET), \
|
|
|
|
$(foreach host,$(CFG_HOST), \
|
2013-02-22 01:15:01 +01:00
|
|
|
$(eval $(call ALL_TARGET_N,$(target),$(host)))))
|
2012-11-16 03:13:37 +01:00
|
|
|
|
2013-10-21 11:18:21 +02:00
|
|
|
ALL_TARGET_RULES = $(foreach target,$(CFG_TARGET), \
|
|
|
|
$(foreach host,$(CFG_HOST), \
|
2013-02-22 01:15:01 +01:00
|
|
|
all-target-$(target)-host-$(host)))
|
2012-11-16 03:13:37 +01:00
|
|
|
|
2013-09-04 08:47:13 +02:00
|
|
|
all: $(ALL_TARGET_RULES) $(GENERATED) docs
|
2011-09-30 05:27:28 +02:00
|
|
|
|
2011-05-14 02:00:43 +02:00
|
|
|
endif
|
|
|
|
|
2011-03-25 18:29:45 +01:00
|
|
|
|
|
|
|
######################################################################
|
|
|
|
# Re-configuration
|
|
|
|
######################################################################
|
|
|
|
|
2011-11-29 02:50:23 +01:00
|
|
|
ifndef CFG_DISABLE_MANAGE_SUBMODULES
|
2011-11-01 02:19:40 +01:00
|
|
|
# This is a pretty expensive operation but I don't see any way to avoid it
|
2011-11-26 05:00:48 +01:00
|
|
|
NEED_GIT_RECONFIG=$(shell cd "$(CFG_SRC_DIR)" && "$(CFG_GIT)" submodule status | grep -c '^\(+\|-\)')
|
2011-11-29 02:50:23 +01:00
|
|
|
else
|
|
|
|
NEED_GIT_RECONFIG=0
|
|
|
|
endif
|
2011-11-01 02:19:40 +01:00
|
|
|
|
|
|
|
ifeq ($(NEED_GIT_RECONFIG),0)
|
|
|
|
else
|
|
|
|
# If the submodules have changed then always execute config.mk
|
2012-03-27 01:04:37 +02:00
|
|
|
.PHONY: config.stamp
|
2011-11-01 02:19:40 +01:00
|
|
|
endif
|
|
|
|
|
2012-03-27 01:04:37 +02:00
|
|
|
Makefile config.mk: config.stamp
|
|
|
|
|
|
|
|
config.stamp: $(S)configure $(S)Makefile.in $(S)src/snapshots.txt
|
2011-03-25 18:29:45 +01:00
|
|
|
@$(call E, cfg: reconfiguring)
|
2011-06-30 22:41:20 +02:00
|
|
|
$(Q)$(S)configure $(CFG_CONFIGURE_ARGS)
|
2011-03-25 18:29:45 +01:00
|
|
|
|
|
|
|
|
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
|
|
|
######################################################################
|
|
|
|
|
2013-09-26 23:56:53 +02:00
|
|
|
# Issue #9531: If you change the order of any of the following (or add
|
|
|
|
# new definitions), make sure definitions always precede their uses,
|
|
|
|
# especially for the dependency lists of recipes.
|
|
|
|
|
2013-10-31 07:57:27 +01:00
|
|
|
include $(CFG_SRC_DIR)mk/rt.mk
|
2012-03-27 01:05:33 +02:00
|
|
|
include $(CFG_SRC_DIR)mk/target.mk
|
|
|
|
include $(CFG_SRC_DIR)mk/host.mk
|
|
|
|
include $(CFG_SRC_DIR)mk/stage0.mk
|
|
|
|
include $(CFG_SRC_DIR)mk/rustllvm.mk
|
|
|
|
include $(CFG_SRC_DIR)mk/tools.mk
|
|
|
|
include $(CFG_SRC_DIR)mk/docs.mk
|
|
|
|
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)) \
|
2011-07-14 00:44:09 +02:00
|
|
|
$(findstring tidy,$(MAKECMDGOALS)) \
|
2011-06-30 22:41:20 +02:00
|
|
|
$(findstring clean,$(MAKECMDGOALS))),)
|
|
|
|
CFG_INFO := $(info cfg: including dist rules)
|
2012-03-27 01:05:33 +02:00
|
|
|
include $(CFG_SRC_DIR)mk/dist.mk
|
2011-06-25 21:23:27 +02:00
|
|
|
endif
|
|
|
|
|
2011-06-30 22:41:20 +02:00
|
|
|
ifneq ($(strip $(findstring snap,$(MAKECMDGOALS)) \
|
|
|
|
$(findstring clean,$(MAKECMDGOALS))),)
|
|
|
|
CFG_INFO := $(info cfg: including snap rules)
|
2012-03-27 01:05:33 +02:00
|
|
|
include $(CFG_SRC_DIR)mk/snap.mk
|
2011-06-25 21:23:27 +02:00
|
|
|
endif
|
|
|
|
|
|
|
|
ifneq ($(findstring reformat,$(MAKECMDGOALS)),)
|
2011-06-30 22:41:20 +02:00
|
|
|
CFG_INFO := $(info cfg: including reformat rules)
|
2012-03-27 01:05:33 +02:00
|
|
|
include $(CFG_SRC_DIR)mk/pp.mk
|
2011-06-25 21:23:27 +02:00
|
|
|
endif
|
|
|
|
|
2011-06-30 22:41:20 +02:00
|
|
|
ifneq ($(strip $(findstring check,$(MAKECMDGOALS)) \
|
|
|
|
$(findstring test,$(MAKECMDGOALS)) \
|
2011-09-14 00:06:21 +02:00
|
|
|
$(findstring perf,$(MAKECMDGOALS)) \
|
2011-06-30 22:41:20 +02:00
|
|
|
$(findstring tidy,$(MAKECMDGOALS))),)
|
|
|
|
CFG_INFO := $(info cfg: including test rules)
|
2012-03-27 01:05:33 +02:00
|
|
|
include $(CFG_SRC_DIR)mk/tests.mk
|
2011-06-25 21:23:27 +02:00
|
|
|
endif
|
|
|
|
|
2011-09-14 00:06:21 +02:00
|
|
|
ifneq ($(findstring perf,$(MAKECMDGOALS)),)
|
|
|
|
CFG_INFO := $(info cfg: including perf rules)
|
2012-03-27 01:05:33 +02:00
|
|
|
include $(CFG_SRC_DIR)mk/perf.mk
|
2011-09-14 00:06:21 +02:00
|
|
|
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)
|
2012-03-27 01:05:33 +02:00
|
|
|
include $(CFG_SRC_DIR)mk/clean.mk
|
2011-07-21 20:58:01 +02:00
|
|
|
endif
|
2011-10-01 04:00:19 +02:00
|
|
|
|
|
|
|
ifneq ($(findstring install,$(MAKECMDGOALS)),)
|
|
|
|
CFG_INFO := $(info cfg: including install rules)
|
2012-03-27 01:05:33 +02:00
|
|
|
include $(CFG_SRC_DIR)mk/install.mk
|
2011-10-12 21:10:21 +02:00
|
|
|
endif
|
|
|
|
|
|
|
|
ifneq ($(strip $(findstring TAGS.emacs,$(MAKECMDGOALS)) \
|
|
|
|
$(findstring TAGS.vi,$(MAKECMDGOALS))),)
|
|
|
|
CFG_INFO := $(info cfg: including ctags rules)
|
2012-03-27 01:05:33 +02:00
|
|
|
include $(CFG_SRC_DIR)mk/ctags.mk
|
2011-10-12 21:10:21 +02:00
|
|
|
endif
|
2012-06-14 20:07:19 +02:00
|
|
|
|
|
|
|
# Find all of the .d files and include them to add information about
|
|
|
|
# header file dependencies.
|
|
|
|
ALL_DEP_FILES := $(ALL_OBJ_FILES:%.o=%.d)
|
|
|
|
-include $(ALL_DEP_FILES)
|