Makefile 19.2 KB
Newer Older
1
############################################################################
2
#
3
#		This is the top-level Makefile for GHC
4
#
5
6
# Targets: 
#
lennart@augustsson.net's avatar
lennart@augustsson.net committed
7
# 	bootstrap (DEFAULT)
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
#		Builds GHC, then builds the libraries,
#		then uses this GHC ("stage 1") to build itself
#		("stage 2").
#
#	bootstrap2
#		Same as bootstrap
#
#	bootstrap3
#		bootstrap2 + we build GHC one more time ("stage 3")
#
#	stage1
#		Just build up to stage 1
#
#	stage2
#		Just build stage 2 (stage 1 must be built)
#
#	stage3
#		Just build stage 3 (stage 2 must be built)
#
#	all
#		Same as bootstrap
#
#       install
#		Install everything, including stage 2 compiler by default
#		(override with stage=3, for example).
#
#	dist
#		Make a source dist (WARNING: runs 'make distclean' first)
#
#	binary-dist
#		Builds a binary distribution
#
#	hc-file-bundle
#		Builds an HC-file bundle, for bootstrapping
#
#	clean, distclean, maintainer-clean
#		Increasing levels of cleanliness
45
#
46
############################################################################
47

48
49
TOP=.
include $(TOP)/mk/boilerplate.mk
50

51
#
52
53
# Order is important! It's e.g. necessary to descend into include/
# before the rest to have a config.h, etc.
54
#
55
56
57
58
# If we're booting from .hc files, swap the order
# we descend into subdirs - to boot utils must be before driver.
#
.PHONY: stage1 stage2 stage3 bootstrap bootstrap2 bootstrap3
59

60
61
# We can't 'make boot' in libraries until stage1 is built
ifeq "$(BootingFromHc)" "YES"
62
SUBDIRS_NOLIB = includes rts compat compiler docs utils driver
63
64
else
SUBDIRS_NOLIB = includes compat utils driver docs compiler rts
65
66
endif

67
68
SUBDIRS = $(SUBDIRS_NOLIB) libraries

69
70
71
72
73
74
# Sanity check that all the core libraries are in the tree, to catch
# failure to run darcs-all.
check-packages :
	@for d in `cat libraries/core-packages`; do \
	  if test ! -d libraries/$$d; then \
	     echo "Looks like you're missing libraries/$$d,"; \
75
	     echo "maybe you haven't done './darcs-all get'?"; \
76
77
78
	     exit 1; \
	  fi \
	done
Simon Marlow's avatar
Simon Marlow committed
79
	@if test ! -e libraries/base/configure; then \
80
81
82
83
	    echo "Looks like you're missing base's configure script."; \
	    echo "Did you run 'sh boot' at the top level?"; \
	    exit 1; \
	fi
84
85

stage1 : check-packages
86
	$(MAKE) -C utils/mkdependC boot
87
	@case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
	for i in $(SUBDIRS_NOLIB); do \
	  echo "------------------------------------------------------------------------"; \
	  echo "== $(MAKE) boot $(MFLAGS);"; \
	  echo " in $(shell pwd)/$$i"; \
	  echo "------------------------------------------------------------------------"; \
	  $(MAKE) --no-print-directory -C $$i $(MFLAGS) boot; \
	  if [ $$? -eq 0 -o $$x_on_err -eq 0 ] ;  then true; else exit 1; fi; \
	done; \
	for i in $(SUBDIRS_NOLIB); do \
	  echo "------------------------------------------------------------------------"; \
	  echo "== $(MAKE) all $(MFLAGS);"; \
	  echo " in $(shell pwd)/$$i"; \
	  echo "------------------------------------------------------------------------"; \
	  $(MAKE) --no-print-directory -C $$i $(MFLAGS) all; \
	  if [ $$? -eq 0 -o $$x_on_err -eq 0 ] ;  then true; else exit 1; fi; \
103
	done
Ian Lynagh's avatar
Ian Lynagh committed
104
105
	$(MAKE) -C libraries boot
	$(MAKE) -C libraries all
106

107
stage2 : check-packages
108
109
	$(MAKE) -C compiler boot stage=2
	$(MAKE) -C compiler stage=2
110

111
stage3 : check-packages
112
113
	$(MAKE) -C compiler boot stage=3
	$(MAKE) -C compiler stage=3
114
115

bootstrap  : bootstrap2
116
117
118
119
120
121

bootstrap2 : stage1
	$(MAKE) stage2

bootstrap3 : bootstrap2
	$(MAKE) stage3
122
123
124

all :: bootstrap

125
126
127
# -----------------------------------------------------------------------------
# Installing

128
129
130
131
132
133
134
135
# We want to install the stage 2 bootstrapped compiler by default, but we let
# the user override this by saying 'make install stage=1', for example.
ifeq "$(stage)" ""
INSTALL_STAGE = stage=2
else
INSTALL_STAGE =
endif

136
# Same as default rule, but we pass $(INSTALL_STAGE) to $(MAKE) too
137
install :: check-packages
138
	@case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
139
140
141
142
143
144
145
	for i in $(SUBDIRS); do \
	  echo "------------------------------------------------------------------------"; \
	  echo "== $(MAKE) $@ $(MFLAGS);"; \
	  echo " in $(shell pwd)/$$i"; \
	  echo "------------------------------------------------------------------------"; \
	  $(MAKE) --no-print-directory -C $$i $(INSTALL_STAGE) $(MFLAGS) $@; \
	  if [ $$? -eq 0 -o $$x_on_err -eq 0 ] ;  then true; else exit 1; fi; \
146
147
	done

148
149
150
151
ifeq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
# These files need to be in the InstallShield
# INSTALL_DATAS rather than INSTALL_DOCS is used so these files go
# in the top-level directory of the distribution
Simon Marlow's avatar
Simon Marlow committed
152
INSTALL_DATAS += ANNOUNCE LICENSE README
153
154
endif

155
156
157
158
159
160
161
162
163
164
165
# If installing on Windows with MinGW32, copy the gcc compiler, headers and libs
# and the perl interpreter and dll into the GHC prefix directory.
# Gcc and Perl source locations derived from configuration data.
ifeq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
ifneq "$(WhatGccIsCalled)" ""
install ::
	-mkdir $(prefix)/gcc-lib
	-mkdir $(prefix)/include
	-mkdir $(prefix)/include/mingw
	-cp -rp $(GccDir)../include/* $(prefix)/include/mingw
	-cp -rp $(GccDir)../lib/gcc-lib/mingw32/$(GccVersion)/* $(prefix)/gcc-lib
166
167
	-cp -rp $(GccDir)../lib/gcc/mingw32/$(GccVersion)/* $(prefix)/gcc-lib
	-cp -rp $(GccDir)../libexec/gcc/mingw32/$(GccVersion)/* $(prefix)/gcc-lib
168
169
170
171
172
173
174
175
176
177
178
	-cp $(GccDir)../lib/*.* $(prefix)/gcc-lib
	-cp $(GccDir)gcc.exe $(prefix)
	-cp $(GccDir)as.exe $(prefix)/gcc-lib
	-cp $(GccDir)ld.exe $(prefix)/gcc-lib
	-cp $(GccDir)dllwrap.exe $(prefix)/gcc-lib
	-cp $(GccDir)dlltool.exe $(prefix)/gcc-lib
	-cp $(GhcDir)../perl.exe $(prefix)
	-cp $(GhcDir)../perl56.dll $(prefix)
endif
endif

179
180
install-docs ::
	@case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
181
182
183
184
185
186
187
	for i in $(SUBDIRS); do \
	  echo "------------------------------------------------------------------------"; \
	  echo "== $(MAKE) $@ $(MFLAGS);"; \
	  echo " in $(shell pwd)/$$i"; \
	  echo "------------------------------------------------------------------------"; \
	  $(MAKE) --no-print-directory -C $$i $(INSTALL_STAGE) $(MFLAGS) $@; \
	  if [ $$? -eq 0 -o $$x_on_err -eq 0 ] ;  then true; else exit 1; fi; \
188
189
	done

190
# -----------------------------------------------------------------------------
191
192
# Making a binary distribution
#
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
# `dist' `binary-dist'
#      Create a distribution tar file for this program. The tar file
#      should be set up so that the file names in the tar file start with
#      a subdirectory name which is the name of the package it is a
#      distribution for. This name can include the version number.
#
#      For example, the distribution tar file of GCC version 1.40 unpacks
#      into a subdirectory named `gcc-1.40'.
# 
#      The easiest way to do this is to create a subdirectory
#      appropriately named, use ln or cp to install the proper files in
#      it, and then tar that subdirectory.
# 
#      The dist target should explicitly depend on all non-source files
#      that are in the distribution, to make sure they are up to date in
#      the distribution. See Making Releases.
#
Simon Marlow's avatar
Simon Marlow committed
210
#	binary-dist is a GHC addition for binary distributions
211
212
# 

213
ifneq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
214
BinDistShScripts = ghc-$(ProjectVersion) ghci-$(ProjectVersion) ghc-pkg-$(ProjectVersion) hsc2hs-ghc
215
else
Simon Marlow's avatar
Simon Marlow committed
216
BinDistShScripts =
217
218
endif

Simon Marlow's avatar
Simon Marlow committed
219
220
221
222
223
BinDistPrlScripts = ghcprof
BinDistLibPrlScripts = ghc-asm ghc-split
BinDistBins = hp2ps runghc
BinDistLinks = ghc ghci ghc-pkg
BinDistLibSplicedFiles = package.conf
224
BinDistDirs = includes compiler docs driver rts utils
225

Simon Marlow's avatar
Simon Marlow committed
226
BIN_DIST_NAME=ghc-$(ProjectVersion)
Simon Marlow's avatar
Simon Marlow committed
227
228
BIN_DIST_TOPDIR=$(FPTOOLS_TOP_ABS)
BIN_DIST_DIR=$(BIN_DIST_TOPDIR)/$(BIN_DIST_NAME)
229

230
231
BIN_DIST_TARBALL=ghc-$(ProjectVersion)-$(TARGETPLATFORM).tar.bz2

232
233
234
235
236
237
238
239
240
241
242
BIN_DIST_TOP= distrib/Makefile \
              distrib/configure-bin.ac \
              distrib/INSTALL \
              distrib/README \
              ANNOUNCE \
              LICENSE \
              utils/mkdirhier/mkdirhier \
              install-sh \
              config.guess \
              config.sub   \
              aclocal.m4
243

244
245
246
247
ifeq "$(darwin_TARGET_OS)" "1"
BIN_DIST_TOP+=mk/fix_install_names.sh
endif

248
.PHONY: binary-dist-pre% binary-dist binary-pack
249

250
251
252
BINARY_DIST_PRE_RULES=$(foreach d,$(BinDistDirs),binary-dist-pre-$d)

binary-dist:: binary-dist-pre $(BINARY_DIST_PRE_RULES)
253
254

binary-dist-pre::
sof's avatar
sof committed
255
ifeq "$(BIN_DIST)" ""
256
257
	@echo "WARNING: To run the binary-dist target, you need to set BIN_DIST=1 in mk/build.mk"
	@false
sof's avatar
sof committed
258
endif
Simon Marlow's avatar
Simon Marlow committed
259
260
	-rm -rf $(BIN_DIST_DIR)
	-$(RM) $(BIN_DIST_DIR).tar.gz
261
262
263
264
265
266
267
268
269
270
271
272
	$(MKDIRHIER) $(BIN_DIST_DIR)/bin/$(TARGETPLATFORM)
	$(MKDIRHIER) $(BIN_DIST_DIR)/lib/$(TARGETPLATFORM)
	$(MKDIRHIER) $(BIN_DIST_DIR)/share

$(BINARY_DIST_PRE_RULES): binary-dist-pre-%:
	$(MAKE) -C $* $(MFLAGS) $(INSTALL_STAGE) install \
	        prefix=$(BIN_DIST_DIR) \
	        exec_prefix=$(BIN_DIST_DIR) \
	        bindir=$(BIN_DIST_DIR)/bin/$(TARGETPLATFORM) \
	        libdir=$(BIN_DIST_DIR)/lib/$(TARGETPLATFORM) \
	        libexecdir=$(BIN_DIST_DIR)/lib/$(TARGETPLATFORM) \
	        datadir=$(BIN_DIST_DIR)/share
273

274
275
VARFILE=$(BIN_DIST_DIR)/Makefile-vars.in

276
277
binary-dist::
	@for i in $(BIN_DIST_TOP); do \
278
	  if test -f "$$i"; then \
Simon Marlow's avatar
Simon Marlow committed
279
280
	     echo cp $$i $(BIN_DIST_DIR); \
	     cp $$i $(BIN_DIST_DIR); \
281
	  fi; \
282
	done;
283
	@echo "Configuring the Makefile for this project..."
284
285
286
287
288
289
290
291
292
293
294
	echo                                                         >  $(VARFILE)
	echo "package = ghc"                                         >> $(VARFILE)
	echo "version = $(ProjectVersion)"                           >> $(VARFILE)
	echo "PACKAGE_SH_SCRIPTS = $(BinDistShScripts)"              >> $(VARFILE)
	echo "PACKAGE_PRL_SCRIPTS = $(BinDistPrlScripts)"            >> $(VARFILE)
	echo "PACKAGE_LIB_PRL_SCRIPTS = $(BinDistLibPrlScripts)"     >> $(VARFILE)
	echo "PACKAGE_LIB_SPLICED_FILES = $(BinDistLibSplicedFiles)" >> $(VARFILE)
	echo "PACKAGE_BINS = $(BinDistBins)"                         >> $(VARFILE)
	echo "PACKAGE_OPT_BINS = $(BinDistOptBins)"                  >> $(VARFILE)
	echo "PACKAGE_LINKS = $(BinDistLinks)"                       >> $(VARFILE)
	cat distrib/Makefile-bin-vars.in                             >> $(VARFILE)
295
	@echo "Generating a shippable configure script.."
Simon Marlow's avatar
Simon Marlow committed
296
297
	$(MV) $(BIN_DIST_DIR)/configure-bin.ac $(BIN_DIST_DIR)/configure.ac
	( cd $(BIN_DIST_DIR); autoconf )
298
#
299
# binary dist'ing the documentation.  
sof's avatar
sof committed
300
301
# The default documentation to build/install is given below; overrideable
# via build.mk or the 'make' command-line.
302

sof's avatar
sof committed
303
ifndef BINDIST_DOC_WAYS
304

305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
BINDIST_DOC_WAYS = $(XMLDocWays)

# ifneq "$(XSLTPROC)" ""
# BINDIST_DOC_WAYS = html
# ifneq "$(FOP)" ""
# BINDIST_DOC_WAYS += ps pdf
# else
# ifneq "$(PDFXMLTEX)" ""
# BINDIST_DOC_WAYS += pdf
# endif
# ifneq "$(XMLTEX)" ""
# ifneq "$(DVIPS)" ""
# BINDIST_DOC_WAYS += ps
# endif # DVIPS
# endif # XMLTEX
# endif # FOP
# endif # XSLTPROC
322
323

endif # BINDIST_DOC_WAYS
324

325
ifneq "$(DIR_DOCBOOK_XSL)" ""
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
.PHONY: binary-dist-doc-%

BINARY_DIST_DOC_RULES=$(foreach d,$(BinDistDirs),binary-dist-doc-$d)

binary-dist :: $(BINARY_DIST_DOC_RULES)

$(BINARY_DIST_DOC_RULES): binary-dist-doc-%:
	$(MAKE) -C $* $(MFLAGS) $(BINDIST_DOC_WAYS)
	$(MAKE) -C $* $(MFLAGS) install-docs \
	        XMLDocWays="$(BINDIST_DOC_WAYS)" \
	        prefix=$(BIN_DIST_DIR) \
	        exec_prefix=$(BIN_DIST_DIR) \
	        bindir=$(BIN_DIST_DIR)/bin/$(TARGETPLATFORM) \
	        libdir=$(BIN_DIST_DIR)/lib/$(TARGETPLATFORM) \
	        libexecdir=$(BIN_DIST_DIR)/lib/$(TARGETPLATFORM) \
	        datadir=$(BIN_DIST_DIR)/share
342
endif
sof's avatar
sof committed
343

344
345
# Rename scripts to $i.prl and $i.sh where necessary.
# ToDo: do this in a cleaner way...
sof's avatar
sof committed
346

Simon Marlow's avatar
Simon Marlow committed
347
ifneq "$(BinDistPrlScripts)" ""
sof's avatar
sof committed
348
binary-dist::
Simon Marlow's avatar
Simon Marlow committed
349
	@for i in $(BinDistPrlScripts); do \
sof's avatar
sof committed
350
	     echo "Renaming $$i to $$i.prl"; \
Simon Marlow's avatar
Simon Marlow committed
351
	    $(MV) $(BIN_DIST_DIR)/bin/$(TARGETPLATFORM)/$$i  $(BIN_DIST_DIR)/bin/$(TARGETPLATFORM)/$$i.prl; \
352
	done
353
354
endif

Simon Marlow's avatar
Simon Marlow committed
355
ifneq "$(BinDistLibPrlScripts)" ""
356
binary-dist::
Simon Marlow's avatar
Simon Marlow committed
357
	@for i in $(BinDistLibPrlScripts); do \
358
	     echo "Renaming $$i to $$i.prl"; \
Simon Marlow's avatar
Simon Marlow committed
359
	    $(MV) $(BIN_DIST_DIR)/lib/$(TARGETPLATFORM)/$$i  $(BIN_DIST_DIR)/lib/$(TARGETPLATFORM)/$$i.prl; \
360
	done
361
362
endif

Simon Marlow's avatar
Simon Marlow committed
363
ifneq "$(BinDistShScripts)" ""
364
binary-dist::
Simon Marlow's avatar
Simon Marlow committed
365
	@for i in $(BinDistShScripts); do \
Simon Marlow's avatar
Simon Marlow committed
366
	    if test -x $(BIN_DIST_DIR)/bin/$(TARGETPLATFORM)/$$i ; then \
367
	    	echo "Renaming $$i to $$i.sh"; \
Simon Marlow's avatar
Simon Marlow committed
368
	    	$(MV) $(BIN_DIST_DIR)/bin/$(TARGETPLATFORM)/$$i  $(BIN_DIST_DIR)/bin/$(TARGETPLATFORM)/$$i.sh; \
369
	    fi \
sof's avatar
sof committed
370
	done
371
endif
372

373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
.PHONY: binary-dist-doc-%

BIN_DIST_LIBDIR=$(BIN_DIST_DIR)/libraries

LIBRARY_SUBDIRS=$(shell $(MAKE) -s -C libraries subdirs)

BINARY_DIST_LIBRARY_RULES=$(foreach d,$(LIBRARY_SUBDIRS),binary-dist-lib-$d)

binary-dist:: $(BINARY_DIST_LIBRARY_RULES)
	cp    libraries/Makefile           $(BIN_DIST_LIBDIR)
	cp    libraries/gen_contents_index $(BIN_DIST_LIBDIR)
	cp    libraries/index.html         $(BIN_DIST_LIBDIR)
	cp    libraries/doc-index.html     $(BIN_DIST_LIBDIR)
	cp -a libraries/stamp              $(BIN_DIST_LIBDIR)

$(BINARY_DIST_LIBRARY_RULES): binary-dist-lib-%:
	$(MKDIRHIER) $(BIN_DIST_LIBDIR)/$*/setup
	cp    libraries/$*/setup/Setup   $(BIN_DIST_LIBDIR)/$*/setup
	cp    libraries/$*/*.cabal       $(BIN_DIST_LIBDIR)/$*
	cp -a libraries/$*/dist          $(BIN_DIST_LIBDIR)/$*
	find $(BIN_DIST_LIBDIR)/$*/dist \
	     \( \( -name "*.o" -o -name "*.p_o" \) -a \! -name "HS*" \) \
	     -exec rm {} \;

397
398
399
400
401
402
403
# Jiggle the files around to make a valid Windows distribution if necessary
ifeq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
binary-dist :: fiddle-binary-dist
endif

.PHONY: fiddle-binary-dist
fiddle-binary-dist:
404
	cd $(BIN_DIST_DIR) && ../distrib/prep-bin-dist-mingw
405
# Tar up the distribution and build a manifest
406
407
binary-dist :: tar-binary-dist

408
.PHONY: tar-binary-dist
409
tar-binary-dist:
Simon Marlow's avatar
Simon Marlow committed
410
411
	( cd $(BIN_DIST_TOPDIR); tar cf - $(BIN_DIST_NAME) | bzip2 >$(BIN_DIST_TARBALL) )
	( cd $(BIN_DIST_TOPDIR); bunzip2 -c $(BIN_DIST_TARBALL) | tar tf - | sed "s/^ghc-$(ProjectVersion)/fptools/" | sort >bin-manifest-$(ProjectVersion) )
412

Simon Marlow's avatar
Simon Marlow committed
413
# Upload the distribution and documentation
414
ifneq "$(PublishLocation)" ""
415
binary-dist :: publish-binary-dist
416
417
endif

418
.PHONY: publish-binary-dist
419
publish-binary-dist :
420
	@for i in 0 1 2 3 4 5 6 7 8 9; do \
421
422
		echo "Try $$i: $(PublishCp) $(BIN_DIST_TARBALL) $(PublishLocation)"; \
		if $(PublishCp) $(BIN_DIST_TARBALL) $(PublishLocation); then break; fi\
423
	done
Simon Marlow's avatar
Simon Marlow committed
424
	$(PublishCp) -r $(BIN_DIST_DIR)/share/html/* $(PublishLocation)/docs
425

Simon Marlow's avatar
Simon Marlow committed
426

427
428
429
430
binary-dist::
	@echo "Mechanical and super-natty! Inspect the result and *if* happy; freeze, sell and get some sleep!"

# -----------------------------------------------------------------------------
431
432
433
434
# Building source distributions
#
# Do it like this: 
#
435
#	$ make
436
#	$ make dist
437
438
439
#
# WARNING: `make dist' calls `make distclean' before tarring up the tree.
#
440
441
442
443
444
445

.PHONY: dist

#
# Directory in which we're going to build the src dist
#
Simon Marlow's avatar
Simon Marlow committed
446
SRC_DIST_NAME=ghc-$(ProjectVersion)
447
448
449
450
451
SRC_DIST_DIR=$(shell pwd)/$(SRC_DIST_NAME)

#
# Files to include in source distributions
#
452
SRC_DIST_DIRS += mk docs distrib $(filter-out docs distrib,$(SUBDIRS))
453
SRC_DIST_FILES += \
454
	configure.ac config.guess config.sub configure \
Simon Marlow's avatar
Simon Marlow committed
455
	aclocal.m4 README ANNOUNCE HACKING LICENSE Makefile install-sh \
456
	ghc.spec.in VERSION
457

458
459
# -----------------------------------------------------------------------------
# Source distributions
460

461
462
463
464
465
466
467
468
469
# A source dist is built from a complete build tree, because we
# require some extra files not contained in a darcs checkout: the
# output from Happy and Alex, for example.
# 
# The steps performed by 'make dist' are as follows:
#   - create a complete link-tree of the current build tree in /tmp
#   - run 'make distclean' on that tree
#   - remove a bunch of other files that we know shouldn't be in the dist
#   - tar up first the extralibs package, then the main source package
470

471
EXTRA_LIBS=$(patsubst %, $(SRC_DIST_NAME)/libraries/%, $(shell cat libraries/extra-packages))
472

473
474
475
SRC_DIST_TARBALL = ghc-$(ProjectVersion)-src.tar.bz2
SRC_DIST_EXTRALIBS_TARBALL = ghc-$(ProjectVersion)-src-extralibs.tar.bz2

476
477
478
479
480
VERSION :
	echo $(ProjectVersion) >VERSION

dist :: VERSION

481
482
483
484
485
486
487
488
489
490
491
dist ::
	$(RM) -rf $(SRC_DIST_DIR)
	$(RM) $(SRC_DIST_NAME).tar.gz
	mkdir $(SRC_DIST_DIR)
	( cd $(SRC_DIST_DIR) \
	  && for i in $(SRC_DIST_DIRS); do mkdir $$i; (cd $$i && lndir $(FPTOOLS_TOP_ABS)/$$i ); done \
	  && for i in $(SRC_DIST_FILES); do $(LN_S) $(FPTOOLS_TOP_ABS)/$$i .; done \
	  && $(MAKE) distclean \
	  && $(RM) -rf compiler/stage[123] mk/build.mk \
	  && $(FIND) $(SRC_DIST_DIRS) \( -name _darcs -o -name SRC -o -name "autom4te*" -o -name "*~" -o -name ".cvsignore" -o -name "\#*" -o -name ".\#*" -o -name "log" -o -name "*-SAVE" -o -name "*.orig" -o -name "*.rej" \) -print | xargs $(RM) -rf \
	)
492
	tar chf - $(EXTRA_LIBS) | bzip2 >$(FPTOOLS_TOP_ABS)/$(SRC_DIST_EXTRALIBS_TARBALL)
493
	$(RM) -rf $(EXTRA_LIBS)
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
	tar chf - $(SRC_DIST_NAME) 2>$src_log | bzip2 >$(FPTOOLS_TOP_ABS)/$(SRC_DIST_TARBALL)

# Upload the distribution(s)
# Retrying is to work around buggy firewalls that corrupt large file transfers
# over SSH.
ifneq "$(PublishLocation)" ""
dist ::
	@for i in 0 1 2 3 4 5 6 7 8 9; do \
		echo "Try $$i: $(PublishCp) $(SRC_DIST_EXTRALIBS_TARBALL) $(PublishLocation)"; \
		if $(PublishCp) $(SRC_DIST_EXTRALIBS_TARBALL) $(PublishLocation); then break; fi\
	done
	@for i in 0 1 2 3 4 5 6 7 8 9; do \
		echo "Try $$i: $(PublishCp) $(SRC_DIST_TARBALL) $(PublishLocation)"; \
		if $(PublishCp) $(SRC_DIST_TARBALL) $(PublishLocation); then break; fi\
	done
endif
510
511

# -----------------------------------------------------------------------------
512
513
# HC file bundles

Simon Marlow's avatar
Simon Marlow committed
514
hc-file-bundle :
Simon Marlow's avatar
Simon Marlow committed
515
516
517
518
519
520
	$(RM) -r ghc-$(ProjectVersion)
	$(LN_S) . ghc-$(ProjectVersion)
	$(FIND) ghc-$(ProjectVersion)/compiler \
	     ghc-$(ProjectVersion)/utils \
	     ghc-$(ProjectVersion)/compat \
	     ghc-$(ProjectVersion)/libraries -follow \
sof's avatar
sof committed
521
	  \( -name "*.hc" -o -name "*_hsc.[ch]" -o -name "*_stub.[ch]" \) -print > hc-files-to-go
Simon Marlow's avatar
Simon Marlow committed
522
	for f in `$(FIND) ghc-$(ProjectVersion)/compiler ghc-$(ProjectVersion)/utils ghc-$(ProjectVersion)/libraries -name "*.hsc" -follow -print` ""; do \
sof's avatar
sof committed
523
524
525
526
	     if test "x$$f" != "x" && test -e `echo "$$f" | sed 's/hsc$$/hs/g'`; then \
	        echo `echo "$$f" | sed 's/hsc$$/hs/g' ` >> hc-files-to-go ; \
	     fi; \
	done;
Simon Marlow's avatar
Simon Marlow committed
527
	for f in `$(FIND) ghc-$(ProjectVersion)/compiler ghc-$(ProjectVersion)/rts -name "*.cmm" -follow -print` ""; do \
528
529
530
531
	     if test "x$$f" != "x"; then \
	        echo `echo "$$f" | sed 's/cmm$$/hc/g' ` >> hc-files-to-go ; \
	     fi; \
	done;
Simon Marlow's avatar
Simon Marlow committed
532
533
534
535
536
537
	echo ghc-$(ProjectVersion)/libraries/base/GHC/PrimopWrappers.hs >> hc-files-to-go
	echo ghc-$(ProjectVersion)/compiler/parser/Parser.hs >> hc-files-to-go
	echo ghc-$(ProjectVersion)/compiler/parser/ParserCore.hs >> hc-files-to-go
	echo ghc-$(ProjectVersion)/compiler/main/ParsePkgConf.hs >> hc-files-to-go
	echo ghc-$(ProjectVersion)/libraries/haskell-src/Language/Haskell/Parser.hs >> hc-files-to-go
	tar czf ghc-$(ProjectVersion)-$(TARGETPLATFORM)-hc.tar.gz `cat hc-files-to-go`
538

539
540
541
# -----------------------------------------------------------------------------
# Cleaning

542
CLEAN_FILES += hc-files-to-go *-hc.tar.gz
543

544
545
546
547
548
549
DIST_CLEAN_FILES += config.cache config.status mk/config.h mk/stamp-h \
	ghc.spec docs/users_guide/ug-book.xml

# don't clean config.mk: it's needed when cleaning stuff later on
LATE_DIST_CLEAN_FILES += mk/config.mk 

550
551
552
# VERSION is shipped in a source dist
MAINTAINER_CLEAN_FILES += VERSION

553
554
555
extraclean::
	$(RM) -rf autom4te.cache

556
# -----------------------------------------------------------------------------
557

sof's avatar
sof committed
558
559
560
561
562
# Turn off target.mk's rules for 'all', 'boot' and 'install'.
NO_BOOT_TARGET=YES
NO_ALL_TARGET=YES
NO_INSTALL_TARGET=YES

563
564
include $(TOP)/mk/target.mk

565
566
# -----------------------------------------------------------------------------