Makefile 22.7 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
89
90
91
92
93
# -----------------------------------------------------------------------------
# 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.

boot ::
	$(MKDIRHIER) stage$(stage)
	for i in $(ALL_DIRS); do \
	    $(MKDIRHIER) stage$(stage)/$$i; \
	done
94
95
96
97
98
99
100
101
102
103
104
# 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
ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
	for i in */*hi-boot*; do \
sof's avatar
sof committed
105
	    cp -u -f $$i stage$(stage)/$$i; \
106
107
	done
else
108
	for i in */*hi-boot*; do \
109
	    $(LN_S) -f ../../$$i stage$(stage)/$$i || true ; \
110
	done
111
endif
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128

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

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

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

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

129
stage1 ::
130
131
	$(MAKE) stage=1

132
stage2 ::
133
134
	$(MAKE) stage=2

135
stage3 ::
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
	$(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))))

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

ifeq "$(stage)" "1"
mostlyclean clean distclean maintainer-clean ::
	$(MAKE) $@ stage=2
	$(MAKE) $@ stage=3
endif

153
# -----------------------------------------------------------------------------
154
#		Set HS_PROG
155

sof's avatar
sof committed
156
# Note: there have been reports of people running up against the ARG_MAX limit
157
# when linking ghc with all its constituent object files. The likely source of 
sof's avatar
sof committed
158
# the problem is that the environment is a bit too big, so a workaround could
rrt's avatar
rrt committed
159
# be to do `env PATH=$(PATH) make ghc' to minimise the environment. (or the
sof's avatar
sof committed
160
161
# equivalent of `env' if it doesn't exist locally).
#
162
ifneq "$(BuildPackageGHC)" "YES"
rrt's avatar
rrt committed
163
ifneq "$(way)" "dll"
sof's avatar
sof committed
164
ifneq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
165
HS_PROG=$(odir)/ghc$(_way)-$(ProjectVersion)
rrt's avatar
rrt committed
166
else
167
HS_PROG=$(odir)/ghc$(_way)
rrt's avatar
rrt committed
168
169
endif
else
170
HS_PROG=$(odir)/ghc-$(ProjectVersion)
rrt's avatar
rrt committed
171
endif
172
endif
173

174
175
# -----------------------------------------------------------------------------
# Create compiler configuration
176
177
178
#
# The 'echo' commands simply spit the values of various make variables
# into Config.hs, whence they can be compiled and used by GHC itself
179

180
CONFIG_HS 	= main/Config.hs
181
182
183
184
boot :: $(CONFIG_HS)

$(CONFIG_HS) : $(FPTOOLS_TOP)/mk/config.mk Makefile
	@$(RM) -f $(CONFIG_HS)
185
	@echo "Creating $(CONFIG_HS) ... "
186
187
188
189
	@echo "module Config where" >>$(CONFIG_HS)
	@echo "cProjectName          = \"$(ProjectName)\"" >> $(CONFIG_HS)
	@echo "cProjectVersion       = \"$(ProjectVersion)\"" >> $(CONFIG_HS)
	@echo "cProjectVersionInt    = \"$(ProjectVersionInt)\"" >> $(CONFIG_HS)
190
	@echo "cProjectPatchLevel    = \"$(ProjectPatchLevel)\"" >> $(CONFIG_HS)
191
	@echo "cBooterVersion        = \"$(GhcVersion)\"" >> $(CONFIG_HS)
192
193
	@echo "cHscIfaceFileVersion  = \"$(HscIfaceFileVersion)\"" >> $(CONFIG_HS)
	@echo "cTARGETPLATFORM       = \"$(TARGETPLATFORM)\"" >> $(CONFIG_HS)
194
195
	@echo "cTARGETOS             = \"$(TargetOS_CPP)\"" >> $(CONFIG_HS)
	@echo "cTARGETARCH           = \"$(TargetArch_CPP)\"" >> $(CONFIG_HS)
196
	@echo "cGhcWithNativeCodeGen = \"$(GhcWithNativeCodeGen)\"" >> $(CONFIG_HS)
197
	@echo "cGhcUnregisterised    = \"$(GhcUnregisterised)\"" >> $(CONFIG_HS)
198
	@echo "cLeadingUnderscore    = \"$(LeadingUnderscore)\"" >> $(CONFIG_HS)
199
	@echo "cRAWCPP_FLAGS         = \"$(RAWCPP_FLAGS)\"" >> $(CONFIG_HS)
200
	@echo "cGCC                  = \"$(WhatGccIsCalled)\"" >> $(CONFIG_HS)
201
	@echo "cMKDLL                = \"$(BLD_DLL)\"" >> $(CONFIG_HS)
202
203
204
205
206
207
208
209
210
211
212
213
	@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)
214
215
	@echo "cGHC_CP               = \"$(GHC_CP)\"" >> $(CONFIG_HS)
	@echo "cGHC_PERL             = \"$(GHC_PERL)\"" >> $(CONFIG_HS)
rrt's avatar
rrt committed
216
217
218
219
ifeq ($(GhcWithIlx),YES)
	@echo "cILX2IL               = \"$(ILX2IL)\"" >> $(CONFIG_HS)
	@echo "cILASM                = \"$(ILASM)\"" >> $(CONFIG_HS)
endif
220
221
222
223
224
225
226
227
	@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)
228
229

# -----------------------------------------------------------------------------
230
# Set SRCS etc.
231
#
232
# First figure out ALL_DIRS, the source sub-directories
233

234
ALL_DIRS = \
235
  utils basicTypes types hsSyn prelude rename typecheck deSugar coreSyn \
236
  specialise simplCore stranal stgSyn simplStg codeGen main \
237
  profiling parser cprAnalysis compMan ndpFlatten iface cmm
238

239
240
241
# Make sure we include Config.hs even if it doesn't exist yet...
ALL_SRCS += $(CONFIG_HS)

242
243
244
# HsGeneric.hs is not used just now
EXCLUDED_SRCS += hsSyn/HsGeneric.hs

245
ifeq ($(GhcWithNativeCodeGen),YES)
246
ALL_DIRS += nativeGen
247
248
else
SRC_HC_OPTS += -DOMIT_NATIVE_CODEGEN
rrt's avatar
rrt committed
249
250
endif

251
ifeq ($(GhcWithIlx),YES)
252
ALL_DIRS += ilxGen
253
254
SRC_HC_OPTS += -DILX
endif
255

256
ifeq ($(GhcWithJavaGen),YES)
257
ALL_DIRS += javaGen
258
259
260
SRC_HC_OPTS += -DJAVA
endif

261
262
ifeq "$(BootingFromHc)" "YES"
# HC files are always from a self-booted compiler
263
bootstrapped = YES
sof's avatar
sof committed
264
compiling_with_4xx=NO
265
else
266
267
268
269
ifneq "$(findstring $(stage), 2 3)" ""
bootstrapped = YES
compiling_with_4xx = NO
else
270
bootstrapped = $(shell if (test $(GhcCanonVersion) -ge $(ProjectVersionInt) -a $(GhcPatchLevel) -ge $(ProjectPatchLevel)); then echo YES; else echo NO; fi)
sof's avatar
sof committed
271
compiling_with_4xx = $(shell if (test $(GhcCanonVersion) -lt 500); then echo YES; else echo NO; fi)
272
endif
273
endif
274

275
276
277
278
279
280
281
# -----------------------------------------------------------------------------
# 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.

282
ifeq "$(GhcWithInterpreter) $(bootstrapped)" "YES YES"
283
284

# Yes, include the interepreter, readline, and Template Haskell extensions
285
SRC_HC_OPTS += -DGHCI -package template-haskell -package Cabal
286

287
ifneq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
288
SRC_HC_OPTS += -package unix
289
endif
290

291
ALL_DIRS += ghci
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311

# 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

312
else
313

314
315
# No interpreter, so exclude Template Haskell modules
EXCLUDED_SRCS += deSugar/DsMeta.hs typecheck/TcSplice.lhs hsSyn/Convert.lhs
316
317

endif # bootstrapped with interpreter
318

319
320
# -----------------------------------------------
# mkdependC stuff
sof's avatar
sof committed
321
322
323
324
#
# Big Fudge to get around inherent problem that Makefile setup
# has got with 'mkdependC'.
# 
325
326
327
328
329
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)
330

331
# -----------------------------------------------------------------------------
332
# 		Haskell compilations
333

334
SRC_HC_OPTS += \
335
  -cpp -fglasgow-exts -fno-generics -Rghc-timing \
336
  -I. -IcodeGen -InativeGen -Iparser
sof's avatar
sof committed
337

338
339
340
341
# 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"
342
343
344
345
346
# 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
347
348
349
350
351
#
# 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)
352

353
354
355
# When bootstrapped, we don't make use of *any* packages
# (except possibly readline if GHCi is enabled, see above)
ifneq "$(bootstrapped)" "YES"
sof's avatar
sof committed
356
ifneq "$(mingw32_HOST_OS)" "1"
357
SRC_HC_OPTS += -package concurrent -package posix -package util
358
else
359
SRC_HC_OPTS += -package concurrent -package util
360
endif
361
endif
362

363
SRC_CC_OPTS += -Iparser -I. -O
364
SRC_HC_OPTS += -recomp $(GhcHcOpts) $(GhcStage$(stage)HcOpts)
365
SRC_HC_OPTS += -H16M
366

367
368
369
370
ifeq "$(BootingFromHc)" "YES"
SRC_CC_OPTS += -D__GLASGOW_HASKELL__=$(ProjectVersionInt)
endif

371
372
373
374
# 	Special flags for particular modules
#	The standard suffix rule for compiling a Haskell file
#	adds these flags to the command line

375
376
377
# There used to be a -no-recomp flag on PrimOp, but why?
# It's an expensive module to recompile!
prelude/PrimOp_HC_OPTS 		= -H80m
378
379
380

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

382
main/ParsePkgConf_HC_OPTS	+= -fno-warn-incomplete-patterns
sof's avatar
sof committed
383
384
# Use -fvia-C since the NCG can't handle the narrow16Int# (and intToInt16#?)
# primops on all platforms.
385
parser/Parser_HC_OPTS 		+= -fno-warn-incomplete-patterns -fvia-C
386

387
388
389
390
391
# 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
392

sof's avatar
sof committed
393
ifeq "$(HOSTPLATFORM)" "hppa1.1-hp-hpux9"
394
rename/RnMonad_HC_OPTS 		=  -O2 -O2-for-C
sof's avatar
sof committed
395
endif
396

397
utils/Digraph_HC_OPTS		= -fglasgow-exts 
sof's avatar
sof committed
398

399
400
basicTypes/SrcLoc_HC_OPTS	= -funbox-strict-fields

401
402
403
404
ifeq "$(bootstrapped)" "YES"
utils/Binary_HC_OPTS		= -funbox-strict-fields
endif

405
406
407
408
409
# 4.08.2's NCG can't cope with Binary
ifeq "$(compiling_with_4xx)" "YES"
utils/Binary_HC_OPTS		+= -fvia-C
endif

410
# ByteCodeItbls uses primops that the NCG doesn't support yet.
411
412
413
414
415
416
417
418
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

419

420
421
422
423
424
425
426
427
428
429
# 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
430
main/DriverState_HC_OPTS	= -fno-cse
431
432
main/DriverUtil_HC_OPTS		= -fno-cse
main/Finder_HC_OPTS		= -fno-cse
433
main/SysTools_HC_OPTS		= -fno-cse
434

435
436
437
# 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
438
ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
sof's avatar
sof committed
439
main/SysTools_HC_OPTS		+= '-\#include <windows.h>' '-\#include <process.h>'
440
441
endif

442
443
parser/Lexer_HC_OPTS += -funbox-strict-fields

444
445
446
447
# 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"'

448
449
450
451
452
453
# ----------------------------------------------------------------------------
#		Generate supporting stuff for prelude/PrimOp.lhs 
#		from prelude/primops.txt

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

454
455
456
457
458
459
460
461
462
463
464
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

465
466
467
CLEAN_FILES += prelude/primops.txt
CLEAN_FILES += $(PRIMOP_BITS)

468
SRC_CPP_OPTS += -I$(GHC_INCLUDE_DIR)
apt's avatar
apt committed
469
SRC_CPP_OPTS += ${GhcCppOpts}
sof's avatar
sof committed
470

471
ifneq "$(BootingFromHc)" "YES"
sof's avatar
sof committed
472
prelude/PrimOp.lhs $(odir)/prelude/PrimOp.o: $(PRIMOP_BITS)
473
endif
474

475
ifneq "$(BootingFromHc)" "YES"
476
depend :: $(PRIMOP_BITS)
477
endif
478

ken's avatar
ken committed
479
primop-data-decl.hs-incl: prelude/primops.txt
480
	$(GENPOC) --data-decl          < $< > $@
ken's avatar
ken committed
481
primop-tag.hs-incl: prelude/primops.txt
482
	$(GENPOC) --primop-tag         < $< > $@
ken's avatar
ken committed
483
primop-list.hs-incl: prelude/primops.txt
484
	$(GENPOC) --primop-list        < $< > $@
ken's avatar
ken committed
485
primop-has-side-effects.hs-incl: prelude/primops.txt
486
	$(GENPOC) --has-side-effects   < $< > $@
ken's avatar
ken committed
487
primop-out-of-line.hs-incl: prelude/primops.txt
488
	$(GENPOC) --out-of-line        < $< > $@
ken's avatar
ken committed
489
primop-commutable.hs-incl: prelude/primops.txt
490
	$(GENPOC) --commutable         < $< > $@
ken's avatar
ken committed
491
primop-needs-wrapper.hs-incl: prelude/primops.txt
492
	$(GENPOC) --needs-wrapper      < $< > $@
ken's avatar
ken committed
493
primop-can-fail.hs-incl: prelude/primops.txt
494
	$(GENPOC) --can-fail           < $< > $@
ken's avatar
ken committed
495
primop-strictness.hs-incl: prelude/primops.txt
496
	$(GENPOC) --strictness         < $< > $@
ken's avatar
ken committed
497
primop-primop-info.hs-incl: prelude/primops.txt
498
	$(GENPOC) --primop-primop-info < $< > $@
499

500
501
502
503
504
# 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              < $< > $@

505

506
507
508
#-----------------------------------------------------------------------------
# 		Linking

509
510
# Include libghccompat in stage1 only.  In stage2 onwards, all these
# libraries will be available from the main libraries.
511
512
513
ifeq "$(stage)" "1"
SRC_HC_OPTS += -i$(GHC_LIB_COMPAT_DIR)
SRC_LD_OPTS += -L$(GHC_LIB_COMPAT_DIR) -lghccompat
514

515
516
517
518
519
ifeq "$(Windows)" "YES"
# not very nice, but required for -lghccompat on Windows
SRC_LD_OPTS += -lshell32
endif

520
521
522
523
# This is horrible.  We ought to be able to omit the entire directory
# from mkDependHS.
SRC_MKDEPENDHS_OPTS += \
	-optdep--exclude-module=Compat.RawSystem \
524
	-optdep--exclude-module=Compat.Directory \
525
526
	-optdep--exclude-module=Distribution.Compat.ReadP \
	-optdep--exclude-module=Distribution.Extension \
527
	-optdep--exclude-module=Distribution.GetOpt \
528
	-optdep--exclude-module=Distribution.InstalledPackageInfo \
529
530
531
532
533
534
	-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 \
	-optdep--exclude-module=System.FilePath
535
536
endif

537
SRC_LD_OPTS += -no-link-chk
538

539
540
541
# -----------------------------------------------------------------------------
# create ghc-inplace, a convenient way to run ghc from the build tree...

542
all :: $(odir)/ghc-inplace ghc-inplace
543

544
$(odir)/ghc-inplace : $(HS_PROG)
545
546
	@$(RM) $@
	echo '#!/bin/sh' >>$@
sof's avatar
sof committed
547
	echo exec $(FPTOOLS_TOP_ABS)/ghc/compiler/$(HS_PROG) '-B$(subst \,\\,$(FPTOOLS_TOP_ABS_PLATFORM))' '"$$@"' >>$@
548
549
	chmod 755 $@

550
ghc-inplace : stage1/ghc-inplace
551
	$(LN_S) -f $< $@
552
553

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

555
556
557
#-----------------------------------------------------------------------------
# 		install

558
# We don't want ghc treated as an ordinary executable,
559
# but put it together with the libraries.
rrt's avatar
rrt committed
560
# Also don't want any interface files installed
561

562
563
DESTDIR = $(INSTALL_LIBRARY_DIR_GHC)

sof's avatar
sof committed
564
ifneq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
565
INSTALL_LIBEXECS += $(HS_PROG)
rrt's avatar
rrt committed
566
567
568
else
INSTALL_PROGS += $(HS_PROG)
endif
569

570
571
572
# ----------------------------------------------------------------------------
# profiling.

573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
# 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
612

613
614
615
616
617
618
619
#-----------------------------------------------------------------------------
# Building GHC package

ifeq "$(BuildPackageGHC)" "YES"

PACKAGE = ghc
STANDALONE_PACKAGE = YES
620
PACKAGE_DEPS =
621
622
623

endif

624
625
626
#-----------------------------------------------------------------------------
# 		clean

627
MAINTAINER_CLEAN_FILES += parser/Parser.info main/ParsePkgConf.info
628
629
630
631

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

632
633
634
635
# Don't use the default MKDEPENDHS stuff... we'll do our own, below
MKDEPENDHS_SRCS =
MKDEPENDC_SRCS =

636
637
# Make doesn't work this out for itself, it seems
parser/Parser.y : parser/Parser.y.pp
638
EXTRA_SRCS += parser/Parser.y
639

640
641
642
643
644
645
646
647
648
649

#-----------------------------------------------------------------------------
# 		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)))


650
include $(TOP)/mk/target.mk
651
652
653
654

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

655
MKDEPENDHS_HC_OPTS = $(patsubst -i$(odir)/%, -i%, $(HC_OPTS))
656
657
658
659

MKDEPENDHS=$(HC)

# Must do this *after* including target.mk, because $(HS_SRCS) isn't set yet.
660
depend :: $(HS_SRCS) $(C_SRCS)
661
662
	touch .depend-BASE
ifneq "$(BootingFromHc)" "YES"
663
	$(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)
664
endif
665
	$(MKDEPENDC) -f .depend-BASE $(MKDEPENDC_OPTS) $(foreach way,$(WAYS),-s $(way)) -- $(CC_OPTS) -- $(C_SRCS) 
666
667
	$(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
668
669

-include .depend-$(stage)