#
# Once the new build system is in HEAD, and before 6.12:
#
+# * separate the logic of whether to do something from the test for
+# existence of the tool to do it. For example, rather than checking
+# if $DIR_DOCBOOK_XSL or $XSLTPROC is "", we should have a variable
+# for controlling the building of the docs.
# * remove old Makefiles, add new stubs for building in subdirs
# * utils/hsc2hs/Makefile
# * utils/haddock/Makefile
-# * mk/oldconfig.mk.in
# * docs/Makefile
# * docs/docbook-cheat-sheet/Makefile
# * docs/ext-core/Makefile
# * docs/man/Makefile
# * docs/storage-mgmt/Makefile
-# * docs/users_guide/Makefile
# * docs/vh/Makefile
# * driver/Makefile
-# * driver/ghc/Makefile
-# * libraries/Makefile
# * rts/dotnet/Makefile
# * utils/Makefile
-# * docbook PDFs, e.g. "dblatex -T db2latex users_guide.xml"
# * GhcProfiled
# * optionally install stage3?
# * shared libraries, way dyn
#
# * 2966 make sure --with-gcc does the right thing (#2966)
# * 1693 make distclean
-# * 2689 make maintainer-clean
# * 3173 make install with DESTDIR
# Possible cleanups:
# -----------------------------------------------------------------------------
# Include subsidiary build-system bits
-include mk/config.mk
+include mk/tree.mk
+ifeq "$(findstring clean,$(MAKECMDGOALS))" ""
+include mk/config.mk
ifeq "$(ProjectVersion)" ""
$(error Please run ./configure first)
endif
+endif
# (Optional) build-specific configuration
include mk/custom-settings.mk
+ifeq "$(findstring clean,$(MAKECMDGOALS))" ""
ifeq "$(GhcLibWays)" ""
$(error $$(GhcLibWays) is empty, it must contain at least one way)
endif
+endif
# -----------------------------------------------------------------------------
# Macros for standard targets
# 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
+ifneq "$(findstring bootstrapping-files,$(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
# -----------------------------------------------------------------------------
# Suffix rules
+# Suffix rules cause "make clean" to fail on Windows (trac #3233)
+# so we don't make any when cleaning.
+ifneq "$(CLEANING)" "YES"
+
include rules/hs-suffix-rules-srcdir.mk
include rules/hs-suffix-rules.mk
include rules/c-suffix-rules.mk
+endif
+
# -----------------------------------------------------------------------------
# Building package-data.mk files from .cabal files
PACKAGES += haskeline
+ifneq "$(BootingFromHc)" "YES"
+PACKAGES_STAGE2 += \
+ dph/dph-base \
+ dph/dph-prim-interface \
+ dph/dph-prim-seq \
+ dph/dph-prim-par \
+ dph/dph-seq \
+ dph/dph-par
+endif
+
BOOT_PKGS = Cabal hpc extensible-exceptions
-# The actual .a files: needed for dependencies.
-ALL_LIBS = $(foreach lib,$(PACKAGES),$(libraries/$(lib)_dist-install_v_LIB))
+# The actual .a and .so/.dll files: needed for dependencies.
+ALL_STAGE1_LIBS = $(foreach lib,$(PACKAGES),$(libraries/$(lib)_dist-install_v_LIB))
+ifeq "$(BuildSharedLibs)" "YES"
+ALL_STAGE1_LIBS += $(foreach lib,$(PACKAGES),$(libraries/$(lib)_dist-install_dyn_LIB))
+endif
BOOT_LIBS = $(foreach lib,$(BOOT_PKGS),$(libraries/$(lib)_dist-boot_v_LIB))
-OTHER_LIBS = libffi/libHSffi.a libffi/HSffi.o
+OTHER_LIBS = libffi/libHSffi$(v_libsuf) libffi/HSffi.o
+ifeq "$(BuildSharedLibs)" "YES"
+OTHER_LIBS += libffi/libHSffi$(dyn_libsuf)
+endif
ifeq "$(HaveLibGmp)" "NO"
-OTHER_LIBS += gmp/libgmp.a
+GMP_LIB = gmp/libgmp.a
+OTHER_LIBS += $(GMP_LIB)
endif
# We cannot run ghc-cabal to configure a package until we have
# 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)
+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)))
+$(foreach pkg,$(PACKAGES) $(PACKAGES_STAGE2),$(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)
+compiler/stage2/package-data.mk: $(foreach pkg,$(PACKAGES) $(PACKAGES_STAGE2),libraries/$(pkg)/dist-install/package-data.mk)
+ghc/stage1/package-data.mk: compiler/stage1/package-data.mk
+ghc/stage2/package-data.mk: compiler/stage2/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
BUILD_DIRS += \
utils/haddock \
- $(patsubst %, libraries/%, $(PACKAGES)) \
+ utils/haddock/doc
+
+ifneq "$(CLEANING)" "YES"
+BUILD_DIRS += \
+ $(patsubst %, libraries/%, $(PACKAGES) $(PACKAGES_STAGE2))
+ifneq "$(BootingFromHc)" "YES"
+BUILD_DIRS += \
+ libraries/dph
+endif
+endif
+
+BUILD_DIRS += \
compiler \
$(GHC_HSC2HS_DIR) \
$(GHC_PKG_DIR) \
- utils/hasktags \
utils/hpc \
utils/runghc \
ghc
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 \
+$(foreach lib,$(PACKAGES) $(PACKAGES_STAGE2),$(eval \
libraries/$(lib)_dist-install_DISABLE = YES))
endif
endif
# Add $(GhcLibHcOpts) to all library builds
-$(foreach pkg,$(PACKAGES),$(eval libraries/$(pkg)_dist-install_HC_OPTS += $$(GhcLibHcOpts)))
+$(foreach pkg,$(PACKAGES) $(PACKAGES_STAGE2),$(eval libraries/$(pkg)_dist-install_HC_OPTS += $$(GhcLibHcOpts)))
+
+# XXX Hack; remove this
+$(foreach pkg,$(PACKAGES_STAGE2),$(eval libraries/$(pkg)_dist-install_HC_OPTS += -Wwarn))
-# XXX we configure packages with the bootsrapping compiler (for
+# XXX we configure packages with the bootstrapping 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.
ifneq "$(BINDIST)" "YES"
+ifneq "$(BOOTSTRAPPING_CONF)" ""
ifeq "$(wildcard $(BOOTSTRAPPING_CONF))" ""
$(shell echo "[]" >$(BOOTSTRAPPING_CONF))
endif
+endif
$(eval $(call clean-target,$(BOOTSTRAPPING_CONF),,$(BOOTSTRAPPING_CONF)))
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),\
+ $(foreach p, $(PACKAGES) $(PACKAGES_STAGE2),\
$(GHC_CABAL_INPLACE) install \
$(INSTALLED_GHC_PKG_REAL) \
$(INSTALLED_PACKAGE_CONF) \
$(eval $(call bindist,.,\
LICENSE \
- configure config.sub config.guess \
+ configure config.sub config.guess install-sh \
extra-gcc-opts.in \
Makefile \
mk/config.mk.in \
$(INPLACE_BIN)/mkdirhier \
$(INPLACE_BIN)/ghc-cabal \
- utils/pwd/pwd \
+ utils/ghc-pwd/ghc-pwd \
$(BINDIST_WRAPPERS) \
$(BINDIST_LIBS) \
$(BINDIST_HI) \
$(filter-out %/project.mk,$(filter-out mk/config.mk,$(MAKEFILE_LIST))) \
mk/fix_install_names.sh \
mk/project.mk \
+ libraries/dph/LICENSE \
))
# 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
+ 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 install-sh 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)
+ $(TAR) hcf - -T $(BIN_DIST_LIST) | bzip2 -c >$(BIN_DIST_TAR_BZ2)
+
+nTimes = set -e; for i in `seq 1 $(1)`; do echo Try "$$i: $(2)"; if $(2); then break; fi; done
+
+.PHONY: publish-binary-dist
+publish-binary-dist:
+ $(call nTimes,10,$(PublishCp) $(BIN_DIST_TAR_BZ2) $(PublishLocation)/dist)
# -----------------------------------------------------------------------------
# Source distributions
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
.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)
# 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
+ $(call nTimes,10,$(PublishCp) $(SRC_DIST_TARBALL) $(PublishLocation)/dist)
+endif
+
+ifeq "$(GhcUnregisterised)" "YES"
+SRC_CC_OPTS += -DNO_REGS -DUSE_MINIINTERPRETER -D__GLASGOW_HASKELL__=$(ProjectVersionInt)
endif
# -----------------------------------------------------------------------------
.PHONY: clean
+CLEAN_FILES += utils/ghc-pwd/ghc-pwd
+CLEAN_FILES += utils/ghc-pwd/ghc-pwd.exe
+CLEAN_FILES += utils/ghc-pwd/ghc-pwd.hi
+CLEAN_FILES += utils/ghc-pwd/ghc-pwd.o
+
clean : clean_files
.PHONY: clean_files
clean_files :
$(RM) $(CLEAN_FILES)
+ $(RM) -r $(patsubst %, libraries/%/dist, $(PACKAGES) $(PACKAGES_STAGE2))
+ $(RM) -r $(patsubst %, libraries/%/dist-install, $(PACKAGES) $(PACKAGES_STAGE2))
+ $(RM) -r $(patsubst %, libraries/%/dist-boot, $(PACKAGES) $(PACKAGES_STAGE2))
distclean : clean
$(RM) config.cache config.status config.log mk/config.h mk/stamp-h
$(RM) libraries/process/include/HsProcessConfig.h
$(RM) libraries/unix/include/HsUnixConfig.h
$(RM) libraries/old-time/include/HsTimeConfig.h
+ $(RM) $(patsubst %, libraries/%/config.log, $(PACKAGES) $(PACKAGES_STAGE2))
+ $(RM) $(patsubst %, libraries/%/config.status, $(PACKAGES) $(PACKAGES_STAGE2))
+ $(RM) $(patsubst %, libraries/%/include/Hs*Config.h, $(PACKAGES) $(PACKAGES_STAGE2))
+ $(RM) -r $(patsubst %, libraries/%/autom4te.cache, $(PACKAGES) $(PACKAGES_STAGE2))
maintainer-clean : distclean
$(RM) configure mk/config.h.in
$(RM) -r autom4te.cache libraries/*/autom4te.cache
$(RM) ghc.spec
- $(RM) libraries/*/GNUmakefile libraries/*/ghc.mk libraries/*/configure
+ $(RM) $(patsubst %, libraries/%/GNUmakefile, \
+ $(PACKAGES) $(PACKAGES_STAGE2))
+ $(RM) $(patsubst %, libraries/%/ghc.mk, $(PACKAGES) $(PACKAGES_STAGE2))
+ $(RM) $(patsubst %, libraries/%/configure, \
+ $(PACKAGES) $(PACKAGES_STAGE2))
$(RM) libraries/base/include/HsBaseConfig.h.in
$(RM) libraries/directory/include/HsDirectoryConfig.h.in
$(RM) libraries/process/include/HsProcessConfig.h.in
$(RM) libraries/unix/include/HsUnixConfig.h.in
$(RM) libraries/old-time/include/HsTimeConfig.h.in
+
+.PHONY: all_libraries
+
+.PHONY: bootstrapping-files
+bootstrapping-files: $(OTHER_LIBS)
+bootstrapping-files: includes/ghcautoconf.h
+bootstrapping-files: includes/DerivedConstants.h
+bootstrapping-files: includes/GHCConstants.h
+