Makefile 27.2 KB
Newer Older
1
# -----------------------------------------------------------------------------
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Main ghc/compiler Makefile

# Targets:
#
#	all	builds stage1 compiler
#
#	boot stage=N   generate build dirs and dependencies for stage N.
#		       NB. Must be done before 'make stageN'.
#		       NB. Cannot 'make boot stage=2' until stage1 has
#		           been built (similarly for stage3).
#
#	stage1  (or stage=1) builds stage1 compiler
#	stage2  (or stage=2) builds stage2 compiler
#	stage3  (or stage=3) builds stage3 compiler
#
17

18
TOP = ..
19
20
21
22
23

# Use GHC for compiling C bits (NB. must be before boilerplate include)
#
UseGhcForCc = YES

24
include $(TOP)/mk/boilerplate.mk
25

26
27
28
#-----------------------------------------------------------------------------
# Counting source code lines

29
30
31
32
USER_SRCS = $(filter-out $(DERIVED_SRCS),$(SRCS))
count :
	./count_lines $(USER_SRCS)

33
#-----------------------------------------------------------------------------
34
# Building ghc different ways (default is just `normal' sequential)
35

36
WAYS=$(GhcCompilerWays)
37

38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# -----------------------------------------------------------------------------
# Bootstrapping

# The stage1/stage2/stage3 business is quite delicate.  Here's how it works:
# 
#  - the variable $(stage) holds the current stage number.  To build a 
#    particular stage, you say 'make stage=N' where N is 1, 2, or 3.
#    N defaults to 1.
#
#  - for stage N, object files and .hi files are placed inside 
#    the directory stageN, in subdirectories as per the sources.
#
#  - .hi-boot files are *linked* into the stageN tree, because in GHC 5.05+
#    the .hi-boot file must reside in the same place as the .hi file.
#
#  - we use explicit -o and -ohi options to direct the output from C & 
#    Haskell compilations.
#
#  - we generate a different .depend file for each build.  They need to be
#    different, because each stage might include different files: stage1
#    might not include GHCi, for example.  For each stage, a normal .depend
#    file is generated, and then post-processed to add the correct stageN/
#    prefix to each object and .hi filename.  The resulting .depend file
#    is named .depend-$(stage).  See the end of this Makefile for details.
#
#  - normal implicit rules don't work any more, because they're of the form
#
#        %.o : %.hs 
#
#    whereas we really need 
#
#	 stageN/%.o : %.hs
#
#    so suffix.mk now defines the appropriate suffix rules when
#    $(odir) is set to a non-empty value.  Here we set $(odir) to
#    stage1, stage2, or stage3.
#
#  There are other plausible designs that might work, but each has different
#  problems:
#
#  - using -odir and -hidir: GHC <= 4.08 doesn't support -hidir, and
#    anyway -odir puts all the objects in one directory (strips off the
#    subdirectory part), which eventually forces us to use VPATH to find
#    the sources.  I have a really bad feeling about VPATH.
#
#  - invoke make in the stageN subdirectory.  This probably requires VPATH
#    too.
#
#  - create a link tree.  The problem with requiring link trees is that 
#    Windows doesn't support symbolic links.

89
90
91
92
ifeq "$(stage)" ""
stage=1
endif

93
94
.DUMMY: stage_dir
stage_dirs :
95
96
97
98
	$(MKDIRHIER) stage$(stage)
	for i in $(ALL_DIRS); do \
	    $(MKDIRHIER) stage$(stage)/$$i; \
	done
99

100
101
102
103
104
105
106
107
108
ifeq "$(stage) $(ghc_ge_603)" "1 YES"
UsingHsBoot = YES
else
ifneq "$(findstring $(stage), 2 3)" ""
UsingHsBoot = YES
else
UsingHsBoot = NO
endif
endif
109

110
boot :: stage_dirs
111
112
113
114
115
116
117
118
119
# On Windows, we can't use symbolic links for the -hi-boot files
# because GHC itself is a Mingw program and does not understand
# symbolic links.  So we have to copy the files instead of link them.
# That means that if you modify a .hi-boot file in Windows, you
# have to to say 'make boot' again.
#
# PS: 'ln -s foo baz' takes 'foo' relative to the path to 'baz'
#     whereas 'cp foo baz' treats the two paths independently.
#     Hence the "../.." in the ln command line
120
ifeq "$(UsingHsBoot)" "NO"
121
122
ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
	for i in */*hi-boot*; do \
sof's avatar
sof committed
123
	    cp -u -f $$i stage$(stage)/$$i; \
124
125
	done
else
126
	for i in */*hi-boot*; do \
127
	    $(LN_S) -f ../../$$i stage$(stage)/$$i || true ; \
128
	done
129
endif
130
endif
131
132
133
134
135
136
137
138
139
140
141
142
143

ifeq "$(stage)" "1"
HC=$(GHC)
endif

ifeq "$(stage)" "2"
HC=$(GHC_STAGE1)
endif

ifeq "$(stage)" "3"
HC=$(GHC_STAGE2)
endif

144
stage1 ::
145
146
	$(MAKE) stage=1

147
stage2 ::
148
149
	$(MAKE) stage=2

150
stage3 ::
151
152
153
154
155
156
157
158
159
	$(MAKE) stage=3

odir=stage$(stage)

SRC_HC_OPTS += $(patsubst %, -i$(odir)/%, $(ALL_DIRS))

HS_OBJS = $(patsubst %, $(odir)/%, $(addsuffix .$(way_)o,$(basename $(HS_SRCS))))
C_OBJS = $(patsubst %, $(odir)/%, $(addsuffix .$(way_)o,$(basename $(C_SRCS))))

160
161
162
# Our standard cleaning rules don't know that we're doing our output into $(odir), so
# we have to augment CLEAN_FILES appropriateliy.

163
164
CLEAN_FILES += $(odir)/*/*.hi

165
166
167
168
ifeq "$(UsingHsBoot)" "YES"
CLEAN_FILES += $(odir)/*/*.hi-boot $(odir)/*/*.o-boot
endif

169
170
171
172
173
174
ifeq "$(stage)" "1"
mostlyclean clean distclean maintainer-clean ::
	$(MAKE) $@ stage=2
	$(MAKE) $@ stage=3
endif

175
# -----------------------------------------------------------------------------
176
#		Set HS_PROG
177

sof's avatar
sof committed
178
# Note: there have been reports of people running up against the ARG_MAX limit
179
# when linking ghc with all its constituent object files. The likely source of 
sof's avatar
sof committed
180
# the problem is that the environment is a bit too big, so a workaround could
rrt's avatar
rrt committed
181
# be to do `env PATH=$(PATH) make ghc' to minimise the environment. (or the
sof's avatar
sof committed
182
183
# equivalent of `env' if it doesn't exist locally).
#
184
ifneq "$(BuildPackageGHC)" "YES"
rrt's avatar
rrt committed
185
ifneq "$(way)" "dll"
sof's avatar
sof committed
186
ifneq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
187
HS_PROG=$(odir)/ghc$(_way)-$(ProjectVersion)
rrt's avatar
rrt committed
188
else
189
HS_PROG=$(odir)/ghc$(_way)
rrt's avatar
rrt committed
190
191
endif
else
192
HS_PROG=$(odir)/ghc-$(ProjectVersion)
rrt's avatar
rrt committed
193
endif
194
endif
195

196
197
# -----------------------------------------------------------------------------
# Create compiler configuration
198
199
200
#
# The 'echo' commands simply spit the values of various make variables
# into Config.hs, whence they can be compiled and used by GHC itself
201

202
CONFIG_HS 	= main/Config.hs
203
204
205
206
boot :: $(CONFIG_HS)

$(CONFIG_HS) : $(FPTOOLS_TOP)/mk/config.mk Makefile
	@$(RM) -f $(CONFIG_HS)
207
	@echo "Creating $(CONFIG_HS) ... "
208
209
210
211
	@echo "module Config where" >>$(CONFIG_HS)
	@echo "cProjectName          = \"$(ProjectName)\"" >> $(CONFIG_HS)
	@echo "cProjectVersion       = \"$(ProjectVersion)\"" >> $(CONFIG_HS)
	@echo "cProjectVersionInt    = \"$(ProjectVersionInt)\"" >> $(CONFIG_HS)
212
	@echo "cProjectPatchLevel    = \"$(ProjectPatchLevel)\"" >> $(CONFIG_HS)
213
	@echo "cBooterVersion        = \"$(GhcVersion)\"" >> $(CONFIG_HS)
214
215
	@echo "cHscIfaceFileVersion  = \"$(HscIfaceFileVersion)\"" >> $(CONFIG_HS)
	@echo "cGhcWithNativeCodeGen = \"$(GhcWithNativeCodeGen)\"" >> $(CONFIG_HS)
216
	@echo "cGhcUnregisterised    = \"$(GhcUnregisterised)\"" >> $(CONFIG_HS)
217
	@echo "cLeadingUnderscore    = \"$(LeadingUnderscore)\"" >> $(CONFIG_HS)
218
	@echo "cRAWCPP_FLAGS         = \"$(RAWCPP_FLAGS)\"" >> $(CONFIG_HS)
219
	@echo "cGCC                  = \"$(WhatGccIsCalled)\"" >> $(CONFIG_HS)
220
	@echo "cMKDLL                = \"$(BLD_DLL)\"" >> $(CONFIG_HS)
221
222
223
224
225
226
227
228
229
230
231
232
	@echo "cPROJECT_DIR          = \"$(PROJECT_DIR)\"" >> $(CONFIG_HS)
	@echo "cGHC_DRIVER_DIR_REL   = \"$(GHC_DRIVER_DIR_REL)\"" >> $(CONFIG_HS)
	@echo "cGHC_TOUCHY_PGM       = \"$(GHC_TOUCHY_PGM)\"" >> $(CONFIG_HS)
	@echo "cGHC_TOUCHY_DIR_REL   = \"$(GHC_TOUCHY_DIR_REL)\"" >> $(CONFIG_HS)
	@echo "cGHC_UNLIT_PGM        = \"$(GHC_UNLIT_PGM)\"" >> $(CONFIG_HS)
	@echo "cGHC_UNLIT_DIR_REL    = \"$(GHC_UNLIT_DIR_REL)\"" >> $(CONFIG_HS)
	@echo "cGHC_MANGLER_PGM      = \"$(GHC_MANGLER_PGM)\"" >> $(CONFIG_HS)
	@echo "cGHC_MANGLER_DIR_REL  = \"$(GHC_MANGLER_DIR_REL)\"" >> $(CONFIG_HS)
	@echo "cGHC_SPLIT_PGM        = \"$(GHC_SPLIT_PGM)\"" >> $(CONFIG_HS)
	@echo "cGHC_SPLIT_DIR_REL    = \"$(GHC_SPLIT_DIR_REL)\"" >> $(CONFIG_HS)
	@echo "cGHC_SYSMAN_PGM       = \"$(GHC_SYSMAN)\"" >> $(CONFIG_HS)
	@echo "cGHC_SYSMAN_DIR_REL   = \"$(GHC_SYSMAN_DIR)\"" >> $(CONFIG_HS)
233
234
	@echo "cGHC_CP               = \"$(GHC_CP)\"" >> $(CONFIG_HS)
	@echo "cGHC_PERL             = \"$(GHC_PERL)\"" >> $(CONFIG_HS)
rrt's avatar
rrt committed
235
236
237
238
ifeq ($(GhcWithIlx),YES)
	@echo "cILX2IL               = \"$(ILX2IL)\"" >> $(CONFIG_HS)
	@echo "cILASM                = \"$(ILASM)\"" >> $(CONFIG_HS)
endif
239
240
241
242
243
244
245
246
	@echo "cEnableWin32DLLs      = \"$(EnableWin32DLLs)\"" >> $(CONFIG_HS)
	@echo "cCONTEXT_DIFF         = \"$(CONTEXT_DIFF)\"" >> $(CONFIG_HS)
	@echo "cUSER_WAY_NAMES       = \"$(USER_WAY_NAMES)\"" >> $(CONFIG_HS)
	@echo "cUSER_WAY_OPTS        = \"$(USER_WAY_OPTS)\"" >> $(CONFIG_HS)
	@echo "cDEFAULT_TMPDIR       = \"$(DEFAULT_TMPDIR)\"" >> $(CONFIG_HS)
	@echo done.

CLEAN_FILES += $(CONFIG_HS)
247

248
249
250
251
252
253
254
255
256
257
# -----------------------------------------------------------------------------
# Create platform includes

# Here we generate a little header file containing CPP symbols that GHC
# uses to determine which platform it is building on/for.  The platforms
# can differ between stage1 and stage2 if we're cross-compiling, so we
# need one of these header files per stage.

PLATFORM_H = ghc_boot_platform.h

258
stage1/$(PLATFORM_H) : stage_dirs $(FPTOOLS_TOP)/mk/config.mk Makefile
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
	@echo "Creating $@..."
	@$(RM) $@
	@echo "#ifndef __PLATFORM_H__"  >$@
	@echo "#define __PLATFORM_H__" >>$@
	@echo >> $@
	@echo "#define BuildPlatform_TYPE  $(BuildPlatform_CPP)" >> $@
	@echo "#define HostPlatform_TYPE   $(HostPlatform_CPP)" >> $@
	@echo "#define TargetPlatform_TYPE $(TargetPlatform_CPP)" >> $@
	@echo >> $@
	@echo "#define $(BuildPlatform_CPP)_BUILD  	1" >> $@
	@echo "#define $(HostPlatform_CPP)_HOST		1" >> $@
	@echo "#define $(TargetPlatform_CPP)_TARGET	1" >> $@
	@echo >> $@
	@echo "#define $(BuildArch_CPP)_BUILD_ARCH  	1" >> $@
	@echo "#define $(HostArch_CPP)_HOST_ARCH	1" >> $@
	@echo "#define $(TargetArch_CPP)_TARGET_ARCH	1" >> $@
	@echo "#define BUILD_ARCH \"$(BuildArch_CPP)\"" >> $@
	@echo "#define HOST_ARCH \"$(HostArch_CPP)\"" >> $@
	@echo "#define TARGET_ARCH \"$(TargetArch_CPP)\"" >> $@
	@echo >> $@
	@echo "#define $(BuildOS_CPP)_BUILD_OS 		1" >> $@
	@echo "#define $(HostOS_CPP)_HOST_OS		1" >> $@
	@echo "#define $(TargetOS_CPP)_TARGET_OS	1" >> $@  
	@echo "#define BUILD_OS \"$(BuildOS_CPP)\"" >> $@
	@echo "#define HOST_OS \"$(HostOS_CPP)\"" >> $@
	@echo "#define TARGET_OS \"$(TargetOS_CPP)\"" >> $@
ifeq "$(HostOS_CPP)" "irix"
	@echo "#ifndef $(IRIX_MAJOR)_TARGET_OS		 " >> $@  
	@echo "#define $(IRIX_MAJOR)_TARGET_OS		1" >> $@  
	@echo "#endif					 " >> $@  
endif
	@echo >> $@
	@echo "#define $(BuildVendor_CPP)_BUILD_VENDOR 	1" >> $@
	@echo "#define $(HostVendor_CPP)_HOST_VENDOR	1" >> $@
	@echo "#define $(TargetVendor_CPP)_TARGET_VENDOR  1" >> $@
	@echo "#define BUILD_VENDOR \"$(BuildVendor_CPP)\"" >> $@
	@echo "#define HOST_VENDOR \"$(HostVendor_CPP)\"" >> $@
	@echo "#define TARGET_VENDOR \"$(TargetVendor_CPP)\"" >> $@
	@echo >> $@
	@echo "#endif /* __PLATFORM_H__ */"          >> $@
	@echo "Done."

# For stage2 and above, the BUILD platform is the HOST of stage1, and
# the HOST platform is the TARGET of stage1.  The TARGET remains the same
# (stage1 is the cross-compiler, not stage2).
304
stage2/$(PLATFORM_H) : stage_dirs $(FPTOOLS_TOP)/mk/config.mk Makefile
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
	@echo "Creating $@..."
	@$(RM) $@
	@echo "#ifndef __PLATFORM_H__"  >$@
	@echo "#define __PLATFORM_H__" >>$@
	@echo >> $@
	@echo "#define BuildPlatform_TYPE  $(HostPlatform_CPP)" >> $@
	@echo "#define HostPlatform_TYPE   $(TargetPlatform_CPP)" >> $@
	@echo "#define TargetPlatform_TYPE $(TargetPlatform_CPP)" >> $@
	@echo >> $@
	@echo "#define $(HostPlatform_CPP)_BUILD  	1" >> $@
	@echo "#define $(TargetPlatform_CPP)_HOST		1" >> $@
	@echo "#define $(TargetPlatform_CPP)_TARGET	1" >> $@
	@echo >> $@
	@echo "#define $(HostArch_CPP)_BUILD_ARCH  	1" >> $@
	@echo "#define $(TargetArch_CPP)_HOST_ARCH	1" >> $@
	@echo "#define $(TargetArch_CPP)_TARGET_ARCH	1" >> $@
	@echo "#define BUILD_ARCH \"$(HostArch_CPP)\"" >> $@
	@echo "#define HOST_ARCH \"$(TargetArch_CPP)\"" >> $@
	@echo "#define TARGET_ARCH \"$(TargetArch_CPP)\"" >> $@
	@echo >> $@
	@echo "#define $(HostOS_CPP)_BUILD_OS 		1" >> $@
	@echo "#define $(TargetOS_CPP)_HOST_OS		1" >> $@
	@echo "#define $(TargetOS_CPP)_TARGET_OS	1" >> $@  
	@echo "#define BUILD_OS \"$(HostOS_CPP)\"" >> $@
	@echo "#define HOST_OS \"$(TargetOS_CPP)\"" >> $@
	@echo "#define TARGET_OS \"$(TargetOS_CPP)\"" >> $@
ifeq "$(HostOS_CPP)" "irix"
	@echo "#ifndef $(IRIX_MAJOR)_TARGET_OS		 " >> $@  
	@echo "#define $(IRIX_MAJOR)_TARGET_OS		1" >> $@  
	@echo "#endif					 " >> $@  
endif
	@echo >> $@
	@echo "#define $(HostVendor_CPP)_BUILD_VENDOR 	1" >> $@
	@echo "#define $(TargetVendor_CPP)_HOST_VENDOR	1" >> $@
	@echo "#define $(TargetVendor_CPP)_TARGET_VENDOR  1" >> $@
	@echo "#define BUILD_VENDOR \"$(HostVendor_CPP)\"" >> $@
	@echo "#define HOST_VENDOR \"$(TargetVendor_CPP)\"" >> $@
	@echo "#define TARGET_VENDOR \"$(TargetVendor_CPP)\"" >> $@
	@echo >> $@
	@echo "#endif /* __PLATFORM_H__ */"          >> $@
	@echo "Done."

347
stage3/$(PLATFORM_H) : stage_dirs stage2/$(PLATFORM_H)
348
349
	$(CP) stage2/$(PLATFORM_H) stage3/$(PLATFORM_H)

350
351
352
STAGE_PLATFORM_H = stage$(stage)/$(PLATFORM_H)

boot :: $(STAGE_PLATFORM_H)
353
354
355

SRC_HC_OPTS += -Istage$(stage)

356
# -----------------------------------------------------------------------------
357
# Set SRCS etc.
358
#
359
# First figure out ALL_DIRS, the source sub-directories
360

361
ALL_DIRS = \
362
  utils basicTypes types hsSyn prelude rename typecheck deSugar coreSyn \
363
  specialise simplCore stranal stgSyn simplStg codeGen main \
364
  profiling parser cprAnalysis compMan ndpFlatten iface cmm
365

366
367
368
# Make sure we include Config.hs even if it doesn't exist yet...
ALL_SRCS += $(CONFIG_HS)

369
370
371
# HsGeneric.hs is not used just now
EXCLUDED_SRCS += hsSyn/HsGeneric.hs

372
373
374
# main/GHC.hs is not ready yet
EXCLUDED_SRCS += main/GHC.hs

375
ifeq ($(GhcWithNativeCodeGen),YES)
376
ALL_DIRS += nativeGen
377
378
else
SRC_HC_OPTS += -DOMIT_NATIVE_CODEGEN
rrt's avatar
rrt committed
379
380
endif

381
ifeq ($(GhcWithIlx),YES)
382
ALL_DIRS += ilxGen
383
384
SRC_HC_OPTS += -DILX
endif
385

386
ifeq ($(GhcWithJavaGen),YES)
387
ALL_DIRS += javaGen
388
389
390
SRC_HC_OPTS += -DJAVA
endif

391
392
ifeq "$(BootingFromHc)" "YES"
# HC files are always from a self-booted compiler
393
bootstrapped = YES
394
else
395
396
397
ifneq "$(findstring $(stage), 2 3)" ""
bootstrapped = YES
else
398
bootstrapped = $(shell if (test $(GhcCanonVersion) -ge $(ProjectVersionInt) -a $(GhcPatchLevel) -ge $(ProjectPatchLevel)); then echo YES; else echo NO; fi)
399
endif
400
endif
401

402
403
404
405
406
407
408
# -----------------------------------------------------------------------------
# Building a compiler with interpreter support
#
# The interpreter, GHCi interface, and Template Haskell are only
# enabled when we are bootstrapping with the same version of GHC, and
# the interpreter is supported on this platform.

409
ifeq "$(GhcWithInterpreter) $(bootstrapped)" "YES YES"
410
411

# Yes, include the interepreter, readline, and Template Haskell extensions
412
SRC_HC_OPTS += -DGHCI -package template-haskell
413

414
ALL_DIRS += ghci
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434

# Enable readline if either:
#   - we're building stage 1 and $(GhcHasReadline)="YES"
#   - we're building stage 2/3, and we have built the readline package
#
# But we don't enable readline on Windows, because readline is fairly
# broken there.
#
ifneq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
ifeq "$(stage)" "1"
ifeq "$(GhcHasReadline)" "YES"
SRC_HC_OPTS += -package readline -DUSE_READLINE
endif
else
ifeq "$(GhcLibsWithReadline)" "YES"
SRC_HC_OPTS += -package readline -DUSE_READLINE
endif
endif # stage=1
endif # not windows

435
else
436

437
438
# No interpreter, so exclude Template Haskell modules
EXCLUDED_SRCS += deSugar/DsMeta.hs typecheck/TcSplice.lhs hsSyn/Convert.lhs
439
440

endif # bootstrapped with interpreter
441

442
443
# -----------------------------------------------
# mkdependC stuff
sof's avatar
sof committed
444
445
446
447
#
# Big Fudge to get around inherent problem that Makefile setup
# has got with 'mkdependC'.
# 
448
449
450
451
452
SRC_MKDEPENDC_OPTS += -D__GLASGOW_HASKELL__=$(ProjectVersionInt)

# XXX not really correct, hschooks.c actually gets include files like
# RtsFlags.c from the installed GHC, but we can't tell mkdependC about that.
SRC_MKDEPENDC_OPTS += -I$(GHC_INCLUDE_DIR)
453

454
# -----------------------------------------------------------------------------
455
# 		Haskell compilations
456

457
SRC_HC_OPTS += \
458
  -cpp -fglasgow-exts -fno-generics -Rghc-timing \
459
  -I. -IcodeGen -InativeGen -Iparser
sof's avatar
sof committed
460

461
462
463
464
# Omitted: 	-I$(GHC_INCLUDE_DIR)
# We should have -I$(GHC_INCLUDE_DIR) in SRC_HC_OPTS, 
# to avoid the use of an explicit path in GHC source files
#	(include "../includes/config.h"
465
466
467
468
469
# But alas GHC 4.08 (and others for all I know) uses this very
# same include path when compiling the .hc files it generates.
# Disaster!  Then the hc file sees the GHC 5.02 (or whatever)
# include files.   For the moment we've reverted to using
# an explicit path in the .hs sources
sof's avatar
sof committed
470
471
472
473
474
#
# For the benefit of <5.00 compilers, do include GHC_INCLUDE_DIR
# when generating dependencies. (=> it gets passed onto mkdependHS,
# which needs it).
SRC_MKDEPENDHS_OPTS += -I$(GHC_INCLUDE_DIR)
475

476
477
478
479
# We need System.Posix (or Posix when ghc < 6.2)
ifneq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
ifeq "$(bootstrapped) $(ghc_ge_601)" "NO NO"
SRC_HC_OPTS += -package posix
480
else
481
SRC_HC_OPTS += -package unix
482
endif
483
endif
484

485
486
487
488
ifneq "$(findstring YES, $(bootstrapped) $(ghc_ge_603))" ""
SRC_HC_OPTS += -package Cabal
endif

489
SRC_CC_OPTS += -Iparser -I. -O
490
SRC_HC_OPTS += -recomp $(GhcHcOpts) $(GhcStage$(stage)HcOpts)
491
SRC_HC_OPTS += -H16M
492

493
494
495
496
ifeq "$(BootingFromHc)" "YES"
SRC_CC_OPTS += -D__GLASGOW_HASKELL__=$(ProjectVersionInt)
endif

497
498
499
500
# 	Special flags for particular modules
#	The standard suffix rule for compiling a Haskell file
#	adds these flags to the command line

501
502
503
# There used to be a -no-recomp flag on PrimOp, but why?
# It's an expensive module to recompile!
prelude/PrimOp_HC_OPTS 		= -H80m
504
505
506

# because the NCG can't handle the 64-bit math in here
prelude/PrelRules_HC_OPTS	= -fvia-C
507

508
main/ParsePkgConf_HC_OPTS	+= -fno-warn-incomplete-patterns
sof's avatar
sof committed
509
510
# Use -fvia-C since the NCG can't handle the narrow16Int# (and intToInt16#?)
# primops on all platforms.
511
parser/Parser_HC_OPTS 		+= -fno-warn-incomplete-patterns -fvia-C
512

513
514
515
516
517
# Careful optimisation of the parser: we don't want to throw everything
# at it, because that takes too long and doesn't buy much, but we do want
# to inline certain key external functions, so we instruct GHC not to
# throw away inlinings as it would normally do in -Onot mode:
parser/Parser_HC_OPTS		+= -Onot -fno-ignore-interface-pragmas
518

sof's avatar
sof committed
519
ifeq "$(HOSTPLATFORM)" "hppa1.1-hp-hpux9"
520
rename/RnMonad_HC_OPTS 		=  -O2 -O2-for-C
sof's avatar
sof committed
521
endif
522

523
utils/Digraph_HC_OPTS		= -fglasgow-exts 
sof's avatar
sof committed
524

525
526
basicTypes/SrcLoc_HC_OPTS	= -funbox-strict-fields

527
528
529
530
ifeq "$(bootstrapped)" "YES"
utils/Binary_HC_OPTS		= -funbox-strict-fields
endif

531
# ByteCodeItbls uses primops that the NCG doesn't support yet.
532
533
534
535
536
537
538
539
ghci/ByteCodeItbls_HC_OPTS	+= -fvia-C
ghci/ByteCodeLink_HC_OPTS	+= -fvia-C -monly-3-regs

# BinIface and Binary take ages to both compile and run if you don's use -O
main/BinIface_HC_OPTS		+= -O
utils/Binary_HC_OPTS		+= -O
utils/FastMutInt_HC_OPTS	+= -O

540

541
542
543
544
545
# ---- Profiling ----
#simplCore/Simplify_HC_OPTS = -auto-all
#simplCore/SimplEnv_HC_OPTS = -auto-all
#simplCore/SimplUtils_HC_OPTS = -auto-all

546
547
548
549
550
551
552
553
554
555
# CSE interacts badly with top-level IORefs (reportedly in DriverState and
# DriverMkDepend), causing some of them to be commoned up.  We have a fix for
# this in 5.00+, but earlier versions of the compiler will need CSE turned off.
# To be on the safe side, we disable CSE in *all* modules with top-level IORefs.
compMan/CompManager_HC_OPTS	= -fno-cse
ghci/InteractiveUI_HC_OPTS	= -fno-cse
main/CmdLineOpts_HC_OPTS	= -fno-cse
main/DriverFlags_HC_OPTS	= -fno-cse
main/DriverMkDepend_HC_OPTS	= -fno-cse
main/DriverPipeline_HC_OPTS	= -fno-cse
556
main/DriverState_HC_OPTS	= -fno-cse
557
558
main/DriverUtil_HC_OPTS		= -fno-cse
main/Finder_HC_OPTS		= -fno-cse
559
main/SysTools_HC_OPTS		= -fno-cse
560

561
562
563
# The #include is vital for the via-C route, else the C
# compiler doesn't realise that the stcall foreign imports are indeed
# stdcall, and doesn't generate the Foo@8 name for them
sof's avatar
sof committed
564
ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
sof's avatar
sof committed
565
main/SysTools_HC_OPTS		+= '-\#include <windows.h>' '-\#include <process.h>'
566
567
endif

568
569
parser/Lexer_HC_OPTS += -funbox-strict-fields

570
571
572
573
# ghc_strlen percolates through so many modules that it is easier to get its
# prototype via a global option instead of a myriad of per-file OPTIONS
SRC_HC_OPTS += '-\#include "hschooks.h"'

574
575
576
577
578
579
# ----------------------------------------------------------------------------
#		Generate supporting stuff for prelude/PrimOp.lhs 
#		from prelude/primops.txt

GENPOC=$(TOP)/utils/genprimopcode/genprimopcode

580
581
582
583
584
585
586
587
588
589
590
PRIMOP_BITS=primop-data-decl.hs-incl \
            primop-tag.hs-incl  \
            primop-list.hs-incl  \
            primop-has-side-effects.hs-incl  \
            primop-out-of-line.hs-incl  \
            primop-commutable.hs-incl  \
            primop-needs-wrapper.hs-incl  \
            primop-can-fail.hs-incl  \
            primop-strictness.hs-incl  \
            primop-primop-info.hs-incl

591
592
593
CLEAN_FILES += prelude/primops.txt
CLEAN_FILES += $(PRIMOP_BITS)

594
SRC_CPP_OPTS += -I$(GHC_INCLUDE_DIR)
apt's avatar
apt committed
595
SRC_CPP_OPTS += ${GhcCppOpts}
sof's avatar
sof committed
596

597
ifneq "$(BootingFromHc)" "YES"
sof's avatar
sof committed
598
prelude/PrimOp.lhs $(odir)/prelude/PrimOp.o: $(PRIMOP_BITS)
599
endif
600

601
ifneq "$(BootingFromHc)" "YES"
602
depend :: $(PRIMOP_BITS)
603
endif
604

ken's avatar
ken committed
605
primop-data-decl.hs-incl: prelude/primops.txt
606
	$(GENPOC) --data-decl          < $< > $@
ken's avatar
ken committed
607
primop-tag.hs-incl: prelude/primops.txt
608
	$(GENPOC) --primop-tag         < $< > $@
ken's avatar
ken committed
609
primop-list.hs-incl: prelude/primops.txt
610
	$(GENPOC) --primop-list        < $< > $@
ken's avatar
ken committed
611
primop-has-side-effects.hs-incl: prelude/primops.txt
612
	$(GENPOC) --has-side-effects   < $< > $@
ken's avatar
ken committed
613
primop-out-of-line.hs-incl: prelude/primops.txt
614
	$(GENPOC) --out-of-line        < $< > $@
ken's avatar
ken committed
615
primop-commutable.hs-incl: prelude/primops.txt
616
	$(GENPOC) --commutable         < $< > $@
ken's avatar
ken committed
617
primop-needs-wrapper.hs-incl: prelude/primops.txt
618
	$(GENPOC) --needs-wrapper      < $< > $@
ken's avatar
ken committed
619
primop-can-fail.hs-incl: prelude/primops.txt
620
	$(GENPOC) --can-fail           < $< > $@
ken's avatar
ken committed
621
primop-strictness.hs-incl: prelude/primops.txt
622
	$(GENPOC) --strictness         < $< > $@
ken's avatar
ken committed
623
primop-primop-info.hs-incl: prelude/primops.txt
624
	$(GENPOC) --primop-primop-info < $< > $@
625

626
627
628
629
630
# Usages aren't used any more; but the generator 
# can still generate them if we want them back
primop-usage.hs-incl: prelude/primops.txt
	$(GENPOC) --usage              < $< > $@

631

632
633
634
#-----------------------------------------------------------------------------
# 		Linking

635
636
# Include libghccompat in stage1 only.  In stage2 onwards, all these
# libraries will be available from the main libraries.
637
638
639
ifeq "$(stage)" "1"
SRC_HC_OPTS += -i$(GHC_LIB_COMPAT_DIR)
SRC_LD_OPTS += -L$(GHC_LIB_COMPAT_DIR) -lghccompat
640

641
642
643
644
645
ifeq "$(Windows)" "YES"
# not very nice, but required for -lghccompat on Windows
SRC_LD_OPTS += -lshell32
endif

646
647
648
649
# This is horrible.  We ought to be able to omit the entire directory
# from mkDependHS.
SRC_MKDEPENDHS_OPTS += \
	-optdep--exclude-module=Compat.RawSystem \
650
	-optdep--exclude-module=Compat.Directory \
651
652
	-optdep--exclude-module=Distribution.Compat.ReadP \
	-optdep--exclude-module=Distribution.Extension \
653
	-optdep--exclude-module=Distribution.GetOpt \
654
	-optdep--exclude-module=Distribution.InstalledPackageInfo \
655
656
657
658
659
	-optdep--exclude-module=Distribution.License \
	-optdep--exclude-module=Distribution.Package \
	-optdep--exclude-module=Distribution.ParseUtils \
	-optdep--exclude-module=Distribution.Setup \
	-optdep--exclude-module=Distribution.Version \
660
	-optdep--exclude-module=System.Directory.Internals
661
662
endif

663
SRC_LD_OPTS += -no-link-chk
664

665
666
667
# -----------------------------------------------------------------------------
# create ghc-inplace, a convenient way to run ghc from the build tree...

668
all :: $(odir)/ghc-inplace ghc-inplace
669

670
$(odir)/ghc-inplace : $(HS_PROG)
671
672
	@$(RM) $@
	echo '#!/bin/sh' >>$@
sof's avatar
sof committed
673
	echo exec $(FPTOOLS_TOP_ABS)/ghc/compiler/$(HS_PROG) '-B$(subst \,\\,$(FPTOOLS_TOP_ABS_PLATFORM))' '"$$@"' >>$@
674
675
	chmod 755 $@

676
ghc-inplace : stage1/ghc-inplace
677
	$(LN_S) -f $< $@
678
679

CLEAN_FILES += $(odir)/ghc-inplace ghc-inplace
680

681
682
683
#-----------------------------------------------------------------------------
# 		install

684
# We don't want ghc treated as an ordinary executable,
685
# but put it together with the libraries.
rrt's avatar
rrt committed
686
# Also don't want any interface files installed
687

688
689
DESTDIR = $(INSTALL_LIBRARY_DIR_GHC)

sof's avatar
sof committed
690
ifneq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
691
INSTALL_LIBEXECS += $(HS_PROG)
rrt's avatar
rrt committed
692
693
694
else
INSTALL_PROGS += $(HS_PROG)
endif
695

696
697
698
# ----------------------------------------------------------------------------
# profiling.

699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
# rename/RnBinds_HC_OPTS += -auto-all
# rename/RnEnv_HC_OPTS += -auto-all
# rename/RnExpr_HC_OPTS += -auto-all
# rename/RnHiFiles_HC_OPTS += -auto-all
# rename/RnHsSyn_HC_OPTS += -auto-all
# rename/Rename_HC_OPTS += -auto-all
# rename/RnIfaces_HC_OPTS += -auto-all
# rename/RnNames_HC_OPTS += -auto-all
# rename/RnSource_HC_OPTS += -auto-all
# rename/RnTypes_HC_OPTS += -auto-all
# 
# typecheck/Inst_HC_OPTS += -auto-all
# typecheck/TcBinds_HC_OPTS += -auto-all
# typecheck/TcClassDcl_HC_OPTS += -auto-all
# typecheck/TcDefaults_HC_OPTS += -auto-all
# typecheck/TcDeriv_HC_OPTS += -auto-all
# typecheck/TcEnv_HC_OPTS += -auto-all
# typecheck/TcExpr_HC_OPTS += -auto-all
# typecheck/TcForeign_HC_OPTS += -auto-all
# typecheck/TcGenDeriv_HC_OPTS += -auto-all
# typecheck/TcHsSyn_HC_OPTS += -auto-all
# typecheck/TcIfaceSig_HC_OPTS += -auto-all
# typecheck/TcInstDcls_HC_OPTS += -auto-all
# typecheck/TcMatches_HC_OPTS += -auto-all
# typecheck/TcMonoType_HC_OPTS += -auto-all
# typecheck/TcMType_HC_OPTS += -auto-all
# typecheck/TcPat_HC_OPTS += -auto-all
# typecheck/TcRnDriver_HC_OPTS += -auto-all
# #typecheck/TcRnMonad_HC_OPTS += -auto-all
# #typecheck/TcRnTypes_HC_OPTS += -auto-all
# typecheck/TcRules_HC_OPTS += -auto-all
# typecheck/TcSimplify_HC_OPTS += -auto-all
# typecheck/TcSplice_HC_OPTS += -auto-all
# typecheck/TcTyClsDecls_HC_OPTS += -auto-all
# typecheck/TcTyDecls_HC_OPTS += -auto-all
# typecheck/TcType_HC_OPTS += -auto-all
# typecheck/TcUnify_HC_OPTS += -auto-all

coreSyn/CorePrep_HC_OPTS += -auto-all
738

739
740
741
742
743
744
#-----------------------------------------------------------------------------
# Building GHC package

ifeq "$(BuildPackageGHC)" "YES"

PACKAGE = ghc
745
VERSION = 6.4
746
STANDALONE_PACKAGE = YES
747
PACKAGE_DEPS =
748
749
750

endif

751
752
753
#-----------------------------------------------------------------------------
# 		clean

754
MAINTAINER_CLEAN_FILES += parser/Parser.info main/ParsePkgConf.info
755
756
757
758

#-----------------------------------------------------------------------------
# 		Include target-rule boilerplate

759
760
761
762
# Don't use the default MKDEPENDHS stuff... we'll do our own, below
MKDEPENDHS_SRCS =
MKDEPENDC_SRCS =

763
764
# Make doesn't work this out for itself, it seems
parser/Parser.y : parser/Parser.y.pp
765
EXTRA_SRCS += parser/Parser.y
766

767
768
769
770
771
772
773
774
775
776

#-----------------------------------------------------------------------------
# 		Source files for tags file generation
#
# We want to excluded derived sources, because they won't be in the source
# tree, which is where we are going to move the TAGS file to.a

TAGS_HS_SRCS = parser/Parser.y.pp $(filter-out $(DERIVED_SRCS) main/Config.hs parser/Parser.y, $(sort $(SRCS)))


777
include $(TOP)/mk/target.mk
778
779
780
781

# -----------------------------------------------------------------------------
# Dependencies

782
MKDEPENDHS_HC_OPTS = $(patsubst -i$(odir)/%, -i%, $(HC_OPTS))
783
784
785
786

MKDEPENDHS=$(HC)

# Must do this *after* including target.mk, because $(HS_SRCS) isn't set yet.
787
depend :: $(STAGE_PLATFORM_H) $(HS_SRCS) $(C_SRCS)
788
789
	touch .depend-BASE
ifneq "$(BootingFromHc)" "YES"
790
	$(MKDEPENDHS) -M -optdep-f -optdep.depend-BASE $(foreach way,$(WAYS),-optdep-s -optdep$(way)) $(foreach obj,$(MKDEPENDHS_OBJ_SUFFICES),-osuf $(obj)) $(MKDEPENDHS_OPTS) $(filter-out -split-objs, $(MKDEPENDHS_HC_OPTS)) $(HS_SRCS)
791
endif
792
	$(MKDEPENDC) -f .depend-BASE $(MKDEPENDC_OPTS) $(foreach way,$(WAYS),-s $(way)) -- $(CC_OPTS) -- $(C_SRCS) 
793
794
	$(PERL) -pe 'binmode(stdin); binmode(stdout); s@^(\S*\.o)@stage$(stage)/$$1@g; s@(\S*\.hi)@stage$(stage)/$$1@g' <.depend-BASE >.depend-$(stage)
# The binmode stuff tells perl not to add stupid ^M's to the output
795
796

-include .depend-$(stage)