Skip to content

Commit 211842e

Browse files
nikomatsakisbrson
authored andcommitted
---
yaml --- r: 6118 b: refs/heads/master c: 54af489 h: refs/heads/master v: v3
1 parent f968c42 commit 211842e

File tree

5 files changed

+175
-102
lines changed

5 files changed

+175
-102
lines changed

[refs]

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: e8e2f3395dcb08950eb09ab073d9776b8432ba0a
2+
refs/heads/master: 54af489e6f14fd1382c7b84c9cf85fecf91ba276

trunk/configure

+12-2
Original file line numberDiff line numberDiff line change
@@ -394,15 +394,25 @@ step_msg "making directories"
394394
for i in \
395395
doc doc/std \
396396
nd nd/std \
397-
rt rt/isaac rt/bigint rt/sync rt/test rt/arch/i386 rt/arch/x86_64 \
398-
rt/libuv rt/libuv/src/ares rt/libuv/src/eio rt/libuv/src/ev \
399397
rustllvm dl \
400398
test/run-pass test/run-fail test/compile-fail \
401399
test/bench test/perf test/pretty
402400
do
403401
make_dir $i
404402
done
405403

404+
make_dir rt
405+
for t in $CFG_TARGET_TRIPLES
406+
do
407+
make_dir rt/$t
408+
for i in \
409+
isaac bigint sync test arch/i386 arch/x86_64 \
410+
libuv libuv/src/ares libuv/src/eio libuv/src/ev
411+
do
412+
make_dir rt/$t/$i
413+
done
414+
done
415+
406416
for t in $CFG_TARGET_TRIPLES
407417
do
408418
for i in 0 1 2 3

trunk/mk/platform.mk

+57-22
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11

2-
CFG_GCCISH_CFLAGS := -fno-strict-aliasing
2+
# Create variables HOST_<triple> containing the host part
3+
# of each target triple. For example, the triple i686-darwin-macos
4+
# would create a variable HOST_i686-darwin-macos with the value
5+
# i386.
6+
define DEF_HOST_VAR
7+
HOST_$(1) = $(subst i686,i386,$(word 1,$(subst -, ,$(1))))
8+
endef
9+
$(foreach t,$(CFG_TARGET_TRIPLES),$(eval $(call DEF_HOST_VAR,$(t))))
10+
$(foreach t,$(CFG_TARGET_TRIPLES),$(info Host for $(t) is $(HOST_$(t))))
11+
12+
CFG_GCCISH_FLAGS := -fno-strict-aliasing
313
CFG_GCCISH_LINK_FLAGS :=
414

515
# On Darwin, we need to run dsymutil so the debugging information ends
@@ -16,8 +26,10 @@ ifneq ($(findstring freebsd,$(CFG_OSTYPE)),)
1626
CFG_GCCISH_CFLAGS += -fPIC -march=i686 -I/usr/local/include
1727
CFG_GCCISH_LINK_FLAGS += -shared -fPIC -lpthread -lrt
1828
ifeq ($(CFG_CPUTYPE), x86_64)
19-
CFG_GCCISH_CFLAGS += -m32
20-
CFG_GCCISH_LINK_FLAGS += -m32
29+
CFG_GCCISH_CFLAGS_i386 += -m32
30+
CFG_GCCISH_LINK_FLAGS_i386 += -m32
31+
CFG_GCCISH_CFLAGS_x86_64 += -m32
32+
CFG_GCCISH_LINK_FLAGS_x86_64 += -m32
2133
endif
2234
CFG_UNIXY := 1
2335
CFG_LDENV := LD_LIBRARY_PATH
@@ -34,10 +46,10 @@ ifneq ($(findstring linux,$(CFG_OSTYPE)),)
3446
# -znoexecstack is here because librt is for some reason being created
3547
# with executable stack and Fedora (or SELinux) doesn't like that (#798)
3648
CFG_GCCISH_POST_LIB_FLAGS := -Wl,-no-whole-archive -Wl,-znoexecstack
37-
ifeq ($(CFG_CPUTYPE), x86_64)
38-
CFG_GCCISH_CFLAGS += -m32
39-
CFG_GCCISH_LINK_FLAGS += -m32
40-
endif
49+
CFG_GCCISH_CFLAGS_i386 = -m32
50+
CFG_GCCISH_LINK_FLAGS_i386 = -m32
51+
CFG_GCCISH_CFLAGS_x86_64 = -m64
52+
CFG_GCCISH_LINK_FLAGS_x86_64 = -m64
4153
CFG_UNIXY := 1
4254
CFG_LDENV := LD_LIBRARY_PATH
4355
CFG_DEF_SUFFIX := .linux.def
@@ -66,13 +78,10 @@ ifneq ($(findstring darwin,$(CFG_OSTYPE)),)
6678
# approaches welcome!
6779
#
6880
# NB: Currently GCC's optimizer breaks rustrt (task-comm-1 hangs) on Darwin.
69-
CFG_GCC_CFLAGS += -m32
70-
CFG_CLANG_CFLAGS += -m32
71-
ifeq ($(CFG_CPUTYPE), x86_64)
72-
CFG_GCCISH_CFLAGS += -arch i386
73-
CFG_GCCISH_LINK_FLAGS += -arch i386
74-
endif
75-
CFG_GCCISH_LINK_FLAGS += -m32
81+
CFG_GCCISH_CFLAGS_i386 := -m32 -arch i386
82+
CFG_GCCISH_CFLAGS_x86_64 := -m64 -arch x86_64
83+
CFG_GCCISH_LINK_FLAGS_i386 := -m32
84+
CFG_GCCISH_LINK_FLAGS_x86_64 := -m64
7685
CFG_DSYMUTIL := dsymutil
7786
CFG_DEF_SUFFIX := .darwin.def
7887
# Mac requires this flag to make rpath work
@@ -169,25 +178,51 @@ ifeq ($(CFG_C_COMPILER),clang)
169178
CXX=clang++
170179
CFG_GCCISH_CFLAGS += -Wall -Werror -fno-rtti -g
171180
CFG_GCCISH_LINK_FLAGS += -g
172-
CFG_COMPILE_C = $(CFG_GCCISH_CROSS)$(CXX) $(CFG_GCCISH_CFLAGS) \
173-
$(CFG_CLANG_CFLAGS) -c -o $(1) $(2)
174181
CFG_DEPEND_C = $(CFG_GCCISH_CROSS)$(CXX) $(CFG_GCCISH_CFLAGS) -MT "$(1)" \
175182
-MM $(2)
176-
CFG_LINK_C = $(CFG_GCCISH_CROSS)$(CXX) $(CFG_GCCISH_LINK_FLAGS) -o $(1) \
177-
$(CFG_GCCISH_DEF_FLAG)$(3) $(2) $(call CFG_INSTALL_NAME,$(4))
183+
184+
define CFG_MAKE_CC
185+
CFG_COMPILE_C_$(1) = $$(CFG_GCCISH_CROSS)$$(CXX) \
186+
$$(CFG_GCCISH_CFLAGS) $$(CFG_CLANG_CFLAGS) \
187+
$$(CFG_GCCISH_CFLAGS_$$(HOST_$(1))) \
188+
$$(CFG_CLANG_CFLAGS_$$(HOST_$(1))) \
189+
-c -o $$(1) $$(2)
190+
CFG_LINK_C_$(1) = $$(CFG_GCCISH_CROSS)$$(CXX) \
191+
$$(CFG_GCCISH_LINK_FLAGS) -o $$(1) \
192+
$$(CFG_GCCISH_LINK_FLAGS_$$(HOST_$(1))) \
193+
$$(CFG_GCCISH_DEF_FLAG)$$(3) $$(2) \
194+
$$(call CFG_INSTALL_NAME,$$(4))
195+
endef
196+
197+
$(foreach target,$(CFG_TARGET_TRIPLES), \
198+
$(eval $(call CFG_MAKE_CC,$(target))))
178199
else
179200
ifeq ($(CFG_C_COMPILER),gcc)
180201
CC=gcc
181202
CXX=g++
182203
CFG_GCCISH_CFLAGS += -Wall -Werror -fno-rtti -g
183204
CFG_GCCISH_LINK_FLAGS += -g
184-
CFG_COMPILE_C = $(CFG_GCCISH_CROSS)$(CXX) $(CFG_GCCISH_CFLAGS) \
185-
$(CFG_GCC_CFLAGS) -c -o $(1) $(2)
186205
CFG_DEPEND_C = $(CFG_GCCISH_CROSS)$(CXX) $(CFG_GCCISH_CFLAGS) -MT "$(1)" \
187206
-MM $(2)
188-
CFG_LINK_C = $(CFG_GCCISH_CROSS)$(CXX) $(CFG_GCCISH_LINK_FLAGS) -o $(1) \
189-
$(CFG_GCCISH_DEF_FLAG)$(3) $(2) $(call CFG_INSTALL_NAME,$(4))
207+
208+
define CFG_MAKE_CC
209+
CFG_COMPILE_C_$(1) = $$(CFG_GCCISH_CROSS)$$(CXX) \
210+
$$(CFG_GCCISH_CFLAGS) \
211+
$$(CFG_GCCISH_CFLAGS_$$(HOST_$(1))) \
212+
$$(CFG_GCC_CFLAGS) \
213+
$$(CFG_GCC_CFLAGS_$$(HOST_$(1))) \
214+
-c -o $$(1) $$(2)
215+
CFG_LINK_C_$(1) = $$(CFG_GCCISH_CROSS)$$(CXX) \
216+
$$(CFG_GCCISH_LINK_FLAGS) -o $$(1) \
217+
$$(CFG_GCCISH_LINK_FLAGS_$$(HOST_$(1))) \
218+
$$(CFG_GCCISH_DEF_FLAG)$$(3) $$(2) \
219+
$$(call CFG_INSTALL_NAME,$$(4))
220+
endef
221+
222+
$(foreach target,$(CFG_TARGET_TRIPLES), \
223+
$(eval $(call CFG_MAKE_CC,$(target))))
190224
else
191225
CFG_ERR := $(error please try on a system with gcc or clang)
192226
endif
193227
endif
228+

trunk/mk/rt.mk

+103-70
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,36 @@
1+
# This is a procedure to define the targets for building
2+
# the runtime.
3+
#
4+
# Argument 1 is the target triple.
5+
#
6+
# This is not really the right place to explain this, but
7+
# for those of you who are not Makefile gurus, let me briefly
8+
# cover the $ expansion system in use here, because it
9+
# confused me for a while! The variable DEF_RUNTIME_TARGETS
10+
# will be defined once and then expanded with different
11+
# values substituted for $(1) each time it is called.
12+
# That resulting text is then eval'd.
13+
#
14+
# For most variables, you could use a single $ sign. The result
15+
# is that the substitution would occur when the CALL occurs,
16+
# I believe. The problem is that the automatic variables $< and $@
17+
# need to be expanded-per-rule. Therefore, for those variables at
18+
# least, you need $$< and $$@ in the variable text. This way, after
19+
# the CALL substitution occurs, you will have $< and $@. This text
20+
# will then be evaluated, and all will work as you like.
21+
#
22+
# Reader beware, this explanantion could be wrong, but it seems to
23+
# fit the experimental data (i.e., I was able to get the system
24+
# working under these assumptions).
25+
26+
define DEF_RUNTIME_TARGETS
27+
128
######################################################################
229
# Runtime (C++) library variables
330
######################################################################
431

5-
RUNTIME_CS := rt/sync/timer.cpp \
32+
RUNTIME_CS_$(1) := \
33+
rt/sync/timer.cpp \
634
rt/sync/sync.cpp \
735
rt/sync/lock_and_signal.cpp \
836
rt/rust.cpp \
@@ -33,15 +61,13 @@ RUNTIME_CS := rt/sync/timer.cpp \
3361
rt/test/rust_test_harness.cpp \
3462
rt/test/rust_test_runtime.cpp \
3563
rt/test/rust_test_util.cpp \
36-
rt/arch/i386/context.cpp
37-
38-
RUNTIME_LL :=
64+
rt/arch/$$(HOST_$(1))/context.cpp
3965

40-
RUNTIME_S := rt/arch/i386/_context.S \
41-
rt/arch/i386/ccall.S \
42-
rt/arch/i386/morestack.S
66+
RUNTIME_S_$(1) := rt/arch/$$(HOST_$(1))/_context.S \
67+
rt/arch/$$(HOST_$(1))/ccall.S \
68+
rt/arch/$$(HOST_$(1))/morestack.S
4369

44-
RUNTIME_HDR := rt/globals.h \
70+
RUNTIME_HDR_$(1) := rt/globals.h \
4571
rt/rust.h \
4672
rt/rust_abi.h \
4773
rt/rust_cc.h \
@@ -76,81 +102,88 @@ RUNTIME_HDR := rt/globals.h \
76102
rt/test/rust_test_harness.h \
77103
rt/test/rust_test_runtime.h \
78104
rt/test/rust_test_util.h \
79-
rt/arch/i386/context.h
105+
rt/arch/$$(HOST_$(1))/context.h
80106

81-
ifeq ($(CFG_WINDOWSY), 1)
82-
LIBUV_OSTYPE := win
83-
LIBUV_ARCH := ia32
84-
LIBUV_LIB := rt/libuv/Default/obj.target/src/rt/libuv/libuv.a
85-
else ifeq ($(CFG_OSTYPE), apple-darwin)
86-
LIBUV_OSTYPE := mac
87-
LIBUV_ARCH := ia32
88-
LIBUV_LIB := rt/libuv/Default/libuv.a
107+
ifeq ($$(HOST_$(1)), i386)
108+
LIBUV_ARCH_$(1) := ia32
89109
else
90-
LIBUV_OSTYPE := unix
91-
LIBUV_ARCH := ia32
92-
LIBUV_LIB := rt/libuv/Default/obj.target/src/rt/libuv/libuv.a
110+
LIBUV_ARCH_$(1) := x86_64
93111
endif
94112

95-
RUNTIME_DEF := rt/rustrt$(CFG_DEF_SUFFIX)
96-
RUNTIME_INCS := -I $(S)src/rt/isaac -I $(S)src/rt/uthash \
97-
-I $(S)src/rt/arch/i386 \
98-
-I $(S)src/rt/libuv/include
99-
RUNTIME_OBJS := $(RUNTIME_CS:.cpp=.o) $(RUNTIME_LL:.ll=.o) $(RUNTIME_S:.S=.o)
100-
RUNTIME_LIBS := $(LIBUV_LIB)
101-
102-
RT_COMPILE_C := $(call CFG_COMPILE_C, $(0), $(1) -I $(S)src/rt/arch/$(2))
103-
104-
rt/%.o: rt/%.cpp $(MKFILES)
105-
@$(call E, compile: $@)
106-
$(Q)$(call CFG_COMPILE_C, $@, $(RUNTIME_INCS)) $<
107-
108-
rt/%.o: rt/%.S $(MKFILES)
109-
@$(call E, compile: $@)
110-
$(Q)$(call CFG_COMPILE_C, $@, $(RUNTIME_INCS)) $<
111-
112-
rt/%.o: rt/%.ll $(MKFILES)
113-
@$(call E, llc: $@)
114-
$(Q)$(LLC) -filetype=obj -relocation-model=pic -march=x86 -o $@ $<
113+
ifeq ($$(CFG_WINDOWSY), 1)
114+
LIBUV_OSTYPE_$(1) := win
115+
LIBUV_LIB_$(1) := rt/$(1)/libuv/Default/obj.target/src/rt/libuv/libuv.a
116+
else ifeq ($(CFG_OSTYPE), apple-darwin)
117+
LIBUV_OSTYPE_$(1) := mac
118+
LIBUV_LIB_$(1) := rt/$(1)/libuv/Default/libuv.a
119+
else
120+
LIBUV_OSTYPE_$(1) := unix
121+
LIBUV_LIB_$(1) := rt/$(1)/libuv/Default/obj.target/src/rt/libuv/libuv.a
122+
endif
115123

116-
rt/$(CFG_RUNTIME): $(RUNTIME_OBJS) $(MKFILES) $(RUNTIME_HDR) $(RUNTIME_DEF) $(RUNTIME_LIBS)
117-
@$(call E, link: $@)
118-
$(Q)$(call CFG_LINK_C,$@, $(RUNTIME_OBJS) \
119-
$(CFG_GCCISH_POST_LIB_FLAGS) $(RUNTIME_LIBS) \
120-
$(CFG_LIBUV_LINK_FLAGS),$(RUNTIME_DEF),$(CFG_RUNTIME))
124+
RUNTIME_DEF_$(1) := rt/rustrt$$(CFG_DEF_SUFFIX)
125+
RUNTIME_INCS_$(1) := -I $$(S)src/rt/isaac -I $$(S)src/rt/uthash \
126+
-I $$(S)src/rt/arch/$$(HOST_$(1)) \
127+
-I $$(S)src/rt/libuv/include
128+
RUNTIME_OBJS_$(1) := $$(RUNTIME_CS_$(1):rt/%.cpp=rt/$(1)/%.o) \
129+
$$(RUNTIME_S_$(1):rt/%.S=rt/$(1)/%.o)
130+
RUNTIME_LIBS_$(1) := $$(LIBUV_LIB_$(1))
131+
132+
rt/$(1)/%.o: rt/%.cpp $$(MKFILES)
133+
@$$(call E, compile: $$@)
134+
$$(Q)$$(call CFG_COMPILE_C_$(1), $$@, $$(RUNTIME_INCS_$(1))) $$<
135+
136+
rt/$(1)/%.o: rt/%.S $$(MKFILES)
137+
@$$(call E, compile: $$@)
138+
$$(Q)$$(call CFG_COMPILE_C_$(1), $$@, $$(RUNTIME_INCS_$(1))) $$<
139+
140+
rt/$(1)/$(CFG_RUNTIME): $$(RUNTIME_OBJS_$(1)) $$(MKFILES) \
141+
$$(RUNTIME_HDR_$(1)) \
142+
$$(RUNTIME_DEF_$(1)) \
143+
$$(RUNTIME_LIBS_$(1))
144+
@$$(call E, link: $$@)
145+
$$(Q)$$(call CFG_LINK_C_$(1),$$@, $$(RUNTIME_OBJS_$(1)) \
146+
$$(CFG_GCCISH_POST_LIB_FLAGS) $$(RUNTIME_LIBS_$(1)) \
147+
$$(CFG_LIBUV_LINK_FLAGS),$$(RUNTIME_DEF_$(1)),$$(CFG_RUNTIME))
121148

122149
# FIXME: For some reason libuv's makefiles can't figure out the correct definition
123150
# of CC on the mingw I'm using, so we are explicitly using gcc. Also, we
124151
# have to list environment variables first on windows... mysterious
125-
$(LIBUV_LIB): $(wildcard \
126-
$(S)src/rt/libuv/* \
127-
$(S)src/rt/libuv/*/* \
128-
$(S)src/rt/libuv/*/*/* \
129-
$(S)src/rt/libuv/*/*/*/*)
130-
$(Q)$(MAKE) -C $(S)mk/libuv/$(LIBUV_ARCH)/$(LIBUV_OSTYPE) \
131-
CFLAGS="-m32" LDFLAGS="-m32" \
132-
CC="$(CFG_GCCISH_CROSS)$(CC)" \
133-
CXX="$(CFG_GCCISH_CROSS)$(CXX)" \
134-
AR="$(CFG_GCCISH_CROSS)$(AR)" \
135-
builddir_name="$(CFG_BUILD_DIR)/rt/libuv" \
136-
V=$(VERBOSE) FLOCK= uv
152+
$$(LIBUV_LIB_$(1)): $$(wildcard \
153+
$$(S)src/rt/libuv/* \
154+
$$(S)src/rt/libuv/*/* \
155+
$$(S)src/rt/libuv/*/*/* \
156+
$$(S)src/rt/libuv/*/*/*/*)
157+
$$(Q)$$(MAKE) -C $$(S)mk/libuv/$$(LIBUV_ARCH_$(1))/$$(LIBUV_OSTYPE_$(1)) \
158+
CFLAGS="$$(TAR_CFLAGS)" LDFLAGS="-m32" \
159+
CC="$$(CFG_GCCISH_CROSS)$$(CC)" \
160+
CXX="$$(CFG_GCCISH_CROSS)$$(CXX)" \
161+
AR="$$(CFG_GCCISH_CROSS)$$(AR)" \
162+
builddir_name="$$(CFG_BUILD_DIR)/rt/$(1)/libuv" \
163+
V=$$(VERBOSE) FLOCK= uv
137164

138165
# These could go in rt.mk or rustllvm.mk, they're needed for both.
139166

140-
%.linux.def: %.def.in $(MKFILES)
141-
@$(call E, def: $@)
142-
$(Q)echo "{" > $@
143-
$(Q)sed 's/.$$/&;/' $< >> $@
144-
$(Q)echo "};" >> $@
167+
%.linux.def: %.def.in $$(MKFILES)
168+
@$$(call E, def: $$@)
169+
$$(Q)echo "{" > $$@
170+
$$(Q)sed 's/.$$/&;/' $$< >> $$@
171+
$$(Q)echo "};" >> $$@
145172

146-
%.darwin.def: %.def.in $(MKFILES)
147-
@$(call E, def: $@)
148-
$(Q)sed 's/^./_&/' $< > $@
173+
%.darwin.def: %.def.in $$(MKFILES)
174+
@$$(call E, def: $$@)
175+
$$(Q)sed 's/^./_&/' $$< > $$@
149176

150177
ifdef CFG_WINDOWSY
151-
%.def: %.def.in $(MKFILES)
152-
@$(call E, def: $@)
153-
$(Q)echo LIBRARY $* > $@
154-
$(Q)echo EXPORTS >> $@
155-
$(Q)sed 's/^./ &/' $< >> $@
178+
%.def: %.def.in $$(MKFILES)
179+
@$$(call E, def: $$@)
180+
$$(Q)echo LIBRARY $$* > $$@
181+
$$(Q)echo EXPORTS >> $$@
182+
$$(Q)sed 's/^./ &/' $$< >> $$@
156183
endif
184+
185+
endef
186+
187+
# Instantiate template for all stages
188+
$(foreach target,$(CFG_TARGET_TRIPLES), \
189+
$(eval $(call DEF_RUNTIME_TARGETS,$(target))))

trunk/mk/target.mk

+2-7
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,8 @@
77

88
define TARGET_STAGE_N
99

10-
TARGET_HOST := $$(word 1,$$(subst -, ,$(2)))
11-
12-
# For some reason there is (sometimes) a mismatch here between i686, i386, etc
13-
INTR_HOST := $$(subst i686,i386,$$(TARGET_HOST))
14-
1510
$$(TARGET_LIB$(1)$(2))/intrinsics.ll: \
16-
$$(S)src/rt/intrinsics/intrinsics.$$(INTR_HOST).ll.in
11+
$$(S)src/rt/intrinsics/intrinsics.$(HOST_$(2)).ll.in
1712
@$$(call E, sed: $$@)
1813
$$(Q)sed s/@CFG_TARGET_TRIPLE@/$(2)/ $$< > $$@
1914

@@ -40,7 +35,7 @@ $$(TARGET_LIB$(1)$(2))/libstd.rlib: \
4035
@$$(call E, compile_and_link: $$@)
4136
$$(STAGE$(1)_$(2)) --lib --static -o $$@ $$<
4237

43-
$$(TARGET_LIB$(1)$(2))/$$(CFG_RUNTIME): rt/$$(CFG_RUNTIME)
38+
$$(TARGET_LIB$(1)$(2))/$$(CFG_RUNTIME): rt/$(2)/$(CFG_RUNTIME)
4439
@$$(call E, cp: $$@)
4540
$$(Q)cp $$< $$@
4641

0 commit comments

Comments
 (0)