summaryrefslogtreecommitdiff
path: root/ghc/Makefile
blob: ed7d24b643466285e4314c3e96a8c6d240683d2d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155

TOP=..
include $(TOP)/mk/boilerplate.mk
include $(TOP)/mk/cabal-flags.mk

ifeq "$(stage)" ""
stage=1
endif

ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32"
INSTALL_FLAGS =
else
INSTALL_FLAGS = --enable-shell-wrappers
endif

# Don't strip the inplace versions, we might need to debug them
INPLACE_INSTALL_FLAGS += --disable-executable-stripping

boot:: boot.stage.$(stage)

all:: build.stage.$(stage)

rebuild ::
	-$(CABAL) clean --distpref dist-stage$(stage)
	$(RM) -rf stage$(stage)-inplace
	$(MAKE) boot all

stage1 ::
	$(MAKE) stage=1

stage2 ::
	$(MAKE) stage=2

stage3 ::
	$(MAKE) stage=3


ifeq "$(CLEAN_ALL_STAGES)" "YES"
clean distclean maintainer-clean:: clean.stage.1 clean.stage.2 clean.stage.3
else
clean distclean maintainer-clean:: clean.stage.$(stage)
endif

ifeq "$(CLEAN_ALL_STAGES)" "YES"
distclean maintainer-clean::
	$(RM) -f ghc-bin.cabal
endif

clean.stage.%:
	$(RM) -rf stage$*-inplace
# This is a bit naughty. We ought to use:
#	-$(CABAL) clean --distpref dist-stage$*
# but that won't work if the Cabal file (a generated file) doesn't
# exist. So we do this instead:
	$(RM) -rf dist-stage$*

CONFIGURE_FLAGS_STAGE1 += --flags=-ghci

ifeq "$(GhcWithInterpreter)" "YES"
CONFIGURE_FLAGS_STAGE2PLUS += --flags=ghci
else
CONFIGURE_FLAGS_STAGE2PLUS += --flags=-ghci
endif

ifeq "$(GhcProfiled)" "YES"
CONFIGURE_FLAGS_STAGE2PLUS += --enable-executable-profiling
endif
ifeq "$(GhcDebugged)" "YES"
CONFIGURE_FLAGS_STAGE2PLUS += --ghc-option=-debug
endif
ifeq "$(GhcThreaded)" "YES"
# Use threaded RTS with GHCi, so threads don't get blocked at the prompt.
CONFIGURE_FLAGS_STAGE2PLUS += --ghc-option=-threaded
endif

ifeq "$(BuildSharedLibs)" "YES"
CONFIGURE_FLAGS_STAGE2PLUS += --ghc-option=-dynamic
endif

CONFIGURE_FLAGS_STAGE2 = $(CONFIGURE_FLAGS_STAGE2PLUS)
CONFIGURE_FLAGS_STAGE3 = $(CONFIGURE_FLAGS_STAGE2PLUS)

CONFIGURE_FLAGS_STAGE1 += $(USE_BOOT_CONFIGURE_FLAGS)
CONFIGURE_FLAGS_STAGE2 += $(USE_STAGE1_CONFIGURE_FLAGS)
CONFIGURE_FLAGS_STAGE3 += $(USE_STAGE2_CONFIGURE_FLAGS)
CONFIGURE_FLAGS_STAGE3 += --package-db $(STAGE3_PACKAGE_CONF)

CONFIGURE_FLAGS_STAGE1 += $(foreach flag, $(GhcStage1HcOpts), --ghc-option=$(flag))
CONFIGURE_FLAGS_STAGE2 += $(foreach flag, $(GhcStage2HcOpts), --ghc-option=$(flag))
CONFIGURE_FLAGS_STAGE3 += $(foreach flag, $(GhcStage3HcOpts), --ghc-option=$(flag))

BUILD_FLAGS += $(patsubst %, --ghc-option=%, $(SRC_HC_OPTS))
# Allow EXTRA_HC_OPTS to be used from the command line to add options 
# when building (e.g. -v)
BUILD_FLAGS += $(patsubst %, --ghc-option=%, $(EXTRA_HC_OPTS))

# XXX In stage2+ we should really use the inplace ghc-pkg
# It works because installPackage doesn't actually use ghc-pkg, as there's
# no library to register

ifeq "$(stage)" "1"
ifeq "$(ghc_ge_609)" "NO"
# GHC 6.9+ can handle cross-package recompilation checking, but
# we don't rely on the bootstrapping compiler being able to do this.
TOUCH_MAIN = $(RM) dist-stage1/build/ghc/ghc-tmp/Main.o
endif
endif

dist-stage1 dist-stage2 dist-stage3: dist-stage%: boot.stage.%

boot.stage.%:
	$(CABAL) configure --distpref dist-stage$*         \
	                   $(INSTALL_DIRS_CONFIGURE_FLAGS) \
	                   $(CONFIGURE_FLAGS_STAGE$*)      \
	                   $(COMMON_CONFIGURE_FLAGS)       \
	                   --libsubdir=.                   \
	                   --datadir='$$libdir'            \
	                   --datasubdir=.

build.stage.%: dist-stage%
	$(TOUCH_MAIN)
	$(CABAL) build     --distpref dist-stage$* $(BUILD_FLAGS)
	$(INSTALL_PACKAGE) install '$(GHC_PKG_PROG)' 'XXX/package.conf' "" \
	                   $(FPTOOLS_TOP_ABS)/ghc/stage$*-inplace          \
	                   $(FPTOOLS_TOP_ABS)/ghc/stage$*-inplace          \
	                   '$$prefix'                                      \
	                   '$(INPLACE_DATA_DIR)'                           \
	                   '$$prefix/libexec'                              \
	                   '$$prefix/dynlib'                               \
	                   '$(INPLACE_DATA_DIR)'                           \
	                   '$$prefix/doc'                                  \
	                   '$$prefix/html'                                 \
	                   '$$prefix/haddock'                              \
	                   --distpref dist-stage$*                         \
	                   $(INPLACE_INSTALL_FLAGS)                        \
	                   $(INSTALL_FLAGS)

# XXX For now we always install the stage 2 compiler
install:
	$(INSTALL_PACKAGE) install UNUSED UNUSED '$(DESTDIR)' '$(prefix)' \
	                   '$(prefix)' '$(bindir)' '$(libdir)'            \
                       '$(libexecdir)' '$(dynlibdir)' '$(datadir)'    \
                       '$(docdir)' '$(htmldir)' '$(haddockdir)'       \
	                   --distpref dist-stage2                         \
	                   $(INSTALL_FLAGS)

html:
	@:

install-docs:
	@:

include $(TOP)/mk/bindist.mk
EXE_DIST_DIR = dist-stage2