Commit 2d80dfa5 authored by Ian Lynagh's avatar Ian Lynagh
Browse files

Add omitted files (mk/{install,recurse}.mk)

parent 79b5a2cb
#
# 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
##################################################################
#
# 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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment