From 926ae90b75cd3368049854898062a563e57c9ad2 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Fri, 14 Aug 2009 22:45:49 +0000 Subject: [PATCH] Make our install variables etc compliant with GNU standards; fixes #1924 --- configure.ac | 2 +- distrib/Makefile-bin-vars.in | 53 -------------- distrib/configure-bin.ac | 2 +- ghc.mk | 52 +++++++------ ghc/ghc.wrapper | 2 +- mk/config.mk.in | 149 +------------------------------------ mk/install.mk.in | 158 ++++++++++++++++++++++++++++++++++++++++ mk/tree.mk | 9 ++- rts/ghc.mk | 6 +- rules/build-perl.mk | 4 +- rules/build-prog.mk | 8 +- rules/manual-package-config.mk | 4 +- rules/shell-wrapper.mk | 18 +++-- utils/ghc-pkg/ghc-pkg.wrapper | 2 +- utils/touchy/ghc.mk | 2 +- utils/unlit/ghc.mk | 2 +- 16 files changed, 222 insertions(+), 251 deletions(-) create mode 100644 mk/install.mk.in diff --git a/configure.ac b/configure.ac index dcea6e1..44db95e 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 d213498..0899369 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 783c1f1..49f995c 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 b33a6b9..56af0ee 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 9b2ba0f..093d9af 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 e6140d2..b35b4b6 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 0000000..75c2a32 --- /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 d27e2a7..cd3988d 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 e0ff690..69b03d1 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 982a2b6..86f729f 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 6910e8f..3631a90 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 da5cacf..5a24141 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 312504e..9535a7d 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 27b8ced..6d3c2af 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 3e5bb84..fc9c845 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 709291e..f46c3b3 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)) -- 1.7.10.4