Makefile 19 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 75 76 77 78 79 80
# 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,"; \
	     echo "maybe you haven't done 'sh darcs-all get'?"; \
	     exit 1; \
	  fi \
	done

stage1 : check-packages
81
	$(MAKE) -C utils/mkdependC boot
82
	@case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
	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; \
98
	done
Ian Lynagh's avatar
Ian Lynagh committed
99 100
	$(MAKE) -C libraries boot
	$(MAKE) -C libraries all
101

102
stage2 : check-packages
103 104
	$(MAKE) -C compiler boot stage=2
	$(MAKE) -C compiler stage=2
105

106
stage3 : check-packages
107 108
	$(MAKE) -C compiler boot stage=3
	$(MAKE) -C compiler stage=3
109 110

bootstrap  : bootstrap2
111 112 113 114 115 116

bootstrap2 : stage1
	$(MAKE) stage2

bootstrap3 : bootstrap2
	$(MAKE) stage3
117 118 119

all :: bootstrap

120 121 122
# -----------------------------------------------------------------------------
# Installing

123 124 125 126 127 128 129 130
# 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

131
# Same as default rule, but we pass $(INSTALL_STAGE) to $(MAKE) too
132
install :: check-packages
133
	@case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
134 135 136 137 138 139 140
	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; \
141 142
	done

143 144 145 146
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
147
INSTALL_DATAS += ANNOUNCE LICENSE README
148 149
endif

150 151 152 153 154 155 156 157 158 159 160
# 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
161 162
	-cp -rp $(GccDir)../lib/gcc/mingw32/$(GccVersion)/* $(prefix)/gcc-lib
	-cp -rp $(GccDir)../libexec/gcc/mingw32/$(GccVersion)/* $(prefix)/gcc-lib
163 164 165 166 167 168 169 170 171 172 173
	-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

174 175
install-docs ::
	@case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
176 177 178 179 180 181 182
	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; \
183 184
	done

185
# -----------------------------------------------------------------------------
186 187
# Making a binary distribution
#
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
# `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
205
#	binary-dist is a GHC addition for binary distributions
206 207
# 

208
ifneq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
209
BinDistShScripts = ghc-$(ProjectVersion) ghci-$(ProjectVersion) ghc-pkg-$(ProjectVersion) hsc2hs-ghc
210
else
Simon Marlow's avatar
Simon Marlow committed
211
BinDistShScripts =
212 213
endif

Simon Marlow's avatar
Simon Marlow committed
214 215 216 217 218
BinDistPrlScripts = ghcprof
BinDistLibPrlScripts = ghc-asm ghc-split
BinDistBins = hp2ps runghc
BinDistLinks = ghc ghci ghc-pkg
BinDistLibSplicedFiles = package.conf
219
BinDistDirs = includes compiler docs driver rts utils
220

Simon Marlow's avatar
Simon Marlow committed
221
BIN_DIST_NAME=ghc-$(ProjectVersion)
Simon Marlow's avatar
Simon Marlow committed
222 223
BIN_DIST_TOPDIR=$(FPTOOLS_TOP_ABS)
BIN_DIST_DIR=$(BIN_DIST_TOPDIR)/$(BIN_DIST_NAME)
224

225 226
BIN_DIST_TARBALL=ghc-$(ProjectVersion)-$(TARGETPLATFORM).tar.bz2

227 228 229 230 231 232 233 234 235 236 237
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
238

239 240 241 242
ifeq "$(darwin_TARGET_OS)" "1"
BIN_DIST_TOP+=mk/fix_install_names.sh
endif

243
.PHONY: binary-dist-pre% binary-dist binary-pack
244

245 246 247
BINARY_DIST_PRE_RULES=$(foreach d,$(BinDistDirs),binary-dist-pre-$d)

binary-dist:: binary-dist-pre $(BINARY_DIST_PRE_RULES)
248 249

binary-dist-pre::
sof's avatar
sof committed
250
ifeq "$(BIN_DIST)" ""
251 252
	@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
253
endif
Simon Marlow's avatar
Simon Marlow committed
254 255
	-rm -rf $(BIN_DIST_DIR)
	-$(RM) $(BIN_DIST_DIR).tar.gz
256 257 258 259 260 261 262 263 264 265 266 267
	$(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
268

269 270
VARFILE=$(BIN_DIST_DIR)/Makefile-vars.in

271 272
binary-dist::
	@for i in $(BIN_DIST_TOP); do \
273
	  if test -f "$$i"; then \
Simon Marlow's avatar
Simon Marlow committed
274 275
	     echo cp $$i $(BIN_DIST_DIR); \
	     cp $$i $(BIN_DIST_DIR); \
276
	  fi; \
277
	done;
278
	@echo "Configuring the Makefile for this project..."
279 280 281 282 283 284 285 286 287 288 289
	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)
290
	@echo "Generating a shippable configure script.."
Simon Marlow's avatar
Simon Marlow committed
291 292
	$(MV) $(BIN_DIST_DIR)/configure-bin.ac $(BIN_DIST_DIR)/configure.ac
	( cd $(BIN_DIST_DIR); autoconf )
293
#
294
# binary dist'ing the documentation.  
sof's avatar
sof committed
295 296
# The default documentation to build/install is given below; overrideable
# via build.mk or the 'make' command-line.
297

sof's avatar
sof committed
298
ifndef BINDIST_DOC_WAYS
299

300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
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
317 318

endif # BINDIST_DOC_WAYS
319

320
ifneq "$(DIR_DOCBOOK_XSL)" ""
321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336
.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
337
endif
sof's avatar
sof committed
338

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

Simon Marlow's avatar
Simon Marlow committed
342
ifneq "$(BinDistPrlScripts)" ""
sof's avatar
sof committed
343
binary-dist::
Simon Marlow's avatar
Simon Marlow committed
344
	@for i in $(BinDistPrlScripts); do \
sof's avatar
sof committed
345
	     echo "Renaming $$i to $$i.prl"; \
Simon Marlow's avatar
Simon Marlow committed
346
	    $(MV) $(BIN_DIST_DIR)/bin/$(TARGETPLATFORM)/$$i  $(BIN_DIST_DIR)/bin/$(TARGETPLATFORM)/$$i.prl; \
347
	done
348 349
endif

Simon Marlow's avatar
Simon Marlow committed
350
ifneq "$(BinDistLibPrlScripts)" ""
351
binary-dist::
Simon Marlow's avatar
Simon Marlow committed
352
	@for i in $(BinDistLibPrlScripts); do \
353
	     echo "Renaming $$i to $$i.prl"; \
Simon Marlow's avatar
Simon Marlow committed
354
	    $(MV) $(BIN_DIST_DIR)/lib/$(TARGETPLATFORM)/$$i  $(BIN_DIST_DIR)/lib/$(TARGETPLATFORM)/$$i.prl; \
355
	done
356 357
endif

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

368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
.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 {} \;

392 393 394 395 396 397 398 399
# 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:
	cd $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) && ../distrib/prep-bin-dist-mingw
400
# Tar up the distribution and build a manifest
401 402
binary-dist :: tar-binary-dist

403
.PHONY: tar-binary-dist
404
tar-binary-dist:
Simon Marlow's avatar
Simon Marlow committed
405 406
	( 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) )
407

Simon Marlow's avatar
Simon Marlow committed
408
# Upload the distribution and documentation
409
ifneq "$(PublishLocation)" ""
410
binary-dist :: publish-binary-dist
411 412
endif

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

Simon Marlow's avatar
Simon Marlow committed
421

422 423 424 425
binary-dist::
	@echo "Mechanical and super-natty! Inspect the result and *if* happy; freeze, sell and get some sleep!"

# -----------------------------------------------------------------------------
426 427 428 429
# Building source distributions
#
# Do it like this: 
#
430
#	$ make
431
#	$ make dist
432 433 434
#
# WARNING: `make dist' calls `make distclean' before tarring up the tree.
#
435 436 437 438 439 440

.PHONY: dist

#
# Directory in which we're going to build the src dist
#
Simon Marlow's avatar
Simon Marlow committed
441
SRC_DIST_NAME=ghc-$(ProjectVersion)
442 443 444 445 446
SRC_DIST_DIR=$(shell pwd)/$(SRC_DIST_NAME)

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

453 454
# -----------------------------------------------------------------------------
# Source distributions
455

456 457 458 459 460 461 462 463 464
# 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
465

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

468 469 470
SRC_DIST_TARBALL = ghc-$(ProjectVersion)-src.tar.bz2
SRC_DIST_EXTRALIBS_TARBALL = ghc-$(ProjectVersion)-src-extralibs.tar.bz2

471 472 473 474 475
VERSION :
	echo $(ProjectVersion) >VERSION

dist :: VERSION

476 477 478 479 480 481 482 483 484 485 486
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 \
	)
487
	tar chf - $(EXTRA_LIBS) | bzip2 >$(FPTOOLS_TOP_ABS)/$(SRC_DIST_EXTRALIBS_TARBALL)
488
	$(RM) -rf $(EXTRA_LIBS)
489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504
	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
505 506

# -----------------------------------------------------------------------------
507 508
# HC file bundles

Simon Marlow's avatar
Simon Marlow committed
509
hc-file-bundle :
Simon Marlow's avatar
Simon Marlow committed
510 511 512 513 514 515
	$(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
516
	  \( -name "*.hc" -o -name "*_hsc.[ch]" -o -name "*_stub.[ch]" \) -print > hc-files-to-go
Simon Marlow's avatar
Simon Marlow committed
517
	for f in `$(FIND) ghc-$(ProjectVersion)/compiler ghc-$(ProjectVersion)/utils ghc-$(ProjectVersion)/libraries -name "*.hsc" -follow -print` ""; do \
sof's avatar
sof committed
518 519 520 521
	     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
522
	for f in `$(FIND) ghc-$(ProjectVersion)/compiler ghc-$(ProjectVersion)/rts -name "*.cmm" -follow -print` ""; do \
523 524 525 526
	     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
527 528 529 530 531 532
	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`
533

534 535 536
# -----------------------------------------------------------------------------
# Cleaning

537
CLEAN_FILES += hc-files-to-go *-hc.tar.gz
538

539 540 541 542 543 544
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 

545 546 547
# VERSION is shipped in a source dist
MAINTAINER_CLEAN_FILES += VERSION

548 549 550
extraclean::
	$(RM) -rf autom4te.cache

551
# -----------------------------------------------------------------------------
552

sof's avatar
sof committed
553 554 555 556 557
# Turn off target.mk's rules for 'all', 'boot' and 'install'.
NO_BOOT_TARGET=YES
NO_ALL_TARGET=YES
NO_INSTALL_TARGET=YES

558 559
include $(TOP)/mk/target.mk

560 561
# -----------------------------------------------------------------------------