From 2d80dfa52b14cbc226d94e7d4ad487c146620e05 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Fri, 1 Jun 2007 21:05:55 +0000 Subject: [PATCH] Add omitted files (mk/{install,recurse}.mk) --- mk/install.mk | 311 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mk/recurse.mk | 101 +++++++++++++++++++ 2 files changed, 412 insertions(+) create mode 100644 mk/install.mk create mode 100644 mk/recurse.mk diff --git a/mk/install.mk b/mk/install.mk new file mode 100644 index 0000000..61de7a5 --- /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 +# - with a link from 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 0000000..906b1f0 --- /dev/null +++ b/mk/recurse.mk @@ -0,0 +1,101 @@ + +################################################################## +# +# Recursive stuff +# +################################################################## + +# Here are the diabolically clever rules that +# +# (a) for each "recursive target" +# propagates "make " to directories in SUBDIRS +# +# (b) when SUBDIRS is empty, +# for each "multi-way-target" +# calls "make way=w " 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 + -- 1.7.10.4