diff options
author | Ian Lynagh <igloo@earth.li> | 2009-04-26 11:42:15 +0000 |
---|---|---|
committer | Ian Lynagh <igloo@earth.li> | 2009-04-26 11:42:15 +0000 |
commit | 34cc75e1a62638f2833815746ebce0a9114dc26b (patch) | |
tree | ef21e8fd7af1356beea9cce7d6efb8a65374e24c /ghc.mk | |
parent | 74e1368d4688ee16f6decdf2cd3ebe27506b26ba (diff) | |
download | haskell-34cc75e1a62638f2833815746ebce0a9114dc26b.tar.gz |
GHC new build system megapatch
Diffstat (limited to 'ghc.mk')
-rw-r--r-- | ghc.mk | 841 |
1 files changed, 841 insertions, 0 deletions
diff --git a/ghc.mk b/ghc.mk new file mode 100644 index 0000000000..329e76f0cf --- /dev/null +++ b/ghc.mk @@ -0,0 +1,841 @@ +# ToDo List. +# +# Before we can merge the new build system into HEAD: +# +# * finish installation +# * other documentation +# * create doc index and contents +# * Windows: should we have ghc-pkg-<version>? +# * should we be stripping things? +# * install libgmp.a, gmp.h +# * finish binary distributions +# * need to fix Cabal for new Windows layout, see +# Distribution/Simple/GHC.configureToolchain. +# +# As we merge the new build system into HEAD: +# +# * remove old Makefiles, add new stubs for building in subdirs +# * utils/hsc2hs/Makefile +# * utils/haddock/Makefile +# * mk/oldconfig.mk.in +# +# Once the new build system is in HEAD, and before 6.12: +# +# * docbook PDFs, e.g. "dblatex -T db2latex users_guide.xml" +# * GhcProfiled +# * optionally install stage3? +# * why does so much stuff get rebuilt after re-configuring? +# * shared libraries, way dyn +# * add pointers to wiki docs from the build system source +# * get HC bootstrapping working +# * add Makefiles for the rest of the utils/ programs that aren't built +# by default (need to exclude them from 'make all' too) +# +# Tickets we can now close, or fix and close: +# +# * 912 build system doesn't have enough dependencies (it does now!) +# * 2744 check for presence of hsc2hs in ./configure +# * 2966 make sure --with-gcc does the right thing (#2966) +# * 3115 make ghc.cabal read-only +# * 2107 install the docs by default +# * 1693 make distclean +# * 2689 make maintainer-clean +# * 2619 bootstrapping using a newer GHC shouldn't fail +# for bogus reasons (picking the wrong version of the ghc package) +# * 2770 check which version of gcc we require +# * 3173 make install with DESTDIR + +# Possible cleanups: +# +# * per-source-file dependencies instead of one .depend file? +# * eliminate undefined variables, and use --warn-undefined-variables? +# * perhaps we should make all the output dirs in the .depend rule, to +# avoid all these mkdirhier calls? +# * put outputs from different ways in different subdirs of distdir/build, +# then we don't have to use -osuf/-hisuf. We would have to install +# them in different places too, so we'd need ghc-pkg support for packages +# of different ways. +# * make PACKAGES generated by configure or sh boot? +# * we should use a directory of package.conf files rather than a single +# file for the inplace package database, so that we can express +# dependencies more accurately. Otherwise it's possible to get into +# a state where the package database is out of date, and the build +# system doesn't know. + +# NOTES on how to debug: +# make --debug=b --debug=m shows dependencies +# make -p prints all generated makefile rules and variables +# make show VALUE=VAR prints the value of VAR +# $(warning stuff) prints stuff when reading the makefile + +# BUILD ORDER +# +# * With bootstrapping compiler: +# o Build libraries/{hpc,extensible-exceptions,Cabal} +# o Build utils/ghc-pkg +# o Build utils/ghc-cabal +# * With bootstrapping compiler and ghc-cabal: +# o Build utils/hsc2hs +# o Build libraries/hpc +# o Build compiler (stage 1) +# * For each package: +# o generate package-data.mk and inplace-pkg-info +# o register each package into inplace/lib/package.conf +# o generate .depend for each package +# * With stage 1: +# o Build libraries/* +# o Build utils/* (except haddock) +# o Build compiler (stage 2) +# * With stage 2: +# o Build utils/haddock +# o Build compiler (stage 3) +# * With haddock: +# o libraries/* +# o compiler + +default : all + +# Just bring makefiles up to date: +.PHONY: just-makefiles +just-makefiles: + @: + +# ----------------------------------------------------------------------------- +# Misc GNU make utils + +nothing= +space=$(nothing) $(nothing) +comma=, + +# Cancel all suffix rules. Ideally we'd like to have 'make -r' turned on +# by default, because that disables all the implicit rules, but there doesn't +# seem to be a good way to do that. This turns off all the old-style suffix +# rules, which does half the job and speeds up make quite a bit: +.SUFFIXES: + +# ----------------------------------------------------------------------------- +# Makefile debugging +# to see the effective value used for a Makefile variable, do +# make show VALUE=MY_VALUE +# + +show: + @echo '$(VALUE)="$($(VALUE))"' + +# ----------------------------------------------------------------------------- +# Include subsidiary build-system bits + +include mk/config.mk + +ifeq "$(ProjectVersion)" "" +$(error Please run ./configure first) +endif + +# (Optional) build-specific configuration +include mk/custom-settings.mk + +ifeq "$(GhcLibWays)" "" +$(error $$(GhcLibWays) is empty, it must contain at least one way) +endif + +# ----------------------------------------------------------------------------- +# Macros for standard targets + +include rules/all-target.mk +include rules/clean-target.mk + +# ----------------------------------------------------------------------------- +# The inplace tree + +$(eval $(call clean-target,inplace,,inplace)) + +# ----------------------------------------------------------------------------- +# Whether to build dependencies or not + +# When we're just doing 'make clean' or 'make show', then we don't need +# to build dependencies. + +NO_INCLUDE_DEPS = NO +NO_INCLUDE_PKGDATA = NO +ifneq "$(findstring clean,$(MAKECMDGOALS))" "" +NO_INCLUDE_DEPS = YES +NO_INCLUDE_PKGDATA = YES +endif +ifeq "$(findstring show,$(MAKECMDGOALS))" "show" +NO_INCLUDE_DEPS = YES +# We want package-data.mk for show +endif + +# We don't haddock base3-compat, as it has the same package name as base +libraries/base3-compat_dist-install_DO_HADDOCK = NO + +# We don't haddock the bootstrapping libraries +libraries/hpc_dist-boot_DO_HADDOCK = NO +libraries/Cabal_dist-boot_DO_HADDOCK = NO +libraries/extensible-exceptions_dist-boot_DO_HADDOCK = NO +libraries/filepath_dist-boot_DO_HADDOCK = NO + +# ----------------------------------------------------------------------------- +# Ways + +include rules/way-prelims.mk + +$(foreach way,$(ALL_WAYS),\ + $(eval $(call way-prelims,$(way)))) + +# ----------------------------------------------------------------------------- +# Compilation Flags + +include rules/distdir-opts.mk +include rules/distdir-way-opts.mk + +# ----------------------------------------------------------------------------- +# Finding source files and object files + +include rules/hs-sources.mk +include rules/c-sources.mk +include rules/includes-sources.mk +include rules/hs-objs.mk +include rules/c-objs.mk + +# ----------------------------------------------------------------------------- +# Suffix rules + +include rules/hs-suffix-rules-srcdir.mk +include rules/hs-suffix-rules.mk + +# ----------------------------------------------------------------------------- +# Suffix rules for .hi files + +include rules/hi-rule.mk + +$(foreach way,$(ALL_WAYS),\ + $(eval $(call hi-rule,$(way)))) + +#----------------------------------------------------------------------------- +# C-related suffix rules + +include rules/c-suffix-rules.mk + +# ----------------------------------------------------------------------------- +# Building package-data.mk files from .cabal files + +include rules/package-config.mk + +# ----------------------------------------------------------------------------- +# Building dependencies + +include rules/build-dependencies.mk + +# ----------------------------------------------------------------------------- +# Build package-data.mk files + +include rules/build-package-data.mk + +# ----------------------------------------------------------------------------- +# Build and install a program + +include rules/build-prog.mk +include rules/shell-wrapper.mk + +# ----------------------------------------------------------------------------- +# Build a perl script + +include rules/build-perl.mk + +# ----------------------------------------------------------------------------- +# Build a package + +include rules/build-package.mk +include rules/build-package-way.mk +include rules/haddock.mk + +# ----------------------------------------------------------------------------- +# Registering hand-written package descriptions (used in libffi and rts) + +include rules/manual-package-config.mk + +# ----------------------------------------------------------------------------- +# Docs + +include rules/docbook.mk + +# ----------------------------------------------------------------------------- +# Making bindists + +include rules/bindist.mk + +# ----------------------------------------------------------------------------- +# Building libraries + +# XXX generate from $(TOP)/packages +PACKAGES = \ + ghc-prim \ + integer-gmp \ + base \ + filepath \ + array \ + bytestring \ + containers + +ifeq "$(Windows)" "YES" +PACKAGES += Win32 +else +PACKAGES += unix +endif + +PACKAGES += \ + old-locale \ + old-time \ + directory \ + process \ + random \ + extensible-exceptions \ + haskell98 \ + hpc \ + packedstring \ + pretty \ + syb \ + template-haskell \ + base3-compat \ + Cabal + +BOOT_PKGS = Cabal hpc extensible-exceptions + +# The actual .a files: needed for dependencies. +ALL_LIBS = $(foreach lib,$(PACKAGES),$(libraries/$(lib)_dist-install_v_LIB)) +BOOT_LIBS = $(foreach lib,$(BOOT_PKGS),$(libraries/$(lib)_dist-boot_v_LIB)) + +OTHER_LIBS = libffi/libHSffi.a libffi/HSffi.o +ifeq "$(HaveLibGmp)" "NO" +OTHER_LIBS += gmp/libgmp.a +endif + +# We cannot run ghc-cabal to configure a package until we have +# configured and registered all of its dependencies. So the following +# hack forces all the configure steps to happen in exactly the order +# given in the PACKAGES variable above. Ideally we should use the +# correct dependencies here to allow more parallelism, but we don't +# know the dependencies until we've generated the pacakge-data.mk +# files. +define fixed_pkg_dep +libraries/$1/$2/package-data.mk : $(GHC_PKG_INPLACE) $$(if $$(fixed_pkg_prev),libraries/$$(fixed_pkg_prev)/$2/package-data.mk) +fixed_pkg_prev:=$1 +endef + +ifneq "$(BINDIST)" "YES" +fixed_pkg_prev= +$(foreach pkg,$(PACKAGES),$(eval $(call fixed_pkg_dep,$(pkg),dist-install))) + +# We assume that the stage2 compiler depends on all the libraries, so +# they all get added to the package database before we try to configure +# it +compiler/stage2/package-data.mk: $(foreach pkg,$(PACKAGES),libraries/$(pkg)/dist-install/package-data.mk) +# haddock depends on ghc and some libraries, but depending on GHC's +# package-data.mk is sufficient, as that in turn depends on all the +# libraries +utils/haddock/dist/package-data.mk: compiler/stage2/package-data.mk + +utils/hsc2hs/dist-install/package-data.mk: compiler/stage2/package-data.mk + +# add the final two package.conf dependencies: ghc-prim depends on RTS, +# and RTS depends on libffi. +libraries/ghc-prim/dist-install/package-data.mk : rts/package.conf.inplace +rts/package.conf.inplace : libffi/package.conf.inplace +endif + +# ----------------------------------------------------------------------------- +# Special magic for the ghc-prim package + +# We want the ghc-prim package to include the GHC.Prim module when it +# is registered, but not when it is built, because GHC.Prim is not a +# real source module, it is built-in to GHC. The old build system did +# this using Setup.hs, but we can't do that here, so we have a flag to +# enable GHC.Prim in the .cabal file (so that the ghc-prim package +# remains compatible with the old build system for the time being). +# GHC.Prim module in the ghc-prim package with a flag: +# +libraries/ghc-prim_CONFIGURE_OPTS += --flag=include-ghc-prim + +# And then we strip it out again before building the package: +define libraries/ghc-prim_PACKAGE_MAGIC +libraries/ghc-prim_dist-install_MODULES := $$(filter-out GHC.Prim,$$(libraries/ghc-prim_dist-install_MODULES)) +endef + +PRIMOPS_TXT = $(GHC_COMPILER_DIR)/prelude/primops.txt + +libraries/ghc-prim/dist-install/build/GHC/PrimopWrappers.hs : $(GENPRIMOP_INPLACE) $(PRIMOPS_TXT) + $(MKDIRHIER) $(dir $@) + $(GENPRIMOP_INPLACE) --make-haskell-wrappers <$(PRIMOPS_TXT) >$@ + +libraries/ghc-prim/GHC/Prim.hs : $(GENPRIMOP_INPLACE) $(PRIMOPS_TXT) + $(GENPRIMOP_INPLACE) --make-haskell-source <$(PRIMOPS_TXT) >$@ + + +# ----------------------------------------------------------------------------- +# Include build instructions from all subdirs + +# See commentary in the top-level Makefile for why we divide the build +# into phases. + +# Setting foo_dist_DISABLE=YES means "in directory foo, for build +# "dist", just read the package-data.mk file, do not build anything". + +# We carefully engineer things so that we can build the +# package-data.mk files early on: they depend only on a few tools also +# built early. Having got the package-data.mk files built, we can +# restart make with up-to-date information about all the packages +# (this is phase 0). The remaining problem is the .depend files: +# +# - .depend files in libraries need the stage 1 compiler to build +# - ghc/stage1/.depend needs compiler/stage1 built +# - compiler/stage1/.depend needs the bootstrap libs built +# +# GHC 6.11+ can build a .depend file without having built the +# dependencies of the package, but we can't rely on the bootstrapping +# compiler being able to do this, which is why we have to separate the +# three phases above. + +# So this is the final ordering: + +# Phase 0 : all package-data.mk files +# (requires ghc-cabal, ghc-pkg, mkdirhier, dummy-ghc etc.) +# Phase 1 : .depend files for bootstrap libs +# (requires hsc2hs) +# Phase 2 : compiler/stage1/.depend +# (requires bootstrap libs and genprimopcode) +# Phase 3 : ghc/stage1/.depend +# (requires compiler/stage1) +# +# The rest : libraries/*/dist-install, compiler/stage2, ghc/stage2 + +BUILD_DIRS = + +ifneq "$(BINDIST)" "YES" +BUILD_DIRS += \ + $(GHC_MKDEPENDC_DIR) \ + $(GHC_MKDIRHIER_DIR) +endif + +BUILD_DIRS += \ + gmp \ + docs/users_guide \ + libraries/Cabal/doc \ + $(GHC_MANGLER_DIR) \ + $(GHC_SPLIT_DIR) \ + $(GHC_UNLIT_DIR) \ + $(GHC_HP2PS_DIR) + +ifneq "$(BINDIST)" "YES" +BUILD_DIRS += \ + $(GHC_GENPRIMOP_DIR) +endif + +BUILD_DIRS += \ + driver \ + driver/ghci \ + driver/ghc \ + libffi \ + includes \ + rts + +ifneq "$(BINDIST)" "YES" +BUILD_DIRS += \ + $(GHC_CABAL_DIR) \ + $(GHC_GENAPPLY_DIR) +endif + +BUILD_DIRS += \ + utils/haddock \ + $(patsubst %, libraries/%, $(PACKAGES)) \ + compiler \ + $(GHC_HSC2HS_DIR) \ + $(GHC_PKG_DIR) \ + utils/hasktags \ + utils/hpc \ + utils/runghc \ + ghc +ifeq "$(Windows)" "YES" +BUILD_DIRS += \ + $(GHC_TOUCHY_DIR) +endif + +# XXX libraries/% must come before any programs built with stage1, see +# Note [lib-depends]. + +ifeq "$(phase)" "0" +$(foreach lib,$(BOOT_PKGS),$(eval \ + libraries/$(lib)_dist-boot_DISABLE = YES)) +endif + +ifneq "$(findstring $(phase),0 1)" "" +# We can build deps for compiler/stage1 in phase 2 +compiler_stage1_DISABLE = YES +endif + +ifneq "$(findstring $(phase),0 1 2)" "" +ghc_stage1_DISABLE = YES +endif + +ifneq "$(findstring $(phase),0 1 2 3)" "" +# In phases 0-3, we disable stage2-3, the full libraries and haddock +utils/haddock_dist_DISABLE = YES +utils/runghc_dist_DISABLE = YES +utils/hpc_dist_DISABLE = YES +utils/hasktags_dist_DISABLE = YES +utils/hsc2hs_dist-install_DISABLE = YES +utils/ghc-pkg_dist-install_DISABLE = YES +compiler_stage2_DISABLE = YES +compiler_stage3_DISABLE = YES +ghc_stage2_DISABLE = YES +ghc_stage3_DISABLE = YES +$(foreach lib,$(PACKAGES),$(eval \ + libraries/$(lib)_dist-install_DISABLE = YES)) +endif + +include $(patsubst %, %/ghc.mk, $(BUILD_DIRS)) + +# We need -fno-warn-deprecated-flags to avoid failure with -Werror +GhcLibHcOpts += -fno-warn-deprecated-flags +ifeq "$(ghc_ge_609)" "YES" +GhcBootLibHcOpts += -fno-warn-deprecated-flags +endif + +# Add $(GhcLibHcOpts) to all library builds +$(foreach pkg,$(PACKAGES),$(eval libraries/$(pkg)_dist-install_HC_OPTS += $$(GhcLibHcOpts))) + +# XXX we configure packages with the bootsrapping compiler (for +# dependency reasons, see the phase ordering), which doesn't +# necessarily support all the extensions we need, and Cabal filters +# out the ones it thinks aren't supported. +libraries/base3-compat_dist-install_HC_OPTS += -XPackageImports + +# ----------------------------------------------------------------------------- +# Bootstrapping libraries + +# We need to build a few libraries with the installed GHC, since GHC itself +# and some of the tools depend on them: + +ifneq "$(BINDIST)" "YES" + +ifeq "$(wildcard $(BOOTSTRAPPING_CONF))" "" +$(shell echo "[]" >$(BOOTSTRAPPING_CONF)) +endif + +$(eval $(call clean-target,$(BOOTSTRAPPING_CONF),,$(BOOTSTRAPPING_CONF))) + +# These three libraries do not depend on each other, so we can build +# them straight off: + +$(eval $(call build-package,libraries/hpc,dist-boot,0)) +$(eval $(call build-package,libraries/extensible-exceptions,dist-boot,0)) +$(eval $(call build-package,libraries/Cabal,dist-boot,0)) + +# register the boot packages in strict sequence, because running +# multiple ghc-pkgs in parallel doesn't work (registrations may get +# lost). +fixed_pkg_prev= +$(foreach pkg,$(BOOT_PKGS),$(eval $(call fixed_pkg_dep,$(pkg),dist-boot))) + +compiler/stage1/package-data.mk : \ + libraries/Cabal/dist-boot/package-data.mk \ + libraries/hpc/dist-boot/package-data.mk \ + libraries/extensible-exceptions/dist-boot/package-data.mk + +# These are necessary because the bootstrapping compiler may not know +# about cross-package dependencies: +$(compiler_stage1_depfile) : $(BOOT_LIBS) +$(ghc_stage1_depfile) : $(compiler_stage1_v_LIB) + +$(foreach pkg,$(BOOT_PKGS),$(eval libraries/$(pkg)_dist-boot_HC_OPTS += $$(GhcBootLibHcOpts))) + +endif + +# ----------------------------------------------------------------------------- +# Creating a local mingw copy on Windows + +ifeq "$(Windows)" "YES" + +# directories don't work well as dependencies, hence a stamp file +$(INPLACE)/stamp-mingw : $(MKDIRHIER) + $(MKDIRHIER) $(INPLACE_MINGW)/bin + GCC=`type -p $(WhatGccIsCalled)`; \ + GccDir=`dirname $$GCC`; \ + $(CP) -p $$GccDir/{gcc.exe,ar.exe,as.exe,dlltool.exe,dllwrap.exe,windres.exe} $(INPLACE_MINGW)/bin; \ + $(CP) -Rp $$GccDir/../include $(INPLACE_MINGW); \ + $(CP) -Rp $$GccDir/../lib $(INPLACE_MINGW); \ + $(CP) -Rp $$GccDir/../libexec $(INPLACE_MINGW); \ + $(CP) -Rp $$GccDir/../mingw32 $(INPLACE_MINGW) + touch $(INPLACE)/stamp-mingw + +install : install_mingw +.PHONY: install_mingw +install_mingw : $(INPLACE_MINGW) + $(CP) -Rp $(INPLACE_MINGW) $(prefix) + +$(INPLACE_LIB)/perl.exe $(INPLACE_LIB)/perl56.dll : + $(CP) $(GhcDir)../{perl.exe,perl56.dll} $(INPLACE_LIB) + +endif # Windows + +libraries/ghc-prim/dist-install/doc/html/ghc-prim/ghc-prim.haddock: \ + libraries/ghc-prim/dist-install/build/autogen/GHC/Prim.hs \ + libraries/ghc-prim/dist-install/build/autogen/GHC/PrimopWrappers.hs + +libraries/ghc-prim/dist-install/build/autogen/GHC/Prim.hs: \ + $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE) $(MKDIRHIER) + $(MKDIRHIER) $(dir $@) + $(GENPRIMOP_INPLACE) --make-haskell-source < $< > $@ + +libraries/ghc-prim/dist-install/build/autogen/GHC/PrimopWrappers.hs: \ + $(PRIMOPS_TXT) $(GENPRIMOP_INPLACE) $(MKDIRHIER) + $(MKDIRHIER) $(dir $@) + $(GENPRIMOP_INPLACE) --make-haskell-wrappers < $< > $@ + +# ----------------------------------------------------------------------------- +# Installation + +install: install_packages install_libs install_libexecs install_headers \ + install_libexec_scripts install_bins + +install_bins: $(INSTALL_BINS) + $(INSTALL_DIR) $(DESTDIR)$(bindir) + for i in $(INSTALL_BINS); do \ + $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(DESTDIR)$(bindir) ; \ + if test "$(darwin_TARGET_OS)" = "1"; then \ + sh mk/fix_install_names.sh $(libdir) $(DESTDIR)$(bindir)/$$i ; \ + fi ; \ + done + +install_libs: $(INSTALL_LIBS) + $(INSTALL_DIR) $(DESTDIR)$(libdir) + for i in $(INSTALL_LIBS); do \ + case $$i in \ + *.a) \ + $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(DESTDIR)$(libdir); \ + $(RANLIB) $(DESTDIR)$(libdir)/`basename $$i` ;; \ + *.dll) \ + $(INSTALL_DATA) -s $(INSTALL_OPTS) $$i $(DESTDIR)$(libdir) ;; \ + *.so) \ + $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(DESTDIR)$(libdir) ;; \ + *.dylib) \ + $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(DESTDIR)$(libdir); \ + install_name_tool -id $(DESTDIR)$(libdir)/`basename $$i` $(DESTDIR)$(libdir)/`basename $$i` ;; \ + *) \ + $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(DESTDIR)$(libdir); \ + esac; \ + done + +install_libexec_scripts: $(INSTALL_LIBEXEC_SCRIPTS) + $(MKDIRHIER) $(DESTDIR)$(libexecdir) + for i in $(INSTALL_LIBEXEC_SCRIPTS); do \ + $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(DESTDIR)$(libexecdir); \ + done + +install_libexecs: $(INSTALL_LIBEXECS) + $(MKDIRHIER) $(DESTDIR)$(libexecdir) + for i in $(INSTALL_LIBEXECS); do \ + $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(DESTDIR)$(libexecdir); \ + done + +install_headers: $(INSTALL_HEADERS) + $(INSTALL_DIR) $(DESTDIR)$(headerdir) + for i in $(INSTALL_HEADERS); do \ + $(INSTALL_HEADER) $(INSTALL_OPTS) $$i $(DESTDIR)$(headerdir); \ + done + +INSTALLED_PACKAGE_CONF=$(DESTDIR)$(libdir)/package.conf + +# Install packages in the right order, so that ghc-pkg doesn't complain. +# Also, install ghc-pkg first. +ifeq "$(Windows)" "NO" +INSTALLED_GHC_PKG_REAL=$(DESTDIR)$(libexecdir)/ghc-pkg +else +INSTALLED_GHC_PKG_REAL=$(DESTDIR)$(bindir)/ghc-pkg.exe +endif + +install_packages: install_libexecs +install_packages: libffi/package.conf.install rts/package.conf.install + $(MKDIRHIER) $(DESTDIR)$(libdir) + echo "[]" > $(INSTALLED_PACKAGE_CONF) + $(INSTALLED_GHC_PKG_REAL) --force --global-conf $(INSTALLED_PACKAGE_CONF) update libffi/package.conf.install + $(INSTALLED_GHC_PKG_REAL) --force --global-conf $(INSTALLED_PACKAGE_CONF) update rts/package.conf.install + $(foreach p, $(PACKAGES),\ + $(GHC_CABAL_INPLACE) install \ + $(INSTALLED_GHC_PKG_REAL) \ + $(INSTALLED_PACKAGE_CONF) \ + libraries/$p dist-install \ + '$(DESTDIR)' '$(prefix)' '$(libdir)' '$(docdir)/libraries' &&) true + $(GHC_CABAL_INPLACE) install \ + $(INSTALLED_GHC_PKG_REAL) \ + $(INSTALLED_PACKAGE_CONF) \ + compiler stage2 \ + '$(DESTDIR)' '$(prefix)' '$(libdir)' '$(docdir)/libraries' + +# ----------------------------------------------------------------------------- +# Binary distributions + +$(eval $(call bindist,.,\ + LICENSE \ + configure config.sub config.guess \ + extra-gcc-opts.in \ + Makefile \ + mk/config.mk.in \ + $(INPLACE_BIN)/mkdirhier \ + $(INPLACE_BIN)/ghc-cabal \ + utils/pwd/pwd \ + $(BINDIST_WRAPPERS) \ + $(BINDIST_LIBS) \ + $(BINDIST_HI) \ + $(BINDIST_EXTRAS) \ + $(INSTALL_HEADERS) \ + $(INSTALL_LIBEXECS) \ + $(INSTALL_LIBEXEC_SCRIPTS) \ + $(INSTALL_BINS) \ + $(filter-out extra-gcc-opts,$(INSTALL_LIBS)) \ + $(filter-out %/project.mk,$(filter-out mk/config.mk,$(MAKEFILE_LIST))) \ + mk/fix_install_names.sh \ + mk/project.mk \ + )) +# mk/project.mk gets an absolute path, so we manually include it in +# the bindist with a relative path + +binary-dist: + $(RM) -rf $(BIN_DIST_NAME) + mkdir $(BIN_DIST_NAME) + set -e; for i in LICENSE compiler ghc rts libraries utils gmp docs libffi includes driver mk rules Makefile aclocal.m4 config.sub config.guess extra-gcc-opts.in ghc.mk inplace; do ln -s ../$$i $(BIN_DIST_NAME)/; done + ln -s ../distrib/configure-bin.ac $(BIN_DIST_NAME)/configure.ac + cd $(BIN_DIST_NAME) && autoreconf + $(RM) -f $(BIN_DIST_TAR) +# h means "follow symlinks", e.g. if aclocal.m4 is a symlink to a source +# tree then we want to include the real file, not a symlink to it + $(TAR) hcf $(BIN_DIST_TAR) -T $(BIN_DIST_LIST) + bzip2 < $(BIN_DIST_TAR) > $(BIN_DIST_TAR_BZ2) + +# ----------------------------------------------------------------------------- +# Source distributions + +# Do it like this: +# +# $ make +# $ make sdist +# + +# 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 + +# +# Directory in which we're going to build the src dist +# +SRC_DIST_NAME=ghc-$(ProjectVersion) +SRC_DIST_DIR=$(shell pwd)/$(SRC_DIST_NAME) + +# +# Files to include in source distributions +# +SRC_DIST_DIRS = mk rules docs distrib bindisttest gmp libffi includes utils docs rts compiler ghc driver libraries +SRC_DIST_FILES += \ + configure.ac config.guess config.sub configure \ + aclocal.m4 README ANNOUNCE HACKING LICENSE Makefile install-sh \ + ghc.spec.in ghc.spec extra-gcc-opts.in VERSION boot ghc.mk + +EXTRA_LIBS=$(patsubst %, $(SRC_DIST_NAME)/%, $(shell grep -E "extralibs|dph" packages | grep -v "^\#" | sed "s/ .*//")) + +SRC_DIST_TARBALL = ghc-$(ProjectVersion)-src.tar.bz2 +SRC_DIST_EXTRALIBS_TARBALL = ghc-$(ProjectVersion)-src-extralibs.tar.bz2 + +VERSION : + echo $(ProjectVersion) >VERSION + +sdist : VERSION + +# Use: +# $(call sdist_file,compiler,stage2,cmm,CmmLex,x) +# to copy the generated file that replaces compiler/cmm/CmmLex.x, where +# "stage2" is the dist dir. +sdist_file = \ + if test -f $(TOP)/$1/$2/build/$4.hs; then \ + $(CP) $(TOP)/$1/$2/build/$4.hs $1/$3/ ; \ + mv $1/$3/$4.$5 $1/$3/$4.$5.source ;\ + else \ + echo "does not exist: $1/$2//build/$4.hs"; \ + exit 1; \ + fi + +.PHONY: sdist-prep +sdist-prep : + $(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 $(TOP)/$$i ); done \ + && for i in $(SRC_DIST_FILES); do $(LN_S) $(TOP)/$$i .; done \ + && $(MAKE) distclean \ + && if test -f $(TOP)/libraries/haskell-src/dist/build/Language/Haskell/Parser.hs; then $(CP) $(TOP)/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 \ + && $(call sdist_file,compiler,stage2,cmm,CmmLex,x) \ + && $(call sdist_file,compiler,stage2,cmm,CmmParse,y) \ + && $(call sdist_file,compiler,stage2,main,ParsePkgConf,y) \ + && $(call sdist_file,compiler,stage2,parser,HaddockLex,x) \ + && $(call sdist_file,compiler,stage2,parser,HaddockParse,y) \ + && $(call sdist_file,compiler,stage2,parser,Lexer,x) \ + && $(call sdist_file,compiler,stage2,parser,Parser,y.pp) \ + && $(call sdist_file,compiler,stage2,parser,ParserCore,y) \ + && $(call sdist_file,utils/hpc,dist,,HpcParser,y) \ + && $(call sdist_file,utils/genprimopcode,dist,,Lexer,x) \ + && $(call sdist_file,utils/genprimopcode,dist,,Parser,y) \ + && $(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" -o -name "*-darcs-backup*" \) -print | xargs $(RM) -rf \ + ) + +.PHONY: sdist +sdist : sdist-prep + $(TAR) chf - $(EXTRA_LIBS) | bzip2 >$(TOP)/$(SRC_DIST_EXTRALIBS_TARBALL) + $(RM) -rf $(EXTRA_LIBS) + $(TAR) chf - $(SRC_DIST_NAME) 2>$src_log | bzip2 >$(TOP)/$(SRC_DIST_TARBALL) + +sdist-manifest : $(SRC_DIST_TARBALL) + tar tjf $(SRC_DIST_TARBALL) | sed "s|^ghc-$(ProjectVersion)/||" | sort >sdist-manifest + +# Upload the distribution(s) +# Retrying is to work around buggy firewalls that corrupt large file transfers +# over SSH. +ifneq "$(PublishLocation)" "" +publish-sdist : + @for i in 0 1 2 3 4 5 6 7 8 9; do \ + echo "Try $$i: $(PublishCp) $(SRC_DIST_EXTRALIBS_TARBALL) $(PublishLocation)/dist"; \ + if $(PublishCp) $(SRC_DIST_EXTRALIBS_TARBALL) $(PublishLocation)/dist; 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)/dist"; \ + if $(PublishCp) $(SRC_DIST_TARBALL) $(PublishLocation)/dist; then break; fi; \ + done +endif + +# ----------------------------------------------------------------------------- +# Cleaning + +.PHONY: clean + +clean : clean_files +.PHONY: clean_files +clean_files : + $(RM) $(CLEAN_FILES) + +distclean : clean + $(RM) config.cache config.status config.log mk/config.h mk/stamp-h + $(RM) mk/config.mk mk/are-validating.mk + $(RM) extra-gcc-opts docs/users_guide/ug-book.xml + $(RM) compiler/ghc.cabal ghc/ghc-bin.cabal + $(RM) libraries/base/include/HsBaseConfig.h + $(RM) libraries/directory/include/HsDirectoryConfig.h + +maintainer-clean : distclean + $(RM) ghc.spec + $(RM) libraries/*/GNUmakefile |