]> git.lizzy.rs Git - rust.git/blob - mk/platform.mk
auto merge of #14090 : TeXitoi/rust/shootout-nbody-improvement, 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_CFLAGS_x86_64-unknown-linux-gnu := -m64
149 CFG_GCCISH_CFLAGS_x86_64-unknown-linux-gnu := -Wall -Werror -g -fPIC -m64
150 CFG_GCCISH_CXXFLAGS_x86_64-unknown-linux-gnu := -fno-rtti
151 CFG_GCCISH_LINK_FLAGS_x86_64-unknown-linux-gnu := -shared -fPIC -ldl -pthread  -lrt -g -m64
152 CFG_GCCISH_DEF_FLAG_x86_64-unknown-linux-gnu := -Wl,--export-dynamic,--dynamic-list=
153 CFG_GCCISH_PRE_LIB_FLAGS_x86_64-unknown-linux-gnu := -Wl,-whole-archive
154 CFG_GCCISH_POST_LIB_FLAGS_x86_64-unknown-linux-gnu := -Wl,-no-whole-archive
155 CFG_DEF_SUFFIX_x86_64-unknown-linux-gnu := .linux.def
156 CFG_LLC_FLAGS_x86_64-unknown-linux-gnu :=
157 CFG_INSTALL_NAME_x86_64-unknown-linux-gnu =
158 CFG_LIBUV_LINK_FLAGS_x86_64-unknown-linux-gnu =
159 CFG_EXE_SUFFIX_x86_64-unknown-linux-gnu =
160 CFG_WINDOWSY_x86_64-unknown-linux-gnu :=
161 CFG_UNIXY_x86_64-unknown-linux-gnu := 1
162 CFG_PATH_MUNGE_x86_64-unknown-linux-gnu := true
163 CFG_LDPATH_x86_64-unknown-linux-gnu :=
164 CFG_RUN_x86_64-unknown-linux-gnu=$(2)
165 CFG_RUN_TARG_x86_64-unknown-linux-gnu=$(call CFG_RUN_x86_64-unknown-linux-gnu,,$(2))
166
167 # i686-unknown-linux-gnu configuration
168 CC_i686-unknown-linux-gnu=$(CC)
169 CXX_i686-unknown-linux-gnu=$(CXX)
170 CPP_i686-unknown-linux-gnu=$(CPP)
171 AR_i686-unknown-linux-gnu=$(AR)
172 CFG_LIB_NAME_i686-unknown-linux-gnu=lib$(1).so
173 CFG_STATIC_LIB_NAME_i686-unknown-linux-gnu=lib$(1).a
174 CFG_LIB_GLOB_i686-unknown-linux-gnu=lib$(1)-*.so
175 CFG_LIB_DSYM_GLOB_i686-unknown-linux-gnu=lib$(1)-*.dylib.dSYM
176 CFG_CFLAGS_i686-unknown-linux-gnu := -m32
177 CFG_GCCISH_CFLAGS_i686-unknown-linux-gnu := -Wall -Werror -g -fPIC -m32
178 CFG_GCCISH_CXXFLAGS_i686-unknown-linux-gnu := -fno-rtti
179 CFG_GCCISH_LINK_FLAGS_i686-unknown-linux-gnu := -shared -fPIC -ldl -pthread  -lrt -g -m32
180 CFG_GCCISH_DEF_FLAG_i686-unknown-linux-gnu := -Wl,--export-dynamic,--dynamic-list=
181 CFG_GCCISH_PRE_LIB_FLAGS_i686-unknown-linux-gnu := -Wl,-whole-archive
182 CFG_GCCISH_POST_LIB_FLAGS_i686-unknown-linux-gnu := -Wl,-no-whole-archive
183 CFG_DEF_SUFFIX_i686-unknown-linux-gnu := .linux.def
184 CFG_LLC_FLAGS_i686-unknown-linux-gnu :=
185 CFG_INSTALL_NAME_i686-unknown-linux-gnu =
186 CFG_LIBUV_LINK_FLAGS_i686-unknown-linux-gnu =
187 CFG_EXE_SUFFIX_i686-unknown-linux-gnu =
188 CFG_WINDOWSY_i686-unknown-linux-gnu :=
189 CFG_UNIXY_i686-unknown-linux-gnu := 1
190 CFG_PATH_MUNGE_i686-unknown-linux-gnu := true
191 CFG_LDPATH_i686-unknown-linux-gnu :=
192 CFG_RUN_i686-unknown-linux-gnu=$(2)
193 CFG_RUN_TARG_i686-unknown-linux-gnu=$(call CFG_RUN_i686-unknown-linux-gnu,,$(2))
194
195 # arm-apple-darwin configuration
196 ifeq ($(CFG_OSTYPE),apple-darwin)
197 CFG_IOS_SDK = $(shell xcrun --show-sdk-path -sdk iphoneos 2>/dev/null)
198 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
199 CC_arm-apple-darwin = $(shell xcrun -find -sdk iphoneos clang)
200 CXX_arm-apple-darwin = $(shell xcrun -find -sdk iphoneos clang++)
201 CPP_arm-apple-darwin = $(shell xcrun -find -sdk iphoneos clang++)
202 AR_arm-apple-darwin = $(shell xcrun -find -sdk iphoneos ar)
203 CFG_LIB_NAME_arm-apple-darwin = lib$(1).dylib
204 CFG_LIB_GLOB_arm-apple-darwin = lib$(1)-*.dylib
205 CFG_LIB_DSYM_GLOB_arm-apple-darwin = lib$(1)-*.dylib.dSYM
206 CFG_CFLAGS_arm-apple-darwin := $(CFG_IOS_FLAGS)
207 CFG_GCCISH_CFLAGS_arm-apple-darwin := -Wall -Werror -g -fPIC $(CFG_IOS_FLAGS)
208 CFG_GCCISH_CXXFLAGS_arm-apple-darwin := -fno-rtti $(CFG_IOS_FLAGS)
209 CFG_GCCISH_LINK_FLAGS_arm-apple-darwin := -dynamiclib -lpthread -framework CoreServices -Wl,-no_compact_unwind
210 CFG_GCCISH_DEF_FLAG_arm-apple-darwin := -Wl,-exported_symbols_list,
211 CFG_GCCISH_PRE_LIB_FLAGS_arm-apple-darwin :=
212 CFG_GCCISH_POST_LIB_FLAGS_arm-apple-darwin :=
213 CFG_DEF_SUFFIX_arm-apple-darwin := .darwin.def
214 CFG_LLC_FLAGS_arm-apple-darwin :=
215 CFG_INSTALL_NAME_arm-apple-darwin = -Wl,-install_name,@rpath/$(1)
216 CFG_LIBUV_LINK_FLAGS_arm-apple-darwin =
217 CFG_EXE_SUFFIX_arm-apple-darwin :=
218 CFG_WINDOWSY_arm-apple-darwin :=
219 CFG_UNIXY_arm-apple-darwin := 1
220 CFG_PATH_MUNGE_arm-apple-darwin := true
221 CFG_LDPATH_arm-apple-darwin :=
222 CFG_RUN_arm-apple-darwin = $(2)
223 CFG_RUN_TARG_arm-apple-darwin = $(call CFG_RUN_arm-apple-darwin,,$(2))
224 endif
225
226 # x86_64-apple-darwin configuration
227 CC_x86_64-apple-darwin=$(CC)
228 CXX_x86_64-apple-darwin=$(CXX)
229 CPP_x86_64-apple-darwin=$(CPP)
230 AR_x86_64-apple-darwin=$(AR)
231 CFG_LIB_NAME_x86_64-apple-darwin=lib$(1).dylib
232 CFG_STATIC_LIB_NAME_x86_64-apple-darwin=lib$(1).a
233 CFG_LIB_GLOB_x86_64-apple-darwin=lib$(1)-*.dylib
234 CFG_LIB_DSYM_GLOB_x86_64-apple-darwin=lib$(1)-*.dylib.dSYM
235 CFG_CFLAGS_x86_64-apple-darwin := -m64 -arch x86_64
236 CFG_GCCISH_CFLAGS_x86_64-apple-darwin := -Wall -Werror -g -fPIC -m64 -arch x86_64
237 CFG_GCCISH_CXXFLAGS_x86_64-apple-darwin := -fno-rtti
238 CFG_GCCISH_LINK_FLAGS_x86_64-apple-darwin := -dynamiclib -pthread  -framework CoreServices -m64
239 CFG_GCCISH_DEF_FLAG_x86_64-apple-darwin := -Wl,-exported_symbols_list,
240 CFG_GCCISH_PRE_LIB_FLAGS_x86_64-apple-darwin :=
241 CFG_GCCISH_POST_LIB_FLAGS_x86_64-apple-darwin :=
242 CFG_DEF_SUFFIX_x86_64-apple-darwin := .darwin.def
243 CFG_LLC_FLAGS_x86_64-apple-darwin :=
244 CFG_INSTALL_NAME_x86_64-apple-darwin = -Wl,-install_name,@rpath/$(1)
245 CFG_LIBUV_LINK_FLAGS_x86_64-apple-darwin =
246 CFG_EXE_SUFFIX_x86_64-apple-darwin :=
247 CFG_WINDOWSY_x86_64-apple-darwin :=
248 CFG_UNIXY_x86_64-apple-darwin := 1
249 CFG_PATH_MUNGE_x86_64-apple-darwin := true
250 CFG_LDPATH_x86_64-apple-darwin :=
251 CFG_RUN_x86_64-apple-darwin=$(2)
252 CFG_RUN_TARG_x86_64-apple-darwin=$(call CFG_RUN_x86_64-apple-darwin,,$(2))
253
254 # i686-apple-darwin configuration
255 CC_i686-apple-darwin=$(CC)
256 CXX_i686-apple-darwin=$(CXX)
257 CPP_i686-apple-darwin=$(CPP)
258 AR_i686-apple-darwin=$(AR)
259 CFG_LIB_NAME_i686-apple-darwin=lib$(1).dylib
260 CFG_STATIC_LIB_NAME_i686-apple-darwin=lib$(1).a
261 CFG_LIB_GLOB_i686-apple-darwin=lib$(1)-*.dylib
262 CFG_LIB_DSYM_GLOB_i686-apple-darwin=lib$(1)-*.dylib.dSYM
263 CFG_CFLAGS_i686-apple-darwin := -m32 -arch i386
264 CFG_GCCISH_CFLAGS_i686-apple-darwin := -Wall -Werror -g -fPIC -m32 -arch i386
265 CFG_GCCISH_CXXFLAGS_i686-apple-darwin := -fno-rtti
266 CFG_GCCISH_LINK_FLAGS_i686-apple-darwin := -dynamiclib -pthread  -framework CoreServices -m32
267 CFG_GCCISH_DEF_FLAG_i686-apple-darwin := -Wl,-exported_symbols_list,
268 CFG_GCCISH_PRE_LIB_FLAGS_i686-apple-darwin :=
269 CFG_GCCISH_POST_LIB_FLAGS_i686-apple-darwin :=
270 CFG_DEF_SUFFIX_i686-apple-darwin := .darwin.def
271 CFG_LLC_FLAGS_i686-apple-darwin :=
272 CFG_INSTALL_NAME_i686-apple-darwin = -Wl,-install_name,@rpath/$(1)
273 CFG_LIBUV_LINK_FLAGS_i686-apple-darwin =
274 CFG_EXE_SUFFIX_i686-apple-darwin :=
275 CFG_WINDOWSY_i686-apple-darwin :=
276 CFG_UNIXY_i686-apple-darwin := 1
277 CFG_PATH_MUNGE_i686-apple-darwin := true
278 CFG_LDPATH_i686-apple-darwin :=
279 CFG_RUN_i686-apple-darwin=$(2)
280 CFG_RUN_TARG_i686-apple-darwin=$(call CFG_RUN_i686-apple-darwin,,$(2))
281
282 # arm-linux-androideabi configuration
283 CC_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-gcc
284 CXX_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-g++
285 CPP_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-gcc -E
286 AR_arm-linux-androideabi=$(CFG_ANDROID_CROSS_PATH)/bin/arm-linux-androideabi-ar
287 CFG_LIB_NAME_arm-linux-androideabi=lib$(1).so
288 CFG_STATIC_LIB_NAME_arm-linux-androideabi=lib$(1).a
289 CFG_LIB_GLOB_arm-linux-androideabi=lib$(1)-*.so
290 CFG_LIB_DSYM_GLOB_arm-linux-androideabi=lib$(1)-*.dylib.dSYM
291 CFG_CFLAGS_arm-linux-androideabi := -D__arm__ -DANDROID -D__ANDROID__
292 CFG_GCCISH_CFLAGS_arm-linux-androideabi := -Wall -g -fPIC -D__arm__ -DANDROID -D__ANDROID__
293 CFG_GCCISH_CXXFLAGS_arm-linux-androideabi := -fno-rtti
294 CFG_GCCISH_LINK_FLAGS_arm-linux-androideabi := -shared -fPIC -ldl -g -lm -lsupc++
295 CFG_GCCISH_DEF_FLAG_arm-linux-androideabi := -Wl,--export-dynamic,--dynamic-list=
296 CFG_GCCISH_PRE_LIB_FLAGS_arm-linux-androideabi := -Wl,-whole-archive
297 CFG_GCCISH_POST_LIB_FLAGS_arm-linux-androideabi := -Wl,-no-whole-archive
298 CFG_DEF_SUFFIX_arm-linux-androideabi := .android.def
299 CFG_LLC_FLAGS_arm-linux-androideabi :=
300 CFG_INSTALL_NAME_arm-linux-androideabi =
301 CFG_LIBUV_LINK_FLAGS_arm-linux-androideabi =
302 CFG_EXE_SUFFIX_arm-linux-androideabi :=
303 CFG_WINDOWSY_arm-linux-androideabi :=
304 CFG_UNIXY_arm-linux-androideabi := 1
305 CFG_PATH_MUNGE_arm-linux-androideabi := true
306 CFG_LDPATH_arm-linux-androideabi :=
307 CFG_RUN_arm-linux-androideabi=
308 CFG_RUN_TARG_arm-linux-androideabi=
309 RUSTC_FLAGS_arm-linux-androideabi :=
310 RUSTC_CROSS_FLAGS_arm-linux-androideabi :=-C android-cross-path=$(CFG_ANDROID_CROSS_PATH)
311
312 # arm-unknown-linux-gnueabihf configuration
313 CROSS_PREFIX_arm-unknown-linux-gnueabihf=arm-linux-gnueabihf-
314 CC_arm-unknown-linux-gnueabihf=gcc
315 CXX_arm-unknown-linux-gnueabihf=g++
316 CPP_arm-unknown-linux-gnueabihf=gcc -E
317 AR_arm-unknown-linux-gnueabihf=ar
318 CFG_LIB_NAME_arm-unknown-linux-gnueabihf=lib$(1).so
319 CFG_STATIC_LIB_NAME_arm-unknown-linux-gnueabihf=lib$(1).a
320 CFG_LIB_GLOB_arm-unknown-linux-gnueabihf=lib$(1)-*.so
321 CFG_LIB_DSYM_GLOB_arm-unknown-linux-gnueabihf=lib$(1)-*.dylib.dSYM
322 CFG_CFLAGS_arm-unknown-linux-gnueabihf := -D__arm__
323 CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabihf := -Wall -g -fPIC -D__arm__
324 CFG_GCCISH_CXXFLAGS_arm-unknown-linux-gnueabihf := -fno-rtti
325 CFG_GCCISH_LINK_FLAGS_arm-unknown-linux-gnueabihf := -shared -fPIC -g
326 CFG_GCCISH_DEF_FLAG_arm-unknown-linux-gnueabihf := -Wl,--export-dynamic,--dynamic-list=
327 CFG_GCCISH_PRE_LIB_FLAGS_arm-unknown-linux-gnueabihf := -Wl,-whole-archive
328 CFG_GCCISH_POST_LIB_FLAGS_arm-unknown-linux-gnueabihf := -Wl,-no-whole-archive
329 CFG_DEF_SUFFIX_arm-unknown-linux-gnueabihf := .linux.def
330 CFG_LLC_FLAGS_arm-unknown-linux-gnueabihf :=
331 CFG_INSTALL_NAME_ar,-unknown-linux-gnueabihf =
332 CFG_LIBUV_LINK_FLAGS_arm-unknown-linux-gnueabihf =
333 CFG_EXE_SUFFIX_arm-unknown-linux-gnueabihf :=
334 CFG_WINDOWSY_arm-unknown-linux-gnueabihf :=
335 CFG_UNIXY_arm-unknown-linux-gnueabihf := 1
336 CFG_PATH_MUNGE_arm-unknown-linux-gnueabihf := true
337 CFG_LDPATH_arm-unknown-linux-gnueabihf :=
338 CFG_RUN_arm-unknown-linux-gnueabihf=$(2)
339 CFG_RUN_TARG_arm-unknown-linux-gnueabihf=$(call CFG_RUN_arm-unknown-linux-gnueabihf,,$(2))
340 RUSTC_FLAGS_arm-unknown-linux-gnueabihf := -C target-feature=+v6,+vfp2
341 RUSTC_CROSS_FLAGS_arm-unknown-linux-gnueabihf :=
342
343 # arm-unknown-linux-gnueabi configuration
344 CROSS_PREFIX_arm-unknown-linux-gnueabi=arm-linux-gnueabi-
345 CC_arm-unknown-linux-gnueabi=gcc
346 CXX_arm-unknown-linux-gnueabi=g++
347 CPP_arm-unknown-linux-gnueabi=gcc -E
348 AR_arm-unknown-linux-gnueabi=ar
349 CFG_LIB_NAME_arm-unknown-linux-gnueabi=lib$(1).so
350 CFG_STATIC_LIB_NAME_arm-unknown-linux-gnueabi=lib$(1).a
351 CFG_LIB_GLOB_arm-unknown-linux-gnueabi=lib$(1)-*.so
352 CFG_LIB_DSYM_GLOB_arm-unknown-linux-gnueabi=lib$(1)-*.dylib.dSYM
353 CFG_CFLAGS_arm-unknown-linux-gnueabi := -D__arm__ -mfpu=vfp
354 CFG_GCCISH_CFLAGS_arm-unknown-linux-gnueabi := -Wall -g -fPIC -D__arm__ -mfpu=vfp
355 CFG_GCCISH_CXXFLAGS_arm-unknown-linux-gnueabi := -fno-rtti
356 CFG_GCCISH_LINK_FLAGS_arm-unknown-linux-gnueabi := -shared -fPIC -g
357 CFG_GCCISH_DEF_FLAG_arm-unknown-linux-gnueabi := -Wl,--export-dynamic,--dynamic-list=
358 CFG_GCCISH_PRE_LIB_FLAGS_arm-unknown-linux-gnueabi := -Wl,-whole-archive
359 CFG_GCCISH_POST_LIB_FLAGS_arm-unknown-linux-gnueabi := -Wl,-no-whole-archive
360 CFG_DEF_SUFFIX_arm-unknown-linux-gnueabi := .linux.def
361 CFG_LLC_FLAGS_arm-unknown-linux-gnueabi :=
362 CFG_INSTALL_NAME_arm-unknown-linux-gnueabi =
363 CFG_LIBUV_LINK_FLAGS_arm-unknown-linux-gnueabi =
364 CFG_EXE_SUFFIX_arm-unknown-linux-gnueabi :=
365 CFG_WINDOWSY_arm-unknown-linux-gnueabi :=
366 CFG_UNIXY_arm-unknown-linux-gnueabi := 1
367 CFG_PATH_MUNGE_arm-unknown-linux-gnueabi := true
368 CFG_LDPATH_arm-unknown-linux-gnueabi :=
369 CFG_RUN_arm-unknown-linux-gnueabi=$(2)
370 CFG_RUN_TARG_arm-unknown-linux-gnueabi=$(call CFG_RUN_arm-unknown-linux-gnueabi,,$(2))
371 RUSTC_FLAGS_arm-unknown-linux-gnueabi :=
372 RUSTC_CROSS_FLAGS_arm-unknown-linux-gnueabi :=
373
374 # mips-unknown-linux-gnu configuration
375 CC_mips-unknown-linux-gnu=mips-linux-gnu-gcc
376 CXX_mips-unknown-linux-gnu=mips-linux-gnu-g++
377 CPP_mips-unknown-linux-gnu=mips-linux-gnu-gcc -E
378 AR_mips-unknown-linux-gnu=mips-linux-gnu-ar
379 CFG_LIB_NAME_mips-unknown-linux-gnu=lib$(1).so
380 CFG_STATIC_LIB_NAME_mips-unknown-linux-gnu=lib$(1).a
381 CFG_LIB_GLOB_mips-unknown-linux-gnu=lib$(1)-*.so
382 CFG_LIB_DSYM_GLOB_mips-unknown-linux-gnu=lib$(1)-*.dylib.dSYM
383 CFG_CFLAGS_mips-unknown-linux-gnu := -mips32r2 -msoft-float -mabi=32 -mno-compact-eh
384 CFG_GCCISH_CFLAGS_mips-unknown-linux-gnu := -Wall -g -fPIC -mips32r2 -msoft-float -mabi=32 -mno-compact-eh
385 CFG_GCCISH_CXXFLAGS_mips-unknown-linux-gnu := -fno-rtti
386 CFG_GCCISH_LINK_FLAGS_mips-unknown-linux-gnu := -shared -fPIC -g -mips32r2 -msoft-float -mabi=32
387 CFG_GCCISH_DEF_FLAG_mips-unknown-linux-gnu := -Wl,--export-dynamic,--dynamic-list=
388 CFG_GCCISH_PRE_LIB_FLAGS_mips-unknown-linux-gnu := -Wl,-whole-archive
389 CFG_GCCISH_POST_LIB_FLAGS_mips-unknown-linux-gnu := -Wl,-no-whole-archive
390 CFG_DEF_SUFFIX_mips-unknown-linux-gnu := .linux.def
391 CFG_LLC_FLAGS_mips-unknown-linux-gnu :=
392 CFG_INSTALL_NAME_mips-unknown-linux-gnu =
393 CFG_LIBUV_LINK_FLAGS_mips-unknown-linux-gnu =
394 CFG_EXE_SUFFIX_mips-unknown-linux-gnu :=
395 CFG_WINDOWSY_mips-unknown-linux-gnu :=
396 CFG_UNIXY_mips-unknown-linux-gnu := 1
397 CFG_PATH_MUNGE_mips-unknown-linux-gnu := true
398 CFG_LDPATH_mips-unknown-linux-gnu :=
399 CFG_RUN_mips-unknown-linux-gnu=
400 CFG_RUN_TARG_mips-unknown-linux-gnu=
401 RUSTC_FLAGS_mips-unknown-linux-gnu := -C target-cpu=mips32r2 -C target-feature="+mips32r2,+o32" -C soft-float
402
403 # i686-pc-mingw32 configuration
404 CC_i686-pc-mingw32=$(CC)
405 CXX_i686-pc-mingw32=$(CXX)
406 CPP_i686-pc-mingw32=$(CPP)
407 AR_i686-pc-mingw32=$(AR)
408 CFG_LIB_NAME_i686-pc-mingw32=$(1).dll
409 CFG_STATIC_LIB_NAME_i686-pc-mingw32=$(1).lib
410 CFG_LIB_GLOB_i686-pc-mingw32=$(1)-*.dll
411 CFG_LIB_DSYM_GLOB_i686-pc-mingw32=$(1)-*.dylib.dSYM
412 CFG_CFLAGS_mips-i686-pc-mingw32 := -m32 -march=i686 -D_WIN32_WINNT=0x0600
413 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
414 CFG_GCCISH_CXXFLAGS_i686-pc-mingw32 := -fno-rtti
415 CFG_GCCISH_LINK_FLAGS_i686-pc-mingw32 := -shared -fPIC -g -m32
416 CFG_GCCISH_DEF_FLAG_i686-pc-mingw32 :=
417 CFG_GCCISH_PRE_LIB_FLAGS_i686-pc-mingw32 :=
418 CFG_GCCISH_POST_LIB_FLAGS_i686-pc-mingw32 :=
419 CFG_DEF_SUFFIX_i686-pc-mingw32 := .mingw32.def
420 CFG_LLC_FLAGS_i686-pc-mingw32 :=
421 CFG_INSTALL_NAME_i686-pc-mingw32 =
422 CFG_LIBUV_LINK_FLAGS_i686-pc-mingw32 := -lws2_32 -lpsapi -liphlpapi
423 CFG_LLVM_BUILD_ENV_i686-pc-mingw32 := CPATH=$(CFG_SRC_DIR)src/etc/mingw-fix-include
424 CFG_EXE_SUFFIX_i686-pc-mingw32 := .exe
425 CFG_WINDOWSY_i686-pc-mingw32 := 1
426 CFG_UNIXY_i686-pc-mingw32 :=
427 CFG_PATH_MUNGE_i686-pc-mingw32 :=
428 CFG_LDPATH_i686-pc-mingw32 :=$(CFG_LDPATH_i686-pc-mingw32):$(PATH)
429 CFG_RUN_i686-pc-mingw32=PATH="$(CFG_LDPATH_i686-pc-mingw32):$(1)" $(2)
430 CFG_RUN_TARG_i686-pc-mingw32=$(call CFG_RUN_i686-pc-mingw32,$(HLIB$(1)_H_$(CFG_BUILD)),$(2))
431
432 # i586-mingw32msvc configuration
433 CC_i586-mingw32msvc=$(CFG_MINGW32_CROSS_PATH)/bin/i586-mingw32msvc-gcc
434 CXX_i586-mingw32msvc=$(CFG_MINGW32_CROSS_PATH)/bin/i586-mingw32msvc-g++
435 CPP_i586-mingw32msvc=$(CFG_MINGW32_CROSS_PATH)/bin/i586-mingw32msvc-cpp
436 AR_i586-mingw32msvc=$(CFG_MINGW32_CROSS_PATH)/bin/i586-mingw32msvc-ar
437 CFG_LIB_NAME_i586-mingw32msvc=$(1).dll
438 CFG_STATIC_LIB_NAME_i586-mingw32msvc=$(1).lib
439 CFG_LIB_GLOB_i586-mingw32msvc=$(1)-*.dll
440 CFG_LIB_DSYM_GLOB_i586-mingw32msvc=$(1)-*.dylib.dSYM
441 CFG_CFLAGS_i586-mingw32msvc := -march=i586 -m32
442 CFG_GCCISH_CFLAGS_i586-mingw32msvc := -Wall -Werror -g -march=i586 -m32
443 CFG_GCCISH_CXXFLAGS_i586-mingw32msvc := -fno-rtti
444 CFG_GCCISH_LINK_FLAGS_i586-mingw32msvc := -shared -g -m32
445 CFG_GCCISH_DEF_FLAG_i586-mingw32msvc :=
446 CFG_GCCISH_PRE_LIB_FLAGS_i586-mingw32msvc :=
447 CFG_GCCISH_POST_LIB_FLAGS_i586-mingw32msvc :=
448 CFG_DEF_SUFFIX_i586-mingw32msvc := .mingw32.def
449 CFG_LLC_FLAGS_i586-mingw32msvc :=
450 CFG_INSTALL_NAME_i586-mingw32msvc =
451 CFG_LIBUV_LINK_FLAGS_i586-mingw32msvc := -L$(CFG_MINGW32_CROSS_PATH)/i586-mingw32msvc/lib -lws2_32 -lpsapi -liphlpapi
452 CFG_EXE_SUFFIX_i586-mingw32msvc := .exe
453 CFG_WINDOWSY_i586-mingw32msvc := 1
454 CFG_UNIXY_i586-mingw32msvc :=
455 CFG_PATH_MUNGE_i586-mingw32msvc := $(strip perl -i.bak -p   \
456                              -e 's@\\(\S)@/\1@go;'       \
457                              -e 's@^/([a-zA-Z])/@\1:/@o;')
458 CFG_LDPATH_i586-mingw32msvc :=
459 CFG_RUN_i586-mingw32msvc=
460 CFG_RUN_TARG_i586-mingw32msvc=
461
462 # i686-w64-mingw32 configuration
463 CROSS_PREFIX_i686-w64-mingw32=i686-w64-mingw32-
464 CC_i686-w64-mingw32=gcc
465 CXX_i686-w64-mingw32=g++
466 CPP_i686-w64-mingw32=gcc -E
467 AR_i686-w64-mingw32=ar
468 CFG_LIB_NAME_i686-w64-mingw32=$(1).dll
469 CFG_STATIC_LIB_NAME_i686-w64-mingw32=$(1).lib
470 CFG_LIB_GLOB_i686-w64-mingw32=$(1)-*.dll
471 CFG_LIB_DSYM_GLOB_i686-w64-mingw32=$(1)-*.dylib.dSYM
472 CFG_CFLAGS_i586-w64-mingw32 := -march=i586 -m32 -D_WIN32_WINNT=0x0600
473 CFG_GCCISH_CFLAGS_i686-w64-mingw32 := -Wall -Werror -g -m32 -D_WIN32_WINNT=0x0600
474 CFG_GCCISH_CXXFLAGS_i686-w64-mingw32 := -fno-rtti
475 CFG_GCCISH_LINK_FLAGS_i686-w64-mingw32 := -shared -g -m32
476 CFG_GCCISH_DEF_FLAG_i686-w64-mingw32 :=
477 CFG_GCCISH_PRE_LIB_FLAGS_i686-w64-mingw32 :=
478 CFG_GCCISH_POST_LIB_FLAGS_i686-w64-mingw32 :=
479 CFG_DEF_SUFFIX_i686-w64-mingw32 := .mingw32.def
480 CFG_LLC_FLAGS_i686-w64-mingw32 :=
481 CFG_INSTALL_NAME_i686-w64-mingw32 =
482 CFG_LIBUV_LINK_FLAGS_i686-w64-mingw32 := -lws2_32 -lpsapi -liphlpapi
483 CFG_EXE_SUFFIX_i686-w64-mingw32 := .exe
484 CFG_WINDOWSY_i686-w64-mingw32 := 1
485 CFG_UNIXY_i686-w64-mingw32 :=
486 CFG_PATH_MUNGE_i686-w64-mingw32 :=
487 CFG_LDPATH_i686-w64-mingw32 :=$(CFG_LDPATH_i686-w64-mingw32):$(PATH)
488 CFG_RUN_i686-w64-mingw32=PATH="$(CFG_LDPATH_i686-w64-mingw32):$(1)" $(2)
489 CFG_RUN_TARG_i686-w64-mingw32=$(call CFG_RUN_i686-w64-mingw32,$(HLIB$(1)_H_$(CFG_BUILD)),$(2))
490 RUSTC_CROSS_FLAGS_i686-w64-mingw32 :=
491
492 # x86_64-w64-mingw32 configuration
493 CROSS_PREFIX_x86_64-w64-mingw32=x86_64-w64-mingw32-
494 CC_x86_64-w64-mingw32=gcc
495 CXX_x86_64-w64-mingw32=g++
496 CPP_x86_64-w64-mingw32=gcc -E
497 AR_x86_64-w64-mingw32=ar
498 CFG_LIB_NAME_x86_64-w64-mingw32=$(1).dll
499 CFG_STATIC_LIB_NAME_x86_64-w64-mingw32=$(1).lib
500 CFG_LIB_GLOB_x86_64-w64-mingw32=$(1)-*.dll
501 CFG_LIB_DSYM_GLOB_x86_64-w64-mingw32=$(1)-*.dylib.dSYM
502 CFG_CFLAGS_x86_64-w64-mingw32 := -m64 -D_WIN32_WINNT=0x0600
503 CFG_GCCISH_CFLAGS_x86_64-w64-mingw32 := -Wall -Werror -g -m64 -D_WIN32_WINNT=0x0600
504 CFG_GCCISH_CXXFLAGS_x86_64-w64-mingw32 := -fno-rtti
505 CFG_GCCISH_LINK_FLAGS_x86_64-w64-mingw32 := -shared -g -m64
506 CFG_GCCISH_DEF_FLAG_x86_64-w64-mingw32 :=
507 CFG_GCCISH_PRE_LIB_FLAGS_x86_64-w64-mingw32 :=
508 CFG_GCCISH_POST_LIB_FLAGS_x86_64-w64-mingw32 :=
509 CFG_DEF_SUFFIX_x86_64-w64-mingw32 := .mingw32.def
510 CFG_LLC_FLAGS_x86_64-w64-mingw32 :=
511 CFG_INSTALL_NAME_x86_64-w64-mingw32 =
512 CFG_LIBUV_LINK_FLAGS_x86_64-w64-mingw32 := -lws2_32 -lpsapi -liphlpapi
513 CFG_EXE_SUFFIX_x86_64-w64-mingw32 := .exe
514 CFG_WINDOWSY_x86_64-w64-mingw32 := 1
515 CFG_UNIXY_x86_64-w64-mingw32 :=
516 CFG_PATH_MUNGE_x86_64-w64-mingw32 :=
517 CFG_LDPATH_x86_64-w64-mingw32 :=$(CFG_LDPATH_x86_64-w64-mingw32):$(PATH)
518 CFG_RUN_x86_64-w64-mingw32=PATH="$(CFG_LDPATH_x86_64-w64-mingw32):$(1)" $(2)
519 CFG_RUN_TARG_x86_64-w64-mingw32=$(call CFG_RUN_x86_64-w64-mingw32,$(HLIB$(1)_H_$(CFG_BUILD)),$(2))
520 RUSTC_CROSS_FLAGS_x86_64-w64-mingw32 :=
521
522 # x86_64-unknown-freebsd configuration
523 CC_x86_64-unknown-freebsd=$(CC)
524 CXX_x86_64-unknown-freebsd=$(CXX)
525 CPP_x86_64-unknown-freebsd=$(CPP)
526 AR_x86_64-unknown-freebsd=$(AR)
527 CFG_LIB_NAME_x86_64-unknown-freebsd=lib$(1).so
528 CFG_STATIC_LIB_NAME_x86_64-unknown-freebsd=lib$(1).a
529 CFG_LIB_GLOB_x86_64-unknown-freebsd=lib$(1)-*.so
530 CFG_LIB_DSYM_GLOB_x86_64-unknown-freebsd=$(1)-*.dylib.dSYM
531 CFG_CFLAGS_x86_64-unknown-freebsd := -I/usr/local/include
532 CFG_GCCISH_CFLAGS_x86_64-unknown-freebsd := -Wall -Werror -g -fPIC -I/usr/local/include
533 CFG_GCCISH_LINK_FLAGS_x86_64-unknown-freebsd := -shared -fPIC -g -pthread  -lrt
534 CFG_GCCISH_DEF_FLAG_x86_64-unknown-freebsd := -Wl,--export-dynamic,--dynamic-list=
535 CFG_GCCISH_PRE_LIB_FLAGS_x86_64-unknown-freebsd := -Wl,-whole-archive
536 CFG_GCCISH_POST_LIB_FLAGS_x86_64-unknown-freebsd := -Wl,-no-whole-archive
537 CFG_DEF_SUFFIX_x86_64-unknown-freebsd := .bsd.def
538 CFG_LLC_FLAGS_x86_64-unknown-freebsd :=
539 CFG_INSTALL_NAME_x86_64-unknown-freebsd =
540 CFG_LIBUV_LINK_FLAGS_x86_64-unknown-freebsd := -pthread  -lkvm
541 CFG_EXE_SUFFIX_x86_64-unknown-freebsd :=
542 CFG_WINDOWSY_x86_64-unknown-freebsd :=
543 CFG_UNIXY_x86_64-unknown-freebsd := 1
544 CFG_PATH_MUNGE_x86_64-unknown-freebsd :=
545 CFG_LDPATH_x86_64-unknown-freebsd :=
546 CFG_RUN_x86_64-unknown-freebsd=$(2)
547 CFG_RUN_TARG_x86_64-unknown-freebsd=$(call CFG_RUN_x86_64-unknown-freebsd,,$(2))
548
549 ifeq ($(CFG_CCACHE_CPP2),1)
550   CCACHE_CPP2=1
551   export CCACHE_CPP
552 endif
553
554 ifdef CFG_CCACHE_BASEDIR
555   CCACHE_BASEDIR=$(CFG_CCACHE_BASEDIR)
556   export CCACHE_BASEDIR
557 endif
558
559 FIND_COMPILER = $(word 1,$(1:ccache=))
560
561 define CFG_MAKE_TOOLCHAIN
562   # Prepend the tools with their prefix if cross compiling
563   ifneq ($(CFG_BUILD),$(1))
564         CC_$(1)=$(CROSS_PREFIX_$(1))$(CC_$(1))
565         CXX_$(1)=$(CROSS_PREFIX_$(1))$(CXX_$(1))
566         CPP_$(1)=$(CROSS_PREFIX_$(1))$(CPP_$(1))
567         AR_$(1)=$(CROSS_PREFIX_$(1))$(AR_$(1))
568         RUSTC_CROSS_FLAGS_$(1)=-C linker=$$(call FIND_COMPILER,$$(CXX_$(1))) \
569             -C ar=$$(call FIND_COMPILER,$$(AR_$(1))) $(RUSTC_CROSS_FLAGS_$(1))
570
571         RUSTC_FLAGS_$(1)=$$(RUSTC_CROSS_FLAGS_$(1)) $(RUSTC_FLAGS_$(1))
572   endif
573
574   CFG_COMPILE_C_$(1) = $$(CC_$(1))  \
575         $$(CFG_GCCISH_CFLAGS)      \
576         $$(CFG_GCCISH_CFLAGS_$(1)) \
577         $$(CFG_DEPEND_FLAGS)       \
578         -c -o $$(1) $$(2)
579   CFG_LINK_C_$(1) = $$(CC_$(1)) \
580         $$(CFG_GCCISH_LINK_FLAGS) -o $$(1)          \
581         $$(CFG_GCCISH_LINK_FLAGS_$(1))              \
582         $$(CFG_GCCISH_DEF_FLAG_$(1))$$(3) $$(2)     \
583         $$(call CFG_INSTALL_NAME_$(1),$$(4))
584   CFG_COMPILE_CXX_$(1) = $$(CXX_$(1)) \
585         $$(CFG_GCCISH_CFLAGS)      \
586         $$(CFG_GCCISH_CXXFLAGS)    \
587         $$(CFG_GCCISH_CFLAGS_$(1)) \
588         $$(CFG_GCCISH_CXXFLAGS_$(1))    \
589         $$(CFG_DEPEND_FLAGS)       \
590         -c -o $$(1) $$(2)
591   CFG_LINK_CXX_$(1) = $$(CXX_$(1)) \
592         $$(CFG_GCCISH_LINK_FLAGS) -o $$(1)             \
593         $$(CFG_GCCISH_LINK_FLAGS_$(1))                 \
594         $$(CFG_GCCISH_DEF_FLAG_$(1))$$(3) $$(2)        \
595         $$(call CFG_INSTALL_NAME_$(1),$$(4))
596
597   ifeq ($$(findstring $(HOST_$(1)),arm mips),)
598
599   # We're using llvm-mc as our assembler because it supports
600   # .cfi pseudo-ops on mac
601   CFG_ASSEMBLE_$(1)=$$(CPP_$(1)) -E $$(CFG_DEPEND_FLAGS) $$(2) | \
602                     $$(LLVM_MC_$$(CFG_BUILD)) \
603                     -assemble \
604                     -filetype=obj \
605                     -triple=$(1) \
606                     -o=$$(1)
607   else
608
609   # For the ARM and MIPS crosses, use the toolchain assembler
610   # FIXME: We should be able to use the LLVM assembler
611   CFG_ASSEMBLE_$(1)=$$(CC_$(1)) $$(CFG_GCCISH_CFLAGS_$(1)) \
612                     $$(CFG_DEPEND_FLAGS) $$(2) -c -o $$(1)
613
614   endif
615
616 endef
617
618 $(foreach target,$(CFG_TARGET),\
619   $(eval $(call CFG_MAKE_TOOLCHAIN,$(target))))