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 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).
#
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 compMan 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) -ge $(ProjectVersionInt) -a $(GhcPatchLevel) -ge $(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
ALL_DIRS += ghci
411

412 413 414 415 416 417 418 419 420 421
# 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

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

443
else
444

445 446
# No interpreter, so exclude Template Haskell modules
EXCLUDED_SRCS += deSugar/DsMeta.hs typecheck/TcSplice.lhs hsSyn/Convert.lhs
447 448

endif # bootstrapped with interpreter
449

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

462
# -----------------------------------------------------------------------------
463
# 		Haskell compilations
464

465
SRC_HC_OPTS += \
466
  -cpp -fglasgow-exts -fno-generics -Rghc-timing \
467
  -I. -IcodeGen -InativeGen -Iparser
sof's avatar
sof committed
468

469 470 471 472
# 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"
473 474 475 476 477
# 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
478 479 480 481 482
#
# 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)
483

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

494 495
ifneq "$(findstring YES, $(bootstrapped) $(ghc_ge_603))" ""
SRC_HC_OPTS += -package Cabal
496
PKG_DEPENDS += Cabal
497 498
endif

499
SRC_CC_OPTS += -Iparser -I. -O
500
SRC_HC_OPTS += -recomp $(GhcHcOpts) $(GhcStage$(stage)HcOpts)
501
SRC_HC_OPTS += -H16M
502

503 504 505 506
ifeq "$(BootingFromHc)" "YES"
SRC_CC_OPTS += -D__GLASGOW_HASKELL__=$(ProjectVersionInt)
endif

507 508 509 510
# 	Special flags for particular modules
#	The standard suffix rule for compiling a Haskell file
#	adds these flags to the command line

511 512 513
# There used to be a -no-recomp flag on PrimOp, but why?
# It's an expensive module to recompile!
prelude/PrimOp_HC_OPTS 		= -H80m
514 515 516

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

518
main/ParsePkgConf_HC_OPTS	+= -fno-warn-incomplete-patterns
sof's avatar
sof committed
519 520
# Use -fvia-C since the NCG can't handle the narrow16Int# (and intToInt16#?)
# primops on all platforms.
521
parser/Parser_HC_OPTS 		+= -fno-warn-incomplete-patterns -fvia-C
522

523 524 525 526 527
# 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
528

sof's avatar
sof committed
529
ifeq "$(HOSTPLATFORM)" "hppa1.1-hp-hpux9"
530
rename/RnMonad_HC_OPTS 		=  -O2 -O2-for-C
sof's avatar
sof committed
531
endif
532

533
utils/Digraph_HC_OPTS		= -fglasgow-exts 
sof's avatar
sof committed
534

535 536
basicTypes/SrcLoc_HC_OPTS	= -funbox-strict-fields

537 538 539 540
ifeq "$(bootstrapped)" "YES"
utils/Binary_HC_OPTS		= -funbox-strict-fields
endif

541
# ByteCodeItbls uses primops that the NCG doesn't support yet.
542 543 544 545 546 547 548 549
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

550

551 552 553 554 555
# ---- Profiling ----
#simplCore/Simplify_HC_OPTS = -auto-all
#simplCore/SimplEnv_HC_OPTS = -auto-all
#simplCore/SimplUtils_HC_OPTS = -auto-all

556 557 558 559 560 561 562 563 564 565
# 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/DriverMkDepend_HC_OPTS	= -fno-cse
main/DriverPipeline_HC_OPTS	= -fno-cse
main/Finder_HC_OPTS		= -fno-cse
566
main/SysTools_HC_OPTS		= -fno-cse
567
main/StaticFlags_HC_OPTS	= -fno-cse
568

569 570 571
# 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
572
ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
sof's avatar
sof committed
573
main/SysTools_HC_OPTS		+= '-\#include <windows.h>' '-\#include <process.h>'
574 575
endif

576 577
parser/Lexer_HC_OPTS += -funbox-strict-fields

578 579 580 581
# 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"'

582 583 584 585 586 587
# ----------------------------------------------------------------------------
#		Generate supporting stuff for prelude/PrimOp.lhs 
#		from prelude/primops.txt

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

588 589 590 591 592 593 594 595 596 597 598
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

599 600 601
CLEAN_FILES += prelude/primops.txt
CLEAN_FILES += $(PRIMOP_BITS)

602
SRC_CPP_OPTS += -I$(GHC_INCLUDE_DIR)
apt's avatar
apt committed
603
SRC_CPP_OPTS += ${GhcCppOpts}
sof's avatar
sof committed
604

605
ifneq "$(BootingFromHc)" "YES"
sof's avatar
sof committed
606
prelude/PrimOp.lhs $(odir)/prelude/PrimOp.o: $(PRIMOP_BITS)
607
endif
608

609
ifneq "$(BootingFromHc)" "YES"
610
depend :: $(PRIMOP_BITS)
611
endif
612

ken's avatar
ken committed
613
primop-data-decl.hs-incl: prelude/primops.txt
614
	$(GENPOC) --data-decl          < $< > $@
ken's avatar
ken committed
615
primop-tag.hs-incl: prelude/primops.txt
616
	$(GENPOC) --primop-tag         < $< > $@
ken's avatar
ken committed
617
primop-list.hs-incl: prelude/primops.txt
618
	$(GENPOC) --primop-list        < $< > $@
ken's avatar
ken committed
619
primop-has-side-effects.hs-incl: prelude/primops.txt
620
	$(GENPOC) --has-side-effects   < $< > $@
ken's avatar
ken committed
621
primop-out-of-line.hs-incl: prelude/primops.txt
622
	$(GENPOC) --out-of-line        < $< > $@
ken's avatar
ken committed
623
primop-commutable.hs-incl: prelude/primops.txt
624
	$(GENPOC) --commutable         < $< > $@
ken's avatar
ken committed
625
primop-needs-wrapper.hs-incl: prelude/primops.txt
626
	$(GENPOC) --needs-wrapper      < $< > $@
ken's avatar
ken committed
627
primop-can-fail.hs-incl: prelude/primops.txt
628
	$(GENPOC) --can-fail           < $< > $@
ken's avatar
ken committed
629
primop-strictness.hs-incl: prelude/primops.txt
630
	$(GENPOC) --strictness         < $< > $@
ken's avatar
ken committed
631
primop-primop-info.hs-incl: prelude/primops.txt
632
	$(GENPOC) --primop-primop-info < $< > $@
633

634 635 636 637 638
# 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              < $< > $@

639

640 641 642
#-----------------------------------------------------------------------------
# 		Linking

643 644
# Include libghccompat in stage1 only.  In stage2 onwards, all these
# libraries will be available from the main libraries.
645 646 647
ifeq "$(stage)" "1"
SRC_HC_OPTS += -i$(GHC_LIB_COMPAT_DIR)
SRC_LD_OPTS += -L$(GHC_LIB_COMPAT_DIR) -lghccompat
648

649 650 651 652 653
ifeq "$(Windows)" "YES"
# not very nice, but required for -lghccompat on Windows
SRC_LD_OPTS += -lshell32
endif

654 655 656 657
# This is horrible.  We ought to be able to omit the entire directory
# from mkDependHS.
SRC_MKDEPENDHS_OPTS += \
	-optdep--exclude-module=Compat.RawSystem \
658
	-optdep--exclude-module=Compat.Directory \
659 660
	-optdep--exclude-module=Distribution.Compat.ReadP \
	-optdep--exclude-module=Distribution.Extension \
661
	-optdep--exclude-module=Distribution.GetOpt \
662
	-optdep--exclude-module=Distribution.InstalledPackageInfo \
663 664 665 666 667
	-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 \
668
	-optdep--exclude-module=System.Directory.Internals
669 670
endif

671
SRC_LD_OPTS += -no-link-chk
672

673 674 675
# -----------------------------------------------------------------------------
# create ghc-inplace, a convenient way to run ghc from the build tree...

676
all :: $(odir)/ghc-inplace ghc-inplace
677

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

684
ghc-inplace : stage1/ghc-inplace
685
	$(LN_S) -f $< $@
686 687

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

689 690 691
#-----------------------------------------------------------------------------
# 		install

692
# We don't want ghc treated as an ordinary executable,
693
# but put it together with the libraries.
rrt's avatar
rrt committed
694
# Also don't want any interface files installed
695

696 697
DESTDIR = $(INSTALL_LIBRARY_DIR_GHC)

sof's avatar
sof committed
698
ifneq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
699
INSTALL_LIBEXECS += $(HS_PROG)
rrt's avatar
rrt committed
700 701 702
else
INSTALL_PROGS += $(HS_PROG)
endif
703

704 705 706
# ----------------------------------------------------------------------------
# profiling.

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 742 743 744 745
# 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
746

747
#-----------------------------------------------------------------------------
748
# Building the GHC package
749

750 751 752
# 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.
753

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

761 762 763 764
# 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

765 766 767 768 769
# 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)

770 771 772
# override $(GhcLibHcOpts): we want GhcStage2HcOpts to take precedence
GhcLibHcOpts =

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

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

780 781 782
#-----------------------------------------------------------------------------
# 		clean

783
MAINTAINER_CLEAN_FILES += parser/Parser.info main/ParsePkgConf.info
784 785 786 787

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

788 789 790 791
# Don't use the default MKDEPENDHS stuff... we'll do our own, below
MKDEPENDHS_SRCS =
MKDEPENDC_SRCS =

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

796 797 798 799 800 801 802 803 804 805

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


806
include $(TOP)/mk/target.mk
807 808 809 810

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

811
MKDEPENDHS_HC_OPTS = $(patsubst -i$(odir)/%, -i%, $(HC_OPTS))
812 813 814 815

MKDEPENDHS=$(HC)

# Must do this *after* including target.mk, because $(HS_SRCS) isn't set yet.
816
depend :: $(STAGE_PLATFORM_H) $(HS_SRCS) $(C_SRCS)
817 818
	touch .depend-BASE
ifneq "$(BootingFromHc)" "YES"
819
	$(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)
820
endif
821
	$(MKDEPENDC) -f .depend-BASE $(MKDEPENDC_OPTS) $(foreach way,$(WAYS),-s $(way)) -- $(CC_OPTS) -- $(C_SRCS) 
822 823
	$(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
824 825

-include .depend-$(stage)