1 # Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2 # file at the top-level directory of this distribution and at
3 # http://rust-lang.org/COPYRIGHT.
5 # Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 # http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 # <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 # option. This file may not be copied, modified, or distributed
9 # except according to those terms.
11 # This is the compile-time target-triple for the compiler. For the compiler at
12 # runtime, this should be considered the host-triple. More explanation for why
13 # this exists can be found on issue #2400
14 export CFG_COMPILER_HOST_TRIPLE
16 # The standard libraries should be held up to a higher standard than any old
17 # code, make sure that these common warnings are denied by default. These can
18 # be overridden during development temporarily. For stage0, we allow warnings
19 # which may be bugs in stage0 (should be fixed in stage1+)
20 RUST_LIB_FLAGS_ST0 += -W warnings
21 RUST_LIB_FLAGS_ST1 += -D warnings
22 RUST_LIB_FLAGS_ST2 += -D warnings
24 # Macro that generates the full list of dependencies for a crate at a particular
25 # stage/target/host tuple.
31 define RUST_CRATE_FULLDEPS
32 CRATE_FULLDEPS_$(1)_T_$(2)_H_$(3)_$(4) := \
35 $$(foreach dep,$$(RUST_DEPS_$(4)), \
36 $$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$$(dep)) \
37 $$(foreach dep,$$(NATIVE_DEPS_$(4)), \
38 $$(RT_OUTPUT_DIR_$(2))/$$(call CFG_STATIC_LIB_NAME_$(2),$$(dep)))
41 $(foreach host,$(CFG_HOST), \
42 $(foreach target,$(CFG_TARGET), \
43 $(foreach stage,$(STAGES), \
44 $(foreach crate,$(CRATES), \
45 $(eval $(call RUST_CRATE_FULLDEPS,$(stage),$(target),$(host),$(crate)))))))
47 # RUST_TARGET_STAGE_N template: This defines how target artifacts are built
48 # for all stage/target architecture combinations. This is one giant rule which
51 # 1. The immediate dependencies are the rust source files
52 # 2. Each rust crate dependency is listed (based on their stamp files),
53 # as well as all native dependencies (listed in RT_OUTPUT_DIR)
54 # 3. The stage (n-1) compiler is required through the TSREQ dependency, along
55 # with the morestack library
56 # 4. When actually executing the rule, the first thing we do is to clean out
57 # old libs and rlibs via the REMOVE_ALL_OLD_GLOB_MATCHES macro
58 # 5. Finally, we get around to building the actual crate. It's just one
59 # "small" invocation of the previous stage rustc. We use -L to
60 # RT_OUTPUT_DIR so all the native dependencies are picked up.
61 # Additionally, we pass in the llvm dir so rustc can link against it.
62 # 6. Some cleanup is done (listing what was just built) if verbose is turned
66 # $(2) is the target triple
67 # $(3) is the host triple
68 # $(4) is the crate name
69 define RUST_TARGET_STAGE_N
71 $$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$(4): CFG_COMPILER_HOST_TRIPLE = $(2)
72 $$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$(4): \
74 $$(CRATE_FULLDEPS_$(1)_T_$(2)_H_$(3)_$(4)) \
75 $$(LLVM_CONFIG_$(2)) \
76 $$(TSREQ$(1)_T_$(2)_H_$(3)) \
77 | $$(TLIB$(1)_T_$(2)_H_$(3))/
78 @$$(call E, rustc: $$(@D)/lib$(4))
80 $$(call REMOVE_ALL_OLD_GLOB_MATCHES, \
81 $$(dir $$@)$$(call CFG_LIB_GLOB_$(2),$(4)))
82 $$(call REMOVE_ALL_OLD_GLOB_MATCHES, \
83 $$(dir $$@)$$(call CFG_RLIB_GLOB,$(4)))
84 $(Q)CFG_LLVM_LINKAGE_FILE=$$(LLVM_LINKAGE_PATH_$(3)) \
85 $$(subst @,,$$(STAGE$(1)_T_$(2)_H_$(3))) \
86 $$(RUST_LIB_FLAGS_ST$(1)) \
87 -L "$$(RT_OUTPUT_DIR_$(2))" \
88 $$(LLVM_LIBDIR_RUSTFLAGS_$(2)) \
89 $$(LLVM_STDCPP_RUSTFLAGS_$(2)) \
92 -C extra-filename=-$$(CFG_FILENAME_EXTRA) \
94 @touch -r $$@.start_time $$@ && rm $$@.start_time
95 $$(call LIST_ALL_OLD_GLOB_MATCHES, \
96 $$(dir $$@)$$(call CFG_LIB_GLOB_$(2),$(4)))
97 $$(call LIST_ALL_OLD_GLOB_MATCHES, \
98 $$(dir $$@)$$(call CFG_RLIB_GLOB,$(4)))
102 # Macro for building any tool as part of the rust compilation process. Each
103 # tool is defined in crates.mk with a list of library dependencies as well as
104 # the source file for the tool. Building each tool will also be passed '--cfg
105 # <tool>' for usage in driver.rs
107 # This build rule is similar to the one found above, just tweaked for
108 # locations and things.
111 # $(2) - target triple
113 # $(4) - name of the tool being built
116 $$(TBIN$(1)_T_$(2)_H_$(3))/$(4)$$(X_$(2)): \
117 $$(TOOL_SOURCE_$(4)) \
118 $$(TOOL_INPUTS_$(4)) \
119 $$(foreach dep,$$(TOOL_DEPS_$(4)), \
120 $$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$$(dep)) \
121 $$(TSREQ$(1)_T_$(2)_H_$(3)) \
122 | $$(TBIN$(1)_T_$(2)_H_$(3))/
123 @$$(call E, rustc: $$@)
124 $$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --cfg $(4)
128 # Every recipe in RUST_TARGET_STAGE_N outputs to $$(TLIB$(1)_T_$(2)_H_$(3),
129 # a directory that can be cleaned out during the middle of a run of
130 # the get-snapshot.py script. Therefore, every recipe needs to have
131 # an order-only dependency either on $(SNAPSHOT_RUSTC_POST_CLEANUP) or
132 # on $$(TSREQ$(1)_T_$(2)_H_$(3)), to ensure that no products will be
133 # put into the target area until after the get-snapshot.py script has
134 # had its chance to clean it out; otherwise the other products will be
135 # inadvertently included in the clean out.
136 SNAPSHOT_RUSTC_POST_CLEANUP=$(HBIN0_H_$(CFG_BUILD))/rustc$(X_$(CFG_BUILD))
138 define TARGET_HOST_RULES
140 $$(TBIN$(1)_T_$(2)_H_$(3))/:
143 $$(TLIB$(1)_T_$(2)_H_$(3))/:
146 $$(TLIB$(1)_T_$(2)_H_$(3))/libcompiler-rt.a: \
147 $$(RT_OUTPUT_DIR_$(2))/$$(call CFG_STATIC_LIB_NAME_$(2),compiler-rt) \
148 | $$(TLIB$(1)_T_$(2)_H_$(3))/ $$(SNAPSHOT_RUSTC_POST_CLEANUP)
152 $$(TLIB$(1)_T_$(2)_H_$(3))/libmorestack.a: \
153 $$(RT_OUTPUT_DIR_$(2))/$$(call CFG_STATIC_LIB_NAME_$(2),morestack) \
154 | $$(TLIB$(1)_T_$(2)_H_$(3))/ $$(SNAPSHOT_RUSTC_POST_CLEANUP)
159 $(foreach source,$(CFG_HOST), \
160 $(foreach target,$(CFG_TARGET), \
161 $(eval $(call TARGET_HOST_RULES,0,$(target),$(source))) \
162 $(eval $(call TARGET_HOST_RULES,1,$(target),$(source))) \
163 $(eval $(call TARGET_HOST_RULES,2,$(target),$(source))) \
164 $(eval $(call TARGET_HOST_RULES,3,$(target),$(source)))))
166 # In principle, each host can build each target for both libs and tools
167 $(foreach crate,$(CRATES), \
168 $(foreach source,$(CFG_HOST), \
169 $(foreach target,$(CFG_TARGET), \
170 $(eval $(call RUST_TARGET_STAGE_N,0,$(target),$(source),$(crate))) \
171 $(eval $(call RUST_TARGET_STAGE_N,1,$(target),$(source),$(crate))) \
172 $(eval $(call RUST_TARGET_STAGE_N,2,$(target),$(source),$(crate))) \
173 $(eval $(call RUST_TARGET_STAGE_N,3,$(target),$(source),$(crate))))))
175 $(foreach host,$(CFG_HOST), \
176 $(foreach target,$(CFG_TARGET), \
177 $(foreach stage,$(STAGES), \
178 $(foreach tool,$(TOOLS), \
179 $(eval $(call TARGET_TOOL,$(stage),$(target),$(host),$(tool)))))))