]> git.lizzy.rs Git - rust.git/blob - mk/platform.mk
build: Add --enable-helgrind option
[rust.git] / mk / platform.mk
1
2 # Create variables HOST_<triple> containing the host part
3 # of each target triple.  For example, the triple i686-darwin-macos
4 # would create a variable HOST_i686-darwin-macos with the value 
5 # i386.
6 define DEF_HOST_VAR
7   HOST_$(1) = $(subst i686,i386,$(word 1,$(subst -, ,$(1))))
8 endef
9 $(foreach t,$(CFG_TARGET_TRIPLES),$(eval $(call DEF_HOST_VAR,$(t))))
10 $(foreach t,$(CFG_TARGET_TRIPLES),$(info cfg: host for $(t) is $(HOST_$(t))))
11
12 CFG_GCCISH_FLAGS := -fno-strict-aliasing
13 CFG_GCCISH_LINK_FLAGS :=
14
15 # On Darwin, we need to run dsymutil so the debugging information ends
16 # up in the right place.  On other platforms, it automatically gets
17 # embedded into the executable, so use a no-op command.
18 CFG_DSYMUTIL := true
19
20 ifeq ($(CFG_VALGRIND),)
21   CFG_GCCISH_CFLAGS += -DNVALGRIND
22 endif
23
24 ifneq ($(findstring freebsd,$(CFG_OSTYPE)),)
25   CFG_LIB_NAME=lib$(1).so
26   CFG_LIB_GLOB=lib$(1)-*.so
27   CFG_GCCISH_CFLAGS += -fPIC -I/usr/local/include
28   CFG_GCCISH_LINK_FLAGS += -shared -fPIC -lpthread -lrt
29   CFG_GCCISH_DEF_FLAG := -Wl,--export-dynamic,--dynamic-list=
30   CFG_GCCISH_PRE_LIB_FLAGS := -Wl,-whole-archive
31   CFG_GCCISH_POST_LIB_FLAGS := -Wl,-no-whole-archive
32   CFG_GCCISH_CFLAGS_i386 += -m32
33   CFG_GCCISH_LINK_FLAGS_i386 += -m32
34   CFG_GCCISH_CFLAGS_x86_64 += -m64
35   CFG_GCCISH_LINK_FLAGS_x86_64 += -m64
36   CFG_UNIXY := 1
37   CFG_LDENV := LD_LIBRARY_PATH
38   CFG_DEF_SUFFIX := .bsd.def
39   CFG_INSTALL_NAME =
40   CFG_PERF_TOOL := /usr/bin/time
41
42   # FIXME (1825): We're deadlocking on FreeBSD
43   ifndef RUST_THREADS
44     RUST_THREADS=1
45     export RUST_THREADS
46   endif
47 endif
48
49 ifneq ($(findstring linux,$(CFG_OSTYPE)),)
50   CFG_LIB_NAME=lib$(1).so
51   CFG_LIB_GLOB=lib$(1)-*.so
52   CFG_GCCISH_CFLAGS += -fPIC
53   CFG_GCCISH_LINK_FLAGS += -shared -fPIC -ldl -lpthread -lrt
54   CFG_GCCISH_DEF_FLAG := -Wl,--export-dynamic,--dynamic-list=
55   CFG_GCCISH_PRE_LIB_FLAGS := -Wl,-whole-archive
56   # -znoexecstack is here because librt is for some reason being created
57   # with executable stack and Fedora (or SELinux) doesn't like that (#798)
58   CFG_GCCISH_POST_LIB_FLAGS := -Wl,-no-whole-archive -Wl,-znoexecstack
59   CFG_GCCISH_CFLAGS_i386 = -m32
60   CFG_GCCISH_LINK_FLAGS_i386 = -m32
61   CFG_GCCISH_CFLAGS_x86_64 = -m64
62   CFG_GCCISH_LINK_FLAGS_x86_64 = -m64
63   CFG_UNIXY := 1
64   CFG_LDENV := LD_LIBRARY_PATH
65   CFG_DEF_SUFFIX := .linux.def
66   ifdef CFG_PERF
67     ifneq ($(CFG_PERF_WITH_LOGFD),)
68         CFG_PERF_TOOL := $(CFG_PERF) stat -r 3 --log-fd 2
69     else
70         CFG_PERF_TOOL := $(CFG_PERF) stat -r 3
71     endif
72   else
73     ifdef CFG_VALGRIND
74       CFG_PERF_TOOL :=\
75         $(CFG_VALGRIND) --tool=cachegrind --cache-sim=yes --branch-sim=yes
76     else
77       CFG_PERF_TOOL := /usr/bin/time --verbose
78     endif
79   endif
80   CFG_INSTALL_NAME =
81   # Linux requires LLVM to be built like this to get backtraces into Rust code
82   CFG_LLVM_BUILD_ENV="CXXFLAGS=-fno-omit-frame-pointer"
83 endif
84
85 ifneq ($(findstring darwin,$(CFG_OSTYPE)),)
86   CFG_LIB_NAME=lib$(1).dylib
87   CFG_LIB_GLOB=lib$(1)-*.dylib
88   CFG_UNIXY := 1
89   CFG_LDENV := DYLD_LIBRARY_PATH
90   CFG_GCCISH_LINK_FLAGS += -dynamiclib -lpthread -framework CoreServices -Wl,-no_compact_unwind
91   CFG_GCCISH_DEF_FLAG := -Wl,-exported_symbols_list,
92   # Darwin has a very blurry notion of "64 bit", and claims it's running
93   # "on an i386" when the whole userspace is 64-bit and the compiler
94   # emits 64-bit binaries by default. So we just force -m32 here. Smarter
95   # approaches welcome!
96   #
97   # NB: Currently GCC's optimizer breaks rustrt (task-comm-1 hangs) on Darwin.
98   CFG_GCCISH_CFLAGS_i386 := -m32 -arch i386
99   CFG_GCCISH_CFLAGS_x86_64 := -m64 -arch x86_64
100   CFG_GCCISH_LINK_FLAGS_i386 := -m32
101   CFG_GCCISH_LINK_FLAGS_x86_64 := -m64
102   CFG_DSYMUTIL := dsymutil
103   CFG_DEF_SUFFIX := .darwin.def
104   # Mac requires this flag to make rpath work
105   CFG_INSTALL_NAME = -Wl,-install_name,@rpath/$(1)
106 endif
107
108 # Hack: not sure how to test if a file exists in make other than this
109 OS_SUPP = $(patsubst %,--suppressions=%,\
110             $(wildcard $(CFG_SRC_DIR)src/etc/$(CFG_OSTYPE).supp*))
111
112 ifneq ($(findstring mingw,$(CFG_OSTYPE)),)
113   CFG_WINDOWSY := 1
114 endif
115
116 ifdef CFG_DISABLE_OPTIMIZE_CXX
117   $(info cfg: disabling C++ optimization (CFG_DISABLE_OPTIMIZE_CXX))
118   CFG_GCCISH_CFLAGS += -O0
119 else
120   CFG_GCCISH_CFLAGS += -O2
121 endif
122
123 CFG_TESTLIB=$(CFG_BUILD_DIR)/$(2)/$(strip \
124  $(if $(findstring stage0,$(1)), \
125        stage0/$(CFG_LIBDIR), \
126       $(if $(findstring stage1,$(1)), \
127            stage1/$(CFG_LIBDIR), \
128           $(if $(findstring stage2,$(1)), \
129                stage2/$(CFG_LIBDIR), \
130                $(if $(findstring stage3,$(1)), \
131                     stage3/$(CFG_LIBDIR), \
132                )))))/rustc/$(CFG_HOST_TRIPLE)/$(CFG_LIBDIR)
133
134 ifdef CFG_UNIXY
135   CFG_INFO := $(info cfg: unix-y environment)
136
137   CFG_PATH_MUNGE := true
138   CFG_EXE_SUFFIX :=
139   CFG_LDPATH :=
140   CFG_RUN=$(2)
141   CFG_RUN_TARG=$(call CFG_RUN,,$(2))
142   CFG_RUN_TEST=$(call CFG_RUN,,$(CFG_VALGRIND) $(1))
143   CFG_LIBUV_LINK_FLAGS=-lpthread
144
145   ifdef CFG_ENABLE_MINGW_CROSS
146     CFG_WINDOWSY := 1
147     CFG_INFO := $(info cfg: mingw-cross)
148     CFG_GCCISH_CROSS := i586-mingw32msvc-
149     ifdef CFG_VALGRIND
150       CFG_VALGRIND += wine
151     endif
152
153     CFG_GCCISH_CFLAGS := -fno-strict-aliasing -march=i586
154     CFG_GCCISH_PRE_LIB_FLAGS :=
155     CFG_GCCISH_POST_LIB_FLAGS :=
156     CFG_GCCISH_DEF_FLAG :=
157     CFG_GCCISH_LINK_FLAGS := -shared
158
159     ifeq ($(CFG_CPUTYPE), x86_64)
160       CFG_GCCISH_CFLAGS += -m32
161       CFG_GCCISH_LINK_FLAGS += -m32
162     endif
163   endif
164   ifdef CFG_VALGRIND
165     CFG_VALGRIND += --error-exitcode=100 \
166                     --quiet \
167                     --suppressions=$(CFG_SRC_DIR)src/etc/x86.supp \
168                     $(OS_SUPP)
169     ifdef CFG_ENABLE_HELGRIND
170       CFG_VALGRIND += --tool=helgrind
171     else
172       CFG_VALGRIND += --tool=memcheck \
173                       --leak-check=full
174     endif
175   endif
176 endif
177
178
179 ifdef CFG_WINDOWSY
180   CFG_INFO := $(info cfg: windows-y environment)
181
182   CFG_EXE_SUFFIX := .exe
183   CFG_LIB_NAME=$(1).dll
184   CFG_LIB_GLOB=$(1)-*.dll
185   CFG_DEF_SUFFIX := .def
186 ifdef MSYSTEM
187   CFG_LDPATH :=$(CFG_LDPATH):$$PATH
188   CFG_RUN=PATH="$(CFG_LDPATH):$(1)" $(2)
189 else
190   CFG_LDPATH :=
191   CFG_RUN=$(2)
192 endif
193   CFG_RUN_TARG=$(call CFG_RUN,$(HLIB$(1)_H_$(CFG_HOST_TRIPLE)),$(2))
194   CFG_RUN_TEST=$(call CFG_RUN,$(call CFG_TESTLIB,$(1),$(3)),$(1))
195   CFG_LIBUV_LINK_FLAGS=-lWs2_32
196
197   ifndef CFG_ENABLE_MINGW_CROSS
198     CFG_PATH_MUNGE := $(strip perl -i.bak -p             \
199                              -e 's@\\(\S)@/\1@go;'       \
200                              -e 's@^/([a-zA-Z])/@\1:/@o;')
201     CFG_GCCISH_CFLAGS += -march=i686
202     CFG_GCCISH_LINK_FLAGS += -shared -fPIC
203   endif
204   CFG_INSTALL_NAME =
205 endif
206
207
208 CFG_INFO := $(info cfg: using $(CFG_C_COMPILER))
209 ifeq ($(CFG_C_COMPILER),clang)
210   CC=clang
211   CXX=clang++
212   CPP=cpp
213   # -Wno-c++11-compat allows us to use 'alignof' as an identifier in the runtime
214   CFG_GCCISH_CFLAGS += -Wall -Werror -Wno-c++11-compat -fno-rtti -g
215   CFG_GCCISH_LINK_FLAGS += -g
216   CFG_DEPEND_C = $(CFG_GCCISH_CROSS)$(CXX) $(CFG_GCCISH_CFLAGS) -MT "$(1)" \
217     -MM $(2)
218
219   define CFG_MAKE_CC
220         CFG_COMPILE_C_$(1) = $$(CFG_GCCISH_CROSS)$$(CXX)        \
221                 $$(CFG_GCCISH_CFLAGS) $$(CFG_CLANG_CFLAGS)              \
222                 $$(CFG_GCCISH_CFLAGS_$$(HOST_$(1)))                             \
223             $$(CFG_CLANG_CFLAGS_$$(HOST_$(1)))                          \
224                 -c -o $$(1) $$(2)
225     CFG_LINK_C_$(1) = $$(CFG_GCCISH_CROSS)$$(CXX)       \
226                 $$(CFG_GCCISH_LINK_FLAGS) -o $$(1)                      \
227                 $$(CFG_GCCISH_LINK_FLAGS_$$(HOST_$(1)))         \
228         $$(CFG_GCCISH_DEF_FLAG)$$(3) $$(2)                      \
229             $$(call CFG_INSTALL_NAME,$$(4))
230   endef
231
232   $(foreach target,$(CFG_TARGET_TRIPLES), \
233     $(eval $(call CFG_MAKE_CC,$(target))))
234 else
235 ifeq ($(CFG_C_COMPILER),gcc)
236   CC=gcc
237   CXX=g++
238   CPP=cpp
239   CFG_GCCISH_CFLAGS += -Wall -Werror -fno-rtti -g
240   CFG_GCCISH_LINK_FLAGS += -g
241   CFG_DEPEND_C = $(CFG_GCCISH_CROSS)$(CXX) $(CFG_GCCISH_CFLAGS) -MT "$(1)" \
242     -MM $(2)
243
244   define CFG_MAKE_CC
245         CFG_COMPILE_C_$(1) = $$(CFG_GCCISH_CROSS)$$(CXX)        \
246         $$(CFG_GCCISH_CFLAGS)                                                   \
247             $$(CFG_GCCISH_CFLAGS_$$(HOST_$(1)))                         \
248         $$(CFG_GCC_CFLAGS)                                                              \
249         $$(CFG_GCC_CFLAGS_$$(HOST_$(1)))                                \
250         -c -o $$(1) $$(2)
251     CFG_LINK_C_$(1) = $$(CFG_GCCISH_CROSS)$$(CXX)       \
252         $$(CFG_GCCISH_LINK_FLAGS) -o $$(1)                      \
253                 $$(CFG_GCCISH_LINK_FLAGS_$$(HOST_$(1)))         \
254         $$(CFG_GCCISH_DEF_FLAG)$$(3) $$(2)                      \
255         $$(call CFG_INSTALL_NAME,$$(4))
256   endef
257
258   $(foreach target,$(CFG_TARGET_TRIPLES), \
259     $(eval $(call CFG_MAKE_CC,$(target))))
260 else
261   CFG_ERR := $(error please try on a system with gcc or clang)
262 endif
263 endif
264
265 # We're using llvm-mc as our assembler because it supports
266 # .cfi pseudo-ops on mac
267 define CFG_MAKE_ASSEMBLER
268   CFG_ASSEMBLE_$(1)=$$(CPP) $$(2) | \
269                     $$(LLVM_MC_$$(CFG_HOST_TRIPLE)) \
270                     -assemble \
271                     -filetype=obj \
272                     -triple=$(1) \
273                     -o=$$(1)
274 endef
275
276 $(foreach target,$(CFG_TARGET_TRIPLES),\
277   $(eval $(call CFG_MAKE_ASSEMBLER,$(target))))