]> git.lizzy.rs Git - rust.git/blob - mk/rt.mk
Upgrade libuv to the current master (again)
[rust.git] / mk / rt.mk
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 # Hack for passing flags into LIBUV, see below.
27 LIBUV_FLAGS_i386 = -m32 -fPIC
28 LIBUV_FLAGS_x86_64 = -m64 -fPIC
29 ifeq ($(OSTYPE_$(1)), linux-androideabi)
30 LIBUV_FLAGS_arm = -fPIC -DANDROID -std=gnu99
31 else
32 LIBUV_FLAGS_arm = -fPIC -std=gnu99
33 endif
34 LIBUV_FLAGS_mips = -fPIC -mips32r2 -msoft-float -mabi=32
35
36 # when we're doing a snapshot build, we intentionally degrade as many
37 # features in libuv and the runtime as possible, to ease portability.
38
39 SNAP_DEFINES:=
40 ifneq ($(strip $(findstring snap,$(MAKECMDGOALS))),)
41         SNAP_DEFINES=-DRUST_SNAPSHOT
42 endif
43
44 define DEF_LIBUV_ARCH_VAR
45   LIBUV_ARCH_$(1) = $$(subst i386,ia32,$$(subst x86_64,x64,$$(HOST_$(1))))
46 endef
47 $(foreach t,$(CFG_TARGET_TRIPLES),$(eval $(call DEF_LIBUV_ARCH_VAR,$(t))))
48
49 define DEF_RUNTIME_TARGETS
50
51 ######################################################################
52 # Runtime (C++) library variables
53 ######################################################################
54
55 # $(1) is the target triple
56 # $(2) is the stage number
57
58 RUNTIME_CFLAGS_$(1)_$(2) = -D_RUST_STAGE$(2)
59 RUNTIME_CXXFLAGS_$(1)_$(2) = -D_RUST_STAGE$(2)
60
61 # XXX: Like with --cfg stage0, pass the defines for stage1 to the stage0
62 # build of non-build-triple host compilers
63 ifeq ($(2),0)
64 ifneq ($(strip $(CFG_BUILD_TRIPLE)),$(strip $(1)))
65 RUNTIME_CFLAGS_$(1)_$(2) = -D_RUST_STAGE1
66 RUNTIME_CXXFLAGS_$(1)_$(2) = -D_RUST_STAGE1
67 endif
68 endif
69
70 RUNTIME_CXXS_$(1)_$(2) := \
71               rt/sync/lock_and_signal.cpp \
72               rt/sync/rust_thread.cpp \
73               rt/rust_builtin.cpp \
74               rt/rust_run_program.cpp \
75               rt/rust_rng.cpp \
76               rt/rust_upcall.cpp \
77               rt/rust_uv.cpp \
78               rt/rust_crate_map.cpp \
79               rt/isaac/randport.cpp \
80               rt/miniz.cpp \
81               rt/memory_region.cpp \
82               rt/boxed_region.cpp \
83               rt/arch/$$(HOST_$(1))/context.cpp \
84               rt/arch/$$(HOST_$(1))/gpr.cpp \
85               rt/rust_android_dummy.cpp \
86               rt/rust_test_helpers.cpp
87
88 RUNTIME_CS_$(1)_$(2) := rt/linenoise/linenoise.c rt/linenoise/utf8.c
89
90 RUNTIME_S_$(1)_$(2) := rt/arch/$$(HOST_$(1))/_context.S \
91                         rt/arch/$$(HOST_$(1))/ccall.S \
92                         rt/arch/$$(HOST_$(1))/record_sp.S
93
94 RT_OUTPUT_DIR_$(1) := $(1)/rt
95 RT_BUILD_DIR_$(1)_$(2) := $$(RT_OUTPUT_DIR_$(1))/stage$(2)
96
97 ifeq ($$(CFG_WINDOWSY_$(1)), 1)
98   LIBUV_OSTYPE_$(1)_$(2) := win
99   LIBUV_LIB_$(1)_$(2) := $$(RT_BUILD_DIR_$(1)_$(2))/libuv/libuv.a
100   JEMALLOC_LIB_$(1)_$(2) := $$(RT_BUILD_DIR_$(1)_$(2))/jemalloc/lib/jemalloc.lib
101 else ifeq ($(OSTYPE_$(1)), apple-darwin)
102   LIBUV_OSTYPE_$(1)_$(2) := mac
103   LIBUV_LIB_$(1)_$(2) := $$(RT_BUILD_DIR_$(1)_$(2))/libuv/libuv.a
104   JEMALLOC_LIB_$(1)_$(2) := $$(RT_BUILD_DIR_$(1)_$(2))/jemalloc/lib/libjemalloc_pic.a
105 else ifeq ($(OSTYPE_$(1)), unknown-freebsd)
106   LIBUV_OSTYPE_$(1)_$(2) := unix/freebsd
107   LIBUV_LIB_$(1)_$(2) := $$(RT_BUILD_DIR_$(1)_$(2))/libuv/libuv.a
108   JEMALLOC_LIB_$(1)_$(2) := $$(RT_BUILD_DIR_$(1)_$(2))/jemalloc/lib/libjemalloc_pic.a
109 else ifeq ($(OSTYPE_$(1)), linux-androideabi)
110   LIBUV_OSTYPE_$(1)_$(2) := unix/android
111   LIBUV_LIB_$(1)_$(2) := $$(RT_BUILD_DIR_$(1)_$(2))/libuv/libuv.a
112   JEMALLOC_LIB_$(1)_$(2) := $$(RT_BUILD_DIR_$(1)_$(2))/jemalloc/lib/libjemalloc_pic.a
113 else
114   LIBUV_OSTYPE_$(1)_$(2) := unix/linux
115   LIBUV_LIB_$(1)_$(2) := $$(RT_BUILD_DIR_$(1)_$(2))/libuv/libuv.a
116   JEMALLOC_LIB_$(1)_$(2) := $$(RT_BUILD_DIR_$(1)_$(2))/jemalloc/lib/libjemalloc_pic.a
117 endif
118
119 RUNTIME_DEF_$(1)_$(2) := $$(RT_OUTPUT_DIR_$(1))/rustrt$$(CFG_DEF_SUFFIX_$(1))
120 RUNTIME_INCS_$(1)_$(2) := -I $$(S)src/rt -I $$(S)src/rt/isaac -I $$(S)src/rt/uthash \
121                      -I $$(S)src/rt/arch/$$(HOST_$(1)) \
122                      -I $$(S)src/rt/linenoise \
123                      -I $$(S)src/libuv/include
124 RUNTIME_OBJS_$(1)_$(2) := $$(RUNTIME_CXXS_$(1)_$(2):rt/%.cpp=$$(RT_BUILD_DIR_$(1)_$(2))/%.o) \
125                      $$(RUNTIME_CS_$(1)_$(2):rt/%.c=$$(RT_BUILD_DIR_$(1)_$(2))/%.o) \
126                      $$(RUNTIME_S_$(1)_$(2):rt/%.S=$$(RT_BUILD_DIR_$(1)_$(2))/%.o)
127 ALL_OBJ_FILES += $$(RUNTIME_OBJS_$(1)_$(2))
128
129 MORESTACK_OBJ_$(1)_$(2) := $$(RT_BUILD_DIR_$(1)_$(2))/arch/$$(HOST_$(1))/morestack.o
130 ALL_OBJ_FILES += $$(MORESTACK_OBJS_$(1)_$(2))
131
132 $$(RT_BUILD_DIR_$(1)_$(2))/%.o: rt/%.cpp $$(MKFILE_DEPS)
133         @$$(call E, compile: $$@)
134         $$(Q)$$(call CFG_COMPILE_CXX_$(1), $$@, $$(RUNTIME_INCS_$(1)_$(2)) \
135                  $$(SNAP_DEFINES) $$(RUNTIME_CXXFLAGS_$(1)_$(2))) $$<
136
137 $$(RT_BUILD_DIR_$(1)_$(2))/%.o: rt/%.c $$(MKFILE_DEPS)
138         @$$(call E, compile: $$@)
139         $$(Q)$$(call CFG_COMPILE_C_$(1), $$@, $$(RUNTIME_INCS_$(1)_$(2)) \
140                  $$(SNAP_DEFINES) $$(RUNTIME_CFLAGS_$(1)_$(2))) $$<
141
142 $$(RT_BUILD_DIR_$(1)_$(2))/%.o: rt/%.S  $$(MKFILE_DEPS) \
143                      $$(LLVM_CONFIG_$$(CFG_BUILD_TRIPLE))
144         @$$(call E, compile: $$@)
145         $$(Q)$$(call CFG_ASSEMBLE_$(1),$$@,$$<)
146
147 $$(RT_BUILD_DIR_$(1)_$(2))/arch/$$(HOST_$(1))/libmorestack.a: $$(MORESTACK_OBJ_$(1)_$(2))
148         @$$(call E, link: $$@)
149         $$(Q)$(AR_$(1)) rcs $$@ $$<
150
151 $$(RT_BUILD_DIR_$(1)_$(2))/$(CFG_RUNTIME_$(1)): $$(RUNTIME_OBJS_$(1)_$(2)) $$(MKFILE_DEPS) \
152                         $$(RUNTIME_DEF_$(1)_$(2)) $$(LIBUV_LIB_$(1)_$(2)) $$(JEMALLOC_LIB_$(1)_$(2))
153         @$$(call E, link: $$@)
154         $$(Q)$$(call CFG_LINK_CXX_$(1),$$@, $$(RUNTIME_OBJS_$(1)_$(2)) \
155           $$(JEMALLOC_LIB_$(1)_$(2)) $$(CFG_GCCISH_POST_LIB_FLAGS_$(1)) $$(LIBUV_LIB_$(1)_$(2)) \
156           $$(CFG_LIBUV_LINK_FLAGS_$(1)),$$(RUNTIME_DEF_$(1)_$(2)),$$(CFG_RUNTIME_$(1)))
157
158 # FIXME: For some reason libuv's makefiles can't figure out the
159 # correct definition of CC on the mingw I'm using, so we are
160 # explicitly using gcc. Also, we have to list environment variables
161 # first on windows... mysterious
162
163 ifdef CFG_ENABLE_FAST_MAKE
164 LIBUV_DEPS := $$(S)/.gitmodules
165 else
166 LIBUV_DEPS := $$(wildcard \
167               $$(S)src/libuv/* \
168               $$(S)src/libuv/*/* \
169               $$(S)src/libuv/*/*/* \
170               $$(S)src/libuv/*/*/*/*)
171 endif
172
173 LIBUV_MAKEFILE_$(1)_$(2) := $$(CFG_BUILD_DIR)$$(RT_BUILD_DIR_$(1)_$(2))/libuv/Makefile
174 LIBUV_NO_LOAD = run-benchmarks.target.mk run-tests.target.mk \
175                 uv_dtrace_header.target.mk uv_dtrace_provider.target.mk
176
177 export PYTHONPATH := $(PYTHONPATH):$$(S)src/gyp/pylib
178
179 $$(LIBUV_MAKEFILE_$(1)_$(2)):
180         (cd $(S)src/libuv/ && \
181          ./gyp_uv -f make -Dtarget_arch=$$(LIBUV_ARCH_$(1)) -D ninja \
182            -Goutput_dir=$$(@D) --generator-output $$(@D))
183
184 # XXX: Shouldn't need platform-specific conditions here
185 ifdef CFG_WINDOWSY_$(1)
186 $$(LIBUV_LIB_$(1)_$(2)): $$(LIBUV_DEPS)
187         $$(Q)$$(MAKE) -C $$(S)src/libuv -f Makefile.mingw \
188                 CFLAGS="$$(CFG_GCCISH_CFLAGS) $$(LIBUV_FLAGS_$$(HOST_$(1))) $$(SNAP_DEFINES)" \
189                 AR="$$(AR_$(1))" \
190                 V=$$(VERBOSE)
191         $$(Q)cp $$(S)src/libuv/libuv.a $$@
192 else ifeq ($(OSTYPE_$(1)), linux-androideabi)
193 $$(LIBUV_LIB_$(1)_$(2)): $$(LIBUV_DEPS) $$(LIBUV_MAKEFILE_$(1)_$(2))
194         $$(Q)$$(MAKE) -C $$(@D) \
195                 CFLAGS="$$(CFG_GCCISH_CFLAGS) $$(LIBUV_FLAGS_$$(HOST_$(1))) $$(SNAP_DEFINES)" \
196                 LDFLAGS="$$(CFG_GCCISH_LINK_FLAGS) $$(LIBUV_FLAGS_$$(HOST_$(1)))" \
197                 CC="$$(CC_$(1))" \
198                 CXX="$$(CXX_$(1))" \
199                 LINK="$$(CXX_$(1))" \
200                 AR="$$(AR_$(1))" \
201                 PLATFORM=android \
202                 host=android OS=linux \
203                 builddir="." \
204                 BUILDTYPE=Release \
205                 NO_LOAD="$$(LIBUV_NO_LOAD)" \
206                 V=$$(VERBOSE)
207 else
208 $$(LIBUV_LIB_$(1)_$(2)): $$(LIBUV_DEPS) $$(LIBUV_MAKEFILE_$(1)_$(2))
209         $$(Q)$$(MAKE) -C $$(@D) \
210                 CFLAGS="$$(CFG_GCCISH_CFLAGS) $$(LIBUV_FLAGS_$$(HOST_$(1))) $$(SNAP_DEFINES)" \
211                 LDFLAGS="$$(CFG_GCCISH_LINK_FLAGS) $$(LIBUV_FLAGS_$$(HOST_$(1)))" \
212                 CC="$$(CC_$(1))" \
213                 CXX="$$(CXX_$(1))" \
214                 AR="$$(AR_$(1))" \
215                 builddir="." \
216                 BUILDTYPE=Release \
217                 NO_LOAD="$$(LIBUV_NO_LOAD)" \
218                 V=$$(VERBOSE)
219 endif
220
221 ifeq ($(OSTYPE_$(1)), linux-androideabi)
222 $$(JEMALLOC_LIB_$(1)_$(2)):
223         cd $$(RT_BUILD_DIR_$(1)_$(2))/jemalloc; $(S)src/rt/jemalloc/configure \
224                 --disable-experimental --build=$(CFG_BUILD_TRIPLE) --host=$(1) --disable-tls \
225                 EXTRA_CFLAGS="$$(CFG_GCCISH_CFLAGS) $$(LIBUV_FLAGS_$$(HOST_$(1))) $$(SNAP_DEFINES)" \
226                 LDFLAGS="$$(CFG_GCCISH_LINK_FLAGS) $$(LIBUV_FLAGS_$$(HOST_$(1)))" \
227                 CC="$$(CC_$(1))" \
228                 CXX="$$(CXX_$(1))" \
229                 AR="$$(AR_$(1))"
230         $$(Q)$$(MAKE) -C $$(RT_BUILD_DIR_$(1)_$(2))/jemalloc
231 else
232 $$(JEMALLOC_LIB_$(1)_$(2)):
233         cd $$(RT_BUILD_DIR_$(1)_$(2))/jemalloc; $(S)src/rt/jemalloc/configure \
234                 --disable-experimental --build=$(CFG_BUILD_TRIPLE) --host=$(1) \
235                 EXTRA_CFLAGS="$$(CFG_GCCISH_CFLAGS) $$(LIBUV_FLAGS_$$(HOST_$(1))) $$(SNAP_DEFINES)" \
236                 LDFLAGS="$$(CFG_GCCISH_LINK_FLAGS) $$(LIBUV_FLAGS_$$(HOST_$(1)))" \
237                 CC="$$(CC_$(1))" \
238                 CXX="$$(CXX_$(1))" \
239                 AR="$$(AR_$(1))"
240         $$(Q)$$(MAKE) -C $$(RT_BUILD_DIR_$(1)_$(2))/jemalloc
241 endif
242
243
244 # These could go in rt.mk or rustllvm.mk, they're needed for both.
245
246 # This regexp has a single $, escaped twice
247 $(1)/%.bsd.def:    %.def.in $$(MKFILE_DEPS)
248         @$$(call E, def: $$@)
249         $$(Q)echo "{" > $$@
250         $$(Q)sed 's/.$$$$/&;/' $$< >> $$@
251         $$(Q)echo "};" >> $$@
252
253 $(1)/%.linux.def:    %.def.in $$(MKFILE_DEPS)
254         @$$(call E, def: $$@)
255         $$(Q)echo "{" > $$@
256         $$(Q)sed 's/.$$$$/&;/' $$< >> $$@
257         $$(Q)echo "};" >> $$@
258
259 $(1)/%.darwin.def:      %.def.in $$(MKFILE_DEPS)
260         @$$(call E, def: $$@)
261         $$(Q)sed 's/^./_&/' $$< > $$@
262
263 $(1)/%.android.def:  %.def.in $$(MKFILE_DEPS)
264         @$$(call E, def: $$@)
265         $$(Q)echo "{" > $$@
266         $$(Q)sed 's/.$$$$/&;/' $$< >> $$@
267         $$(Q)echo "};" >> $$@
268
269 $(1)/%.mingw32.def:     %.def.in $$(MKFILE_DEPS)
270         @$$(call E, def: $$@)
271         $$(Q)echo LIBRARY $$* > $$@
272         $$(Q)echo EXPORTS >> $$@
273         $$(Q)sed 's/^./    &/' $$< >> $$@
274
275 endef
276
277 # Instantiate template for all stages
278 $(foreach stage,$(STAGES), \
279         $(foreach target,$(CFG_TARGET_TRIPLES), \
280          $(eval $(call DEF_RUNTIME_TARGETS,$(target),$(stage)))))