Skip to content

Commit 4c2245d

Browse files
committed
Yet more painstaking configure/make logic.
1 parent 5eca712 commit 4c2245d

File tree

2 files changed

+377
-70
lines changed

2 files changed

+377
-70
lines changed

Makefile.in

Lines changed: 290 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -11,34 +11,183 @@ endif
1111

1212
CFG_INFO := $(info cfg: building on $(CFG_OSTYPE) $(CFG_CPUTYPE))
1313

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+
14127
ifdef CFG_OCAMLC_OPT
15-
$(info cfg: using ocaml native compiler)
128+
$(info cfg: have ocaml native compiler)
16129
OPT=.opt
17130
else
18-
$(info cfg: using ocaml bytecode compiler)
131+
$(info cfg: have only ocaml bytecode compiler)
19132
endif
20133

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
24137
CFG_OCAMLOPT_PROFILE_FLAGS := -p
25138
endif
26139

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 :=
30143
endif
31144

32-
ifdef CFG_NATIVE_BOOT
145+
ifdef CFG_BOOT_NATIVE
33146
$(info cfg: building native bootstrap compiler)
34147
else
35148
$(info cfg: building bytecode bootstrap compiler)
36149
endif
37150

38151
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)
40166
endif
41167

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.%
42191

43192
######################################################################
44193
# Bootstrap compiler variables
@@ -66,72 +215,172 @@ BOOT_CMXS := $(BOOT_MLS:.ml=.cmx)
66215
BOOT_OBJS := $(BOOT_MLS:.ml=.o)
67216
BOOT_CMIS := $(BOOT_MLS:.ml=.cmi)
68217

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
73227

74-
BOOT_ML_INCS := $(BOOT_ML_DEP_INCS)
75228
BOOT_ML_LIBS := unix.cma nums.cma bigarray.cma
76229
BOOT_ML_NATIVE_LIBS := unix.cmxa nums.cmxa bigarray.cmxa
77230
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+
######################################################################
78236

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

80298
######################################################################
81-
# Target-and-rule "utility variables"
299+
# rustc LLVM-extensions (C++) library variables
82300
######################################################################
83301

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

92-
S := $(CFG_SRC_DIR)
93-
X := $(CFG_EXE_SUFFIX)
305+
LLVMEXT_HDR := llvmext/include/llvm-c/Object.h
94306

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

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

106318
######################################################################
107-
# Targets and rules
319+
# rustc crate variables
108320
######################################################################
109321

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+
######################################################################
111329

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
113342
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) \
116345
$(BOOT_CMXS)
117346
else
118347
boot/rustboot$(X): $(BOOT_CMOS) $(MKFILES)
119-
@$(call E, compile: $@)
348+
@$(call E, link: $@)
120349
$(Q)ocamlc$(OPT) -o $@ $(BOOT_OCAMLC_FLAGS) $(BOOT_ML_LIBS) $(BOOT_CMOS)
121350
endif
122351

123-
124352
boot/version.ml: $(MKFILES)
125353
@$(call E, git: $@)
126354
$(Q)git log -1 \
127355
--pretty=format:'let version = "prerelease (%h %ci)";;' >$@ || exit 1
128356

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+
129371
%.cmo: %.ml $(MKFILES)
130372
@$(call E, compile: $@)
131373
$(Q)ocamlc$(OPT) -c -o $@ $(BOOT_OCAMLC_FLAGS) $<
132374

133375
%.cmo: %.cmi $(MKFILES)
134376

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 $@ $<
135384

136385

137386
######################################################################

0 commit comments

Comments
 (0)