summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac2
-rw-r--r--distrib/Makefile-bin-vars.in53
-rw-r--r--distrib/configure-bin.ac2
-rw-r--r--ghc.mk52
-rw-r--r--ghc/ghc.wrapper2
-rw-r--r--mk/config.mk.in149
-rw-r--r--mk/install.mk.in158
-rw-r--r--mk/tree.mk9
-rw-r--r--rts/ghc.mk6
-rw-r--r--rules/build-perl.mk4
-rw-r--r--rules/build-prog.mk8
-rw-r--r--rules/manual-package-config.mk4
-rw-r--r--rules/shell-wrapper.mk18
-rw-r--r--utils/ghc-pkg/ghc-pkg.wrapper2
-rw-r--r--utils/touchy/ghc.mk2
-rw-r--r--utils/unlit/ghc.mk2
16 files changed, 222 insertions, 251 deletions
diff --git a/configure.ac b/configure.ac
index dcea6e1382..44db95eebc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -870,7 +870,7 @@ if grep ' ' compiler/ghc.cabal.in 2>&1 >/dev/null; then
AC_MSG_ERROR([compiler/ghc.cabal.in contains tab characters; please remove them])
fi
-AC_CONFIG_FILES([mk/config.mk mk/project.mk compiler/ghc.cabal ghc/ghc-bin.cabal ghc.spec extra-gcc-opts docs/users_guide/ug-book.xml distrib/ghc.iss])
+AC_CONFIG_FILES([mk/config.mk mk/install.mk mk/project.mk compiler/ghc.cabal ghc/ghc-bin.cabal ghc.spec extra-gcc-opts docs/users_guide/ug-book.xml distrib/ghc.iss])
AC_CONFIG_COMMANDS([mk/stamp-h],[echo timestamp > mk/stamp-h])
AC_OUTPUT
diff --git a/distrib/Makefile-bin-vars.in b/distrib/Makefile-bin-vars.in
index d213498835..08993693e1 100644
--- a/distrib/Makefile-bin-vars.in
+++ b/distrib/Makefile-bin-vars.in
@@ -7,30 +7,7 @@ FPTOOLS_TOP_ABS = @hardtop@
# rather than ghc-pkg.exe.
GHC_PKG_PROG = $(FPTOOLS_TOP_ABS)/utils/ghc-pkg/ghc-pkg.bin
-# Where the different pieces of the bundle should go:
-bindir = @bindir@
-libdir = @libdir@/$(package)-$(version)
-libexecdir = $(libdir)
-datarootdir = @datarootdir@
-# datadir is set to libdir here as GHC needs package.conf and unlit
-# to be in the same place (and things like ghc-pkg need to agree on
-# where package.conf is, so we just set it globally).
-datadir = $(libdir)
-
platform = @TargetPlatform@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-mandir = $(datarootdir)/man
-
-headerdir = $(libdir)/include
-
-# default
-docdir = @datadir@/doc/ghc
-htmldir = $(docdir)
-psdir = $(docdir)
-pdfdir = $(docdir)
-
PERL = @PerlCmd@
SH = /bin/sh
@@ -56,36 +33,6 @@ CPP = @CPP@
RAWCPP_FLAGS = -undef -traditional
-#----------end of user-serviceable parts------------
-#
-#
-# How to install the different pieces
-#
-INSTALL_DIR = $(bindist_abs_root)/utils/mkdirhier/mkdirhier
-INSTALL_BIN = $(INSTALL) $(INSTALL_BIN_OPTS)
-INSTALL_LIB = $(INSTALL) $(INSTALL_LIB_OPTS)
-INSTALL_DATA = $(INSTALL) $(INSTALL_DATA_OPTS)
-INSTALL_SCRIPT = $(INSTALL) $(INSTALL_SCRIPT_OPTS)
-INSTALL_PROGRAM = $(INSTALL) $(INSTALL_PROGRAM_OPTS)
-INSTALL_HEADER = $(INSTALL) $(INSTALL_HEADER_OPTS)
-INSTALL_SHLIB = $(INSTALL) $(INSTALL_SHLIB_OPTS)
-INSTALL_MAN = $(INSTALL) $(INSTALL_MAN_OPTS)
-
-# What's common to all installs
-INSTALL_OPTS= $(EXTRA_INSTALL_OPTS)
-
-BIN_PERMS = 755
-LIB_PERMS = 644
-
-INSTALL_BIN_OPTS = -m $(BIN_PERMS) $(INSTALL_OPTS) $(EXTRA_INSTALL_BIN_OPTS)
-INSTALL_LIB_OPTS = -m $(LIB_PERMS) $(INSTALL_OPTS) $(EXTRA_INSTALL_LIB_OPTS)
-INSTALL_DATA_OPTS = -m $(LIB_PERMS) $(INSTALL_OPTS) $(EXTRA_INSTALL_DATA_OPTS)
-INSTALL_SCRIPT_OPTS = -m $(BIN_PERMS) $(INSTALL_OPTS) $(EXTRA_INSTALL_SCRIPT_OPTS)
-INSTALL_PROGRAM_OPTS = -m $(BIN_PERMS) $(INSTALL_OPTS) $(EXTRA_INSTALL_PROGRAM_OPTS)
-INSTALL_HEADER_OPTS = -m $(LIB_PERMS) $(INSTALL_OPTS) $(EXTRA_INSTALL_HEADER_OPTS)
-INSTALL_SHLIB_OPTS = -m $(BIN_PERMS) $(INSTALL_OPTS) $(EXTRA_INSTALL_SHLIB_OPTS)
-INSTALL_MAN_OPTS = -m $(LIB_PERMS) $(INSTALL_OPTS) $(EXTRA_INSTALL_MAN_OPTS)
-
EXECUTABLE_FILE = chmod $(BIN_PERMS)
GHC_COMPAT_DIR=$(TOP)/mk
diff --git a/distrib/configure-bin.ac b/distrib/configure-bin.ac
index 783c1f1680..49f995c601 100644
--- a/distrib/configure-bin.ac
+++ b/distrib/configure-bin.ac
@@ -167,7 +167,7 @@ dnl ** Check gcc version and flags we need to pass it **
FP_GCC_EXTRA_FLAGS
#
-AC_CONFIG_FILES(extra-gcc-opts mk/config.mk)
+AC_CONFIG_FILES(extra-gcc-opts mk/config.mk mk/install.mk)
AC_OUTPUT
echo "****************************************************"
diff --git a/ghc.mk b/ghc.mk
index b33a6b9f5f..56af0ee535 100644
--- a/ghc.mk
+++ b/ghc.mk
@@ -697,52 +697,58 @@ libraries/ghc-prim/dist-install/build/autogen/GHC/PrimopWrappers.hs: \
# Installation
install: install_packages install_libs install_libexecs install_headers \
- install_libexec_scripts install_bins install_docs
+ install_libexec_scripts install_bins install_docs install_topdirs
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 ; \
+ sh mk/fix_install_names.sh $(ghclibdir) $(DESTDIR)$(bindir)/$$i ; \
fi ; \
done
install_libs: $(INSTALL_LIBS)
- $(INSTALL_DIR) $(DESTDIR)$(libdir)
+ $(INSTALL_DIR) $(DESTDIR)$(ghclibdir)
for i in $(INSTALL_LIBS); do \
case $$i in \
*.a) \
- $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(DESTDIR)$(libdir); \
- $(RANLIB) $(DESTDIR)$(libdir)/`basename $$i` ;; \
+ $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(DESTDIR)$(ghclibdir); \
+ $(RANLIB) $(DESTDIR)$(ghclibdir)/`basename $$i` ;; \
*.dll) \
- $(INSTALL_DATA) -s $(INSTALL_OPTS) $$i $(DESTDIR)$(libdir) ;; \
+ $(INSTALL_DATA) -s $(INSTALL_OPTS) $$i $(DESTDIR)$(ghclibdir) ;; \
*.so) \
- $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(DESTDIR)$(libdir) ;; \
+ $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(DESTDIR)$(ghclibdir) ;; \
*.dylib) \
- $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(DESTDIR)$(libdir); \
- install_name_tool -id $(DESTDIR)$(libdir)/`basename $$i` $(DESTDIR)$(libdir)/`basename $$i` ;; \
+ $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(DESTDIR)$(ghclibdir); \
+ install_name_tool -id $(DESTDIR)$(ghclibdir)/`basename $$i` $(DESTDIR)$(ghclibdir)/`basename $$i` ;; \
*) \
- $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(DESTDIR)$(libdir); \
+ $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(DESTDIR)$(ghclibdir); \
esac; \
done
install_libexec_scripts: $(INSTALL_LIBEXEC_SCRIPTS)
- $(INSTALL_DIR) $(DESTDIR)$(libexecdir)
+ $(INSTALL_DIR) $(DESTDIR)$(ghclibexecdir)
for i in $(INSTALL_LIBEXEC_SCRIPTS); do \
- $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(DESTDIR)$(libexecdir); \
+ $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(DESTDIR)$(ghclibexecdir); \
done
install_libexecs: $(INSTALL_LIBEXECS)
- $(INSTALL_DIR) $(DESTDIR)$(libexecdir)
+ $(INSTALL_DIR) $(DESTDIR)$(ghclibexecdir)
for i in $(INSTALL_LIBEXECS); do \
- $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(DESTDIR)$(libexecdir); \
+ $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(DESTDIR)$(ghclibexecdir); \
+ done
+
+install_topdirs: $(INSTALL_TOPDIRS)
+ $(INSTALL_DIR) $(DESTDIR)$(topdir)
+ for i in $(INSTALL_TOPDIRS); do \
+ $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(DESTDIR)$(topdir); \
done
install_headers: $(INSTALL_HEADERS)
- $(INSTALL_DIR) $(DESTDIR)$(headerdir)
+ $(INSTALL_DIR) $(DESTDIR)$(ghcheaderdir)
for i in $(INSTALL_HEADERS); do \
- $(INSTALL_HEADER) $(INSTALL_OPTS) $$i $(DESTDIR)$(headerdir); \
+ $(INSTALL_HEADER) $(INSTALL_OPTS) $$i $(DESTDIR)$(ghcheaderdir); \
done
install_docs: $(INSTALL_HEADERS)
@@ -760,19 +766,19 @@ install_docs: $(INSTALL_HEADERS)
$(INSTALL_DOC) $(INSTALL_OPTS) $$i/* $(DESTDIR)$(docdir)/html/`basename $$i`; \
done
-INSTALLED_PACKAGE_CONF=$(DESTDIR)$(libdir)/package.conf
+INSTALLED_PACKAGE_CONF=$(DESTDIR)$(topdir)/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
+INSTALLED_GHC_PKG_REAL=$(DESTDIR)$(ghclibexecdir)/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
- $(INSTALL_DIR) $(DESTDIR)$(libdir)
+ $(INSTALL_DIR) $(DESTDIR)$(topdir)
"$(RM)" $(RM_OPTS) $(INSTALLED_PACKAGE_CONF)
$(CREATE_DATA) $(INSTALLED_PACKAGE_CONF)
echo "[]" >> $(INSTALLED_PACKAGE_CONF)
@@ -783,12 +789,12 @@ install_packages: libffi/package.conf.install rts/package.conf.install
$(INSTALLED_GHC_PKG_REAL) \
$(INSTALLED_PACKAGE_CONF) \
libraries/$p dist-install \
- '$(DESTDIR)' '$(prefix)' '$(libdir)' '$(docdir)/html/libraries' &&) true
+ '$(DESTDIR)' '$(prefix)' '$(ghclibdir)' '$(docdir)/html/libraries' &&) true
"$(GHC_CABAL_INPLACE)" install \
$(INSTALLED_GHC_PKG_REAL) \
$(INSTALLED_PACKAGE_CONF) \
compiler stage2 \
- '$(DESTDIR)' '$(prefix)' '$(libdir)' '$(docdir)/html/libraries'
+ '$(DESTDIR)' '$(prefix)' '$(ghclibdir)' '$(docdir)/html/libraries'
# -----------------------------------------------------------------------------
# Binary distributions
@@ -810,6 +816,7 @@ $(eval $(call bindist,root1,\
$(INSTALL_HEADERS) \
$(INSTALL_LIBEXECS) \
$(INSTALL_LIBEXEC_SCRIPTS) \
+ $(INSTALL_TOPDIRS) \
$(INSTALL_BINS) \
$(INSTALL_DOCS) \
$(INSTALL_LIBRARY_DOCS) \
@@ -819,9 +826,10 @@ $(eval $(call bindist,root2,\
docs/index.html \
$(wildcard libraries/*/dist-install/doc/) \
$(filter-out extra-gcc-opts,$(INSTALL_LIBS)) \
- $(filter-out %/project.mk,$(filter-out mk/config.mk,$(MAKEFILE_LIST))) \
+ $(filter-out %/project.mk mk/config.mk %/mk/install.mk,$(MAKEFILE_LIST)) \
mk/fix_install_names.sh \
mk/project.mk \
+ mk/install.mk.in \
bindist.mk \
libraries/dph/LICENSE \
))
diff --git a/ghc/ghc.wrapper b/ghc/ghc.wrapper
index 9b2ba0f49a..093d9af784 100644
--- a/ghc/ghc.wrapper
+++ b/ghc/ghc.wrapper
@@ -1 +1 @@
-exec $executablename -B$datadir ${1+"$@"}
+exec $executablename -B$topdir ${1+"$@"}
diff --git a/mk/config.mk.in b/mk/config.mk.in
index e6140d234b..b35b4b605d 100644
--- a/mk/config.mk.in
+++ b/mk/config.mk.in
@@ -12,9 +12,7 @@
# DO NOT EDIT THIS FILE!
#
# - config.mk is auto-generated from config.mk.in by configure.
-# This may be triggered automatically by the build system (say
-# if config.mk.in has changed more recently than config.mk),
-# so if you edit config.mk your changes will be spammed.
+# If you edit config.mk your changes will be spammed.
#
# - Settings in this file may be overriden by giving replacement
# definitions in build.mk. See build.mk.sample for a good
@@ -28,6 +26,7 @@
TOP = @hardtop@
include $(TOP)/mk/project.mk
+include $(TOP)/mk/install.mk
################################################################################
#
@@ -381,150 +380,6 @@ BIN_DIST_LIST=$(TOP)/bindist-list
WINDOWS_INSTALLER_BASE = ghc-$(ProjectVersion)-i386-windows
WINDOWS_INSTALLER = $(WINDOWS_INSTALLER_BASE)$(exeext)
-# Definition of installation directories, we don't use half of these, but since
-# the configure script has them on offer while passing through, we might as well
-# set them. Note that we have to be careful, because the GNU coding standards
-# have changed a bit over the course of time, and autoconf development reflects
-# this.
-#
-# A little bit of history regarding autoconf and GNU coding standards, use this
-# as a cheat-sheet for the stuff below:
-#
-# variable | default < 2.60 | default >= 2.60
-# ------------+--------------------+--------------------------------------
-# exec_prefix | ${prefix} | ${prefix}
-# libdir | ${exec_prefix}/lib | ${exec_prefix}/lib
-# datarootdir | NONE! | ${prefix}/share
-# datadir | ${prefix}/share | ${datarootdir}
-# infodir | ${prefix}/info | ${datarootdir}/info
-# mandir | ${prefix}/man | ${datarootdir}/man
-# docdir | NONE! | ${datarootdir}/doc/${PACKAGE_TARNAME}
-# htmldir | NONE! | ${docdir}
-# dvidir | NONE! | ${docdir}
-# pdfdir | NONE! | ${docdir}
-# psdir | NONE! | ${docdir}
-#
-# NOTE: The default e.g. ${docdir} above means that autoconf substitutes the
-# string "${docdir}", not the value of docdir! This is crucial for the GNU
-# coding standards.
-
-# This gets used in the default docdir when autoconf >= 2.60 is used
-PACKAGE_TARNAME := @PACKAGE_TARNAME@
-
-prefix := @prefix@
-
-# New autoconf (>= 2.60?) make a configure with a --datarootdir=DIR flag.
-# However, in order to support older autoconf's we don't use it.
-# datarootdir is set lower down instead.
-# But, as datadir is defined in terms of datarootdir, we also need to
-# set it to the value (if any) that configure gives it here.
-datarootdir := @datarootdir@
-
-exec_prefix := @exec_prefix@
-bindir := @bindir@
-datadir0 := @datadir@
-libdir0 := @libdir@
-includedir := @includedir@
-mandir := @mandir@
-dynlibdir := @libdir@
-
-ifeq "$(RelocatableBuild)" "YES"
-
-# Hack: our directory layouts tend to be different on Windows, so
-# hack around configure's bogus assumptions here.
-datarootdir := $(prefix)
-datadir := $(prefix)/lib
-libdir := $(prefix)/lib
-
-docdir := $(prefix)/doc
-htmldir := $(docdir)
-dvidir := $(docdir)
-pdfdir := $(docdir)
-psdir := $(docdir)
-
-else
-
-# Unix: override libdir and datadir to put ghc-specific stuff in
-# a subdirectory with the version number included.
-#
-# datadir is set to libdir here as GHC needs package.conf and unlit
-# to be in the same place (and things like ghc-pkg need to agree on
-# where package.conf is, so we just set it globally).
-#
-datarootdir := $(datadir0)
-libdir := $(libdir0)/ghc-$(ProjectVersion)
-datadir := $(libdir)
-
-# New autoconf (>= 2.60?) make a configure with --docdir=DIR etc flags.
-# However, in order to support older autoconf's we don't use them.
-
-#docdir := @docdir@
-#htmldir := @htmldir@
-#dvidir := @dvidir@
-#pdfdir := @pdfdir@
-#psdir := @psdir@
-
-docdir := $(datarootdir)/doc/ghc
-htmldir := $(docdir)
-dvidir := $(docdir)
-pdfdir := $(docdir)
-psdir := $(docdir)
-
-endif # Windows
-
-headerdir := $(libdir)/include
-
-# Default place for putting interface files is $(libdir)
-# (overriden for packages in package.mk)
-ifacedir = $(libdir)
-
-# NOTE: by intention, libexecdir and libdir point to
-# the same place.
-# => Only way to override this is to set libexecdir= on the command line.
-# (NOTE: configure script setting is ignored).
-libexecdir = $(libdir)
-
-#-----------------------------------------------------------------------------
-# install configuration
-
-#
-# Set this to have files installed with a specific owner
-#
-INSTALL_OWNER =
-
-#
-# Set this to have files installed with a specific group
-#
-INSTALL_GROUP =
-
-#
-# Invocations of `install' for the four different classes
-# of targets:
-#
-CREATE_SCRIPT = create () { touch $$1 && chmod 755 $$1 ; } && create
-CREATE_DATA = create () { touch $$1 && chmod 644 $$1 ; } && create
-INSTALL_PROGRAM = $(INSTALL) -m 755
-INSTALL_SCRIPT = $(INSTALL) -m 755
-INSTALL_SHLIB = $(INSTALL) -m 755
-INSTALL_DATA = $(INSTALL) -m 644
-INSTALL_HEADER = $(INSTALL) -m 644
-INSTALL_MAN = $(INSTALL) -m 644
-INSTALL_DOC = $(INSTALL) -m 644
-INSTALL_DIR = $(INSTALL) -m 755 -d
-
-#
-# runhaskell and hsc2hs are special, in that other compilers besides
-# GHC might provide them. Systems with a package manager often come
-# with tools to manage this kind of clash, e.g. RPM's
-# update-alternatives. When building a distribution for such a system,
-# we recommend setting both of the following to 'YES'.
-#
-# NO_INSTALL_RUNHASKELL = YES
-# NO_INSTALL_HSC2HS = YES
-#
-# NB. we use negative tests here because for binary-distributions we cannot
-# test build-time variables at install-time, so they must default to on.
-
# -----------------------------------------------------------------------------
# Utilities programs: flags
diff --git a/mk/install.mk.in b/mk/install.mk.in
new file mode 100644
index 0000000000..75c2a32c18
--- /dev/null
+++ b/mk/install.mk.in
@@ -0,0 +1,158 @@
+# -*-makefile-*-
+# @configure_input@
+#
+################################################################################
+#
+# dirs.mk.in
+#
+# This file sets up the installation directories.
+#
+# DO NOT EDIT THIS FILE!
+#
+# - dirs.mk is auto-generated from dirs.mk.in by configure.
+# If you edit dirs.mk your changes will be spammed.
+#
+# - Settings in this file may be overriden by giving replacement
+# definitions in build.mk.
+
+# Definition of installation directories, we don't use half of these, but since
+# the configure script has them on offer while passing through, we might as well
+# set them. Note that we have to be careful, because the GNU coding standards
+# have changed a bit over the course of time, and autoconf development reflects
+# this.
+#
+# A little bit of history regarding autoconf and GNU coding standards, use this
+# as a cheat-sheet for the stuff below:
+#
+# variable | default < 2.60 | default >= 2.60
+# ------------+--------------------+--------------------------------------
+# exec_prefix | ${prefix} | ${prefix}
+# libdir | ${exec_prefix}/lib | ${exec_prefix}/lib
+# datarootdir | NONE! | ${prefix}/share
+# datadir | ${prefix}/share | ${datarootdir}
+# infodir | ${prefix}/info | ${datarootdir}/info
+# mandir | ${prefix}/man | ${datarootdir}/man
+# docdir | NONE! | ${datarootdir}/doc/${PACKAGE_TARNAME}
+# htmldir | NONE! | ${docdir}
+# dvidir | NONE! | ${docdir}
+# pdfdir | NONE! | ${docdir}
+# psdir | NONE! | ${docdir}
+#
+# NOTE: The default e.g. ${docdir} above means that autoconf substitutes the
+# string "${docdir}", not the value of docdir! This is crucial for the GNU
+# coding standards.
+
+define set_default
+# $1 = variable to set
+# $2 = default value to use, if configure didn't expand it
+# If $1 starts with an @ then configure didn't set it,
+# so set it to a sensible value
+ifneq "$$(filter @%,$$($1))" ""
+$1 = $2
+endif
+endef
+
+# This gets used in the default docdir when autoconf >= 2.60 is used
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+
+prefix = @prefix@
+
+datarootdir = @datarootdir@
+$(eval $(call set_default,datarootdir,$${prefix}/share))
+
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+datadir = @datadir@
+libdir = @libdir@
+includedir = @includedir@
+mandir = @mandir@
+
+# New autoconf (>= 2.60?) make a configure with --docdir=DIR etc flags.
+# However, in order to support older autoconf's we don't use them.
+
+docdir = @docdir@
+$(eval $(call set_default,docdir,$${datarootdir}/doc/ghc))
+
+htmldir = @htmldir@
+dvidir = @dvidir@
+pdfdir = @pdfdir@
+psdir = @psdir@
+$(eval $(call set_default,htmldir,$${docdir}))
+$(eval $(call set_default,dvidir,$${docdir}))
+$(eval $(call set_default,pdfdir,$${docdir}))
+$(eval $(call set_default,psdir,$${docdir}))
+
+ifeq "$(RelocatableBuild)" "YES"
+
+# Hack: our directory layouts tend to be different on Windows, so
+# hack around configure's bogus assumptions here.
+datarootdir = $(prefix)
+datadir = $(prefix)/lib
+libdir = $(prefix)/lib
+
+docdir = $(prefix)/doc
+htmldir = $(docdir)
+dvidir = $(docdir)
+pdfdir = $(docdir)
+psdir = $(docdir)
+
+topdir = $(libdir)
+
+else
+
+# Unix: override libdir and datadir to put ghc-specific stuff in
+# a subdirectory with the version number included.
+#
+# datadir is set to libdir here as GHC needs package.conf and unlit
+# to be in the same place (and things like ghc-pkg need to agree on
+# where package.conf is, so we just set it globally).
+#
+ghclibdir = $(libdir)/ghc-$(ProjectVersion)
+ghclibexecdir = $(ghclibdir)
+topdir = $(ghclibdir)
+ghcdocdir = $(datarootdir)/doc/ghc
+endif
+
+ghcheaderdir = $(ghclibdir)/include
+
+#-----------------------------------------------------------------------------
+# install configuration
+
+#
+# Set this to have files installed with a specific owner
+#
+INSTALL_OWNER =
+
+#
+# Set this to have files installed with a specific group
+#
+INSTALL_GROUP =
+
+#
+# Invocations of `install' for the four different classes
+# of targets:
+#
+CREATE_SCRIPT = create () { touch $$1 && chmod 755 $$1 ; } && create
+CREATE_DATA = create () { touch $$1 && chmod 644 $$1 ; } && create
+INSTALL_PROGRAM = $(INSTALL) -m 755
+INSTALL_SCRIPT = $(INSTALL) -m 755
+INSTALL_SHLIB = $(INSTALL) -m 755
+INSTALL_DATA = $(INSTALL) -m 644
+INSTALL_HEADER = $(INSTALL) -m 644
+INSTALL_MAN = $(INSTALL) -m 644
+INSTALL_DOC = $(INSTALL) -m 644
+INSTALL_DIR = $(INSTALL) -m 755 -d
+
+#
+# runhaskell and hsc2hs are special, in that other compilers besides
+# GHC might provide them. Systems with a package manager often come
+# with tools to manage this kind of clash, e.g. RPM's
+# update-alternatives. When building a distribution for such a system,
+# we recommend setting both of the following to 'YES'.
+#
+# NO_INSTALL_RUNHASKELL = YES
+# NO_INSTALL_HSC2HS = YES
+#
+# NB. we use negative tests here because for binary-distributions we cannot
+# test build-time variables at install-time, so they must default to on.
+
diff --git a/mk/tree.mk b/mk/tree.mk
index d27e2a7f9c..cd3988d772 100644
--- a/mk/tree.mk
+++ b/mk/tree.mk
@@ -41,10 +41,11 @@ GHC_MANGLER_DIR = $(GHC_DRIVER_DIR)/mangler
GHC_SPLIT_DIR = $(GHC_DRIVER_DIR)/split
GHC_SYSMAN_DIR = $(GHC_RTS_DIR)/parallel
-INPLACE = inplace
-INPLACE_BIN = $(INPLACE)/bin
-INPLACE_LIB = $(INPLACE)/lib
-INPLACE_MINGW = $(INPLACE)/mingw
+INPLACE = inplace
+INPLACE_BIN = $(INPLACE)/bin
+INPLACE_LIB = $(INPLACE)/lib
+INPLACE_TOPDIR = $(INPLACE)/lib
+INPLACE_MINGW = $(INPLACE)/mingw
# These are here, rather than in config.mk, as they need to exist in an
# unconfigured tree so that the various clean targets can be used
diff --git a/rts/ghc.mk b/rts/ghc.mk
index e0ff69021c..69b03d176e 100644
--- a/rts/ghc.mk
+++ b/rts/ghc.mk
@@ -372,9 +372,9 @@ install : install_rts
.PHONY: install_rts
install_rts:
- $(INSTALL_DIR) $(DESTDIR)$(libdir)
- $(INSTALL_DIR) $(DESTDIR)$(libdir)/include
- "$(CP)" $(ALL_RTS_LIBS) $(DESTDIR)$(libdir)
+ $(INSTALL_DIR) $(DESTDIR)$(ghclibdir)
+ $(INSTALL_DIR) $(DESTDIR)$(ghclibdir)/include
+ "$(CP)" $(ALL_RTS_LIBS) $(DESTDIR)$(ghclibdir)
# -----------------------------------------------------------------------------
# cleaning
diff --git a/rules/build-perl.mk b/rules/build-perl.mk
index 982a2b699d..86f729fbb1 100644
--- a/rules/build-perl.mk
+++ b/rules/build-perl.mk
@@ -22,8 +22,8 @@ define build-perl
# $1 = dir
# $2 = distdir
-ifeq "$$($1_$2_LIBEXEC)" "YES"
-$1_$2_INPLACE = $(INPLACE_LIB)/$$($1_$2_PROG)
+ifeq "$$($1_$2_TOPDIR)" "YES"
+$1_$2_INPLACE = $(INPLACE_TOPDIR)/$$($1_$2_PROG)
else
$1_$2_INPLACE = $(INPLACE_BIN)/$$($1_$2_PROG)
endif
diff --git a/rules/build-prog.mk b/rules/build-prog.mk
index 6910e8f6e8..3631a90bf1 100644
--- a/rules/build-prog.mk
+++ b/rules/build-prog.mk
@@ -126,8 +126,8 @@ else
ifeq "$$($1_$2_SHELL_WRAPPER) $$(Windows)" "YES NO"
$1_$2_INPLACE = $$(INPLACE_LIB)/$$($1_$2_PROG)
else
-ifeq "$$($1_$2_LIBEXEC)" "YES"
-$1_$2_INPLACE = $$(INPLACE_LIB)/$$($1_$2_PROG)
+ifeq "$$($1_$2_TOPDIR)" "YES"
+$1_$2_INPLACE = $$(INPLACE_TOPDIR)/$$($1_$2_PROG)
else
$1_$2_INPLACE = $$(INPLACE_BIN)/$$($1_$2_PROG)
endif
@@ -150,8 +150,8 @@ endif
$(call shell-wrapper,$1,$2)
ifeq "$$($1_$2_INSTALL)" "YES"
-ifeq "$$($1_$2_LIBEXEC)" "YES"
-INSTALL_LIBEXECS += $1/$2/build/tmp/$$($1_$2_PROG)
+ifeq "$$($1_$2_TOPDIR)" "YES"
+INSTALL_TOPDIRS += $1/$2/build/tmp/$$($1_$2_PROG)
else
INSTALL_BINS += $1/$2/build/tmp/$$($1_$2_PROG)
endif
diff --git a/rules/manual-package-config.mk b/rules/manual-package-config.mk
index da5cacffaf..5a24141d99 100644
--- a/rules/manual-package-config.mk
+++ b/rules/manual-package-config.mk
@@ -29,8 +29,8 @@ $1/package.conf.inplace : $1/package.conf.in $(GHC_PKG_INPLACE)
$1/package.conf.install:
$$(CPP) $$(RAWCPP_FLAGS) -P \
-DINSTALLING \
- -DLIB_DIR='"$$(libdir)"' \
- -DINCLUDE_DIR='"$$(libdir)/include"' \
+ -DLIB_DIR='"$$(ghclibdir)"' \
+ -DINCLUDE_DIR='"$$(ghclibdir)/include"' \
$$($1_PACKAGE_CPP_OPTS) \
-x c -I$$(GHC_INCLUDE_DIR) $1/package.conf.in | \
grep -v '^#pragma GCC' | \
diff --git a/rules/shell-wrapper.mk b/rules/shell-wrapper.mk
index 312504e278..9535a7d720 100644
--- a/rules/shell-wrapper.mk
+++ b/rules/shell-wrapper.mk
@@ -38,6 +38,7 @@ $$(INPLACE_BIN)/$$($1_$2_PROG): $$($1_$2_INPLACE)
echo 'executablename=$$(TOP)/$$<' >> $$@
echo 'datadir=$$(TOP)/$$(INPLACE_LIB)' >> $$@
echo 'bindir=$$(TOP)/$$(INPLACE_BIN)' >> $$@
+ echo 'topdir=$$(TOP)/$$(INPLACE_TOPDIR)' >> $$@
cat $$($1_$2_SHELL_WRAPPER_NAME) >> $$@
$$(EXECUTABLE_FILE) $$@
endif
@@ -58,14 +59,15 @@ install: install_$1_$2_wrapper
install_$1_$2_wrapper: WRAPPER=$$(DESTDIR)$$(bindir)/$$($1_$2_INSTALL_SHELL_WRAPPER_NAME)
install_$1_$2_wrapper:
$$(INSTALL_DIR) $$(DESTDIR)$$(bindir)
- "$$(RM)" $$(RM_OPTS) $$(WRAPPER)
- $$(CREATE_SCRIPT) $$(WRAPPER)
- echo '#!$$(SHELL)' >> $$(WRAPPER)
- echo 'executablename=$$(libexecdir)/$$($1_$2_PROG)' >> $$(WRAPPER)
- echo 'datadir=$$(datadir)' >> $$(WRAPPER)
- echo 'bindir=$$(bindir)' >> $$(WRAPPER)
- cat $$($1_$2_SHELL_WRAPPER_NAME) >> $$(WRAPPER)
- $$(EXECUTABLE_FILE) $$(WRAPPER)
+ "$$(RM)" $$(RM_OPTS) $$(WRAPPER)
+ $$(CREATE_SCRIPT) $$(WRAPPER)
+ echo '#!$$(SHELL)' >> $$(WRAPPER)
+ echo 'executablename=$$(ghclibexecdir)/$$($1_$2_PROG)' >> $$(WRAPPER)
+ echo 'datadir=$$(datadir)' >> $$(WRAPPER)
+ echo 'bindir=$$(bindir)' >> $$(WRAPPER)
+ echo 'topdir=$$(topdir)' >> $$(WRAPPER)
+ cat $$($1_$2_SHELL_WRAPPER_NAME) >> $$(WRAPPER)
+ $$(EXECUTABLE_FILE) $$(WRAPPER)
endif # $1_$2_INSTALL_SHELL_WRAPPER
diff --git a/utils/ghc-pkg/ghc-pkg.wrapper b/utils/ghc-pkg/ghc-pkg.wrapper
index 27b8ceddf8..6d3c2af70e 100644
--- a/utils/ghc-pkg/ghc-pkg.wrapper
+++ b/utils/ghc-pkg/ghc-pkg.wrapper
@@ -1,5 +1,5 @@
#!/bin/sh
-PKGCONF=$datadir/package.conf
+PKGCONF=$topdir/package.conf
exec $executablename --global-conf $PKGCONF ${1+"$@"}
diff --git a/utils/touchy/ghc.mk b/utils/touchy/ghc.mk
index 3e5bb84cbc..fc9c845c8d 100644
--- a/utils/touchy/ghc.mk
+++ b/utils/touchy/ghc.mk
@@ -12,6 +12,6 @@
utils/touchy_dist_C_SRCS = touchy.c
utils/touchy_dist_PROG = $(GHC_TOUCHY_PGM)
-utils/touchy_dist_LIBEXEC = YES
+utils/touchy_dist_TOPDIR = YES
utils/touchy_dist_INSTALL = YES
$(eval $(call build-prog,utils/touchy,dist,0))
diff --git a/utils/unlit/ghc.mk b/utils/unlit/ghc.mk
index 709291e241..f46c3b32ad 100644
--- a/utils/unlit/ghc.mk
+++ b/utils/unlit/ghc.mk
@@ -12,7 +12,7 @@
utils/unlit_dist_C_SRCS = unlit.c
utils/unlit_dist_PROG = $(GHC_UNLIT_PGM)
-utils/unlit_dist_LIBEXEC = YES
+utils/unlit_dist_TOPDIR = YES
utils/unlit_dist_INSTALL = YES
$(eval $(call build-prog,utils/unlit,dist,0))