1 # Copyright 2012-2015 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.
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.
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
17 HOST_
$(1) = $(subst i686
,i386
,$(word 1,$(subst -, ,$(1))))
19 $(foreach t
,$(CFG_TARGET
),$(eval
$(call DEF_HOST_VAR
,$(t
))))
20 $(foreach t
,$(CFG_TARGET
),$(info cfg
: host for
$(t
) is
$(HOST_
$(t
))))
24 OSTYPE_
$(1) = $(subst $(firstword $(subst -, ,$(1)))-,,$(1))
26 $(foreach t
,$(CFG_TARGET
),$(eval
$(call DEF_OSTYPE_VAR
,$(t
))))
27 $(foreach t
,$(CFG_TARGET
),$(info cfg
: os for
$(t
) is
$(OSTYPE_
$(t
))))
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.
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
*))
38 ifdef CFG_DISABLE_OPTIMIZE_CXX
39 $(info cfg
: disabling C
++ optimization
(CFG_DISABLE_OPTIMIZE_CXX
))
40 CFG_GCCISH_CFLAGS
+= -O0
42 CFG_GCCISH_CFLAGS
+= -O2
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/
48 CFG_VALGRIND
+= --error-exitcode
=100 \
51 --soname-synonyms
=somalloc
=NONE \
52 --suppressions
=$(CFG_SRC_DIR
)src
/etc
/x86.supp \
54 ifdef CFG_ENABLE_HELGRIND
55 CFG_VALGRIND
+= --tool
=helgrind
57 CFG_VALGRIND
+= --tool
=memcheck \
62 # If we actually want to run Valgrind on a given platform, set this variable
63 define DEF_GOOD_VALGRIND
64 ifeq ($(OSTYPE_
$(1)),unknown-linux-gnu
)
65 GOOD_VALGRIND_
$(1) = 1
67 ifneq (,$(filter $(OSTYPE_
$(1)),darwin freebsd
))
68 ifeq (HOST_
$(1),x86_64
)
69 GOOD_VALGRIND_
$(1) = 1
73 $(foreach t
,$(CFG_TARGET
),$(eval
$(call DEF_GOOD_VALGRIND
,$(t
))))
74 $(foreach t
,$(CFG_TARGET
),$(info cfg
: good valgrind for
$(t
) is
$(GOOD_VALGRIND_
$(t
))))
76 ifneq ($(findstring linux
,$(CFG_OSTYPE
)),)
78 ifneq ($(CFG_PERF_WITH_LOGFD
),)
79 CFG_PERF_TOOL
:= $(CFG_PERF
) stat
-r
3 --log-fd
2
81 CFG_PERF_TOOL
:= $(CFG_PERF
) stat
-r
3
86 $(CFG_VALGRIND
) --tool
=cachegrind
--cache-sim
=yes
--branch-sim
=yes
88 CFG_PERF_TOOL
:= /usr
/bin
/time
--verbose
93 # These flags will cause the compiler to produce a .d file
94 # next to the .o file that lists header deps.
95 CFG_DEPEND_FLAGS
= -MMD
-MP
-MT
$(1) -MF
$(1:%.o
=%.d
)
101 ifeq ($(origin $(1)),undefined
)
102 $$(info cfg
: using
$(1)=$(CFG_
$(1)) (CFG_
$(1)))
105 ifeq ($(origin $(1)),default
)
106 $$(info cfg
: using
$(1)=$(CFG_
$(1)) (CFG_
$(1)))
112 $(foreach cvar
,CC CXX CPP CFLAGS CXXFLAGS CPPFLAGS
, \
113 $(eval
$(call SET_FROM_CFG
,$(cvar
))))
115 CFG_RLIB_GLOB
=lib
$(1)-*.rlib
117 include $(wildcard $(CFG_SRC_DIR
)mk
/cfg
/*.mk
)
119 # The -Qunused-arguments sidesteps spurious warnings from clang
121 ifeq ($$(CFG_USING_CLANG
),1)
122 ifneq ($(findstring clang
,$$(shell $(CC_
$(1)) -v
)),)
123 CFG_GCCISH_CFLAGS_
$(1) += -Qunused-arguments
124 CFG_GCCISH_CXXFLAGS_
$(1) += -Qunused-arguments
129 $(foreach target
,$(CFG_TARGET
), \
130 $(eval
$(call FILTER_FLAGS
,$(target
))))
133 ifeq ($(CFG_CCACHE_CPP2
),1)
138 ifdef CFG_CCACHE_BASEDIR
139 CCACHE_BASEDIR
=$(CFG_CCACHE_BASEDIR
)
140 export CCACHE_BASEDIR
143 FIND_COMPILER
= $(word 1,$(1:ccache
=))
145 define CFG_MAKE_TOOLCHAIN
146 # Prepend the tools with their prefix if cross compiling
147 ifneq ($(CFG_BUILD
),$(1))
148 CC_
$(1)=$(CROSS_PREFIX_
$(1))$(CC_
$(1))
149 CXX_
$(1)=$(CROSS_PREFIX_
$(1))$(CXX_
$(1))
150 CPP_
$(1)=$(CROSS_PREFIX_
$(1))$(CPP_
$(1))
151 AR_
$(1)=$(CROSS_PREFIX_
$(1))$(AR_
$(1))
152 RUSTC_CROSS_FLAGS_
$(1)=-C linker
=$$(call FIND_COMPILER
,$$(CC_
$(1))) \
153 -C
ar=$$(call FIND_COMPILER
,$$(AR_
$(1))) $(RUSTC_CROSS_FLAGS_
$(1))
155 RUSTC_FLAGS_
$(1)=$$(RUSTC_CROSS_FLAGS_
$(1)) $(RUSTC_FLAGS_
$(1))
158 CFG_COMPILE_C_
$(1) = $$(CC_
$(1)) \
159 $$(CFG_GCCISH_CFLAGS
) \
160 $$(CFG_GCCISH_CFLAGS_
$(1)) \
161 $$(CFG_DEPEND_FLAGS
) \
163 CFG_LINK_C_
$(1) = $$(CC_
$(1)) \
164 $$(CFG_GCCISH_LINK_FLAGS
) -o
$$(1) \
165 $$(CFG_GCCISH_LINK_FLAGS_
$(1)) \
166 $$(CFG_GCCISH_DEF_FLAG_
$(1))$$(3) $$(2) \
167 $$(call CFG_INSTALL_NAME_
$(1),$$(4))
168 CFG_COMPILE_CXX_
$(1) = $$(CXX_
$(1)) \
169 $$(CFG_GCCISH_CFLAGS
) \
170 $$(CFG_GCCISH_CXXFLAGS
) \
171 $$(CFG_GCCISH_CFLAGS_
$(1)) \
172 $$(CFG_GCCISH_CXXFLAGS_
$(1)) \
173 $$(CFG_DEPEND_FLAGS
) \
175 CFG_LINK_CXX_
$(1) = $$(CXX_
$(1)) \
176 $$(CFG_GCCISH_LINK_FLAGS
) -o
$$(1) \
177 $$(CFG_GCCISH_LINK_FLAGS_
$(1)) \
178 $$(CFG_GCCISH_DEF_FLAG_
$(1))$$(3) $$(2) \
179 $$(call CFG_INSTALL_NAME_
$(1),$$(4))
181 ifeq ($$(findstring $(HOST_
$(1)),arm aarch64 mips mipsel powerpc
),)
183 # On Bitrig, we need the relocation model to be PIC for everything
184 ifeq (,$(filter $(OSTYPE_
$(1)),bitrig
))
185 LLVM_MC_RELOCATION_MODEL
="pic"
187 LLVM_MC_RELOCATION_MODEL
="default"
190 # We're using llvm-mc as our assembler because it supports
191 # .cfi pseudo-ops on mac
192 CFG_ASSEMBLE_
$(1)=$$(CPP_
$(1)) -E
$$(CFG_DEPEND_FLAGS
) $$(2) | \
193 $$(LLVM_MC_
$$(CFG_BUILD
)) \
195 -relocation-model
=$$(LLVM_MC_RELOCATION_MODEL
) \
201 # For the ARM, AARCH64, MIPS and POWER crosses, use the toolchain assembler
202 # FIXME: We should be able to use the LLVM assembler
203 CFG_ASSEMBLE_
$(1)=$$(CC_
$(1)) $$(CFG_GCCISH_CFLAGS_
$(1)) \
204 $$(CFG_DEPEND_FLAGS
) $$(2) -c
-o
$$(1)
210 $(foreach target
,$(CFG_TARGET
), \
211 $(eval
$(call CFG_MAKE_TOOLCHAIN
,$(target
))))