Makefile 21.1 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_BUILD = gmp includes rts compat compiler docs utils driver
63
else
64
SUBDIRS_BUILD = gmp includes compat utils driver docs compiler rts libraries/Cabal/doc
65 66
endif

67
SUBDIRS = gmp includes compat utils driver docs rts libraries compiler libraries/Cabal/doc
68

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

86 87 88 89 90 91 92
ifeq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
ifneq "$(WhatGccIsCalled)" ""
GCC_LIB_DEP = stamp.inplace-gcc-lib
endif
endif

stage1 : $(GCC_LIB_DEP) check-packages
93
	$(MAKE) -C utils/mkdependC boot
94
	@case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
95
	for i in $(SUBDIRS_BUILD); do \
96 97 98 99 100 101 102
	  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; \
103
	for i in $(SUBDIRS_BUILD); do \
104 105 106 107 108 109
	  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; \
110
	done
Ian Lynagh's avatar
Ian Lynagh committed
111 112
	$(MAKE) -C libraries boot
	$(MAKE) -C libraries all
113

114
stage2 : check-packages
115 116
	$(MAKE) -C compiler boot stage=2
	$(MAKE) -C compiler stage=2
117

118
stage3 : check-packages
119 120
	$(MAKE) -C compiler boot stage=3
	$(MAKE) -C compiler stage=3
121 122

bootstrap  : bootstrap2
123 124 125 126 127 128

bootstrap2 : stage1
	$(MAKE) stage2

bootstrap3 : bootstrap2
	$(MAKE) stage3
129

130 131 132 133 134 135 136 137 138 139 140 141 142
ifeq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
ifneq "$(WhatGccIsCalled)" ""
all :: stamp.inplace-gcc-lib

.PHONY: stamp.inplace-gcc-lib

# This is a hack to make Cabal able to find ld when we run tests with
# the inplace ghc. We should probably install all the gcc stuff in our
# tree somewhere, and then have install copy it from there rather than
# from the filesystem.
stamp.inplace-gcc-lib:
	$(RM) -r compiler/gcc-lib
	mkdir compiler/gcc-lib
143
	cp $(LD) compiler/gcc-lib
144 145 146 147 148 149 150 151
	touch $@

clean ::
	$(RM) -r compiler/gcc-lib
	$(RM) -f inplace-gcc-lib
endif
endif

152 153
all :: bootstrap

154 155 156
# -----------------------------------------------------------------------------
# Installing

157 158 159 160 161 162 163 164
# 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

Ian Lynagh's avatar
Ian Lynagh committed
165 166 167
install-strip:
	$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install

168
# Same as default rule, but we pass $(INSTALL_STAGE) to $(MAKE) too
169
install :: check-packages
170
	@case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
171
	for i in $(SUBDIRS); do \
172 173 174 175 176 177
	  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; \
178 179
	done

180 181 182 183
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
184
INSTALL_DATAS += ANNOUNCE LICENSE README
185 186
endif

187 188 189 190 191 192 193 194 195 196 197
# 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
198 199
	-cp -rp $(GccDir)../lib/gcc/mingw32/$(GccVersion)/* $(prefix)/gcc-lib
	-cp -rp $(GccDir)../libexec/gcc/mingw32/$(GccVersion)/* $(prefix)/gcc-lib
200 201 202 203 204 205 206 207 208 209 210
	-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

211 212
# Install gcc-extra-opts
install ::
Ian Lynagh's avatar
Ian Lynagh committed
213 214
	$(INSTALL_DIR) $(DESTDIR)$(libdir)
	$(INSTALL_DATA) $(INSTALL_OPTS) extra-gcc-opts $(DESTDIR)$(libdir)
215

216 217
install-docs ::
	@case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
218
	for i in $(SUBDIRS); do \
219 220 221 222 223 224
	  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; \
225 226
	done

227
# -----------------------------------------------------------------------------
228 229
# Making a binary distribution
#
230
# `dist' `binary-dist' `binary-dist-macos'
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
#      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.
#
247 248 249
#	binary-dist is a GHC addition for binary distributions and
#	binary-dist-macos is the Mac OS X-specific variant creating an
#	installer package for GHC.framework.
250 251
# 

Ian Lynagh's avatar
Ian Lynagh committed
252 253
binary-dist::
	-rm -rf $(BIN_DIST_DIR)
254
	-$(RM) $(BIN_DIST_TARBALL)
Ian Lynagh's avatar
Ian Lynagh committed
255

256 257 258 259 260
# When making bindists, we can have problems if some things (e.g. ghc-pkg)
# are compiled with the bootstrapping compiler and some (e.g. the stage 2
# compiler) with the stage1 compiler. See #1860 for an example.
# Thus we rebuild the utils with stage 1 here. This is a bit unpleasant,
# as binary-dist really shouldn't actually build anything, but it works.
261
# We need to do the same for utilities used during library package installation.
262 263 264 265
binary-dist::
	$(MAKE) -C utils clean
	$(MAKE) -C utils UseStage1=YES boot
	$(MAKE) -C utils UseStage1=YES
266 267 268 269
	$(RM) -f libraries/ifBuildable/ifBuildable
	$(MAKE) -C libraries UseStage1=YES ifBuildable/ifBuildable
	$(RM) -f libraries/installPackage/installPackage
	$(MAKE) -C libraries UseStage1=YES installPackage/installPackage
270

Ian Lynagh's avatar
Ian Lynagh committed
271 272 273
ifeq "$(TARGETPLATFORM)" "i386-unknown-mingw32"

binary-dist::
274
	$(MAKE) prefix=$(BIN_DIST_DIR) install
275
	$(MAKE) prefix=$(BIN_DIST_DIR) install-docs
Ian Lynagh's avatar
Ian Lynagh committed
276 277

binary-dist::
278
	cd $(BIN_DIST_DIR) && $(SHELL) ../distrib/prep-bin-dist-mingw
Ian Lynagh's avatar
Ian Lynagh committed
279

280 281 282 283
binary-dist::
	$(MKDIRHIER) $(BIN_DIST_DIR)/icons
	cp distrib/hsicon.ico $(BIN_DIST_DIR)/icons

Ian Lynagh's avatar
Ian Lynagh committed
284 285
else

Ian Lynagh's avatar
Ian Lynagh committed
286
BinDistDirs = includes compiler docs rts
287

288 289 290 291 292 293 294
BIN_DIST_TOP= distrib/Makefile \
              distrib/configure-bin.ac \
              distrib/INSTALL \
              distrib/README \
              ANNOUNCE \
              LICENSE \
              install-sh \
295
              extra-gcc-opts.in \
296 297 298
              config.guess \
              config.sub   \
              aclocal.m4
299

300 301 302 303
ifeq "$(darwin_TARGET_OS)" "1"
BIN_DIST_TOP+=mk/fix_install_names.sh
endif

304
.PHONY: binary-dist-pre% binary-dist binary-dist-macos
305

306
binary-dist:: binary-dist-pre
307 308

binary-dist-pre::
Ian Lynagh's avatar
Ian Lynagh committed
309 310
	$(MKDIRHIER) $(BIN_DIST_DIR)/mk
	echo 'include $$(TOP)/Makefile-vars' >  $(BIN_DIST_DIR)/mk/boilerplate.mk
311 312
	echo 'include $$(TOP)/mk/package.mk' >  $(BIN_DIST_DIR)/mk/target.mk
	echo 'include $$(TOP)/mk/install.mk' >> $(BIN_DIST_DIR)/mk/target.mk
Ian Lynagh's avatar
Ian Lynagh committed
313 314
	echo 'include $$(TOP)/mk/recurse.mk' >> $(BIN_DIST_DIR)/mk/target.mk
	echo ''                              >  $(BIN_DIST_DIR)/mk/compat.mk
315
	cp mk/package.mk $(BIN_DIST_DIR)/mk/
Ian Lynagh's avatar
Ian Lynagh committed
316 317
	cp mk/install.mk $(BIN_DIST_DIR)/mk/
	cp mk/recurse.mk $(BIN_DIST_DIR)/mk/
318
	cp mk/fptools.css $(BIN_DIST_DIR)/mk/
319 320 321
	$(MKDIRHIER) $(BIN_DIST_DIR)/lib/$(TARGETPLATFORM)
	$(MKDIRHIER) $(BIN_DIST_DIR)/share

Ian Lynagh's avatar
Ian Lynagh committed
322
binary-dist::
323 324 325
	$(MAKE) -C gmp       binary-dist DOING_BIN_DIST=YES
	$(MAKE) -C includes  binary-dist DOING_BIN_DIST=YES
	$(MAKE) -C compiler  binary-dist DOING_BIN_DIST=YES $(INSTALL_STAGE)
326
	$(MAKE) -C rts       binary-dist DOING_BIN_DIST=YES
327 328 329 330
	$(MAKE) -C driver    binary-dist DOING_BIN_DIST=YES
	$(MAKE) -C utils     binary-dist DOING_BIN_DIST=YES
	$(MAKE) -C docs      binary-dist DOING_BIN_DIST=YES
	$(MAKE) -C libraries binary-dist DOING_BIN_DIST=YES
331
	$(MAKE) -C libraries/Cabal/doc binary-dist DOING_BIN_DIST=YES
Ian Lynagh's avatar
Ian Lynagh committed
332

333 334
VARFILE=$(BIN_DIST_DIR)/Makefile-vars.in

335 336
binary-dist::
	@for i in $(BIN_DIST_TOP); do \
337
	  if test -f "$$i"; then \
Simon Marlow's avatar
Simon Marlow committed
338 339
	     echo cp $$i $(BIN_DIST_DIR); \
	     cp $$i $(BIN_DIST_DIR); \
340
	  fi; \
341
	done;
342
	@echo "Configuring the Makefile for this project..."
343 344 345
	echo                                                         >  $(VARFILE)
	echo "package = ghc"                                         >> $(VARFILE)
	echo "version = $(ProjectVersion)"                           >> $(VARFILE)
Ian Lynagh's avatar
Ian Lynagh committed
346
	echo "ProjectVersion = $(ProjectVersion)"                    >> $(VARFILE)
347 348
	echo "HaveLibGmp = $(HaveLibGmp)"                            >> $(VARFILE)
	echo "GhcLibsWithUnix = $(GhcLibsWithUnix)"                  >> $(VARFILE)
Ian Lynagh's avatar
Ian Lynagh committed
349 350 351
	echo "GhcWithInterpreter = $(GhcWithInterpreter)"            >> $(VARFILE)
	echo "GhcHasReadline = $(GhcHasReadline)"                    >> $(VARFILE)
	echo "BootingFromHc = $(BootingFromHc)"                      >> $(VARFILE)
352
	echo "XMLDocWays = $(XMLDocWays)"                            >> $(VARFILE)
353 354
	# We won't actually use xsltproc, but we need to know if it's "" or not
	echo "XSLTPROC = $(XSLTPROC)"                                >> $(VARFILE)
355
	echo "TARGETPLATFORM = $(TARGETPLATFORM)"                    >> $(VARFILE)
356 357
	echo "HADDOCK_DOCS = $(HADDOCK_DOCS)"                        >> $(VARFILE)

358
	cat distrib/Makefile-bin-vars.in                             >> $(VARFILE)
359
	@echo "Generating a shippable configure script.."
Simon Marlow's avatar
Simon Marlow committed
360
	$(MV) $(BIN_DIST_DIR)/configure-bin.ac $(BIN_DIST_DIR)/configure.ac
Ian Lynagh's avatar
Ian Lynagh committed
361
	( cd $(BIN_DIST_DIR); autoreconf )
362 363
endif

364
# Tar up the distribution and build a manifest
Ian Lynagh's avatar
Ian Lynagh committed
365
binary-dist :: tar-binary-dist
366

367
.PHONY: tar-binary-dist
368
tar-binary-dist:
369
	( cd $(BIN_DIST_TOPDIR_ABS); tar cf - $(BIN_DIST_NAME) | bzip2 >$(BIN_DIST_TARBALL) )
370
	( cd $(BIN_DIST_TOPDIR_ABS); bunzip2 -c $(BIN_DIST_TARBALL) | tar tf - | sed "s/^ghc-$(ProjectVersion)/fptools/" | sort >$(FPTOOLS_TOP_ABS)/bin-manifest-$(ProjectVersion) )
371

372 373 374 375 376
PUBLISH_FILES = $(BIN_DIST_TARBALL)

# Upload the distribution and documentation
ifneq "$(ISCC)" ""
WINDOWS_INSTALLER_BASE = ghc-$(ProjectVersion)-$(TARGETPLATFORM)
Ian Lynagh's avatar
Ian Lynagh committed
377
WINDOWS_INSTALLER = $(WINDOWS_INSTALLER_BASE)$(exeext)
378 379 380 381 382 383 384 385 386 387

PUBLISH_FILES += $(WINDOWS_INSTALLER)

binary-dist :: generate-windows-installer

.PHONY: generate-windows-installer
generate-windows-installer ::
	$(SED) "s/@VERSION@/$(ProjectVersion)/" distrib/ghc.iss | $(ISCC) /O. /F$(WINDOWS_INSTALLER_BASE) -
endif

Simon Marlow's avatar
Simon Marlow committed
388
# Upload the distribution and documentation
389
ifneq "$(PublishLocation)" ""
Ian Lynagh's avatar
Ian Lynagh committed
390 391
publish ::
	make publish-binary-dist 'prefix=$(BIN_DIST_INST_DIR)'
392 393
endif

394 395
nTimes = set -e; for i in `seq 1 $(1)`; do echo Try "$$i: $(2)"; if $(2); then break; fi; done

396
.PHONY: publish-binary-dist
397
publish-binary-dist ::
398 399
	@for f in $(PUBLISH_FILES); \
	    do $(call nTimes,10,$(PublishCp) $$f $(PublishLocation)/dist); \
400
	done
401

Ian Lynagh's avatar
Ian Lynagh committed
402 403 404
# You need to "make binddisttest" before publishing the docs, as it
# works by publish setting $(prefix) to inside the binddisttest
# directory so $(docdir) points to the right place.
Ian Lynagh's avatar
Ian Lynagh committed
405 406 407 408 409 410 411 412 413 414 415

# We assume that Windows means Cygwin, as we can't just use docdir
# unchanged or rsync (really SSH?) thinks that c:/foo means /foo on
# the machine c.

ifeq "$(Windows)" "YES"
PUBLISH_DOCDIR = $(shell cygpath --unix $(docdir))
else
PUBLISH_DOCDIR = $(docdir)
endif

416
publish-binary-dist ::
417
	$(call nTimes,10,$(PublishCp) -r "$(PUBLISH_DOCDIR)"/* $(PublishLocation)/docs)
Simon Marlow's avatar
Simon Marlow committed
418

419 420 421
binary-dist::
	@echo "Mechanical and super-natty! Inspect the result and *if* happy; freeze, sell and get some sleep!"

422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454
ifeq "$(darwin_TARGET_OS)" "1"

# Wrap a binary dist as a MacOS framework and put it into an installer package.

# The ProjectVersionInt is GHC's idea of an API version and hence determines
# the framework version.
FRAMEWORK_VERSION = $(ProjectVersionInt)

# Xcode requires CURRENT_PROJECT_VERSION to be an int or float.  We use this
# only as the build version (aka CFBundleVersion).
CURRENT_PROJECT_VERSION = $(ProjectVersionInt).$(ProjectPatchLevel)

# The user-visible CFBundleShortVersionString is set to the standard GHC 
# version number.
SHORT_VERSION_STRING = $(ProjectVersion)

# Instead of making 'binary-dist' a Makefile dependency, we let xcodebuild call
# 'make binary-dist'.  This has the advantage that xcode knows the framework
# path into which the distribution should be installed and can instruct 
# binary-dist to put it into the right place without copying the whole tree yet
# another time.
#
binary-dist-macos:
	(cd distrib/MacOS; \
	 xcodebuild CURRENT_PROJECT_VERSION=$(CURRENT_PROJECT_VERSION)\
	    	    SHORT_VERSION_STRING=$(SHORT_VERSION_STRING)\
	 	    FRAMEWORK_VERSION=$(FRAMEWORK_VERSION)\
		    CURRENT_LIBRARY_VERSION=$(FRAMEWORK_VERSION))
	(cd distrib/MacOS; \
	 !!!Call the packager!!! )

endif

455
# -----------------------------------------------------------------------------
456 457 458 459
# Building source distributions
#
# Do it like this: 
#
460
#	$ make
461
#	$ make dist
462 463 464
#
# WARNING: `make dist' calls `make distclean' before tarring up the tree.
#
465 466 467 468 469 470

.PHONY: dist

#
# Directory in which we're going to build the src dist
#
Simon Marlow's avatar
Simon Marlow committed
471
SRC_DIST_NAME=ghc-$(ProjectVersion)
472 473 474 475 476
SRC_DIST_DIR=$(shell pwd)/$(SRC_DIST_NAME)

#
# Files to include in source distributions
#
477
SRC_DIST_DIRS += mk docs distrib bindisttest $(filter-out docs distrib libraries/Cabal/doc,$(SUBDIRS))
478
SRC_DIST_FILES += \
479
	configure.ac config.guess config.sub configure \
Simon Marlow's avatar
Simon Marlow committed
480
	aclocal.m4 README ANNOUNCE HACKING LICENSE Makefile install-sh \
481
	ghc.spec.in extra-gcc-opts.in VERSION boot
482

483 484
# -----------------------------------------------------------------------------
# Source distributions
485

486 487 488 489 490 491 492 493 494
# 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
495

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

498 499 500
SRC_DIST_TARBALL = ghc-$(ProjectVersion)-src.tar.bz2
SRC_DIST_EXTRALIBS_TARBALL = ghc-$(ProjectVersion)-src-extralibs.tar.bz2

501 502 503 504 505
VERSION :
	echo $(ProjectVersion) >VERSION

dist :: VERSION

506 507 508 509 510 511 512 513
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 \
514
	  && if test -f $(FPTOOLS_TOP_ABS)/libraries/haskell-src/dist/build/Language/Haskell/Parser.hs; then $(CP) $(FPTOOLS_TOP_ABS)/libraries/haskell-src/dist/build/Language/Haskell/Parser.hs libraries/haskell-src/Language/Haskell/ ; mv libraries/haskell-src/Language/Haskell/Parser.ly libraries/haskell-src/Language/Haskell/Parser.ly.source ; fi \
515 516 517
	  && $(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 \
	)
518
	tar chf - $(EXTRA_LIBS) | bzip2 >$(FPTOOLS_TOP_ABS)/$(SRC_DIST_EXTRALIBS_TARBALL)
519
	$(RM) -rf $(EXTRA_LIBS)
520 521 522 523 524 525 526 527
	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 \
528 529
		echo "Try $$i: $(PublishCp) $(SRC_DIST_EXTRALIBS_TARBALL) $(PublishLocation)/dist"; \
		if $(PublishCp) $(SRC_DIST_EXTRALIBS_TARBALL) $(PublishLocation)/dist; then break; fi\
530 531
	done
	@for i in 0 1 2 3 4 5 6 7 8 9; do \
532 533
		echo "Try $$i: $(PublishCp) $(SRC_DIST_TARBALL) $(PublishLocation)/dist"; \
		if $(PublishCp) $(SRC_DIST_TARBALL) $(PublishLocation)/dist; then break; fi\
534 535
	done
endif
536 537

# -----------------------------------------------------------------------------
538 539
# HC file bundles

Simon Marlow's avatar
Simon Marlow committed
540
hc-file-bundle :
Simon Marlow's avatar
Simon Marlow committed
541 542 543 544 545 546
	$(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
547
	  \( -name "*.hc" -o -name "*_hsc.[ch]" -o -name "*_stub.[ch]" \) -print > hc-files-to-go
Simon Marlow's avatar
Simon Marlow committed
548
	for f in `$(FIND) ghc-$(ProjectVersion)/compiler ghc-$(ProjectVersion)/utils ghc-$(ProjectVersion)/libraries -name "*.hsc" -follow -print` ""; do \
sof's avatar
sof committed
549 550 551 552
	     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
553
	for f in `$(FIND) ghc-$(ProjectVersion)/compiler ghc-$(ProjectVersion)/rts -name "*.cmm" -follow -print` ""; do \
554 555 556 557
	     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
558 559 560 561 562 563
	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`
564

565 566 567
# -----------------------------------------------------------------------------
# Cleaning

568
CLEAN_FILES += hc-files-to-go *-hc.tar.gz
569

570
DIST_CLEAN_FILES += config.cache config.status mk/config.h mk/stamp-h \
571
	ghc.spec docs/users_guide/ug-book.xml extra-gcc-opts
572 573 574 575

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

576 577 578
# VERSION is shipped in a source dist
MAINTAINER_CLEAN_FILES += VERSION

579 580 581
extraclean::
	$(RM) -rf autom4te.cache

Ian Lynagh's avatar
Ian Lynagh committed
582 583
clean distclean ::
	$(MAKE) -C bindisttest $@
584
	if test -d testsuite; then $(MAKE) -C testsuite $@; fi
Ian Lynagh's avatar
Ian Lynagh committed
585

586
# -----------------------------------------------------------------------------
587

sof's avatar
sof committed
588 589 590 591 592
# Turn off target.mk's rules for 'all', 'boot' and 'install'.
NO_BOOT_TARGET=YES
NO_ALL_TARGET=YES
NO_INSTALL_TARGET=YES

593 594
include $(TOP)/mk/target.mk

595 596
# -----------------------------------------------------------------------------