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

Ian Lynagh's avatar
Ian Lynagh committed
13 14 15 16 17 18
# -----------------------------------------------------------------------------
# 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

Ian Lynagh's avatar
Ian Lynagh committed
19 20 21 22 23 24
# 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

25 26
compiler_stage1_C_FILES_NODEPS = compiler/parser/cutils.c

27 28 29 30 31
# This package doesn't pass the Cabal checks because include-dirs
# points outside the source directory. This isn't a real problem, so
# we just skip the check.
compiler_NO_CHECK = YES

Ian Lynagh's avatar
Ian Lynagh committed
32
ifneq "$(BINDIST)" "YES"
Ian Lynagh's avatar
Ian Lynagh committed
33 34 35
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
36

Simon Marlow's avatar
Simon Marlow committed
37 38 39
compiler/stage1/build/PlatformConstants.o: $(includes_GHCCONSTANTS_HASKELL_TYPE)
compiler/stage2/build/PlatformConstants.o: $(includes_GHCCONSTANTS_HASKELL_TYPE)
compiler/stage3/build/PlatformConstants.o: $(includes_GHCCONSTANTS_HASKELL_TYPE)
40 41 42 43 44 45
compiler/stage1/build/DynFlags.o: $(includes_GHCCONSTANTS_HASKELL_EXPORTS)
compiler/stage2/build/DynFlags.o: $(includes_GHCCONSTANTS_HASKELL_EXPORTS)
compiler/stage3/build/DynFlags.o: $(includes_GHCCONSTANTS_HASKELL_EXPORTS)
compiler/stage1/build/DynFlags.o: $(includes_GHCCONSTANTS_HASKELL_WRAPPERS)
compiler/stage2/build/DynFlags.o: $(includes_GHCCONSTANTS_HASKELL_WRAPPERS)
compiler/stage3/build/DynFlags.o: $(includes_GHCCONSTANTS_HASKELL_WRAPPERS)
Ian Lynagh's avatar
Ian Lynagh committed
46 47
endif

Ian Lynagh's avatar
Ian Lynagh committed
48
compiler/stage%/build/Config.hs : mk/config.mk mk/project.mk | $$(dir $$@)/.
49
	$(call removeFiles,$@)
Ian Lynagh's avatar
Ian Lynagh committed
50
	@echo 'Creating $@ ... '
51
	@echo '{-# LANGUAGE CPP #-}'                                        >> $@
Ian Lynagh's avatar
Ian Lynagh committed
52
	@echo 'module Config where'                                         >> $@
53 54 55
	@echo                                                               >> $@
	@echo '#include "ghc_boot_platform.h"'                              >> $@
	@echo                                                               >> $@
56 57 58
	@echo 'data IntegerLibrary = IntegerGMP'                            >> $@
	@echo '                    | IntegerSimple'                         >> $@
	@echo '                    deriving Eq'                             >> $@
59
	@echo                                                               >> $@
60 61 62 63 64 65
	@echo 'cBuildPlatformString :: String'                              >> $@
	@echo 'cBuildPlatformString = BuildPlatform_NAME'                   >> $@
	@echo 'cHostPlatformString :: String'                               >> $@
	@echo 'cHostPlatformString = HostPlatform_NAME'                     >> $@
	@echo 'cTargetPlatformString :: String'                             >> $@
	@echo 'cTargetPlatformString = TargetPlatform_NAME'                 >> $@
66
	@echo                                                               >> $@
Ian Lynagh's avatar
Ian Lynagh committed
67 68
	@echo 'cProjectName          :: String'                             >> $@
	@echo 'cProjectName          = "$(ProjectName)"'                    >> $@
69 70
	@echo 'cProjectGitCommitId   :: String'				    >> $@
	@echo 'cProjectGitCommitId   = "$(ProjectGitCommitId)"'		    >> $@
Ian Lynagh's avatar
Ian Lynagh committed
71 72 73 74 75 76
	@echo 'cProjectVersion       :: String'                             >> $@
	@echo 'cProjectVersion       = "$(ProjectVersion)"'                 >> $@
	@echo 'cProjectVersionInt    :: String'                             >> $@
	@echo 'cProjectVersionInt    = "$(ProjectVersionInt)"'              >> $@
	@echo 'cProjectPatchLevel    :: String'                             >> $@
	@echo 'cProjectPatchLevel    = "$(ProjectPatchLevel)"'              >> $@
77 78 79 80
	@echo 'cProjectPatchLevel1   :: String'                             >> $@
	@echo 'cProjectPatchLevel1   = "$(ProjectPatchLevel1)"'             >> $@
	@echo 'cProjectPatchLevel2   :: String'                             >> $@
	@echo 'cProjectPatchLevel2   = "$(ProjectPatchLevel2)"'             >> $@
Ian Lynagh's avatar
Ian Lynagh committed
81 82 83 84 85 86
	@echo 'cBooterVersion        :: String'                             >> $@
	@echo 'cBooterVersion        = "$(GhcVersion)"'                     >> $@
	@echo 'cStage                :: String'                             >> $@
	@echo 'cStage                = show (STAGE :: Int)'                 >> $@
	@echo 'cIntegerLibrary       :: String'                             >> $@
	@echo 'cIntegerLibrary       = "$(INTEGER_LIBRARY)"'                >> $@
87 88 89 90 91 92 93 94
	@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
95 96
	@echo 'cSupportsSplitObjs    :: String'                             >> $@
	@echo 'cSupportsSplitObjs    = "$(SupportsSplitObjs)"'              >> $@
Ian Lynagh's avatar
Ian Lynagh committed
97 98 99 100 101 102 103 104
	@echo 'cGhcWithInterpreter   :: String'                             >> $@
	@echo 'cGhcWithInterpreter   = "$(GhcWithInterpreter)"'             >> $@
	@echo 'cGhcWithNativeCodeGen :: String'                             >> $@
	@echo 'cGhcWithNativeCodeGen = "$(GhcWithNativeCodeGen)"'           >> $@
	@echo 'cGhcWithSMP           :: String'                             >> $@
	@echo 'cGhcWithSMP           = "$(GhcWithSMP)"'                     >> $@
	@echo 'cGhcRTSWays           :: String'                             >> $@
	@echo 'cGhcRTSWays           = "$(GhcRTSWays)"'                     >> $@
105 106 107 108 109 110
	@echo 'cGhcRtsWithLibdw      :: Bool'                               >> $@
ifeq "$(GhcRtsWithLibdw)" "YES"
	@echo 'cGhcRtsWithLibdw      = True'                                >> $@
else
	@echo 'cGhcRtsWithLibdw      = False'                               >> $@
endif
Ian Lynagh's avatar
Ian Lynagh committed
111 112 113 114 115
	@echo 'cGhcEnableTablesNextToCode :: String'                        >> $@
	@echo 'cGhcEnableTablesNextToCode = "$(GhcEnableTablesNextToCode)"' >> $@
	@echo 'cLeadingUnderscore    :: String'                             >> $@
	@echo 'cLeadingUnderscore    = "$(LeadingUnderscore)"'              >> $@
	@echo 'cGHC_UNLIT_PGM        :: String'                             >> $@
116
	@echo 'cGHC_UNLIT_PGM        = "$(utils/unlit_dist_PROG)"'          >> $@
Ian Lynagh's avatar
Ian Lynagh committed
117
	@echo 'cGHC_SPLIT_PGM        :: String'                             >> $@
118
	@echo 'cGHC_SPLIT_PGM        = "$(driver/split_dist_PROG)"'         >> $@
Ian Lynagh's avatar
Ian Lynagh committed
119
	@echo 'cLibFFI               :: Bool'                               >> $@
Ian Lynagh's avatar
Ian Lynagh committed
120
ifeq "$(UseLibFFIForAdjustors)" "YES"
Ian Lynagh's avatar
Ian Lynagh committed
121
	@echo 'cLibFFI               = True'                                >> $@
Ian Lynagh's avatar
Ian Lynagh committed
122
else
Ian Lynagh's avatar
Ian Lynagh committed
123
	@echo 'cLibFFI               = False'                               >> $@
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
endif
# Note that GhcThreaded just reflects the Makefile variable setting.
# In particular, the stage1 compiler is never actually compiled with
# -threaded, but it will nevertheless have cGhcThreaded = True.
# The "+RTS --info" output will show what RTS GHC is really using.
	@echo 'cGhcThreaded :: Bool'                                        >> $@
ifeq "$(GhcThreaded)" "YES"
	@echo 'cGhcThreaded = True'                                         >> $@
else
	@echo 'cGhcThreaded = False'                                        >> $@
endif
	@echo 'cGhcDebugged :: Bool'                                        >> $@
ifeq "$(GhcDebugged)" "YES"
	@echo 'cGhcDebugged = True'                                         >> $@
else
	@echo 'cGhcDebugged = False'                                        >> $@
Ian Lynagh's avatar
Ian Lynagh committed
140 141 142 143 144 145 146 147 148 149 150 151 152
endif
	@echo done.

# -----------------------------------------------------------------------------
# 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
compiler/stage1/$(PLATFORM_H) : mk/config.mk mk/project.mk | $$(dir $$@)/.
154
	$(call removeFiles,$@)
Ian Lynagh's avatar
Ian Lynagh committed
155
	@echo "Creating $@..."
156 157 158
	@echo "#ifndef __PLATFORM_H__"                           >> $@
	@echo "#define __PLATFORM_H__"                           >> $@
	@echo                                                    >> $@
Simon Marlow's avatar
Simon Marlow committed
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
	@echo "#define BuildPlatform_NAME  \"$(BUILDPLATFORM)\""  >> $@
	@echo "#define HostPlatform_NAME   \"$(HOSTPLATFORM)\""   >> $@
	@echo "#define TargetPlatform_NAME \"$(TARGETPLATFORM)\"" >> $@
	@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)\""             >> $@
	@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
189 190 191 192 193
	@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).
194
compiler/stage2/$(PLATFORM_H) : mk/config.mk mk/project.mk | $$(dir $$@)/.
195
	$(call removeFiles,$@)
Ian Lynagh's avatar
Ian Lynagh committed
196
	@echo "Creating $@..."
197 198 199
	@echo "#ifndef __PLATFORM_H__"                            >> $@
	@echo "#define __PLATFORM_H__"                            >> $@
	@echo                                                     >> $@
Simon Marlow's avatar
Simon Marlow committed
200 201
	@echo "#define BuildPlatform_NAME  \"$(HOSTPLATFORM)\""   >> $@
	@echo "#define HostPlatform_NAME   \"$(TARGETPLATFORM)\"" >> $@
Ian Lynagh's avatar
Ian Lynagh committed
202
	@echo "#define TargetPlatform_NAME \"$(TARGETPLATFORM)\"" >> $@
203
	@echo                                                     >> $@
Simon Marlow's avatar
Simon Marlow committed
204 205
	@echo "#define $(HostPlatform_CPP)_BUILD 1"               >> $@
	@echo "#define $(TargetPlatform_CPP)_HOST 1"              >> $@
206 207
	@echo "#define $(TargetPlatform_CPP)_TARGET 1"            >> $@
	@echo                                                     >> $@
Simon Marlow's avatar
Simon Marlow committed
208 209
	@echo "#define $(HostArch_CPP)_BUILD_ARCH 1"              >> $@
	@echo "#define $(TargetArch_CPP)_HOST_ARCH 1"             >> $@
210 211
	@echo "#define $(TargetArch_CPP)_TARGET_ARCH 1"           >> $@
	@echo "#define BUILD_ARCH \"$(HostArch_CPP)\""            >> $@
Simon Marlow's avatar
Simon Marlow committed
212
	@echo "#define HOST_ARCH \"$(TargetArch_CPP)\""           >> $@
213 214 215
	@echo "#define TARGET_ARCH \"$(TargetArch_CPP)\""         >> $@
	@echo                                                     >> $@
	@echo "#define $(HostOS_CPP)_BUILD_OS 1"                  >> $@
Simon Marlow's avatar
Simon Marlow committed
216
	@echo "#define $(TargetOS_CPP)_HOST_OS 1"                 >> $@
217 218
	@echo "#define $(TargetOS_CPP)_TARGET_OS 1"               >> $@
	@echo "#define BUILD_OS \"$(HostOS_CPP)\""                >> $@
Simon Marlow's avatar
Simon Marlow committed
219
	@echo "#define HOST_OS \"$(TargetOS_CPP)\""               >> $@
220 221
	@echo "#define TARGET_OS \"$(TargetOS_CPP)\""             >> $@
	@echo                                                     >> $@
Simon Marlow's avatar
Simon Marlow committed
222 223
	@echo "#define $(HostVendor_CPP)_BUILD_VENDOR 1"          >> $@
	@echo "#define $(TargetVendor_CPP)_HOST_VENDOR 1"         >> $@
224
	@echo "#define $(TargetVendor_CPP)_TARGET_VENDOR  1"      >> $@
Simon Marlow's avatar
Simon Marlow committed
225 226
	@echo "#define BUILD_VENDOR \"$(HostVendor_CPP)\""        >> $@
	@echo "#define HOST_VENDOR \"$(TargetVendor_CPP)\""       >> $@
227 228 229
	@echo "#define TARGET_VENDOR \"$(TargetVendor_CPP)\""     >> $@
	@echo                                                     >> $@
	@echo "#endif /* __PLATFORM_H__ */"                       >> $@
Ian Lynagh's avatar
Ian Lynagh committed
230 231 232
	@echo "Done."

compiler/stage3/$(PLATFORM_H) : compiler/stage2/$(PLATFORM_H)
233
	"$(CP)" $< $@
Ian Lynagh's avatar
Ian Lynagh committed
234 235

# ----------------------------------------------------------------------------
Jan Stolarek's avatar
Jan Stolarek committed
236
#		Generate supporting stuff for prelude/PrimOp.lhs
Ian Lynagh's avatar
Ian Lynagh committed
237 238
#		from prelude/primops.txt

239 240 241 242 243 244 245 246 247
PRIMOP_BITS_NAMES = 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-code-size.hs-incl        \
                    primop-can-fail.hs-incl         \
                    primop-strictness.hs-incl       \
248 249 250 251 252 253
                    primop-fixity.hs-incl           \
                    primop-primop-info.hs-incl      \
                    primop-vector-uniques.hs-incl   \
                    primop-vector-tys.hs-incl       \
                    primop-vector-tys-exports.hs-incl \
                    primop-vector-tycons.hs-incl
254 255 256 257

PRIMOP_BITS_STAGE1 = $(addprefix compiler/stage1/build/,$(PRIMOP_BITS_NAMES))
PRIMOP_BITS_STAGE2 = $(addprefix compiler/stage2/build/,$(PRIMOP_BITS_NAMES))
PRIMOP_BITS_STAGE3 = $(addprefix compiler/stage3/build/,$(PRIMOP_BITS_NAMES))
Ian Lynagh's avatar
Ian Lynagh committed
258

Ian Lynagh's avatar
Ian Lynagh committed
259
compiler_CPP_OPTS += $(addprefix -I,$(GHC_INCLUDE_DIRS))
Ian Lynagh's avatar
Ian Lynagh committed
260 261
compiler_CPP_OPTS += ${GhcCppOpts}

262 263 264 265 266
# We add these paths to the Haskell compiler's #include search path list since
# we must avoid #including files by paths relative to the source file as Hadrian
# moves the build artifacts out of the source tree. See #8040.
compiler_HC_OPTS += $(addprefix -I,$(GHC_INCLUDE_DIRS))

267 268
define preprocessCompilerFiles
# $0 = stage
269
compiler/stage$1/build/primops.txt: compiler/prelude/primops.txt.pp compiler/stage$1/$$(PLATFORM_H)
thomie's avatar
thomie committed
270
	$$(HS_CPP) -P $$(compiler_CPP_OPTS) -Icompiler/stage$1 -x c $$< | grep -v '^#pragma GCC' > $$@
271

272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
compiler/stage$1/build/primop-data-decl.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --data-decl          < $$< > $$@
compiler/stage$1/build/primop-tag.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --primop-tag         < $$< > $$@
compiler/stage$1/build/primop-list.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --primop-list        < $$< > $$@
compiler/stage$1/build/primop-has-side-effects.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --has-side-effects   < $$< > $$@
compiler/stage$1/build/primop-out-of-line.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --out-of-line        < $$< > $$@
compiler/stage$1/build/primop-commutable.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --commutable         < $$< > $$@
compiler/stage$1/build/primop-code-size.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --code-size          < $$< > $$@
compiler/stage$1/build/primop-can-fail.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --can-fail           < $$< > $$@
compiler/stage$1/build/primop-strictness.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --strictness         < $$< > $$@
compiler/stage$1/build/primop-fixity.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --fixity             < $$< > $$@
compiler/stage$1/build/primop-primop-info.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --primop-primop-info < $$< > $$@
294 295 296 297 298 299 300 301
compiler/stage$1/build/primop-vector-uniques.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --primop-vector-uniques     < $$< > $$@
compiler/stage$1/build/primop-vector-tys.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --primop-vector-tys         < $$< > $$@
compiler/stage$1/build/primop-vector-tys-exports.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --primop-vector-tys-exports < $$< > $$@
compiler/stage$1/build/primop-vector-tycons.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --primop-vector-tycons      < $$< > $$@
Ian Lynagh's avatar
Ian Lynagh committed
302

Jan Stolarek's avatar
Jan Stolarek committed
303
# Usages aren't used any more; but the generator
Ian Lynagh's avatar
Ian Lynagh committed
304
# can still generate them if we want them back
305 306
compiler/stage$1/build/primop-usage.hs-incl: compiler/stage$1/build/primops.txt $$$$(genprimopcode_INPLACE)
	"$$(genprimopcode_INPLACE)" --usage              < $$< > $$@
Ian Lynagh's avatar
Ian Lynagh committed
307

308 309 310 311 312 313
endef

$(eval $(call preprocessCompilerFiles,1))
$(eval $(call preprocessCompilerFiles,2))
$(eval $(call preprocessCompilerFiles,3))

Ian Lynagh's avatar
Ian Lynagh committed
314 315 316 317 318 319 320
# -----------------------------------------------------------------------------
# Configuration

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

321 322 323 324 325 326
ifeq "$(GhcThreaded)" "YES"
# We pass THREADED_RTS to the stage2 C files so that cbits/genSym.c will bring
# the threaded version of atomic_inc() into scope.
compiler_stage2_CONFIGURE_OPTS += --ghc-option=-optc-DTHREADED_RTS
endif

Ian Lynagh's avatar
Ian Lynagh committed
327 328 329 330 331 332 333 334 335 336 337 338 339
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 "$(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
340
compiler_stage2_CONFIGURE_OPTS += --ghc-option=-DGHCI_TABLES_NEXT_TO_CODE
Ian Lynagh's avatar
Ian Lynagh committed
341 342 343 344 345 346 347 348 349 350 351 352 353 354
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"
355 356
else
compiler_CONFIGURE_OPTS += --ghc-option=-DNO_REGS
Ian Lynagh's avatar
Ian Lynagh committed
357 358
endif

359 360 361 362 363
ifneq "$(GhcWithSMP)" "YES"
compiler_CONFIGURE_OPTS += --ghc-option=-DNOSMP
compiler_CONFIGURE_OPTS += --ghc-option=-optc-DNOSMP
endif

364 365 366 367
# 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 -O0 mode.
368
# Since GHC version 7.8, we need -fcmm-sink to be
369 370 371
# passed to the compiler. This is required on x86 to avoid the
# register allocator running out of stack slots when compiling this
# module with -fPIC -dynamic.
372
# See #8182 for all the details
373
compiler/stage1/build/Parser_HC_OPTS += -O0 -fno-ignore-interface-pragmas -fcmm-sink
374 375
compiler/stage2/build/Parser_HC_OPTS += -O0 -fno-ignore-interface-pragmas -fcmm-sink
compiler/stage3/build/Parser_HC_OPTS += -O0 -fno-ignore-interface-pragmas -fcmm-sink
376

377
ifeq "$(GhcProfiled)" "YES"
378 379 380 381
# 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
382
# as necessary.  Turn on -fprof-auto for individual modules like this:
383

384 385 386
# compiler/main/DriverPipeline_HC_OPTS += -fprof-auto
compiler/main/GhcMake_HC_OPTS        += -fprof-auto
compiler/main/GHC_HC_OPTS            += -fprof-auto
387

388
# or alternatively add {-# OPTIONS_GHC -fprof-auto #-} to the top of
389 390
# modules you're interested in.

Ian Lynagh's avatar
Ian Lynagh committed
391 392 393 394 395 396
# 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
397 398 399 400 401 402 403 404
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
405
compiler_stage2_HADDOCK_OPTS += --optghc=-DSTAGE=2
Ian Lynagh's avatar
Ian Lynagh committed
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420

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

# 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
421 422 423
compiler_stage1_SplitSections = NO
compiler_stage2_SplitSections = NO
compiler_stage3_SplitSections = NO
Ian Lynagh's avatar
Ian Lynagh committed
424

425 426 427 428
# There are too many symbols in the ghc package for a Windows DLL
# (due to a limitation of bfd ld, see Trac #5987). We therefore need to split
# some of the modules off into a separate DLL. This clump are the modules
# reachable from DynFlags:
429
compiler_stage2_dll0_START_MODULE = DynFlags
cactus's avatar
cactus committed
430 431
compiler_stage2_dll0_MODULES = \
	Annotations \
432
	ApiAnnotation \
cactus's avatar
cactus committed
433 434 435 436
	Avail \
	Bag \
	BasicTypes \
	Binary \
437
	BinFingerprint \
cactus's avatar
cactus committed
438 439 440 441 442 443
	BooleanFormula \
	BufWrite \
	Class \
	CmdLineParser \
	CmmType \
	CoAxiom \
cactus's avatar
cactus committed
444
	ConLike \
cactus's avatar
cactus committed
445 446 447 448 449 450 451 452 453 454
	Coercion \
	Config \
	Constants \
	CoreArity \
	CoreFVs \
	CoreSubst \
	CoreSyn \
	CoreTidy \
	CoreUnfold \
	CoreUtils \
455
	CoreSeq \
456
	CoreStats \
cactus's avatar
cactus committed
457 458 459 460 461 462 463 464 465 466 467 468 469
	CostCentre \
	DataCon \
	Demand \
	Digraph \
	DriverPhases \
	DynFlags \
	Encoding \
	ErrUtils \
	Exception \
	FamInstEnv \
	FastFunctions \
	FastMutInt \
	FastString \
Adam Gundry's avatar
Adam Gundry committed
470 471
	FastStringEnv \
	FieldLabel \
cactus's avatar
cactus committed
472 473 474
	Fingerprint \
	FiniteMap \
	ForeignCall \
475
	FV \
cactus's avatar
cactus committed
476 477 478 479 480 481 482
	Hooks \
	HsBinds \
	HsDecls \
	HsDoc \
	HsExpr \
	HsImpExp \
	HsLit \
483
	PlaceHolder \
484
	PmExpr \
cactus's avatar
cactus committed
485 486 487 488 489 490
	HsPat \
	HsSyn \
	HsTypes \
	HsUtils \
	HscTypes \
	IOEnv \
491
  NameCache \
cactus's avatar
cactus committed
492 493 494 495
	Id \
	IdInfo \
	IfaceSyn \
	IfaceType \
Ben Gamari's avatar
Ben Gamari committed
496
	ToIface \
cactus's avatar
cactus committed
497 498
	InstEnv \
	Kind \
499
	KnownUniques \
500
	Lexeme \
cactus's avatar
cactus committed
501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519
	ListSetOps \
	Literal \
	Maybes \
	MkCore \
	MkId \
	Module \
	MonadUtils \
	Name \
	NameEnv \
	NameSet \
	OccName \
	OccurAnal \
	OptCoercion \
	OrdList \
	Outputable \
	PackageConfig \
	Packages \
	Pair \
	Panic \
cactus's avatar
cactus committed
520
	PatSyn \
cactus's avatar
cactus committed
521 522 523 524 525 526 527 528
	PipelineMonad \
	Platform \
	PlatformConstants \
	PprCore \
	PrelNames \
	PrelRules \
	Pretty \
	PrimOp \
529
	RepType \
cactus's avatar
cactus committed
530 531 532 533 534
	RdrName \
	Rules \
	SrcLoc \
	StaticFlags \
	StringBuffer \
535
	SysTools.Terminal \
cactus's avatar
cactus committed
536 537 538 539 540 541
	TcEvidence \
	TcRnTypes \
	TcType \
	TrieMap \
	TyCon \
	Type \
542
	TyCoRep \
cactus's avatar
cactus committed
543 544 545
	TysPrim \
	TysWiredIn \
	Unify \
546
	UniqDFM \
547 548
	UniqDSet \
	UniqFM \
cactus's avatar
cactus committed
549 550 551 552 553 554 555
	UniqSet \
	UniqSupply \
	Unique \
	Util \
	Var \
	VarEnv \
	VarSet
556

557 558 559 560
ifeq "$(GhcWithInterpreter)" "YES"
# These files are reacheable from DynFlags
# only by GHCi-enabled code (see #9552)
compiler_stage2_dll0_MODULES += \
561 562
	ByteCodeTypes \
	InteractiveEvalTypes
563 564
endif

565 566
compiler_stage2_dll0_HS_OBJS = \
    $(patsubst %,compiler/stage2/build/%.$(dyn_osuf),$(subst .,/,$(compiler_stage2_dll0_MODULES)))
567

568
# if stage is set to something other than "1" or "", disable stage 1
569
# See Note [Stage1Only vs stage=1] in mk/config.mk.in.
570
ifneq "$(filter-out 1,$(stage))" ""
Ian Lynagh's avatar
Ian Lynagh committed
571 572
compiler_stage1_NOT_NEEDED = YES
endif
573 574 575 576 577
# 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
578 579
ifneq "$(stage)" "3"
compiler_stage3_NOT_NEEDED = YES
Ian Lynagh's avatar
Ian Lynagh committed
580
endif
581
$(eval $(call build-package,compiler,stage1,0))
Ian Lynagh's avatar
Ian Lynagh committed
582
$(eval $(call build-package,compiler,stage2,1))
583
$(eval $(call build-package,compiler,stage3,2))
Ian Lynagh's avatar
Ian Lynagh committed
584

585 586 587 588 589 590
# We only want to turn keepCAFs on if we will be loading dynamic
# Haskell libraries with GHCi. We therefore filter the object file
# out for non-dynamic ways.
define keepCAFsForGHCiDynOnly
# $1 = stage
# $2 = way
Simon Marlow's avatar
Simon Marlow committed
591 592
ifeq "$$(findstring dyn, $2)" ""
compiler_stage$1_$2_C_OBJS := $$(filter-out %/keepCAFsForGHCi.$$($2_osuf),$$(compiler_stage$1_$2_C_OBJS))
593 594 595 596 597 598
endif
endef
$(foreach w,$(compiler_stage1_WAYS),$(eval $(call keepCAFsForGHCiDynOnly,1,$w)))
$(foreach w,$(compiler_stage2_WAYS),$(eval $(call keepCAFsForGHCiDynOnly,2,$w)))
$(foreach w,$(compiler_stage3_WAYS),$(eval $(call keepCAFsForGHCiDynOnly,3,$w)))

599 600 601 602 603 604 605 606 607 608
# 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

609
# after build-package, because that sets compiler_stage1_HC_OPTS:
610 611 612 613 614
ifeq "$(V)" "0"
compiler_stage1_HC_OPTS += $(filter-out -Rghc-timing,$(GhcHcOpts)) $(GhcStage1HcOpts)
compiler_stage2_HC_OPTS += $(filter-out -Rghc-timing,$(GhcHcOpts)) $(GhcStage2HcOpts)
compiler_stage3_HC_OPTS += $(filter-out -Rghc-timing,$(GhcHcOpts)) $(GhcStage3HcOpts)
else
615 616 617
compiler_stage1_HC_OPTS += $(GhcHcOpts) $(GhcStage1HcOpts)
compiler_stage2_HC_OPTS += $(GhcHcOpts) $(GhcStage2HcOpts)
compiler_stage3_HC_OPTS += $(GhcHcOpts) $(GhcStage3HcOpts)
618
endif
619

Ian Lynagh's avatar
Ian Lynagh committed
620 621
ifneq "$(BINDIST)" "YES"

622 623 624
compiler_stage2_TAGS_HC_OPTS = -package ghc
$(eval $(call tags-package,compiler,stage2))

Ian Lynagh's avatar
Ian Lynagh committed
625 626 627
$(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
628

629 630 631 632
COMPILER_INCLUDES_DEPS += $(includes_H_CONFIG)
COMPILER_INCLUDES_DEPS += $(includes_H_PLATFORM)
COMPILER_INCLUDES_DEPS += $(includes_GHCCONSTANTS)
COMPILER_INCLUDES_DEPS += $(includes_GHCCONSTANTS_HASKELL_TYPE)
633 634
COMPILER_INCLUDES_DEPS += $(includes_GHCCONSTANTS_HASKELL_WRAPPERS)
COMPILER_INCLUDES_DEPS += $(includes_GHCCONSTANTS_HASKELL_EXPORTS)
635 636
COMPILER_INCLUDES_DEPS += $(includes_DERIVEDCONSTANTS)

637 638 639 640
$(compiler_stage1_depfile_haskell) : $(COMPILER_INCLUDES_DEPS) $(PRIMOP_BITS_STAGE1)
$(compiler_stage2_depfile_haskell) : $(COMPILER_INCLUDES_DEPS) $(PRIMOP_BITS_STAGE2)
$(compiler_stage3_depfile_haskell) : $(COMPILER_INCLUDES_DEPS) $(PRIMOP_BITS_STAGE3)

Simon Marlow's avatar
Simon Marlow committed
641
$(foreach way,$(compiler_stage1_WAYS),\
642
      compiler/stage1/build/PrimOp.$($(way)_osuf)) : $(PRIMOP_BITS_STAGE1)
Simon Marlow's avatar
Simon Marlow committed
643
$(foreach way,$(compiler_stage2_WAYS),\
644
      compiler/stage2/build/PrimOp.$($(way)_osuf)) : $(PRIMOP_BITS_STAGE2)
Simon Marlow's avatar
Simon Marlow committed
645
$(foreach way,$(compiler_stage3_WAYS),\
646
      compiler/stage3/build/PrimOp.$($(way)_osuf)) : $(PRIMOP_BITS_STAGE3)
647

Ian Lynagh's avatar
Ian Lynagh committed
648

649
# GHC itself doesn't know about the above dependencies, so we have to
650
# switch off the recompilation checker for that module:
651
compiler/prelude/PrimOp_HC_OPTS  += -fforce-recomp
652

653 654 655 656
ifeq "$(DYNAMIC_GHC_PROGRAMS)" "YES"
compiler/utils/Util_HC_OPTS += -DDYNAMIC_GHC_PROGRAMS
endif

Ian Lynagh's avatar
Ian Lynagh committed
657
endif