ghc.mk 30.3 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"
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

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 105 106 107 108 109
	@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 'cGhcEnableTablesNextToCode :: String'                        >> $@
	@echo 'cGhcEnableTablesNextToCode = "$(GhcEnableTablesNextToCode)"' >> $@
	@echo 'cLeadingUnderscore    :: String'                             >> $@
	@echo 'cLeadingUnderscore    = "$(LeadingUnderscore)"'              >> $@
	@echo 'cGHC_UNLIT_PGM        :: String'                             >> $@
110
	@echo 'cGHC_UNLIT_PGM        = "$(utils/unlit_dist_PROG)"'          >> $@
Ian Lynagh's avatar
Ian Lynagh committed
111
	@echo 'cGHC_SPLIT_PGM        :: String'                             >> $@
112
	@echo 'cGHC_SPLIT_PGM        = "$(driver/split_dist_PROG)"'         >> $@
Ian Lynagh's avatar
Ian Lynagh committed
113
	@echo 'cLibFFI               :: Bool'                               >> $@
Ian Lynagh's avatar
Ian Lynagh committed
114
ifeq "$(UseLibFFIForAdjustors)" "YES"
Ian Lynagh's avatar
Ian Lynagh committed
115
	@echo 'cLibFFI               = True'                                >> $@
Ian Lynagh's avatar
Ian Lynagh committed
116
else
Ian Lynagh's avatar
Ian Lynagh committed
117
	@echo 'cLibFFI               = False'                               >> $@
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
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
134 135 136 137 138 139 140 141 142 143 144 145 146
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

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

compiler/stage3/$(PLATFORM_H) : compiler/stage2/$(PLATFORM_H)
237
	"$(CP)" $< $@
Ian Lynagh's avatar
Ian Lynagh committed
238 239

# ----------------------------------------------------------------------------
Jan Stolarek's avatar
Jan Stolarek committed
240
#		Generate supporting stuff for prelude/PrimOp.lhs
Ian Lynagh's avatar
Ian Lynagh committed
241 242
#		from prelude/primops.txt

243 244 245 246 247 248 249 250 251
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       \
252 253 254 255 256 257
                    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
258 259 260 261

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
262

Ian Lynagh's avatar
Ian Lynagh committed
263
compiler_CPP_OPTS += $(addprefix -I,$(GHC_INCLUDE_DIRS))
Ian Lynagh's avatar
Ian Lynagh committed
264 265
compiler_CPP_OPTS += ${GhcCppOpts}

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

271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292
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 < $$< > $$@
293 294 295 296 297 298 299 300
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
301

Jan Stolarek's avatar
Jan Stolarek committed
302
# Usages aren't used any more; but the generator
Ian Lynagh's avatar
Ian Lynagh committed
303
# can still generate them if we want them back
304 305
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
306

307 308 309 310 311 312
endef

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

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

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

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

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

363 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.
compiler/stage1/build/Parser_HC_OPTS += -O0 -fno-ignore-interface-pragmas
368 369 370 371 372
# If we're bootstrapping the compiler during stage2, or we're being
# built by a GHC whose version is > 7.8, we need -fcmm-sink to be
# 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.
373
# See #8182 for all the details
374 375 376
ifeq "$(CMM_SINK_BOOTSTRAP_IS_NEEDED)" "YES"
compiler/stage1/build/Parser_HC_OPTS += -fcmm-sink
endif
377 378 379
# We also pass -fcmm-sink to every stage != 1
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
380

381 382

ifeq "$(GhcProfiled)" "YES"
383 384 385 386 387 388
# 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:

Simon Marlow's avatar
Simon Marlow committed
389
# compiler/main/DriverPipeline_HC_OPTS += -auto-all
390 391 392
compiler/main/GhcMake_HC_OPTS        += -auto-all
compiler/main/GHC_HC_OPTS            += -auto-all

Gabor Greif's avatar
Gabor Greif committed
393
# or alternatively add {-# OPTIONS_GHC -auto-all #-} to the top of
394 395
# modules you're interested in.

Ian Lynagh's avatar
Ian Lynagh committed
396 397 398 399 400 401
# 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
402 403 404 405 406 407 408 409
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
410
compiler_stage2_HADDOCK_OPTS += --optghc=-DSTAGE=2
Ian Lynagh's avatar
Ian Lynagh committed
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

421
# Note [fiddle-stage1-version]
422 423 424 425 426 427
# 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.
428 429 430 431
#
# Note: we also have to tweak the version number of the package itself
# when it gets registered; see Note [munge-stage1-package-config]
# below.
432 433
# The ProjectPatchLevel > 20000000 iff it's a date. If it's e.g. 6.12.1
# then we don't want to remove it
434
ifneq "$(CLEANING)" "YES"
435 436 437
ifeq "$(shell [ $(ProjectPatchLevel) -gt 20000000 ] && echo YES)" "YES"
compiler_stage1_VERSION_MUNGED = YES
endif
438
endif
439

440
ifeq "$(compiler_stage1_VERSION_MUNGED)" "YES"
441
compiler_stage1_MUNGED_VERSION = $(subst .$(ProjectPatchLevel),,$(ProjectVersion))
442
define compiler_PACKAGE_MAGIC
443
compiler_stage1_VERSION = $(compiler_stage1_MUNGED_VERSION)
444
compiler_stage1_PACKAGE_KEY = $(subst .$(ProjectPatchLevel),,$(compiler_stage1_PACKAGE_KEY))
445
compiler_stage1_LIB_NAME = $(subst .$(ProjectPatchLevel),,$(compiler_stage1_LIB_NAME))
446
endef
447

448 449 450 451 452
# NB: the PACKAGE_KEY munging has no effect for new-style package keys
# (which indeed, have nothing version like in them, but are important for
# old-style package keys which do.)  The subst operation is idempotent, so
# as long as we do it at least once we should be good.

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

456
endif
457

Ian Lynagh's avatar
Ian Lynagh committed
458 459 460 461 462 463
# 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

464 465
# There are too many symbols in the ghc package for a Windows DLL.
# We therefore need to split some of the modules off into a separate
466
# DLL. This clump are the modules reachable from DynFlags:
467
compiler_stage2_dll0_START_MODULE = DynFlags
cactus's avatar
cactus committed
468 469
compiler_stage2_dll0_MODULES = \
	Annotations \
470
	ApiAnnotation \
cactus's avatar
cactus committed
471 472 473 474 475 476 477 478 479 480 481
	Avail \
	Bag \
	BasicTypes \
	Binary \
	BooleanFormula \
	BreakArray \
	BufWrite \
	Class \
	CmdLineParser \
	CmmType \
	CoAxiom \
cactus's avatar
cactus committed
482
	ConLike \
cactus's avatar
cactus committed
483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517
	Coercion \
	Config \
	Constants \
	CoreArity \
	CoreFVs \
	CoreSubst \
	CoreSyn \
	CoreTidy \
	CoreUnfold \
	CoreUtils \
	CostCentre \
	DataCon \
	Demand \
	Digraph \
	DriverPhases \
	DynFlags \
	Encoding \
	ErrUtils \
	Exception \
	ExtsCompat46 \
	FamInstEnv \
	FastFunctions \
	FastMutInt \
	FastString \
	FastTypes \
	Fingerprint \
	FiniteMap \
	ForeignCall \
	Hooks \
	HsBinds \
	HsDecls \
	HsDoc \
	HsExpr \
	HsImpExp \
	HsLit \
518
	PlaceHolder \
cactus's avatar
cactus committed
519 520 521 522 523 524 525 526 527 528 529 530
	HsPat \
	HsSyn \
	HsTypes \
	HsUtils \
	HscTypes \
	IOEnv \
	Id \
	IdInfo \
	IfaceSyn \
	IfaceType \
	InstEnv \
	Kind \
531
	Lexeme \
cactus's avatar
cactus committed
532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550
	ListSetOps \
	Literal \
	Maybes \
	MkCore \
	MkId \
	Module \
	MonadUtils \
	Name \
	NameEnv \
	NameSet \
	OccName \
	OccurAnal \
	OptCoercion \
	OrdList \
	Outputable \
	PackageConfig \
	Packages \
	Pair \
	Panic \
cactus's avatar
cactus committed
551
	PatSyn \
cactus's avatar
cactus committed
552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583
	PipelineMonad \
	Platform \
	PlatformConstants \
	PprCore \
	PrelNames \
	PrelRules \
	Pretty \
	PrimOp \
	RdrName \
	Rules \
	Serialized \
	SrcLoc \
	StaticFlags \
	StringBuffer \
	TcEvidence \
	TcRnTypes \
	TcType \
	TrieMap \
	TyCon \
	Type \
	TypeRep \
	TysPrim \
	TysWiredIn \
	Unify \
	UniqFM \
	UniqSet \
	UniqSupply \
	Unique \
	Util \
	Var \
	VarEnv \
	VarSet
584

585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600
ifeq "$(GhcWithInterpreter)" "YES"
# These files are reacheable from DynFlags
# only by GHCi-enabled code (see #9552)
compiler_stage2_dll0_MODULES += \
	Bitmap \
	BlockId \
	ByteCodeAsm \
	ByteCodeInstr \
	ByteCodeItbls \
	CLabel \
	Cmm \
	CmmCallConv \
	CmmExpr \
	CmmInfo \
	CmmMachOp \
	CmmNode \
601
	CmmSwitch \
602 603 604
	CmmUtils \
	CodeGen.Platform \
	CodeGen.Platform.ARM \
605
	CodeGen.Platform.ARM64 \
606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634
	CodeGen.Platform.NoRegs \
	CodeGen.Platform.PPC \
	CodeGen.Platform.PPC_Darwin \
	CodeGen.Platform.SPARC \
	CodeGen.Platform.X86 \
	CodeGen.Platform.X86_64 \
	FastBool \
	Hoopl \
	Hoopl.Dataflow \
	InteractiveEvalTypes \
	MkGraph \
	PprCmm \
	PprCmmDecl \
	PprCmmExpr \
	Reg \
	RegClass \
	SMRep \
	StgCmmArgRep \
	StgCmmClosure \
	StgCmmEnv \
	StgCmmLayout \
	StgCmmMonad \
	StgCmmProf \
	StgCmmTicky \
	StgCmmUtils \
	StgSyn \
	Stream
endif

635 636
compiler_stage2_dll0_HS_OBJS = \
    $(patsubst %,compiler/stage2/build/%.$(dyn_osuf),$(subst .,/,$(compiler_stage2_dll0_MODULES)))
637

638 639
# 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
640 641
compiler_stage1_NOT_NEEDED = YES
endif
642 643 644 645 646
# 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
647 648
ifneq "$(stage)" "3"
compiler_stage3_NOT_NEEDED = YES
Ian Lynagh's avatar
Ian Lynagh committed
649
endif
650
$(eval $(call build-package,compiler,stage1,0))
Ian Lynagh's avatar
Ian Lynagh committed
651
$(eval $(call build-package,compiler,stage2,1))
652
$(eval $(call build-package,compiler,stage3,2))
Ian Lynagh's avatar
Ian Lynagh committed
653

654 655 656 657 658 659 660 661 662 663 664 665 666 667
# 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
ifeq "$$(findstring dyn, $1)" ""
compiler_stage$1_$2_C_OBJS := $$(filter-out %/keepCAFsForGHCi.o,$$(compiler_stage$1_$2_C_OBJS))
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)))

668 669 670 671 672 673 674 675 676 677
# 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

678
# after build-package, because that sets compiler_stage1_HC_OPTS:
679 680 681
compiler_stage1_HC_OPTS += $(GhcHcOpts) $(GhcStage1HcOpts)
compiler_stage2_HC_OPTS += $(GhcHcOpts) $(GhcStage2HcOpts)
compiler_stage3_HC_OPTS += $(GhcHcOpts) $(GhcStage3HcOpts)
682

Ian Lynagh's avatar
Ian Lynagh committed
683 684
ifneq "$(BINDIST)" "YES"

685 686 687
compiler_stage2_TAGS_HC_OPTS = -package ghc
$(eval $(call tags-package,compiler,stage2))

Ian Lynagh's avatar
Ian Lynagh committed
688 689 690
$(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
691

692 693 694 695
COMPILER_INCLUDES_DEPS += $(includes_H_CONFIG)
COMPILER_INCLUDES_DEPS += $(includes_H_PLATFORM)
COMPILER_INCLUDES_DEPS += $(includes_GHCCONSTANTS)
COMPILER_INCLUDES_DEPS += $(includes_GHCCONSTANTS_HASKELL_TYPE)
696 697
COMPILER_INCLUDES_DEPS += $(includes_GHCCONSTANTS_HASKELL_WRAPPERS)
COMPILER_INCLUDES_DEPS += $(includes_GHCCONSTANTS_HASKELL_EXPORTS)
698 699
COMPILER_INCLUDES_DEPS += $(includes_DERIVEDCONSTANTS)

700 701 702 703
$(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
704
$(foreach way,$(compiler_stage1_WAYS),\
705
      compiler/stage1/build/PrimOp.$($(way)_osuf)) : $(PRIMOP_BITS_STAGE1)
Simon Marlow's avatar
Simon Marlow committed
706
$(foreach way,$(compiler_stage2_WAYS),\
707
      compiler/stage2/build/PrimOp.$($(way)_osuf)) : $(PRIMOP_BITS_STAGE2)
Simon Marlow's avatar
Simon Marlow committed
708
$(foreach way,$(compiler_stage3_WAYS),\
709
      compiler/stage3/build/PrimOp.$($(way)_osuf)) : $(PRIMOP_BITS_STAGE3)
710

711

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

716 717 718 719
ifeq "$(DYNAMIC_GHC_PROGRAMS)" "YES"
compiler/utils/Util_HC_OPTS += -DDYNAMIC_GHC_PROGRAMS
endif

720
# LibFFI.hs #includes ffi.h
721
ifneq "$(UseSystemLibFFI)" "YES"
722
compiler/stage2/build/LibFFI.hs : $(libffi_HEADERS)
723 724
endif

725 726 727
# Note [munge-stage1-package-config]
# Strip the date/patchlevel from the version of stage1.  See Note
# [fiddle-stage1-version] above.
728
# NB: The sed expression for hs-libraries is a bit weird to be POSIX-compliant.
729
ifeq "$(compiler_stage1_VERSION_MUNGED)" "YES"
730
compiler/stage1/inplace-pkg-config-munged: compiler/stage1/inplace-pkg-config
731
	sed -e 's/^\(version: .*\)\.$(ProjectPatchLevel)$$/\1/' \
732
	    -e 's/^\(id: .*\)\.$(ProjectPatchLevel)$$/\1/' \
733
	    -e 's/^\(hs-libraries: HSghc-.*\)\.$(ProjectPatchLevel)\(-[A-Za-z0-9][A-Za-z0-9]*\)*$$/\1\2/' \
734
	  < $< > $@
735
	"$(compiler_stage1_GHC_PKG)" update --force $(compiler_stage1_GHC_PKG_OPTS) $@
736

Ian Lynagh's avatar
Ian Lynagh committed
737 738 739
# 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
740 741
endif

Ian Lynagh's avatar
Ian Lynagh committed
742 743
endif