]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | # Copyright 2014-2015 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 | ###################################################################### | |
12 | # Version numbers and strings | |
13 | ###################################################################### | |
14 | ||
15 | # The version number | |
c30ab7b3 | 16 | CFG_RELEASE_NUM=1.14.0 |
1a4d82fc | 17 | |
85aaf69f SL |
18 | # An optional number to put after the label, e.g. '.2' -> '-beta.2' |
19 | # NB Make sure it starts with a dot to conform to semver pre-release | |
20 | # versions (section 9) | |
c30ab7b3 | 21 | CFG_PRERELEASE_VERSION=.5 |
54a0048b | 22 | |
1a4d82fc JJ |
23 | ifeq ($(CFG_RELEASE_CHANNEL),stable) |
24 | # This is the normal semver version string, e.g. "0.12.0", "0.12.0-nightly" | |
25 | CFG_RELEASE=$(CFG_RELEASE_NUM) | |
26 | # This is the string used in dist artifact file names, e.g. "0.12.0", "nightly" | |
27 | CFG_PACKAGE_VERS=$(CFG_RELEASE_NUM) | |
28 | CFG_DISABLE_UNSTABLE_FEATURES=1 | |
29 | endif | |
30 | ifeq ($(CFG_RELEASE_CHANNEL),beta) | |
c34b1796 | 31 | CFG_RELEASE=$(CFG_RELEASE_NUM)-beta$(CFG_PRERELEASE_VERSION) |
d9579d0f AL |
32 | # When building beta distributables just reuse the same "beta" name |
33 | # so when we upload we'll always override the previous beta. This | |
34 | # doesn't actually impact the version reported by rustc - it's just | |
35 | # for file naming. | |
36 | CFG_PACKAGE_VERS=beta | |
1a4d82fc JJ |
37 | CFG_DISABLE_UNSTABLE_FEATURES=1 |
38 | endif | |
39 | ifeq ($(CFG_RELEASE_CHANNEL),nightly) | |
40 | CFG_RELEASE=$(CFG_RELEASE_NUM)-nightly | |
41 | # When building nightly distributables just reuse the same "nightly" name | |
42 | # so when we upload we'll always override the previous nighly. This | |
43 | # doesn't actually impact the version reported by rustc - it's just | |
44 | # for file naming. | |
45 | CFG_PACKAGE_VERS=nightly | |
46 | endif | |
47 | ifeq ($(CFG_RELEASE_CHANNEL),dev) | |
48 | CFG_RELEASE=$(CFG_RELEASE_NUM)-dev | |
49 | CFG_PACKAGE_VERS=$(CFG_RELEASE_NUM)-dev | |
50 | endif | |
51 | ||
5bcae85e SL |
52 | # Append a version-dependent hash to each library, so we can install different |
53 | # versions in the same place | |
54 | CFG_FILENAME_EXTRA=$(shell printf '%s' $(CFG_RELEASE)$(CFG_EXTRA_FILENAME) | $(CFG_HASH_COMMAND)) | |
55 | ||
c30ab7b3 | 56 | # If local-rust is the same major.minor as the current version, then force a local-rebuild |
5bcae85e | 57 | ifdef CFG_ENABLE_LOCAL_RUST |
c30ab7b3 SL |
58 | SEMVER_PREFIX=$(shell echo $(CFG_RELEASE_NUM) | grep -E -o '^[[:digit:]]+\.[[:digit:]]+') |
59 | LOCAL_RELEASE=$(shell $(S)src/etc/local_stage0.sh --print-rustc-release $(CFG_LOCAL_RUST_ROOT)) | |
60 | ifneq (,$(filter $(SEMVER_PREFIX).%,$(LOCAL_RELEASE))) | |
61 | CFG_INFO := $(info cfg: auto-detected local-rebuild using $(LOCAL_RELEASE)) | |
5bcae85e SL |
62 | CFG_ENABLE_LOCAL_REBUILD = 1 |
63 | endif | |
64 | endif | |
65 | ||
1a4d82fc JJ |
66 | # The name of the package to use for creating tarballs, installers etc. |
67 | CFG_PACKAGE_NAME=rustc-$(CFG_PACKAGE_VERS) | |
68 | ||
69 | # The version string plus commit information - this is what rustc reports | |
70 | CFG_VERSION = $(CFG_RELEASE) | |
71 | CFG_GIT_DIR := $(CFG_SRC_DIR).git | |
72 | # since $(CFG_GIT) may contain spaces (especially on Windows), | |
73 | # we need to escape them. (" " to r"\ ") | |
74 | # Note that $(subst ...) ignores space after `subst`, | |
75 | # so we use a hack: define $(SPACE) which contains space character. | |
76 | SPACE := | |
77 | SPACE += | |
78 | ifneq ($(CFG_GIT),) | |
79 | ifneq ($(wildcard $(subst $(SPACE),\$(SPACE),$(CFG_GIT_DIR))),) | |
85aaf69f | 80 | CFG_VER_DATE = $(shell git --git-dir='$(CFG_GIT_DIR)' log -1 --date=short --pretty=format:'%cd') |
1a4d82fc JJ |
81 | CFG_VER_HASH = $(shell git --git-dir='$(CFG_GIT_DIR)' rev-parse HEAD) |
82 | CFG_SHORT_VER_HASH = $(shell git --git-dir='$(CFG_GIT_DIR)' rev-parse --short=9 HEAD) | |
83 | CFG_VERSION += ($(CFG_SHORT_VER_HASH) $(CFG_VER_DATE)) | |
84 | endif | |
85 | endif | |
86 | ||
87 | # Windows exe's need numeric versions - don't use anything but | |
88 | # numbers and dots here | |
89 | CFG_VERSION_WIN = $(CFG_RELEASE_NUM) | |
90 | ||
85aaf69f | 91 | CFG_INFO := $(info cfg: version $(CFG_VERSION)) |
1a4d82fc JJ |
92 | |
93 | ###################################################################### | |
94 | # More configuration | |
95 | ###################################################################### | |
96 | ||
1a4d82fc JJ |
97 | MKFILE_DEPS := config.stamp $(call rwildcard,$(CFG_SRC_DIR)mk/,*) |
98 | MKFILES_FOR_TARBALL:=$(MKFILE_DEPS) | |
99 | ifneq ($(NO_MKFILE_DEPS),) | |
100 | MKFILE_DEPS := | |
101 | endif | |
102 | NON_BUILD_HOST = $(filter-out $(CFG_BUILD),$(CFG_HOST)) | |
103 | NON_BUILD_TARGET = $(filter-out $(CFG_BUILD),$(CFG_TARGET)) | |
104 | ||
105 | ifneq ($(MAKE_RESTARTS),) | |
106 | CFG_INFO := $(info cfg: make restarts: $(MAKE_RESTARTS)) | |
107 | endif | |
108 | ||
109 | CFG_INFO := $(info cfg: build triple $(CFG_BUILD)) | |
110 | CFG_INFO := $(info cfg: host triples $(CFG_HOST)) | |
111 | CFG_INFO := $(info cfg: target triples $(CFG_TARGET)) | |
112 | ||
113 | ifneq ($(wildcard $(NON_BUILD_HOST)),) | |
114 | CFG_INFO := $(info cfg: non-build host triples $(NON_BUILD_HOST)) | |
115 | endif | |
116 | ifneq ($(wildcard $(NON_BUILD_TARGET)),) | |
117 | CFG_INFO := $(info cfg: non-build target triples $(NON_BUILD_TARGET)) | |
118 | endif | |
119 | ||
120 | CFG_RUSTC_FLAGS := $(RUSTFLAGS) | |
121 | CFG_GCCISH_CFLAGS := | |
122 | CFG_GCCISH_LINK_FLAGS := | |
123 | ||
92a42be0 | 124 | CFG_JEMALLOC_FLAGS := |
1a4d82fc JJ |
125 | |
126 | ifdef CFG_DISABLE_OPTIMIZE | |
127 | $(info cfg: disabling rustc optimization (CFG_DISABLE_OPTIMIZE)) | |
128 | CFG_RUSTC_FLAGS += | |
129 | CFG_JEMALLOC_FLAGS += --enable-debug | |
130 | else | |
131 | # The rtopt cfg turns off runtime sanity checks | |
132 | CFG_RUSTC_FLAGS += -O --cfg rtopt | |
133 | endif | |
134 | ||
135 | CFG_JEMALLOC_FLAGS += $(JEMALLOC_FLAGS) | |
136 | ||
9346a6ac AL |
137 | ifdef CFG_ENABLE_DEBUG_ASSERTIONS |
138 | $(info cfg: enabling debug assertions (CFG_ENABLE_DEBUG_ASSERTIONS)) | |
62682a34 | 139 | CFG_RUSTC_FLAGS += -C debug-assertions=on |
9346a6ac AL |
140 | endif |
141 | ||
142 | ifdef CFG_ENABLE_DEBUGINFO | |
143 | $(info cfg: enabling debuginfo (CFG_ENABLE_DEBUGINFO)) | |
9cc50fc6 | 144 | CFG_RUSTC_FLAGS += -g |
c30ab7b3 SL |
145 | else ifdef CFG_ENABLE_DEBUGINFO_LINES |
146 | $(info cfg: enabling line number debuginfo (CFG_ENABLE_DEBUGINFO_LINES)) | |
147 | CFG_RUSTC_FLAGS += -Cdebuginfo=1 | |
1a4d82fc JJ |
148 | endif |
149 | ||
150 | ifdef SAVE_TEMPS | |
3157f602 | 151 | CFG_RUSTC_FLAGS += -C save-temps |
1a4d82fc JJ |
152 | endif |
153 | ifdef ASM_COMMENTS | |
154 | CFG_RUSTC_FLAGS += -Z asm-comments | |
155 | endif | |
156 | ifdef TIME_PASSES | |
157 | CFG_RUSTC_FLAGS += -Z time-passes | |
158 | endif | |
159 | ifdef TIME_LLVM_PASSES | |
160 | CFG_RUSTC_FLAGS += -Z time-llvm-passes | |
161 | endif | |
162 | ifdef TRACE | |
163 | CFG_RUSTC_FLAGS += -Z trace | |
164 | endif | |
9cc50fc6 | 165 | ifndef CFG_DISABLE_RPATH |
1a4d82fc JJ |
166 | CFG_RUSTC_FLAGS += -C rpath |
167 | endif | |
168 | ||
169 | # The executables crated during this compilation process have no need to include | |
170 | # static copies of libstd and libextra. We also generate dynamic versions of all | |
171 | # libraries, so in the interest of space, prefer dynamic linking throughout the | |
172 | # compilation process. | |
173 | # | |
174 | # Note though that these flags are omitted for the *bins* in stage2+. This means | |
175 | # that the snapshot will be generated with a statically linked rustc so we only | |
176 | # have to worry about the distribution of one file (with its native dynamic | |
177 | # dependencies) | |
e9174d1e | 178 | RUSTFLAGS_STAGE0 += -C prefer-dynamic -C no-stack-check |
1a4d82fc JJ |
179 | RUSTFLAGS_STAGE1 += -C prefer-dynamic |
180 | RUST_LIB_FLAGS_ST2 += -C prefer-dynamic | |
181 | RUST_LIB_FLAGS_ST3 += -C prefer-dynamic | |
182 | ||
183 | # Landing pads require a lot of codegen. We can get through bootstrapping faster | |
184 | # by not emitting them. | |
b039eaaf SL |
185 | |
186 | ifdef CFG_DISABLE_STAGE0_LANDING_PADS | |
187 | RUSTFLAGS_STAGE0 += -Z no-landing-pads | |
188 | endif | |
e9174d1e | 189 | |
1a4d82fc JJ |
190 | # platform-specific auto-configuration |
191 | include $(CFG_SRC_DIR)mk/platform.mk | |
192 | ||
193 | # Run the stage1/2 compilers under valgrind | |
194 | ifdef VALGRIND_COMPILE | |
92a42be0 | 195 | CFG_VALGRIND_COMPILE := $(CFG_VALGRIND) |
1a4d82fc JJ |
196 | else |
197 | CFG_VALGRIND_COMPILE := | |
198 | endif | |
199 | ||
200 | ||
201 | ifndef CFG_DISABLE_VALGRIND_RPASS | |
202 | $(info cfg: enabling valgrind run-pass tests (CFG_ENABLE_VALGRIND_RPASS)) | |
85aaf69f | 203 | $(info cfg: valgrind-rpass command set to $(CFG_VALGRIND)) |
1a4d82fc JJ |
204 | CFG_VALGRIND_RPASS :=$(CFG_VALGRIND) |
205 | else | |
d9579d0f | 206 | $(info cfg: disabling valgrind run-pass tests) |
1a4d82fc JJ |
207 | CFG_VALGRIND_RPASS := |
208 | endif | |
209 | ||
210 | ||
211 | ifdef CFG_ENABLE_VALGRIND | |
212 | $(info cfg: enabling valgrind (CFG_ENABLE_VALGRIND)) | |
92a42be0 | 213 | CFG_JEMALLOC_FLAGS += --enable-valgrind |
1a4d82fc JJ |
214 | else |
215 | CFG_VALGRIND := | |
216 | endif | |
217 | ||
218 | ###################################################################### | |
219 | # Target-and-rule "utility variables" | |
220 | ###################################################################### | |
221 | ||
222 | define DEF_FOR_TARGET | |
223 | X_$(1) := $(CFG_EXE_SUFFIX_$(1)) | |
224 | ifndef CFG_LLVM_TARGET_$(1) | |
225 | CFG_LLVM_TARGET_$(1) := $(1) | |
226 | endif | |
227 | endef | |
228 | $(foreach target,$(CFG_TARGET), \ | |
229 | $(eval $(call DEF_FOR_TARGET,$(target)))) | |
230 | ||
231 | # "Source" files we generate in builddir along the way. | |
232 | GENERATED := | |
233 | ||
234 | # Delete the built-in rules. | |
235 | .SUFFIXES: | |
236 | %:: %,v | |
237 | %:: RCS/%,v | |
238 | %:: RCS/% | |
239 | %:: s.% | |
240 | %:: SCCS/s.% | |
241 | ||
242 | ||
243 | ###################################################################### | |
244 | # Cleaning out old crates | |
245 | ###################################################################### | |
246 | ||
247 | # $(1) is the path for directory to match against | |
248 | # $(2) is the glob to use in the match | |
249 | # | |
250 | # Note that a common bug is to accidentally construct the glob denoted | |
251 | # by $(2) with a space character prefix, which invalidates the | |
252 | # construction $(1)$(2). | |
253 | define CHECK_FOR_OLD_GLOB_MATCHES | |
254 | $(Q)MATCHES="$(wildcard $(1))"; if [ -n "$$MATCHES" ] ; then echo "warning: there are previous" \'$(notdir $(2))\' "libraries:" $$MATCHES; fi | |
255 | endef | |
256 | ||
257 | # Same interface as above, but deletes rather than just listing the files. | |
258 | ifdef VERBOSE | |
259 | define REMOVE_ALL_OLD_GLOB_MATCHES | |
260 | $(Q)MATCHES="$(wildcard $(1))"; if [ -n "$$MATCHES" ] ; then echo "warning: removing previous" \'$(notdir $(1))\' "libraries:" $$MATCHES; rm $$MATCHES ; fi | |
261 | endef | |
262 | else | |
263 | define REMOVE_ALL_OLD_GLOB_MATCHES | |
264 | $(Q)MATCHES="$(wildcard $(1))"; if [ -n "$$MATCHES" ] ; then rm $$MATCHES ; fi | |
265 | endef | |
266 | endif | |
267 | ||
268 | # We use a different strategy for LIST_ALL_OLD_GLOB_MATCHES_EXCEPT | |
269 | # than in the macros above because it needs the result of running the | |
270 | # `ls` command after other rules in the command list have run; the | |
271 | # macro-expander for $(wildcard ...) would deliver its results too | |
272 | # soon. (This is in contrast to the macros above, which are meant to | |
273 | # be run at the outset of a command list in a rule.) | |
274 | ifdef VERBOSE | |
275 | define LIST_ALL_OLD_GLOB_MATCHES | |
276 | @echo "info: now are following matches for" '$(notdir $(1))' "libraries:" | |
277 | @( ls $(1) 2>/dev/null || true ) | |
278 | endef | |
279 | else | |
280 | define LIST_ALL_OLD_GLOB_MATCHES | |
281 | endef | |
282 | endif | |
283 | ||
284 | ###################################################################### | |
285 | # LLVM macros | |
286 | ###################################################################### | |
287 | ||
c30ab7b3 | 288 | LLVM_OPTIONAL_COMPONENTS=x86 arm aarch64 mips powerpc pnacl systemz jsbackend |
9cc50fc6 | 289 | LLVM_REQUIRED_COMPONENTS=ipo bitreader bitwriter linker asmparser mcjit \ |
1a4d82fc JJ |
290 | interpreter instrumentation |
291 | ||
9cc50fc6 SL |
292 | ifneq ($(CFG_LLVM_ROOT),) |
293 | # Ensure we only try to link targets that the installed LLVM actually has: | |
294 | LLVM_COMPONENTS := $(filter $(shell $(CFG_LLVM_ROOT)/bin/llvm-config$(X_$(CFG_BUILD)) --components),\ | |
295 | $(LLVM_OPTIONAL_COMPONENTS)) $(LLVM_REQUIRED_COMPONENTS) | |
296 | else | |
297 | LLVM_COMPONENTS := $(LLVM_OPTIONAL_COMPONENTS) $(LLVM_REQUIRED_COMPONENTS) | |
298 | endif | |
299 | ||
1a4d82fc JJ |
300 | # Only build these LLVM tools |
301 | LLVM_TOOLS=bugpoint llc llvm-ar llvm-as llvm-dis llvm-mc opt llvm-extract | |
302 | ||
303 | define DEF_LLVM_VARS | |
304 | # The configure script defines these variables with the target triples | |
305 | # separated by Z. This defines new ones with the expected format. | |
306 | ifeq ($$(CFG_LLVM_ROOT),) | |
307 | CFG_LLVM_BUILD_DIR_$(1):=$$(CFG_LLVM_BUILD_DIR_$(subst -,_,$(1))) | |
308 | CFG_LLVM_INST_DIR_$(1):=$$(CFG_LLVM_INST_DIR_$(subst -,_,$(1))) | |
309 | else | |
310 | CFG_LLVM_INST_DIR_$(1):=$$(CFG_LLVM_ROOT) | |
311 | endif | |
312 | ||
313 | # Any rules that depend on LLVM should depend on LLVM_CONFIG | |
314 | LLVM_CONFIG_$(1):=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-config$$(X_$(1)) | |
315 | LLVM_MC_$(1):=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-mc$$(X_$(1)) | |
62682a34 | 316 | LLVM_AR_$(1):=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-ar$$(X_$(1)) |
1a4d82fc JJ |
317 | LLVM_VERSION_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --version) |
318 | LLVM_BINDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --bindir) | |
319 | LLVM_INCDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --includedir) | |
320 | LLVM_LIBDIR_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --libdir) | |
e9174d1e | 321 | LLVM_LIBDIR_RUSTFLAGS_$(1)=-L native="$$(LLVM_LIBDIR_$(1))" |
1a4d82fc | 322 | LLVM_LDFLAGS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --ldflags) |
62682a34 | 323 | ifeq ($$(findstring freebsd,$(1)),freebsd) |
1a4d82fc JJ |
324 | # On FreeBSD, it may search wrong headers (that are for pre-installed LLVM), |
325 | # so we replace -I with -iquote to ensure that it searches bundled LLVM first. | |
326 | LLVM_CXXFLAGS_$(1)=$$(subst -I, -iquote , $$(shell "$$(LLVM_CONFIG_$(1))" --cxxflags)) | |
62682a34 SL |
327 | else |
328 | LLVM_CXXFLAGS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --cxxflags) | |
329 | endif | |
1a4d82fc JJ |
330 | LLVM_HOST_TRIPLE_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --host-target) |
331 | ||
332 | LLVM_AS_$(1)=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-as$$(X_$(1)) | |
333 | LLC_$(1)=$$(CFG_LLVM_INST_DIR_$(1))/bin/llc$$(X_$(1)) | |
334 | ||
9cc50fc6 | 335 | LLVM_ALL_COMPONENTS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --components) |
9e0c209e | 336 | LLVM_VERSION_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --version) |
9cc50fc6 | 337 | |
1a4d82fc JJ |
338 | endef |
339 | ||
340 | $(foreach host,$(CFG_HOST), \ | |
341 | $(eval $(call DEF_LLVM_VARS,$(host)))) | |
342 | ||
343 | ###################################################################### | |
344 | # Exports for sub-utilities | |
345 | ###################################################################### | |
346 | ||
347 | # Note that any variable that re-configure should pick up needs to be | |
348 | # exported | |
349 | ||
350 | export CFG_SRC_DIR | |
62682a34 | 351 | export CFG_SRC_DIR_RELATIVE |
1a4d82fc JJ |
352 | export CFG_BUILD_DIR |
353 | ifdef CFG_VER_DATE | |
354 | export CFG_VER_DATE | |
355 | endif | |
356 | ifdef CFG_VER_HASH | |
357 | export CFG_VER_HASH | |
358 | endif | |
359 | export CFG_VERSION | |
360 | export CFG_VERSION_WIN | |
361 | export CFG_RELEASE | |
362 | export CFG_PACKAGE_NAME | |
363 | export CFG_BUILD | |
364 | export CFG_RELEASE_CHANNEL | |
365 | export CFG_LLVM_ROOT | |
366 | export CFG_PREFIX | |
367 | export CFG_LIBDIR | |
368 | export CFG_LIBDIR_RELATIVE | |
369 | export CFG_DISABLE_INJECT_STD_VERSION | |
370 | ifdef CFG_DISABLE_UNSTABLE_FEATURES | |
371 | CFG_INFO := $(info cfg: disabling unstable features (CFG_DISABLE_UNSTABLE_FEATURES)) | |
372 | # Turn on feature-staging | |
373 | export CFG_DISABLE_UNSTABLE_FEATURES | |
1a4d82fc | 374 | # Subvert unstable feature lints to do the self-build |
9e0c209e | 375 | export RUSTC_BOOTSTRAP=1 |
85aaf69f | 376 | endif |
7453a54e SL |
377 | ifdef CFG_MUSL_ROOT |
378 | export CFG_MUSL_ROOT | |
379 | endif | |
1a4d82fc | 380 | |
9e0c209e SL |
381 | # FIXME: Transitionary measure to bootstrap using the old bootstrap logic. |
382 | # Remove this once the bootstrap compiler uses the new login in Issue #36548. | |
c30ab7b3 | 383 | export RUSTC_BOOTSTRAP_KEY=62b3e239 |
9e0c209e | 384 | |
1a4d82fc JJ |
385 | ###################################################################### |
386 | # Per-stage targets and runner | |
387 | ###################################################################### | |
388 | ||
389 | # Valid setting-strings are 'all', 'none', 'gdb', 'lldb' | |
390 | # This 'function' will determine which debugger scripts to copy based on a | |
391 | # target triple. See debuggers.mk for more information. | |
392 | TRIPLE_TO_DEBUGGER_SCRIPT_SETTING=\ | |
a7813a04 | 393 | $(if $(findstring windows-msvc,$(1)),none,all) |
1a4d82fc JJ |
394 | |
395 | STAGES = 0 1 2 3 | |
396 | ||
397 | define SREQ | |
398 | # $(1) is the stage number | |
399 | # $(2) is the target triple | |
400 | # $(3) is the host triple | |
401 | ||
402 | # Destinations of artifacts for the host compiler | |
403 | HROOT$(1)_H_$(3) = $(3)/stage$(1) | |
404 | HBIN$(1)_H_$(3) = $$(HROOT$(1)_H_$(3))/bin | |
92a42be0 | 405 | |
1a4d82fc | 406 | ifeq ($$(CFG_WINDOWSY_$(3)),1) |
92a42be0 SL |
407 | # On Windows we always store host runtime libraries in the 'bin' directory because |
408 | # there's no rpath. Target libraries go under $CFG_LIBDIR_RELATIVE (usually 'lib'). | |
409 | HLIB_RELATIVE$(1)_H_$(3) = bin | |
410 | TROOT$(1)_T_$(2)_H_$(3) = $$(HROOT$(1)_H_$(3))/$$(CFG_LIBDIR_RELATIVE)/rustlib/$(2) | |
411 | # Remove the next 3 lines after a snapshot | |
412 | ifeq ($(1),0) | |
413 | RUSTFLAGS_STAGE0 += -L $$(TROOT$(1)_T_$(2)_H_$(3))/lib | |
414 | endif | |
415 | ||
1a4d82fc | 416 | else |
92a42be0 | 417 | |
1a4d82fc | 418 | ifeq ($(1),0) |
92a42be0 | 419 | HLIB_RELATIVE$(1)_H_$(3) = lib |
1a4d82fc | 420 | else |
92a42be0 | 421 | HLIB_RELATIVE$(1)_H_$(3) = $$(CFG_LIBDIR_RELATIVE) |
1a4d82fc | 422 | endif |
92a42be0 SL |
423 | TROOT$(1)_T_$(2)_H_$(3) = $$(HLIB$(1)_H_$(3))/rustlib/$(2) |
424 | ||
1a4d82fc | 425 | endif |
92a42be0 | 426 | HLIB$(1)_H_$(3) = $$(HROOT$(1)_H_$(3))/$$(HLIB_RELATIVE$(1)_H_$(3)) |
1a4d82fc JJ |
427 | |
428 | # Destinations of artifacts for target architectures | |
1a4d82fc JJ |
429 | TBIN$(1)_T_$(2)_H_$(3) = $$(TROOT$(1)_T_$(2)_H_$(3))/bin |
430 | TLIB$(1)_T_$(2)_H_$(3) = $$(TROOT$(1)_T_$(2)_H_$(3))/lib | |
431 | ||
432 | # Preqrequisites for using the stageN compiler | |
433 | ifeq ($(1),0) | |
434 | HSREQ$(1)_H_$(3) = $$(HBIN$(1)_H_$(3))/rustc$$(X_$(3)) | |
435 | else | |
436 | HSREQ$(1)_H_$(3) = \ | |
437 | $$(HBIN$(1)_H_$(3))/rustc$$(X_$(3)) \ | |
438 | $$(MKFILE_DEPS) \ | |
439 | tmp/install-debugger-scripts$(1)_H_$(3)-$$(call TRIPLE_TO_DEBUGGER_SCRIPT_SETTING,$(3)).done | |
440 | endif | |
441 | ||
442 | # Prerequisites for using the stageN compiler to build target artifacts | |
443 | TSREQ$(1)_T_$(2)_H_$(3) = \ | |
444 | $$(HSREQ$(1)_H_$(3)) \ | |
92a42be0 | 445 | $$(foreach obj,$$(REQUIRED_OBJECTS_$(2)),\ |
9e0c209e SL |
446 | $$(TLIB$(1)_T_$(2)_H_$(3))/$$(obj)) \ |
447 | $$(TLIB0_T_$(2)_H_$(3))/$$(call CFG_STATIC_LIB_NAME_$(2),compiler-rt) | |
448 | # ^ This copies `libcompiler-rt.a` to the stage0 sysroot | |
449 | # ^ TODO(stage0) update this to not copy `libcompiler-rt.a` to stage0 | |
1a4d82fc JJ |
450 | |
451 | # Prerequisites for a working stageN compiler and libraries, for a specific | |
452 | # target | |
453 | SREQ$(1)_T_$(2)_H_$(3) = \ | |
454 | $$(TSREQ$(1)_T_$(2)_H_$(3)) \ | |
7453a54e | 455 | $$(foreach dep,$$(TARGET_CRATES_$(2)), \ |
1a4d82fc JJ |
456 | $$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$$(dep)) \ |
457 | tmp/install-debugger-scripts$(1)_T_$(2)_H_$(3)-$$(call TRIPLE_TO_DEBUGGER_SCRIPT_SETTING,$(2)).done | |
458 | ||
459 | # Prerequisites for a working stageN compiler and complete set of target | |
460 | # libraries | |
461 | CSREQ$(1)_T_$(2)_H_$(3) = \ | |
462 | $$(TSREQ$(1)_T_$(2)_H_$(3)) \ | |
463 | $$(HBIN$(1)_H_$(3))/rustdoc$$(X_$(3)) \ | |
7453a54e | 464 | $$(foreach dep,$$(HOST_CRATES),$$(TLIB$(1)_T_$(2)_H_$(3))/stamp.$$(dep)) |
1a4d82fc JJ |
465 | |
466 | ifeq ($(1),0) | |
467 | # Don't run the stage0 compiler under valgrind - that ship has sailed | |
468 | CFG_VALGRIND_COMPILE$(1) = | |
469 | else | |
470 | CFG_VALGRIND_COMPILE$(1) = $$(CFG_VALGRIND_COMPILE) | |
471 | endif | |
472 | ||
473 | # Add RUSTFLAGS_STAGEN values to the build command | |
474 | EXTRAFLAGS_STAGE$(1) = $$(RUSTFLAGS_STAGE$(1)) | |
475 | ||
476 | CFGFLAG$(1)_T_$(2)_H_$(3) = stage$(1) | |
477 | ||
478 | endef | |
479 | ||
480 | # Same macro/variables as above, but defined in a separate loop so it can use | |
481 | # all the variables above for all archs. The RPATH_VAR setup sometimes needs to | |
482 | # reach across triples to get things in order. | |
483 | # | |
484 | # Defines (with the standard $(1)_T_$(2)_H_$(3) suffix): | |
485 | # * `LD_LIBRARY_PATH_ENV_NAME`: the name for the key to use in the OS | |
486 | # environment to access or extend the lookup path for dynamic | |
487 | # libraries. Note on Windows, that key is `$PATH`, and thus not | |
488 | # only conflates programs with dynamic libraries, but also often | |
489 | # contains spaces which confuse make. | |
490 | # * `LD_LIBRARY_PATH_ENV_HOSTDIR`: the entry to add to lookup path for the host | |
491 | # * `LD_LIBRARY_PATH_ENV_TARGETDIR`: the entry to add to lookup path for target | |
492 | # | |
493 | # Below that, HOST_RPATH_VAR and TARGET_RPATH_VAR are defined in terms of the | |
494 | # above settings. | |
495 | # | |
496 | define SREQ_CMDS | |
497 | ||
498 | ifeq ($$(OSTYPE_$(3)),apple-darwin) | |
499 | LD_LIBRARY_PATH_ENV_NAME$(1)_T_$(2)_H_$(3) := DYLD_LIBRARY_PATH | |
500 | else | |
501 | ifeq ($$(CFG_WINDOWSY_$(3)),1) | |
502 | LD_LIBRARY_PATH_ENV_NAME$(1)_T_$(2)_H_$(3) := PATH | |
9e0c209e SL |
503 | else |
504 | ifeq ($$(OSTYPE_$(3)),unknown-haiku) | |
505 | LD_LIBRARY_PATH_ENV_NAME$(1)_T_$(2)_H_$(3) := LIBRARY_PATH | |
1a4d82fc JJ |
506 | else |
507 | LD_LIBRARY_PATH_ENV_NAME$(1)_T_$(2)_H_$(3) := LD_LIBRARY_PATH | |
508 | endif | |
509 | endif | |
9e0c209e | 510 | endif |
1a4d82fc JJ |
511 | |
512 | LD_LIBRARY_PATH_ENV_HOSTDIR$(1)_T_$(2)_H_$(3) := \ | |
9cc50fc6 | 513 | $$(CURDIR)/$$(HLIB$(1)_H_$(3)):$$(CFG_LLVM_INST_DIR_$(3))/lib |
1a4d82fc | 514 | LD_LIBRARY_PATH_ENV_TARGETDIR$(1)_T_$(2)_H_$(3) := \ |
54a0048b | 515 | $$(CURDIR)/$$(TLIB$(1)_T_$(2)_H_$(3)) |
1a4d82fc JJ |
516 | |
517 | HOST_RPATH_VAR$(1)_T_$(2)_H_$(3) := \ | |
518 | $$(LD_LIBRARY_PATH_ENV_NAME$(1)_T_$(2)_H_$(3))=$$(LD_LIBRARY_PATH_ENV_HOSTDIR$(1)_T_$(2)_H_$(3)):$$$$$$(LD_LIBRARY_PATH_ENV_NAME$(1)_T_$(2)_H_$(3)) | |
519 | TARGET_RPATH_VAR$(1)_T_$(2)_H_$(3) := \ | |
520 | $$(LD_LIBRARY_PATH_ENV_NAME$(1)_T_$(2)_H_$(3))=$$(LD_LIBRARY_PATH_ENV_TARGETDIR$(1)_T_$(2)_H_$(3)):$$$$$$(LD_LIBRARY_PATH_ENV_NAME$(1)_T_$(2)_H_$(3)) | |
521 | ||
522 | RPATH_VAR$(1)_T_$(2)_H_$(3) := $$(HOST_RPATH_VAR$(1)_T_$(2)_H_$(3)) | |
523 | ||
524 | # Pass --cfg stage0 only for the build->host part of stage0; | |
525 | # if you're building a cross config, the host->* parts are | |
526 | # effectively stage1, since it uses the just-built stage0. | |
527 | # | |
54a0048b SL |
528 | # Also be sure to use the right rpath because we're loading libraries from the |
529 | # CFG_BUILD's stage1 directory for our target, so switch this one instance of | |
530 | # `RPATH_VAR` to get the bootstrap working. | |
1a4d82fc JJ |
531 | ifeq ($(1),0) |
532 | ifneq ($(strip $(CFG_BUILD)),$(strip $(3))) | |
533 | CFGFLAG$(1)_T_$(2)_H_$(3) = stage1 | |
534 | ||
54a0048b | 535 | RPATH_VAR$(1)_T_$(2)_H_$(3) := $$(TARGET_RPATH_VAR1_T_$(2)_H_$$(CFG_BUILD)) |
3157f602 XL |
536 | else |
537 | ifdef CFG_ENABLE_LOCAL_REBUILD | |
538 | # Assume the local-rebuild rustc already has stage1 features too. | |
539 | CFGFLAG$(1)_T_$(2)_H_$(3) = stage1 | |
540 | endif | |
1a4d82fc JJ |
541 | endif |
542 | endif | |
543 | ||
544 | STAGE$(1)_T_$(2)_H_$(3) := \ | |
545 | $$(Q)$$(RPATH_VAR$(1)_T_$(2)_H_$(3)) \ | |
546 | $$(call CFG_RUN_TARG_$(3),$(1), \ | |
547 | $$(CFG_VALGRIND_COMPILE$(1)) \ | |
548 | $$(HBIN$(1)_H_$(3))/rustc$$(X_$(3)) \ | |
549 | --cfg $$(CFGFLAG$(1)_T_$(2)_H_$(3)) \ | |
550 | $$(CFG_RUSTC_FLAGS) $$(EXTRAFLAGS_STAGE$(1)) --target=$(2)) \ | |
551 | $$(RUSTC_FLAGS_$(2)) | |
552 | ||
1a4d82fc JJ |
553 | endef |
554 | ||
555 | $(foreach build,$(CFG_HOST), \ | |
556 | $(eval $(foreach target,$(CFG_TARGET), \ | |
557 | $(eval $(foreach stage,$(STAGES), \ | |
558 | $(eval $(call SREQ,$(stage),$(target),$(build)))))))) | |
559 | ||
560 | $(foreach build,$(CFG_HOST), \ | |
561 | $(eval $(foreach target,$(CFG_TARGET), \ | |
562 | $(eval $(foreach stage,$(STAGES), \ | |
563 | $(eval $(call SREQ_CMDS,$(stage),$(target),$(build)))))))) | |
564 | ||
565 | ###################################################################### | |
566 | # rustc-H-targets | |
567 | # | |
568 | # Builds a functional Rustc for the given host. | |
569 | ###################################################################### | |
570 | ||
571 | define DEF_RUSTC_STAGE_TARGET | |
572 | # $(1) == architecture | |
573 | # $(2) == stage | |
574 | ||
575 | rustc-stage$(2)-H-$(1): \ | |
576 | $$(foreach target,$$(CFG_TARGET),$$(SREQ$(2)_T_$$(target)_H_$(1))) | |
577 | ||
578 | endef | |
579 | ||
580 | $(foreach host,$(CFG_HOST), \ | |
581 | $(eval $(foreach stage,1 2 3, \ | |
582 | $(eval $(call DEF_RUSTC_STAGE_TARGET,$(host),$(stage)))))) | |
583 | ||
584 | rustc-stage1: rustc-stage1-H-$(CFG_BUILD) | |
585 | rustc-stage2: rustc-stage2-H-$(CFG_BUILD) | |
586 | rustc-stage3: rustc-stage3-H-$(CFG_BUILD) | |
587 | ||
588 | define DEF_RUSTC_TARGET | |
589 | # $(1) == architecture | |
590 | ||
591 | rustc-H-$(1): rustc-stage2-H-$(1) | |
592 | endef | |
593 | ||
594 | $(foreach host,$(CFG_TARGET), \ | |
595 | $(eval $(call DEF_RUSTC_TARGET,$(host)))) | |
596 | ||
597 | rustc-stage1: rustc-stage1-H-$(CFG_BUILD) | |
598 | rustc-stage2: rustc-stage2-H-$(CFG_BUILD) | |
599 | rustc-stage3: rustc-stage3-H-$(CFG_BUILD) | |
600 | rustc: rustc-H-$(CFG_BUILD) | |
601 | ||
602 | rustc-H-all: $(foreach host,$(CFG_HOST),rustc-H-$(host)) | |
603 | ||
604 | ###################################################################### | |
605 | # Entrypoint rule | |
606 | ###################################################################### | |
607 | ||
608 | .DEFAULT_GOAL := all | |
609 | ||
610 | define ALL_TARGET_N | |
611 | ifneq ($$(findstring $(1),$$(CFG_HOST)),) | |
612 | # This is a host | |
613 | all-target-$(1)-host-$(2): $$(CSREQ2_T_$(1)_H_$(2)) | |
614 | else | |
615 | # This is a target only | |
616 | all-target-$(1)-host-$(2): $$(SREQ2_T_$(1)_H_$(2)) | |
617 | endif | |
618 | endef | |
619 | ||
620 | $(foreach target,$(CFG_TARGET), \ | |
621 | $(foreach host,$(CFG_HOST), \ | |
622 | $(eval $(call ALL_TARGET_N,$(target),$(host))))) | |
623 | ||
624 | ALL_TARGET_RULES = $(foreach target,$(CFG_TARGET), \ | |
625 | $(foreach host,$(CFG_HOST), \ | |
626 | all-target-$(target)-host-$(host))) | |
627 | ||
9e0c209e SL |
628 | all-no-docs: $(ALL_TARGET_RULES) $(GENERATED) |
629 | all: all-no-docs docs | |
1a4d82fc JJ |
630 | |
631 | ###################################################################### | |
632 | # Build system documentation | |
633 | ###################################################################### | |
634 | ||
635 | # $(1) is the name of the doc <section> in Makefile.in | |
636 | # pick everything between tags | remove first line | remove last line | |
637 | # | remove extra (?) line | strip leading `#` from lines | |
638 | SHOW_DOCS = $(Q)awk '/<$(1)>/,/<\/$(1)>/' $(S)/Makefile.in | sed '1d' | sed '$$d' | sed 's/^\# \?//' | |
639 | ||
640 | help: | |
641 | $(call SHOW_DOCS,help) | |
642 | ||
643 | tips: | |
644 | $(call SHOW_DOCS,tips) | |
645 | ||
646 | nitty-gritty: | |
647 | $(call SHOW_DOCS,nitty-gritty) |