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