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

# -----------------------------------------------------------------------------
Ian Lynagh's avatar
Ian Lynagh committed
14 15 16 17 18 19
# For expressing extra dependencies on source files

define compiler-hs-dependency # args: $1 = module, $2 = dependency

$$(foreach stage,1 2 3,\
 $$(foreach way,$$(compiler_stage$$(stage)_WAYS),\
Ian Lynagh's avatar
Ian Lynagh committed
20
  compiler/stage$$(stage)/build/$1.$$($$(way)_osuf))) : $2
Ian Lynagh's avatar
Ian Lynagh committed
21 22 23 24 25 26 27 28 29 30 31

endef

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

compiler_CONFIG_HS = compiler/main/Config.hs

Ian Lynagh's avatar
Ian Lynagh committed
32 33 34 35 36 37
# This is just to avoid generating a warning when generating deps
# involving RtsFlags.h
compiler_stage1_MKDEPENDC_OPTS = -DMAKING_GHC_BUILD_SYSTEM_DEPENDENCIES
compiler_stage2_MKDEPENDC_OPTS = -DMAKING_GHC_BUILD_SYSTEM_DEPENDENCIES
compiler_stage3_MKDEPENDC_OPTS = -DMAKING_GHC_BUILD_SYSTEM_DEPENDENCIES

38 39
compiler_stage1_C_FILES_NODEPS = compiler/parser/cutils.c

Ian Lynagh's avatar
Ian Lynagh committed
40
ifneq "$(BINDIST)" "YES"
Ian Lynagh's avatar
Ian Lynagh committed
41 42 43
compiler/stage1/package-data.mk : compiler/stage1/build/Config.hs
compiler/stage2/package-data.mk : compiler/stage2/build/Config.hs
compiler/stage3/package-data.mk : compiler/stage3/build/Config.hs
Ian Lynagh's avatar
Ian Lynagh committed
44 45
endif

Ian Lynagh's avatar
Ian Lynagh committed
46
compiler/stage%/build/Config.hs : mk/config.mk mk/project.mk | $$(dir $$@)/.
47
	"$(RM)" $(RM_OPTS) $@
Ian Lynagh's avatar
Ian Lynagh committed
48
	@echo 'Creating $@ ... '
49
	@echo '{-# LANGUAGE CPP #-}'                                        >> $@
Ian Lynagh's avatar
Ian Lynagh committed
50
	@echo 'module Config where'                                         >> $@
51
	@echo                                                               >> $@
52 53
	@echo 'import Distribution.System'                                  >> $@
	@echo                                                               >> $@
54 55
	@echo '#include "ghc_boot_platform.h"'                              >> $@
	@echo                                                               >> $@
56 57 58 59 60 61
	@echo 'cBuildPlatformString :: String'                              >> $@
	@echo 'cBuildPlatformString = BuildPlatform_NAME'                   >> $@
	@echo 'cHostPlatformString :: String'                               >> $@
	@echo 'cHostPlatformString = HostPlatform_NAME'                     >> $@
	@echo 'cTargetPlatformString :: String'                             >> $@
	@echo 'cTargetPlatformString = TargetPlatform_NAME'                 >> $@
62
	@echo                                                               >> $@
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 94 95 96 97 98
# Sync this with checkArch in configure.ac
	@echo 'cTargetArch :: Arch'                                         >> $@
	@echo '#if i386_TARGET_ARCH'                                        >> $@
	@echo 'cTargetArch = I386'                                          >> $@
	@echo '#elif x86_64_TARGET_ARCH'                                    >> $@
	@echo 'cTargetArch = X86_64'                                        >> $@
	@echo '#elif powerpc_TARGET_ARCH'                                   >> $@
	@echo 'cTargetArch = PPC'                                           >> $@
	@echo '#elif powerpc64_TARGET_ARCH'                                 >> $@
	@echo 'cTargetArch = PPC64'                                         >> $@
	@echo '#elif sparc_TARGET_ARCH || sparc64_TARGET_ARCH'              >> $@
	@echo 'cTargetArch = Sparc'                                         >> $@
	@echo '#elif arm_TARGET_ARCH'                                       >> $@
	@echo 'cTargetArch = Arm'                                           >> $@
	@echo '#elif mips_TARGET_ARCH || mipseb_TARGET_ARCH || mipsel_TARGET_ARCH' >> $@
	@echo 'cTargetArch = Mips'                                          >> $@
	@echo '#elif 0'                                                     >> $@
	@echo 'cTargetArch = SH'                                            >> $@
	@echo '#elif ia64_TARGET_ARCH'                                      >> $@
	@echo 'cTargetArch = IA64'                                          >> $@
	@echo '#elif s390_TARGET_ARCH'                                      >> $@
	@echo 'cTargetArch = S390'                                          >> $@
	@echo '#elif alpha_TARGET_ARCH'                                     >> $@
	@echo 'cTargetArch = Alpha'                                         >> $@
	@echo '#elif hppa_TARGET_ARCH || hppa1_1_TARGET_ARCH'               >> $@
	@echo 'cTargetArch = Hppa'                                          >> $@
	@echo '#elif rs6000_TARGET_ARCH'                                    >> $@
	@echo 'cTargetArch = Rs6000'                                        >> $@
	@echo '#elif m68k_TARGET_ARCH'                                      >> $@
	@echo 'cTargetArch = M68k'                                          >> $@
	@echo '#elif vax_TARGET_ARCH'                                       >> $@
	@echo 'cTargetArch = Vax'                                           >> $@
	@echo '#else'                                                       >> $@
	@echo '#error Unknown target arch'                                  >> $@
	@echo '#endif'                                                      >> $@
	@echo                                                               >> $@
Ian Lynagh's avatar
Ian Lynagh committed
99 100 101 102 103 104 105 106 107 108 109 110
	@echo 'cProjectName          :: String'                             >> $@
	@echo 'cProjectName          = "$(ProjectName)"'                    >> $@
	@echo 'cProjectVersion       :: String'                             >> $@
	@echo 'cProjectVersion       = "$(ProjectVersion)"'                 >> $@
	@echo 'cProjectVersionInt    :: String'                             >> $@
	@echo 'cProjectVersionInt    = "$(ProjectVersionInt)"'              >> $@
	@echo 'cProjectPatchLevel    :: String'                             >> $@
	@echo 'cProjectPatchLevel    = "$(ProjectPatchLevel)"'              >> $@
	@echo 'cBooterVersion        :: String'                             >> $@
	@echo 'cBooterVersion        = "$(GhcVersion)"'                     >> $@
	@echo 'cStage                :: String'                             >> $@
	@echo 'cStage                = show (STAGE :: Int)'                 >> $@
111 112 113 114
	@echo 'cCcOpts               :: [String]'                           >> $@
	@echo 'cCcOpts               = words "$(CONF_CC_OPTS_STAGE$*)"'     >> $@
	@echo 'cLdOpts               :: [String]'                           >> $@
	@echo 'cLdOpts               = words "$(CONF_LD_OPTS_STAGE$*)"'     >> $@
Ian Lynagh's avatar
Ian Lynagh committed
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
	@echo 'cIntegerLibrary       :: String'                             >> $@
	@echo 'cIntegerLibrary       = "$(INTEGER_LIBRARY)"'                >> $@
	@echo 'cSplitObjs            :: String'                             >> $@
	@echo 'cSplitObjs            = "$(SupportsSplitObjs)"'              >> $@
	@echo 'cGhcWithInterpreter   :: String'                             >> $@
	@echo 'cGhcWithInterpreter   = "$(GhcWithInterpreter)"'             >> $@
	@echo 'cGhcWithNativeCodeGen :: String'                             >> $@
	@echo 'cGhcWithNativeCodeGen = "$(GhcWithNativeCodeGen)"'           >> $@
	@echo 'cGhcWithSMP           :: String'                             >> $@
	@echo 'cGhcWithSMP           = "$(GhcWithSMP)"'                     >> $@
	@echo 'cGhcRTSWays           :: String'                             >> $@
	@echo 'cGhcRTSWays           = "$(GhcRTSWays)"'                     >> $@
	@echo 'cGhcUnregisterised    :: String'                             >> $@
	@echo 'cGhcUnregisterised    = "$(GhcUnregisterised)"'              >> $@
	@echo 'cGhcEnableTablesNextToCode :: String'                        >> $@
	@echo 'cGhcEnableTablesNextToCode = "$(GhcEnableTablesNextToCode)"' >> $@
	@echo 'cLeadingUnderscore    :: String'                             >> $@
	@echo 'cLeadingUnderscore    = "$(LeadingUnderscore)"'              >> $@
	@echo 'cRAWCPP_FLAGS         :: String'                             >> $@
	@echo 'cRAWCPP_FLAGS         = "$(RAWCPP_FLAGS)"'                   >> $@
	@echo 'cGCC                  :: String'                             >> $@
	@echo 'cGCC                  = "$(WhatGccIsCalled)"'                >> $@
	@echo 'cMKDLL                :: String'                             >> $@
	@echo 'cMKDLL                = "$(BLD_DLL)"'                        >> $@
	@echo 'cLdIsGNULd            :: String'                             >> $@
	@echo 'cLdIsGNULd            = "$(LdIsGNULd)"'                      >> $@
	@echo 'cLD_X                 :: String'                             >> $@
	@echo 'cLD_X                 = "$(LD_X)"'                           >> $@
	@echo 'cGHC_DRIVER_DIR       :: String'                             >> $@
	@echo 'cGHC_DRIVER_DIR       = "$(GHC_DRIVER_DIR)"'                 >> $@
	@echo 'cGHC_TOUCHY_PGM       :: String'                             >> $@
	@echo 'cGHC_TOUCHY_PGM       = "$(GHC_TOUCHY_PGM)"'                 >> $@
	@echo 'cGHC_TOUCHY_DIR       :: String'                             >> $@
	@echo 'cGHC_TOUCHY_DIR       = "$(GHC_TOUCHY_DIR)"'                 >> $@
	@echo 'cGHC_UNLIT_PGM        :: String'                             >> $@
	@echo 'cGHC_UNLIT_PGM        = "$(GHC_UNLIT_PGM)"'                  >> $@
	@echo 'cGHC_UNLIT_DIR        :: String'                             >> $@
	@echo 'cGHC_UNLIT_DIR        = "$(GHC_UNLIT_DIR)"'                  >> $@
	@echo 'cGHC_MANGLER_PGM      :: String'                             >> $@
	@echo 'cGHC_MANGLER_PGM      = "$(GHC_MANGLER_PGM)"'                >> $@
	@echo 'cGHC_MANGLER_DIR      :: String'                             >> $@
	@echo 'cGHC_MANGLER_DIR      = "$(GHC_MANGLER_DIR)"'                >> $@
	@echo 'cGHC_SPLIT_PGM        :: String'                             >> $@
	@echo 'cGHC_SPLIT_PGM        = "$(GHC_SPLIT_PGM)"'                  >> $@
	@echo 'cGHC_SPLIT_DIR        :: String'                             >> $@
	@echo 'cGHC_SPLIT_DIR        = "$(GHC_SPLIT_DIR)"'                  >> $@
	@echo 'cGHC_SYSMAN_PGM       :: String'                             >> $@
	@echo 'cGHC_SYSMAN_PGM       = "$(GHC_SYSMAN)"'                     >> $@
	@echo 'cGHC_SYSMAN_DIR       :: String'                             >> $@
	@echo 'cGHC_SYSMAN_DIR       = "$(GHC_SYSMAN_DIR)"'                 >> $@
	@echo 'cGHC_PERL             :: String'                             >> $@
	@echo 'cGHC_PERL             = "$(GHC_PERL)"'                       >> $@
	@echo 'cDEFAULT_TMPDIR       :: String'                             >> $@
	@echo 'cDEFAULT_TMPDIR       = "$(DEFAULT_TMPDIR)"'                 >> $@
	@echo 'cRelocatableBuild     :: Bool'                               >> $@
Ian Lynagh's avatar
Ian Lynagh committed
170
ifeq "$(RelocatableBuild)" "YES"
Ian Lynagh's avatar
Ian Lynagh committed
171
	@echo 'cRelocatableBuild     = True'                                >> $@
Ian Lynagh's avatar
Ian Lynagh committed
172
else
Ian Lynagh's avatar
Ian Lynagh committed
173
	@echo 'cRelocatableBuild     = False'                               >> $@
Ian Lynagh's avatar
Ian Lynagh committed
174
endif
Ian Lynagh's avatar
Ian Lynagh committed
175
	@echo 'cLibFFI               :: Bool'                               >> $@
Ian Lynagh's avatar
Ian Lynagh committed
176
ifeq "$(UseLibFFIForAdjustors)" "YES"
Ian Lynagh's avatar
Ian Lynagh committed
177
	@echo 'cLibFFI               = True'                                >> $@
Ian Lynagh's avatar
Ian Lynagh committed
178
else
Ian Lynagh's avatar
Ian Lynagh committed
179
	@echo 'cLibFFI               = False'                               >> $@
Ian Lynagh's avatar
Ian Lynagh committed
180 181 182
endif
	@echo done.

Ian Lynagh's avatar
Ian Lynagh committed
183 184
# XXX 2010-08-19: This is a legacy clean. Remove later.
$(eval $(call clean-target,compiler,config_hs,compiler/main/Config.hs))
Ian Lynagh's avatar
Ian Lynagh committed
185 186 187 188 189 190 191 192 193 194 195

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

196
compiler/stage1/$(PLATFORM_H) : mk/config.mk mk/project.mk | $$(dir $$@)/.
197
	"$(RM)" $(RM_OPTS) $@
Ian Lynagh's avatar
Ian Lynagh committed
198
	@echo "Creating $@..."
199 200 201
	@echo "#ifndef __PLATFORM_H__"                           >> $@
	@echo "#define __PLATFORM_H__"                           >> $@
	@echo                                                    >> $@
Ian Lynagh's avatar
Ian Lynagh committed
202
	@echo "#define BuildPlatform_NAME  \"$(BUILDPLATFORM)\"" >> $@
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
	@echo "#define HostPlatform_NAME   \"$(BUILDPLATFORM)\"" >> $@
	@echo "#define TargetPlatform_NAME \"$(HOSTPLATFORM)\""  >> $@
	@echo                                                    >> $@
	@echo "#define $(BuildPlatform_CPP)_BUILD 1"             >> $@
	@echo "#define $(BuildPlatform_CPP)_HOST 1"              >> $@
	@echo "#define $(HostPlatform_CPP)_TARGET 1"             >> $@
	@echo                                                    >> $@
	@echo "#define $(BuildArch_CPP)_BUILD_ARCH 1"            >> $@
	@echo "#define $(BuildArch_CPP)_HOST_ARCH 1"             >> $@
	@echo "#define $(HostArch_CPP)_TARGET_ARCH 1"            >> $@
	@echo "#define BUILD_ARCH \"$(BuildArch_CPP)\""          >> $@
	@echo "#define HOST_ARCH \"$(BuildArch_CPP)\""           >> $@
	@echo "#define TARGET_ARCH \"$(HostArch_CPP)\""          >> $@
	@echo                                                    >> $@
	@echo "#define $(BuildOS_CPP)_BUILD_OS 1"                >> $@
	@echo "#define $(BuildOS_CPP)_HOST_OS 1"                 >> $@
	@echo "#define $(HostOS_CPP)_TARGET_OS 1"                >> $@
	@echo "#define BUILD_OS \"$(BuildOS_CPP)\""              >> $@
	@echo "#define HOST_OS \"$(BuildOS_CPP)\""               >> $@
	@echo "#define TARGET_OS \"$(HostOS_CPP)\""              >> $@
Ian Lynagh's avatar
Ian Lynagh committed
223
ifeq "$(HostOS_CPP)" "irix"
224 225 226
	@echo "#ifndef $(IRIX_MAJOR)_TARGET_OS"                  >> $@
	@echo "#define $(IRIX_MAJOR)_TARGET_OS 1"                >> $@
	@echo "#endif"                                           >> $@
Ian Lynagh's avatar
Ian Lynagh committed
227
endif
228 229 230 231 232 233 234 235 236
	@echo                                                    >> $@
	@echo "#define $(BuildVendor_CPP)_BUILD_VENDOR 1"        >> $@
	@echo "#define $(BuildVendor_CPP)_HOST_VENDOR 1"         >> $@
	@echo "#define $(HostVendor_CPP)_TARGET_VENDOR 1"        >> $@
	@echo "#define BUILD_VENDOR \"$(BuildVendor_CPP)\""      >> $@
	@echo "#define HOST_VENDOR \"$(BuildVendor_CPP)\""       >> $@
	@echo "#define TARGET_VENDOR \"$(HostVendor_CPP)\""      >> $@
	@echo                                                    >> $@
	@echo "#endif /* __PLATFORM_H__ */"                      >> $@
Ian Lynagh's avatar
Ian Lynagh committed
237 238 239 240 241
	@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).
242
compiler/stage2/$(PLATFORM_H) : mk/config.mk mk/project.mk | $$(dir $$@)/.
243
	"$(RM)" $(RM_OPTS) $@
Ian Lynagh's avatar
Ian Lynagh committed
244
	@echo "Creating $@..."
245 246 247 248 249
	@echo "#ifndef __PLATFORM_H__"                            >> $@
	@echo "#define __PLATFORM_H__"                            >> $@
	@echo                                                     >> $@
	@echo "#define BuildPlatform_NAME  \"$(BUILDPLATFORM)\""  >> $@
	@echo "#define HostPlatform_NAME   \"$(HOSTPLATFORM)\""   >> $@
Ian Lynagh's avatar
Ian Lynagh committed
250
	@echo "#define TargetPlatform_NAME \"$(TARGETPLATFORM)\"" >> $@
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272
	@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 \"$(HostArch_CPP)\""            >> $@
	@echo "#define HOST_ARCH \"$(HostArch_CPP)\""             >> $@
	@echo "#define TARGET_ARCH \"$(TargetArch_CPP)\""         >> $@
	@echo                                                     >> $@
	@echo "#define $(HostOS_CPP)_BUILD_OS 1"                  >> $@
	@echo "#define $(HostOS_CPP)_HOST_OS 1"                   >> $@
	@echo "#define $(TargetOS_CPP)_TARGET_OS 1"               >> $@
	@echo "#define BUILD_OS \"$(HostOS_CPP)\""                >> $@
	@echo "#define HOST_OS \"$(HostOS_CPP)\""                 >> $@
	@echo "#define TARGET_OS \"$(TargetOS_CPP)\""             >> $@
ifeq "$(TargetOS_CPP)" "irix"
	@echo "#ifndef $(IRIX_MAJOR)_TARGET_OS"                   >> $@
	@echo "#define $(IRIX_MAJOR)_TARGET_OS 1"                 >> $@
	@echo "#endif"                                            >> $@
Ian Lynagh's avatar
Ian Lynagh committed
273
endif
274 275 276 277 278 279 280 281 282
	@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__ */"                       >> $@
Ian Lynagh's avatar
Ian Lynagh committed
283 284 285
	@echo "Done."

compiler/stage3/$(PLATFORM_H) : compiler/stage2/$(PLATFORM_H)
286
	"$(CP)" $< $@
Ian Lynagh's avatar
Ian Lynagh committed
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311

# ----------------------------------------------------------------------------
#		Generate supporting stuff for prelude/PrimOp.lhs 
#		from prelude/primops.txt

# XXX: these should go in stage1/stage2/stage3
PRIMOP_BITS = compiler/primop-data-decl.hs-incl        \
              compiler/primop-tag.hs-incl              \
              compiler/primop-list.hs-incl             \
              compiler/primop-has-side-effects.hs-incl \
              compiler/primop-out-of-line.hs-incl      \
              compiler/primop-commutable.hs-incl       \
              compiler/primop-needs-wrapper.hs-incl    \
              compiler/primop-can-fail.hs-incl         \
              compiler/primop-strictness.hs-incl       \
              compiler/primop-primop-info.hs-incl

compiler_CPP_OPTS += -I$(GHC_INCLUDE_DIR)
compiler_CPP_OPTS += ${GhcCppOpts}

$(PRIMOPS_TXT) compiler/parser/Parser.y: %: %.pp compiler/stage1/$(PLATFORM_H)
	$(CPP) $(RAWCPP_FLAGS) -P $(compiler_CPP_OPTS) -x c $< | grep -v '^#pragma GCC' > $@

$(eval $(call clean-target,compiler,primop, $(PRIMOPS_TXT) compiler/parser/Parser.y $(PRIMOP_BITS)))

312
ifneq "$(BootingFromHc)" "YES"
Ian Lynagh's avatar
Ian Lynagh committed
313
compiler/primop-data-decl.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
314
	"$(GENPRIMOP_INPLACE)" --data-decl          < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
315
compiler/primop-tag.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
316
	"$(GENPRIMOP_INPLACE)" --primop-tag         < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
317
compiler/primop-list.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
318
	"$(GENPRIMOP_INPLACE)" --primop-list        < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
319
compiler/primop-has-side-effects.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
320
	"$(GENPRIMOP_INPLACE)" --has-side-effects   < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
321
compiler/primop-out-of-line.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
322
	"$(GENPRIMOP_INPLACE)" --out-of-line        < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
323
compiler/primop-commutable.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
324
	"$(GENPRIMOP_INPLACE)" --commutable         < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
325
compiler/primop-needs-wrapper.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
326
	"$(GENPRIMOP_INPLACE)" --needs-wrapper      < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
327
compiler/primop-can-fail.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
328
	"$(GENPRIMOP_INPLACE)" --can-fail           < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
329
compiler/primop-strictness.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
330
	"$(GENPRIMOP_INPLACE)" --strictness         < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
331
compiler/primop-primop-info.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
332
	"$(GENPRIMOP_INPLACE)" --primop-primop-info < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
333 334 335 336

# Usages aren't used any more; but the generator 
# can still generate them if we want them back
compiler/primop-usage.hs-incl: $(PRIMOPS_TXT)
337
	"$(GENPRIMOP_INPLACE)" --usage              < $< > $@
338
endif
Ian Lynagh's avatar
Ian Lynagh committed
339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369

# -----------------------------------------------------------------------------
# Configuration

compiler_stage1_CONFIGURE_OPTS += --flags=stage1
compiler_stage2_CONFIGURE_OPTS += --flags=stage2
compiler_stage3_CONFIGURE_OPTS += --flags=stage3

ifeq "$(GhcWithNativeCodeGen)" "YES"
compiler_stage1_CONFIGURE_OPTS += --flags=ncg
compiler_stage2_CONFIGURE_OPTS += --flags=ncg
endif

ifeq "$(GhcWithInterpreter)" "YES"
compiler_stage2_CONFIGURE_OPTS += --flags=ghci

ifeq "$(BuildSharedLibs)" "YES"
compiler_stage2_CONFIGURE_OPTS += --enable-shared
# 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.
compiler_stage2_CONFIGURE_OPTS += --flags=dynlibs
endif

ifeq "$(GhcEnableTablesNextToCode) $(GhcUnregisterised)" "YES NO"
# Should GHCI be building info tables in the TABLES_NEXT_TO_CODE style
# or not?
# XXX This should logically be a CPP option, but there doesn't seem to
# be a flag for that
dterei's avatar
dterei committed
370
compiler_stage2_CONFIGURE_OPTS += --ghc-option=-DGHCI_TABLES_NEXT_TO_CODE
Ian Lynagh's avatar
Ian Lynagh committed
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390
endif

# Should the debugger commands be enabled?
ifeq "$(GhciWithDebugger)" "YES"
compiler_stage2_CONFIGURE_OPTS += --ghc-option=-DDEBUGGER
endif

endif

ifeq "$(GhcWithNativeCodeGen)" "NO"
# XXX This should logically be a CPP option, but there doesn't seem to
# be a flag for that
compiler_CONFIGURE_OPTS += --ghc-option=-DOMIT_NATIVE_CODEGEN
endif

ifeq "$(TargetOS_CPP)" "openbsd"
compiler_CONFIGURE_OPTS += --ld-options=-E
endif

ifeq "$(GhcUnregisterised)" "NO"
391 392
else
compiler_CONFIGURE_OPTS += --ghc-option=-DNO_REGS
Ian Lynagh's avatar
Ian Lynagh committed
393 394
endif

simonpj@microsoft.com's avatar
simonpj@microsoft.com committed
395
# If we're profiling GHC then we want lots of SCCs, so -auto-all
396 397 398
# We also don't want to waste time building the non-profiling library.
# Unfortunately this means that we have to tell ghc-pkg --force as it
# gets upset when libHSghc-6.9.a doesn't exist.
Ian Lynagh's avatar
Ian Lynagh committed
399 400
ifeq "$(GhcProfiled)" "YES"
compiler_stage2_CONFIGURE_OPTS += --ghc-option=-auto-all
Ian Lynagh's avatar
Ian Lynagh committed
401 402 403 404 405 406
# We seem to still build the vanilla libraries even if we say
# --disable-library-vanilla, but installation then fails, as Cabal
# doesn't copy the vanilla .hi files, but ghc-pkg complains about
# their absence when we register the package. So for now, we just
# leave the vanilla libraries enabled.
# compiler_stage2_CONFIGURE_OPTS += --disable-library-vanilla
Ian Lynagh's avatar
Ian Lynagh committed
407 408 409 410 411 412 413 414
compiler_stage2_CONFIGURE_OPTS += --ghc-pkg-option=--force
endif

compiler_stage3_CONFIGURE_OPTS := $(compiler_stage2_CONFIGURE_OPTS)

compiler_stage1_CONFIGURE_OPTS += --ghc-option=-DSTAGE=1
compiler_stage2_CONFIGURE_OPTS += --ghc-option=-DSTAGE=2
compiler_stage3_CONFIGURE_OPTS += --ghc-option=-DSTAGE=3
415
compiler_stage2_HADDOCK_OPTS += --optghc=-DSTAGE=2
Ian Lynagh's avatar
Ian Lynagh committed
416 417 418 419 420 421 422 423 424 425

compiler/stage1/package-data.mk : compiler/ghc.mk
compiler/stage2/package-data.mk : compiler/ghc.mk
compiler/stage3/package-data.mk : compiler/ghc.mk

# -----------------------------------------------------------------------------
# And build the package

compiler_PACKAGE = ghc

426
# Note [fiddle-stage1-version]
427 428 429 430 431 432
# The version of the GHC package changes every day, since the
# patchlevel is the current date.  We don't want to force
# recompilation of the entire compiler when this happens, so for stage
# 1 we omit the patchlevel from the version number.  For stage 2 we
# have to include the patchlevel since this is the package we install,
# however.
433 434 435 436
#
# Note: we also have to tweak the version number of the package itself
# when it gets registered; see Note [munge-stage1-package-config]
# below.
437 438
# The ProjectPatchLevel > 20000000 iff it's a date. If it's e.g. 6.12.1
# then we don't want to remove it
439
ifneq "$(CLEANING)" "YES"
440 441 442
ifeq "$(shell [ $(ProjectPatchLevel) -gt 20000000 ] && echo YES)" "YES"
compiler_stage1_VERSION_MUNGED = YES
endif
443
endif
444

445
ifeq "$(compiler_stage1_VERSION_MUNGED)" "YES"
446 447 448
define compiler_PACKAGE_MAGIC
compiler_stage1_VERSION = $(subst .$(ProjectPatchLevel),,$(ProjectVersion))
endef
449 450 451 452

# Don't register the non-munged package
compiler_stage1_REGISTER_PACKAGE = NO

453
endif
454

Ian Lynagh's avatar
Ian Lynagh committed
455 456 457 458 459 460 461 462 463 464
# haddocking only happens for stage2
compiler_stage1_DO_HADDOCK = NO
compiler_stage3_DO_HADDOCK = NO

# Don't do splitting for the GHC package, it takes too long and
# there's not much benefit.
compiler_stage1_SplitObjs = NO
compiler_stage2_SplitObjs = NO
compiler_stage3_SplitObjs = NO

465 466
# if stage is set to something other than "1" or "", disable stage 1
ifneq "$(filter-out 1,$(stage))" ""
Ian Lynagh's avatar
Ian Lynagh committed
467 468
compiler_stage1_NOT_NEEDED = YES
endif
469 470 471 472 473
# if stage is set to something other than "2" or "", disable stage 2
ifneq "$(filter-out 2,$(stage))" ""
compiler_stage2_NOT_NEEDED = YES
endif
# stage 3 has to be requested explicitly with stage=3
474 475
ifneq "$(stage)" "3"
compiler_stage3_NOT_NEEDED = YES
Ian Lynagh's avatar
Ian Lynagh committed
476
endif
477
$(eval $(call build-package,compiler,stage1,0))
Ian Lynagh's avatar
Ian Lynagh committed
478
$(eval $(call build-package,compiler,stage2,1))
479
$(eval $(call build-package,compiler,stage3,2))
Ian Lynagh's avatar
Ian Lynagh committed
480

481 482 483 484 485 486 487 488 489 490
# after build-package, because that adds --enable-library-for-ghci
# to compiler_stage*_CONFIGURE_OPTS:
# We don't build the GHCi library for the ghc package. We can load it
# the .a file instead, and as object splitting isn't on for the ghc
# package this isn't much slower.However, not building the package saves
# a significant chunk of disk space.
compiler_stage1_CONFIGURE_OPTS += --disable-library-for-ghci
compiler_stage2_CONFIGURE_OPTS += --disable-library-for-ghci
compiler_stage3_CONFIGURE_OPTS += --disable-library-for-ghci

491 492 493 494 495
# after build-package, because that sets compiler_stage1_HC_OPTS:
compiler_stage1_HC_OPTS += $(GhcStage1HcOpts)
compiler_stage2_HC_OPTS += $(GhcStage2HcOpts)
compiler_stage3_HC_OPTS += $(GhcStage3HcOpts)

Ian Lynagh's avatar
Ian Lynagh committed
496 497
ifneq "$(BINDIST)" "YES"

498 499 500
compiler_stage2_TAGS_HC_OPTS = -package ghc
$(eval $(call tags-package,compiler,stage2))

Ian Lynagh's avatar
Ian Lynagh committed
501 502 503
$(compiler_stage1_depfile_haskell) : compiler/stage1/$(PLATFORM_H)
$(compiler_stage2_depfile_haskell) : compiler/stage2/$(PLATFORM_H)
$(compiler_stage3_depfile_haskell) : compiler/stage3/$(PLATFORM_H)
Ian Lynagh's avatar
Ian Lynagh committed
504

Ian Lynagh's avatar
Ian Lynagh committed
505 506 507
$(compiler_stage1_depfile_haskell) : $(includes_H_CONFIG) $(includes_H_PLATFORM) $(includes_GHCCONSTANTS) $(includes_DERIVEDCONSTANTS) $(PRIMOP_BITS)
$(compiler_stage2_depfile_haskell) : $(includes_H_CONFIG) $(includes_H_PLATFORM) $(includes_GHCCONSTANTS) $(includes_DERIVEDCONSTANTS) $(PRIMOP_BITS)
$(compiler_stage3_depfile_haskell) : $(includes_H_CONFIG) $(includes_H_PLATFORM) $(includes_GHCCONSTANTS) $(includes_DERIVEDCONSTANTS) $(PRIMOP_BITS)
508

Ian Lynagh's avatar
Ian Lynagh committed
509
# Every Constants.o object file depends on includes/GHCConstants.h:
510
$(eval $(call compiler-hs-dependency,Constants,$(includes_GHCCONSTANTS) includes/HaskellConstants.hs))
Ian Lynagh's avatar
Ian Lynagh committed
511 512 513 514

# Every PrimOp.o object file depends on $(PRIMOP_BITS):
$(eval $(call compiler-hs-dependency,PrimOp,$(PRIMOP_BITS)))

515 516
# GHC itself doesn't know about the above dependencies, so we have to
# switch off the recompilation checker for those modules:
517
compiler/prelude/PrimOp_HC_OPTS  += -fforce-recomp
518 519
compiler/main/Constants_HC_OPTS  += -fforce-recomp

Simon Marlow's avatar
Simon Marlow committed
520 521 522 523 524 525 526
# Workaround for #4003 in GHC 6.12.2.  It didn't happen in 6.12.1, and
# will be fixed in 6.12.3.  Unfortunately we don't have a way to do
# this for just stage1 in the build system.
ifeq "$(GhcVersion)" "6.12.2"
compiler/hsSyn/HsLit_HC_OPTS     += -fomit-interface-pragmas
endif

527 528 529
# Note [munge-stage1-package-config]
# Strip the date/patchlevel from the version of stage1.  See Note
# [fiddle-stage1-version] above.
530
ifeq "$(compiler_stage1_VERSION_MUNGED)" "YES"
531
compiler/stage1/inplace-pkg-config-munged: compiler/stage1/inplace-pkg-config
532
	sed -e 's/^\(version: .*\)\.$(ProjectPatchLevel)$$/\1/' \
533
	    -e 's/^\(id: .*\)\.$(ProjectPatchLevel)$$/\1/' \
534 535
	    -e 's/^\(hs-libraries: HSghc-.*\)\.$(ProjectPatchLevel)$$/\1/' \
	  < $< > $@
536
	"$(compiler_stage1_GHC_PKG)" update --force $(compiler_stage1_GHC_PKG_OPTS) $@
537

Ian Lynagh's avatar
Ian Lynagh committed
538 539 540
# We need to make sure the munged config is in the database before we
# try to configure ghc-bin
ghc/stage1/package-data.mk : compiler/stage1/inplace-pkg-config-munged
541 542
endif

Ian Lynagh's avatar
Ian Lynagh committed
543 544
endif