]> git.lizzy.rs Git - rust.git/blob - mk/target.mk
librustc: Don't try to perform the magical
[rust.git] / mk / target.mk
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.
4 #
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.
10
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
15
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 WFLAGS_ST0 = -W warnings
21 WFLAGS_ST1 = -D warnings
22 WFLAGS_ST2 = -D warnings
23
24 # Macro that generates the full list of dependencies for a crate at a particular
25 # stage/target/host tuple.
26 #
27 # $(1) - stage
28 # $(2) - target
29 # $(3) - host
30 # $(4) crate
31 define RUST_CRATE_FULLDEPS
32 CRATE_FULLDEPS_$(1)_T_$(2)_H_$(3)_$(4) :=                           \
33                 $$(CRATEFILE_$(4))                                  \
34                 $$(RSINPUTS_$(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)))
39 endef
40
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)))))))
46
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
49 # works as follows:
50 #
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
63 #      on.
64 #
65 # $(1) is the stage
66 # $(2) is the target triple
67 # $(3) is the host triple
68 # $(4) is the crate name
69 define RUST_TARGET_STAGE_N
70
71 $$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$(4): CFG_COMPILER_HOST_TRIPLE = $(2)
72 $$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$(4):                              \
73                 $$(CRATEFILE_$(4))                                  \
74                 $$(CRATE_FULLDEPS_$(1)_T_$(2)_H_$(3)_$(4))          \
75                 $$(TSREQ$(1)_T_$(2)_H_$(3))                         \
76                 | $$(TLIB$(1)_T_$(2)_H_$(3))/
77         @$$(call E, rustc: $$(@D)/lib$(4))
78         $$(call REMOVE_ALL_OLD_GLOB_MATCHES,\
79             $$(dir $$@)$$(call CFG_LIB_GLOB_$(2),$(4)))
80         $$(call REMOVE_ALL_OLD_GLOB_MATCHES,\
81             $$(dir $$@)$$(call CFG_RLIB_GLOB,$(4)))
82         $$(STAGE$(1)_T_$(2)_H_$(3)) \
83                 $$(WFLAGS_ST$(1)) \
84                 -L "$$(RT_OUTPUT_DIR_$(2))" \
85                 -L "$$(LLVM_LIBDIR_$(2))" \
86                 -L "$$(dir $$(LLVM_STDCPP_LOCATION_$(2)))" \
87                 $$(RUSTFLAGS_$(4)) \
88                 --out-dir $$(@D) $$<
89         @touch $$@
90         $$(call LIST_ALL_OLD_GLOB_MATCHES,\
91             $$(dir $$@)$$(call CFG_LIB_GLOB_$(2),$(4)))
92         $$(call LIST_ALL_OLD_GLOB_MATCHES,\
93             $$(dir $$@)$$(call CFG_RLIB_GLOB,$(4)))
94
95 endef
96
97 # Macro for building any tool as part of the rust compilation process. Each
98 # tool is defined in crates.mk with a list of library dependencies as well as
99 # the source file for the tool. Building each tool will also be passed '--cfg
100 # <tool>' for usage in driver.rs
101 #
102 # This build rule is similar to the one found above, just tweaked for
103 # locations and things.
104 #
105 # $(1) - stage
106 # $(2) - target triple
107 # $(3) - host triple
108 # $(4) - name of the tool being built
109 define TARGET_TOOL
110
111 $$(TBIN$(1)_T_$(2)_H_$(3))/$(4)$$(X_$(2)):                      \
112                 $$(TOOL_SOURCE_$(4))                            \
113                 $$(TOOL_INPUTS_$(4))                            \
114                 $$(foreach dep,$$(TOOL_DEPS_$(4)),              \
115                     $$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$$(dep))   \
116                 $$(TSREQ$(1)_T_$(2)_H_$(3))                     \
117                 | $$(TBIN$(1)_T_$(4)_H_$(3))/
118         @$$(call E, rustc: $$@)
119         $$(STAGE$(1)_T_$(2)_H_$(3)) -o $$@ $$< --cfg $(4)
120
121 endef
122
123 # Every recipe in RUST_TARGET_STAGE_N outputs to $$(TLIB$(1)_T_$(2)_H_$(3),
124 # a directory that can be cleaned out during the middle of a run of
125 # the get-snapshot.py script.  Therefore, every recipe needs to have
126 # an order-only dependency either on $(SNAPSHOT_RUSTC_POST_CLEANUP) or
127 # on $$(TSREQ$(1)_T_$(2)_H_$(3)), to ensure that no products will be
128 # put into the target area until after the get-snapshot.py script has
129 # had its chance to clean it out; otherwise the other products will be
130 # inadvertantly included in the clean out.
131 SNAPSHOT_RUSTC_POST_CLEANUP=$(HBIN0_H_$(CFG_BUILD))/rustc$(X_$(CFG_BUILD))
132
133 define TARGET_HOST_RULES
134
135 $$(TLIB$(1)_T_$(2)_H_$(3))/stamp.rustc: $(S)src/librustc/lib/llvmdeps.rs
136
137 $$(TBIN$(1)_T_$(2)_H_$(3))/:
138         mkdir -p $$@
139
140 $$(TLIB$(1)_T_$(2)_H_$(3))/:
141         mkdir -p $$@
142
143 $$(TLIB$(1)_T_$(2)_H_$(3))/libcompiler-rt.a: \
144             $$(RT_OUTPUT_DIR_$(2))/$$(call CFG_STATIC_LIB_NAME_$(2),compiler-rt) \
145             | $$(TLIB$(1)_T_$(2)_H_$(3))/ $$(SNAPSHOT_RUSTC_POST_CLEANUP)
146         @$$(call E, cp: $$@)
147         $$(Q)cp $$< $$@
148
149 $$(TLIB$(1)_T_$(2)_H_$(3))/libmorestack.a: \
150             $$(RT_OUTPUT_DIR_$(2))/$$(call CFG_STATIC_LIB_NAME_$(2),morestack) \
151             | $$(TLIB$(1)_T_$(2)_H_$(3))/ $$(SNAPSHOT_RUSTC_POST_CLEANUP)
152         @$$(call E, cp: $$@)
153         $$(Q)cp $$< $$@
154 endef
155
156 $(foreach source,$(CFG_HOST),                                               \
157  $(foreach target,$(CFG_TARGET),                                            \
158   $(eval $(call TARGET_HOST_RULES,0,$(target),$(source)))                   \
159   $(eval $(call TARGET_HOST_RULES,1,$(target),$(source)))                   \
160   $(eval $(call TARGET_HOST_RULES,2,$(target),$(source)))                   \
161   $(eval $(call TARGET_HOST_RULES,3,$(target),$(source)))))
162
163 # In principle, each host can build each target for both libs and tools
164 $(foreach crate,$(CRATES),                                                  \
165  $(foreach source,$(CFG_HOST),                                              \
166   $(foreach target,$(CFG_TARGET),                                           \
167    $(eval $(call RUST_TARGET_STAGE_N,0,$(target),$(source),$(crate)))       \
168    $(eval $(call RUST_TARGET_STAGE_N,1,$(target),$(source),$(crate)))       \
169    $(eval $(call RUST_TARGET_STAGE_N,2,$(target),$(source),$(crate)))       \
170    $(eval $(call RUST_TARGET_STAGE_N,3,$(target),$(source),$(crate))))))
171
172 $(foreach host,$(CFG_HOST),                                                 \
173  $(foreach target,$(CFG_TARGET),                                            \
174   $(foreach stage,$(STAGES),                                                \
175    $(foreach tool,$(TOOLS),                                                 \
176     $(eval $(call TARGET_TOOL,$(stage),$(target),$(host),$(tool)))))))