@@ -11,34 +11,183 @@ endif
11
11
12
12
CFG_INFO := $(info cfg: building on $(CFG_OSTYPE ) $(CFG_CPUTYPE ) )
13
13
14
+ CFG_GCC_CFLAGS :=
15
+ CFG_GCC_LINK_FLAGS :=
16
+ CFG_BOOT_FLAGS := $(BOOT_FLAGS )
17
+ CFG_RUSTC_FLAGS := -nowarn
18
+
19
+ # On Darwin, we need to run dsymutil so the debugging information ends
20
+ # up in the right place. On other platforms, it automatically gets
21
+ # embedded into the executable, so use a no-op command.
22
+ CFG_DSYMUTIL := true
23
+
24
+ ifeq ($(CFG_OSTYPE ) , FreeBSD)
25
+ LIB := lib$(1 ) .so
26
+ CFG_GCC_CFLAGS += -fPIC -march=i686 -I/usr/local/include
27
+ CFG_GCC_LINK_FLAGS += -shared -fPIC -lpthread -lrt
28
+ ifeq ($(CFG_CPUTYPE), x86_64)
29
+ CFG_GCC_CFLAGS += -m32
30
+ CFG_GCC_LINK_FLAGS += -m32
31
+ endif
32
+ CFG_UNIXY := 1
33
+ endif
34
+
35
+ ifeq ($(CFG_OSTYPE ) , Linux)
36
+ LIB := lib$(1 ) .so
37
+ CFG_GCC_CFLAGS += -fPIC -march=i686
38
+ CFG_GCC_LINK_FLAGS += -shared -fPIC -ldl -lpthread -lrt
39
+ ifeq ($(CFG_CPUTYPE), x86_64)
40
+ CFG_GCC_CFLAGS += -m32
41
+ CFG_GCC_LINK_FLAGS += -m32
42
+ endif
43
+ CFG_UNIXY := 1
44
+ endif
45
+
46
+ ifeq ($(CFG_OSTYPE ) , Darwin)
47
+ LIB := lib$(1 ) .dylib
48
+ CFG_UNIXY := 1
49
+ CFG_GCC_LINK_FLAGS += -dynamiclib -lpthread
50
+ # Darwin has a very blurry notion of "64 bit", and claims it's running
51
+ # "on an i386" when the whole userspace is 64-bit and the compiler
52
+ # emits 64-bit binaries by default. So we just force -m32 here. Smarter
53
+ # approaches welcome!
54
+ CFG_GCC_CFLAGS += -m32
55
+ CFG_GCC_LINK_FLAGS += -m32
56
+ CFG_DSYMUTIL := dsymutil
57
+ endif
58
+
59
+ ifneq ($(findstring MINGW,$(CFG_OSTYPE ) ) ,)
60
+ CFG_WINDOWSY := 1
61
+ endif
62
+
63
+ ifdef CFG_WINDOWSY
64
+ CFG_INFO := $(info cfg: windows-y environment)
65
+
66
+ CFG_EXE_SUFFIX := .exe
67
+ CFG_LIB_NAME =$(1 ) .dll
68
+ CFG_RUN_PROGRAM =$(1 )
69
+
70
+ CFG_PATH_MUNGE := | sed -e 's/\\\(.\)/\/\1/g'
71
+ ifdef CFG_FLEXLINK
72
+ CFG_BOOT_NATIVE := 1
73
+ endif
74
+ CFG_GCC_CFLAGS += -march=i686
75
+ CFG_GCC_LINK_FLAGS += -shared -fPIC
76
+ endif
77
+
78
+ ifdef CFG_UNIXY
79
+ CFG_INFO := $(info cfg: unix-y environment)
80
+
81
+ CFG_EXE_SUFFIX :=
82
+ CFG_RUN_PROGRAM = LD_LIBRARY_PATH=$(dir $(1 ) ) $(CFG_VALGRIND ) $(1 )
83
+
84
+ CFG_BOOT_NATIVE := 1
85
+
86
+ ifdef MINGW_CROSS
87
+ CFG_EXE_SUFFIX := .exe
88
+ CFG_LIB_NAME =$(1 ) .dll
89
+ CFG_RUN_PROGRAM =$(1 )
90
+
91
+ CFG_INFO := $(info cfg: mingw-cross)
92
+ CFG_GCC_CROSS := i586-mingw32msvc-
93
+ CFG_BOOT_FLAGS += -t win32-x86-pe
94
+ ifdef CFG_VALGRIND
95
+ CFG_VALGRIND += wine
96
+ endif
97
+ CFG_GCC_CFLAGS := -march=i686
98
+ CFG_GCC_LINK_FLAGS := -shared
99
+ ifeq ($(CFG_CPUTYPE), x86_64)
100
+ CFG_GCC_CFLAGS += -m32
101
+ CFG_GCC_LINK_FLAGS += -m32
102
+ endif
103
+ endif
104
+ ifdef CFG_VALGRIND
105
+ CFG_VALGRIND += --leak-check=full \
106
+ --error-exitcode=1 \
107
+ --quiet --vex-iropt-level=0 \
108
+ --suppressions=etc/x86.supp
109
+ endif
110
+ endif
111
+
112
+ CFG_RUNTIME :=$(call CFG_LIB_NAME,rustrt)
113
+ CFG_LLVMEXT :=$(call CFG_LIB_NAME,llvmext)
114
+ CFG_STDLIB :=$(call CFG_LIB_NAME,std)
115
+
116
+ ifdef CFG_GCC
117
+ CFG_INFO := $(info cfg: using gcc)
118
+ CFG_GCC_CFLAGS += -Wall -Werror -fno-rtti -fno-exceptions -g
119
+ CFG_GCC_LINK_FLAGS += -g
120
+ CFG_COMPILE_C = $(CFG_GCC_CROSS ) g++ $(CFG_GCC_CFLAGS ) -c -o $(1 ) $(2 )
121
+ CFG_LINK_C = $(CFG_GCC_CROSS ) g++ $(CFG_GCC_LINK_FLAGS ) -o $(1 )
122
+ CFG_DEPEND_C = $(CFG_GCC_CROSS ) g++ $(CFG_GCC_CFLAGS ) -MT "$(1 ) " -MM $(2 )
123
+ else
124
+ CFG_ERR := $(error please try on a system with gcc)
125
+ endif
126
+
14
127
ifdef CFG_OCAMLC_OPT
15
- $(info cfg : using ocaml native compiler)
128
+ $(info cfg : have ocaml native compiler)
16
129
OPT =.opt
17
130
else
18
- $(info cfg : using ocaml bytecode compiler)
131
+ $(info cfg : have only ocaml bytecode compiler)
19
132
endif
20
133
21
- ifdef PROFILE_BOOT
22
- $(info cfg : building bootstrap compiler with profiling (forcing native ))
23
- CFG_NATIVE_BOOT := 1
134
+ ifdef BOOT_PROFILE
135
+ $(info cfg : forcing native bootstrap compiler (BOOT_PROFILE ))
136
+ CFG_BOOT_NATIVE := 1
24
137
CFG_OCAMLOPT_PROFILE_FLAGS := -p
25
138
endif
26
139
27
- ifdef DEBUG
28
- $(info cfg : forcing bytecode bootstrap compiler)
29
- CFG_NATIVE_BOOT :=
140
+ ifdef BOOT_DEBUG
141
+ $(info cfg : forcing bytecode bootstrap compiler (DEBUG) )
142
+ CFG_BOOT_NATIVE :=
30
143
endif
31
144
32
- ifdef CFG_NATIVE_BOOT
145
+ ifdef CFG_BOOT_NATIVE
33
146
$(info cfg : building native bootstrap compiler)
34
147
else
35
148
$(info cfg : building bytecode bootstrap compiler)
36
149
endif
37
150
38
151
ifdef NO_VALGRIND
39
- CFG_VALGRIND :=
152
+ $(info cfg : disabling valgrind (NO_VALGRIND))
153
+ CFG_VALGRIND :=
154
+ endif
155
+
156
+ # #####################################################################
157
+ # Target-and-rule "utility variables"
158
+ # #####################################################################
159
+
160
+ ifdef VERBOSE
161
+ Q :=
162
+ E =
163
+ else
164
+ Q := @
165
+ E = echo $(1 )
40
166
endif
41
167
168
+ R := $(CFG_RUN_PROGRAM )
169
+ S := $(CFG_SRC_DIR )
170
+ X := $(CFG_EXE_SUFFIX )
171
+
172
+ # Look in doc and src dirs.
173
+ VPATH := $(S ) doc $(S ) src
174
+
175
+ # Compilers we build, we now know how to run.
176
+ BOOT := $(Q ) OCAMLRUNPARAM="b1" boot/rustboot$(X ) $(CFG_BOOT_FLAGS )
177
+ STAGE0 := $(Q ) stage0/rustc$(X ) $(CFG_RUSTC_FLAGS )
178
+ STAGE1 := $(Q ) stage1/rustc$(X ) $(CFG_RUSTC_FLAGS )
179
+ STAGE2 := $(Q ) stage2/rustc$(X ) $(CFG_RUSTC_FLAGS )
180
+
181
+ # "Source" files we generate in builddir along the way.
182
+ GENERATED := boot/fe/lexer.ml boot/version.ml
183
+
184
+ # Delete the built-in rules.
185
+ .SUFFIXES :
186
+ % :: % ,v
187
+ % :: RCS/% ,v
188
+ % :: RCS/%
189
+ % :: s.%
190
+ % :: SCCS/s.%
42
191
43
192
# #####################################################################
44
193
# Bootstrap compiler variables
@@ -66,72 +215,172 @@ BOOT_CMXS := $(BOOT_MLS:.ml=.cmx)
66
215
BOOT_OBJS := $(BOOT_MLS:.ml=.o )
67
216
BOOT_CMIS := $(BOOT_MLS:.ml=.cmi )
68
217
69
- BOOT_ML_DEP_INCS := -I boot \
70
- -I $(S ) boot/fe -I $(S ) boot/me \
71
- -I $(S ) boot/be -I $(S ) boot/driver \
72
- -I $(S ) boot/util
218
+ BS := $(S ) /src/boot/
219
+
220
+ BOOT_ML_DEP_INCS := -I $(BS ) /fe -I $(BS ) /me \
221
+ -I $(BS ) /be -I $(BS ) /driver \
222
+ -I $(BS ) /util -I boot
223
+
224
+ BOOT_ML_INCS := -I boot/fe -I boot/me \
225
+ -I boot/be -I boot/driver \
226
+ -I boot/util -I boot
73
227
74
- BOOT_ML_INCS := $(BOOT_ML_DEP_INCS )
75
228
BOOT_ML_LIBS := unix.cma nums.cma bigarray.cma
76
229
BOOT_ML_NATIVE_LIBS := unix.cmxa nums.cmxa bigarray.cmxa
77
230
BOOT_OCAMLC_FLAGS := -g $(BOOT_ML_INCS ) -w Ael -warn-error Ael
231
+ BOOT_OCAMLOPT_FLAGS := -g $(BOOT_ML_INCS ) -w Ael -warn-error Ael
232
+
233
+ # #####################################################################
234
+ # Runtime (C++) library variables
235
+ # #####################################################################
78
236
237
+ RUNTIME_CS := rt/sync/timer.cpp \
238
+ rt/sync/sync.cpp \
239
+ rt/sync/lock_and_signal.cpp \
240
+ rt/rust.cpp \
241
+ rt/rust_builtin.cpp \
242
+ rt/rust_run_program.cpp \
243
+ rt/rust_crate.cpp \
244
+ rt/rust_crate_cache.cpp \
245
+ rt/rust_crate_reader.cpp \
246
+ rt/rust_comm.cpp \
247
+ rt/rust_dom.cpp \
248
+ rt/rust_task.cpp \
249
+ rt/rust_task_list.cpp \
250
+ rt/rust_proxy.cpp \
251
+ rt/rust_chan.cpp \
252
+ rt/rust_port.cpp \
253
+ rt/rust_upcall.cpp \
254
+ rt/rust_log.cpp \
255
+ rt/rust_message.cpp \
256
+ rt/rust_timer.cpp \
257
+ rt/circular_buffer.cpp \
258
+ rt/isaac/randport.cpp \
259
+ rt/rust_srv.cpp \
260
+ rt/rust_kernel.cpp \
261
+ rt/memory_region.cpp \
262
+ rt/test/rust_test_harness.cpp \
263
+ rt/test/rust_test_runtime.cpp \
264
+ rt/test/rust_test_util.cpp
265
+
266
+ RUNTIME_HDR := rt/globals.h \
267
+ rt/rust.h \
268
+ rt/rust_dwarf.h \
269
+ rt/rust_internal.h \
270
+ rt/rust_util.h \
271
+ rt/rust_chan.h \
272
+ rt/rust_port.h \
273
+ rt/rust_dom.h \
274
+ rt/rust_task.h \
275
+ rt/rust_task_list.h \
276
+ rt/rust_proxy.h \
277
+ rt/rust_log.h \
278
+ rt/rust_message.h \
279
+ rt/circular_buffer.h \
280
+ rt/util/array_list.h \
281
+ rt/util/indexed_list.h \
282
+ rt/util/synchronized_indexed_list.h \
283
+ rt/util/hash_map.h \
284
+ rt/sync/sync.h \
285
+ rt/sync/timer.h \
286
+ rt/sync/lock_free_queue.h \
287
+ rt/rust_srv.h \
288
+ rt/rust_kernel.h \
289
+ rt/memory_region.h \
290
+ rt/memory.h \
291
+ rt/test/rust_test_harness.h \
292
+ rt/test/rust_test_runtime.h \
293
+ rt/test/rust_test_util.h
294
+
295
+ RUNTIME_INCS := -I $(S ) src/rt/isaac -I $(S ) src/rt/uthash
296
+ RUNTIME_OBJS := $(RUNTIME_CS:.cpp=.o )
79
297
80
298
# #####################################################################
81
- # Target-and-rule "utility variables"
299
+ # rustc LLVM-extensions (C++) library variables
82
300
# #####################################################################
83
301
84
- ifdef VERBOSE
85
- Q :=
86
- E =
87
- else
88
- Q := @
89
- E = echo $(1 )
90
- endif
302
+ LLVMEXT_CS := $(addprefix llvmext/, \
303
+ MachOObjectFile.cpp Object.cpp RustWrapper.cpp)
91
304
92
- S := $(CFG_SRC_DIR )
93
- X := $(CFG_EXE_SUFFIX )
305
+ LLVMEXT_HDR := llvmext/include/llvm-c/Object.h
94
306
95
- # Look in doc and src dirs.
96
- VPATH := $(CFG_SRC_DIR ) /doc $(CFG_SRC_DIR ) /src
307
+ LLVMEXT_INCS := -iquote $(CFG_LLVM_INCDIR ) -iquote llvmext/include
308
+ LLVMEXT_OBJS := $(LLVMEXT_CS:.cpp=.o )
309
+ LLVMEXT_LIBS := $(CFG_LLVM_LDFLAGS ) $(CFG_LLVM_LIBS )
97
310
98
- # Delete the built-in rules.
99
- .SUFFIXES :
100
- % :: % ,v
101
- % :: RCS/% ,v
102
- % :: RCS/%
103
- % :: s.%
104
- % :: SCCS/s.%
311
+ # #####################################################################
312
+ # Standard library variables
313
+ # #####################################################################
314
+
315
+ STDLIB_CRATE := lib/std.rc
316
+ STDLIB_INPUTS := $(wildcard $(addprefix $(S ) src/lib/,* .rc * .rs * /* .rs) )
105
317
106
318
# #####################################################################
107
- # Targets and rules
319
+ # rustc crate variables
108
320
# #####################################################################
109
321
110
- all : boot/rustboot$(X )
322
+ COMPILER_CRATE := comp/rustc.rc
323
+ COMPILER_INPUTS := $(wildcard $(addprefix $(S ) /src/comp/, \
324
+ rustc.rc * .rs * /* .rs) )
325
+
326
+ # #####################################################################
327
+ # Single-target rules
328
+ # #####################################################################
111
329
112
- ifdef CFG_NATIVE_BOOT
330
+ all : boot/rustboot$(X ) rt/$(CFG_RUNTIME ) llvmext/$(CFG_LLVMEXT )
331
+
332
+ rt/$(CFG_RUNTIME ) : $(RUNTIME_OBJS ) $(MKFILES ) $(RUNTIME_HDR )
333
+ @$(call E, link: $@ )
334
+ $(Q )$(call CFG_LINK_C, $@ ) $(RUNTIME_OBJS )
335
+
336
+ llvmext/$(CFG_LLVMEXT ) : $(LLVMEXT_OBJS ) $(MKFILES ) $(LLVMEXT_HDR )
337
+ @$(call E, link: $@ )
338
+ $(Q )$(call CFG_LINK_C, $@ $(LLVMEXT_OBJS ) \
339
+ $(CFG_LLVM_LIBS) $(CFG_LLVM_LDFLAGS))
340
+
341
+ ifdef CFG_BOOT_NATIVE
113
342
boot/rustboot$(X ) : $(BOOT_CMXS ) $(MKFILES )
114
- @$(call E, compile : $@ )
115
- $(Q ) ocamlopt$(OPT ) -o $@ $(BOOT_OCAMLOPT_FLAGS ) $(ML_NATIVE_LIBS ) \
343
+ @$(call E, link : $@ )
344
+ $(Q ) ocamlopt$(OPT ) -o $@ $(BOOT_OCAMLOPT_FLAGS ) $(BOOT_ML_NATIVE_LIBS ) \
116
345
$(BOOT_CMXS)
117
346
else
118
347
boot/rustboot$(X ) : $(BOOT_CMOS ) $(MKFILES )
119
- @$(call E, compile : $@ )
348
+ @$(call E, link : $@ )
120
349
$(Q ) ocamlc$(OPT ) -o $@ $(BOOT_OCAMLC_FLAGS ) $(BOOT_ML_LIBS ) $(BOOT_CMOS )
121
350
endif
122
351
123
-
124
352
boot/version.ml : $(MKFILES )
125
353
@$(call E, git: $@ )
126
354
$(Q ) git log -1 \
127
355
--pretty =format:'let version = "prerelease (%h %ci)";;' >$@ || exit 1
128
356
357
+
358
+ # #####################################################################
359
+ # Pattern rules
360
+ # #####################################################################
361
+
362
+ rt/% .o : rt/% .cpp $(MKFILES )
363
+ @$(call E, compile: $@ )
364
+ $(Q )$(call CFG_COMPILE_C, $@ , $(RUNTIME_INCS ) ) $<
365
+
366
+ llvmext/% .o : llvmext/% .cpp $(MKFILES )
367
+ @$(call E, compile: $@ )
368
+ $(Q )$(call CFG_COMPILE_C, $@ , $(CFG_LLVM_CXXFLAGS ) \
369
+ $(SUPPORT_INCS ) ) $<
370
+
129
371
% .cmo : % .ml $(MKFILES )
130
372
@$(call E, compile: $@ )
131
373
$(Q ) ocamlc$(OPT ) -c -o $@ $(BOOT_OCAMLC_FLAGS ) $<
132
374
133
375
% .cmo : % .cmi $(MKFILES )
134
376
377
+ % .cmx % .o : % .ml $(MKFILES )
378
+ @$(call E, compile: $@ )
379
+ $(Q ) ocamlopt$(OPT ) -c -o $@ $(BOOT_OCAMLOPT_FLAGS ) $<
380
+
381
+ % .ml : % .mll $(MKFILES )
382
+ @$(call E, lex-gen: $@ )
383
+ $(Q ) ocamllex$(OPT ) -q -o $@ $<
135
384
136
385
137
386
# #####################################################################
0 commit comments