ghc.mk 19.4 KB
Newer Older
1 2 3 4 5 6 7
# -----------------------------------------------------------------------------
#
# (c) 2009 The University of Glasgow
#
# This file is part of the GHC build system.
#
# To understand how the build system works and how to modify it, see
8 9
#      http://ghc.haskell.org/trac/ghc/wiki/Building/Architecture
#      http://ghc.haskell.org/trac/ghc/wiki/Building/Modifying
10 11 12
#
# -----------------------------------------------------------------------------

Ian Lynagh's avatar
Ian Lynagh committed
13 14 15 16 17 18
# -----------------------------------------------------------------------------
# Building the RTS

# We build the RTS with stage 1
rts_dist_HC = $(GHC_STAGE1)

19 20 21
rts_INSTALL_INFO = rts
rts_VERSION = 1.0

22 23
# merge GhcLibWays and GhcRTSWays but strip out duplicates
rts_WAYS = $(GhcLibWays) $(filter-out $(GhcLibWays),$(GhcRTSWays))
Ian Lynagh's avatar
Ian Lynagh committed
24
rts_dist_WAYS = $(rts_WAYS)
Ian Lynagh's avatar
Ian Lynagh committed
25

26
ALL_RTS_LIBS = $(foreach way,$(rts_WAYS),rts/dist/build/libHSrts$($(way)_libsuf))
27
$(eval $(call all-target,rts,$(ALL_RTS_LIBS)))
Ian Lynagh's avatar
Ian Lynagh committed
28 29 30 31

# -----------------------------------------------------------------------------
# Defining the sources

32
ALL_DIRS = hooks sm eventlog
Ian Lynagh's avatar
Ian Lynagh committed
33

Ian Lynagh's avatar
Ian Lynagh committed
34
ifeq "$(HostOS_CPP)" "mingw32"
Ian Lynagh's avatar
Ian Lynagh committed
35 36 37 38 39
ALL_DIRS += win32
else
ALL_DIRS += posix
endif

40
rts_C_SRCS := $(wildcard rts/*.c $(foreach dir,$(ALL_DIRS),rts/$(dir)/*.c))
41
rts_CMM_SRCS := $(wildcard rts/*.cmm)
Ian Lynagh's avatar
Ian Lynagh committed
42

Ian Lynagh's avatar
Ian Lynagh committed
43
# Don't compile .S files when bootstrapping a new arch
Ian Lynagh's avatar
Ian Lynagh committed
44
ifneq "$(PORTING_HOST)" "YES"
45
ifneq "$(findstring $(TargetArch_CPP), i386 powerpc powerpc64)" ""
Ian Lynagh's avatar
Ian Lynagh committed
46 47
rts_S_SRCS += rts/AdjustorAsm.S
endif
Ian Lynagh's avatar
Ian Lynagh committed
48
endif
Ian Lynagh's avatar
Ian Lynagh committed
49 50 51 52 53 54 55

ifeq "$(GhcUnregisterised)" "YES"
GENAPPLY_OPTS = -u
endif

rts_AUTO_APPLY_CMM = rts/dist/build/AutoApply.cmm

56 57
$(rts_AUTO_APPLY_CMM): $$(genapply_INPLACE)
	"$(genapply_INPLACE)" >$@
Ian Lynagh's avatar
Ian Lynagh committed
58

59
rts/dist/build/sm/Evac_thr.c : rts/sm/Evac.c | $$(dir $$@)/.
Ian Lynagh's avatar
Ian Lynagh committed
60
	cp $< $@
61
rts/dist/build/sm/Scav_thr.c : rts/sm/Scav.c | $$(dir $$@)/.
Ian Lynagh's avatar
Ian Lynagh committed
62 63
	cp $< $@

64
rts_H_FILES := $(wildcard rts/*.h rts/*/*.h)
Ian Lynagh's avatar
Ian Lynagh committed
65

66
ifeq "$(USE_DTRACE)" "YES"
67 68 69 70
DTRACEPROBES_H = rts/dist/build/RtsProbes.h
rts_H_FILES += $(DTRACEPROBES_H)
endif

71
# collect the -l and -L flags that we need to link the rts dyn lib.
ian@well-typed.com's avatar
ian@well-typed.com committed
72 73
# Note that, as sed on OS X doesn't handle \+, we use [^ ][^ ]* rather
# than [^ ]\+
74
rts/dist/libs.depend : $$(ghc-pkg_INPLACE) | $$(dir $$@)/.
75
	"$(ghc-pkg_INPLACE)" --simple-output field rts extra-libraries \
ian@well-typed.com's avatar
ian@well-typed.com committed
76
	  | sed -e 's/\([^ ][^ ]*\)/-l\1/g' > $@
77
	"$(ghc-pkg_INPLACE)" --simple-output field rts library-dirs \
ian@well-typed.com's avatar
ian@well-typed.com committed
78
	  | sed -e 's/\([^ ][^ ]*\)/-L\1/g' >> $@
79

80 81 82 83 84 85 86

# ----------------------------------------------------------------------------
# On Windows, as the RTS and base libraries have recursive imports,
# 	we have to break the loop with "import libraries".
# 	These are made from rts/win32/libHS*.def which contain lists of
# 	all the symbols in those libraries used by the RTS.
#
87
ifeq "$(HostOS_CPP)" "mingw32" 
88 89 90 91

ALL_RTS_DEF_LIBNAMES 	= base ghc-prim
ALL_RTS_DEF_LIBS	= \
	rts/dist/build/win32/libHSbase.dll.a \
92
	rts/dist/build/win32/libHSghc-prim.dll.a
93 94 95 96 97 98

# -- import libs for the regular Haskell libraries
define make-importlib-def # args $1 = lib name
rts/dist/build/win32/libHS$1.def : rts/win32/libHS$1.def
	cat rts/win32/libHS$1.def \
		| sed "s/@LibVersion@/$$(libraries/$1_dist-install_VERSION)/" \
99
		| sed "s/@ProjectVersion@/$$(ProjectVersion)/" \
100
		> rts/dist/build/win32/libHS$1.def
101

102 103 104 105 106 107 108
rts/dist/build/win32/libHS$1.dll.a : rts/dist/build/win32/libHS$1.def
	"$$(DLLTOOL)" 	-d rts/dist/build/win32/libHS$1.def \
			-l rts/dist/build/win32/libHS$1.dll.a
endef
$(foreach lib,$(ALL_RTS_DEF_LIBNAMES),$(eval $(call make-importlib-def,$(lib))))
endif

109
ifneq "$(BINDIST)" "YES"
110
ifneq "$(UseSystemLibFFI)" "YES"
111
ifeq "$(HostOS_CPP)" "mingw32" 
ian@well-typed.com's avatar
ian@well-typed.com committed
112
rts/dist/build/$(LIBFFI_DLL): libffi/build/inst/bin/$(LIBFFI_DLL)
113 114
	cp $< $@
else
115 116
# This is a little hacky. We don't know the SO version, so we only
# depend on libffi.so, but copy libffi.so*
ian@well-typed.com's avatar
ian@well-typed.com committed
117 118
rts/dist/build/lib$(LIBFFI_NAME)$(soext): libffi/build/inst/lib/lib$(LIBFFI_NAME)$(soext)
	cp libffi/build/inst/lib/lib$(LIBFFI_NAME)$(soext)* rts/dist/build
119
ifeq "$(TargetOS_CPP)" "darwin"
120
	install_name_tool -id @rpath/lib$(LIBFFI_NAME)$(soext) rts/dist/build/lib$(LIBFFI_NAME)$(soext)
121
endif
122
endif
123
endif
124
endif
125

Ian Lynagh's avatar
Ian Lynagh committed
126 127 128 129
#-----------------------------------------------------------------------------
# Building one way
define build-rts-way # args: $1 = way

130 131
ifneq "$$(BINDIST)" "YES"

132 133 134
rts_dist_$1_HC_OPTS := $$(GhcRtsHcOpts)
rts_dist_$1_CC_OPTS := $$(GhcRtsCcOpts)

Ian Lynagh's avatar
Ian Lynagh committed
135 136
# The per-way CC_OPTS
ifneq "$$(findstring debug, $1)" ""
137
rts_dist_$1_HC_OPTS += -O0
138
rts_dist_$1_CC_OPTS += -fno-omit-frame-pointer -g -O0
Ian Lynagh's avatar
Ian Lynagh committed
139 140
endif

141 142 143 144
ifneq "$$(findstring dyn, $1)" ""
ifeq "$$(HostOS_CPP)" "mingw32" 
rts_dist_$1_CC_OPTS += -DCOMPILING_WINDOWS_DLL
endif
145
rts_dist_$1_CC_OPTS += -DDYNAMIC
146 147
endif

Ian Lynagh's avatar
Ian Lynagh committed
148 149 150 151 152 153 154 155
ifneq "$$(findstring thr, $1)" ""
rts_$1_EXTRA_C_SRCS  =  rts/dist/build/sm/Evac_thr.c rts/dist/build/sm/Scav_thr.c
endif

$(call distdir-way-opts,rts,dist,$1)
$(call c-suffix-rules,rts,dist,$1,YES)
$(call cmm-suffix-rules,rts,dist,$1)

156 157
rts_$1_LIB_NAME = libHSrts$$($1_libsuf)
rts_$1_LIB = rts/dist/build/$$(rts_$1_LIB_NAME)
Ian Lynagh's avatar
Ian Lynagh committed
158 159 160

rts_$1_C_OBJS   = $$(patsubst rts/%.c,rts/dist/build/%.$$($1_osuf),$$(rts_C_SRCS)) $$(patsubst %.c,%.$$($1_osuf),$$(rts_$1_EXTRA_C_SRCS))
rts_$1_S_OBJS   = $$(patsubst rts/%.S,rts/dist/build/%.$$($1_osuf),$$(rts_S_SRCS))
161
rts_$1_CMM_OBJS = $$(patsubst rts/%.cmm,rts/dist/build/%.$$($1_osuf),$$(rts_CMM_SRCS)) $$(patsubst %.cmm,%.$$($1_osuf),$$(rts_AUTO_APPLY_CMM))
Ian Lynagh's avatar
Ian Lynagh committed
162 163 164

rts_$1_OBJS = $$(rts_$1_C_OBJS) $$(rts_$1_S_OBJS) $$(rts_$1_CMM_OBJS)

165 166 167 168 169 170 171 172
ifeq "$(USE_DTRACE)" "YES"
ifeq "$(TargetOS_CPP)" "solaris2"
# On Darwin we don't need to generate binary containing probes defined
# in DTrace script, but DTrace on Solaris expects generation of binary
# from the DTrace probes definitions
rts_$1_DTRACE_OBJS = rts/dist/build/RtsProbes.$$($1_osuf)

rts/dist/build/RtsProbes.$$($1_osuf) : $$(rts_$1_OBJS)
Ian Lynagh's avatar
Ian Lynagh committed
173
	$(DTRACE) -G -C $$(addprefix -I,$$(GHC_INCLUDE_DIRS)) -DDTRACE -s rts/RtsProbes.d -o \
174 175 176 177
		$$@ $$(rts_$1_OBJS)
endif
endif

178
rts_dist_$1_CC_OPTS += -DRtsWay=\"rts_$1\"
179

180 181 182 183 184 185 186
# If we're compiling on windows, enforce that we only support XP+
# Adding this here means it doesn't have to be done in individual .c files
# and also centralizes the versioning.
ifeq "$$(TargetOS_CPP)" "mingw32"
rts_dist_$1_CC_OPTS += -DWINVER=0x0501
endif

187
ifneq "$$(UseSystemLibFFI)" "YES"
ian@well-typed.com's avatar
ian@well-typed.com committed
188
rts_dist_FFI_SO = rts/dist/build/lib$$(LIBFFI_NAME)$$(soext)
189 190 191 192
else
rts_dist_FFI_SO =
endif

193
# Making a shared library for the RTS.
194
ifneq "$$(findstring dyn, $1)" ""
195
ifeq "$$(HostOS_CPP)" "mingw32" 
196
$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(ALL_RTS_DEF_LIBS) rts/dist/libs.depend rts/dist/build/$$(LIBFFI_DLL)
197
	"$$(RM)" $$(RM_OPTS) $$@
198
	"$$(rts_dist_HC)" -this-package-key rts -shared -dynamic -dynload deploy \
ian@well-typed.com's avatar
ian@well-typed.com committed
199
	  -no-auto-link-packages -Lrts/dist/build -l$$(LIBFFI_NAME) \
200 201 202
         `cat rts/dist/libs.depend` $$(rts_$1_OBJS) $$(ALL_RTS_DEF_LIBS) \
         $$(rts_dist_$1_GHC_LD_OPTS) \
         -o $$@
203
else
204
ifneq "$$(UseSystemLibFFI)" "YES"
ian@well-typed.com's avatar
ian@well-typed.com committed
205
LIBFFI_LIBS = -Lrts/dist/build -l$$(LIBFFI_NAME)
206
ifeq "$$(TargetElf)" "YES"
207
LIBFFI_LIBS += -optl-Wl,-rpath -optl-Wl,'$$$$ORIGIN' -optl-Wl,-zorigin
208
endif
209 210 211
ifeq "$(TargetOS_CPP)" "darwin"
LIBFFI_LIBS += -optl-Wl,-rpath -optl-Wl,@loader_path
endif
212

213
else
214
# flags will be taken care of in rts/dist/libs.depend
215 216
LIBFFI_LIBS =
endif
217
$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) rts/dist/libs.depend $$(rts_dist_FFI_SO)
218
	"$$(RM)" $$(RM_OPTS) $$@
219
	"$$(rts_dist_HC)" -this-package-key rts -shared -dynamic -dynload deploy \
220
	  -no-auto-link-packages $$(LIBFFI_LIBS) `cat rts/dist/libs.depend` $$(rts_$1_OBJS) \
221
          $$(rts_dist_$1_GHC_LD_OPTS) \
222
	  $$(rts_$1_DTRACE_OBJS) -o $$@
223
endif
224
else
225
$$(rts_$1_LIB) : $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS)
226
	"$$(RM)" $$(RM_OPTS) $$@
227
	echo $$(rts_$1_OBJS) $$(rts_$1_DTRACE_OBJS) | "$$(XARGS)" $$(XARGS_OPTS) "$$(AR_STAGE1)" \
228
		$$(AR_OPTS_STAGE1) $$(EXTRA_AR_ARGS_STAGE1) $$@
229 230

ifneq "$$(UseSystemLibFFI)" "YES"
ian@well-typed.com's avatar
ian@well-typed.com committed
231 232
$$(rts_$1_LIB) : rts/dist/build/libC$$(LIBFFI_NAME)$$($1_libsuf)
rts/dist/build/libC$$(LIBFFI_NAME)$$($1_libsuf): libffi/build/inst/lib/libffi.a
233 234 235
	cp $$< $$@
endif

236
endif
Ian Lynagh's avatar
Ian Lynagh committed
237

238 239
endif

Ian Lynagh's avatar
Ian Lynagh committed
240 241 242 243 244
endef

# And expand the above for each way:
$(foreach way,$(rts_WAYS),$(eval $(call build-rts-way,$(way))))

245
$(eval $(call distdir-opts,rts,dist,1))
246

Ian Lynagh's avatar
Ian Lynagh committed
247 248 249
#-----------------------------------------------------------------------------
# Flags for compiling every file

Simon Marlow's avatar
Simon Marlow committed
250
# We like plenty of warnings.
251 252 253 254 255 256
WARNING_OPTS += -Wall
ifeq "$(GccLT34)" "YES"
WARNING_OPTS += -W
else
WARNING_OPTS += -Wextra
endif
Ian Lynagh's avatar
Ian Lynagh committed
257 258 259 260 261
WARNING_OPTS += -Wstrict-prototypes 
WARNING_OPTS += -Wmissing-prototypes 
WARNING_OPTS += -Wmissing-declarations
WARNING_OPTS += -Winline
WARNING_OPTS += -Waggregate-return
Simon Marlow's avatar
Simon Marlow committed
262 263 264 265 266 267 268
WARNING_OPTS += -Wpointer-arith
WARNING_OPTS += -Wmissing-noreturn
WARNING_OPTS += -Wnested-externs
WARNING_OPTS += -Wredundant-decls 

# These ones are hard to avoid:
#WARNING_OPTS += -Wconversion
Ian Lynagh's avatar
Ian Lynagh committed
269 270 271 272
#WARNING_OPTS += -Wbad-function-cast
#WARNING_OPTS += -Wshadow
#WARNING_OPTS += -Wcast-qual

273 274 275 276 277 278 279 280 281
# This one seems buggy on GCC 4.1.2, which is the only GCC version we 
# have that can bootstrap the SPARC build. We end up with lots of supurious
# warnings of the form "cast increases required alignment of target type".
# Some legitimate warnings can be fixed by adding an intermediate cast to
# (void*), but we get others in rts/sm/GCUtils.c concerning the gct var
# that look innocuous to me. We could enable this again once we deprecate
# support for registerised builds on this arch. -- BL 2010/02/03
# WARNING_OPTS += -Wcast-align

Ian Lynagh's avatar
Ian Lynagh committed
282
STANDARD_OPTS += $(addprefix -I,$(GHC_INCLUDE_DIRS)) -Irts -Irts/dist/build
Ian Lynagh's avatar
Ian Lynagh committed
283 284 285 286 287 288 289 290 291 292
# COMPILING_RTS is only used when building Win32 DLL support.
STANDARD_OPTS += -DCOMPILING_RTS

# HC_OPTS is included in both .c and .cmm compilations, whereas CC_OPTS is
# only included in .c compilations.  HC_OPTS included the WAY_* opts, which
# must be included in both types of compilations.

rts_CC_OPTS += $(WARNING_OPTS)
rts_CC_OPTS += $(STANDARD_OPTS)

293
rts_HC_OPTS += $(STANDARD_OPTS) -this-package-key rts
Ian Lynagh's avatar
Ian Lynagh committed
294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314

ifneq "$(GhcWithSMP)" "YES"
rts_CC_OPTS += -DNOSMP
rts_HC_OPTS += -optc-DNOSMP
endif

ifeq "$(UseLibFFIForAdjustors)" "YES"
rts_CC_OPTS += -DUSE_LIBFFI_FOR_ADJUSTORS
endif

# We *want* type-checking of hand-written cmm.
rts_HC_OPTS += -dcmm-lint 

# -fno-strict-aliasing is required for the runtime, because we often
# use a variety of types to represent closure pointers (StgPtr,
# StgClosure, StgMVar, etc.), and without -fno-strict-aliasing gcc is
# allowed to assume that these pointers do not alias.  eg. without
# this flag we get problems in sm/Evac.c:copy() with gcc 3.4.3, the
# upd_evacee() assigments get moved before the object copy.
rts_CC_OPTS += -fno-strict-aliasing

Simon Marlow's avatar
Simon Marlow committed
315 316
rts_CC_OPTS += -fno-common

Ian Lynagh's avatar
Ian Lynagh committed
317 318 319 320 321 322
ifeq "$(BeConservative)" "YES"
rts_CC_OPTS += -DBE_CONSERVATIVE
endif

#-----------------------------------------------------------------------------
# Flags for compiling specific files
323 324
rts/RtsMessages_CC_OPTS += -DProjectVersion=\"$(ProjectVersion)\"
rts/RtsUtils_CC_OPTS += -DProjectVersion=\"$(ProjectVersion)\"
325
rts/Trace_CC_OPTS += -DProjectVersion=\"$(ProjectVersion)\"
Ian Lynagh's avatar
Ian Lynagh committed
326
#
327 328 329 330
rts/RtsUtils_CC_OPTS += -DHostPlatform=\"$(HOSTPLATFORM)\"
rts/RtsUtils_CC_OPTS += -DHostArch=\"$(HostArch_CPP)\"
rts/RtsUtils_CC_OPTS += -DHostOS=\"$(HostOS_CPP)\"
rts/RtsUtils_CC_OPTS += -DHostVendor=\"$(HostVendor_CPP)\"
Ian Lynagh's avatar
Ian Lynagh committed
331
#
332 333 334 335
rts/RtsUtils_CC_OPTS += -DBuildPlatform=\"$(BUILDPLATFORM)\"
rts/RtsUtils_CC_OPTS += -DBuildArch=\"$(BuildArch_CPP)\"
rts/RtsUtils_CC_OPTS += -DBuildOS=\"$(BuildOS_CPP)\"
rts/RtsUtils_CC_OPTS += -DBuildVendor=\"$(BuildVendor_CPP)\"
Ian Lynagh's avatar
Ian Lynagh committed
336
#
337 338 339 340
rts/RtsUtils_CC_OPTS += -DTargetPlatform=\"$(TARGETPLATFORM)\"
rts/RtsUtils_CC_OPTS += -DTargetArch=\"$(TargetArch_CPP)\"
rts/RtsUtils_CC_OPTS += -DTargetOS=\"$(TargetOS_CPP)\"
rts/RtsUtils_CC_OPTS += -DTargetVendor=\"$(TargetVendor_CPP)\"
Ian Lynagh's avatar
Ian Lynagh committed
341
#
342 343
rts/RtsUtils_CC_OPTS += -DGhcUnregisterised=\"$(GhcUnregisterised)\"
rts/RtsUtils_CC_OPTS += -DGhcEnableTablesNextToCode=\"$(GhcEnableTablesNextToCode)\"
Ian Lynagh's avatar
Ian Lynagh committed
344

345 346 347 348 349 350 351 352 353 354
# Compile various performance-critical pieces *without* -fPIC -dynamic
# even when building a shared library.  If we don't do this, then the
# GC runs about 50% slower on x86 due to the overheads of PIC.  The
# cost of doing this is a little runtime linking and less sharing, but
# not much.
#
# On x86_64 this doesn't work, because all objects in a shared library
# must be compiled with -fPIC (since the 32-bit relocations generated
# by the default small memory can't be resolved at runtime).  So we
# only do this on i386.
355
#
356 357
# This apparently doesn't work on OS X (Darwin) nor on Solaris.
# On Darwin we get errors of the form
358 359 360 361 362 363 364
#
#  ld: absolute addressing (perhaps -mdynamic-no-pic) used in _stg_ap_0_fast from rts/dist/build/Apply.dyn_o not allowed in slidable image
#
# and lots of these warnings:
#
#  ld: warning codegen in _stg_ap_pppv_fast (offset 0x0000005E) prevents image from loading in dyld shared cache
#
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383
# On Solaris we get errors like:
#
# Text relocation remains                         referenced
#     against symbol                  offset      in file
# .rodata (section)                   0x11        rts/dist/build/Apply.dyn_o
#   ...
# ld: fatal: relocations remain against allocatable but non-writable sections
# collect2: ld returned 1 exit status

ifeq "$(TargetArch_CPP)" "i386"
i386_SPEED_HACK := "YES"
ifeq "$(TargetOS_CPP)" "darwin"
i386_SPEED_HACK := "NO"
endif
ifeq "$(TargetOS_CPP)" "solaris2"
i386_SPEED_HACK := "NO"
endif
endif

384
ifeq "$(TargetArch_CPP)" "i386"
385
ifeq "$(i386_SPEED_HACK)" "YES"
386 387 388 389 390 391 392 393 394 395 396 397 398 399 400
rts/sm/Evac_HC_OPTS           += -fno-PIC
rts/sm/Evac_thr_HC_OPTS       += -fno-PIC
rts/sm/Scav_HC_OPTS           += -fno-PIC
rts/sm/Scav_thr_HC_OPTS       += -fno-PIC
rts/sm/Compact_HC_OPTS        += -fno-PIC
rts/sm/GC_HC_OPTS             += -fno-PIC

# -static is also necessary for these bits, otherwise the NCG
# -generates dynamic references:
rts/Updates_HC_OPTS += -fno-PIC -static
rts/StgMiscClosures_HC_OPTS += -fno-PIC -static
rts/PrimOps_HC_OPTS += -fno-PIC -static
rts/Apply_HC_OPTS += -fno-PIC -static
rts/dist/build/AutoApply_HC_OPTS += -fno-PIC -static
endif
401
endif
402

403
# add CFLAGS for libffi
Ian Lynagh's avatar
Ian Lynagh committed
404
# ffi.h triggers prototype warnings, so disable them here:
405 406 407 408 409 410 411 412
ifeq "$(UseSystemLibFFI)" "YES"
LIBFFI_CFLAGS = $(addprefix -I,$(FFIIncludeDir))
else
LIBFFI_CFLAGS =
endif
rts/Interpreter_CC_OPTS += -Wno-strict-prototypes $(LIBFFI_CFLAGS)
rts/Adjustor_CC_OPTS    += -Wno-strict-prototypes $(LIBFFI_CFLAGS)
rts/sm/Storage_CC_OPTS  += -Wno-strict-prototypes $(LIBFFI_CFLAGS)
Simon Marlow's avatar
Simon Marlow committed
413 414

# inlining warnings happen in Compact
415
rts/sm/Compact_CC_OPTS += -Wno-inline
Ian Lynagh's avatar
Ian Lynagh committed
416

Simon Marlow's avatar
Simon Marlow committed
417
# emits warnings about call-clobbered registers on x86_64
418
rts/StgCRun_CC_OPTS += -w
Simon Marlow's avatar
Simon Marlow committed
419

420 421
rts/RetainerProfile_CC_OPTS += -w
rts/RetainerSet_CC_OPTS += -Wno-format
Ian Lynagh's avatar
Ian Lynagh committed
422
# On Windows:
423 424
rts/win32/ConsoleHandler_CC_OPTS += -w
rts/win32/ThrIOManager_CC_OPTS += -w
425
# The above warning suppression flags are a temporary kludge.
Ian Lynagh's avatar
Ian Lynagh committed
426 427
# While working on this module you are encouraged to remove it and fix
# any warnings in the module. See
428
#     http://ghc.haskell.org/trac/ghc/wiki/WorkingConventions#Warnings
Ian Lynagh's avatar
Ian Lynagh committed
429 430 431
# for details

# Without this, thread_obj will not be inlined (at least on x86 with GCC 4.1.0)
432
ifneq "$(CC_CLANG_BACKEND)" "1"
433
rts/sm/Compact_CC_OPTS += -finline-limit=2500
434
endif
Ian Lynagh's avatar
Ian Lynagh committed
435 436

# -O3 helps unroll some loops (especially in copy() with a constant argument).
437 438
rts/sm/Evac_CC_OPTS += -funroll-loops
rts/dist/build/sm/Evac_thr_HC_OPTS += -optc-funroll-loops
Ian Lynagh's avatar
Ian Lynagh committed
439 440 441

# These files are just copies of sm/Evac.c and sm/Scav.c respectively,
# but compiled with -DPARALLEL_GC.
442 443
rts/dist/build/sm/Evac_thr_CC_OPTS += -DPARALLEL_GC -Irts/sm
rts/dist/build/sm/Scav_thr_CC_OPTS += -DPARALLEL_GC -Irts/sm
Ian Lynagh's avatar
Ian Lynagh committed
444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471

#-----------------------------------------------------------------------------
# Add PAPI library if needed

ifeq "$(GhcRtsWithPapi)" "YES"

rts_CC_OPTS		+= -DUSE_PAPI

rts_PACKAGE_CPP_OPTS	+= -DUSE_PAPI
rts_PACKAGE_CPP_OPTS    += -DPAPI_INCLUDE_DIR=$(PapiIncludeDir)
rts_PACKAGE_CPP_OPTS    += -DPAPI_LIB_DIR=$(PapiLibDir)

ifneq "$(PapiIncludeDir)" ""
rts_HC_OPTS     += -I$(PapiIncludeDir)
rts_CC_OPTS     += -I$(PapiIncludeDir)
rts_HSC2HS_OPTS += -I$(PapiIncludeDir)
endif
ifneq "$(PapiLibDirs)" ""
rts_LD_OPTS     += -L$(PapiLibDirs)
endif

else # GhcRtsWithPapi==YES

rts_PACKAGE_CPP_OPTS += -DPAPI_INCLUDE_DIR=""
rts_PACKAGE_CPP_OPTS += -DPAPI_LIB_DIR=""

endif

472 473 474 475 476
#-----------------------------------------------------------------------------
# Use system provided libffi

ifeq "$(UseSystemLibFFI)" "YES"

477 478 479
rts_PACKAGE_CPP_OPTS += -DFFI_INCLUDE_DIR=$(FFIIncludeDir)
rts_PACKAGE_CPP_OPTS += -DFFI_LIB_DIR=$(FFILibDir)
rts_PACKAGE_CPP_OPTS += '-DFFI_LIB='
480 481 482

else # UseSystemLibFFI==YES

483 484
rts_PACKAGE_CPP_OPTS += -DFFI_INCLUDE_DIR=
rts_PACKAGE_CPP_OPTS += -DFFI_LIB_DIR=
ian@well-typed.com's avatar
ian@well-typed.com committed
485
rts_PACKAGE_CPP_OPTS += '-DFFI_LIB="C$(LIBFFI_NAME)"'
486 487 488

endif

Ian Lynagh's avatar
Ian Lynagh committed
489 490 491 492
# -----------------------------------------------------------------------------
# dependencies

rts_WAYS_DASHED = $(subst $(space),,$(patsubst %,-%,$(strip $(rts_WAYS))))
Ian Lynagh's avatar
Ian Lynagh committed
493
rts_dist_depfile_base = rts/dist/build/.depend$(rts_WAYS_DASHED)
Ian Lynagh's avatar
Ian Lynagh committed
494

495 496 497 498 499 500
rts_dist_C_SRCS    = $(rts_C_SRCS) $(rts_thr_EXTRA_C_SRCS)
rts_dist_S_SRCS    = $(rts_S_SRCS)
rts_dist_CMM_SRCS  = $(rts_CMM_SRCS)
rts_dist_C_FILES   = $(rts_dist_C_SRCS)
rts_dist_S_FILES   = $(rts_dist_S_SRCS)
rts_dist_CMM_FILES = $(rts_dist_CMM_SRCS)
Ian Lynagh's avatar
Ian Lynagh committed
501

502 503 504 505 506 507 508
# Hack: we define every way-related option here, so that we get (hopefully)
# a superset of the dependencies.  To do this properly, we should generate
# a different set of dependencies for each way.  Further hack: PROFILING an

# TICKY_TICKY can't be used together, so we omit TICKY_TICKY for now.
rts_dist_MKDEPENDC_OPTS += -DPROFILING -DTHREADED_RTS -DDEBUG

509
ifeq "$(USE_DTRACE)" "YES"
510 511 512 513 514

rts_dist_MKDEPENDC_OPTS += -Irts/dist/build

endif

515
$(eval $(call dependencies,rts,dist,1))
Ian Lynagh's avatar
Ian Lynagh committed
516

517 518 519 520
$(rts_dist_depfile_c_asm) : $(DTRACEPROBES_H)
ifneq "$(UseSystemLibFFI)" "YES"
$(rts_dist_depfile_c_asm) : $(libffi_HEADERS)
endif
Ian Lynagh's avatar
Ian Lynagh committed
521

522 523 524
# -----------------------------------------------------------------------------
# compile dtrace probes if dtrace is supported

525
ifeq "$(USE_DTRACE)" "YES"
526 527 528 529

rts_CC_OPTS		+= -DDTRACE
rts_HC_OPTS		+= -DDTRACE

530 531 532 533 534
# Apple's dtrace (the only one supported by ghc at the moment) uses
# gcc as its preprocessor. If gcc isn't at /usr/bin/gcc, or we need
# to force it to use a different gcc, we need to give the path in
# the option cpppath.

535 536 537 538 539 540
ifeq "$(TargetOS_CPP)" "darwin"
# Darwin has a flag to tell dtrace which cpp to use.
# Unfortunately, this isn't supported on Solaris (See Solaris Dynamic Tracing
# Guide, Chapter 16, for the configuration variables available on Solaris)
DTRACE_FLAGS = -x cpppath=$(WhatGccIsCalled)
endif
541

542 543 544
DTRACEPROBES_SRC = rts/RtsProbes.d
$(DTRACEPROBES_H): $(DTRACEPROBES_SRC) includes/ghcplatform.h | $$(dir $$@)/.
	"$(DTRACE)" $(filter -I%,$(rts_CC_OPTS)) -C $(DTRACE_FLAGS) -h -o $@ -s $<
545 546
endif

Ian Lynagh's avatar
Ian Lynagh committed
547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
# -----------------------------------------------------------------------------
# The RTS package config

# If -DDEBUG is in effect, adjust package conf accordingly..
ifneq "$(strip $(filter -optc-DDEBUG,$(GhcRtsHcOpts)))" ""
rts_PACKAGE_CPP_OPTS += -DDEBUG
endif

ifeq "$(HaveLibMingwEx)" "YES"
rts_PACKAGE_CPP_OPTS += -DHAVE_LIBMINGWEX
endif

$(eval $(call manual-package-config,rts))

rts/package.conf.inplace : $(includes_H_CONFIG) $(includes_H_PLATFORM)

# -----------------------------------------------------------------------------
# installing

566
RTS_INSTALL_LIBS += $(ALL_RTS_LIBS)
567
ifneq "$(UseSystemLibFFI)" "YES"
ian@well-typed.com's avatar
ian@well-typed.com committed
568 569
RTS_INSTALL_LIBS += $(wildcard rts/dist/build/lib$(LIBFFI_NAME)*$(soext)*)
RTS_INSTALL_LIBS += $(foreach w,$(filter-out %dyn,$(rts_WAYS)),rts/dist/build/libC$(LIBFFI_NAME)$($w_libsuf))
570
endif
Ian Lynagh's avatar
Ian Lynagh committed
571

572
ifneq "$(UseSystemLibFFI)" "YES"
573
install: install_libffi_headers
574
endif
575 576 577 578 579 580

.PHONY: install_libffi_headers
install_libffi_headers :
	$(call INSTALL_DIR,"$(DESTDIR)$(ghcheaderdir)")
	$(call INSTALL_HEADER,$(INSTALL_OPTS),$(libffi_HEADERS),"$(DESTDIR)$(ghcheaderdir)/")

Ian Lynagh's avatar
Ian Lynagh committed
581 582 583 584 585 586 587
# -----------------------------------------------------------------------------
# cleaning

$(eval $(call clean-target,rts,dist,rts/dist))

BINDIST_EXTRAS += rts/package.conf.in