Makefile 28.4 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
# Our standard cleaning rules don't know that we're doing our output
# into $(odir), so we have to augment CLEAN_FILES appropriateliy.
162

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

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).
#
rrt's avatar
rrt committed
184
ifneq "$(way)" "dll"
sof's avatar
sof committed
185
ifneq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
186
HS_PROG=$(odir)/ghc$(_way)-$(ProjectVersion)
rrt's avatar
rrt committed
187
else
188
HS_PROG=$(odir)/ghc$(_way)
rrt's avatar
rrt committed
189 190
endif
else
191
HS_PROG=$(odir)/ghc-$(ProjectVersion)
rrt's avatar
rrt committed
192
endif
193

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

200
CONFIG_HS 	= main/Config.hs
201 202 203 204
boot :: $(CONFIG_HS)

$(CONFIG_HS) : $(FPTOOLS_TOP)/mk/config.mk Makefile
	@$(RM) -f $(CONFIG_HS)
205
	@echo "Creating $(CONFIG_HS) ... "
206 207 208 209
	@echo "module Config where" >>$(CONFIG_HS)
	@echo "cProjectName          = \"$(ProjectName)\"" >> $(CONFIG_HS)
	@echo "cProjectVersion       = \"$(ProjectVersion)\"" >> $(CONFIG_HS)
	@echo "cProjectVersionInt    = \"$(ProjectVersionInt)\"" >> $(CONFIG_HS)
210
	@echo "cProjectPatchLevel    = \"$(ProjectPatchLevel)\"" >> $(CONFIG_HS)
211
	@echo "cBooterVersion        = \"$(GhcVersion)\"" >> $(CONFIG_HS)
212 213
	@echo "cHscIfaceFileVersion  = \"$(HscIfaceFileVersion)\"" >> $(CONFIG_HS)
	@echo "cGhcWithNativeCodeGen = \"$(GhcWithNativeCodeGen)\"" >> $(CONFIG_HS)
214
	@echo "cGhcUnregisterised    = \"$(GhcUnregisterised)\"" >> $(CONFIG_HS)
215
	@echo "cLeadingUnderscore    = \"$(LeadingUnderscore)\"" >> $(CONFIG_HS)
216
	@echo "cRAWCPP_FLAGS         = \"$(RAWCPP_FLAGS)\"" >> $(CONFIG_HS)
217
	@echo "cGCC                  = \"$(WhatGccIsCalled)\"" >> $(CONFIG_HS)
218
	@echo "cMKDLL                = \"$(BLD_DLL)\"" >> $(CONFIG_HS)
219 220 221 222 223 224 225 226 227 228 229 230
	@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)
231 232
	@echo "cGHC_CP               = \"$(GHC_CP)\"" >> $(CONFIG_HS)
	@echo "cGHC_PERL             = \"$(GHC_PERL)\"" >> $(CONFIG_HS)
rrt's avatar
rrt committed
233 234 235 236
ifeq ($(GhcWithIlx),YES)
	@echo "cILX2IL               = \"$(ILX2IL)\"" >> $(CONFIG_HS)
	@echo "cILASM                = \"$(ILASM)\"" >> $(CONFIG_HS)
endif
237 238 239 240 241 242 243 244
	@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)
245

246 247 248 249 250 251 252 253 254 255
# -----------------------------------------------------------------------------
# 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

256
stage1/$(PLATFORM_H) : stage_dirs $(FPTOOLS_TOP)/mk/config.mk Makefile
257 258 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
	@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).
302
stage2/$(PLATFORM_H) : stage_dirs $(FPTOOLS_TOP)/mk/config.mk Makefile
303 304 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
	@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."

345
stage3/$(PLATFORM_H) : stage_dirs stage2/$(PLATFORM_H)
346 347
	$(CP) stage2/$(PLATFORM_H) stage3/$(PLATFORM_H)

348 349 350
STAGE_PLATFORM_H = stage$(stage)/$(PLATFORM_H)

boot :: $(STAGE_PLATFORM_H)
351 352 353

SRC_HC_OPTS += -Istage$(stage)

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

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

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

367 368 369
# HsGeneric.hs is not used just now
EXCLUDED_SRCS += hsSyn/HsGeneric.hs

370
ifeq ($(GhcWithNativeCodeGen),YES)
371
ALL_DIRS += nativeGen
372 373
else
SRC_HC_OPTS += -DOMIT_NATIVE_CODEGEN
rrt's avatar
rrt committed
374 375
endif

376
ifeq ($(GhcWithIlx),YES)
377
ALL_DIRS += ilxGen
378 379
SRC_HC_OPTS += -DILX
endif
380

381
ifeq ($(GhcWithJavaGen),YES)
382
ALL_DIRS += javaGen
383 384 385
SRC_HC_OPTS += -DJAVA
endif

386 387
ifeq "$(BootingFromHc)" "YES"
# HC files are always from a self-booted compiler
388
bootstrapped = YES
389
else
390 391 392
ifneq "$(findstring $(stage), 2 3)" ""
bootstrapped = YES
else
393
bootstrapped = $(shell if (test $(GhcCanonVersion) -eq $(ProjectVersionInt) -a $(GhcPatchLevel) -eq $(ProjectPatchLevel)); then echo YES; else echo NO; fi)
394
endif
395
endif
396

397 398 399 400 401 402 403
# -----------------------------------------------------------------------------
# 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.

404
ifeq "$(GhcWithInterpreter) $(bootstrapped)" "YES YES"
405 406

# Yes, include the interepreter, readline, and Template Haskell extensions
407
SRC_HC_OPTS += -DGHCI -package template-haskell
408
PKG_DEPENDS += template-haskell
409

410
# Use threaded RTS with GHCi, so threads don't get blocked at the prompt.
411
# SRC_HC_OPTS += -threaded
412

413
ALL_DIRS += ghci
414

415 416 417 418 419 420 421 422 423 424
# If we are going to use dynamic libraries instead of .o files for ghci,
# we will need to always retain CAFs in the compiler.
# ghci/keepCAFsForGHCi contains a GNU C __attribute__((constructor))
# function which sets the keepCAFs flag for the RTS before any Haskell
# code is run.
ifeq "$(GhcBuildDylibs)" "YES"
else
EXCLUDED_SRCS += ghci/keepCAFsForGHCi.c
endif

425 426 427 428 429 430 431 432 433 434 435
# 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
436
PKG_DEPENDS += readline
437 438 439 440
endif
else
ifeq "$(GhcLibsWithReadline)" "YES"
SRC_HC_OPTS += -package readline -DUSE_READLINE
441
PKG_DEPENDS += readline
442 443 444 445
endif
endif # stage=1
endif # not windows

446
else
447

448 449
# No interpreter, so exclude Template Haskell modules
EXCLUDED_SRCS += deSugar/DsMeta.hs typecheck/TcSplice.lhs hsSyn/Convert.lhs
450 451

endif # bootstrapped with interpreter
452

453 454
# -----------------------------------------------
# mkdependC stuff
sof's avatar
sof committed
455 456 457 458
#
# Big Fudge to get around inherent problem that Makefile setup
# has got with 'mkdependC'.
# 
459 460 461 462 463
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)
464

465
# -----------------------------------------------------------------------------
466
# 		Haskell compilations
467

468
SRC_HC_OPTS += \
469
  -cpp -fglasgow-exts -fno-generics -Rghc-timing \
470
  -I. -IcodeGen -InativeGen -Iparser
sof's avatar
sof committed
471

472 473 474 475
# 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"
476 477 478 479 480
# 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
481 482 483 484 485
#
# 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)
486

487 488 489 490
# 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
491
else
492
SRC_HC_OPTS += -package unix
493
PKG_DEPENDS += unix
494
endif
495
endif
496

497 498 499
# We use the Cabal package in stages 2/3 only; in stage 1 we're using
# the libcompat library which provides the Cabal modules.
ifneq "$(stage)" "1"
500
SRC_HC_OPTS += -package Cabal
501
PKG_DEPENDS += Cabal
502 503
endif

504 505 506 507 508 509 510
ifeq "$(ghc_ge_603)" "YES"
# Ignore lang, to avoid potential clash with the Generics module if
# lang happens to be a dependency of some exposed package in the local
# GHC installation (eg. wxHaskell did this around 6.4).
SRC_HC_OPTS += -ignore-package lang
endif

511
SRC_CC_OPTS += -Iparser -I. -O
512
SRC_HC_OPTS += -recomp $(GhcHcOpts) $(GhcStage$(stage)HcOpts)
513
SRC_HC_OPTS += -H16M
514

515 516 517 518
ifeq "$(BootingFromHc)" "YES"
SRC_CC_OPTS += -D__GLASGOW_HASKELL__=$(ProjectVersionInt)
endif

519 520 521 522
# 	Special flags for particular modules
#	The standard suffix rule for compiling a Haskell file
#	adds these flags to the command line

523 524 525
# There used to be a -no-recomp flag on PrimOp, but why?
# It's an expensive module to recompile!
prelude/PrimOp_HC_OPTS 		= -H80m
526

527

528
main/ParsePkgConf_HC_OPTS	+= -fno-warn-incomplete-patterns
529 530 531
parser/Parser_HC_OPTS 		+= -fno-warn-incomplete-patterns

ifeq "$(ghc_ge_603)" "NO"
sof's avatar
sof committed
532 533
# Use -fvia-C since the NCG can't handle the narrow16Int# (and intToInt16#?)
# primops on all platforms.
534 535 536 537 538 539 540
parser/Parser_HC_OPTS		+= -fvia-C
# because the NCG can't handle the 64-bit math in here
prelude/PrelRules_HC_OPTS	+= -fvia-C
# ByteCodeItbls uses primops that the NCG doesn't support.
ghci/ByteCodeItbls_HC_OPTS	+= -fvia-C
ghci/ByteCodeLink_HC_OPTS	+= -fvia-C -monly-3-regs
endif
541

542 543 544 545 546
# 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
547

sof's avatar
sof committed
548
ifeq "$(HOSTPLATFORM)" "hppa1.1-hp-hpux9"
549
rename/RnMonad_HC_OPTS 		=  -O2 -O2-for-C
sof's avatar
sof committed
550
endif
551

552
utils/Digraph_HC_OPTS		= -fglasgow-exts 
sof's avatar
sof committed
553

554 555
basicTypes/SrcLoc_HC_OPTS	= -funbox-strict-fields

556 557 558 559
ifeq "$(bootstrapped)" "YES"
utils/Binary_HC_OPTS		= -funbox-strict-fields
endif

560 561
# We always optimise some low-level modules, otherwise performance of
# a non-optimised compiler is severely affected.
562 563 564
main/BinIface_HC_OPTS		+= -O
utils/Binary_HC_OPTS		+= -O
utils/FastMutInt_HC_OPTS	+= -O
565 566 567
utils/Encoding_HC_OPTS		+= -O
utils/StringBuffer_HC_OPTS	+= -O
utils/FastString_HC_OPTS	+= -O
568

569 570 571 572 573
# ---- Profiling ----
#simplCore/Simplify_HC_OPTS = -auto-all
#simplCore/SimplEnv_HC_OPTS = -auto-all
#simplCore/SimplUtils_HC_OPTS = -auto-all

574 575 576 577 578 579 580 581 582
# 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.
ghci/InteractiveUI_HC_OPTS	= -fno-cse
main/CmdLineOpts_HC_OPTS	= -fno-cse
main/DriverMkDepend_HC_OPTS	= -fno-cse
main/DriverPipeline_HC_OPTS	= -fno-cse
main/Finder_HC_OPTS		= -fno-cse
583
main/SysTools_HC_OPTS		= -fno-cse
584
main/StaticFlags_HC_OPTS	= -fno-cse
585

586 587 588
# 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
589
ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
sof's avatar
sof committed
590
main/SysTools_HC_OPTS		+= '-\#include <windows.h>' '-\#include <process.h>'
591 592
endif

593 594
parser/Lexer_HC_OPTS += -funbox-strict-fields

595 596 597 598
# 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"'

599 600 601 602 603 604
# ----------------------------------------------------------------------------
#		Generate supporting stuff for prelude/PrimOp.lhs 
#		from prelude/primops.txt

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

605 606 607 608 609 610 611 612 613 614 615
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

616 617 618
CLEAN_FILES += prelude/primops.txt
CLEAN_FILES += $(PRIMOP_BITS)

619
SRC_CPP_OPTS += -I$(GHC_INCLUDE_DIR)
apt's avatar
apt committed
620
SRC_CPP_OPTS += ${GhcCppOpts}
sof's avatar
sof committed
621

622
ifneq "$(BootingFromHc)" "YES"
sof's avatar
sof committed
623
prelude/PrimOp.lhs $(odir)/prelude/PrimOp.o: $(PRIMOP_BITS)
624
endif
625

626
ifneq "$(BootingFromHc)" "YES"
627
depend :: $(PRIMOP_BITS)
628
endif
629

ken's avatar
ken committed
630
primop-data-decl.hs-incl: prelude/primops.txt
631
	$(GENPOC) --data-decl          < $< > $@
ken's avatar
ken committed
632
primop-tag.hs-incl: prelude/primops.txt
633
	$(GENPOC) --primop-tag         < $< > $@
ken's avatar
ken committed
634
primop-list.hs-incl: prelude/primops.txt
635
	$(GENPOC) --primop-list        < $< > $@
ken's avatar
ken committed
636
primop-has-side-effects.hs-incl: prelude/primops.txt
637
	$(GENPOC) --has-side-effects   < $< > $@
ken's avatar
ken committed
638
primop-out-of-line.hs-incl: prelude/primops.txt
639
	$(GENPOC) --out-of-line        < $< > $@
ken's avatar
ken committed
640
primop-commutable.hs-incl: prelude/primops.txt
641
	$(GENPOC) --commutable         < $< > $@
ken's avatar
ken committed
642
primop-needs-wrapper.hs-incl: prelude/primops.txt
643
	$(GENPOC) --needs-wrapper      < $< > $@
ken's avatar
ken committed
644
primop-can-fail.hs-incl: prelude/primops.txt
645
	$(GENPOC) --can-fail           < $< > $@
ken's avatar
ken committed
646
primop-strictness.hs-incl: prelude/primops.txt
647
	$(GENPOC) --strictness         < $< > $@
ken's avatar
ken committed
648
primop-primop-info.hs-incl: prelude/primops.txt
649
	$(GENPOC) --primop-primop-info < $< > $@
650

651 652 653 654 655
# 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              < $< > $@

656

657 658 659
#-----------------------------------------------------------------------------
# 		Linking

660 661
# Include libghccompat in stage1 only.  In stage2 onwards, all these
# libraries will be available from the main libraries.
662

663
ifeq "$(stage)" "1"
664
include $(GHC_LIB_COMPAT_DIR)/compat.mk
665 666
endif

667
SRC_LD_OPTS += -no-link-chk
668

669 670 671
# -----------------------------------------------------------------------------
# create ghc-inplace, a convenient way to run ghc from the build tree...

672
all :: $(odir)/ghc-inplace ghc-inplace
673

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

680
ghc-inplace : stage1/ghc-inplace
681
	$(LN_S) -f $< $@
682 683

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

685 686 687
#-----------------------------------------------------------------------------
# 		install

688
# We don't want ghc treated as an ordinary executable,
689
# but put it together with the libraries.
rrt's avatar
rrt committed
690
# Also don't want any interface files installed
691

692 693
DESTDIR = $(INSTALL_LIBRARY_DIR_GHC)

sof's avatar
sof committed
694
ifneq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
695
INSTALL_LIBEXECS += $(HS_PROG)
rrt's avatar
rrt committed
696 697 698
else
INSTALL_PROGS += $(HS_PROG)
endif
699

700 701 702
# ----------------------------------------------------------------------------
# profiling.

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 738 739 740 741
# 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
742
# parser/Parser_HC_OPTS += -fasm
743

744
#-----------------------------------------------------------------------------
745
# Building the GHC package
746

747 748 749
# The GHC package is made from the stage 2 build.  Fortunately the
# package build system framework more or less does the right thing for
# us here.
750

751
ifeq "$(stage)" "2"
752
PACKAGE = ghc
753 754 755 756
HIERARCHICAL_LIB = NO
VERSION = $(ProjectVersion)
PKG_DEPENDS += base haskell98
PACKAGE_CPP_OPTS += -DPKG_DEPENDS='$(PKG_DEPENDS)'
757

758 759 760 761
# disable splitting: it won't really help with GHC, and the specialised
# build system for ghc/compiler isn't set up to handle it.
SplitObjs = NO

762 763 764 765 766
# the package build system likes to set WAYS=$(GhcLibWays), but we don't 
# really want to build the whole of GHC multiple ways... if you do,
# set GhcCompilerWays instead.
GhcLibWays = $(GhcCompilerWays)

767 768 769
# override $(GhcLibHcOpts): we want GhcStage2HcOpts to take precedence
GhcLibHcOpts =

770 771
# override default definition of HS_IFACES so we can add $(odir)
HS_IFACES   = $(addsuffix .$(way_)hi,$(basename $(HS_OBJS)))
772 773 774

# Haddock can't handle recursive modules currently, so we disable it for now.
NO_HADDOCK_DOCS = YES
775 776
endif

777 778 779
#-----------------------------------------------------------------------------
# 		clean

780
MAINTAINER_CLEAN_FILES += parser/Parser.info main/ParsePkgConf.info
781 782 783 784

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

785 786 787 788
# Don't use the default MKDEPENDHS stuff... we'll do our own, below
MKDEPENDHS_SRCS =
MKDEPENDC_SRCS =

789 790
# Make doesn't work this out for itself, it seems
parser/Parser.y : parser/Parser.y.pp
791
EXTRA_SRCS += parser/Parser.y
792

793 794 795 796 797 798 799 800 801 802

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


803
include $(TOP)/mk/target.mk
804 805 806 807

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

808
MKDEPENDHS_HC_OPTS = $(patsubst -i$(odir)/%, -i%, $(HC_OPTS))
809 810 811 812

MKDEPENDHS=$(HC)

# Must do this *after* including target.mk, because $(HS_SRCS) isn't set yet.
813
depend :: $(STAGE_PLATFORM_H) $(HS_SRCS) $(C_SRCS)
814 815
	touch .depend-BASE
ifneq "$(BootingFromHc)" "YES"
816
	$(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)
817
endif
818
	$(MKDEPENDC) -f .depend-BASE $(MKDEPENDC_OPTS) $(foreach way,$(WAYS),-s $(way)) -- $(CC_OPTS) -- $(C_SRCS) 
819
	$(PERL) -pe 'binmode(stdin); binmode(stdout); s@^(\S*\.o)@stage$(stage)/$$1@g; s@(\S*\.hi)@stage$(stage)/$$1@g; s@^.*/lib/compat.*$$@@g;' <.depend-BASE >.depend-$(stage)
820
# The binmode stuff tells perl not to add stupid ^M's to the output
821 822
#
# The /lib/compat replacement is to workaround a bug in the
823 824 825
# -optdep--exclude-module flag in GHC 6.4.  It is not required for any
# other version of GHC, but doesn't do any harm.

826
-include .depend-$(stage)