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