summaryrefslogtreecommitdiff
path: root/mk
diff options
context:
space:
mode:
authorIan Lynagh <igloo@earth.li>2007-06-01 21:05:55 +0000
committerIan Lynagh <igloo@earth.li>2007-06-01 21:05:55 +0000
commit2d80dfa52b14cbc226d94e7d4ad487c146620e05 (patch)
tree944fbff680ee8331fccf02bb20433dec8d0f7591 /mk
parent79b5a2cb4b9ed5fe41a05fa2ec98bd1f83971daf (diff)
downloadhaskell-2d80dfa52b14cbc226d94e7d4ad487c146620e05.tar.gz
Add omitted files (mk/{install,recurse}.mk)
Diffstat (limited to 'mk')
-rw-r--r--mk/install.mk311
-rw-r--r--mk/recurse.mk101
2 files changed, 412 insertions, 0 deletions
diff --git a/mk/install.mk b/mk/install.mk
new file mode 100644
index 0000000000..61de7a5663
--- /dev/null
+++ b/mk/install.mk
@@ -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
+
diff --git a/mk/recurse.mk b/mk/recurse.mk
new file mode 100644
index 0000000000..906b1f04b4
--- /dev/null
+++ b/mk/recurse.mk
@@ -0,0 +1,101 @@
+
+##################################################################
+#
+# Recursive stuff
+#
+##################################################################
+
+# Here are the diabolically clever rules that
+#
+# (a) for each "recursive target" <t>
+# propagates "make <t>" to directories in SUBDIRS
+#
+# (b) when SUBDIRS is empty,
+# for each "multi-way-target" <t>
+# calls "make way=w <t>" for each w in $(WAYS)
+#
+# This has the effect of making the standard target
+# in each of the specified ways (as well as in the normal way
+
+# Controlling variables
+# WAYS = extra (beyond the normal way) ways to build things in
+# SUBDIRS = subdirectories to recurse into
+
+# No ways, so iterate over the SUBDIRS
+
+# note about recursively invoking make: we'd like make to drop all the
+# way back to the top level if it fails in any of the
+# sub(sub-...)directories. This is done by setting the -e flag to the
+# shell during the loop, which causes an immediate failure if any of
+# the shell commands fail.
+
+# One exception: if the user gave the -i or -k flag to make in the
+# first place, we'd like to reverse this behaviour. So we check for
+# these flags, and set the -e flag appropriately. NOTE: watch out for
+# the --no-print-directory flag which is passed to recursive
+# invocations of make.
+#
+ifeq "$(way)" ""
+ifneq "$(SUBDIRS)" ""
+
+# we override the 'boot', 'all' and 'install' targets in the top
+# level Makefile. Some of the sub-projects also set 'boot' to empty.
+
+ifeq "$(NO_ALL_TARGET)" "YES"
+ALL_TARGET =
+else
+ALL_TARGET = all
+endif
+
+ifeq "$(NO_BOOT_TARGET)" "YES"
+BOOT_TARGET =
+else
+BOOT_TARGET = boot
+endif
+
+ifeq "$(NO_INSTALL_TARGET)" "YES"
+INSTALL_TARGET =
+INSTALL_DOCS_TARGET =
+else
+INSTALL_TARGET = install
+INSTALL_DOCS_TARGET = install-docs
+endif
+
+$(ALL_TARGET) docs runtests $(BOOT_TARGET) TAGS clean distclean mostlyclean maintainer-clean $(INSTALL_TARGET) $(INSTALL_DOCS_TARGET) html chm HxS ps dvi txt::
+ @echo "------------------------------------------------------------------------"
+ @echo "== Recursively making \`$@' in $(SUBDIRS) ..."
+ @echo "PWD = $(shell pwd)"
+ @echo "------------------------------------------------------------------------"
+# Don't rely on -e working, instead we check exit return codes from sub-makes.
+ @case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
+ if [ $$x_on_err -eq 0 ]; \
+ then echo "Won't exit on error due to MFLAGS: ${MFLAGS}"; \
+ fi; \
+ for i in $(SUBDIRS); do \
+ echo "------------------------------------------------------------------------"; \
+ echo "== $(MAKE) $@ $(MFLAGS);"; \
+ echo " in $(shell pwd)/$$i"; \
+ echo "------------------------------------------------------------------------"; \
+ $(MAKE) --no-print-directory -C $$i $(MFLAGS) $@; \
+ if [ $$? -eq 0 -o $$x_on_err -eq 0 ]; \
+ then echo "Finished making $@ in $$i": $$?; \
+ else echo "Failed making $@ in $$i": $$?; exit 1; \
+ fi; \
+ done
+ @echo "------------------------------------------------------------------------"
+ @echo "== Finished making \`$@' in $(SUBDIRS) ..."
+ @echo "PWD = $(shell pwd)"
+ @echo "------------------------------------------------------------------------"
+
+endif
+endif
+
+#
+# Selectively building subdirectories.
+#
+#
+ifneq "$(SUBDIRS)" ""
+$(SUBDIRS) ::
+ $(MAKE) -C $@ $(MFLAGS)
+endif
+