ghc.mk 24.8 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
	$(call removeFiles,$@)
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 52 53
	@echo                                                               >> $@
	@echo '#include "ghc_boot_platform.h"'                              >> $@
	@echo                                                               >> $@
54
	@echo 'data IntegerLibrary = IntegerGMP | IntegerSimple'            >> $@
55
	@echo '    deriving Eq'                                             >> $@
56
	@echo                                                               >> $@
57 58 59 60 61 62
	@echo 'cBuildPlatformString :: String'                              >> $@
	@echo 'cBuildPlatformString = BuildPlatform_NAME'                   >> $@
	@echo 'cHostPlatformString :: String'                               >> $@
	@echo 'cHostPlatformString = HostPlatform_NAME'                     >> $@
	@echo 'cTargetPlatformString :: String'                             >> $@
	@echo 'cTargetPlatformString = TargetPlatform_NAME'                 >> $@
63
	@echo                                                               >> $@
Ian Lynagh's avatar
Ian Lynagh committed
64 65 66 67 68 69 70 71 72 73 74 75
	@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)'                 >> $@
76 77 78 79
	@echo 'cGccLinkerOpts        :: [String]'                           >> $@
	@echo 'cGccLinkerOpts        = words "$(CONF_GCC_LINKER_OPTS_STAGE$*)"' >> $@
	@echo 'cLdLinkerOpts         :: [String]'                           >> $@
	@echo 'cLdLinkerOpts         = words "$(CONF_LD_LINKER_OPTS_STAGE$*)"'  >> $@
Ian Lynagh's avatar
Ian Lynagh committed
80 81
	@echo 'cIntegerLibrary       :: String'                             >> $@
	@echo 'cIntegerLibrary       = "$(INTEGER_LIBRARY)"'                >> $@
82 83 84 85 86 87 88 89
	@echo 'cIntegerLibraryType   :: IntegerLibrary'                     >> $@
ifeq "$(INTEGER_LIBRARY)" "integer-gmp"
	@echo 'cIntegerLibraryType   = IntegerGMP'                          >> $@
else ifeq "$(INTEGER_LIBRARY)" "integer-simple"
	@echo 'cIntegerLibraryType   = IntegerSimple'                       >> $@
else ifneq "$(CLEANING)" "YES"
$(error Unknown integer library)
endif
90 91
	@echo 'cSupportsSplitObjs    :: String'                             >> $@
	@echo 'cSupportsSplitObjs    = "$(SupportsSplitObjs)"'              >> $@
Ian Lynagh's avatar
Ian Lynagh committed
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
	@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)"'                   >> $@
108 109
	@echo 'cLdHasNoCompactUnwind :: String'                             >> $@
	@echo 'cLdHasNoCompactUnwind = "$(LdHasNoCompactUnwind)"'           >> $@
Ian Lynagh's avatar
Ian Lynagh committed
110 111
	@echo 'cLdIsGNULd            :: String'                             >> $@
	@echo 'cLdIsGNULd            = "$(LdIsGNULd)"'                      >> $@
112 113
	@echo 'cLdHasBuildId         :: String'                             >> $@
	@echo 'cLdHasBuildId         = "$(LdHasBuildId)"'                   >> $@
Ian Lynagh's avatar
Ian Lynagh committed
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
	@echo 'cLD_X                 :: String'                             >> $@
	@echo 'cLD_X                 = "$(LD_X)"'                           >> $@
	@echo 'cGHC_DRIVER_DIR       :: String'                             >> $@
	@echo 'cGHC_DRIVER_DIR       = "$(GHC_DRIVER_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_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 'cDEFAULT_TMPDIR       :: String'                             >> $@
	@echo 'cDEFAULT_TMPDIR       = "$(DEFAULT_TMPDIR)"'                 >> $@
	@echo 'cLibFFI               :: Bool'                               >> $@
Ian Lynagh's avatar
Ian Lynagh committed
133
ifeq "$(UseLibFFIForAdjustors)" "YES"
Ian Lynagh's avatar
Ian Lynagh committed
134
	@echo 'cLibFFI               = True'                                >> $@
Ian Lynagh's avatar
Ian Lynagh committed
135
else
Ian Lynagh's avatar
Ian Lynagh committed
136
	@echo 'cLibFFI               = False'                               >> $@
Ian Lynagh's avatar
Ian Lynagh committed
137 138 139
endif
	@echo done.

Ian Lynagh's avatar
Ian Lynagh committed
140 141
# 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
142 143 144 145 146 147 148 149 150 151 152

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

153 154 155 156
ifeq "$(BuildingCrossCompiler)" "YES"
compiler/stage1/$(PLATFORM_H) : compiler/stage2/$(PLATFORM_H)
	cp $< $@
else
157
compiler/stage1/$(PLATFORM_H) : mk/config.mk mk/project.mk | $$(dir $$@)/.
158
	$(call removeFiles,$@)
Ian Lynagh's avatar
Ian Lynagh committed
159
	@echo "Creating $@..."
160 161 162
	@echo "#ifndef __PLATFORM_H__"                           >> $@
	@echo "#define __PLATFORM_H__"                           >> $@
	@echo                                                    >> $@
Ian Lynagh's avatar
Ian Lynagh committed
163
	@echo "#define BuildPlatform_NAME  \"$(BUILDPLATFORM)\"" >> $@
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
	@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
184
ifeq "$(HostOS_CPP)" "irix"
185 186 187
	@echo "#ifndef $(IRIX_MAJOR)_TARGET_OS"                  >> $@
	@echo "#define $(IRIX_MAJOR)_TARGET_OS 1"                >> $@
	@echo "#endif"                                           >> $@
Ian Lynagh's avatar
Ian Lynagh committed
188
endif
189 190 191 192 193 194 195 196 197
	@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
198
	@echo "Done."
199
endif
Ian Lynagh's avatar
Ian Lynagh committed
200 201 202 203

# 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).
204
compiler/stage2/$(PLATFORM_H) : mk/config.mk mk/project.mk | $$(dir $$@)/.
205
	$(call removeFiles,$@)
Ian Lynagh's avatar
Ian Lynagh committed
206
	@echo "Creating $@..."
207 208 209 210 211
	@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
212
	@echo "#define TargetPlatform_NAME \"$(TARGETPLATFORM)\"" >> $@
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
	@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
235
endif
236 237 238 239 240 241 242 243 244
	@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
245 246 247
	@echo "Done."

compiler/stage3/$(PLATFORM_H) : compiler/stage2/$(PLATFORM_H)
248
	"$(CP)" $< $@
Ian Lynagh's avatar
Ian Lynagh committed
249 250 251 252 253 254 255 256 257 258 259 260

# ----------------------------------------------------------------------------
#		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       \
261
              compiler/primop-code-size.hs-incl        \
Ian Lynagh's avatar
Ian Lynagh committed
262 263 264 265
              compiler/primop-can-fail.hs-incl         \
              compiler/primop-strictness.hs-incl       \
              compiler/primop-primop-info.hs-incl

Ian Lynagh's avatar
Ian Lynagh committed
266
compiler_CPP_OPTS += $(addprefix -I,$(GHC_INCLUDE_DIRS))
Ian Lynagh's avatar
Ian Lynagh committed
267 268 269 270 271 272 273
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)))

274
ifneq "$(BootingFromHc)" "YES"
Ian Lynagh's avatar
Ian Lynagh committed
275
compiler/primop-data-decl.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
276
	"$(GENPRIMOP_INPLACE)" --data-decl          < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
277
compiler/primop-tag.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
278
	"$(GENPRIMOP_INPLACE)" --primop-tag         < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
279
compiler/primop-list.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
280
	"$(GENPRIMOP_INPLACE)" --primop-list        < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
281
compiler/primop-has-side-effects.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
282
	"$(GENPRIMOP_INPLACE)" --has-side-effects   < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
283
compiler/primop-out-of-line.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
284
	"$(GENPRIMOP_INPLACE)" --out-of-line        < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
285
compiler/primop-commutable.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
286
	"$(GENPRIMOP_INPLACE)" --commutable         < $< > $@
287 288
compiler/primop-code-size.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
	"$(GENPRIMOP_INPLACE)" --code-size          < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
289
compiler/primop-can-fail.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
290
	"$(GENPRIMOP_INPLACE)" --can-fail           < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
291
compiler/primop-strictness.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
292
	"$(GENPRIMOP_INPLACE)" --strictness         < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
293
compiler/primop-primop-info.hs-incl: $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE)
294
	"$(GENPRIMOP_INPLACE)" --primop-primop-info < $< > $@
Ian Lynagh's avatar
Ian Lynagh committed
295 296 297 298

# 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)
299
	"$(GENPRIMOP_INPLACE)" --usage              < $< > $@
300
endif
Ian Lynagh's avatar
Ian Lynagh committed
301 302 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

# -----------------------------------------------------------------------------
# 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
332
compiler_stage2_CONFIGURE_OPTS += --ghc-option=-DGHCI_TABLES_NEXT_TO_CODE
Ian Lynagh's avatar
Ian Lynagh committed
333 334 335 336 337 338 339 340 341 342 343 344 345 346
endif

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

endif

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

ifeq "$(GhcUnregisterised)" "NO"
347 348
else
compiler_CONFIGURE_OPTS += --ghc-option=-DNO_REGS
Ian Lynagh's avatar
Ian Lynagh committed
349 350 351
endif

ifeq "$(GhcProfiled)" "YES"
352 353 354 355 356 357 358 359 360 361 362 363 364 365

# If we're profiling GHC then we want SCCs.  However, adding -auto-all
# everywhere tends to give a hard-to-read profile, and adds lots of
# overhead.  A better approach is to proceed top-down; identify the
# parts of the compiler of interest, and then add further cost centres
# as necessary.  Turn on -auto-all for individual modules like this:

compiler/main/DriverPipeline_HC_OPTS += -auto-all
compiler/main/GhcMake_HC_OPTS        += -auto-all
compiler/main/GHC_HC_OPTS            += -auto-all

# or alternatively addd {-# OPTIONS_GHC -auto-all #-} to the top of
# modules you're interested in.

Ian Lynagh's avatar
Ian Lynagh committed
366 367 368 369 370 371
# 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
372 373 374 375 376 377 378 379
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
380
compiler_stage2_HADDOCK_OPTS += --optghc=-DSTAGE=2
Ian Lynagh's avatar
Ian Lynagh committed
381 382 383 384 385 386 387 388 389 390

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

391
# Note [fiddle-stage1-version]
392 393 394 395 396 397
# 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.
398 399 400 401
#
# Note: we also have to tweak the version number of the package itself
# when it gets registered; see Note [munge-stage1-package-config]
# below.
402 403
# The ProjectPatchLevel > 20000000 iff it's a date. If it's e.g. 6.12.1
# then we don't want to remove it
404
ifneq "$(CLEANING)" "YES"
405 406 407
ifeq "$(shell [ $(ProjectPatchLevel) -gt 20000000 ] && echo YES)" "YES"
compiler_stage1_VERSION_MUNGED = YES
endif
408
endif
409

410
ifeq "$(compiler_stage1_VERSION_MUNGED)" "YES"
411 412 413
define compiler_PACKAGE_MAGIC
compiler_stage1_VERSION = $(subst .$(ProjectPatchLevel),,$(ProjectVersion))
endef
414 415 416 417

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

418
endif
419

Ian Lynagh's avatar
Ian Lynagh committed
420 421 422 423 424 425 426 427 428 429
# 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

430 431
# 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
432 433
compiler_stage1_NOT_NEEDED = YES
endif
434 435 436 437 438
# 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
439 440
ifneq "$(stage)" "3"
compiler_stage3_NOT_NEEDED = YES
Ian Lynagh's avatar
Ian Lynagh committed
441
endif
442
$(eval $(call build-package,compiler,stage1,0))
Ian Lynagh's avatar
Ian Lynagh committed
443
$(eval $(call build-package,compiler,stage2,1))
444
$(eval $(call build-package,compiler,stage3,2))
Ian Lynagh's avatar
Ian Lynagh committed
445

446 447 448 449 450 451 452 453 454 455
# 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

456 457 458 459 460
# 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)

461 462 463 464 465 466 467 468 469 470 471 472
ifeq "$(GhcStage1DefaultNewCodegen)" "YES"
compiler_stage1_HC_OPTS += -DGHC_DEFAULT_NEW_CODEGEN
endif

ifeq "$(GhcStage2DefaultNewCodegen)" "YES"
compiler_stage2_HC_OPTS += -DGHC_DEFAULT_NEW_CODEGEN
endif

ifeq "$(GhcStage3DefaultNewCodegen)" "YES"
compiler_stage3_HC_OPTS += -DGHC_DEFAULT_NEW_CODEGEN
endif

Ian Lynagh's avatar
Ian Lynagh committed
473 474
ifneq "$(BINDIST)" "YES"

475 476 477
compiler_stage2_TAGS_HC_OPTS = -package ghc
$(eval $(call tags-package,compiler,stage2))

Ian Lynagh's avatar
Ian Lynagh committed
478 479 480
$(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
481

Ian Lynagh's avatar
Ian Lynagh committed
482 483 484
$(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)
485

Ian Lynagh's avatar
Ian Lynagh committed
486
# Every Constants.o object file depends on includes/GHCConstants.h:
487
$(eval $(call compiler-hs-dependency,Constants,$(includes_GHCCONSTANTS) includes/HaskellConstants.hs))
Ian Lynagh's avatar
Ian Lynagh committed
488 489 490 491

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

492 493
# GHC itself doesn't know about the above dependencies, so we have to
# switch off the recompilation checker for those modules:
494
compiler/prelude/PrimOp_HC_OPTS  += -fforce-recomp
495 496
compiler/main/Constants_HC_OPTS  += -fforce-recomp

Simon Marlow's avatar
Simon Marlow committed
497 498 499 500 501 502 503
# 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

504
# LibFFI.hs #includes ffi.h
505
compiler/stage2/build/LibFFI.hs : $(libffi_HEADERS)
506 507 508 509 510 511 512 513 514 515 516
# On Windows it seems we also need to link directly to libffi
ifeq  "$(HOSTPLATFORM)" "i386-unknown-mingw32"
define windowsDynLinkToFfi
# $1 = way
ifneq "$$(findstring dyn, $1)" ""
compiler_stage2_$1_ALL_HC_OPTS += -lffi-5
endif
endef
$(foreach way,$(GhcLibWays),$(eval $(call windowsDynLinkToFfi,$(way))))
endif

517 518 519
# Note [munge-stage1-package-config]
# Strip the date/patchlevel from the version of stage1.  See Note
# [fiddle-stage1-version] above.
520
ifeq "$(compiler_stage1_VERSION_MUNGED)" "YES"
521
compiler/stage1/inplace-pkg-config-munged: compiler/stage1/inplace-pkg-config
522
	sed -e 's/^\(version: .*\)\.$(ProjectPatchLevel)$$/\1/' \
523
	    -e 's/^\(id: .*\)\.$(ProjectPatchLevel)$$/\1/' \
524 525
	    -e 's/^\(hs-libraries: HSghc-.*\)\.$(ProjectPatchLevel)$$/\1/' \
	  < $< > $@
526
	"$(compiler_stage1_GHC_PKG)" update --force $(compiler_stage1_GHC_PKG_OPTS) $@
527

Ian Lynagh's avatar
Ian Lynagh committed
528 529 530
# 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
531 532
endif

Ian Lynagh's avatar
Ian Lynagh committed
533 534
endif