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

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

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

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

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

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
264

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

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

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

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

309 310 311 312 313 314
endef

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

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

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

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

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

365 366 367 368 369
# 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
370 371 372 373 374
# 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.
375
# See #8182 for all the details
376 377 378
ifeq "$(CMM_SINK_BOOTSTRAP_IS_NEEDED)" "YES"
compiler/stage1/build/Parser_HC_OPTS += -fcmm-sink
endif
379 380 381
# 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
382

383 384 385 386 387 388 389 390 391 392 393 394 395
# On IBM AIX we need to wrokaround XCOFF's TOC limitations (see also
# comment in `aclocal.m4` about `-mminimal-toc` for more details)
# However, Parser.hc defines so many symbols that `-mminimal-toc`
# generates instructions with offsets exceeding the PPC offset
# addressing limits.  So we need to counter-act this via `-mfull-toc`
# which disables a preceding `-mminimal-toc` again.
ifeq "$(HostOS_CPP)" "aix"
compiler/stage1/build/Parser_HC_OPTS += -optc-mfull-toc
endif
ifeq "$(TargetOS_CPP)" "aix"
compiler/stage2/build/Parser_HC_OPTS += -optc-mfull-toc
compiler/stage3/build/Parser_HC_OPTS += -optc-mfull-toc
endif
396 397

ifeq "$(GhcProfiled)" "YES"
398 399 400 401
# 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
402
# as necessary.  Turn on -fprof-auto for individual modules like this:
403

404 405 406
# compiler/main/DriverPipeline_HC_OPTS += -fprof-auto
compiler/main/GhcMake_HC_OPTS        += -fprof-auto
compiler/main/GHC_HC_OPTS            += -fprof-auto
407

408
# or alternatively add {-# OPTIONS_GHC -fprof-auto #-} to the top of
409 410
# modules you're interested in.

Ian Lynagh's avatar
Ian Lynagh committed
411 412 413 414 415 416
# 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
417 418 419 420 421 422 423 424
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
425
compiler_stage2_HADDOCK_OPTS += --optghc=-DSTAGE=2
Ian Lynagh's avatar
Ian Lynagh committed
426 427 428 429 430 431 432 433 434 435

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

436
# Note [fiddle-stage1-version]
437 438 439 440 441 442
# 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.
443 444 445 446
#
# Note: we also have to tweak the version number of the package itself
# when it gets registered; see Note [munge-stage1-package-config]
# below.
447 448
# The ProjectPatchLevel > 20000000 iff it's a date. If it's e.g. 6.12.1
# then we don't want to remove it
449
ifneq "$(CLEANING)" "YES"
450 451 452
ifeq "$(shell [ $(ProjectPatchLevel) -gt 20000000 ] && echo YES)" "YES"
compiler_stage1_VERSION_MUNGED = YES
endif
453
endif
454

455
ifeq "$(compiler_stage1_VERSION_MUNGED)" "YES"
Ian Lynagh's avatar
Ian Lynagh committed
456
compiler_stage1_MUNGED_VERSION = $(subst .$(ProjectPatchLevel),,$(ProjectVersion))
457
define compiler_PACKAGE_MAGIC
Ian Lynagh's avatar
Ian Lynagh committed
458
compiler_stage1_VERSION = $(compiler_stage1_MUNGED_VERSION)
459 460
compiler_stage1_COMPONENT_ID = $(subst .$(ProjectPatchLevel),,$(compiler_stage1_COMPONENT_ID))
compiler_stage1_COMPONENT_ID = $(subst .$(ProjectPatchLevel),,$(compiler_stage1_COMPONENT_ID))
461
endef
462

463
# NB: the COMPONENT_ID munging has no effect for new-style unit ids
464
# (which indeed, have nothing version like in them, but are important for
465
# old-style unit ids which do.)  The subst operation is idempotent, so
466 467
# as long as we do it at least once we should be good.

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

471
endif
472

Ian Lynagh's avatar
Ian Lynagh committed
473 474 475 476 477
# 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
478 479 480
compiler_stage1_SplitSections = NO
compiler_stage2_SplitSections = NO
compiler_stage3_SplitSections = NO
Ian Lynagh's avatar
Ian Lynagh committed
481

482 483
# 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
484
# DLL. This clump are the modules reachable from DynFlags:
485
compiler_stage2_dll0_START_MODULE = DynFlags
cactus's avatar
cactus committed
486 487
compiler_stage2_dll0_MODULES = \
	Annotations \
488
	ApiAnnotation \
cactus's avatar
cactus committed
489 490 491 492 493 494 495 496 497 498 499
	Avail \
	Bag \
	BasicTypes \
	Binary \
	BooleanFormula \
	BreakArray \
	BufWrite \
	Class \
	CmdLineParser \
	CmmType \
	CoAxiom \
cactus's avatar
cactus committed
500
	ConLike \
cactus's avatar
cactus committed
501 502 503 504 505 506 507 508 509 510
	Coercion \
	Config \
	Constants \
	CoreArity \
	CoreFVs \
	CoreSubst \
	CoreSyn \
	CoreTidy \
	CoreUnfold \
	CoreUtils \
511
	CoreSeq \
512
	CoreStats \
cactus's avatar
cactus committed
513
	CostCentre \
Alan Zimmerman's avatar
Alan Zimmerman committed
514
	Ctype \
cactus's avatar
cactus committed
515 516 517 518 519 520 521 522 523 524 525 526
	DataCon \
	Demand \
	Digraph \
	DriverPhases \
	DynFlags \
	Encoding \
	ErrUtils \
	Exception \
	FamInstEnv \
	FastFunctions \
	FastMutInt \
	FastString \
Adam Gundry's avatar
Adam Gundry committed
527 528
	FastStringEnv \
	FieldLabel \
cactus's avatar
cactus committed
529 530 531
	Fingerprint \
	FiniteMap \
	ForeignCall \
532
	FV \
cactus's avatar
cactus committed
533 534 535 536 537 538 539
	Hooks \
	HsBinds \
	HsDecls \
	HsDoc \
	HsExpr \
	HsImpExp \
	HsLit \
540
	PlaceHolder \
cactus's avatar
cactus committed
541 542 543 544 545 546 547 548 549 550 551 552
	HsPat \
	HsSyn \
	HsTypes \
	HsUtils \
	HscTypes \
	IOEnv \
	Id \
	IdInfo \
	IfaceSyn \
	IfaceType \
	InstEnv \
	Kind \
553
	Lexeme \
Alan Zimmerman's avatar
Alan Zimmerman committed
554
	Lexer \
cactus's avatar
cactus committed
555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573
	ListSetOps \
	Literal \
	Maybes \
	MkCore \
	MkId \
	Module \
	MonadUtils \
	Name \
	NameEnv \
	NameSet \
	OccName \
	OccurAnal \
	OptCoercion \
	OrdList \
	Outputable \
	PackageConfig \
	Packages \
	Pair \
	Panic \
cactus's avatar
cactus committed
574
	PatSyn \
cactus's avatar
cactus committed
575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598
	PipelineMonad \
	Platform \
	PlatformConstants \
	PprCore \
	PrelNames \
	PrelRules \
	Pretty \
	PrimOp \
	RdrName \
	Rules \
	Serialized \
	SrcLoc \
	StaticFlags \
	StringBuffer \
	TcEvidence \
	TcRnTypes \
	TcType \
	TrieMap \
	TyCon \
	Type \
	TypeRep \
	TysPrim \
	TysWiredIn \
	Unify \
599
	UniqDFM \
600 601
	UniqDSet \
	UniqFM \
cactus's avatar
cactus committed
602 603 604 605 606 607 608
	UniqSet \
	UniqSupply \
	Unique \
	Util \
	Var \
	VarEnv \
	VarSet
609

610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625
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 \
626
	CmmSwitch \
627 628 629
	CmmUtils \
	CodeGen.Platform \
	CodeGen.Platform.ARM \
630
	CodeGen.Platform.ARM64 \
631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658
	CodeGen.Platform.NoRegs \
	CodeGen.Platform.PPC \
	CodeGen.Platform.PPC_Darwin \
	CodeGen.Platform.SPARC \
	CodeGen.Platform.X86 \
	CodeGen.Platform.X86_64 \
	Hoopl \
	Hoopl.Dataflow \
	InteractiveEvalTypes \
	MkGraph \
	PprCmm \
	PprCmmDecl \
	PprCmmExpr \
	Reg \
	RegClass \
	SMRep \
	StgCmmArgRep \
	StgCmmClosure \
	StgCmmEnv \
	StgCmmLayout \
	StgCmmMonad \
	StgCmmProf \
	StgCmmTicky \
	StgCmmUtils \
	StgSyn \
	Stream
endif

659 660
compiler_stage2_dll0_HS_OBJS = \
    $(patsubst %,compiler/stage2/build/%.$(dyn_osuf),$(subst .,/,$(compiler_stage2_dll0_MODULES)))
661

662
# if stage is set to something other than "1" or "", disable stage 1
663
# See Note [Stage1Only vs stage=1] in mk/config.mk.in.
664
ifneq "$(filter-out 1,$(stage))" ""
Ian Lynagh's avatar
Ian Lynagh committed
665 666
compiler_stage1_NOT_NEEDED = YES
endif
667 668 669 670 671
# 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
672 673
ifneq "$(stage)" "3"
compiler_stage3_NOT_NEEDED = YES
Ian Lynagh's avatar
Ian Lynagh committed
674
endif
675
$(eval $(call build-package,compiler,stage1,0))
Ian Lynagh's avatar
Ian Lynagh committed
676
$(eval $(call build-package,compiler,stage2,1))
677
$(eval $(call build-package,compiler,stage3,2))
Ian Lynagh's avatar
Ian Lynagh committed
678

679 680 681 682 683 684
# 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
685 686
ifeq "$$(findstring dyn, $2)" ""
compiler_stage$1_$2_C_OBJS := $$(filter-out %/keepCAFsForGHCi.$$($2_osuf),$$(compiler_stage$1_$2_C_OBJS))
687 688 689 690 691 692
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)))

693 694 695 696 697 698 699 700 701 702
# 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

703
# after build-package, because that sets compiler_stage1_HC_OPTS:
704 705 706 707 708
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
709 710 711
compiler_stage1_HC_OPTS += $(GhcHcOpts) $(GhcStage1HcOpts)
compiler_stage2_HC_OPTS += $(GhcHcOpts) $(GhcStage2HcOpts)
compiler_stage3_HC_OPTS += $(GhcHcOpts) $(GhcStage3HcOpts)
712
endif
713

Ian Lynagh's avatar
Ian Lynagh committed
714 715
ifneq "$(BINDIST)" "YES"

716 717 718
compiler_stage2_TAGS_HC_OPTS = -package ghc
$(eval $(call tags-package,compiler,stage2))

Ian Lynagh's avatar
Ian Lynagh committed
719 720 721
$(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
722

723 724 725 726
COMPILER_INCLUDES_DEPS += $(includes_H_CONFIG)
COMPILER_INCLUDES_DEPS += $(includes_H_PLATFORM)
COMPILER_INCLUDES_DEPS += $(includes_GHCCONSTANTS)
COMPILER_INCLUDES_DEPS += $(includes_GHCCONSTANTS_HASKELL_TYPE)
727 728
COMPILER_INCLUDES_DEPS += $(includes_GHCCONSTANTS_HASKELL_WRAPPERS)
COMPILER_INCLUDES_DEPS += $(includes_GHCCONSTANTS_HASKELL_EXPORTS)
729 730
COMPILER_INCLUDES_DEPS += $(includes_DERIVEDCONSTANTS)

731 732 733 734
$(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
735
$(foreach way,$(compiler_stage1_WAYS),\
736
      compiler/stage1/build/PrimOp.$($(way)_osuf)) : $(PRIMOP_BITS_STAGE1)
Simon Marlow's avatar
Simon Marlow committed
737
$(foreach way,$(compiler_stage2_WAYS),\
738
      compiler/stage2/build/PrimOp.$($(way)_osuf)) : $(PRIMOP_BITS_STAGE2)
Simon Marlow's avatar
Simon Marlow committed
739
$(foreach way,$(compiler_stage3_WAYS),\
740
      compiler/stage3/build/PrimOp.$($(way)_osuf)) : $(PRIMOP_BITS_STAGE3)
741

Ian Lynagh's avatar
Ian Lynagh committed
742

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

747 748 749 750
ifeq "$(DYNAMIC_GHC_PROGRAMS)" "YES"
compiler/utils/Util_HC_OPTS += -DDYNAMIC_GHC_PROGRAMS
endif

751
# LibFFI.hs #includes ffi.h
752
ifneq "$(UseSystemLibFFI)" "YES"
753
compiler/stage2/build/LibFFI.hs : $(libffi_HEADERS)
754 755
endif

756 757 758
# Note [munge-stage1-package-config]
# Strip the date/patchlevel from the version of stage1.  See Note
# [fiddle-stage1-version] above.
759
# NB: The sed expression for hs-libraries is a bit weird to be POSIX-compliant.
760
ifeq "$(compiler_stage1_VERSION_MUNGED)" "YES"
761
compiler/stage1/inplace-pkg-config-munged: compiler/stage1/inplace-pkg-config
762
	sed -e 's/^\(version: .*\)\.$(ProjectPatchLevel)$$/\1/' \
763
	    -e 's/^\(id: .*\)\.$(ProjectPatchLevel)$$/\1/' \
764
	    -e 's/^\(hs-libraries: HSghc-.*\)\.$(ProjectPatchLevel)\(-[A-Za-z0-9][A-Za-z0-9]*\)*$$/\1\2/' \
765
	  < $< > $@
766
	"$(compiler_stage1_GHC_PKG)" update --force $(compiler_stage1_GHC_PKG_OPTS) $@
767

Ian Lynagh's avatar
Ian Lynagh committed
768 769 770
# 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
771 772
endif

Ian Lynagh's avatar
Ian Lynagh committed
773 774
endif