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