]> git.lizzy.rs Git - rust.git/blob - mk/platform.mk
auto merge of #13967 : richo/rust/features/ICE-fails, r=alexcrichton
[rust.git] / mk / platform.mk
1 # Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2 # file at the top-level directory of this distribution and at
3 # http://rust-lang.org/COPYRIGHT.
4 #
5 # Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 # http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 # <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 # option. This file may not be copied, modified, or distributed
9 # except according to those terms.
10
11
12 # Create variables HOST_<triple> containing the host part
13 # of each target triple.  For example, the triple i686-darwin-macos
14 # would create a variable HOST_i686-darwin-macos with the value
15 # i386.
16 define DEF_HOST_VAR
17   HOST_$(1) = $(subst i686,i386,$(word 1,$(subst -, ,$(1))))
18 endef
19 $(foreach t,$(CFG_TARGET),$(eval $(call DEF_HOST_VAR,$(t))))
20 $(foreach t,$(CFG_TARGET),$(info cfg: host for $(t) is $(HOST_$(t))))
21
22 # Ditto for OSTYPE
23 define DEF_OSTYPE_VAR
24   OSTYPE_$(1) = $(subst $(firstword $(subst -, ,$(1)))-,,$(1))
25 endef
26 $(foreach t,$(CFG_TARGET),$(eval $(call DEF_OSTYPE_VAR,$(t))))
27 $(foreach t,$(CFG_TARGET),$(info cfg: os for $(t) is $(OSTYPE_$(t))))
28
29 # On Darwin, we need to run dsymutil so the debugging information ends
30 # up in the right place.  On other platforms, it automatically gets
31 # embedded into the executable, so use a no-op command.
32 CFG_DSYMUTIL := true
33
34 # Hack: not sure how to test if a file exists in make other than this
35 OS_SUPP = $(patsubst %,--suppressions=%,\
36       $(wildcard $(CFG_SRC_DIR)src/etc/$(CFG_OSTYPE).supp*))
37
38 ifdef CFG_DISABLE_OPTIMIZE_CXX
39   $(info cfg: disabling C++ optimization (CFG_DISABLE_OPTIMIZE_CXX))
40   CFG_GCCISH_CFLAGS += -O0
41 else
42   CFG_GCCISH_CFLAGS += -O2
43 endif
44
45 # The soname thing is for supporting a statically linked jemalloc.
46 # see https://blog.mozilla.org/jseward/2012/06/05/valgrind-now-supports-jemalloc-builds-directly/
47 ifdef CFG_VALGRIND
48   CFG_VALGRIND += --error-exitcode=100 \
49                   --soname-synonyms=somalloc=NONE \
50                   --quiet \
51                   --suppressions=$(CFG_SRC_DIR)src/etc/x86.supp \
52                   $(OS_SUPP)
53   ifdef CFG_ENABLE_HELGRIND
54     CFG_VALGRIND += --tool=helgrind
55   else
56     CFG_VALGRIND += --tool=memcheck \
57                     --leak-check=full
58   endif
59 endif
60
61 ifneq ($(findstring linux,$(CFG_OSTYPE)),)
62   ifdef CFG_PERF
63     ifneq ($(CFG_PERF_WITH_LOGFD),)
64         CFG_PERF_TOOL := $(CFG_PERF) stat -r 3 --log-fd 2
65     else
66         CFG_PERF_TOOL := $(CFG_PERF) stat -r 3
67     endif
68   else
69     ifdef CFG_VALGRIND
70       CFG_PERF_TOOL :=\
71         $(CFG_VALGRIND) --tool=cachegrind --cache-sim=yes --branch-sim=yes
72     else
73       CFG_PERF_TOOL := /usr/bin/time --verbose
74     endif
75   endif
76 endif
77
78 # These flags will cause the compiler to produce a .d file
79 # next to the .o file that lists header deps.
80 CFG_DEPEND_FLAGS = -MMD -MP -MT $(1) -MF $(1:%.o=%.d)
81
82 AR := ar
83
84 CFG_INFO := $(info cfg: using $(CFG_C_COMPILER))
85 ifeq ($(CFG_C_COMPILER),clang)
86   # The -Qunused-arguments sidesteps spurious warnings from clang
87   ifeq ($(origin CC),default)
88     CC=clang -Qunused-arguments
89   endif
90   ifeq ($(origin CXX),default)
91     CXX=clang++ -Qunused-arguments
92   endif
93   ifeq ($(origin CPP),default)
94     CPP=clang -Qunused-arguments
95   endif
96 else
97 ifeq ($(CFG_C_COMPILER),gcc)
98   ifeq ($(origin CC),default)
99     CC=gcc
100   endif
101   ifeq ($(origin CXX),default)
102     CXX=g++
103   endif
104   ifeq ($(origin CPP),default)
105     CPP=gcc
106   endif
107 else
108 ifeq ($(CFG_C_COMPILER),ccache clang)
109   # The -Qunused-arguments sidesteps spurious warnings from clang
110   ifeq ($(origin CC),default)
111     CC=ccache clang -Qunused-arguments
112   endif
113   ifeq ($(origin CXX),default)
114     CXX=ccache clang++ -Qunused-arguments
115   endif
116   ifeq ($(origin CPP),default)
117     CPP=ccache clang -Qunused-arguments
118   endif
119 else
120 ifeq ($(CFG_C_COMPILER),ccache gcc)
121   ifeq ($(origin CC),default)
122     CC=ccache gcc
123   endif
124   ifeq ($(origin CXX),default)
125     CXX=ccache g++
126   endif
127   ifeq ($(origin CPP),default)
128     CPP=ccache gcc
129   endif
130 else
131   CFG_ERR := $(error please try on a system with gcc or clang)
132 endif
133 endif
134 endif
135 endif
136
137 CFG_RLIB_GLOB=lib$(1)-*.rlib
138
139 # x86_64-unknown-linux-gnu configuration
140 CC_x86_64-unknown-linux-gnu=$(CC)
141 CXX_x86_64-unknown-linux-gnu=$(CXX)
142 CPP_x86_64-unknown-linux-gnu=$(CPP)
143 AR_x86_64-unknown-linux-gnu=$(AR)
144 CFG_LIB_NAME_x86_64-unknown-linux-gnu=lib$(1).so
145 CFG_STATIC_LIB_NAME_x86_64-unknown-linux-gnu=lib$(1).a
146 CFG_LIB_GLOB_x86_64-unknown-linux-gnu=lib$(1)-*.so
147 CFG_LIB_DSYM_GLOB_x86_64-unknown-linux-gnu=lib$(1)-*.dylib.dSYM
148 CFG_GCCISH_CFLAGS_x86_64-unknown-linux-gnu := -Wall -Werror -g -fPIC -m64
149 CFG_GCCISH_CXXFLAGS_x86_64-unknown-linux-gnu := -fno-rtti
150 CFG_GCCISH_LINK_FLAGS_x86_64-unknown-linux-gnu := -shared -fPIC -ldl -pthread  -lrt -g -m64
151 CFG_GCCISH_DEF_FLAG_x86_64-unknown-linux-gnu := -Wl,--export-dynamic,--dynamic-list=
152 CFG_GCCISH_PRE_LIB_FLAGS_x86_64-unknown-linux-gnu := -Wl,-whole-archive
153 CFG_GCCISH_POST_LIB_FLAGS_x86_64-unknown-linux-gnu := -Wl,-no-whole-archive
154 CFG_DEF_SUFFIX_x86_64-unknown-linux-gnu := .linux.def
155 CFG_LLC_FLAGS_x86_64-unknown-linux-gnu :=
156 CFG_INSTALL_NAME_x86_64-unknown-linux-gnu =
157 CFG_LIBUV_LINK_FLAGS_x86_64-unknown-linux-gnu =
158 CFG_EXE_SUFFIX_x86_64-unknown-linux-gnu =
159 CFG_WINDOWSY_x86_64-unknown-linux-gnu :=
160 CFG_UNIXY_x86_64-unknown-linux-gnu := 1
161 CFG_PATH_MUNGE_x86_64-unknown-linux-gnu := true
162 CFG_LDPATH_x86_64-unknown-linux-gnu :=
163 CFG_RUN_x86_64-unknown-linux-gnu=$(2)
164 CFG_RUN_TARG_x86_64-unknown-linux-gnu=$(call CFG_RUN_x86_64-unknown-linux-gnu,,$(2))
165
166 # i686-unknown-linux-gnu configuration
167 CC_i686-unknown-linux-gnu=$(CC)
168 CXX_i686-unknown-linux-gnu=$(CXX)
169 CPP_i686-unknown-linux-gnu=$(CPP)
170 AR_i686-unknown-linux-gnu=$(AR)
171 CFG_LIB_NAME_i686-unknown-linux-gnu=lib$(1).so
172 CFG_STATIC_LIB_NAME_i686-unknown-linux-gnu=lib$(1).a
173 CFG_LIB_GLOB_i686-unknown-linux-gnu=lib$(1)-*.so
174 CFG_LIB_DSYM_GLOB_i686-unknown-linux-gnu=lib$(1)-*.dylib.dSYM
175 CFG_GCCISH_CFLAGS_i686-unknown-linux-gnu := -Wall -Werror -g -fPIC -m32
176 CFG_GCCISH_CXXFLAGS_i686-unknown-linux-gnu := -fno-rtti
177 CFG_GCCISH_LINK_FLAGS_i686-unknown-linux-gnu := -shared -fPIC -ldl -pthread  -lrt -g -m32
178 CFG_GCCISH_DEF_FLAG_i686-unknown-linux-gnu := -Wl,--export-dynamic,--dynamic-list=
179 CFG_GCCISH_PRE_LIB_FLAGS_i686-unknown-linux-gnu := -Wl,-whole-archive
180 CFG_GCCISH_POST_LIB_FLAGS_i686-unknown-linux-gnu := -Wl,-no-whole-archive
181 CFG_DEF_SUFFIX_i686-unknown-linux-gnu := .linux.def
182 CFG_LLC_FLAGS_i686-unknown-linux-gnu :=
183 CFG_INSTALL_NAME_i686-unknown-linux-gnu =
184 CFG_LIBUV_LINK_FLAGS_i686-unknown-linux-gnu =
185 CFG_EXE_SUFFIX_i686-unknown-linux-gnu =
186 CFG_WINDOWSY_i686-unknown-linux-gnu :=
187 CFG_UNIXY_i686-unknown-linux-gnu := 1
188 CFG_PATH_MUNGE_i686-unknown-linux-gnu := true
189 CFG_LDPATH_i686-unknown-linux-gnu :=
190 CFG_RUN_i686-unknown-linux-gnu=$(2)
191 CFG_RUN_TARG_i686-unknown-linux-gnu=$(call CFG_RUN_i686-unknown-linux-gnu,,$(2))
192
193 # arm-apple-darwin configuration
194 ifeq ($(CFG_OSTYPE),apple-darwin)
195 CFG_IOS_SDK = $(shell xcrun --show-sdk-path -sdk iphoneos 2>/dev/null)
196 CFG_IOS_FLAGS = -target arm-apple-darwin -isysroot $(CFG_IOS_SDK) -I$(CFG_IOS_SDK)/usr/include -I$(CFG_IOS_SDK)/usr/include/c++/4.2.1
197 CC_arm-apple-darwin = $(shell xcrun -find -sdk iphoneos clang)
198 CXX_arm-apple-darwin = $(shell xcrun -find -sdk iphoneos clang++)
199 CPP_arm-apple-darwin = $(shell xcrun -find -sdk iphoneos clang++)
200 AR_arm-apple-darwin = $(shell xcrun -find -sdk iphoneos ar)
201 CFG_LIB_NAME_arm-apple-darwin = lib$(1).dylib
202 CFG_LIB_GLOB_arm-apple-darwin = lib$(1)-*.dylib
203 CFG_LIB_DSYM_GLOB_arm-apple-darwin = lib$(1)-*.dylib.dSYM
204 CFG_GCCISH_CFLAGS_arm-apple-darwin := -Wall -Werror -g -fPIC $(CFG_IOS_FLAGS)
205 CFG_GCCISH_CXXFLAGS_arm-apple-darwin := -fno-rtti $(CFG_IOS_FLAGS)
206 CFG_GCCISH_LINK_FLAGS_arm-apple-darwin := -dynamiclib -lpthread -framework CoreServices -Wl,-no_compact_unwind
207 CFG_GCCISH_DEF_FLAG_arm-apple-darwin := -Wl,-exported_symbols_list,
208 CFG_GCCISH_PRE_LIB_FLAGS_arm-apple-darwin :=
209 CFG_GCCISH_POST_LIB_FLAGS_arm-apple-darwin :=
210 CFG_DEF_SUFFIX_arm-apple-darwin := .darwin.def
211 CFG_LLC_FLAGS_arm-apple-darwin :=
212 CFG_INSTALL_NAME_arm-apple-darwin = -Wl,-install_name,@rpath/$(1)
213 CFG_LIBUV_LINK_FLAGS_arm-apple-darwin =
214 CFG_EXE_SUFFIX_arm-apple-darwin :=
215 CFG_WINDOWSY_arm-apple-darwin :=
216 CFG_UNIXY_arm-apple-darwin := 1
217 CFG_PATH_MUNGE_arm-apple-darwin := true
218 CFG_LDPATH_arm-apple-darwin :=
219 CFG_RUN_arm-apple-darwin = $(2)
220 CFG_RUN_TARG_arm-apple-darwin = $(call CFG_RUN_arm-apple-darwin,,$(2))
221 endif
222
223 # x86_64-apple-darwin configuration
224 CC_x86_64-apple-darwin=$(CC)
225 CXX_x86_64-apple-darwin=$(CXX)
226 CPP_x86_64-apple-darwin=$(CPP)
227 AR_x86_64-apple-darwin=$(AR)
228 CFG_LIB_NAME_x86_64-apple-darwin=lib$(1).dylib
229 CFG_STATIC_LIB_NAME_x86_64-apple-darwin=lib$(1).a
230 CFG_LIB_GLOB_x86_64-apple-darwin=lib$(1)-*.dylib
231 CFG_LIB_DSYM_GLOB_x86_64-apple-darwin=lib$(1)-*.dylib.dSYM
232 CFG_GCCISH_CFLAGS_x86_64-apple-darwin := -Wall -Werror -g -fPIC -m64 -arch x86_64
233 CFG_GCCISH_CXXFLAGS_x86_64-apple-darwin := -fno-rtti
234 CFG_GCCISH_LINK_FLAGS_x86_64-apple-darwin := -dynamiclib -pthread  -framework CoreServices -m64
235 CFG_GCCISH_DEF_FLAG_x86_64-apple-darwin := -Wl,-exported_symbols_list,
236 CFG_GCCISH_PRE_LIB_FLAGS_x86_64-apple-darwin :=
237 CFG_GCCISH_POST_LIB_FLAGS_x86_64-apple-darwin :=
238 CFG_DEF_SUFFIX_x86_64-apple-darwin := .darwin.def
239 CFG_LLC_FLAGS_x86_64-apple-darwin :=
240 CFG_INSTALL_NAME_x86_64-apple-darwin = -Wl,-install_name,@rpath/$(1)
241 CFG_LIBUV_LINK_FLAGS_x86_64-apple-darwin =
242 CFG_EXE_SUFFIX_x86_64-apple-darwin :=
243 CFG_WINDOWSY_x86_64-apple-darwin :=
244 CFG_UNIXY_x86_64-apple-darwin := 1
245 CFG_PATH_MUNGE_x86_64-apple-darwin := true
246 CFG_LDPATH_x86_64-apple-darwin :=
247 CFG_RUN_x86_64-apple-darwin=$(2)
248 CFG_RUN_TARG_x86_64-apple-darwin=$(call CFG_RUN_x86_64-apple-darwin,,$(2))
249
250 # i686-apple-darwin configuration
251 CC_i686-apple-darwin=$(CC)
252 CXX_i686-apple-darwin=$(CXX)
253 CPP_i686-apple-darwin=$(CPP)
254 AR_i686-apple-darwin=$(AR)
255 CFG_LIB_NAME_i686-apple-darwin=lib$(1).dylib
256 CFG_STATIC_LIB_NAME_i686-apple-darwin=lib$(1).a
257 CFG_LIB_GLOB_i686-apple-darwin=lib$(1)-*.dylib
258 CFG_LIB_DSYM_GLOB_i686-apple-darwin=lib$(1)-*.dylib.dSYM
259 CFG_GCCISH_CFLAGS_i686-apple-darwin := -Wall -Werror -g -fPIC -m32 -arch i386
260 CFG_GCCISH_CXXFLAGS_i686-apple-darwin := -fno-rtti
261 CFG_GCCISH_LINK_FLAGS_i686-apple-darwin := -dynamiclib -pthread  -framework CoreServices -m32
262 CFG_GCCISH_DEF_FLAG_i686-apple-darwin := -Wl,-exported_symbols_list,
263 CFG_GCCISH_PRE_LIB_FLAGS_i686-apple-darwin :=
264 CFG_GCCISH_POST_LIB_FLAGS_i686-apple-darwin :=
265 CFG_DEF_SUFFIX_i686-apple-darwin := .darwin.def
266 CFG_LLC_FLAGS_i686-apple-darwin :=
267 CFG_INSTALL_NAME_i686-apple-darwin = -Wl,-install_name,@rpath/$(1)
268 CFG_LIBUV_LINK_FLAGS_i686-apple-darwin =
269 CFG_EXE_SUFFIX_i686-apple-darwin :=
270 CFG_WINDOWSY_i686-apple-darwin :=
271 CFG_UNIXY_i686-apple-darwin := 1
272 CFG_PATH_MUNGE_i686-apple-darwin := true
273 CFG_LDPATH_i686-apple-darwin :=
274 CFG_RUN_i686-apple-darwin=$(2)
275 CFG_RUN_TARG_i686-apple-darwin=$(call CFG_RUN_i686-apple-darwin,,$(2))
276
277 # arm-linux-androideabi configuration
278 CC_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-gcc
279 CXX_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-g++
280 CPP_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-gcc -E
281 AR_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-ar
282 CFG_LIB_NAME_arm-linux-androideabi=lib$(1).so
283 CFG_STATIC_LIB_NAME_arm-linux-androideabi=lib$(1).a
284 CFG_LIB_GLOB_arm-linux-androideabi=lib$(1)-*.so
285 CFG_LIB_DSYM_GLOB_arm-linux-androideabi=lib$(1)-*.dylib.dSYM
286 CFG_GCCISH_CFLAGS_arm-linux-androideabi := -Wall -g -fPIC -D__arm__ -DANDROID -D__ANDROID__
287 CFG_GCCISH_CXXFLAGS_arm-linux-androideabi := -fno-rtti
288 CFG_GCCISH_LINK_FLAGS_arm-linux-androideabi := -shared -fPIC -ldl -g -lm -lsupc++
289 CFG_GCCISH_DEF_FLAG_arm-linux-androideabi := -Wl,--export-dynamic,--dynamic-list=
290 CFG_GCCISH_PRE_LIB_FLAGS_arm-linux-androideabi := -Wl,-whole-archive
291 CFG_GCCISH_POST_LIB_FLAGS_arm-linux-androideabi := -Wl,-no-whole-archive
292 CFG_DEF_SUFFIX_arm-linux-androideabi := .android.def
293 CFG_LLC_FLAGS_arm-linux-androideabi :=
294 CFG_INSTALL_NAME_arm-linux-androideabi =
295 CFG_LIBUV_LINK_FLAGS_arm-linux-androideabi =
296 CFG_EXE_SUFFIX_arm-linux-androideabi :=
297 CFG_WINDOWSY_arm-linux-androideabi :=
298 CFG_UNIXY_arm-linux-androideabi := 1
299 CFG_PATH_MUNGE_arm-linux-androideabi := true
300 CFG_LDPATH_arm-linux-androideabi :=
301 CFG_RUN_arm-linux-androideabi=
302 CFG_RUN_TARG_arm-linux-androideabi=
303 RUSTC_FLAGS_arm-linux-androideabi :=
304 RUSTC_CROSS_FLAGS_arm-linux-androideabi :=-C android-cross-path=$(CFG_ANDROID_CROSS_PATH)
305
306 # arm-unknown-linux-gnueabihf configuration
307 CROSS_PREFIX_arm-unknown-linux-gnueabihf=arm-linux-gnueabihf-
308 CC_arm-unknown-linux-gnueabihf=gcc
309 CXX_arm-unknown-linux-gnueabihf=g++
310 CPP_arm-unknown-linux-gnueabihf=gcc -E
311 AR_arm-unknown-linux-gnueabihf=ar
312 CFG_LIB_NAME_arm-unknown-linux-gnueabihf=lib$(1).so
313 CFG_STATIC_LIB_NAME_arm-unknown-linux-gnueabihf=lib$(1).a
314 CFG_LIB_GLOB_arm-unknown-linux-gnueabihf=lib$(1)-*.so
315 CFG_LIB_DSYM_GLOB_arm-unknown-linux-gnueabihf=lib$(1)-*.dylib.dSYM
316 CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabihf := -Wall -g -fPIC -D__arm__
317 CFG_GCCISH_CXXFLAGS_arm-unknown-linux-gnueabihf := -fno-rtti
318 CFG_GCCISH_LINK_FLAGS_arm-unknown-linux-gnueabihf := -shared -fPIC -g
319 CFG_GCCISH_DEF_FLAG_arm-unknown-linux-gnueabihf := -Wl,--export-dynamic,--dynamic-list=
320 CFG_GCCISH_PRE_LIB_FLAGS_arm-unknown-linux-gnueabihf := -Wl,-whole-archive
321 CFG_GCCISH_POST_LIB_FLAGS_arm-unknown-linux-gnueabihf := -Wl,-no-whole-archive
322 CFG_DEF_SUFFIX_arm-unknown-linux-gnueabihf := .linux.def
323 CFG_LLC_FLAGS_arm-unknown-linux-gnueabihf :=
324 CFG_INSTALL_NAME_ar,-unknown-linux-gnueabihf =
325 CFG_LIBUV_LINK_FLAGS_arm-unknown-linux-gnueabihf =
326 CFG_EXE_SUFFIX_arm-unknown-linux-gnueabihf :=
327 CFG_WINDOWSY_arm-unknown-linux-gnueabihf :=
328 CFG_UNIXY_arm-unknown-linux-gnueabihf := 1
329 CFG_PATH_MUNGE_arm-unknown-linux-gnueabihf := true
330 CFG_LDPATH_arm-unknown-linux-gnueabihf :=
331 CFG_RUN_arm-unknown-linux-gnueabihf=$(2)
332 CFG_RUN_TARG_arm-unknown-linux-gnueabihf=$(call CFG_RUN_arm-unknown-linux-gnueabihf,,$(2))
333 RUSTC_FLAGS_arm-unknown-linux-gnueabihf := -C target-feature=+v6,+vfp2
334 RUSTC_CROSS_FLAGS_arm-unknown-linux-gnueabihf :=
335
336 # arm-unknown-linux-gnueabi configuration
337 CROSS_PREFIX_arm-unknown-linux-gnueabi=arm-linux-gnueabi-
338 CC_arm-unknown-linux-gnueabi=gcc
339 CXX_arm-unknown-linux-gnueabi=g++
340 CPP_arm-unknown-linux-gnueabi=gcc -E
341 AR_arm-unknown-linux-gnueabi=ar
342 CFG_LIB_NAME_arm-unknown-linux-gnueabi=lib$(1).so
343 CFG_STATIC_LIB_NAME_arm-unknown-linux-gnueabi=lib$(1).a
344 CFG_LIB_GLOB_arm-unknown-linux-gnueabi=lib$(1)-*.so
345 CFG_LIB_DSYM_GLOB_arm-unknown-linux-gnueabi=lib$(1)-*.dylib.dSYM
346 CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabi := -Wall -g -fPIC -D__arm__ -mfpu=vfp
347 CFG_GCCISH_CXXFLAGS_arm-unknown-linux-gnueabi := -fno-rtti
348 CFG_GCCISH_LINK_FLAGS_arm-unknown-linux-gnueabi := -shared -fPIC -g
349 CFG_GCCISH_DEF_FLAG_arm-unknown-linux-gnueabi := -Wl,--export-dynamic,--dynamic-list=
350 CFG_GCCISH_PRE_LIB_FLAGS_arm-unknown-linux-gnueabi := -Wl,-whole-archive
351 CFG_GCCISH_POST_LIB_FLAGS_arm-unknown-linux-gnueabi := -Wl,-no-whole-archive
352 CFG_DEF_SUFFIX_arm-unknown-linux-gnueabi := .linux.def
353 CFG_LLC_FLAGS_arm-unknown-linux-gnueabi :=
354 CFG_INSTALL_NAME_arm-unknown-linux-gnueabi =
355 CFG_LIBUV_LINK_FLAGS_arm-unknown-linux-gnueabi =
356 CFG_EXE_SUFFIX_arm-unknown-linux-gnueabi :=
357 CFG_WINDOWSY_arm-unknown-linux-gnueabi :=
358 CFG_UNIXY_arm-unknown-linux-gnueabi := 1
359 CFG_PATH_MUNGE_arm-unknown-linux-gnueabi := true
360 CFG_LDPATH_arm-unknown-linux-gnueabi :=
361 CFG_RUN_arm-unknown-linux-gnueabi=$(2)
362 CFG_RUN_TARG_arm-unknown-linux-gnueabi=$(call CFG_RUN_arm-unknown-linux-gnueabi,,$(2))
363 RUSTC_FLAGS_arm-unknown-linux-gnueabi :=
364 RUSTC_CROSS_FLAGS_arm-unknown-linux-gnueabi :=
365
366 # mips-unknown-linux-gnu configuration
367 CC_mips-unknown-linux-gnu=mips-linux-gnu-gcc
368 CXX_mips-unknown-linux-gnu=mips-linux-gnu-g++
369 CPP_mips-unknown-linux-gnu=mips-linux-gnu-gcc -E
370 AR_mips-unknown-linux-gnu=mips-linux-gnu-ar
371 CFG_LIB_NAME_mips-unknown-linux-gnu=lib$(1).so
372 CFG_STATIC_LIB_NAME_mips-unknown-linux-gnu=lib$(1).a
373 CFG_LIB_GLOB_mips-unknown-linux-gnu=lib$(1)-*.so
374 CFG_LIB_DSYM_GLOB_mips-unknown-linux-gnu=lib$(1)-*.dylib.dSYM
375 CFG_GCCISH_CFLAGS_mips-unknown-linux-gnu := -Wall -g -fPIC -mips32r2 -msoft-float -mabi=32 -mno-compact-eh
376 CFG_GCCISH_CXXFLAGS_mips-unknown-linux-gnu := -fno-rtti
377 CFG_GCCISH_LINK_FLAGS_mips-unknown-linux-gnu := -shared -fPIC -g -mips32r2 -msoft-float -mabi=32
378 CFG_GCCISH_DEF_FLAG_mips-unknown-linux-gnu := -Wl,--export-dynamic,--dynamic-list=
379 CFG_GCCISH_PRE_LIB_FLAGS_mips-unknown-linux-gnu := -Wl,-whole-archive
380 CFG_GCCISH_POST_LIB_FLAGS_mips-unknown-linux-gnu := -Wl,-no-whole-archive
381 CFG_DEF_SUFFIX_mips-unknown-linux-gnu := .linux.def
382 CFG_LLC_FLAGS_mips-unknown-linux-gnu :=
383 CFG_INSTALL_NAME_mips-unknown-linux-gnu =
384 CFG_LIBUV_LINK_FLAGS_mips-unknown-linux-gnu =
385 CFG_EXE_SUFFIX_mips-unknown-linux-gnu :=
386 CFG_WINDOWSY_mips-unknown-linux-gnu :=
387 CFG_UNIXY_mips-unknown-linux-gnu := 1
388 CFG_PATH_MUNGE_mips-unknown-linux-gnu := true
389 CFG_LDPATH_mips-unknown-linux-gnu :=
390 CFG_RUN_mips-unknown-linux-gnu=
391 CFG_RUN_TARG_mips-unknown-linux-gnu=
392 RUSTC_FLAGS_mips-unknown-linux-gnu := -C target-cpu=mips32r2 -C target-feature="+mips32r2,+o32" -C soft-float
393
394 # i686-pc-mingw32 configuration
395 CC_i686-pc-mingw32=$(CC)
396 CXX_i686-pc-mingw32=$(CXX)
397 CPP_i686-pc-mingw32=$(CPP)
398 AR_i686-pc-mingw32=$(AR)
399 CFG_LIB_NAME_i686-pc-mingw32=$(1).dll
400 CFG_STATIC_LIB_NAME_i686-pc-mingw32=$(1).lib
401 CFG_LIB_GLOB_i686-pc-mingw32=$(1)-*.dll
402 CFG_LIB_DSYM_GLOB_i686-pc-mingw32=$(1)-*.dylib.dSYM
403 CFG_GCCISH_CFLAGS_i686-pc-mingw32 := -Wall -Werror -g -m32 -march=i686 -D_WIN32_WINNT=0x0600 -I$(CFG_SRC_DIR)src/etc/mingw-fix-include
404 CFG_GCCISH_CXXFLAGS_i686-pc-mingw32 := -fno-rtti
405 CFG_GCCISH_LINK_FLAGS_i686-pc-mingw32 := -shared -fPIC -g -m32
406 CFG_GCCISH_DEF_FLAG_i686-pc-mingw32 :=
407 CFG_GCCISH_PRE_LIB_FLAGS_i686-pc-mingw32 :=
408 CFG_GCCISH_POST_LIB_FLAGS_i686-pc-mingw32 :=
409 CFG_DEF_SUFFIX_i686-pc-mingw32 := .mingw32.def
410 CFG_LLC_FLAGS_i686-pc-mingw32 :=
411 CFG_INSTALL_NAME_i686-pc-mingw32 =
412 CFG_LIBUV_LINK_FLAGS_i686-pc-mingw32 := -lws2_32 -lpsapi -liphlpapi
413 CFG_LLVM_BUILD_ENV_i686-pc-mingw32 := CPATH=$(CFG_SRC_DIR)src/etc/mingw-fix-include
414 CFG_EXE_SUFFIX_i686-pc-mingw32 := .exe
415 CFG_WINDOWSY_i686-pc-mingw32 := 1
416 CFG_UNIXY_i686-pc-mingw32 :=
417 CFG_PATH_MUNGE_i686-pc-mingw32 :=
418 CFG_LDPATH_i686-pc-mingw32 :=$(CFG_LDPATH_i686-pc-mingw32):$(PATH)
419 CFG_RUN_i686-pc-mingw32=PATH="$(CFG_LDPATH_i686-pc-mingw32):$(1)" $(2)
420 CFG_RUN_TARG_i686-pc-mingw32=$(call CFG_RUN_i686-pc-mingw32,$(HLIB$(1)_H_$(CFG_BUILD)),$(2))
421
422 # i586-mingw32msvc configuration
423 CC_i586-mingw32msvc=$(CFG_MINGW32_CROSS_PATH)/bin/i586-mingw32msvc-gcc
424 CXX_i586-mingw32msvc=$(CFG_MINGW32_CROSS_PATH)/bin/i586-mingw32msvc-g++
425 CPP_i586-mingw32msvc=$(CFG_MINGW32_CROSS_PATH)/bin/i586-mingw32msvc-cpp
426 AR_i586-mingw32msvc=$(CFG_MINGW32_CROSS_PATH)/bin/i586-mingw32msvc-ar
427 CFG_LIB_NAME_i586-mingw32msvc=$(1).dll
428 CFG_STATIC_LIB_NAME_i586-mingw32msvc=$(1).lib
429 CFG_LIB_GLOB_i586-mingw32msvc=$(1)-*.dll
430 CFG_LIB_DSYM_GLOB_i586-mingw32msvc=$(1)-*.dylib.dSYM
431 CFG_GCCISH_CFLAGS_i586-mingw32msvc := -Wall -Werror -g -march=i586 -m32
432 CFG_GCCISH_CXXFLAGS_i586-mingw32msvc := -fno-rtti
433 CFG_GCCISH_LINK_FLAGS_i586-mingw32msvc := -shared -g -m32
434 CFG_GCCISH_DEF_FLAG_i586-mingw32msvc :=
435 CFG_GCCISH_PRE_LIB_FLAGS_i586-mingw32msvc :=
436 CFG_GCCISH_POST_LIB_FLAGS_i586-mingw32msvc :=
437 CFG_DEF_SUFFIX_i586-mingw32msvc := .mingw32.def
438 CFG_LLC_FLAGS_i586-mingw32msvc :=
439 CFG_INSTALL_NAME_i586-mingw32msvc =
440 CFG_LIBUV_LINK_FLAGS_i586-mingw32msvc := -L$(CFG_MINGW32_CROSS_PATH)/i586-mingw32msvc/lib -lws2_32 -lpsapi -liphlpapi
441 CFG_EXE_SUFFIX_i586-mingw32msvc := .exe
442 CFG_WINDOWSY_i586-mingw32msvc := 1
443 CFG_UNIXY_i586-mingw32msvc :=
444 CFG_PATH_MUNGE_i586-mingw32msvc := $(strip perl -i.bak -p   \
445                              -e 's@\\(\S)@/\1@go;'       \
446                              -e 's@^/([a-zA-Z])/@\1:/@o;')
447 CFG_LDPATH_i586-mingw32msvc :=
448 CFG_RUN_i586-mingw32msvc=
449 CFG_RUN_TARG_i586-mingw32msvc=
450
451 # i686-w64-mingw32 configuration
452 CROSS_PREFIX_i686-w64-mingw32=i686-w64-mingw32-
453 CC_i686-w64-mingw32=gcc
454 CXX_i686-w64-mingw32=g++
455 CPP_i686-w64-mingw32=gcc -E
456 AR_i686-w64-mingw32=ar
457 CFG_LIB_NAME_i686-w64-mingw32=$(1).dll
458 CFG_STATIC_LIB_NAME_i686-w64-mingw32=$(1).lib
459 CFG_LIB_GLOB_i686-w64-mingw32=$(1)-*.dll
460 CFG_LIB_DSYM_GLOB_i686-w64-mingw32=$(1)-*.dylib.dSYM
461 CFG_GCCISH_CFLAGS_i686-w64-mingw32 := -Wall -Werror -g -m32 -D_WIN32_WINNT=0x0600
462 CFG_GCCISH_CXXFLAGS_i686-w64-mingw32 := -fno-rtti
463 CFG_GCCISH_LINK_FLAGS_i686-w64-mingw32 := -shared -g -m32
464 CFG_GCCISH_DEF_FLAG_i686-w64-mingw32 :=
465 CFG_GCCISH_PRE_LIB_FLAGS_i686-w64-mingw32 :=
466 CFG_GCCISH_POST_LIB_FLAGS_i686-w64-mingw32 :=
467 CFG_DEF_SUFFIX_i686-w64-mingw32 := .mingw32.def
468 CFG_LLC_FLAGS_i686-w64-mingw32 :=
469 CFG_INSTALL_NAME_i686-w64-mingw32 =
470 CFG_LIBUV_LINK_FLAGS_i686-w64-mingw32 := -lws2_32 -lpsapi -liphlpapi
471 CFG_EXE_SUFFIX_i686-w64-mingw32 := .exe
472 CFG_WINDOWSY_i686-w64-mingw32 := 1
473 CFG_UNIXY_i686-w64-mingw32 :=
474 CFG_PATH_MUNGE_i686-w64-mingw32 :=
475 CFG_LDPATH_i686-w64-mingw32 :=$(CFG_LDPATH_i686-w64-mingw32):$(PATH)
476 CFG_RUN_i686-w64-mingw32=PATH="$(CFG_LDPATH_i686-w64-mingw32):$(1)" $(2)
477 CFG_RUN_TARG_i686-w64-mingw32=$(call CFG_RUN_i686-w64-mingw32,$(HLIB$(1)_H_$(CFG_BUILD)),$(2))
478 RUSTC_CROSS_FLAGS_i686-w64-mingw32 :=
479
480 # x86_64-w64-mingw32 configuration
481 CROSS_PREFIX_x86_64-w64-mingw32=x86_64-w64-mingw32-
482 CC_x86_64-w64-mingw32=gcc
483 CXX_x86_64-w64-mingw32=g++
484 CPP_x86_64-w64-mingw32=gcc -E
485 AR_x86_64-w64-mingw32=ar
486 CFG_LIB_NAME_x86_64-w64-mingw32=$(1).dll
487 CFG_STATIC_LIB_NAME_x86_64-w64-mingw32=$(1).lib
488 CFG_LIB_GLOB_x86_64-w64-mingw32=$(1)-*.dll
489 CFG_LIB_DSYM_GLOB_x86_64-w64-mingw32=$(1)-*.dylib.dSYM
490 CFG_GCCISH_CFLAGS_x86_64-w64-mingw32 := -Wall -Werror -g -m64 -D_WIN32_WINNT=0x0600
491 CFG_GCCISH_CXXFLAGS_x86_64-w64-mingw32 := -fno-rtti
492 CFG_GCCISH_LINK_FLAGS_x86_64-w64-mingw32 := -shared -g -m64
493 CFG_GCCISH_DEF_FLAG_x86_64-w64-mingw32 :=
494 CFG_GCCISH_PRE_LIB_FLAGS_x86_64-w64-mingw32 :=
495 CFG_GCCISH_POST_LIB_FLAGS_x86_64-w64-mingw32 :=
496 CFG_DEF_SUFFIX_x86_64-w64-mingw32 := .mingw32.def
497 CFG_LLC_FLAGS_x86_64-w64-mingw32 :=
498 CFG_INSTALL_NAME_x86_64-w64-mingw32 =
499 CFG_LIBUV_LINK_FLAGS_x86_64-w64-mingw32 := -lws2_32 -lpsapi -liphlpapi
500 CFG_EXE_SUFFIX_x86_64-w64-mingw32 := .exe
501 CFG_WINDOWSY_x86_64-w64-mingw32 := 1
502 CFG_UNIXY_x86_64-w64-mingw32 :=
503 CFG_PATH_MUNGE_x86_64-w64-mingw32 :=
504 CFG_LDPATH_x86_64-w64-mingw32 :=$(CFG_LDPATH_x86_64-w64-mingw32):$(PATH)
505 CFG_RUN_x86_64-w64-mingw32=PATH="$(CFG_LDPATH_x86_64-w64-mingw32):$(1)" $(2)
506 CFG_RUN_TARG_x86_64-w64-mingw32=$(call CFG_RUN_x86_64-w64-mingw32,$(HLIB$(1)_H_$(CFG_BUILD)),$(2))
507 RUSTC_CROSS_FLAGS_x86_64-w64-mingw32 :=
508
509 # x86_64-unknown-freebsd configuration
510 CC_x86_64-unknown-freebsd=$(CC)
511 CXX_x86_64-unknown-freebsd=$(CXX)
512 CPP_x86_64-unknown-freebsd=$(CPP)
513 AR_x86_64-unknown-freebsd=$(AR)
514 CFG_LIB_NAME_x86_64-unknown-freebsd=lib$(1).so
515 CFG_STATIC_LIB_NAME_x86_64-unknown-freebsd=lib$(1).a
516 CFG_LIB_GLOB_x86_64-unknown-freebsd=lib$(1)-*.so
517 CFG_LIB_DSYM_GLOB_x86_64-unknown-freebsd=$(1)-*.dylib.dSYM
518 CFG_GCCISH_CFLAGS_x86_64-unknown-freebsd := -Wall -Werror -g -fPIC -I/usr/local/include
519 CFG_GCCISH_LINK_FLAGS_x86_64-unknown-freebsd := -shared -fPIC -g -pthread  -lrt
520 CFG_GCCISH_DEF_FLAG_x86_64-unknown-freebsd := -Wl,--export-dynamic,--dynamic-list=
521 CFG_GCCISH_PRE_LIB_FLAGS_x86_64-unknown-freebsd := -Wl,-whole-archive
522 CFG_GCCISH_POST_LIB_FLAGS_x86_64-unknown-freebsd := -Wl,-no-whole-archive
523 CFG_DEF_SUFFIX_x86_64-unknown-freebsd := .bsd.def
524 CFG_LLC_FLAGS_x86_64-unknown-freebsd :=
525 CFG_INSTALL_NAME_x86_64-unknown-freebsd =
526 CFG_LIBUV_LINK_FLAGS_x86_64-unknown-freebsd := -pthread  -lkvm
527 CFG_EXE_SUFFIX_x86_64-unknown-freebsd :=
528 CFG_WINDOWSY_x86_64-unknown-freebsd :=
529 CFG_UNIXY_x86_64-unknown-freebsd := 1
530 CFG_PATH_MUNGE_x86_64-unknown-freebsd :=
531 CFG_LDPATH_x86_64-unknown-freebsd :=
532 CFG_RUN_x86_64-unknown-freebsd=$(2)
533 CFG_RUN_TARG_x86_64-unknown-freebsd=$(call CFG_RUN_x86_64-unknown-freebsd,,$(2))
534
535 ifeq ($(CFG_CCACHE_CPP2),1)
536   CCACHE_CPP2=1
537   export CCACHE_CPP
538 endif
539
540 ifdef CFG_CCACHE_BASEDIR
541   CCACHE_BASEDIR=$(CFG_CCACHE_BASEDIR)
542   export CCACHE_BASEDIR
543 endif
544
545 FIND_COMPILER = $(word 1,$(1:ccache=))
546
547 define CFG_MAKE_TOOLCHAIN
548   # Prepend the tools with their prefix if cross compiling
549   ifneq ($(CFG_BUILD),$(1))
550         CC_$(1)=$(CROSS_PREFIX_$(1))$(CC_$(1))
551         CXX_$(1)=$(CROSS_PREFIX_$(1))$(CXX_$(1))
552         CPP_$(1)=$(CROSS_PREFIX_$(1))$(CPP_$(1))
553         AR_$(1)=$(CROSS_PREFIX_$(1))$(AR_$(1))
554         RUSTC_CROSS_FLAGS_$(1)=-C linker=$$(call FIND_COMPILER,$$(CXX_$(1))) \
555             -C ar=$$(call FIND_COMPILER,$$(AR_$(1))) $(RUSTC_CROSS_FLAGS_$(1))
556
557         RUSTC_FLAGS_$(1)=$$(RUSTC_CROSS_FLAGS_$(1)) $(RUSTC_FLAGS_$(1))
558   endif
559
560   CFG_COMPILE_C_$(1) = $$(CC_$(1))  \
561         $$(CFG_GCCISH_CFLAGS)      \
562         $$(CFG_GCCISH_CFLAGS_$(1)) \
563         $$(CFG_DEPEND_FLAGS)       \
564         -c -o $$(1) $$(2)
565   CFG_LINK_C_$(1) = $$(CC_$(1)) \
566         $$(CFG_GCCISH_LINK_FLAGS) -o $$(1)          \
567         $$(CFG_GCCISH_LINK_FLAGS_$(1))              \
568         $$(CFG_GCCISH_DEF_FLAG_$(1))$$(3) $$(2)     \
569         $$(call CFG_INSTALL_NAME_$(1),$$(4))
570   CFG_COMPILE_CXX_$(1) = $$(CXX_$(1)) \
571         $$(CFG_GCCISH_CFLAGS)      \
572         $$(CFG_GCCISH_CXXFLAGS)    \
573         $$(CFG_GCCISH_CFLAGS_$(1)) \
574         $$(CFG_GCCISH_CXXFLAGS_$(1))    \
575         $$(CFG_DEPEND_FLAGS)       \
576         -c -o $$(1) $$(2)
577   CFG_LINK_CXX_$(1) = $$(CXX_$(1)) \
578         $$(CFG_GCCISH_LINK_FLAGS) -o $$(1)             \
579         $$(CFG_GCCISH_LINK_FLAGS_$(1))                 \
580         $$(CFG_GCCISH_DEF_FLAG_$(1))$$(3) $$(2)        \
581         $$(call CFG_INSTALL_NAME_$(1),$$(4))
582
583   ifeq ($$(findstring $(HOST_$(1)),arm mips),)
584
585   # We're using llvm-mc as our assembler because it supports
586   # .cfi pseudo-ops on mac
587   CFG_ASSEMBLE_$(1)=$$(CPP_$(1)) -E $$(CFG_DEPEND_FLAGS) $$(2) | \
588                     $$(LLVM_MC_$$(CFG_BUILD)) \
589                     -assemble \
590                     -filetype=obj \
591                     -triple=$(1) \
592                     -o=$$(1)
593   else
594
595   # For the ARM and MIPS crosses, use the toolchain assembler
596   # FIXME: We should be able to use the LLVM assembler
597   CFG_ASSEMBLE_$(1)=$$(CC_$(1)) $$(CFG_GCCISH_CFLAGS_$(1)) \
598                     $$(CFG_DEPEND_FLAGS) $$(2) -c -o $$(1)
599
600   endif
601
602 endef
603
604 $(foreach target,$(CFG_TARGET),\
605   $(eval $(call CFG_MAKE_TOOLCHAIN,$(target))))