about summary refs log tree commit diff
path: root/Makefile.in
blob: 629b4426c2ca05c3555cc8c7741c4746f0b05d8d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
# 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
# by rustc. In general, rust programs, even those compiled for the
# 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.

STAGES = 0 1 2 3

######################################################################
# Residual auto-configuration
######################################################################

include config.mk

ifdef IGNORE_MKFILES
  MKFILE_DEPS :=
else
  OUR_MKFILES := Makefile config.mk $(wildcard $(CFG_SRC_DIR)/mk/*.mk)
  3RDPARTY_MKFILES := $(CFG_SRC_DIR)/src/libuv/Makefile \
                      $(wildcard $(CFG_SRC_DIR)/src/libuv/*.mk)
  GEN_MKFILES := $(wildcard $(CFG_SRC_DIR)/mk/libuv/*/*/*) \
                 $(wildcard $(CFG_SRC_DIR)/mk/libuv/mac/src/libuv/*) \
                 $(wildcard $(CFG_SRC_DIR)/mk/libuv/mac/src/libuv/*) \
                 $(wildcard $(CFG_SRC_DIR)/mk/libuv/mac/src/libuv/*)
  MKFILE_DEPS := $(OUR_MKFILES) $(3RDPARTY_MKFILES) $(GEN_MKFILES)
endif

NON_HOST_TRIPLES = $(filter-out $(CFG_HOST_TRIPLE),$(CFG_TARGET_TRIPLES))

ifneq ($(MAKE_RESTARTS),)
CFG_INFO := $(info cfg: make restarts: $(MAKE_RESTARTS))
endif

CFG_INFO := $(info cfg: shell host triple $(CFG_HOST_TRIPLE))
CFG_INFO := $(info cfg: non host triples $(NON_HOST_TRIPLES))

ifdef CFG_DISABLE_OPTIMIZE
  $(info cfg: disabling rustc optimization (CFG_DISABLE_OPTIMIZE))
  CFG_RUSTC_FLAGS :=
else
  CFG_RUSTC_FLAGS := -O
endif

ifdef SAVE_TEMPS
  CFG_RUSTC_FLAGS += --save-temps
endif
ifdef TIME_PASSES
  CFG_RUSTC_FLAGS += --time-passes
endif
ifdef TIME_LLVM_PASSES
  CFG_RUSTC_FLAGS += --time-llvm-passes
endif
ifdef DEBUG
  CFG_RUSTC_FLAGS += -g
endif

# platform-specific auto-configuration
include $(CFG_SRC_DIR)/mk/platform.mk

# Run the stage1/2 compilers under valgrind
ifdef VALGRIND_COMPILE
  CFG_VALGRIND_COMPILE :=$(CFG_VALGRIND)
else
  CFG_VALGRIND_COMPILE :=
endif

CFG_RUNTIME :=$(call CFG_LIB_NAME,rustrt)
CFG_RUSTLLVM :=$(call CFG_LIB_NAME,rustllvm)
CFG_CORELIB :=$(call CFG_LIB_NAME,core)
CFG_STDLIB :=$(call CFG_LIB_NAME,std)
CFG_LIBRUSTC :=$(call CFG_LIB_NAME,rustc)

STDLIB_GLOB :=$(call CFG_LIB_GLOB,std)
CORELIB_GLOB :=$(call CFG_LIB_GLOB,core)
LIBRUSTC_GLOB :=$(call CFG_LIB_GLOB,rustc)

# version-string calculation
CFG_GIT_DIR := $(CFG_SRC_DIR).git
CFG_VERSION = prerelease
ifneq ($(wildcard $(CFG_GIT)),)
ifneq ($(wildcard $(CFG_GIT_DIR)),)
    CFG_VERSION += $(shell git --git-dir=$(CFG_GIT_DIR) log -1 \
                     --pretty=format:'(%h %ci)')
endif
endif

ifdef CFG_DISABLE_VALGRIND
  $(info cfg: disabling valgrind (CFG_DISABLE_VALGRIND))
  CFG_VALGRIND :=
endif
ifdef CFG_BAD_VALGRIND
  $(info cfg: disabling valgrind due to its unreliability on this platform)
  CFG_VALGRIND :=
endif

DOCS :=
ifeq ($(CFG_MAKEINFO),)
  $(info cfg: no makeinfo found, omitting doc/rust.html)
else
  DOCS += doc/rust.html
endif

ifeq ($(CFG_TEXI2PDF),)
  $(info cfg: no texi2pdf found, omitting doc/rust.pdf)
else
  ifeq ($(CFG_TEX),)
    $(info cfg: no tex found, omitting doc/rust.pdf)
  else
    DOCS += doc/rust.pdf
  endif
endif

ifeq ($(CFG_NATURALDOCS),)
  $(info cfg: no naturaldocs found, omitting library doc build)
else
  DOCS += doc/core/index.html doc/std/index.html
endif

ifdef CFG_DISABLE_DOCS
  $(info cfg: disabling doc build (CFG_DISABLE_DOCS))
  DOCS :=
endif

######################################################################
# Target-and-rule "utility variables"
######################################################################

ifdef VERBOSE
  Q :=
  E =
else
  Q := @
  E = echo $(1)
endif

S := $(CFG_SRC_DIR)
X := $(CFG_EXE_SUFFIX)

# Look in doc and src dirs.
VPATH := $(S)doc $(S)src

# "Source" files we generate in builddir along the way.
GENERATED :=

# Delete the built-in rules.
.SUFFIXES:
%:: %,v
%:: RCS/%,v
%:: RCS/%
%:: s.%
%:: SCCS/s.%

######################################################################
# Core library variables
######################################################################

CORELIB_CRATE := $(S)src/libcore/core.rc
CORELIB_INPUTS := $(wildcard $(addprefix $(S)src/libcore/,        \
                                           core.rc *.rs */*.rs))

######################################################################
# Standard library variables
######################################################################

STDLIB_CRATE := $(S)src/libstd/std.rc
STDLIB_INPUTS := $(wildcard $(addprefix $(S)src/libstd/,          \
                                          std.rc *.rs */*.rs))

######################################################################
# rustc crate variables
######################################################################

COMPILER_CRATE := $(S)src/comp/rustc.rc
COMPILER_INPUTS := $(wildcard $(addprefix $(S)src/comp/, \
                                rustc.rc *.rs */*.rs */*/*.rs))

######################################################################
# LLVM macros
######################################################################

# FIXME: x86-ism
LLVM_COMPONENTS=x86 ipo bitreader bitwriter linker asmparser

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)))

# Any rules that depend on LLVM should depend on LLVM_CONFIG
LLVM_CONFIG_$(1):=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-config$$(X)
LLVM_MC_$(1):=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-mc$$(X)
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)
LLVM_LIBS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --libs $$(LLVM_COMPONENTS))
LLVM_LDFLAGS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --ldflags)
LLVM_CXXFLAGS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --cxxflags)
LLVM_HOST_TRIPLE_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --host-target)

LLVM_AS_$(1)=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-as$$(X)
LLC_$(1)=$$(CFG_LLVM_INST_DIR_$(1))/bin/llc$$(X)

endef

$(foreach target,$(CFG_TARGET_TRIPLES), \
 $(eval $(call DEF_LLVM_VARS,$(target))))

######################################################################
# Exports for sub-utilities
######################################################################

# Note that any variable that re-configure should pick up needs to be
# exported

export CFG_SRC_DIR
export CFG_BUILD_DIR
export CFG_VERSION
export CFG_HOST_TRIPLE
export CFG_LLVM_ROOT
export CFG_ENABLE_MINGW_CROSS
export CFG_PREFIX

######################################################################
# Subprograms
######################################################################

######################################################################
# Per-stage targets and runner
######################################################################

define SREQ
# $(1) is the stage number
# $(2) is the target triple
# $(3) is the host triple

# Destinations of artifacts for the host compiler
HROOT$(1)_H_$(3) = $(3)/stage$(1)
HBIN$(1)_H_$(3) = $$(HROOT$(1)_H_$(3))/bin
HLIB$(1)_H_$(3) = $$(HROOT$(1)_H_$(3))/lib

# Destinations of artifacts for target architectures
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
TLIB$(1)_T_$(2)_H_$(3) = $$(TROOT$(1)_T_$(2)_H_$(3))/lib

# The name of the core and standard libraries used by rustc
ifdef CFG_DISABLE_SHAREDSTD
  HCORELIB_DEFAULT$(1)_H_$(3) = \
    $$(HLIB$(1)_H_$(3))/libcore.rlib
  TCORELIB_DEFAULT$(1)_T_$(2)_H_$(3) = \
    $$(TLIB$(1)_T_$(2)_H_$(3))/libcore.rlib

  HSTDLIB_DEFAULT$(1)_H_$(3) = \
    $$(HLIB$(1)_H_$(3))/libstd.rlib
  TSTDLIB_DEFAULT$(1)_T_$(2)_H_$(3) = \
    $$(TLIB$(1)_T_$(2)_H_$(3))/libstd.rlib

  HLIBRUSTC_DEFAULT$(1)_H_$(3) = \
    $$(HLIB$(1)_H_$(3))/librustc.rlib
  TLIBRUSTC_DEFAULT$(1)_T_$(2)_H_$(3) = \
    $$(TLIB$(1)_T_$(2)_H_$(3))/librustc.rlib
else
  HCORELIB_DEFAULT$(1)_H_$(3) = \
    $$(HLIB$(1)_H_$(3))/$(CFG_CORELIB)
  TCORELIB_DEFAULT$(1)_T_$(2)_H_$(3) = \
    $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_CORELIB)

  HSTDLIB_DEFAULT$(1)_H_$(3) = \
    $$(HLIB$(1)_H_$(3))/$(CFG_STDLIB)
  TSTDLIB_DEFAULT$(1)_T_$(2)_H_$(3) = \
    $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_STDLIB)

  HLIBRUSTC_DEFAULT$(1)_H_$(3) = \
    $$(HLIB$(1)_H_$(3))/$(CFG_LIBRUSTC)
  TLIBRUSTC_DEFAULT$(1)_T_$(2)_H_$(3) = \
    $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTC)
endif

# Preqrequisites for using the stageN compiler
HSREQ$(1)_H_$(3) = \
	$$(HBIN$(1)_H_$(3))/rustc$$(X) \
	$$(HLIB$(1)_H_$(3))/$$(CFG_RUNTIME) \
	$$(HLIB$(1)_H_$(3))/$$(CFG_RUSTLLVM) \
	$$(HCORELIB_DEFAULT$(1)_H_$(3)) \
	$$(HSTDLIB_DEFAULT$(1)_H_$(3)) \
	$$(HLIBRUSTC_DEFAULT$(1)_H_$(3)) \
	$$(MKFILE_DEPS)

# Prerequisites for using the stageN compiler to build target artifacts
TSREQ$(1)_T_$(2)_H_$(3) = \
	$$(HSREQ$(1)_H_$(3)) \
	$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_RUNTIME) \
	$$(TLIB$(1)_T_$(2)_H_$(3))/intrinsics.bc \
	$$(TLIB$(1)_T_$(2)_H_$(3))/libmorestack.a

# Prerequisites for complete stageN targets
SREQ$(1)_T_$(2)_H_$(3) = \
	$$(TSREQ$(1)_T_$(2)_H_$(3)) \
	$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_CORELIB) \
	$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_STDLIB)  \
	$$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBRUSTC)

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

STAGE$(1)_T_$(2)_H_$(3) := 						\
	$$(Q)$$(call CFG_RUN_TARG,$(1),				\
		$$(CFG_VALGRIND_COMPILE$(1)) 			\
		$$(HBIN$(1)_H_$(3))/rustc$$(X)			\
		$$(CFG_RUSTC_FLAGS) --target=$(2))

PERF_STAGE$(1)_T_$(2)_H_$(3) := 				\
	$$(Q)$$(call CFG_RUN_TARG,$(1),				\
		$$(CFG_PERF_TOOL) 						\
		$$(HBIN$(1)_H_$(3))/rustc$$(X)			\
		$$(CFG_RUSTC_FLAGS) --target=$(2))

endef

$(foreach build,$(CFG_TARGET_TRIPLES), \
 $(eval $(foreach target,$(CFG_TARGET_TRIPLES), \
  $(eval $(foreach stage,$(STAGES), \
   $(eval $(call SREQ,$(stage),$(target),$(build))))))))

######################################################################
# rustc-H-targets
#
# Builds a functional Rustc for the given host.
######################################################################

define DEF_RUSTC_STAGE_TARGET
# $(1) == architecture
# $(2) == stage

rustc-stage$(2)-H-$(1):							\
	$$(foreach target,$$(CFG_TARGET_TRIPLES),	\
		$$(SREQ$(2)_T_$$(target)_H_$(1)))

endef

$(foreach host,$(CFG_TARGET_TRIPLES),							\
 $(eval $(foreach stage,1 2 3,									\
  $(eval $(call DEF_RUSTC_STAGE_TARGET,$(host),$(stage))))))

rustc-stage1: rustc-stage1-H-$(CFG_HOST_TRIPLE)
rustc-stage2: rustc-stage2-H-$(CFG_HOST_TRIPLE)
rustc-stage3: rustc-stage3-H-$(CFG_HOST_TRIPLE)

define DEF_RUSTC_TARGET
# $(1) == architecture

rustc-H-$(1): rustc-stage3-H-$(1)
endef

$(foreach host,$(CFG_TARGET_TRIPLES),			\
 $(eval $(call DEF_RUSTC_TARGET,$(host))))

rustc-stage1: rustc-stage1-H-$(CFG_HOST_TRIPLE)
rustc-stage2: rustc-stage2-H-$(CFG_HOST_TRIPLE)
rustc-stage3: rustc-stage3-H-$(CFG_HOST_TRIPLE)
rustc: rustc-H-$(CFG_HOST_TRIPLE)

rustc-H-all: $(foreach host,$(CFG_TARGET_TRIPLES),rustc-H-$(host))

######################################################################
# Entrypoint rule
######################################################################

.DEFAULT_GOAL := all

ifneq ($(CFG_IN_TRANSITION),)

CFG_INFO := $(info cfg:)
CFG_INFO := $(info cfg: *** compiler is in snapshot transition ***)
CFG_INFO := $(info cfg: *** stage2 and later will not be built ***)
CFG_INFO := $(info cfg:)

all: $(SREQ1$(CFG_HOST_TRIPLE)) $(GENERATED) $(DOCS)

else

TSREQS :=											\
	$(foreach target,$(CFG_TARGET_TRIPLES),			\
		$(SREQ3_T_$(target)_H_$(CFG_HOST_TRIPLE)))
FUZZ := $(HBIN3_H_$(CFG_HOST_TRIPLE))/fuzzer$(X)
CARGO := $(HBIN3_H_$(CFG_HOST_TRIPLE))/cargo$(X)

all: rustc $(GENERATED) $(DOCS) $(FUZZ) $(CARGO)

endif


######################################################################
# Re-configuration
######################################################################

ifndef CFG_DISABLE_MANAGE_SUBMODULES
# This is a pretty expensive operation but I don't see any way to avoid it
NEED_GIT_RECONFIG=$(shell cd "$(CFG_SRC_DIR)" && "$(CFG_GIT)" submodule status | grep -c '^\(+\|-\)')
else
NEED_GIT_RECONFIG=0
endif

ifeq ($(NEED_GIT_RECONFIG),0)
else
# If the submodules have changed then always execute config.mk
.PHONY: config.mk
endif

config.mk: $(S)configure $(S)Makefile.in $(S)src/snapshots.txt
	@$(call E, cfg: reconfiguring)
	$(Q)$(S)configure $(CFG_CONFIGURE_ARGS)


######################################################################
# Primary-target makefiles
######################################################################

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/rt.mk
include $(CFG_SRC_DIR)/mk/rustllvm.mk
include $(CFG_SRC_DIR)/mk/autodep.mk
include $(CFG_SRC_DIR)/mk/tools.mk
include $(CFG_SRC_DIR)/mk/docs.mk
include $(CFG_SRC_DIR)/mk/llvm.mk

######################################################################
# Secondary makefiles, conditionalized for speed
######################################################################

ifneq ($(strip $(findstring dist,$(MAKECMDGOALS))   \
               $(findstring check,$(MAKECMDGOALS))  \
               $(findstring test,$(MAKECMDGOALS))   \
               $(findstring tidy,$(MAKECMDGOALS))   \
               $(findstring clean,$(MAKECMDGOALS))),)
  CFG_INFO := $(info cfg: including dist rules)
  include $(CFG_SRC_DIR)/mk/dist.mk
endif

ifneq ($(strip $(findstring snap,$(MAKECMDGOALS))   \
               $(findstring clean,$(MAKECMDGOALS))),)
  CFG_INFO := $(info cfg: including snap rules)
  include $(CFG_SRC_DIR)/mk/snap.mk
endif

ifneq ($(findstring reformat,$(MAKECMDGOALS)),)
  CFG_INFO := $(info cfg: including reformat rules)
  include $(CFG_SRC_DIR)/mk/pp.mk
endif

ifneq ($(strip $(findstring check,$(MAKECMDGOALS)) \
               $(findstring test,$(MAKECMDGOALS))  \
               $(findstring perf,$(MAKECMDGOALS))  \
               $(findstring tidy,$(MAKECMDGOALS))),)
  CFG_INFO := $(info cfg: including test rules)
  include $(CFG_SRC_DIR)/mk/tests.mk
endif

ifneq ($(findstring perf,$(MAKECMDGOALS)),)
  CFG_INFO := $(info cfg: including perf rules)
  include $(CFG_SRC_DIR)/mk/perf.mk
endif

ifneq ($(findstring clean,$(MAKECMDGOALS)),)
  CFG_INFO := $(info cfg: including clean rules)
  include $(CFG_SRC_DIR)/mk/clean.mk
endif

ifneq ($(findstring install,$(MAKECMDGOALS)),)
  CFG_INFO := $(info cfg: including install rules)
  include $(CFG_SRC_DIR)/mk/install.mk
endif

ifneq ($(strip $(findstring TAGS.emacs,$(MAKECMDGOALS)) \
               $(findstring TAGS.vi,$(MAKECMDGOALS))),)
  CFG_INFO := $(info cfg: including ctags rules)
  include $(CFG_SRC_DIR)/mk/ctags.mk
endif