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