Add omitted files (mk/{install,recurse}.mk)
[ghc-hetmet.git] / mk / install.mk
diff --git a/mk/install.mk b/mk/install.mk
new file mode 100644 (file)
index 0000000..61de7a5
--- /dev/null
@@ -0,0 +1,311 @@
+#
+#      install* installcheck installdirs
+#       install-docs*
+#
+#    Some of the above targets have a version that
+#    recursively invokes that target in sub-directories.
+#    This relies on the importing Makefile setting SUBDIRS
+#
+#    The recursive targets are marked with a * above
+#
+
+##################################################################
+#              GNU Standard targets
+#
+#      Every Makefile should define the following targets
+# 
+# `install'
+#      Compile the program and copy the executables, libraries, and so on
+#      to the file names where they should reside for actual use. If
+#      there is a simple test to verify that a program is properly
+#      installed, this target should run that test.
+# 
+#      The commands should create all the directories in which files are
+#      to be installed, if they don't already exist. This includes the
+#      directories specified as the values of the variables prefix and
+#      exec_prefix , as well as all subdirectories that are needed. One
+#      way to do this is by means of an installdirs target as described
+#      below.
+# 
+#      Use `-' before any command for installing a man page, so that make
+#      will ignore any errors.  This is in case there are systems that
+#      don't have the Unix man page documentation system installed.
+# 
+# The following targets are suggested as conventional names, for programs
+# in which they are useful.
+# 
+# installcheck
+#      Perform installation tests (if any). The user must build and
+#      install the program before running the tests. You should not
+#      assume that `$(bindir)' is in the search path.
+# 
+# installdirs
+#      It's useful to add a target named `installdirs' to create the
+#      directories where files are installed, and their parent
+#      directories. There is a script called `mkinstalldirs' which is
+#      convenient for this; find it in the Texinfo package.
+#      (GHC: we use a close relative of the suggested script, situated
+#       in glafp-utils/mkdirhier -- SOF)
+
+
+
+# ---------------------------------------------------------------------------
+# Symbolic links
+
+# links to programs: we sometimes install a program as
+# <name>-<version> with a link from <name> to the real program.
+
+ifneq "$(LINK)" ""
+
+ifeq "$(LINK_TARGET)" ""
+ifneq "$(HS_PROG)" ""
+LINK_TARGET = $(HS_PROG)
+else
+ifneq "$(C_PROG)" ""
+LINK_TARGET = $(C_PROG)
+else
+$(error Cannot deduce LINK_TARGET)
+endif
+endif
+endif
+
+#
+# install links to script drivers.
+#
+install ::
+       @$(INSTALL_DIR) $(bindir)
+       @if ( $(PERL) -e '$$fn="$(bindir)/$(LINK)"; exit ((! -f $$fn || -l $$fn) ? 0 : 1);' ); then \
+          echo "Creating a symbolic link from $(LINK_TARGET) to $(LINK) in $(bindir)"; \
+          $(RM) $(bindir)/$(LINK); \
+          $(LN_S) $(LINK_TARGET) $(bindir)/$(LINK); \
+        else \
+          echo "Creating a symbolic link from $(LINK_TARGET) to $(LINK) in $(bindir) failed: \`$(bindir)/$(LINK)' already exists"; \
+          echo "Perhaps remove \`$(bindir)/$(LINK)' manually?"; \
+          exit 1; \
+        fi;
+
+endif # LINK 
+
+
+###########################################
+#
+#      Targets: install install-strip
+#
+###########################################
+
+# For each of these variables that is defined, you
+# get one install rule
+#
+#      INSTALL_PROGS        executable programs in $(bindir)
+#      INSTALL_SCRIPTS      executable scripts in $(bindir)
+#      INSTALL_LIBS         platform-dependent libraries in $(libdir) (ranlib'ed)
+#      INSTALL_LIB_SCRIPTS  platform-dependent scripts   in $(libdir)
+#      INSTALL_LIBEXECS     platform-dependent execs in $(libdir)
+#      INSTALL_DATAS        platform-independent files in $(datadir)
+#      INSTALL_IFACES       platform-dependent interface files in $(ifacedir)
+#
+# If the installation directory variable is undefined, the install rule simply
+# emits a suitable error message.
+#
+# Remember, too, that the installation directory variables ($(bindir) and
+# friends can be overridden from their original settings in mk/config.mk.in
+# || mk/build.mk
+#
+.PHONY: install install-docs installdirs install-strip install-dirs install-docs show-install
+
+show-install :
+       @echo "bindir = $(bindir)"
+       @echo "libdir = $(libdir)"
+       @echo "libexecdir = $(libexecdir)  # by default, same as libdir"
+       @echo "datadir = $(datadir)  # unused for ghc project"
+
+#
+# Sometimes useful to separate out the creation of install directories 
+# from the installation itself.
+#
+install-dirs ::
+       @$(INSTALL_DIR) $(bindir)
+       @$(INSTALL_DIR) $(libdir)
+       @$(INSTALL_DIR) $(libexecdir)
+       @$(INSTALL_DIR) $(datadir)
+
+# Better do this first...
+# but we won't for the moment, do it on-demand from
+# within the various install targets instead.
+#install:: install-dirs
+
+#
+# Setting user/group ownership for the installed entities
+#
+ifneq "$(INSTALL_OWNER)" ""
+SRC_INSTALL_OPTS += -o $(INSTALL_OWNER)
+endif
+ifneq "$(INSTALL_GROUP)" ""
+SRC_INSTALL_OPTS += -g $(INSTALL_GROUP)
+endif
+
+
+ifneq "$(strip $(INSTALL_PROGS))" ""
+
+#
+# Here's an interesting one - when using the win32 version
+# of install (provided via the cygwin toolkit), we have to
+# supply the .exe suffix, *if* there's no other suffix.
+#
+# The rule below does this by ferreting out the suffix of each
+# entry in the INSTALL_PROGS list. If there's no suffix, use
+# $(exeext).
+# 
+INSTALL_PROGS := $(foreach p, $(INSTALL_PROGS), $(addsuffix $(if $(suffix $(p)),,$(exeext)), $(basename $(p))))
+
+install:: $(INSTALL_PROGS)
+       @$(INSTALL_DIR) $(bindir)
+       @for i in $(INSTALL_PROGS); do \
+                   echo $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir); \
+                   $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir) ;  \
+                    if test "$(darwin_TARGET_OS)" = "1"; then \
+                      sh $(FPTOOLS_TOP)/mk/fix_install_names.sh $(libdir) $(bindir)/$$i ; \
+                    fi ; \
+       done
+endif
+
+#
+# Just like INSTALL_PROGS, but prefix with install sites bin/lib/data and
+# install without stripping.
+#
+ifneq "$(strip $(INSTALL_SCRIPTS))" ""
+install:: $(INSTALL_SCRIPTS)
+       @$(INSTALL_DIR) $(bindir)
+       for i in $(INSTALL_SCRIPTS); do \
+               $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(bindir); \
+       done
+endif
+
+ifneq "$(strip $(INSTALL_LIB_SCRIPTS))" ""
+install:: $(INSTALL_LIB_SCRIPTS)
+       @$(INSTALL_DIR) $(libdir)
+       for i in $(INSTALL_LIB_SCRIPTS); do \
+               $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(libdir); \
+       done
+endif
+
+ifneq "$(strip $(INSTALL_LIBEXEC_SCRIPTS))" ""
+install:: $(INSTALL_LIBEXEC_SCRIPTS)
+       @$(INSTALL_DIR) $(libexecdir)
+       for i in $(INSTALL_LIBEXEC_SCRIPTS); do \
+               $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(libexecdir); \
+       done
+endif
+
+ifneq "$(strip $(INSTALL_LIBS))" ""
+install:: $(INSTALL_LIBS)
+       @$(INSTALL_DIR) $(libdir)
+       for i in $(INSTALL_LIBS); do \
+               case $$i in \
+                 *.a) \
+                   $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(libdir); \
+                   $(RANLIB) $(libdir)/`basename $$i` ;; \
+                 *.dll) \
+                   $(INSTALL_DATA) -s $(INSTALL_OPTS) $$i $(libdir) ;; \
+                 *.so) \
+                   $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(libdir) ;; \
+                 *.dylib) \
+                   $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(libdir); \
+                   install_name_tool -id $(libdir)/`basename $$i` $(libdir)/`basename $$i` ;; \
+                 *) \
+                   $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(libdir); \
+               esac; \
+       done
+endif
+
+ifneq "$(strip $(INSTALL_LIBEXECS))" ""
+#
+# See above comment next to defn of INSTALL_PROGS for what
+# the purpose of this one-liner is.
+# 
+INSTALL_LIBEXECS := $(foreach p, $(INSTALL_LIBEXECS), $(addsuffix $(subst _,,$(subst __,$(exeext),_$(suffix $(p))_)), $(basename $(p))))
+
+install:: $(INSTALL_LIBEXECS)
+       @$(INSTALL_DIR) $(libexecdir)
+       -for i in $(INSTALL_LIBEXECS); do \
+               $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(libexecdir); \
+                if test "$(darwin_TARGET_OS)" = "1"; then \
+                        sh $(FPTOOLS_TOP)/mk/fix_install_names.sh $(libdir) $(libexecdir)/`basename $$i` ; \
+                fi ; \
+       done
+endif
+
+ifneq "$(strip $(INSTALL_DATAS))" ""
+install:: $(INSTALL_DATAS)
+       @$(INSTALL_DIR) $(datadir)
+       for i in $(INSTALL_DATAS); do \
+               $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(datadir); \
+       done
+endif
+
+ifneq "$(strip $(INSTALL_IFACES))" ""
+install:: $(INSTALL_IFACES)
+       @$(INSTALL_DIR) $(ifacedir)
+       for i in $(INSTALL_IFACES); do \
+               $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(ifacedir); \
+       done
+endif
+
+ifneq "$(strip $(INSTALL_IFACES_WITH_DIRS))" ""
+install:: $(INSTALL_IFACES_WITH_DIRS)
+       @$(INSTALL_DIR) $(ifacedir)
+       for i in $(INSTALL_IFACES_WITH_DIRS); do \
+               $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(ifacedir)/`dirname $$i`; \
+       done
+endif
+
+ifneq "$(strip $(INSTALL_INCLUDES))" ""
+install:: $(INSTALL_INCLUDES)
+       @$(INSTALL_DIR) $(includedir)
+       for i in $(INSTALL_INCLUDES); do \
+               $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(includedir); \
+       done
+endif
+
+ifneq "$(strip $(INSTALL_DOCS))" ""
+ifneq "$(XMLDocWays)" ""
+install-docs:: $(INSTALL_DOCS)
+       @$(INSTALL_DIR) $(datadir)      
+       for i in $(INSTALL_DOCS); do \
+               $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(datadir); \
+       done
+endif
+endif
+
+# TODO: The following could be an entry for an Obfuscated Makefile Contest...
+ifneq "$(strip $(INSTALL_XML_DOC))" ""
+ifneq "$(XMLDocWays)" ""
+install-docs:: $(foreach i,$(XMLDocWays),$(INSTALL_XML_DOC)$(patsubst %.html-no-chunks,%.html,$(patsubst %.html,%/index.html,.$(i))))
+       @$(INSTALL_DIR) $(datadir)      
+       @for i in $(XMLDocWays); do \
+               if [ $$i = "html" ]; then \
+                       $(INSTALL_DIR) $(datadir)/html; \
+                       $(INSTALL_DIR) $(datadir)/html/$(INSTALL_XML_DOC); \
+                       echo "( cd $(INSTALL_XML_DOC) && $(CP) * $(datadir)/html/$(INSTALL_XML_DOC) )" ; \
+                       ( cd $(INSTALL_XML_DOC) && $(CP) * $(datadir)/html/$(INSTALL_XML_DOC) ) ; \
+               else \
+                       $(INSTALL_DIR) $(datadir)/doc; \
+                       echo $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_XML_DOC)`echo .$$i | sed s/\.html-no-chunks/.html/` $(datadir)/doc; \
+                       $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_XML_DOC)`echo .$$i | sed s/\.html-no-chunks/.html/` $(datadir)/doc; \
+               fi; \
+               if [ $$i = "html-no-chunks" ]; then \
+                       echo $(CP) $(FPTOOLS_CSS_ABS) $(datadir)/doc; \
+                       $(CP) $(FPTOOLS_CSS_ABS) $(datadir)/doc; \
+               fi \
+       done
+endif
+endif
+
+#
+# install-strip is from the GNU Makefile standard.
+#
+ifneq "$(way)" ""
+install-strip::
+       @$(MAKE) EXTRA_INSTALL_OPTS='-s' install                                        
+endif
+