summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/Makefile.am33
-rw-r--r--doc/Makefile.in665
-rw-r--r--doc/autoconf.info25690
-rw-r--r--doc/autoconf.texi26667
-rw-r--r--doc/fdl.texi505
-rw-r--r--doc/gendocs_template89
-rw-r--r--doc/gnu-oids.texi55
-rw-r--r--doc/install.texi437
-rw-r--r--doc/make-stds.texi1159
-rw-r--r--doc/stamp-vti4
-rw-r--r--doc/standards.info5780
-rw-r--r--doc/standards.texi4256
-rw-r--r--doc/version.texi4
13 files changed, 65344 insertions, 0 deletions
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000..a3075ff
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,33 @@
+# Make Autoconf documentation.
+
+# Copyright (C) 2000-2003, 2007-2012 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+AM_MAKEINFOFLAGS = --no-split
+TEXI2HTML_FLAGS = -split_chapter
+TEXINFO_TEX = ../build-aux/texinfo.tex
+
+info_TEXINFOS = autoconf.texi standards.texi
+autoconf_TEXINFOS = fdl.texi install.texi
+standards_TEXINFOS = fdl.texi gnu-oids.texi make-stds.texi
+
+EXTRA_DIST = gendocs_template
+
+# Files from texi2dvi that should be removed, but which Automake does
+# not know.
+CLEANFILES = autoconf.ACs autoconf.cvs autoconf.MSs autoconf.prs \
+ autoconf.ATs autoconf.evs autoconf.fns autoconf.ovs \
+ autoconf.ca autoconf.CA autoconf.cas autoconf.CAs \
+ autoconf.tmp
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 0000000..647c92c
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,665 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Make Autoconf documentation.
+
+# Copyright (C) 2000-2003, 2007-2012 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = doc
+DIST_COMMON = $(autoconf_TEXINFOS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/stamp-vti \
+ $(srcdir)/version.texi $(standards_TEXINFOS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
+ $(top_srcdir)/m4/m4.m4 $(top_srcdir)/m4/make-case.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+SOURCES =
+DIST_SOURCES =
+INFO_DEPS = $(srcdir)/autoconf.info $(srcdir)/standards.info
+am__TEXINFO_TEX_DIR = $(srcdir)/../build-aux
+DVIS = autoconf.dvi standards.dvi
+PDFS = autoconf.pdf standards.pdf
+PSS = autoconf.ps standards.ps
+HTMLS = autoconf.html standards.html
+TEXINFOS = autoconf.texi standards.texi
+TEXI2DVI = texi2dvi
+TEXI2PDF = $(TEXI2DVI) --pdf --batch
+MAKEINFOHTML = $(MAKEINFO) --html
+AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
+DVIPS = dvips
+am__installdirs = "$(DESTDIR)$(infodir)"
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EMACS = @EMACS@
+EMACSLOADPATH = @EMACSLOADPATH@
+EXPR = @EXPR@
+GREP = @GREP@
+HELP2MAN = @HELP2MAN@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+M4_DEBUGFILE = @M4_DEBUGFILE@
+M4_GNU = @M4_GNU@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PERL_FLOCK = @PERL_FLOCK@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEST_EMACS = @TEST_EMACS@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_cv_dir_trailing_space = @ac_cv_dir_trailing_space@
+ac_cv_sh_n_works = @ac_cv_sh_n_works@
+ac_cv_unsupported_fs_chars = @ac_cv_unsupported_fs_chars@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+lispdir = @lispdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AM_MAKEINFOFLAGS = --no-split
+TEXI2HTML_FLAGS = -split_chapter
+TEXINFO_TEX = ../build-aux/texinfo.tex
+info_TEXINFOS = autoconf.texi standards.texi
+autoconf_TEXINFOS = fdl.texi install.texi
+standards_TEXINFOS = fdl.texi gnu-oids.texi make-stds.texi
+EXTRA_DIST = gendocs_template
+
+# Files from texi2dvi that should be removed, but which Automake does
+# not know.
+CLEANFILES = autoconf.ACs autoconf.cvs autoconf.MSs autoconf.prs \
+ autoconf.ATs autoconf.evs autoconf.fns autoconf.ovs \
+ autoconf.ca autoconf.CA autoconf.cas autoconf.CAs \
+ autoconf.tmp
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .dvi .html .info .pdf .ps .texi
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+.texi.info:
+ restore=: && backupdir="$(am__leading_dot)am$$$$" && \
+ am__cwd=`pwd` && $(am__cd) $(srcdir) && \
+ rm -rf $$backupdir && mkdir $$backupdir && \
+ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
+ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
+ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
+ done; \
+ else :; fi && \
+ cd "$$am__cwd"; \
+ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $@ $<; \
+ then \
+ rc=0; \
+ $(am__cd) $(srcdir); \
+ else \
+ rc=$$?; \
+ $(am__cd) $(srcdir) && \
+ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+ fi; \
+ rm -rf $$backupdir; exit $$rc
+
+.texi.dvi:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2DVI) $<
+
+.texi.pdf:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2PDF) $<
+
+.texi.html:
+ rm -rf $(@:.html=.htp)
+ if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $(@:.html=.htp) $<; \
+ then \
+ rm -rf $@; \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
+ else \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
+ exit 1; \
+ fi
+$(srcdir)/autoconf.info: autoconf.texi $(srcdir)/version.texi $(autoconf_TEXINFOS)
+autoconf.dvi: autoconf.texi $(srcdir)/version.texi $(autoconf_TEXINFOS)
+autoconf.pdf: autoconf.texi $(srcdir)/version.texi $(autoconf_TEXINFOS)
+autoconf.html: autoconf.texi $(srcdir)/version.texi $(autoconf_TEXINFOS)
+$(srcdir)/version.texi: $(srcdir)/stamp-vti
+$(srcdir)/stamp-vti: autoconf.texi $(top_srcdir)/configure
+ @(dir=.; test -f ./autoconf.texi || dir=$(srcdir); \
+ set `$(SHELL) $(top_srcdir)/build-aux/mdate-sh $$dir/autoconf.texi`; \
+ echo "@set UPDATED $$1 $$2 $$3"; \
+ echo "@set UPDATED-MONTH $$2 $$3"; \
+ echo "@set EDITION $(VERSION)"; \
+ echo "@set VERSION $(VERSION)") > vti.tmp
+ @cmp -s vti.tmp $(srcdir)/version.texi \
+ || (echo "Updating $(srcdir)/version.texi"; \
+ cp vti.tmp $(srcdir)/version.texi)
+ -@rm -f vti.tmp
+ @cp $(srcdir)/version.texi $@
+
+mostlyclean-vti:
+ -rm -f vti.tmp
+
+maintainer-clean-vti:
+ -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi
+$(srcdir)/standards.info: standards.texi $(standards_TEXINFOS)
+standards.dvi: standards.texi $(standards_TEXINFOS)
+standards.pdf: standards.texi $(standards_TEXINFOS)
+standards.html: standards.texi $(standards_TEXINFOS)
+.dvi.ps:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ $(DVIPS) -o $@ $<
+
+uninstall-dvi-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(DVIS)'; test -n "$(dvidir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \
+ rm -f "$(DESTDIR)$(dvidir)/$$f"; \
+ done
+
+uninstall-html-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \
+ rm -rf "$(DESTDIR)$(htmldir)/$$f"; \
+ done
+
+uninstall-info-am:
+ @$(PRE_UNINSTALL)
+ @if test -d '$(DESTDIR)$(infodir)' && \
+ (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
+ if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
+ then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \
+ done; \
+ else :; fi
+ @$(NORMAL_UNINSTALL)
+ @list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
+ (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \
+ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
+ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
+ else :; fi); \
+ done
+
+uninstall-pdf-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \
+ done
+
+uninstall-ps-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(PSS)'; test -n "$(psdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(psdir)/$$f"; \
+ done
+
+dist-info: $(INFO_DEPS)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; \
+ for base in $$list; do \
+ case $$base in \
+ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
+ esac; \
+ if test -f $$base; then d=.; else d=$(srcdir); fi; \
+ base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \
+ for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \
+ if test -f $$file; then \
+ relfile=`expr "$$file" : "$$d/\(.*\)"`; \
+ test -f "$(distdir)/$$relfile" || \
+ cp -p $$file "$(distdir)/$$relfile"; \
+ else :; fi; \
+ done; \
+ done
+
+mostlyclean-aminfo:
+ -rm -rf autoconf.AC autoconf.ACs autoconf.AT autoconf.ATs autoconf.CA \
+ autoconf.CAs autoconf.MS autoconf.MSs autoconf.aux \
+ autoconf.cp autoconf.cps autoconf.cv autoconf.cvs \
+ autoconf.ev autoconf.evs autoconf.fn autoconf.fns \
+ autoconf.ky autoconf.kys autoconf.log autoconf.ov \
+ autoconf.ovs autoconf.pg autoconf.pgs autoconf.pr \
+ autoconf.prs autoconf.tmp autoconf.toc autoconf.tp \
+ autoconf.tps autoconf.vr standards.aux standards.cp \
+ standards.cps standards.fn standards.ky standards.log \
+ standards.pg standards.tmp standards.toc standards.tp \
+ standards.tps standards.vr
+
+clean-aminfo:
+ -test -z "autoconf.dvi autoconf.pdf autoconf.ps autoconf.html standards.dvi \
+ standards.pdf standards.ps standards.html" \
+ || rm -rf autoconf.dvi autoconf.pdf autoconf.ps autoconf.html standards.dvi \
+ standards.pdf standards.ps standards.html
+
+maintainer-clean-aminfo:
+ @list='$(INFO_DEPS)'; for i in $$list; do \
+ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
+ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
+ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
+ done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-info
+check-am: all-am
+check: check-am
+all-am: Makefile $(INFO_DEPS)
+installdirs:
+ for dir in "$(DESTDIR)$(infodir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-aminfo clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am: $(DVIS)
+
+html: html-am
+
+html-am: $(HTMLS)
+
+info: info-am
+
+info-am: $(INFO_DEPS)
+
+install-data-am: install-info-am
+
+install-dvi: install-dvi-am
+
+install-dvi-am: $(DVIS)
+ @$(NORMAL_INSTALL)
+ test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)"
+ @list='$(DVIS)'; test -n "$(dvidir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \
+ done
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am: $(HTMLS)
+ @$(NORMAL_INSTALL)
+ test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)"
+ @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ $(am__strip_dir) \
+ if test -d "$$d$$p"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
+ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
+ echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \
+ $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \
+ else \
+ list2="$$list2 $$d$$p"; \
+ fi; \
+ done; \
+ test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \
+ done; }
+install-info: install-info-am
+
+install-info-am: $(INFO_DEPS)
+ @$(NORMAL_INSTALL)
+ test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
+ for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ esac; \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
+ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
+ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
+ if test -f $$ifile; then \
+ echo "$$ifile"; \
+ else : ; fi; \
+ done; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done
+ @$(POST_INSTALL)
+ @if (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
+ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
+ done; \
+ else : ; fi
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am: $(PDFS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)"
+ @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done
+install-ps: install-ps-am
+
+install-ps-am: $(PSS)
+ @$(NORMAL_INSTALL)
+ test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)"
+ @list='$(PSS)'; test -n "$(psdir)" || list=; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-aminfo \
+ maintainer-clean-generic maintainer-clean-vti
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-aminfo mostlyclean-generic mostlyclean-vti
+
+pdf: pdf-am
+
+pdf-am: $(PDFS)
+
+ps: ps-am
+
+ps-am: $(PSS)
+
+uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \
+ uninstall-pdf-am uninstall-ps-am
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-aminfo clean-generic \
+ dist-info distclean distclean-generic distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-aminfo maintainer-clean-generic \
+ maintainer-clean-vti mostlyclean mostlyclean-aminfo \
+ mostlyclean-generic mostlyclean-vti pdf pdf-am ps ps-am \
+ uninstall uninstall-am uninstall-dvi-am uninstall-html-am \
+ uninstall-info-am uninstall-pdf-am uninstall-ps-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/doc/autoconf.info b/doc/autoconf.info
new file mode 100644
index 0000000..1ba3bfd
--- /dev/null
+++ b/doc/autoconf.info
@@ -0,0 +1,25690 @@
+This is autoconf.info, produced by makeinfo version 4.13 from
+autoconf.texi.
+
+This manual (24 April 2012) is for GNU Autoconf (version 2.69), a
+package for creating scripts to configure source code packages using
+templates and an M4 macro package.
+
+ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU Free Documentation License,
+ Version 1.3 or any later version published by the Free Software
+ Foundation; with no Invariant Sections, no Front-Cover texts, and
+ no Back-Cover Texts. A copy of the license is included in the
+ section entitled "GNU Free Documentation License."
+
+INFO-DIR-SECTION Software development
+START-INFO-DIR-ENTRY
+* Autoconf: (autoconf). Create source code configuration scripts.
+END-INFO-DIR-ENTRY
+
+INFO-DIR-SECTION Individual utilities
+START-INFO-DIR-ENTRY
+* autoscan: (autoconf)autoscan Invocation.
+ Semi-automatic `configure.ac' writing
+* ifnames: (autoconf)ifnames Invocation. Listing conditionals in source.
+* autoconf-invocation: (autoconf)autoconf Invocation.
+ How to create configuration scripts
+* autoreconf: (autoconf)autoreconf Invocation.
+ Remaking multiple `configure' scripts
+* autoheader: (autoconf)autoheader Invocation.
+ How to create configuration templates
+* autom4te: (autoconf)autom4te Invocation.
+ The Autoconf executables backbone
+* configure: (autoconf)configure Invocation. Configuring a package.
+* autoupdate: (autoconf)autoupdate Invocation.
+ Automatic update of `configure.ac'
+* config.status: (autoconf)config.status Invocation. Recreating configurations.
+* testsuite: (autoconf)testsuite Invocation. Running an Autotest test suite.
+END-INFO-DIR-ENTRY
+
+
+File: autoconf.info, Node: Top, Next: Introduction, Up: (dir)
+
+Autoconf
+********
+
+This manual (24 April 2012) is for GNU Autoconf (version 2.69), a
+package for creating scripts to configure source code packages using
+templates and an M4 macro package.
+
+ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU Free Documentation License,
+ Version 1.3 or any later version published by the Free Software
+ Foundation; with no Invariant Sections, no Front-Cover texts, and
+ no Back-Cover Texts. A copy of the license is included in the
+ section entitled "GNU Free Documentation License."
+
+* Menu:
+
+* Introduction:: Autoconf's purpose, strengths, and weaknesses
+* The GNU Build System:: A set of tools for portable software packages
+* Making configure Scripts:: How to organize and produce Autoconf scripts
+* Setup:: Initialization and output
+* Existing Tests:: Macros that check for particular features
+* Writing Tests:: How to write new feature checks
+* Results:: What to do with results from feature checks
+* Programming in M4:: Layers on top of which Autoconf is written
+* Programming in M4sh:: Shell portability layer
+* Writing Autoconf Macros:: Adding new macros to Autoconf
+* Portable Shell:: Shell script portability pitfalls
+* Portable Make:: Makefile portability pitfalls
+* Portable C and C++:: C and C++ portability pitfalls
+* Manual Configuration:: Selecting features that can't be guessed
+* Site Configuration:: Local defaults for `configure'
+* Running configure Scripts:: How to use the Autoconf output
+* config.status Invocation:: Recreating a configuration
+* Obsolete Constructs:: Kept for backward compatibility
+* Using Autotest:: Creating portable test suites
+* FAQ:: Frequent Autoconf Questions, with answers
+* History:: History of Autoconf
+* GNU Free Documentation License:: License for copying this manual
+* Indices:: Indices of symbols, concepts, etc.
+
+ --- The Detailed Node Listing ---
+
+The GNU Build System
+
+* Automake:: Escaping makefile hell
+* Gnulib:: The GNU portability library
+* Libtool:: Building libraries portably
+* Pointers:: More info on the GNU build system
+
+Making `configure' Scripts
+
+* Writing Autoconf Input:: What to put in an Autoconf input file
+* autoscan Invocation:: Semi-automatic `configure.ac' writing
+* ifnames Invocation:: Listing the conditionals in source code
+* autoconf Invocation:: How to create configuration scripts
+* autoreconf Invocation:: Remaking multiple `configure' scripts
+
+Writing `configure.ac'
+
+* Shell Script Compiler:: Autoconf as solution of a problem
+* Autoconf Language:: Programming in Autoconf
+* Autoconf Input Layout:: Standard organization of `configure.ac'
+
+Initialization and Output Files
+
+* Initializing configure:: Option processing etc.
+* Versioning:: Dealing with Autoconf versions
+* Notices:: Copyright, version numbers in `configure'
+* Input:: Where Autoconf should find files
+* Output:: Outputting results from the configuration
+* Configuration Actions:: Preparing the output based on results
+* Configuration Files:: Creating output files
+* Makefile Substitutions:: Using output variables in makefiles
+* Configuration Headers:: Creating a configuration header file
+* Configuration Commands:: Running arbitrary instantiation commands
+* Configuration Links:: Links depending on the configuration
+* Subdirectories:: Configuring independent packages together
+* Default Prefix:: Changing the default installation prefix
+
+Substitutions in Makefiles
+
+* Preset Output Variables:: Output variables that are always set
+* Installation Directory Variables:: Other preset output variables
+* Changed Directory Variables:: Warnings about `datarootdir'
+* Build Directories:: Supporting multiple concurrent compiles
+* Automatic Remaking:: Makefile rules for configuring
+
+Configuration Header Files
+
+* Header Templates:: Input for the configuration headers
+* autoheader Invocation:: How to create configuration templates
+* Autoheader Macros:: How to specify CPP templates
+
+Existing Tests
+
+* Common Behavior:: Macros' standard schemes
+* Alternative Programs:: Selecting between alternative programs
+* Files:: Checking for the existence of files
+* Libraries:: Library archives that might be missing
+* Library Functions:: C library functions that might be missing
+* Header Files:: Header files that might be missing
+* Declarations:: Declarations that may be missing
+* Structures:: Structures or members that might be missing
+* Types:: Types that might be missing
+* Compilers and Preprocessors:: Checking for compiling programs
+* System Services:: Operating system services
+* Posix Variants:: Special kludges for specific Posix variants
+* Erlang Libraries:: Checking for the existence of Erlang libraries
+
+Common Behavior
+
+* Standard Symbols:: Symbols defined by the macros
+* Default Includes:: Includes used by the generic macros
+
+Alternative Programs
+
+* Particular Programs:: Special handling to find certain programs
+* Generic Programs:: How to find other programs
+
+Library Functions
+
+* Function Portability:: Pitfalls with usual functions
+* Particular Functions:: Special handling to find certain functions
+* Generic Functions:: How to find other functions
+
+Header Files
+
+* Header Portability:: Collected knowledge on common headers
+* Particular Headers:: Special handling to find certain headers
+* Generic Headers:: How to find other headers
+
+Declarations
+
+* Particular Declarations:: Macros to check for certain declarations
+* Generic Declarations:: How to find other declarations
+
+Structures
+
+* Particular Structures:: Macros to check for certain structure members
+* Generic Structures:: How to find other structure members
+
+Types
+
+* Particular Types:: Special handling to find certain types
+* Generic Types:: How to find other types
+
+Compilers and Preprocessors
+
+* Specific Compiler Characteristics:: Some portability issues
+* Generic Compiler Characteristics:: Language independent tests and features
+* C Compiler:: Checking its characteristics
+* C++ Compiler:: Likewise
+* Objective C Compiler:: Likewise
+* Objective C++ Compiler:: Likewise
+* Erlang Compiler and Interpreter:: Likewise
+* Fortran Compiler:: Likewise
+* Go Compiler:: Likewise
+
+Writing Tests
+
+* Language Choice:: Selecting which language to use for testing
+* Writing Test Programs:: Forging source files for compilers
+* Running the Preprocessor:: Detecting preprocessor symbols
+* Running the Compiler:: Detecting language or header features
+* Running the Linker:: Detecting library features
+* Runtime:: Testing for runtime features
+* Systemology:: A zoology of operating systems
+* Multiple Cases:: Tests for several possible values
+
+Writing Test Programs
+
+* Guidelines:: General rules for writing test programs
+* Test Functions:: Avoiding pitfalls in test programs
+* Generating Sources:: Source program boilerplate
+
+Results of Tests
+
+* Defining Symbols:: Defining C preprocessor symbols
+* Setting Output Variables:: Replacing variables in output files
+* Special Chars in Variables:: Characters to beware of in variables
+* Caching Results:: Speeding up subsequent `configure' runs
+* Printing Messages:: Notifying `configure' users
+
+Caching Results
+
+* Cache Variable Names:: Shell variables used in caches
+* Cache Files:: Files `configure' uses for caching
+* Cache Checkpointing:: Loading and saving the cache file
+
+Programming in M4
+
+* M4 Quotation:: Protecting macros from unwanted expansion
+* Using autom4te:: The Autoconf executables backbone
+* Programming in M4sugar:: Convenient pure M4 macros
+* Debugging via autom4te:: Figuring out what M4 was doing
+
+M4 Quotation
+
+* Active Characters:: Characters that change the behavior of M4
+* One Macro Call:: Quotation and one macro call
+* Quoting and Parameters:: M4 vs. shell parameters
+* Quotation and Nested Macros:: Macros calling macros
+* Changequote is Evil:: Worse than INTERCAL: M4 + changequote
+* Quadrigraphs:: Another way to escape special characters
+* Balancing Parentheses:: Dealing with unbalanced parentheses
+* Quotation Rule Of Thumb:: One parenthesis, one quote
+
+Using `autom4te'
+
+* autom4te Invocation:: A GNU M4 wrapper
+* Customizing autom4te:: Customizing the Autoconf package
+
+Programming in M4sugar
+
+* Redefined M4 Macros:: M4 builtins changed in M4sugar
+* Diagnostic Macros:: Diagnostic messages from M4sugar
+* Diversion support:: Diversions in M4sugar
+* Conditional constructs:: Conditions in M4
+* Looping constructs:: Iteration in M4
+* Evaluation Macros:: More quotation and evaluation control
+* Text processing Macros:: String manipulation in M4
+* Number processing Macros:: Arithmetic computation in M4
+* Set manipulation Macros:: Set manipulation in M4
+* Forbidden Patterns:: Catching unexpanded macros
+
+Programming in M4sh
+
+* Common Shell Constructs:: Portability layer for common shell constructs
+* Polymorphic Variables:: Support for indirect variable names
+* Initialization Macros:: Macros to establish a sane shell environment
+* File Descriptor Macros:: File descriptor macros for input and output
+
+Writing Autoconf Macros
+
+* Macro Definitions:: Basic format of an Autoconf macro
+* Macro Names:: What to call your new macros
+* Reporting Messages:: Notifying `autoconf' users
+* Dependencies Between Macros:: What to do when macros depend on other macros
+* Obsoleting Macros:: Warning about old ways of doing things
+* Coding Style:: Writing Autoconf macros a` la Autoconf
+
+Dependencies Between Macros
+
+* Prerequisite Macros:: Ensuring required information
+* Suggested Ordering:: Warning about possible ordering problems
+* One-Shot Macros:: Ensuring a macro is called only once
+
+Portable Shell Programming
+
+* Shellology:: A zoology of shells
+* Invoking the Shell:: Invoking the shell as a command
+* Here-Documents:: Quirks and tricks
+* File Descriptors:: FDs and redirections
+* Signal Handling:: Shells, signals, and headaches
+* File System Conventions:: File names
+* Shell Pattern Matching:: Pattern matching
+* Shell Substitutions:: Variable and command expansions
+* Assignments:: Varying side effects of assignments
+* Parentheses:: Parentheses in shell scripts
+* Slashes:: Slashes in shell scripts
+* Special Shell Variables:: Variables you should not change
+* Shell Functions:: What to look out for if you use them
+* Limitations of Builtins:: Portable use of not so portable /bin/sh
+* Limitations of Usual Tools:: Portable use of portable tools
+
+Portable Make Programming
+
+* $< in Ordinary Make Rules:: $< in ordinary rules
+* Failure in Make Rules:: Failing portably in rules
+* Special Chars in Names:: Special Characters in Macro Names
+* Backslash-Newline-Empty:: Empty lines after backslash-newline
+* Backslash-Newline Comments:: Spanning comments across line boundaries
+* Long Lines in Makefiles:: Line length limitations
+* Macros and Submakes:: `make macro=value' and submakes
+* The Make Macro MAKEFLAGS:: `$(MAKEFLAGS)' portability issues
+* The Make Macro SHELL:: `$(SHELL)' portability issues
+* Parallel Make:: Parallel `make' quirks
+* Comments in Make Rules:: Other problems with Make comments
+* Newlines in Make Rules:: Using literal newlines in rules
+* Comments in Make Macros:: Other problems with Make comments in macros
+* Trailing whitespace in Make Macros:: Macro substitution problems
+* Command-line Macros and whitespace:: Whitespace trimming of values
+* obj/ and Make:: Don't name a subdirectory `obj'
+* make -k Status:: Exit status of `make -k'
+* VPATH and Make:: `VPATH' woes
+* Single Suffix Rules:: Single suffix rules and separated dependencies
+* Timestamps and Make:: Subsecond timestamp resolution
+
+`VPATH' and Make
+
+* Variables listed in VPATH:: `VPATH' must be literal on ancient hosts
+* VPATH and Double-colon:: Problems with `::' on ancient hosts
+* $< in Explicit Rules:: `$<' does not work in ordinary rules
+* Automatic Rule Rewriting:: `VPATH' goes wild on Solaris
+* Tru64 Directory Magic:: `mkdir' goes wild on Tru64
+* Make Target Lookup:: More details about `VPATH' lookup
+
+Portable C and C++ Programming
+
+* Varieties of Unportability:: How to make your programs unportable
+* Integer Overflow:: When integers get too large
+* Preprocessor Arithmetic:: `#if' expression problems
+* Null Pointers:: Properties of null pointers
+* Buffer Overruns:: Subscript errors and the like
+* Volatile Objects:: `volatile' and signals
+* Floating Point Portability:: Portable floating-point arithmetic
+* Exiting Portably:: Exiting and the exit status
+
+Integer Overflow
+
+* Integer Overflow Basics:: Why integer overflow is a problem
+* Signed Overflow Examples:: Examples of code assuming wraparound
+* Optimization and Wraparound:: Optimizations that break uses of wraparound
+* Signed Overflow Advice:: Practical advice for signed overflow issues
+* Signed Integer Division:: `INT_MIN / -1' and `INT_MIN % -1'
+
+Manual Configuration
+
+* Specifying Target Triplets:: Specifying target triplets
+* Canonicalizing:: Getting the canonical system type
+* Using System Type:: What to do with the system type
+
+Site Configuration
+
+* Help Formatting:: Customizing `configure --help'
+* External Software:: Working with other optional software
+* Package Options:: Selecting optional features
+* Pretty Help Strings:: Formatting help string
+* Option Checking:: Controlling checking of `configure' options
+* Site Details:: Configuring site details
+* Transforming Names:: Changing program names when installing
+* Site Defaults:: Giving `configure' local defaults
+
+Transforming Program Names When Installing
+
+* Transformation Options:: `configure' options to transform names
+* Transformation Examples:: Sample uses of transforming names
+* Transformation Rules:: Makefile uses of transforming names
+
+Running `configure' Scripts
+
+* Basic Installation:: Instructions for typical cases
+* Compilers and Options:: Selecting compilers and optimization
+* Multiple Architectures:: Compiling for multiple architectures at once
+* Installation Names:: Installing in different directories
+* Optional Features:: Selecting optional features
+* Particular Systems:: Particular systems
+* System Type:: Specifying the system type
+* Sharing Defaults:: Setting site-wide defaults for `configure'
+* Defining Variables:: Specifying the compiler etc.
+* configure Invocation:: Changing how `configure' runs
+
+Obsolete Constructs
+
+* Obsolete config.status Use:: Obsolete convention for `config.status'
+* acconfig Header:: Additional entries in `config.h.in'
+* autoupdate Invocation:: Automatic update of `configure.ac'
+* Obsolete Macros:: Backward compatibility macros
+* Autoconf 1:: Tips for upgrading your files
+* Autoconf 2.13:: Some fresher tips
+
+Upgrading From Version 1
+
+* Changed File Names:: Files you might rename
+* Changed Makefiles:: New things to put in `Makefile.in'
+* Changed Macros:: Macro calls you might replace
+* Changed Results:: Changes in how to check test results
+* Changed Macro Writing:: Better ways to write your own macros
+
+Upgrading From Version 2.13
+
+* Changed Quotation:: Broken code which used to work
+* New Macros:: Interaction with foreign macros
+* Hosts and Cross-Compilation:: Bugward compatibility kludges
+* AC_LIBOBJ vs LIBOBJS:: LIBOBJS is a forbidden token
+* AC_ACT_IFELSE vs AC_TRY_ACT:: A more generic scheme for testing sources
+
+Generating Test Suites with Autotest
+
+* Using an Autotest Test Suite:: Autotest and the user
+* Writing Testsuites:: Autotest macros
+* testsuite Invocation:: Running `testsuite' scripts
+* Making testsuite Scripts:: Using autom4te to create `testsuite'
+
+Using an Autotest Test Suite
+
+* testsuite Scripts:: The concepts of Autotest
+* Autotest Logs:: Their contents
+
+Frequent Autoconf Questions, with answers
+
+* Distributing:: Distributing `configure' scripts
+* Why GNU M4:: Why not use the standard M4?
+* Bootstrapping:: Autoconf and GNU M4 require each other?
+* Why Not Imake:: Why GNU uses `configure' instead of Imake
+* Defining Directories:: Passing `datadir' to program
+* Autom4te Cache:: What is it? Can I remove it?
+* Present But Cannot Be Compiled:: Compiler and Preprocessor Disagree
+* Expanded Before Required:: Expanded Before Required
+* Debugging:: Debugging `configure' scripts
+
+History of Autoconf
+
+* Genesis:: Prehistory and naming of `configure'
+* Exodus:: The plagues of M4 and Perl
+* Leviticus:: The priestly code of portability arrives
+* Numbers:: Growth and contributors
+* Deuteronomy:: Approaching the promises of easy configuration
+
+Indices
+
+* Environment Variable Index:: Index of environment variables used
+* Output Variable Index:: Index of variables set in output files
+* Preprocessor Symbol Index:: Index of C preprocessor symbols defined
+* Cache Variable Index:: Index of documented cache variables
+* Autoconf Macro Index:: Index of Autoconf macros
+* M4 Macro Index:: Index of M4, M4sugar, and M4sh macros
+* Autotest Macro Index:: Index of Autotest macros
+* Program & Function Index:: Index of those with portability problems
+* Concept Index:: General index
+
+
+File: autoconf.info, Node: Introduction, Next: The GNU Build System, Prev: Top, Up: Top
+
+1 Introduction
+**************
+
+ A physicist, an engineer, and a computer scientist were discussing the
+ nature of God. "Surely a Physicist," said the physicist, "because
+ early in the Creation, God made Light; and you know, Maxwell's
+ equations, the dual nature of electromagnetic waves, the relativistic
+ consequences..." "An Engineer!," said the engineer, "because
+before making Light, God split the Chaos into Land and Water; it takes a
+ hell of an engineer to handle that big amount of mud, and orderly
+ separation of solids from liquids..." The computer scientist
+ shouted: "And the Chaos, where do you think it was coming from, hmm?"
+
+ --Anonymous
+
+ Autoconf is a tool for producing shell scripts that automatically
+configure software source code packages to adapt to many kinds of
+Posix-like systems. The configuration scripts produced by Autoconf are
+independent of Autoconf when they are run, so their users do not need
+to have Autoconf.
+
+ The configuration scripts produced by Autoconf require no manual user
+intervention when run; they do not normally even need an argument
+specifying the system type. Instead, they individually test for the
+presence of each feature that the software package they are for might
+need. (Before each check, they print a one-line message stating what
+they are checking for, so the user doesn't get too bored while waiting
+for the script to finish.) As a result, they deal well with systems
+that are hybrids or customized from the more common Posix variants.
+There is no need to maintain files that list the features supported by
+each release of each variant of Posix.
+
+ For each software package that Autoconf is used with, it creates a
+configuration script from a template file that lists the system features
+that the package needs or can use. After the shell code to recognize
+and respond to a system feature has been written, Autoconf allows it to
+be shared by many software packages that can use (or need) that feature.
+If it later turns out that the shell code needs adjustment for some
+reason, it needs to be changed in only one place; all of the
+configuration scripts can be regenerated automatically to take advantage
+of the updated code.
+
+ Those who do not understand Autoconf are condemned to reinvent it,
+poorly. The primary goal of Autoconf is making the _user's_ life
+easier; making the _maintainer's_ life easier is only a secondary goal.
+Put another way, the primary goal is not to make the generation of
+`configure' automatic for package maintainers (although patches along
+that front are welcome, since package maintainers form the user base of
+Autoconf); rather, the goal is to make `configure' painless, portable,
+and predictable for the end user of each "autoconfiscated" package.
+And to this degree, Autoconf is highly successful at its goal -- most
+complaints to the Autoconf list are about difficulties in writing
+Autoconf input, and not in the behavior of the resulting `configure'.
+Even packages that don't use Autoconf will generally provide a
+`configure' script, and the most common complaint about these
+alternative home-grown scripts is that they fail to meet one or more of
+the GNU Coding Standards (*note Configuration:
+(standards)Configuration.) that users have come to expect from
+Autoconf-generated `configure' scripts.
+
+ The Metaconfig package is similar in purpose to Autoconf, but the
+scripts it produces require manual user intervention, which is quite
+inconvenient when configuring large source trees. Unlike Metaconfig
+scripts, Autoconf scripts can support cross-compiling, if some care is
+taken in writing them.
+
+ Autoconf does not solve all problems related to making portable
+software packages--for a more complete solution, it should be used in
+concert with other GNU build tools like Automake and Libtool. These
+other tools take on jobs like the creation of a portable, recursive
+makefile with all of the standard targets, linking of shared libraries,
+and so on. *Note The GNU Build System::, for more information.
+
+ Autoconf imposes some restrictions on the names of macros used with
+`#if' in C programs (*note Preprocessor Symbol Index::).
+
+ Autoconf requires GNU M4 version 1.4.6 or later in order to generate
+the scripts. It uses features that some versions of M4, including GNU
+M4 1.3, do not have. Autoconf works better with GNU M4 version 1.4.14
+or later, though this is not required.
+
+ *Note Autoconf 1::, for information about upgrading from version 1.
+*Note History::, for the story of Autoconf's development. *Note FAQ::,
+for answers to some common questions about Autoconf.
+
+ See the Autoconf web page (http://www.gnu.org/software/autoconf/)
+for up-to-date information, details on the mailing lists, pointers to a
+list of known bugs, etc.
+
+ Mail suggestions to the Autoconf mailing list <autoconf@gnu.org>.
+Past suggestions are archived
+(http://lists.gnu.org/archive/html/autoconf/).
+
+ Mail bug reports to the Autoconf Bugs mailing list
+<bug-autoconf@gnu.org>. Past bug reports are archived
+(http://lists.gnu.org/archive/html/bug-autoconf/).
+
+ If possible, first check that your bug is not already solved in
+current development versions, and that it has not been reported yet.
+Be sure to include all the needed information and a short
+`configure.ac' that demonstrates the problem.
+
+ Autoconf's development tree is accessible via `git'; see the
+Autoconf Summary (http://savannah.gnu.org/projects/autoconf/) for
+details, or view the actual repository
+(http://git.sv.gnu.org/gitweb/?p=autoconf.git). Anonymous CVS access
+is also available, see `README' for more details. Patches relative to
+the current `git' version can be sent for review to the Autoconf
+Patches mailing list <autoconf-patches@gnu.org>, with discussion on
+prior patches archived
+(http://lists.gnu.org/archive/html/autoconf-patches/); and all commits
+are posted in the read-only Autoconf Commit mailing list
+<autoconf-commit@gnu.org>, which is also archived
+(http://lists.gnu.org/archive/html/autoconf-commit/).
+
+ Because of its mission, the Autoconf package itself includes only a
+set of often-used macros that have already demonstrated their
+usefulness. Nevertheless, if you wish to share your macros, or find
+existing ones, see the Autoconf Macro Archive
+(http://www.gnu.org/software/autoconf-archive/), which is kindly run by
+Peter Simons <simons@cryp.to>.
+
+
+File: autoconf.info, Node: The GNU Build System, Next: Making configure Scripts, Prev: Introduction, Up: Top
+
+2 The GNU Build System
+**********************
+
+Autoconf solves an important problem--reliable discovery of
+system-specific build and runtime information--but this is only one
+piece of the puzzle for the development of portable software. To this
+end, the GNU project has developed a suite of integrated utilities to
+finish the job Autoconf started: the GNU build system, whose most
+important components are Autoconf, Automake, and Libtool. In this
+chapter, we introduce you to those tools, point you to sources of more
+information, and try to convince you to use the entire GNU build system
+for your software.
+
+* Menu:
+
+* Automake:: Escaping makefile hell
+* Gnulib:: The GNU portability library
+* Libtool:: Building libraries portably
+* Pointers:: More info on the GNU build system
+
+
+File: autoconf.info, Node: Automake, Next: Gnulib, Up: The GNU Build System
+
+2.1 Automake
+============
+
+The ubiquity of `make' means that a makefile is almost the only viable
+way to distribute automatic build rules for software, but one quickly
+runs into its numerous limitations. Its lack of support for automatic
+dependency tracking, recursive builds in subdirectories, reliable
+timestamps (e.g., for network file systems), and so on, mean that
+developers must painfully (and often incorrectly) reinvent the wheel
+for each project. Portability is non-trivial, thanks to the quirks of
+`make' on many systems. On top of all this is the manual labor
+required to implement the many standard targets that users have come to
+expect (`make install', `make distclean', `make uninstall', etc.).
+Since you are, of course, using Autoconf, you also have to insert
+repetitive code in your `Makefile.in' to recognize `@CC@', `@CFLAGS@',
+and other substitutions provided by `configure'. Into this mess steps
+"Automake".
+
+ Automake allows you to specify your build needs in a `Makefile.am'
+file with a vastly simpler and more powerful syntax than that of a plain
+makefile, and then generates a portable `Makefile.in' for use with
+Autoconf. For example, the `Makefile.am' to build and install a simple
+"Hello world" program might look like:
+
+ bin_PROGRAMS = hello
+ hello_SOURCES = hello.c
+
+The resulting `Makefile.in' (~400 lines) automatically supports all the
+standard targets, the substitutions provided by Autoconf, automatic
+dependency tracking, `VPATH' building, and so on. `make' builds the
+`hello' program, and `make install' installs it in `/usr/local/bin' (or
+whatever prefix was given to `configure', if not `/usr/local').
+
+ The benefits of Automake increase for larger packages (especially
+ones with subdirectories), but even for small programs the added
+convenience and portability can be substantial. And that's not all...
+
+
+File: autoconf.info, Node: Gnulib, Next: Libtool, Prev: Automake, Up: The GNU Build System
+
+2.2 Gnulib
+==========
+
+GNU software has a well-deserved reputation for running on many
+different types of systems. While our primary goal is to write
+software for the GNU system, many users and developers have been
+introduced to us through the systems that they were already using.
+
+ Gnulib is a central location for common GNU code, intended to be
+shared among free software packages. Its components are typically
+shared at the source level, rather than being a library that gets built,
+installed, and linked against. The idea is to copy files from Gnulib
+into your own source tree. There is no distribution tarball; developers
+should just grab source modules from the repository. The source files
+are available online, under various licenses, mostly GNU GPL or GNU
+LGPL.
+
+ Gnulib modules typically contain C source code along with Autoconf
+macros used to configure the source code. For example, the Gnulib
+`stdbool' module implements a `stdbool.h' header that nearly conforms
+to C99, even on old-fashioned hosts that lack `stdbool.h'. This module
+contains a source file for the replacement header, along with an
+Autoconf macro that arranges to use the replacement header on
+old-fashioned systems.
+
+
+File: autoconf.info, Node: Libtool, Next: Pointers, Prev: Gnulib, Up: The GNU Build System
+
+2.3 Libtool
+===========
+
+Often, one wants to build not only programs, but libraries, so that
+other programs can benefit from the fruits of your labor. Ideally, one
+would like to produce _shared_ (dynamically linked) libraries, which
+can be used by multiple programs without duplication on disk or in
+memory and can be updated independently of the linked programs.
+Producing shared libraries portably, however, is the stuff of
+nightmares--each system has its own incompatible tools, compiler flags,
+and magic incantations. Fortunately, GNU provides a solution:
+"Libtool".
+
+ Libtool handles all the requirements of building shared libraries for
+you, and at this time seems to be the _only_ way to do so with any
+portability. It also handles many other headaches, such as: the
+interaction of Make rules with the variable suffixes of shared
+libraries, linking reliably with shared libraries before they are
+installed by the superuser, and supplying a consistent versioning system
+(so that different versions of a library can be installed or upgraded
+without breaking binary compatibility). Although Libtool, like
+Autoconf, can be used without Automake, it is most simply utilized in
+conjunction with Automake--there, Libtool is used automatically
+whenever shared libraries are needed, and you need not know its syntax.
+
+
+File: autoconf.info, Node: Pointers, Prev: Libtool, Up: The GNU Build System
+
+2.4 Pointers
+============
+
+Developers who are used to the simplicity of `make' for small projects
+on a single system might be daunted at the prospect of learning to use
+Automake and Autoconf. As your software is distributed to more and
+more users, however, you otherwise quickly find yourself putting lots
+of effort into reinventing the services that the GNU build tools
+provide, and making the same mistakes that they once made and overcame.
+(Besides, since you're already learning Autoconf, Automake is a piece
+of cake.)
+
+ There are a number of places that you can go to for more information
+on the GNU build tools.
+
+ - Web
+
+ The project home pages for Autoconf
+ (http://www.gnu.org/software/autoconf/), Automake
+ (http://www.gnu.org/software/automake/), Gnulib
+ (http://www.gnu.org/software/gnulib/), and Libtool
+ (http://www.gnu.org/software/libtool/).
+
+ - Automake Manual
+
+ *Note Automake: (automake)Top, for more information on Automake.
+
+ - Books
+
+ The book `GNU Autoconf, Automake and Libtool'(1) describes the
+ complete GNU build environment. You can also find the entire book
+ on-line (http://sources.redhat.com/autobook/).
+
+
+ ---------- Footnotes ----------
+
+ (1) `GNU Autoconf, Automake and Libtool', by G. V. Vaughan, B.
+Elliston, T. Tromey, and I. L. Taylor. SAMS (originally New Riders),
+2000, ISBN 1578701902.
+
+
+File: autoconf.info, Node: Making configure Scripts, Next: Setup, Prev: The GNU Build System, Up: Top
+
+3 Making `configure' Scripts
+****************************
+
+The configuration scripts that Autoconf produces are by convention
+called `configure'. When run, `configure' creates several files,
+replacing configuration parameters in them with appropriate values.
+The files that `configure' creates are:
+
+ - one or more `Makefile' files, usually one in each subdirectory of
+ the package (*note Makefile Substitutions::);
+
+ - optionally, a C header file, the name of which is configurable,
+ containing `#define' directives (*note Configuration Headers::);
+
+ - a shell script called `config.status' that, when run, recreates
+ the files listed above (*note config.status Invocation::);
+
+ - an optional shell script normally called `config.cache' (created
+ when using `configure --config-cache') that saves the results of
+ running many of the tests (*note Cache Files::);
+
+ - a file called `config.log' containing any messages produced by
+ compilers, to help debugging if `configure' makes a mistake.
+
+ To create a `configure' script with Autoconf, you need to write an
+Autoconf input file `configure.ac' (or `configure.in') and run
+`autoconf' on it. If you write your own feature tests to supplement
+those that come with Autoconf, you might also write files called
+`aclocal.m4' and `acsite.m4'. If you use a C header file to contain
+`#define' directives, you might also run `autoheader', and you can
+distribute the generated file `config.h.in' with the package.
+
+ Here is a diagram showing how the files that can be used in
+configuration are produced. Programs that are executed are suffixed by
+`*'. Optional files are enclosed in square brackets (`[]').
+`autoconf' and `autoheader' also read the installed Autoconf macro
+files (by reading `autoconf.m4').
+
+Files used in preparing a software package for distribution, when using
+just Autoconf:
+ your source files --> [autoscan*] --> [configure.scan] --> configure.ac
+
+ configure.ac --.
+ | .------> autoconf* -----> configure
+ [aclocal.m4] --+---+
+ | `-----> [autoheader*] --> [config.h.in]
+ [acsite.m4] ---'
+
+ Makefile.in
+
+Additionally, if you use Automake, the following additional productions
+come into play:
+
+ [acinclude.m4] --.
+ |
+ [local macros] --+--> aclocal* --> aclocal.m4
+ |
+ configure.ac ----'
+
+ configure.ac --.
+ +--> automake* --> Makefile.in
+ Makefile.am ---'
+
+Files used in configuring a software package:
+ .-------------> [config.cache]
+ configure* ------------+-------------> config.log
+ |
+ [config.h.in] -. v .-> [config.h] -.
+ +--> config.status* -+ +--> make*
+ Makefile.in ---' `-> Makefile ---'
+
+* Menu:
+
+* Writing Autoconf Input:: What to put in an Autoconf input file
+* autoscan Invocation:: Semi-automatic `configure.ac' writing
+* ifnames Invocation:: Listing the conditionals in source code
+* autoconf Invocation:: How to create configuration scripts
+* autoreconf Invocation:: Remaking multiple `configure' scripts
+
+
+File: autoconf.info, Node: Writing Autoconf Input, Next: autoscan Invocation, Up: Making configure Scripts
+
+3.1 Writing `configure.ac'
+==========================
+
+To produce a `configure' script for a software package, create a file
+called `configure.ac' that contains invocations of the Autoconf macros
+that test the system features your package needs or can use. Autoconf
+macros already exist to check for many features; see *note Existing
+Tests::, for their descriptions. For most other features, you can use
+Autoconf template macros to produce custom checks; see *note Writing
+Tests::, for information about them. For especially tricky or
+specialized features, `configure.ac' might need to contain some
+hand-crafted shell commands; see *note Portable Shell Programming:
+Portable Shell. The `autoscan' program can give you a good start in
+writing `configure.ac' (*note autoscan Invocation::, for more
+information).
+
+ Previous versions of Autoconf promoted the name `configure.in',
+which is somewhat ambiguous (the tool needed to process this file is not
+described by its extension), and introduces a slight confusion with
+`config.h.in' and so on (for which `.in' means "to be processed by
+`configure'"). Using `configure.ac' is now preferred.
+
+* Menu:
+
+* Shell Script Compiler:: Autoconf as solution of a problem
+* Autoconf Language:: Programming in Autoconf
+* Autoconf Input Layout:: Standard organization of `configure.ac'
+
+
+File: autoconf.info, Node: Shell Script Compiler, Next: Autoconf Language, Up: Writing Autoconf Input
+
+3.1.1 A Shell Script Compiler
+-----------------------------
+
+Just as for any other computer language, in order to properly program
+`configure.ac' in Autoconf you must understand _what_ problem the
+language tries to address and _how_ it does so.
+
+ The problem Autoconf addresses is that the world is a mess. After
+all, you are using Autoconf in order to have your package compile
+easily on all sorts of different systems, some of them being extremely
+hostile. Autoconf itself bears the price for these differences:
+`configure' must run on all those systems, and thus `configure' must
+limit itself to their lowest common denominator of features.
+
+ Naturally, you might then think of shell scripts; who needs
+`autoconf'? A set of properly written shell functions is enough to
+make it easy to write `configure' scripts by hand. Sigh!
+Unfortunately, even in 2008, where shells without any function support
+are far and few between, there are pitfalls to avoid when making use of
+them. Also, finding a Bourne shell that accepts shell functions is not
+trivial, even though there is almost always one on interesting porting
+targets.
+
+ So, what is really needed is some kind of compiler, `autoconf', that
+takes an Autoconf program, `configure.ac', and transforms it into a
+portable shell script, `configure'.
+
+ How does `autoconf' perform this task?
+
+ There are two obvious possibilities: creating a brand new language or
+extending an existing one. The former option is attractive: all sorts
+of optimizations could easily be implemented in the compiler and many
+rigorous checks could be performed on the Autoconf program (e.g.,
+rejecting any non-portable construct). Alternatively, you can extend
+an existing language, such as the `sh' (Bourne shell) language.
+
+ Autoconf does the latter: it is a layer on top of `sh'. It was
+therefore most convenient to implement `autoconf' as a macro expander:
+a program that repeatedly performs "macro expansions" on text input,
+replacing macro calls with macro bodies and producing a pure `sh'
+script in the end. Instead of implementing a dedicated Autoconf macro
+expander, it is natural to use an existing general-purpose macro
+language, such as M4, and implement the extensions as a set of M4
+macros.
+
+
+File: autoconf.info, Node: Autoconf Language, Next: Autoconf Input Layout, Prev: Shell Script Compiler, Up: Writing Autoconf Input
+
+3.1.2 The Autoconf Language
+---------------------------
+
+The Autoconf language differs from many other computer languages
+because it treats actual code the same as plain text. Whereas in C,
+for instance, data and instructions have different syntactic status, in
+Autoconf their status is rigorously the same. Therefore, we need a
+means to distinguish literal strings from text to be expanded:
+quotation.
+
+ When calling macros that take arguments, there must not be any white
+space between the macro name and the open parenthesis.
+
+ AC_INIT ([oops], [1.0]) # incorrect
+ AC_INIT([hello], [1.0]) # good
+
+ Arguments should be enclosed within the quote characters `[' and
+`]', and be separated by commas. Any leading blanks or newlines in
+arguments are ignored, unless they are quoted. You should always quote
+an argument that might contain a macro name, comma, parenthesis, or a
+leading blank or newline. This rule applies recursively for every macro
+call, including macros called from other macros. For more details on
+quoting rules, see *note Programming in M4::.
+
+ For instance:
+
+ AC_CHECK_HEADER([stdio.h],
+ [AC_DEFINE([HAVE_STDIO_H], [1],
+ [Define to 1 if you have <stdio.h>.])],
+ [AC_MSG_ERROR([sorry, can't do anything for you])])
+
+is quoted properly. You may safely simplify its quotation to:
+
+ AC_CHECK_HEADER([stdio.h],
+ [AC_DEFINE([HAVE_STDIO_H], 1,
+ [Define to 1 if you have <stdio.h>.])],
+ [AC_MSG_ERROR([sorry, can't do anything for you])])
+
+because `1' cannot contain a macro call. Here, the argument of
+`AC_MSG_ERROR' must be quoted; otherwise, its comma would be
+interpreted as an argument separator. Also, the second and third
+arguments of `AC_CHECK_HEADER' must be quoted, since they contain macro
+calls. The three arguments `HAVE_STDIO_H', `stdio.h', and `Define to 1
+if you have <stdio.h>.' do not need quoting, but if you unwisely
+defined a macro with a name like `Define' or `stdio' then they would
+need quoting. Cautious Autoconf users would keep the quotes, but many
+Autoconf users find such precautions annoying, and would rewrite the
+example as follows:
+
+ AC_CHECK_HEADER(stdio.h,
+ [AC_DEFINE(HAVE_STDIO_H, 1,
+ [Define to 1 if you have <stdio.h>.])],
+ [AC_MSG_ERROR([sorry, can't do anything for you])])
+
+This is safe, so long as you adopt good naming conventions and do not
+define macros with names like `HAVE_STDIO_H', `stdio', or `h'. Though
+it is also safe here to omit the quotes around `Define to 1 if you have
+<stdio.h>.' this is not recommended, as message strings are more likely
+to inadvertently contain commas.
+
+ The following example is wrong and dangerous, as it is underquoted:
+
+ AC_CHECK_HEADER(stdio.h,
+ AC_DEFINE(HAVE_STDIO_H, 1,
+ Define to 1 if you have <stdio.h>.),
+ AC_MSG_ERROR([sorry, can't do anything for you]))
+
+ In other cases, you may have to use text that also resembles a macro
+call. You must quote that text even when it is not passed as a macro
+argument. For example, these two approaches in `configure.ac' (quoting
+just the potential problems, or quoting the entire line) will protect
+your script in case autoconf ever adds a macro `AC_DC':
+
+ echo "Hard rock was here! --[AC_DC]"
+ [echo "Hard rock was here! --AC_DC"]
+
+which results in this text in `configure':
+
+ echo "Hard rock was here! --AC_DC"
+ echo "Hard rock was here! --AC_DC"
+
+When you use the same text in a macro argument, you must therefore have
+an extra quotation level (since one is stripped away by the macro
+substitution). In general, then, it is a good idea to _use double
+quoting for all literal string arguments_, either around just the
+problematic portions, or over the entire argument:
+
+ AC_MSG_WARN([[AC_DC] stinks --Iron Maiden])
+ AC_MSG_WARN([[AC_DC stinks --Iron Maiden]])
+
+ However, the above example triggers a warning about a possibly
+unexpanded macro when running `autoconf', because it collides with the
+namespace of macros reserved for the Autoconf language. To be really
+safe, you can use additional escaping (either a quadrigraph, or
+creative shell constructs) to silence that particular warning:
+
+ echo "Hard rock was here! --AC""_DC"
+ AC_MSG_WARN([[AC@&t@_DC stinks --Iron Maiden]])
+
+ You are now able to understand one of the constructs of Autoconf that
+has been continually misunderstood... The rule of thumb is that
+_whenever you expect macro expansion, expect quote expansion_; i.e.,
+expect one level of quotes to be lost. For instance:
+
+ AC_COMPILE_IFELSE(AC_LANG_SOURCE([char b[10];]), [],
+ [AC_MSG_ERROR([you lose])])
+
+is incorrect: here, the first argument of `AC_LANG_SOURCE' is `char
+b[10];' and is expanded once, which results in `char b10;'; and the
+`AC_LANG_SOURCE' is also expanded prior to being passed to
+`AC_COMPILE_IFELSE'. (There was an idiom common in Autoconf's past to
+address this issue via the M4 `changequote' primitive, but do not use
+it!) Let's take a closer look: the author meant the first argument to
+be understood as a literal, and therefore it must be quoted twice;
+likewise, the intermediate `AC_LANG_SOURCE' macro should be quoted once
+so that it is only expanded after the rest of the body of
+`AC_COMPILE_IFELSE' is in place:
+
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char b[10];]])], [],
+ [AC_MSG_ERROR([you lose])])
+
+Voila`, you actually produce `char b[10];' this time!
+
+ On the other hand, descriptions (e.g., the last parameter of
+`AC_DEFINE' or `AS_HELP_STRING') are not literals--they are subject to
+line breaking, for example--and should not be double quoted. Even if
+these descriptions are short and are not actually broken, double
+quoting them yields weird results.
+
+ Some macros take optional arguments, which this documentation
+represents as [ARG] (not to be confused with the quote characters).
+You may just leave them empty, or use `[]' to make the emptiness of the
+argument explicit, or you may simply omit the trailing commas. The
+three lines below are equivalent:
+
+ AC_CHECK_HEADERS([stdio.h], [], [], [])
+ AC_CHECK_HEADERS([stdio.h],,,)
+ AC_CHECK_HEADERS([stdio.h])
+
+ It is best to put each macro call on its own line in `configure.ac'.
+Most of the macros don't add extra newlines; they rely on the newline
+after the macro call to terminate the commands. This approach makes
+the generated `configure' script a little easier to read by not
+inserting lots of blank lines. It is generally safe to set shell
+variables on the same line as a macro call, because the shell allows
+assignments without intervening newlines.
+
+ You can include comments in `configure.ac' files by starting them
+with the `#'. For example, it is helpful to begin `configure.ac' files
+with a line like this:
+
+ # Process this file with autoconf to produce a configure script.
+
+
+File: autoconf.info, Node: Autoconf Input Layout, Prev: Autoconf Language, Up: Writing Autoconf Input
+
+3.1.3 Standard `configure.ac' Layout
+------------------------------------
+
+The order in which `configure.ac' calls the Autoconf macros is not
+important, with a few exceptions. Every `configure.ac' must contain a
+call to `AC_INIT' before the checks, and a call to `AC_OUTPUT' at the
+end (*note Output::). Additionally, some macros rely on other macros
+having been called first, because they check previously set values of
+some variables to decide what to do. These macros are noted in the
+individual descriptions (*note Existing Tests::), and they also warn
+you when `configure' is created if they are called out of order.
+
+ To encourage consistency, here is a suggested order for calling the
+Autoconf macros. Generally speaking, the things near the end of this
+list are those that could depend on things earlier in it. For example,
+library functions could be affected by types and libraries.
+
+ Autoconf requirements
+ `AC_INIT(PACKAGE, VERSION, BUG-REPORT-ADDRESS)'
+ information on the package
+ checks for programs
+ checks for libraries
+ checks for header files
+ checks for types
+ checks for structures
+ checks for compiler characteristics
+ checks for library functions
+ checks for system services
+ `AC_CONFIG_FILES([FILE...])'
+ `AC_OUTPUT'
+
+
+File: autoconf.info, Node: autoscan Invocation, Next: ifnames Invocation, Prev: Writing Autoconf Input, Up: Making configure Scripts
+
+3.2 Using `autoscan' to Create `configure.ac'
+=============================================
+
+The `autoscan' program can help you create and/or maintain a
+`configure.ac' file for a software package. `autoscan' examines source
+files in the directory tree rooted at a directory given as a command
+line argument, or the current directory if none is given. It searches
+the source files for common portability problems and creates a file
+`configure.scan' which is a preliminary `configure.ac' for that
+package, and checks a possibly existing `configure.ac' for completeness.
+
+ When using `autoscan' to create a `configure.ac', you should
+manually examine `configure.scan' before renaming it to `configure.ac';
+it probably needs some adjustments. Occasionally, `autoscan' outputs a
+macro in the wrong order relative to another macro, so that `autoconf'
+produces a warning; you need to move such macros manually. Also, if
+you want the package to use a configuration header file, you must add a
+call to `AC_CONFIG_HEADERS' (*note Configuration Headers::). You might
+also have to change or add some `#if' directives to your program in
+order to make it work with Autoconf (*note ifnames Invocation::, for
+information about a program that can help with that job).
+
+ When using `autoscan' to maintain a `configure.ac', simply consider
+adding its suggestions. The file `autoscan.log' contains detailed
+information on why a macro is requested.
+
+ `autoscan' uses several data files (installed along with Autoconf)
+to determine which macros to output when it finds particular symbols in
+a package's source files. These data files all have the same format:
+each line consists of a symbol, one or more blanks, and the Autoconf
+macro to output if that symbol is encountered. Lines starting with `#'
+are comments.
+
+ `autoscan' accepts the following options:
+
+`--help'
+`-h'
+ Print a summary of the command line options and exit.
+
+`--version'
+`-V'
+ Print the version number of Autoconf and exit.
+
+`--verbose'
+`-v'
+ Print the names of the files it examines and the potentially
+ interesting symbols it finds in them. This output can be
+ voluminous.
+
+`--debug'
+`-d'
+ Don't remove temporary files.
+
+`--include=DIR'
+`-I DIR'
+ Append DIR to the include path. Multiple invocations accumulate.
+
+`--prepend-include=DIR'
+`-B DIR'
+ Prepend DIR to the include path. Multiple invocations accumulate.
+
+
+File: autoconf.info, Node: ifnames Invocation, Next: autoconf Invocation, Prev: autoscan Invocation, Up: Making configure Scripts
+
+3.3 Using `ifnames' to List Conditionals
+========================================
+
+`ifnames' can help you write `configure.ac' for a software package. It
+prints the identifiers that the package already uses in C preprocessor
+conditionals. If a package has already been set up to have some
+portability, `ifnames' can thus help you figure out what its
+`configure' needs to check for. It may help fill in some gaps in a
+`configure.ac' generated by `autoscan' (*note autoscan Invocation::).
+
+ `ifnames' scans all of the C source files named on the command line
+(or the standard input, if none are given) and writes to the standard
+output a sorted list of all the identifiers that appear in those files
+in `#if', `#elif', `#ifdef', or `#ifndef' directives. It prints each
+identifier on a line, followed by a space-separated list of the files
+in which that identifier occurs.
+
+`ifnames' accepts the following options:
+
+`--help'
+`-h'
+ Print a summary of the command line options and exit.
+
+`--version'
+`-V'
+ Print the version number of Autoconf and exit.
+
+
+File: autoconf.info, Node: autoconf Invocation, Next: autoreconf Invocation, Prev: ifnames Invocation, Up: Making configure Scripts
+
+3.4 Using `autoconf' to Create `configure'
+==========================================
+
+To create `configure' from `configure.ac', run the `autoconf' program
+with no arguments. `autoconf' processes `configure.ac' with the M4
+macro processor, using the Autoconf macros. If you give `autoconf' an
+argument, it reads that file instead of `configure.ac' and writes the
+configuration script to the standard output instead of to `configure'.
+If you give `autoconf' the argument `-', it reads from the standard
+input instead of `configure.ac' and writes the configuration script to
+the standard output.
+
+ The Autoconf macros are defined in several files. Some of the files
+are distributed with Autoconf; `autoconf' reads them first. Then it
+looks for the optional file `acsite.m4' in the directory that contains
+the distributed Autoconf macro files, and for the optional file
+`aclocal.m4' in the current directory. Those files can contain your
+site's or the package's own Autoconf macro definitions (*note Writing
+Autoconf Macros::, for more information). If a macro is defined in
+more than one of the files that `autoconf' reads, the last definition
+it reads overrides the earlier ones.
+
+ `autoconf' accepts the following options:
+
+`--help'
+`-h'
+ Print a summary of the command line options and exit.
+
+`--version'
+`-V'
+ Print the version number of Autoconf and exit.
+
+`--verbose'
+`-v'
+ Report processing steps.
+
+`--debug'
+`-d'
+ Don't remove the temporary files.
+
+`--force'
+`-f'
+ Remake `configure' even if newer than its input files.
+
+`--include=DIR'
+`-I DIR'
+ Append DIR to the include path. Multiple invocations accumulate.
+
+`--prepend-include=DIR'
+`-B DIR'
+ Prepend DIR to the include path. Multiple invocations accumulate.
+
+`--output=FILE'
+`-o FILE'
+ Save output (script or trace) to FILE. The file `-' stands for
+ the standard output.
+
+`--warnings=CATEGORY'
+`-W CATEGORY'
+ Report the warnings related to CATEGORY (which can actually be a
+ comma separated list). *Note Reporting Messages::, macro
+ `AC_DIAGNOSE', for a comprehensive list of categories. Special
+ values include:
+
+ `all'
+ report all the warnings
+
+ `none'
+ report none
+
+ `error'
+ treats warnings as errors
+
+ `no-CATEGORY'
+ disable warnings falling into CATEGORY
+
+ Warnings about `syntax' are enabled by default, and the environment
+ variable `WARNINGS', a comma separated list of categories, is
+ honored as well. Passing `-W CATEGORY' actually behaves as if you
+ had passed `--warnings syntax,$WARNINGS,CATEGORY'. To disable the
+ defaults and `WARNINGS', and then enable warnings about obsolete
+ constructs, use `-W none,obsolete'.
+
+ Because `autoconf' uses `autom4te' behind the scenes, it displays
+ a back trace for errors, but not for warnings; if you want them,
+ just pass `-W error'. *Note autom4te Invocation::, for some
+ examples.
+
+`--trace=MACRO[:FORMAT]'
+`-t MACRO[:FORMAT]'
+ Do not create the `configure' script, but list the calls to MACRO
+ according to the FORMAT. Multiple `--trace' arguments can be used
+ to list several macros. Multiple `--trace' arguments for a single
+ macro are not cumulative; instead, you should just make FORMAT as
+ long as needed.
+
+ The FORMAT is a regular string, with newlines if desired, and
+ several special escape codes. It defaults to `$f:$l:$n:$%'; see
+ *note autom4te Invocation::, for details on the FORMAT.
+
+`--initialization'
+`-i'
+ By default, `--trace' does not trace the initialization of the
+ Autoconf macros (typically the `AC_DEFUN' definitions). This
+ results in a noticeable speedup, but can be disabled by this
+ option.
+
+ It is often necessary to check the content of a `configure.ac' file,
+but parsing it yourself is extremely fragile and error-prone. It is
+suggested that you rely upon `--trace' to scan `configure.ac'. For
+instance, to find the list of variables that are substituted, use:
+
+ $ autoconf -t AC_SUBST
+ configure.ac:2:AC_SUBST:ECHO_C
+ configure.ac:2:AC_SUBST:ECHO_N
+ configure.ac:2:AC_SUBST:ECHO_T
+ More traces deleted
+
+The example below highlights the difference between `$@', `$*', and
+`$%'.
+
+ $ cat configure.ac
+ AC_DEFINE(This, is, [an
+ [example]])
+ $ autoconf -t 'AC_DEFINE:@: $@
+ *: $*
+ %: $%'
+ @: [This],[is],[an
+ [example]]
+ *: This,is,an
+ [example]
+ %: This:is:an [example]
+
+The FORMAT gives you a lot of freedom:
+
+ $ autoconf -t 'AC_SUBST:$$ac_subst{"$1"} = "$f:$l";'
+ $ac_subst{"ECHO_C"} = "configure.ac:2";
+ $ac_subst{"ECHO_N"} = "configure.ac:2";
+ $ac_subst{"ECHO_T"} = "configure.ac:2";
+ More traces deleted
+
+A long SEPARATOR can be used to improve the readability of complex
+structures, and to ease their parsing (for instance when no single
+character is suitable as a separator):
+
+ $ autoconf -t 'AM_MISSING_PROG:${|:::::|}*'
+ ACLOCAL|:::::|aclocal|:::::|$missing_dir
+ AUTOCONF|:::::|autoconf|:::::|$missing_dir
+ AUTOMAKE|:::::|automake|:::::|$missing_dir
+ More traces deleted
+
+
+File: autoconf.info, Node: autoreconf Invocation, Prev: autoconf Invocation, Up: Making configure Scripts
+
+3.5 Using `autoreconf' to Update `configure' Scripts
+====================================================
+
+Installing the various components of the GNU Build System can be
+tedious: running `autopoint' for Gettext, `automake' for `Makefile.in'
+etc. in each directory. It may be needed either because some tools
+such as `automake' have been updated on your system, or because some of
+the sources such as `configure.ac' have been updated, or finally,
+simply in order to install the GNU Build System in a fresh tree.
+
+ `autoreconf' runs `autoconf', `autoheader', `aclocal', `automake',
+`libtoolize', and `autopoint' (when appropriate) repeatedly to update
+the GNU Build System in the specified directories and their
+subdirectories (*note Subdirectories::). By default, it only remakes
+those files that are older than their sources. The environment
+variables `AUTOM4TE', `AUTOCONF', `AUTOHEADER', `AUTOMAKE', `ACLOCAL',
+`AUTOPOINT', `LIBTOOLIZE', `M4', and `MAKE' may be used to override the
+invocation of the respective tools.
+
+ If you install a new version of some tool, you can make `autoreconf'
+remake _all_ of the files by giving it the `--force' option.
+
+ *Note Automatic Remaking::, for Make rules to automatically rebuild
+`configure' scripts when their source files change. That method
+handles the timestamps of configuration header templates properly, but
+does not pass `--autoconf-dir=DIR' or `--localdir=DIR'.
+
+ Gettext supplies the `autopoint' command to add translation
+infrastructure to a source package. If you use `autopoint', your
+`configure.ac' should invoke both `AM_GNU_GETTEXT' and
+`AM_GNU_GETTEXT_VERSION(GETTEXT-VERSION)'. *Note Invoking the
+`autopoint' Program: (gettext)autopoint Invocation, for further details.
+
+`autoreconf' accepts the following options:
+
+`--help'
+`-h'
+ Print a summary of the command line options and exit.
+
+`--version'
+`-V'
+ Print the version number of Autoconf and exit.
+
+`--verbose'
+`-v'
+ Print the name of each directory `autoreconf' examines and the
+ commands it runs. If given two or more times, pass `--verbose' to
+ subordinate tools that support it.
+
+`--debug'
+`-d'
+ Don't remove the temporary files.
+
+`--force'
+`-f'
+ Remake even `configure' scripts and configuration headers that are
+ newer than their input files (`configure.ac' and, if present,
+ `aclocal.m4').
+
+`--install'
+`-i'
+ Install the missing auxiliary files in the package. By default,
+ files are copied; this can be changed with `--symlink'.
+
+ If deemed appropriate, this option triggers calls to `automake
+ --add-missing', `libtoolize', `autopoint', etc.
+
+`--no-recursive'
+ Do not rebuild files in subdirectories to configure (see *note
+ Subdirectories::, macro `AC_CONFIG_SUBDIRS').
+
+`--symlink'
+`-s'
+ When used with `--install', install symbolic links to the missing
+ auxiliary files instead of copying them.
+
+`--make'
+`-m'
+ When the directories were configured, update the configuration by
+ running `./config.status --recheck && ./config.status', and then
+ run `make'.
+
+`--include=DIR'
+`-I DIR'
+ Append DIR to the include path. Multiple invocations accumulate.
+ Passed on to `aclocal', `autoconf' and `autoheader' internally.
+
+`--prepend-include=DIR'
+`-B DIR'
+ Prepend DIR to the include path. Multiple invocations accumulate.
+ Passed on to `autoconf' and `autoheader' internally.
+
+`--warnings=CATEGORY'
+`-W CATEGORY'
+ Report the warnings related to CATEGORY (which can actually be a
+ comma separated list).
+
+ `cross'
+ related to cross compilation issues.
+
+ `obsolete'
+ report the uses of obsolete constructs.
+
+ `portability'
+ portability issues
+
+ `syntax'
+ dubious syntactic constructs.
+
+ `all'
+ report all the warnings
+
+ `none'
+ report none
+
+ `error'
+ treats warnings as errors
+
+ `no-CATEGORY'
+ disable warnings falling into CATEGORY
+
+ Warnings about `syntax' are enabled by default, and the environment
+ variable `WARNINGS', a comma separated list of categories, is
+ honored as well. Passing `-W CATEGORY' actually behaves as if you
+ had passed `--warnings syntax,$WARNINGS,CATEGORY'. To disable the
+ defaults and `WARNINGS', and then enable warnings about obsolete
+ constructs, use `-W none,obsolete'.
+
+ If you want `autoreconf' to pass flags that are not listed here on
+to `aclocal', set `ACLOCAL_AMFLAGS' in your `Makefile.am'. Due to a
+limitation in the Autoconf implementation these flags currently must be
+set on a single line in `Makefile.am', without any backslash-newlines.
+
+
+File: autoconf.info, Node: Setup, Next: Existing Tests, Prev: Making configure Scripts, Up: Top
+
+4 Initialization and Output Files
+*********************************
+
+Autoconf-generated `configure' scripts need some information about how
+to initialize, such as how to find the package's source files and about
+the output files to produce. The following sections describe the
+initialization and the creation of output files.
+
+* Menu:
+
+* Initializing configure:: Option processing etc.
+* Versioning:: Dealing with Autoconf versions
+* Notices:: Copyright, version numbers in `configure'
+* Input:: Where Autoconf should find files
+* Output:: Outputting results from the configuration
+* Configuration Actions:: Preparing the output based on results
+* Configuration Files:: Creating output files
+* Makefile Substitutions:: Using output variables in makefiles
+* Configuration Headers:: Creating a configuration header file
+* Configuration Commands:: Running arbitrary instantiation commands
+* Configuration Links:: Links depending on the configuration
+* Subdirectories:: Configuring independent packages together
+* Default Prefix:: Changing the default installation prefix
+
+
+File: autoconf.info, Node: Initializing configure, Next: Versioning, Up: Setup
+
+4.1 Initializing `configure'
+============================
+
+Every `configure' script must call `AC_INIT' before doing anything else
+that produces output. Calls to silent macros, such as `AC_DEFUN', may
+also occur prior to `AC_INIT', although these are generally used via
+`aclocal.m4', since that is implicitly included before the start of
+`configure.ac'. The only other required macro is `AC_OUTPUT' (*note
+Output::).
+
+ -- Macro: AC_INIT (PACKAGE, VERSION, [BUG-REPORT], [TARNAME], [URL])
+ Process any command-line arguments and perform initialization and
+ verification.
+
+ Set the name of the PACKAGE and its VERSION. These are typically
+ used in `--version' support, including that of `configure'. The
+ optional argument BUG-REPORT should be the email to which users
+ should send bug reports. The package TARNAME differs from
+ PACKAGE: the latter designates the full package name (e.g., `GNU
+ Autoconf'), while the former is meant for distribution tar ball
+ names (e.g., `autoconf'). It defaults to PACKAGE with `GNU '
+ stripped, lower-cased, and all characters other than alphanumerics
+ and underscores are changed to `-'. If provided, URL should be
+ the home page for the package.
+
+ The arguments of `AC_INIT' must be static, i.e., there should not
+ be any shell computation, quotes, or newlines, but they can be
+ computed by M4. This is because the package information strings
+ are expanded at M4 time into several contexts, and must give the
+ same text at shell time whether used in single-quoted strings,
+ double-quoted strings, quoted here-documents, or unquoted
+ here-documents. It is permissible to use `m4_esyscmd' or
+ `m4_esyscmd_s' for computing a version string that changes with
+ every commit to a version control system (in fact, Autoconf does
+ just that, for all builds of the development tree made between
+ releases).
+
+ The following M4 macros (e.g., `AC_PACKAGE_NAME'), output variables
+ (e.g., `PACKAGE_NAME'), and preprocessor symbols (e.g.,
+ `PACKAGE_NAME'), are defined by `AC_INIT':
+
+ `AC_PACKAGE_NAME', `PACKAGE_NAME'
+ Exactly PACKAGE.
+
+ `AC_PACKAGE_TARNAME', `PACKAGE_TARNAME'
+ Exactly TARNAME, possibly generated from PACKAGE.
+
+ `AC_PACKAGE_VERSION', `PACKAGE_VERSION'
+ Exactly VERSION.
+
+ `AC_PACKAGE_STRING', `PACKAGE_STRING'
+ Exactly `PACKAGE VERSION'.
+
+ `AC_PACKAGE_BUGREPORT', `PACKAGE_BUGREPORT'
+ Exactly BUG-REPORT, if one was provided. Typically an email
+ address, or URL to a bug management web page.
+
+ `AC_PACKAGE_URL', `PACKAGE_URL'
+ Exactly URL, if one was provided. If URL was empty, but
+ PACKAGE begins with `GNU ', then this defaults to
+ `http://www.gnu.org/software/TARNAME/', otherwise, no URL is
+ assumed.
+
+ If your `configure' script does its own option processing, it should
+inspect `$@' or `$*' immediately after calling `AC_INIT', because other
+Autoconf macros liberally use the `set' command to process strings, and
+this has the side effect of updating `$@' and `$*'. However, we
+suggest that you use standard macros like `AC_ARG_ENABLE' instead of
+attempting to implement your own option processing. *Note Site
+Configuration::.
+
+
+File: autoconf.info, Node: Versioning, Next: Notices, Prev: Initializing configure, Up: Setup
+
+4.2 Dealing with Autoconf versions
+==================================
+
+The following optional macros can be used to help choose the minimum
+version of Autoconf that can successfully compile a given
+`configure.ac'.
+
+ -- Macro: AC_PREREQ (VERSION)
+ Ensure that a recent enough version of Autoconf is being used. If
+ the version of Autoconf being used to create `configure' is
+ earlier than VERSION, print an error message to the standard error
+ output and exit with failure (exit status is 63). For example:
+
+ AC_PREREQ([2.69])
+
+ This macro may be used before `AC_INIT'.
+
+ -- Macro: AC_AUTOCONF_VERSION
+ This macro was introduced in Autoconf 2.62. It identifies the
+ version of Autoconf that is currently parsing the input file, in a
+ format suitable for `m4_version_compare' (*note
+ m4_version_compare::); in other words, for this release of
+ Autoconf, its value is `2.69'. One potential use of this macro is
+ for writing conditional fallbacks based on when a feature was
+ added to Autoconf, rather than using `AC_PREREQ' to require the
+ newer version of Autoconf. However, remember that the Autoconf
+ philosophy favors feature checks over version checks.
+
+ You should not expand this macro directly; use
+ `m4_defn([AC_AUTOCONF_VERSION])' instead. This is because some
+ users might have a beta version of Autoconf installed, with
+ arbitrary letters included in its version string. This means it
+ is possible for the version string to contain the name of a
+ defined macro, such that expanding `AC_AUTOCONF_VERSION' would
+ trigger the expansion of that macro during rescanning, and change
+ the version string to be different than what you intended to check.
+
+
+File: autoconf.info, Node: Notices, Next: Input, Prev: Versioning, Up: Setup
+
+4.3 Notices in `configure'
+==========================
+
+The following macros manage version numbers for `configure' scripts.
+Using them is optional.
+
+ -- Macro: AC_COPYRIGHT (COPYRIGHT-NOTICE)
+ State that, in addition to the Free Software Foundation's
+ copyright on the Autoconf macros, parts of your `configure' are
+ covered by the COPYRIGHT-NOTICE.
+
+ The COPYRIGHT-NOTICE shows up in both the head of `configure' and
+ in `configure --version'.
+
+ -- Macro: AC_REVISION (REVISION-INFO)
+ Copy revision stamp REVISION-INFO into the `configure' script,
+ with any dollar signs or double-quotes removed. This macro lets
+ you put a revision stamp from `configure.ac' into `configure'
+ without RCS or CVS changing it when you check in `configure'.
+ That way, you can determine easily which revision of
+ `configure.ac' a particular `configure' corresponds to.
+
+ For example, this line in `configure.ac':
+
+ AC_REVISION([$Revision: 1.30 $])
+
+ produces this in `configure':
+
+ #!/bin/sh
+ # From configure.ac Revision: 1.30
+
+
+File: autoconf.info, Node: Input, Next: Output, Prev: Notices, Up: Setup
+
+4.4 Finding `configure' Input
+=============================
+
+ -- Macro: AC_CONFIG_SRCDIR (UNIQUE-FILE-IN-SOURCE-DIR)
+ UNIQUE-FILE-IN-SOURCE-DIR is some file that is in the package's
+ source directory; `configure' checks for this file's existence to
+ make sure that the directory that it is told contains the source
+ code in fact does. Occasionally people accidentally specify the
+ wrong directory with `--srcdir'; this is a safety check. *Note
+ configure Invocation::, for more information.
+
+ Packages that do manual configuration or use the `install' program
+might need to tell `configure' where to find some other shell scripts
+by calling `AC_CONFIG_AUX_DIR', though the default places it looks are
+correct for most cases.
+
+ -- Macro: AC_CONFIG_AUX_DIR (DIR)
+ Use the auxiliary build tools (e.g., `install-sh', `config.sub',
+ `config.guess', Cygnus `configure', Automake and Libtool scripts,
+ etc.) that are in directory DIR. These are auxiliary files used
+ in configuration. DIR can be either absolute or relative to
+ `SRCDIR'. The default is `SRCDIR' or `SRCDIR/..' or
+ `SRCDIR/../..', whichever is the first that contains `install-sh'.
+ The other files are not checked for, so that using
+ `AC_PROG_INSTALL' does not automatically require distributing the
+ other auxiliary files. It checks for `install.sh' also, but that
+ name is obsolete because some `make' have a rule that creates
+ `install' from it if there is no makefile.
+
+ The auxiliary directory is commonly named `build-aux'. If you
+ need portability to DOS variants, do not name the auxiliary
+ directory `aux'. *Note File System Conventions::.
+
+ -- Macro: AC_REQUIRE_AUX_FILE (FILE)
+ Declares that FILE is expected in the directory defined above. In
+ Autoconf proper, this macro does nothing: its sole purpose is to be
+ traced by third-party tools to produce a list of expected auxiliary
+ files. For instance it is called by macros like `AC_PROG_INSTALL'
+ (*note Particular Programs::) or `AC_CANONICAL_BUILD' (*note
+ Canonicalizing::) to register the auxiliary files they need.
+
+ Similarly, packages that use `aclocal' should declare where local
+macros can be found using `AC_CONFIG_MACRO_DIR'.
+
+ -- Macro: AC_CONFIG_MACRO_DIR (DIR)
+ Specify DIR as the location of additional local Autoconf macros.
+ This macro is intended for use by future versions of commands like
+ `autoreconf' that trace macro calls. It should be called directly
+ from `configure.ac' so that tools that install macros for
+ `aclocal' can find the macros' declarations.
+
+ Note that if you use `aclocal' from Automake to generate
+ `aclocal.m4', you must also set `ACLOCAL_AMFLAGS = -I DIR' in your
+ top-level `Makefile.am'. Due to a limitation in the Autoconf
+ implementation of `autoreconf', these include directives currently
+ must be set on a single line in `Makefile.am', without any
+ backslash-newlines.
+
+
+File: autoconf.info, Node: Output, Next: Configuration Actions, Prev: Input, Up: Setup
+
+4.5 Outputting Files
+====================
+
+Every Autoconf script, e.g., `configure.ac', should finish by calling
+`AC_OUTPUT'. That is the macro that generates and runs
+`config.status', which in turn creates the makefiles and any other
+files resulting from configuration. This is the only required macro
+besides `AC_INIT' (*note Input::).
+
+ -- Macro: AC_OUTPUT
+ Generate `config.status' and launch it. Call this macro once, at
+ the end of `configure.ac'.
+
+ `config.status' performs all the configuration actions: all the
+ output files (see *note Configuration Files::, macro
+ `AC_CONFIG_FILES'), header files (see *note Configuration
+ Headers::, macro `AC_CONFIG_HEADERS'), commands (see *note
+ Configuration Commands::, macro `AC_CONFIG_COMMANDS'), links (see
+ *note Configuration Links::, macro `AC_CONFIG_LINKS'),
+ subdirectories to configure (see *note Subdirectories::, macro
+ `AC_CONFIG_SUBDIRS') are honored.
+
+ The location of your `AC_OUTPUT' invocation is the exact point
+ where configuration actions are taken: any code afterwards is
+ executed by `configure' once `config.status' was run. If you want
+ to bind actions to `config.status' itself (independently of
+ whether `configure' is being run), see *note Running Arbitrary
+ Configuration Commands: Configuration Commands.
+
+ Historically, the usage of `AC_OUTPUT' was somewhat different.
+*Note Obsolete Macros::, for a description of the arguments that
+`AC_OUTPUT' used to support.
+
+ If you run `make' in subdirectories, you should run it using the
+`make' variable `MAKE'. Most versions of `make' set `MAKE' to the name
+of the `make' program plus any options it was given. (But many do not
+include in it the values of any variables set on the command line, so
+those are not passed on automatically.) Some old versions of `make' do
+not set this variable. The following macro allows you to use it even
+with those versions.
+
+ -- Macro: AC_PROG_MAKE_SET
+ If the Make command, `$MAKE' if set or else `make', predefines
+ `$(MAKE)', define output variable `SET_MAKE' to be empty.
+ Otherwise, define `SET_MAKE' to a macro definition that sets
+ `$(MAKE)', such as `MAKE=make'. Calls `AC_SUBST' for `SET_MAKE'.
+
+ If you use this macro, place a line like this in each `Makefile.in'
+that runs `MAKE' on other directories:
+
+ @SET_MAKE@
+
+
+File: autoconf.info, Node: Configuration Actions, Next: Configuration Files, Prev: Output, Up: Setup
+
+4.6 Performing Configuration Actions
+====================================
+
+`configure' is designed so that it appears to do everything itself, but
+there is actually a hidden slave: `config.status'. `configure' is in
+charge of examining your system, but it is `config.status' that
+actually takes the proper actions based on the results of `configure'.
+The most typical task of `config.status' is to _instantiate_ files.
+
+ This section describes the common behavior of the four standard
+instantiating macros: `AC_CONFIG_FILES', `AC_CONFIG_HEADERS',
+`AC_CONFIG_COMMANDS' and `AC_CONFIG_LINKS'. They all have this
+prototype:
+
+ AC_CONFIG_ITEMS(TAG..., [COMMANDS], [INIT-CMDS])
+
+where the arguments are:
+
+TAG...
+ A blank-or-newline-separated list of tags, which are typically the
+ names of the files to instantiate.
+
+ You are encouraged to use literals as TAGS. In particular, you
+ should avoid
+
+ ... && my_foos="$my_foos fooo"
+ ... && my_foos="$my_foos foooo"
+ AC_CONFIG_ITEMS([$my_foos])
+
+ and use this instead:
+
+ ... && AC_CONFIG_ITEMS([fooo])
+ ... && AC_CONFIG_ITEMS([foooo])
+
+ The macros `AC_CONFIG_FILES' and `AC_CONFIG_HEADERS' use special
+ TAG values: they may have the form `OUTPUT' or `OUTPUT:INPUTS'.
+ The file OUTPUT is instantiated from its templates, INPUTS
+ (defaulting to `OUTPUT.in').
+
+ `AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk])', for
+ example, asks for the creation of the file `Makefile' that
+ contains the expansion of the output variables in the
+ concatenation of `boiler/top.mk' and `boiler/bot.mk'.
+
+ The special value `-' might be used to denote the standard output
+ when used in OUTPUT, or the standard input when used in the
+ INPUTS. You most probably don't need to use this in
+ `configure.ac', but it is convenient when using the command line
+ interface of `./config.status', see *note config.status
+ Invocation::, for more details.
+
+ The INPUTS may be absolute or relative file names. In the latter
+ case they are first looked for in the build tree, and then in the
+ source tree. Input files should be text files, and a line length
+ below 2000 bytes should be safe.
+
+COMMANDS
+ Shell commands output literally into `config.status', and
+ associated with a tag that the user can use to tell `config.status'
+ which commands to run. The commands are run each time a TAG
+ request is given to `config.status', typically each time the file
+ `TAG' is created.
+
+ The variables set during the execution of `configure' are _not_
+ available here: you first need to set them via the INIT-CMDS.
+ Nonetheless the following variables are precomputed:
+
+ `srcdir'
+ The name of the top source directory, assuming that the
+ working directory is the top build directory. This is what
+ the `configure' option `--srcdir' sets.
+
+ `ac_top_srcdir'
+ The name of the top source directory, assuming that the
+ working directory is the current build directory.
+
+ `ac_top_build_prefix'
+ The name of the top build directory, assuming that the working
+ directory is the current build directory. It can be empty,
+ or else ends with a slash, so that you may concatenate it.
+
+ `ac_srcdir'
+ The name of the corresponding source directory, assuming that
+ the working directory is the current build directory.
+
+ `tmp'
+ The name of a temporary directory within the build tree,
+ which you can use if you need to create additional temporary
+ files. The directory is cleaned up when `config.status' is
+ done or interrupted. Please use package-specific file name
+ prefixes to avoid clashing with files that `config.status'
+ may use internally.
+
+ The "current" directory refers to the directory (or
+ pseudo-directory) containing the input part of TAGS. For
+ instance, running
+
+ AC_CONFIG_COMMANDS([deep/dir/out:in/in.in], [...], [...])
+
+ with `--srcdir=../package' produces the following values:
+
+ # Argument of --srcdir
+ srcdir='../package'
+ # Reversing deep/dir
+ ac_top_build_prefix='../../'
+ # Concatenation of $ac_top_build_prefix and srcdir
+ ac_top_srcdir='../../../package'
+ # Concatenation of $ac_top_srcdir and deep/dir
+ ac_srcdir='../../../package/deep/dir'
+
+ independently of `in/in.in'.
+
+INIT-CMDS
+ Shell commands output _unquoted_ near the beginning of
+ `config.status', and executed each time `config.status' runs
+ (regardless of the tag). Because they are unquoted, for example,
+ `$var' is output as the value of `var'. INIT-CMDS is typically
+ used by `configure' to give `config.status' some variables it
+ needs to run the COMMANDS.
+
+ You should be extremely cautious in your variable names: all the
+ INIT-CMDS share the same name space and may overwrite each other
+ in unpredictable ways. Sorry...
+
+ All these macros can be called multiple times, with different TAG
+values, of course!
+
+
+File: autoconf.info, Node: Configuration Files, Next: Makefile Substitutions, Prev: Configuration Actions, Up: Setup
+
+4.7 Creating Configuration Files
+================================
+
+Be sure to read the previous section, *note Configuration Actions::.
+
+ -- Macro: AC_CONFIG_FILES (FILE..., [CMDS], [INIT-CMDS])
+ Make `AC_OUTPUT' create each `FILE' by copying an input file (by
+ default `FILE.in'), substituting the output variable values. This
+ macro is one of the instantiating macros; see *note Configuration
+ Actions::. *Note Makefile Substitutions::, for more information
+ on using output variables. *Note Setting Output Variables::, for
+ more information on creating them. This macro creates the
+ directory that the file is in if it doesn't exist. Usually,
+ makefiles are created this way, but other files, such as
+ `.gdbinit', can be specified as well.
+
+ Typical calls to `AC_CONFIG_FILES' look like this:
+
+ AC_CONFIG_FILES([Makefile src/Makefile man/Makefile X/Imakefile])
+ AC_CONFIG_FILES([autoconf], [chmod +x autoconf])
+
+ You can override an input file name by appending to FILE a
+ colon-separated list of input files. Examples:
+
+ AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk]
+ [lib/Makefile:boiler/lib.mk])
+
+ Doing this allows you to keep your file names acceptable to DOS
+ variants, or to prepend and/or append boilerplate to the file.
+
+
+File: autoconf.info, Node: Makefile Substitutions, Next: Configuration Headers, Prev: Configuration Files, Up: Setup
+
+4.8 Substitutions in Makefiles
+==============================
+
+Each subdirectory in a distribution that contains something to be
+compiled or installed should come with a file `Makefile.in', from which
+`configure' creates a file `Makefile' in that directory. To create
+`Makefile', `configure' performs a simple variable substitution,
+replacing occurrences of `@VARIABLE@' in `Makefile.in' with the value
+that `configure' has determined for that variable. Variables that are
+substituted into output files in this way are called "output
+variables". They are ordinary shell variables that are set in
+`configure'. To make `configure' substitute a particular variable into
+the output files, the macro `AC_SUBST' must be called with that
+variable name as an argument. Any occurrences of `@VARIABLE@' for
+other variables are left unchanged. *Note Setting Output Variables::,
+for more information on creating output variables with `AC_SUBST'.
+
+ A software package that uses a `configure' script should be
+distributed with a file `Makefile.in', but no makefile; that way, the
+user has to properly configure the package for the local system before
+compiling it.
+
+ *Note Makefile Conventions: (standards)Makefile Conventions, for
+more information on what to put in makefiles.
+
+* Menu:
+
+* Preset Output Variables:: Output variables that are always set
+* Installation Directory Variables:: Other preset output variables
+* Changed Directory Variables:: Warnings about `datarootdir'
+* Build Directories:: Supporting multiple concurrent compiles
+* Automatic Remaking:: Makefile rules for configuring
+
+
+File: autoconf.info, Node: Preset Output Variables, Next: Installation Directory Variables, Up: Makefile Substitutions
+
+4.8.1 Preset Output Variables
+-----------------------------
+
+Some output variables are preset by the Autoconf macros. Some of the
+Autoconf macros set additional output variables, which are mentioned in
+the descriptions for those macros. *Note Output Variable Index::, for a
+complete list of output variables. *Note Installation Directory
+Variables::, for the list of the preset ones related to installation
+directories. Below are listed the other preset ones, many of which are
+precious variables (*note Setting Output Variables::, `AC_ARG_VAR').
+
+ The preset variables which are available during `config.status'
+(*note Configuration Actions::) may also be used during `configure'
+tests. For example, it is permissible to reference `$srcdir' when
+constructing a list of directories to pass via option `-I' during a
+compiler feature check. When used in this manner, coupled with the
+fact that `configure' is always run from the top build directory, it is
+sufficient to use just `$srcdir' instead of `$top_srcdir'.
+
+ -- Variable: CFLAGS
+ Debugging and optimization options for the C compiler. If it is
+ not set in the environment when `configure' runs, the default
+ value is set when you call `AC_PROG_CC' (or empty if you don't).
+ `configure' uses this variable when compiling or linking programs
+ to test for C features.
+
+ If a compiler option affects only the behavior of the preprocessor
+ (e.g., `-DNAME'), it should be put into `CPPFLAGS' instead. If it
+ affects only the linker (e.g., `-LDIRECTORY'), it should be put
+ into `LDFLAGS' instead. If it affects only the compiler proper,
+ `CFLAGS' is the natural home for it. If an option affects
+ multiple phases of the compiler, though, matters get tricky. One
+ approach to put such options directly into `CC', e.g., `CC='gcc
+ -m64''. Another is to put them into both `CPPFLAGS' and
+ `LDFLAGS', but not into `CFLAGS'.
+
+ However, remember that some `Makefile' variables are reserved by
+ the GNU Coding Standards for the use of the "user"--the person
+ building the package. For instance, `CFLAGS' is one such variable.
+
+ Sometimes package developers are tempted to set user variables
+ such as `CFLAGS' because it appears to make their job easier.
+ However, the package itself should never set a user variable,
+ particularly not to include switches that are required for proper
+ compilation of the package. Since these variables are documented
+ as being for the package builder, that person rightfully expects
+ to be able to override any of these variables at build time. If
+ the package developer needs to add switches without interfering
+ with the user, the proper way to do that is to introduce an
+ additional variable. Automake makes this easy by introducing
+ `AM_CFLAGS' (*note Flag Variables Ordering: (automake)Flag
+ Variables Ordering.), but the concept is the same even if Automake
+ is not used.
+
+ -- Variable: configure_input
+ A comment saying that the file was generated automatically by
+ `configure' and giving the name of the input file. `AC_OUTPUT'
+ adds a comment line containing this variable to the top of every
+ makefile it creates. For other files, you should reference this
+ variable in a comment at the top of each input file. For example,
+ an input shell script should begin like this:
+
+ #!/bin/sh
+ # @configure_input@
+
+ The presence of that line also reminds people editing the file
+ that it needs to be processed by `configure' in order to be used.
+
+ -- Variable: CPPFLAGS
+ Preprocessor options for the C, C++, Objective C, and Objective C++
+ preprocessors and compilers. If it is not set in the environment
+ when `configure' runs, the default value is empty. `configure'
+ uses this variable when preprocessing or compiling programs to
+ test for C, C++, Objective C, and Objective C++ features.
+
+ This variable's contents should contain options like `-I', `-D',
+ and `-U' that affect only the behavior of the preprocessor.
+ Please see the explanation of `CFLAGS' for what you can do if an
+ option affects other phases of the compiler as well.
+
+ Currently, `configure' always links as part of a single invocation
+ of the compiler that also preprocesses and compiles, so it uses
+ this variable also when linking programs. However, it is unwise to
+ depend on this behavior because the GNU Coding Standards do not
+ require it and many packages do not use `CPPFLAGS' when linking
+ programs.
+
+ *Note Special Chars in Variables::, for limitations that `CPPFLAGS'
+ might run into.
+
+ -- Variable: CXXFLAGS
+ Debugging and optimization options for the C++ compiler. It acts
+ like `CFLAGS', but for C++ instead of C.
+
+ -- Variable: DEFS
+ `-D' options to pass to the C compiler. If `AC_CONFIG_HEADERS' is
+ called, `configure' replaces `@DEFS@' with `-DHAVE_CONFIG_H'
+ instead (*note Configuration Headers::). This variable is not
+ defined while `configure' is performing its tests, only when
+ creating the output files. *Note Setting Output Variables::, for
+ how to check the results of previous tests.
+
+ -- Variable: ECHO_C
+ -- Variable: ECHO_N
+ -- Variable: ECHO_T
+ How does one suppress the trailing newline from `echo' for
+ question-answer message pairs? These variables provide a way:
+
+ echo $ECHO_N "And the winner is... $ECHO_C"
+ sleep 100000000000
+ echo "${ECHO_T}dead."
+
+ Some old and uncommon `echo' implementations offer no means to
+ achieve this, in which case `ECHO_T' is set to tab. You might not
+ want to use it.
+
+ -- Variable: ERLCFLAGS
+ Debugging and optimization options for the Erlang compiler. If it
+ is not set in the environment when `configure' runs, the default
+ value is empty. `configure' uses this variable when compiling
+ programs to test for Erlang features.
+
+ -- Variable: FCFLAGS
+ Debugging and optimization options for the Fortran compiler. If it
+ is not set in the environment when `configure' runs, the default
+ value is set when you call `AC_PROG_FC' (or empty if you don't).
+ `configure' uses this variable when compiling or linking programs
+ to test for Fortran features.
+
+ -- Variable: FFLAGS
+ Debugging and optimization options for the Fortran 77 compiler.
+ If it is not set in the environment when `configure' runs, the
+ default value is set when you call `AC_PROG_F77' (or empty if you
+ don't). `configure' uses this variable when compiling or linking
+ programs to test for Fortran 77 features.
+
+ -- Variable: LDFLAGS
+ Options for the linker. If it is not set in the environment when
+ `configure' runs, the default value is empty. `configure' uses
+ this variable when linking programs to test for C, C++, Objective
+ C, Objective C++, Fortran, and Go features.
+
+ This variable's contents should contain options like `-s' and `-L'
+ that affect only the behavior of the linker. Please see the
+ explanation of `CFLAGS' for what you can do if an option also
+ affects other phases of the compiler.
+
+ Don't use this variable to pass library names (`-l') to the
+ linker; use `LIBS' instead.
+
+ -- Variable: LIBS
+ `-l' options to pass to the linker. The default value is empty,
+ but some Autoconf macros may prepend extra libraries to this
+ variable if those libraries are found and provide necessary
+ functions, see *note Libraries::. `configure' uses this variable
+ when linking programs to test for C, C++, Objective C, Objective
+ C++, Fortran, and Go features.
+
+ -- Variable: OBJCFLAGS
+ Debugging and optimization options for the Objective C compiler.
+ It acts like `CFLAGS', but for Objective C instead of C.
+
+ -- Variable: OBJCXXFLAGS
+ Debugging and optimization options for the Objective C++ compiler.
+ It acts like `CXXFLAGS', but for Objective C++ instead of C++.
+
+ -- Variable: GOFLAGS
+ Debugging and optimization options for the Go compiler. It acts
+ like `CFLAGS', but for Go instead of C.
+
+ -- Variable: builddir
+ Rigorously equal to `.'. Added for symmetry only.
+
+ -- Variable: abs_builddir
+ Absolute name of `builddir'.
+
+ -- Variable: top_builddir
+ The relative name of the top level of the current build tree. In
+ the top-level directory, this is the same as `builddir'.
+
+ -- Variable: top_build_prefix
+ The relative name of the top level of the current build tree with
+ final slash if nonempty. This is the same as `top_builddir',
+ except that it contains zero or more runs of `../', so it should
+ not be appended with a slash for concatenation. This helps for
+ `make' implementations that otherwise do not treat `./file' and
+ `file' as equal in the toplevel build directory.
+
+ -- Variable: abs_top_builddir
+ Absolute name of `top_builddir'.
+
+ -- Variable: srcdir
+ The name of the directory that contains the source code for that
+ makefile.
+
+ -- Variable: abs_srcdir
+ Absolute name of `srcdir'.
+
+ -- Variable: top_srcdir
+ The name of the top-level source code directory for the package.
+ In the top-level directory, this is the same as `srcdir'.
+
+ -- Variable: abs_top_srcdir
+ Absolute name of `top_srcdir'.
+
+
+File: autoconf.info, Node: Installation Directory Variables, Next: Changed Directory Variables, Prev: Preset Output Variables, Up: Makefile Substitutions
+
+4.8.2 Installation Directory Variables
+--------------------------------------
+
+The following variables specify the directories for package
+installation, see *note Variables for Installation Directories:
+(standards)Directory Variables, for more information. Each variable
+corresponds to an argument of `configure'; trailing slashes are
+stripped so that expressions such as `${prefix}/lib' expand with only
+one slash between directory names. See the end of this section for
+details on when and how to use these variables.
+
+ -- Variable: bindir
+ The directory for installing executables that users run.
+
+ -- Variable: datadir
+ The directory for installing idiosyncratic read-only
+ architecture-independent data.
+
+ -- Variable: datarootdir
+ The root of the directory tree for read-only
+ architecture-independent data files.
+
+ -- Variable: docdir
+ The directory for installing documentation files (other than Info
+ and man).
+
+ -- Variable: dvidir
+ The directory for installing documentation files in DVI format.
+
+ -- Variable: exec_prefix
+ The installation prefix for architecture-dependent files. By
+ default it's the same as `prefix'. You should avoid installing
+ anything directly to `exec_prefix'. However, the default value for
+ directories containing architecture-dependent files should be
+ relative to `exec_prefix'.
+
+ -- Variable: htmldir
+ The directory for installing HTML documentation.
+
+ -- Variable: includedir
+ The directory for installing C header files.
+
+ -- Variable: infodir
+ The directory for installing documentation in Info format.
+
+ -- Variable: libdir
+ The directory for installing object code libraries.
+
+ -- Variable: libexecdir
+ The directory for installing executables that other programs run.
+
+ -- Variable: localedir
+ The directory for installing locale-dependent but
+ architecture-independent data, such as message catalogs. This
+ directory usually has a subdirectory per locale.
+
+ -- Variable: localstatedir
+ The directory for installing modifiable single-machine data.
+
+ -- Variable: mandir
+ The top-level directory for installing documentation in man format.
+
+ -- Variable: oldincludedir
+ The directory for installing C header files for non-GCC compilers.
+
+ -- Variable: pdfdir
+ The directory for installing PDF documentation.
+
+ -- Variable: prefix
+ The common installation prefix for all files. If `exec_prefix' is
+ defined to a different value, `prefix' is used only for
+ architecture-independent files.
+
+ -- Variable: psdir
+ The directory for installing PostScript documentation.
+
+ -- Variable: sbindir
+ The directory for installing executables that system
+ administrators run.
+
+ -- Variable: sharedstatedir
+ The directory for installing modifiable architecture-independent
+ data.
+
+ -- Variable: sysconfdir
+ The directory for installing read-only single-machine data.
+
+ Most of these variables have values that rely on `prefix' or
+`exec_prefix'. It is deliberate that the directory output variables
+keep them unexpanded: typically `@datarootdir@' is replaced by
+`${prefix}/share', not `/usr/local/share', and `@datadir@' is replaced
+by `${datarootdir}'.
+
+ This behavior is mandated by the GNU Coding Standards, so that when
+the user runs:
+
+`make'
+ she can still specify a different prefix from the one specified to
+ `configure', in which case, if needed, the package should hard
+ code dependencies corresponding to the make-specified prefix.
+
+`make install'
+ she can specify a different installation location, in which case
+ the package _must_ still depend on the location which was compiled
+ in (i.e., never recompile when `make install' is run). This is an
+ extremely important feature, as many people may decide to install
+ all the files of a package grouped together, and then install
+ links from the final locations to there.
+
+ In order to support these features, it is essential that
+`datarootdir' remains defined as `${prefix}/share', so that its value
+can be expanded based on the current value of `prefix'.
+
+ A corollary is that you should not use these variables except in
+makefiles. For instance, instead of trying to evaluate `datadir' in
+`configure' and hard-coding it in makefiles using e.g.,
+`AC_DEFINE_UNQUOTED([DATADIR], ["$datadir"], [Data directory.])', you
+should add `-DDATADIR='$(datadir)'' to your makefile's definition of
+`CPPFLAGS' (`AM_CPPFLAGS' if you are also using Automake).
+
+ Similarly, you should not rely on `AC_CONFIG_FILES' to replace
+`bindir' and friends in your shell scripts and other files; instead,
+let `make' manage their replacement. For instance Autoconf ships
+templates of its shell scripts ending with `.in', and uses a makefile
+snippet similar to the following to build scripts like `autoheader' and
+`autom4te':
+
+ edit = sed \
+ -e 's|@bindir[@]|$(bindir)|g' \
+ -e 's|@pkgdatadir[@]|$(pkgdatadir)|g' \
+ -e 's|@prefix[@]|$(prefix)|g'
+
+ autoheader autom4te: Makefile
+ rm -f $@ $@.tmp
+ srcdir=''; \
+ test -f ./$@.in || srcdir=$(srcdir)/; \
+ $(edit) $${srcdir}$@.in >$@.tmp
+ chmod +x $@.tmp
+ chmod a-w $@.tmp
+ mv $@.tmp $@
+
+ autoheader: $(srcdir)/autoheader.in
+ autom4te: $(srcdir)/autom4te.in
+
+ Some details are noteworthy:
+
+`@bindir[@]'
+ The brackets prevent `configure' from replacing `@bindir@' in the
+ Sed expression itself. Brackets are preferable to a backslash
+ here, since Posix says `\@' is not portable.
+
+`$(bindir)'
+ Don't use `@bindir@'! Use the matching makefile variable instead.
+
+`$(pkgdatadir)'
+ The example takes advantage of the variable `$(pkgdatadir)'
+ provided by Automake; it is equivalent to `$(datadir)/$(PACKAGE)'.
+
+`/'
+ Don't use `/' in the Sed expressions that replace file names since
+ most likely the variables you use, such as `$(bindir)', contain
+ `/'. Use a shell metacharacter instead, such as `|'.
+
+special characters
+ File names, file name components, and the value of `VPATH' should
+ not contain shell metacharacters or white space. *Note Special
+ Chars in Variables::.
+
+dependency on `Makefile'
+ Since `edit' uses values that depend on the configuration specific
+ values (`prefix', etc.) and not only on `VERSION' and so forth,
+ the output depends on `Makefile', not `configure.ac'.
+
+`$@'
+ The main rule is generic, and uses `$@' extensively to avoid the
+ need for multiple copies of the rule.
+
+Separated dependencies and single suffix rules
+ You can't use them! The above snippet cannot be (portably)
+ rewritten as:
+
+ autoconf autoheader: Makefile
+ .in:
+ rm -f $@ $@.tmp
+ $(edit) $< >$@.tmp
+ chmod +x $@.tmp
+ mv $@.tmp $@
+
+ *Note Single Suffix Rules::, for details.
+
+`$(srcdir)'
+ Be sure to specify the name of the source directory, otherwise the
+ package won't support separated builds.
+
+ For the more specific installation of Erlang libraries, the
+following variables are defined:
+
+ -- Variable: ERLANG_INSTALL_LIB_DIR
+ The common parent directory of Erlang library installation
+ directories. This variable is set by calling the
+ `AC_ERLANG_SUBST_INSTALL_LIB_DIR' macro in `configure.ac'.
+
+ -- Variable: ERLANG_INSTALL_LIB_DIR_LIBRARY
+ The installation directory for Erlang library LIBRARY. This
+ variable is set by using the `AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR'
+ macro in `configure.ac'.
+
+ *Note Erlang Libraries::, for details.
+
+
+File: autoconf.info, Node: Changed Directory Variables, Next: Build Directories, Prev: Installation Directory Variables, Up: Makefile Substitutions
+
+4.8.3 Changed Directory Variables
+---------------------------------
+
+In Autoconf 2.60, the set of directory variables has changed, and the
+defaults of some variables have been adjusted (*note Installation
+Directory Variables::) to changes in the GNU Coding Standards.
+Notably, `datadir', `infodir', and `mandir' are now expressed in terms
+of `datarootdir'. If you are upgrading from an earlier Autoconf
+version, you may need to adjust your files to ensure that the directory
+variables are substituted correctly (*note Defining Directories::), and
+that a definition of `datarootdir' is in place. For example, in a
+`Makefile.in', adding
+
+ datarootdir = @datarootdir@
+
+is usually sufficient. If you use Automake to create `Makefile.in', it
+will add this for you.
+
+ To help with the transition, Autoconf warns about files that seem to
+use `datarootdir' without defining it. In some cases, it then expands
+the value of `$datarootdir' in substitutions of the directory
+variables. The following example shows such a warning:
+
+ $ cat configure.ac
+ AC_INIT
+ AC_CONFIG_FILES([Makefile])
+ AC_OUTPUT
+ $ cat Makefile.in
+ prefix = @prefix@
+ datadir = @datadir@
+ $ autoconf
+ $ configure
+ configure: creating ./config.status
+ config.status: creating Makefile
+ config.status: WARNING:
+ Makefile.in seems to ignore the --datarootdir setting
+ $ cat Makefile
+ prefix = /usr/local
+ datadir = ${prefix}/share
+
+ Usually one can easily change the file to accommodate both older and
+newer Autoconf releases:
+
+ $ cat Makefile.in
+ prefix = @prefix@
+ datarootdir = @datarootdir@
+ datadir = @datadir@
+ $ configure
+ configure: creating ./config.status
+ config.status: creating Makefile
+ $ cat Makefile
+ prefix = /usr/local
+ datarootdir = ${prefix}/share
+ datadir = ${datarootdir}
+
+ In some cases, however, the checks may not be able to detect that a
+suitable initialization of `datarootdir' is in place, or they may fail
+to detect that such an initialization is necessary in the output file.
+If, after auditing your package, there are still spurious `configure'
+warnings about `datarootdir', you may add the line
+
+ AC_DEFUN([AC_DATAROOTDIR_CHECKED])
+
+to your `configure.ac' to disable the warnings. This is an exception
+to the usual rule that you should not define a macro whose name begins
+with `AC_' (*note Macro Names::).
+
+
+File: autoconf.info, Node: Build Directories, Next: Automatic Remaking, Prev: Changed Directory Variables, Up: Makefile Substitutions
+
+4.8.4 Build Directories
+-----------------------
+
+You can support compiling a software package for several architectures
+simultaneously from the same copy of the source code. The object files
+for each architecture are kept in their own directory.
+
+ To support doing this, `make' uses the `VPATH' variable to find the
+files that are in the source directory. GNU Make can do this. Most
+other recent `make' programs can do this as well, though they may have
+difficulties and it is often simpler to recommend GNU `make' (*note
+VPATH and Make::). Older `make' programs do not support `VPATH'; when
+using them, the source code must be in the same directory as the object
+files.
+
+ If you are using GNU Automake, the remaining details in this section
+are already covered for you, based on the contents of your
+`Makefile.am'. But if you are using Autoconf in isolation, then
+supporting `VPATH' requires the following in your `Makefile.in':
+
+ srcdir = @srcdir@
+ VPATH = @srcdir@
+
+ Do not set `VPATH' to the value of another variable (*note Variables
+listed in VPATH::.
+
+ `configure' substitutes the correct value for `srcdir' when it
+produces `Makefile'.
+
+ Do not use the `make' variable `$<', which expands to the file name
+of the file in the source directory (found with `VPATH'), except in
+implicit rules. (An implicit rule is one such as `.c.o', which tells
+how to create a `.o' file from a `.c' file.) Some versions of `make'
+do not set `$<' in explicit rules; they expand it to an empty value.
+
+ Instead, Make command lines should always refer to source files by
+prefixing them with `$(srcdir)/'. For example:
+
+ time.info: time.texinfo
+ $(MAKEINFO) '$(srcdir)/time.texinfo'
+
+
+File: autoconf.info, Node: Automatic Remaking, Prev: Build Directories, Up: Makefile Substitutions
+
+4.8.5 Automatic Remaking
+------------------------
+
+You can put rules like the following in the top-level `Makefile.in' for
+a package to automatically update the configuration information when
+you change the configuration files. This example includes all of the
+optional files, such as `aclocal.m4' and those related to configuration
+header files. Omit from the `Makefile.in' rules for any of these files
+that your package does not use.
+
+ The `$(srcdir)/' prefix is included because of limitations in the
+`VPATH' mechanism.
+
+ The `stamp-' files are necessary because the timestamps of
+`config.h.in' and `config.h' are not changed if remaking them does not
+change their contents. This feature avoids unnecessary recompilation.
+You should include the file `stamp-h.in' in your package's
+distribution, so that `make' considers `config.h.in' up to date. Don't
+use `touch' (*note Limitations of Usual Tools: touch.); instead, use
+`echo' (using `date' would cause needless differences, hence CVS
+conflicts, etc.).
+
+ $(srcdir)/configure: configure.ac aclocal.m4
+ cd '$(srcdir)' && autoconf
+
+ # autoheader might not change config.h.in, so touch a stamp file.
+ $(srcdir)/config.h.in: stamp-h.in
+ $(srcdir)/stamp-h.in: configure.ac aclocal.m4
+ cd '$(srcdir)' && autoheader
+ echo timestamp > '$(srcdir)/stamp-h.in'
+
+ config.h: stamp-h
+ stamp-h: config.h.in config.status
+ ./config.status
+
+ Makefile: Makefile.in config.status
+ ./config.status
+
+ config.status: configure
+ ./config.status --recheck
+
+(Be careful if you copy these lines directly into your makefile, as you
+need to convert the indented lines to start with the tab character.)
+
+ In addition, you should use
+
+ AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h])
+
+so `config.status' ensures that `config.h' is considered up to date.
+*Note Output::, for more information about `AC_OUTPUT'.
+
+ *Note config.status Invocation::, for more examples of handling
+configuration-related dependencies.
+
+
+File: autoconf.info, Node: Configuration Headers, Next: Configuration Commands, Prev: Makefile Substitutions, Up: Setup
+
+4.9 Configuration Header Files
+==============================
+
+When a package contains more than a few tests that define C preprocessor
+symbols, the command lines to pass `-D' options to the compiler can get
+quite long. This causes two problems. One is that the `make' output
+is hard to visually scan for errors. More seriously, the command lines
+can exceed the length limits of some operating systems. As an
+alternative to passing `-D' options to the compiler, `configure'
+scripts can create a C header file containing `#define' directives.
+The `AC_CONFIG_HEADERS' macro selects this kind of output. Though it
+can be called anywhere between `AC_INIT' and `AC_OUTPUT', it is
+customary to call it right after `AC_INIT'.
+
+ The package should `#include' the configuration header file before
+any other header files, to prevent inconsistencies in declarations (for
+example, if it redefines `const').
+
+ To provide for VPATH builds, remember to pass the C compiler a `-I.'
+option (or `-I..'; whichever directory contains `config.h'). Even if
+you use `#include "config.h"', the preprocessor searches only the
+directory of the currently read file, i.e., the source directory, not
+the build directory.
+
+ With the appropriate `-I' option, you can use `#include <config.h>'.
+Actually, it's a good habit to use it, because in the rare case when
+the source directory contains another `config.h', the build directory
+should be searched first.
+
+ -- Macro: AC_CONFIG_HEADERS (HEADER ..., [CMDS], [INIT-CMDS])
+ This macro is one of the instantiating macros; see *note
+ Configuration Actions::. Make `AC_OUTPUT' create the file(s) in
+ the blank-or-newline-separated list HEADER containing C
+ preprocessor `#define' statements, and replace `@DEFS@' in
+ generated files with `-DHAVE_CONFIG_H' instead of the value of
+ `DEFS'. The usual name for HEADER is `config.h'.
+
+ If HEADER already exists and its contents are identical to what
+ `AC_OUTPUT' would put in it, it is left alone. Doing this allows
+ making some changes in the configuration without needlessly causing
+ object files that depend on the header file to be recompiled.
+
+ Usually the input file is named `HEADER.in'; however, you can
+ override the input file name by appending to HEADER a
+ colon-separated list of input files. For example, you might need
+ to make the input file name acceptable to DOS variants:
+
+ AC_CONFIG_HEADERS([config.h:config.hin])
+
+
+ -- Macro: AH_HEADER
+ This macro is defined as the name of the first declared config
+ header and undefined if no config headers have been declared up to
+ this point. A third-party macro may, for example, require use of
+ a config header without invoking AC_CONFIG_HEADERS twice, like
+ this:
+
+ AC_CONFIG_COMMANDS_PRE(
+ [m4_ifndef([AH_HEADER], [AC_CONFIG_HEADERS([config.h])])])
+
+
+ *Note Configuration Actions::, for more details on HEADER.
+
+* Menu:
+
+* Header Templates:: Input for the configuration headers
+* autoheader Invocation:: How to create configuration templates
+* Autoheader Macros:: How to specify CPP templates
+
+
+File: autoconf.info, Node: Header Templates, Next: autoheader Invocation, Up: Configuration Headers
+
+4.9.1 Configuration Header Templates
+------------------------------------
+
+Your distribution should contain a template file that looks as you want
+the final header file to look, including comments, with `#undef'
+statements which are used as hooks. For example, suppose your
+`configure.ac' makes these calls:
+
+ AC_CONFIG_HEADERS([conf.h])
+ AC_CHECK_HEADERS([unistd.h])
+
+Then you could have code like the following in `conf.h.in'. The
+`conf.h' created by `configure' defines `HAVE_UNISTD_H' to 1, if and
+only if the system has `unistd.h'.
+
+ /* Define as 1 if you have unistd.h. */
+ #undef HAVE_UNISTD_H
+
+ The format of the template file is stricter than what the C
+preprocessor is required to accept. A directive line should contain
+only whitespace, `#undef', and `HAVE_UNISTD_H'. The use of `#define'
+instead of `#undef', or of comments on the same line as `#undef', is
+strongly discouraged. Each hook should only be listed once. Other
+preprocessor lines, such as `#ifdef' or `#include', are copied verbatim
+from the template into the generated header.
+
+ Since it is a tedious task to keep a template header up to date, you
+may use `autoheader' to generate it, see *note autoheader Invocation::.
+
+ During the instantiation of the header, each `#undef' line in the
+template file for each symbol defined by `AC_DEFINE' is changed to an
+appropriate `#define'. If the corresponding `AC_DEFINE' has not been
+executed during the `configure' run, the `#undef' line is commented
+out. (This is important, e.g., for `_POSIX_SOURCE': on many systems,
+it can be implicitly defined by the compiler, and undefining it in the
+header would then break compilation of subsequent headers.)
+
+ Currently, _all_ remaining `#undef' lines in the header template are
+commented out, whether or not there was a corresponding `AC_DEFINE' for
+the macro name; but this behavior is not guaranteed for future releases
+of Autoconf.
+
+ Generally speaking, since you should not use `#define', and you
+cannot guarantee whether a `#undef' directive in the header template
+will be converted to a `#define' or commented out in the generated
+header file, the template file cannot be used for conditional
+definition effects. Consequently, if you need to use the construct
+
+ #ifdef THIS
+ # define THAT
+ #endif
+
+you must place it outside of the template. If you absolutely need to
+hook it to the config header itself, please put the directives to a
+separate file, and `#include' that file from the config header
+template. If you are using `autoheader', you would probably use
+`AH_BOTTOM' to append the `#include' directive.
+
+
+File: autoconf.info, Node: autoheader Invocation, Next: Autoheader Macros, Prev: Header Templates, Up: Configuration Headers
+
+4.9.2 Using `autoheader' to Create `config.h.in'
+------------------------------------------------
+
+The `autoheader' program can create a template file of C `#define'
+statements for `configure' to use. It searches for the first
+invocation of `AC_CONFIG_HEADERS' in `configure' sources to determine
+the name of the template. (If the first call of `AC_CONFIG_HEADERS'
+specifies more than one input file name, `autoheader' uses the first
+one.)
+
+ It is recommended that only one input file is used. If you want to
+append a boilerplate code, it is preferable to use `AH_BOTTOM([#include
+<conf_post.h>])'. File `conf_post.h' is not processed during the
+configuration then, which make things clearer. Analogically, `AH_TOP'
+can be used to prepend a boilerplate code.
+
+ In order to do its job, `autoheader' needs you to document all of
+the symbols that you might use. Typically this is done via an
+`AC_DEFINE' or `AC_DEFINE_UNQUOTED' call whose first argument is a
+literal symbol and whose third argument describes the symbol (*note
+Defining Symbols::). Alternatively, you can use `AH_TEMPLATE' (*note
+Autoheader Macros::), or you can supply a suitable input file for a
+subsequent configuration header file. Symbols defined by Autoconf's
+builtin tests are already documented properly; you need to document
+only those that you define yourself.
+
+ You might wonder why `autoheader' is needed: after all, why would
+`configure' need to "patch" a `config.h.in' to produce a `config.h'
+instead of just creating `config.h' from scratch? Well, when
+everything rocks, the answer is just that we are wasting our time
+maintaining `autoheader': generating `config.h' directly is all that is
+needed. When things go wrong, however, you'll be thankful for the
+existence of `autoheader'.
+
+ The fact that the symbols are documented is important in order to
+_check_ that `config.h' makes sense. The fact that there is a
+well-defined list of symbols that should be defined (or not) is also
+important for people who are porting packages to environments where
+`configure' cannot be run: they just have to _fill in the blanks_.
+
+ But let's come back to the point: the invocation of `autoheader'...
+
+ If you give `autoheader' an argument, it uses that file instead of
+`configure.ac' and writes the header file to the standard output
+instead of to `config.h.in'. If you give `autoheader' an argument of
+`-', it reads the standard input instead of `configure.ac' and writes
+the header file to the standard output.
+
+ `autoheader' accepts the following options:
+
+`--help'
+`-h'
+ Print a summary of the command line options and exit.
+
+`--version'
+`-V'
+ Print the version number of Autoconf and exit.
+
+`--verbose'
+`-v'
+ Report processing steps.
+
+`--debug'
+`-d'
+ Don't remove the temporary files.
+
+`--force'
+`-f'
+ Remake the template file even if newer than its input files.
+
+`--include=DIR'
+`-I DIR'
+ Append DIR to the include path. Multiple invocations accumulate.
+
+`--prepend-include=DIR'
+`-B DIR'
+ Prepend DIR to the include path. Multiple invocations accumulate.
+
+`--warnings=CATEGORY'
+`-W CATEGORY'
+ Report the warnings related to CATEGORY (which can actually be a
+ comma separated list). Current categories include:
+
+ `obsolete'
+ report the uses of obsolete constructs
+
+ `all'
+ report all the warnings
+
+ `none'
+ report none
+
+ `error'
+ treats warnings as errors
+
+ `no-CATEGORY'
+ disable warnings falling into CATEGORY
+
+
+
+File: autoconf.info, Node: Autoheader Macros, Prev: autoheader Invocation, Up: Configuration Headers
+
+4.9.3 Autoheader Macros
+-----------------------
+
+`autoheader' scans `configure.ac' and figures out which C preprocessor
+symbols it might define. It knows how to generate templates for
+symbols defined by `AC_CHECK_HEADERS', `AC_CHECK_FUNCS' etc., but if
+you `AC_DEFINE' any additional symbol, you must define a template for
+it. If there are missing templates, `autoheader' fails with an error
+message.
+
+ The template for a SYMBOL is created by `autoheader' from the
+DESCRIPTION argument to an `AC_DEFINE'; see *note Defining Symbols::.
+
+ For special needs, you can use the following macros.
+
+ -- Macro: AH_TEMPLATE (KEY, DESCRIPTION)
+ Tell `autoheader' to generate a template for KEY. This macro
+ generates standard templates just like `AC_DEFINE' when a
+ DESCRIPTION is given.
+
+ For example:
+
+ AH_TEMPLATE([CRAY_STACKSEG_END],
+ [Define to one of _getb67, GETB67, getb67
+ for Cray-2 and Cray-YMP systems. This
+ function is required for alloca.c support
+ on those systems.])
+
+ generates the following template, with the description properly
+ justified.
+
+ /* Define to one of _getb67, GETB67, getb67 for Cray-2 and
+ Cray-YMP systems. This function is required for alloca.c
+ support on those systems. */
+ #undef CRAY_STACKSEG_END
+
+ -- Macro: AH_VERBATIM (KEY, TEMPLATE)
+ Tell `autoheader' to include the TEMPLATE as-is in the header
+ template file. This TEMPLATE is associated with the KEY, which is
+ used to sort all the different templates and guarantee their
+ uniqueness. It should be a symbol that can be defined via
+ `AC_DEFINE'.
+
+ -- Macro: AH_TOP (TEXT)
+ Include TEXT at the top of the header template file.
+
+ -- Macro: AH_BOTTOM (TEXT)
+ Include TEXT at the bottom of the header template file.
+
+ Please note that TEXT gets included "verbatim" to the template file,
+not to the resulting config header, so it can easily get mangled when
+the template is processed. There is rarely a need for something other
+than
+
+ AH_BOTTOM([#include <custom.h>])
+
+
+File: autoconf.info, Node: Configuration Commands, Next: Configuration Links, Prev: Configuration Headers, Up: Setup
+
+4.10 Running Arbitrary Configuration Commands
+=============================================
+
+You can execute arbitrary commands before, during, and after
+`config.status' is run. The three following macros accumulate the
+commands to run when they are called multiple times.
+`AC_CONFIG_COMMANDS' replaces the obsolete macro `AC_OUTPUT_COMMANDS';
+see *note Obsolete Macros::, for details.
+
+ -- Macro: AC_CONFIG_COMMANDS (TAG..., [CMDS], [INIT-CMDS])
+ Specify additional shell commands to run at the end of
+ `config.status', and shell commands to initialize any variables
+ from `configure'. Associate the commands with TAG. Since
+ typically the CMDS create a file, TAG should naturally be the name
+ of that file. If needed, the directory hosting TAG is created.
+ This macro is one of the instantiating macros; see *note
+ Configuration Actions::.
+
+ Here is an unrealistic example:
+ fubar=42
+ AC_CONFIG_COMMANDS([fubar],
+ [echo this is extra $fubar, and so on.],
+ [fubar=$fubar])
+
+ Here is a better one:
+ AC_CONFIG_COMMANDS([timestamp], [date >timestamp])
+
+ The following two macros look similar, but in fact they are not of
+the same breed: they are executed directly by `configure', so you
+cannot use `config.status' to rerun them.
+
+ -- Macro: AC_CONFIG_COMMANDS_PRE (CMDS)
+ Execute the CMDS right before creating `config.status'.
+
+ This macro presents the last opportunity to call `AC_SUBST',
+ `AC_DEFINE', or `AC_CONFIG_ITEMS' macros.
+
+ -- Macro: AC_CONFIG_COMMANDS_POST (CMDS)
+ Execute the CMDS right after creating `config.status'.
+
+
+File: autoconf.info, Node: Configuration Links, Next: Subdirectories, Prev: Configuration Commands, Up: Setup
+
+4.11 Creating Configuration Links
+=================================
+
+You may find it convenient to create links whose destinations depend
+upon results of tests. One can use `AC_CONFIG_COMMANDS' but the
+creation of relative symbolic links can be delicate when the package is
+built in a directory different from the source directory.
+
+ -- Macro: AC_CONFIG_LINKS (DEST:SOURCE..., [CMDS], [INIT-CMDS])
+ Make `AC_OUTPUT' link each of the existing files SOURCE to the
+ corresponding link name DEST. Makes a symbolic link if possible,
+ otherwise a hard link if possible, otherwise a copy. The DEST and
+ SOURCE names should be relative to the top level source or build
+ directory. This macro is one of the instantiating macros; see
+ *note Configuration Actions::.
+
+ For example, this call:
+
+ AC_CONFIG_LINKS([host.h:config/$machine.h
+ object.h:config/$obj_format.h])
+
+ creates in the current directory `host.h' as a link to
+ `SRCDIR/config/$machine.h', and `object.h' as a link to
+ `SRCDIR/config/$obj_format.h'.
+
+ The tempting value `.' for DEST is invalid: it makes it impossible
+ for `config.status' to guess the links to establish.
+
+ One can then run:
+ ./config.status host.h object.h
+ to create the links.
+
+
+File: autoconf.info, Node: Subdirectories, Next: Default Prefix, Prev: Configuration Links, Up: Setup
+
+4.12 Configuring Other Packages in Subdirectories
+=================================================
+
+In most situations, calling `AC_OUTPUT' is sufficient to produce
+makefiles in subdirectories. However, `configure' scripts that control
+more than one independent package can use `AC_CONFIG_SUBDIRS' to run
+`configure' scripts for other packages in subdirectories.
+
+ -- Macro: AC_CONFIG_SUBDIRS (DIR ...)
+ Make `AC_OUTPUT' run `configure' in each subdirectory DIR in the
+ given blank-or-newline-separated list. Each DIR should be a
+ literal, i.e., please do not use:
+
+ if test "x$package_foo_enabled" = xyes; then
+ my_subdirs="$my_subdirs foo"
+ fi
+ AC_CONFIG_SUBDIRS([$my_subdirs])
+
+ because this prevents `./configure --help=recursive' from
+ displaying the options of the package `foo'. Instead, you should
+ write:
+
+ if test "x$package_foo_enabled" = xyes; then
+ AC_CONFIG_SUBDIRS([foo])
+ fi
+
+ If a given DIR is not found at `configure' run time, a warning is
+ reported; if the subdirectory is optional, write:
+
+ if test -d "$srcdir/foo"; then
+ AC_CONFIG_SUBDIRS([foo])
+ fi
+
+ If a given DIR contains `configure.gnu', it is run instead of
+ `configure'. This is for packages that might use a non-Autoconf
+ script `Configure', which can't be called through a wrapper
+ `configure' since it would be the same file on case-insensitive
+ file systems. Likewise, if a DIR contains `configure.in' but no
+ `configure', the Cygnus `configure' script found by
+ `AC_CONFIG_AUX_DIR' is used.
+
+ The subdirectory `configure' scripts are given the same command
+ line options that were given to this `configure' script, with minor
+ changes if needed, which include:
+
+ - adjusting a relative name for the cache file;
+
+ - adjusting a relative name for the source directory;
+
+ - propagating the current value of `$prefix', including if it
+ was defaulted, and if the default values of the top level and
+ of the subdirectory `configure' differ.
+
+ This macro also sets the output variable `subdirs' to the list of
+ directories `DIR ...'. Make rules can use this variable to
+ determine which subdirectories to recurse into.
+
+ This macro may be called multiple times.
+
+
+File: autoconf.info, Node: Default Prefix, Prev: Subdirectories, Up: Setup
+
+4.13 Default Prefix
+===================
+
+By default, `configure' sets the prefix for files it installs to
+`/usr/local'. The user of `configure' can select a different prefix
+using the `--prefix' and `--exec-prefix' options. There are two ways
+to change the default: when creating `configure', and when running it.
+
+ Some software packages might want to install in a directory other
+than `/usr/local' by default. To accomplish that, use the
+`AC_PREFIX_DEFAULT' macro.
+
+ -- Macro: AC_PREFIX_DEFAULT (PREFIX)
+ Set the default installation prefix to PREFIX instead of
+ `/usr/local'.
+
+ It may be convenient for users to have `configure' guess the
+installation prefix from the location of a related program that they
+have already installed. If you wish to do that, you can call
+`AC_PREFIX_PROGRAM'.
+
+ -- Macro: AC_PREFIX_PROGRAM (PROGRAM)
+ If the user did not specify an installation prefix (using the
+ `--prefix' option), guess a value for it by looking for PROGRAM in
+ `PATH', the way the shell does. If PROGRAM is found, set the
+ prefix to the parent of the directory containing PROGRAM, else
+ default the prefix as described above (`/usr/local' or
+ `AC_PREFIX_DEFAULT'). For example, if PROGRAM is `gcc' and the
+ `PATH' contains `/usr/local/gnu/bin/gcc', set the prefix to
+ `/usr/local/gnu'.
+
+
+File: autoconf.info, Node: Existing Tests, Next: Writing Tests, Prev: Setup, Up: Top
+
+5 Existing Tests
+****************
+
+These macros test for particular system features that packages might
+need or want to use. If you need to test for a kind of feature that
+none of these macros check for, you can probably do it by calling
+primitive test macros with appropriate arguments (*note Writing
+Tests::).
+
+ These tests print messages telling the user which feature they're
+checking for, and what they find. They cache their results for future
+`configure' runs (*note Caching Results::).
+
+ Some of these macros set output variables. *Note Makefile
+Substitutions::, for how to get their values. The phrase "define NAME"
+is used below as a shorthand to mean "define the C preprocessor symbol
+NAME to the value 1". *Note Defining Symbols::, for how to get those
+symbol definitions into your program.
+
+* Menu:
+
+* Common Behavior:: Macros' standard schemes
+* Alternative Programs:: Selecting between alternative programs
+* Files:: Checking for the existence of files
+* Libraries:: Library archives that might be missing
+* Library Functions:: C library functions that might be missing
+* Header Files:: Header files that might be missing
+* Declarations:: Declarations that may be missing
+* Structures:: Structures or members that might be missing
+* Types:: Types that might be missing
+* Compilers and Preprocessors:: Checking for compiling programs
+* System Services:: Operating system services
+* Posix Variants:: Special kludges for specific Posix variants
+* Erlang Libraries:: Checking for the existence of Erlang libraries
+
+
+File: autoconf.info, Node: Common Behavior, Next: Alternative Programs, Up: Existing Tests
+
+5.1 Common Behavior
+===================
+
+Much effort has been expended to make Autoconf easy to learn. The most
+obvious way to reach this goal is simply to enforce standard interfaces
+and behaviors, avoiding exceptions as much as possible. Because of
+history and inertia, unfortunately, there are still too many exceptions
+in Autoconf; nevertheless, this section describes some of the common
+rules.
+
+* Menu:
+
+* Standard Symbols:: Symbols defined by the macros
+* Default Includes:: Includes used by the generic macros
+
+
+File: autoconf.info, Node: Standard Symbols, Next: Default Includes, Up: Common Behavior
+
+5.1.1 Standard Symbols
+----------------------
+
+All the generic macros that `AC_DEFINE' a symbol as a result of their
+test transform their ARGUMENT values to a standard alphabet. First,
+ARGUMENT is converted to upper case and any asterisks (`*') are each
+converted to `P'. Any remaining characters that are not alphanumeric
+are converted to underscores.
+
+ For instance,
+
+ AC_CHECK_TYPES([struct $Expensive*])
+
+defines the symbol `HAVE_STRUCT__EXPENSIVEP' if the check succeeds.
+
+
+File: autoconf.info, Node: Default Includes, Prev: Standard Symbols, Up: Common Behavior
+
+5.1.2 Default Includes
+----------------------
+
+Several tests depend upon a set of header files. Since these headers
+are not universally available, tests actually have to provide a set of
+protected includes, such as:
+
+ #ifdef TIME_WITH_SYS_TIME
+ # include <sys/time.h>
+ # include <time.h>
+ #else
+ # ifdef HAVE_SYS_TIME_H
+ # include <sys/time.h>
+ # else
+ # include <time.h>
+ # endif
+ #endif
+
+Unless you know exactly what you are doing, you should avoid using
+unconditional includes, and check the existence of the headers you
+include beforehand (*note Header Files::).
+
+ Most generic macros use the following macro to provide the default
+set of includes:
+
+ -- Macro: AC_INCLUDES_DEFAULT ([INCLUDE-DIRECTIVES])
+ Expand to INCLUDE-DIRECTIVES if defined, otherwise to:
+
+ #include <stdio.h>
+ #ifdef HAVE_SYS_TYPES_H
+ # include <sys/types.h>
+ #endif
+ #ifdef HAVE_SYS_STAT_H
+ # include <sys/stat.h>
+ #endif
+ #ifdef STDC_HEADERS
+ # include <stdlib.h>
+ # include <stddef.h>
+ #else
+ # ifdef HAVE_STDLIB_H
+ # include <stdlib.h>
+ # endif
+ #endif
+ #ifdef HAVE_STRING_H
+ # if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+ # include <memory.h>
+ # endif
+ # include <string.h>
+ #endif
+ #ifdef HAVE_STRINGS_H
+ # include <strings.h>
+ #endif
+ #ifdef HAVE_INTTYPES_H
+ # include <inttypes.h>
+ #endif
+ #ifdef HAVE_STDINT_H
+ # include <stdint.h>
+ #endif
+ #ifdef HAVE_UNISTD_H
+ # include <unistd.h>
+ #endif
+
+ If the default includes are used, then check for the presence of
+ these headers and their compatibility, i.e., you don't need to run
+ `AC_HEADER_STDC', nor check for `stdlib.h' etc.
+
+ These headers are checked for in the same order as they are
+ included. For instance, on some systems `string.h' and
+ `strings.h' both exist, but conflict. Then `HAVE_STRING_H' is
+ defined, not `HAVE_STRINGS_H'.
+
+
+File: autoconf.info, Node: Alternative Programs, Next: Files, Prev: Common Behavior, Up: Existing Tests
+
+5.2 Alternative Programs
+========================
+
+These macros check for the presence or behavior of particular programs.
+They are used to choose between several alternative programs and to
+decide what to do once one has been chosen. If there is no macro
+specifically defined to check for a program you need, and you don't need
+to check for any special properties of it, then you can use one of the
+general program-check macros.
+
+* Menu:
+
+* Particular Programs:: Special handling to find certain programs
+* Generic Programs:: How to find other programs
+
+
+File: autoconf.info, Node: Particular Programs, Next: Generic Programs, Up: Alternative Programs
+
+5.2.1 Particular Program Checks
+-------------------------------
+
+These macros check for particular programs--whether they exist, and in
+some cases whether they support certain features.
+
+ -- Macro: AC_PROG_AWK
+ Check for `gawk', `mawk', `nawk', and `awk', in that order, and
+ set output variable `AWK' to the first one that is found. It
+ tries `gawk' first because that is reported to be the best
+ implementation. The result can be overridden by setting the
+ variable `AWK' or the cache variable `ac_cv_prog_AWK'.
+
+ Using this macro is sufficient to avoid the pitfalls of traditional
+ `awk' (*note Limitations of Usual Tools: awk.).
+
+ -- Macro: AC_PROG_GREP
+ Look for the best available `grep' or `ggrep' that accepts the
+ longest input lines possible, and that supports multiple `-e'
+ options. Set the output variable `GREP' to whatever is chosen.
+ *Note Limitations of Usual Tools: grep, for more information about
+ portability problems with the `grep' command family. The result
+ can be overridden by setting the `GREP' variable and is cached in
+ the `ac_cv_path_GREP' variable.
+
+ -- Macro: AC_PROG_EGREP
+ Check whether `$GREP -E' works, or else look for the best available
+ `egrep' or `gegrep' that accepts the longest input lines possible.
+ Set the output variable `EGREP' to whatever is chosen. The result
+ can be overridden by setting the `EGREP' variable and is cached in
+ the `ac_cv_path_EGREP' variable.
+
+ -- Macro: AC_PROG_FGREP
+ Check whether `$GREP -F' works, or else look for the best available
+ `fgrep' or `gfgrep' that accepts the longest input lines possible.
+ Set the output variable `FGREP' to whatever is chosen. The result
+ can be overridden by setting the `FGREP' variable and is cached in
+ the `ac_cv_path_FGREP' variable.
+
+ -- Macro: AC_PROG_INSTALL
+ Set output variable `INSTALL' to the name of a BSD-compatible
+ `install' program, if one is found in the current `PATH'.
+ Otherwise, set `INSTALL' to `DIR/install-sh -c', checking the
+ directories specified to `AC_CONFIG_AUX_DIR' (or its default
+ directories) to determine DIR (*note Output::). Also set the
+ variables `INSTALL_PROGRAM' and `INSTALL_SCRIPT' to `${INSTALL}'
+ and `INSTALL_DATA' to `${INSTALL} -m 644'.
+
+ `@INSTALL@' is special, as its value may vary for different
+ configuration files.
+
+ This macro screens out various instances of `install' known not to
+ work. It prefers to find a C program rather than a shell script,
+ for speed. Instead of `install-sh', it can also use `install.sh',
+ but that name is obsolete because some `make' programs have a rule
+ that creates `install' from it if there is no makefile. Further,
+ this macro requires `install' to be able to install multiple files
+ into a target directory in a single invocation.
+
+ Autoconf comes with a copy of `install-sh' that you can use. If
+ you use `AC_PROG_INSTALL', you must include either `install-sh' or
+ `install.sh' in your distribution; otherwise `configure' produces
+ an error message saying it can't find them--even if the system
+ you're on has a good `install' program. This check is a safety
+ measure to prevent you from accidentally leaving that file out,
+ which would prevent your package from installing on systems that
+ don't have a BSD-compatible `install' program.
+
+ If you need to use your own installation program because it has
+ features not found in standard `install' programs, there is no
+ reason to use `AC_PROG_INSTALL'; just put the file name of your
+ program into your `Makefile.in' files.
+
+ The result of the test can be overridden by setting the variable
+ `INSTALL' or the cache variable `ac_cv_path_install'.
+
+ -- Macro: AC_PROG_MKDIR_P
+ Set output variable `MKDIR_P' to a program that ensures that for
+ each argument, a directory named by this argument exists, creating
+ it and its parent directories if needed, and without race
+ conditions when two instances of the program attempt to make the
+ same directory at nearly the same time.
+
+ This macro uses the `mkdir -p' command if possible. Otherwise, it
+ falls back on invoking `install-sh' with the `-d' option, so your
+ package should contain `install-sh' as described under
+ `AC_PROG_INSTALL'. An `install-sh' file that predates Autoconf
+ 2.60 or Automake 1.10 is vulnerable to race conditions, so if you
+ want to support parallel installs from different packages into the
+ same directory you need to make sure you have an up-to-date
+ `install-sh'. In particular, be careful about using `autoreconf
+ -if' if your Automake predates Automake 1.10.
+
+ This macro is related to the `AS_MKDIR_P' macro (*note Programming
+ in M4sh::), but it sets an output variable intended for use in
+ other files, whereas `AS_MKDIR_P' is intended for use in scripts
+ like `configure'. Also, `AS_MKDIR_P' does not accept options, but
+ `MKDIR_P' supports the `-m' option, e.g., a makefile might invoke
+ `$(MKDIR_P) -m 0 dir' to create an inaccessible directory, and
+ conversely a makefile should use `$(MKDIR_P) -- $(FOO)' if FOO
+ might yield a value that begins with `-'. Finally, `AS_MKDIR_P'
+ does not check for race condition vulnerability, whereas
+ `AC_PROG_MKDIR_P' does.
+
+ `@MKDIR_P@' is special, as its value may vary for different
+ configuration files.
+
+ The result of the test can be overridden by setting the variable
+ `MKDIR_P' or the cache variable `ac_cv_path_mkdir'.
+
+ -- Macro: AC_PROG_LEX
+ If `flex' is found, set output variable `LEX' to `flex' and
+ `LEXLIB' to `-lfl', if that library is in a standard place.
+ Otherwise set `LEX' to `lex' and `LEXLIB' to `-ll', if found. If
+ neither variant is available, set `LEX' to `:'; for packages that
+ ship the generated `file.yy.c' alongside the source `file.l', this
+ default allows users without a lexer generator to still build the
+ package even if the timestamp for `file.l' is inadvertently
+ changed.
+
+ Define `YYTEXT_POINTER' if `yytext' defaults to `char *' instead
+ of to `char []'. Also set output variable `LEX_OUTPUT_ROOT' to
+ the base of the file name that the lexer generates; usually
+ `lex.yy', but sometimes something else. These results vary
+ according to whether `lex' or `flex' is being used.
+
+ You are encouraged to use Flex in your sources, since it is both
+ more pleasant to use than plain Lex and the C source it produces
+ is portable. In order to ensure portability, however, you must
+ either provide a function `yywrap' or, if you don't use it (e.g.,
+ your scanner has no `#include'-like feature), simply include a
+ `%noyywrap' statement in the scanner's source. Once this done,
+ the scanner is portable (unless _you_ felt free to use nonportable
+ constructs) and does not depend on any library. In this case, and
+ in this case only, it is suggested that you use this Autoconf
+ snippet:
+
+ AC_PROG_LEX
+ if test "x$LEX" != xflex; then
+ LEX="$SHELL $missing_dir/missing flex"
+ AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
+ AC_SUBST([LEXLIB], [''])
+ fi
+
+ The shell script `missing' can be found in the Automake
+ distribution.
+
+ Remember that the user may have supplied an alternate location in
+ `LEX', so if Flex is required, it is better to check that the user
+ provided something sufficient by parsing the output of `$LEX
+ --version' than by simply relying on `test "x$LEX" = xflex'.
+
+ To ensure backward compatibility, Automake's `AM_PROG_LEX' invokes
+ (indirectly) this macro twice, which causes an annoying but benign
+ "`AC_PROG_LEX' invoked multiple times" warning. Future versions
+ of Automake will fix this issue; meanwhile, just ignore this
+ message.
+
+ As part of running the test, this macro may delete any file in the
+ configuration directory named `lex.yy.c' or `lexyy.c'.
+
+ The result of this test can be influenced by setting the variable
+ `LEX' or the cache variable `ac_cv_prog_LEX'.
+
+ -- Macro: AC_PROG_LN_S
+ If `ln -s' works on the current file system (the operating system
+ and file system support symbolic links), set the output variable
+ `LN_S' to `ln -s'; otherwise, if `ln' works, set `LN_S' to `ln',
+ and otherwise set it to `cp -pR'.
+
+ If you make a link in a directory other than the current
+ directory, its meaning depends on whether `ln' or `ln -s' is used.
+ To safely create links using `$(LN_S)', either find out which form
+ is used and adjust the arguments, or always invoke `ln' in the
+ directory where the link is to be created.
+
+ In other words, it does not work to do:
+ $(LN_S) foo /x/bar
+
+ Instead, do:
+
+ (cd /x && $(LN_S) foo bar)
+
+ -- Macro: AC_PROG_RANLIB
+ Set output variable `RANLIB' to `ranlib' if `ranlib' is found, and
+ otherwise to `:' (do nothing).
+
+ -- Macro: AC_PROG_SED
+ Set output variable `SED' to a Sed implementation that conforms to
+ Posix and does not have arbitrary length limits. Report an error
+ if no acceptable Sed is found. *Note Limitations of Usual Tools:
+ sed, for more information about portability problems with Sed.
+
+ The result of this test can be overridden by setting the `SED'
+ variable and is cached in the `ac_cv_path_SED' variable.
+
+ -- Macro: AC_PROG_YACC
+ If `bison' is found, set output variable `YACC' to `bison -y'.
+ Otherwise, if `byacc' is found, set `YACC' to `byacc'. Otherwise
+ set `YACC' to `yacc'. The result of this test can be influenced
+ by setting the variable `YACC' or the cache variable
+ `ac_cv_prog_YACC'.
+
+
+File: autoconf.info, Node: Generic Programs, Prev: Particular Programs, Up: Alternative Programs
+
+5.2.2 Generic Program and File Checks
+-------------------------------------
+
+These macros are used to find programs not covered by the "particular"
+test macros. If you need to check the behavior of a program as well as
+find out whether it is present, you have to write your own test for it
+(*note Writing Tests::). By default, these macros use the environment
+variable `PATH'. If you need to check for a program that might not be
+in the user's `PATH', you can pass a modified path to use instead, like
+this:
+
+ AC_PATH_PROG([INETD], [inetd], [/usr/libexec/inetd],
+ [$PATH$PATH_SEPARATOR/usr/libexec$PATH_SEPARATOR]dnl
+ [/usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc])
+
+ You are strongly encouraged to declare the VARIABLE passed to
+`AC_CHECK_PROG' etc. as precious. *Note Setting Output Variables::,
+`AC_ARG_VAR', for more details.
+
+ -- Macro: AC_CHECK_PROG (VARIABLE, PROG-TO-CHECK-FOR, VALUE-IF-FOUND,
+ [VALUE-IF-NOT-FOUND], [PATH = `$PATH'], [REJECT])
+ Check whether program PROG-TO-CHECK-FOR exists in PATH. If it is
+ found, set VARIABLE to VALUE-IF-FOUND, otherwise to
+ VALUE-IF-NOT-FOUND, if given. Always pass over REJECT (an
+ absolute file name) even if it is the first found in the search
+ path; in that case, set VARIABLE using the absolute file name of
+ the PROG-TO-CHECK-FOR found that is not REJECT. If VARIABLE was
+ already set, do nothing. Calls `AC_SUBST' for VARIABLE. The
+ result of this test can be overridden by setting the VARIABLE
+ variable or the cache variable `ac_cv_prog_VARIABLE'.
+
+ -- Macro: AC_CHECK_PROGS (VARIABLE, PROGS-TO-CHECK-FOR,
+ [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
+ Check for each program in the blank-separated list
+ PROGS-TO-CHECK-FOR existing in the PATH. If one is found, set
+ VARIABLE to the name of that program. Otherwise, continue
+ checking the next program in the list. If none of the programs in
+ the list are found, set VARIABLE to VALUE-IF-NOT-FOUND; if
+ VALUE-IF-NOT-FOUND is not specified, the value of VARIABLE is not
+ changed. Calls `AC_SUBST' for VARIABLE. The result of this test
+ can be overridden by setting the VARIABLE variable or the cache
+ variable `ac_cv_prog_VARIABLE'.
+
+ -- Macro: AC_CHECK_TARGET_TOOL (VARIABLE, PROG-TO-CHECK-FOR,
+ [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
+ Like `AC_CHECK_PROG', but first looks for PROG-TO-CHECK-FOR with a
+ prefix of the target type as determined by `AC_CANONICAL_TARGET',
+ followed by a dash (*note Canonicalizing::). If the tool cannot
+ be found with a prefix, and if the build and target types are
+ equal, then it is also searched for without a prefix.
+
+ As noted in *note Specifying Target Triplets::, the target is
+ rarely specified, because most of the time it is the same as the
+ host: it is the type of system for which any compiler tool in the
+ package produces code. What this macro looks for is, for example,
+ _a tool (assembler, linker, etc.) that the compiler driver (`gcc'
+ for the GNU C Compiler) uses to produce objects, archives or
+ executables_.
+
+ -- Macro: AC_CHECK_TOOL (VARIABLE, PROG-TO-CHECK-FOR,
+ [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
+ Like `AC_CHECK_PROG', but first looks for PROG-TO-CHECK-FOR with a
+ prefix of the host type as specified by `--host', followed by a
+ dash. For example, if the user runs `configure --build=x86_64-gnu
+ --host=i386-gnu', then this call:
+ AC_CHECK_TOOL([RANLIB], [ranlib], [:])
+ sets `RANLIB' to `i386-gnu-ranlib' if that program exists in PATH,
+ or otherwise to `ranlib' if that program exists in PATH, or to `:'
+ if neither program exists.
+
+ When cross-compiling, this macro will issue a warning if no program
+ prefixed with the host type could be found. For more information,
+ see *note Specifying Target Triplets::.
+
+ -- Macro: AC_CHECK_TARGET_TOOLS (VARIABLE, PROGS-TO-CHECK-FOR,
+ [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
+ Like `AC_CHECK_TARGET_TOOL', each of the tools in the list
+ PROGS-TO-CHECK-FOR are checked with a prefix of the target type as
+ determined by `AC_CANONICAL_TARGET', followed by a dash (*note
+ Canonicalizing::). If none of the tools can be found with a
+ prefix, and if the build and target types are equal, then the
+ first one without a prefix is used. If a tool is found, set
+ VARIABLE to the name of that program. If none of the tools in the
+ list are found, set VARIABLE to VALUE-IF-NOT-FOUND; if
+ VALUE-IF-NOT-FOUND is not specified, the value of VARIABLE is not
+ changed. Calls `AC_SUBST' for VARIABLE.
+
+ -- Macro: AC_CHECK_TOOLS (VARIABLE, PROGS-TO-CHECK-FOR,
+ [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
+ Like `AC_CHECK_TOOL', each of the tools in the list
+ PROGS-TO-CHECK-FOR are checked with a prefix of the host type as
+ determined by `AC_CANONICAL_HOST', followed by a dash (*note
+ Canonicalizing::). If none of the tools can be found with a
+ prefix, then the first one without a prefix is used. If a tool is
+ found, set VARIABLE to the name of that program. If none of the
+ tools in the list are found, set VARIABLE to VALUE-IF-NOT-FOUND; if
+ VALUE-IF-NOT-FOUND is not specified, the value of VARIABLE is not
+ changed. Calls `AC_SUBST' for VARIABLE.
+
+ When cross-compiling, this macro will issue a warning if no program
+ prefixed with the host type could be found. For more information,
+ see *note Specifying Target Triplets::.
+
+ -- Macro: AC_PATH_PROG (VARIABLE, PROG-TO-CHECK-FOR,
+ [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
+ Like `AC_CHECK_PROG', but set VARIABLE to the absolute name of
+ PROG-TO-CHECK-FOR if found. The result of this test can be
+ overridden by setting the VARIABLE variable. A positive result of
+ this test is cached in the `ac_cv_path_VARIABLE' variable.
+
+ -- Macro: AC_PATH_PROGS (VARIABLE, PROGS-TO-CHECK-FOR,
+ [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
+ Like `AC_CHECK_PROGS', but if any of PROGS-TO-CHECK-FOR are found,
+ set VARIABLE to the absolute name of the program found. The
+ result of this test can be overridden by setting the VARIABLE
+ variable. A positive result of this test is cached in the
+ `ac_cv_path_VARIABLE' variable.
+
+ -- Macro: AC_PATH_PROGS_FEATURE_CHECK (VARIABLE, PROGS-TO-CHECK-FOR,
+ FEATURE-TEST, [ACTION-IF-NOT-FOUND], [PATH = `$PATH'])
+ This macro was introduced in Autoconf 2.62. If VARIABLE is not
+ empty, then set the cache variable `ac_cv_path_VARIABLE' to its
+ value. Otherwise, check for each program in the blank-separated
+ list PROGS-TO-CHECK-FOR existing in PATH. For each program found,
+ execute FEATURE-TEST with `ac_path_VARIABLE' set to the absolute
+ name of the candidate program. If no invocation of FEATURE-TEST
+ sets the shell variable `ac_cv_path_VARIABLE', then
+ ACTION-IF-NOT-FOUND is executed. FEATURE-TEST will be run even
+ when `ac_cv_path_VARIABLE' is set, to provide the ability to
+ choose a better candidate found later in PATH; to accept the
+ current setting and bypass all further checks, FEATURE-TEST can
+ execute `ac_path_VARIABLE_found=:'.
+
+ Note that this macro has some subtle differences from
+ `AC_CHECK_PROGS'. It is designed to be run inside `AC_CACHE_VAL',
+ therefore, it should have no side effects. In particular,
+ VARIABLE is not set to the final value of `ac_cv_path_VARIABLE',
+ nor is `AC_SUBST' automatically run. Also, on failure, any action
+ can be performed, whereas `AC_CHECK_PROGS' only performs
+ `VARIABLE=VALUE-IF-NOT-FOUND'.
+
+ Here is an example, similar to what Autoconf uses in its own
+ configure script. It will search for an implementation of `m4'
+ that supports the `indir' builtin, even if it goes by the name
+ `gm4' or is not the first implementation on `PATH'.
+
+ AC_CACHE_CHECK([for m4 that supports indir], [ac_cv_path_M4],
+ [AC_PATH_PROGS_FEATURE_CHECK([M4], [m4 gm4],
+ [[m4out=`echo 'changequote([,])indir([divnum])' | $ac_path_M4`
+ test "x$m4out" = x0 \
+ && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:]],
+ [AC_MSG_ERROR([could not find m4 that supports indir])])])
+ AC_SUBST([M4], [$ac_cv_path_M4])
+
+ -- Macro: AC_PATH_TARGET_TOOL (VARIABLE, PROG-TO-CHECK-FOR,
+ [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
+ Like `AC_CHECK_TARGET_TOOL', but set VARIABLE to the absolute name
+ of the program if it is found.
+
+ -- Macro: AC_PATH_TOOL (VARIABLE, PROG-TO-CHECK-FOR,
+ [VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
+ Like `AC_CHECK_TOOL', but set VARIABLE to the absolute name of the
+ program if it is found.
+
+ When cross-compiling, this macro will issue a warning if no program
+ prefixed with the host type could be found. For more information,
+ see *note Specifying Target Triplets::.
+
+
+File: autoconf.info, Node: Files, Next: Libraries, Prev: Alternative Programs, Up: Existing Tests
+
+5.3 Files
+=========
+
+You might also need to check for the existence of files. Before using
+these macros, ask yourself whether a runtime test might not be a better
+solution. Be aware that, like most Autoconf macros, they test a feature
+of the host machine, and therefore, they die when cross-compiling.
+
+ -- Macro: AC_CHECK_FILE (FILE, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND])
+ Check whether file FILE exists on the native system. If it is
+ found, execute ACTION-IF-FOUND, otherwise do ACTION-IF-NOT-FOUND,
+ if given. The result of this test is cached in the
+ `ac_cv_file_FILE' variable, with characters not suitable for a
+ variable name mapped to underscores.
+
+ -- Macro: AC_CHECK_FILES (FILES, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND])
+ Executes `AC_CHECK_FILE' once for each file listed in FILES.
+ Additionally, defines `HAVE_FILE' (*note Standard Symbols::) for
+ each file found. The results of each test are cached in the
+ `ac_cv_file_FILE' variable, with characters not suitable for a
+ variable name mapped to underscores.
+
+
+File: autoconf.info, Node: Libraries, Next: Library Functions, Prev: Files, Up: Existing Tests
+
+5.4 Library Files
+=================
+
+The following macros check for the presence of certain C, C++, Fortran,
+or Go library archive files.
+
+ -- Macro: AC_CHECK_LIB (LIBRARY, FUNCTION, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND], [OTHER-LIBRARIES])
+ Test whether the library LIBRARY is available by trying to link a
+ test program that calls function FUNCTION with the library.
+ FUNCTION should be a function provided by the library. Use the
+ base name of the library; e.g., to check for `-lmp', use `mp' as
+ the LIBRARY argument.
+
+ ACTION-IF-FOUND is a list of shell commands to run if the link
+ with the library succeeds; ACTION-IF-NOT-FOUND is a list of shell
+ commands to run if the link fails. If ACTION-IF-FOUND is not
+ specified, the default action prepends `-lLIBRARY' to `LIBS' and
+ defines `HAVE_LIBLIBRARY' (in all capitals). This macro is
+ intended to support building `LIBS' in a right-to-left
+ (least-dependent to most-dependent) fashion such that library
+ dependencies are satisfied as a natural side effect of consecutive
+ tests. Linkers are sensitive to library ordering so the order in
+ which `LIBS' is generated is important to reliable detection of
+ libraries.
+
+ If linking with LIBRARY results in unresolved symbols that would
+ be resolved by linking with additional libraries, give those
+ libraries as the OTHER-LIBRARIES argument, separated by spaces:
+ e.g., `-lXt -lX11'. Otherwise, this macro may fail to detect that
+ LIBRARY is present, because linking the test program can fail with
+ unresolved symbols. The OTHER-LIBRARIES argument should be
+ limited to cases where it is desirable to test for one library in
+ the presence of another that is not already in `LIBS'.
+
+ `AC_CHECK_LIB' requires some care in usage, and should be avoided
+ in some common cases. Many standard functions like `gethostbyname'
+ appear in the standard C library on some hosts, and in special
+ libraries like `nsl' on other hosts. On some hosts the special
+ libraries contain variant implementations that you may not want to
+ use. These days it is normally better to use
+ `AC_SEARCH_LIBS([gethostbyname], [nsl])' instead of
+ `AC_CHECK_LIB([nsl], [gethostbyname])'.
+
+ The result of this test is cached in the
+ `ac_cv_lib_LIBRARY_FUNCTION' variable.
+
+ -- Macro: AC_SEARCH_LIBS (FUNCTION, SEARCH-LIBS, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND], [OTHER-LIBRARIES])
+ Search for a library defining FUNCTION if it's not already
+ available. This equates to calling
+ `AC_LINK_IFELSE([AC_LANG_CALL([], [FUNCTION])])' first with no
+ libraries, then for each library listed in SEARCH-LIBS.
+
+ Prepend `-lLIBRARY' to `LIBS' for the first library found to
+ contain FUNCTION, and run ACTION-IF-FOUND. If the function is not
+ found, run ACTION-IF-NOT-FOUND.
+
+ If linking with LIBRARY results in unresolved symbols that would
+ be resolved by linking with additional libraries, give those
+ libraries as the OTHER-LIBRARIES argument, separated by spaces:
+ e.g., `-lXt -lX11'. Otherwise, this macro fails to detect that
+ FUNCTION is present, because linking the test program always fails
+ with unresolved symbols.
+
+ The result of this test is cached in the `ac_cv_search_FUNCTION'
+ variable as `none required' if FUNCTION is already available, as
+ `no' if no library containing FUNCTION was found, otherwise as the
+ `-lLIBRARY' option that needs to be prepended to `LIBS'.
+
+
+File: autoconf.info, Node: Library Functions, Next: Header Files, Prev: Libraries, Up: Existing Tests
+
+5.5 Library Functions
+=====================
+
+The following macros check for particular C library functions. If
+there is no macro specifically defined to check for a function you need,
+and you don't need to check for any special properties of it, then you
+can use one of the general function-check macros.
+
+* Menu:
+
+* Function Portability:: Pitfalls with usual functions
+* Particular Functions:: Special handling to find certain functions
+* Generic Functions:: How to find other functions
+
+
+File: autoconf.info, Node: Function Portability, Next: Particular Functions, Up: Library Functions
+
+5.5.1 Portability of C Functions
+--------------------------------
+
+Most usual functions can either be missing, or be buggy, or be limited
+on some architectures. This section tries to make an inventory of these
+portability issues. By definition, this list always requires
+additions. A much more complete list is maintained by the Gnulib
+project (*note Gnulib::), covering *note Current Posix Functions:
+(gnulib)Function Substitutes, *note Legacy Functions: (gnulib)Legacy
+Function Substitutes, and *note Glibc Functions: (gnulib)Glibc Function
+Substitutes. Please help us keep the gnulib list as complete as
+possible.
+
+`exit'
+ On ancient hosts, `exit' returned `int'. This is because `exit'
+ predates `void', and there was a long tradition of it returning
+ `int'.
+
+ On current hosts, the problem more likely is that `exit' is not
+ declared, due to C++ problems of some sort or another. For this
+ reason we suggest that test programs not invoke `exit', but return
+ from `main' instead.
+
+`free'
+ The C standard says a call `free (NULL)' does nothing, but some
+ old systems don't support this (e.g., NextStep).
+
+`isinf'
+`isnan'
+ The C99 standard says that `isinf' and `isnan' are macros. On
+ some systems just macros are available (e.g., HP-UX and Solaris
+ 10), on some systems both macros and functions (e.g., glibc
+ 2.3.2), and on some systems only functions (e.g., IRIX 6 and
+ Solaris 9). In some cases these functions are declared in
+ nonstandard headers like `<sunmath.h>' and defined in non-default
+ libraries like `-lm' or `-lsunmath'.
+
+ The C99 `isinf' and `isnan' macros work correctly with `long
+ double' arguments, but pre-C99 systems that use functions
+ typically assume `double' arguments. On such a system, `isinf'
+ incorrectly returns true for a finite `long double' argument that
+ is outside the range of `double'.
+
+ The best workaround for these issues is to use gnulib modules
+ `isinf' and `isnan' (*note Gnulib::). But a lighter weight
+ solution involves code like the following.
+
+ #include <math.h>
+
+ #ifndef isnan
+ # define isnan(x) \
+ (sizeof (x) == sizeof (long double) ? isnan_ld (x) \
+ : sizeof (x) == sizeof (double) ? isnan_d (x) \
+ : isnan_f (x))
+ static inline int isnan_f (float x) { return x != x; }
+ static inline int isnan_d (double x) { return x != x; }
+ static inline int isnan_ld (long double x) { return x != x; }
+ #endif
+
+ #ifndef isinf
+ # define isinf(x) \
+ (sizeof (x) == sizeof (long double) ? isinf_ld (x) \
+ : sizeof (x) == sizeof (double) ? isinf_d (x) \
+ : isinf_f (x))
+ static inline int isinf_f (float x)
+ { return !isnan (x) && isnan (x - x); }
+ static inline int isinf_d (double x)
+ { return !isnan (x) && isnan (x - x); }
+ static inline int isinf_ld (long double x)
+ { return !isnan (x) && isnan (x - x); }
+ #endif
+
+ Use `AC_C_INLINE' (*note C Compiler::) so that this code works on
+ compilers that lack the `inline' keyword. Some optimizing
+ compilers mishandle these definitions, but systems with that bug
+ typically have many other floating point corner-case compliance
+ problems anyway, so it's probably not worth worrying about.
+
+`malloc'
+ The C standard says a call `malloc (0)' is implementation
+ dependent. It can return either `NULL' or a new non-null pointer.
+ The latter is more common (e.g., the GNU C Library) but is by no
+ means universal. `AC_FUNC_MALLOC' can be used to insist on
+ non-`NULL' (*note Particular Functions::).
+
+`putenv'
+ Posix prefers `setenv' to `putenv'; among other things, `putenv'
+ is not required of all Posix implementations, but `setenv' is.
+
+ Posix specifies that `putenv' puts the given string directly in
+ `environ', but some systems make a copy of it instead (e.g., glibc
+ 2.0, or BSD). And when a copy is made, `unsetenv' might not free
+ it, causing a memory leak (e.g., FreeBSD 4).
+
+ On some systems `putenv ("FOO")' removes `FOO' from the
+ environment, but this is not standard usage and it dumps core on
+ some systems (e.g., AIX).
+
+ On MinGW, a call `putenv ("FOO=")' removes `FOO' from the
+ environment, rather than inserting it with an empty value.
+
+`realloc'
+ The C standard says a call `realloc (NULL, size)' is equivalent to
+ `malloc (size)', but some old systems don't support this (e.g.,
+ NextStep).
+
+`signal' handler
+ Normally `signal' takes a handler function with a return type of
+ `void', but some old systems required `int' instead. Any actual
+ `int' value returned is not used; this is only a difference in the
+ function prototype demanded.
+
+ All systems we know of in current use return `void'. The `int'
+ was to support K&R C, where of course `void' is not available.
+ The obsolete macro `AC_TYPE_SIGNAL' (*note AC_TYPE_SIGNAL::) can
+ be used to establish the correct type in all cases.
+
+ In most cases, it is more robust to use `sigaction' when it is
+ available, rather than `signal'.
+
+`snprintf'
+ The C99 standard says that if the output array isn't big enough
+ and if no other errors occur, `snprintf' and `vsnprintf' truncate
+ the output and return the number of bytes that ought to have been
+ produced. Some older systems return the truncated length (e.g.,
+ GNU C Library 2.0.x or IRIX 6.5), some a negative value (e.g.,
+ earlier GNU C Library versions), and some the buffer length
+ without truncation (e.g., 32-bit Solaris 7). Also, some buggy
+ older systems ignore the length and overrun the buffer (e.g.,
+ 64-bit Solaris 7).
+
+`sprintf'
+ The C standard says `sprintf' and `vsprintf' return the number of
+ bytes written. On some ancient systems (SunOS 4 for instance)
+ they return the buffer pointer instead, but these no longer need
+ to be worried about.
+
+`sscanf'
+ On various old systems, e.g., HP-UX 9, `sscanf' requires that its
+ input string be writable (though it doesn't actually change it).
+ This can be a problem when using `gcc' since it normally puts
+ constant strings in read-only memory (*note Incompatibilities of
+ GCC: (gcc)Incompatibilities.). Apparently in some cases even
+ having format strings read-only can be a problem.
+
+`strerror_r'
+ Posix specifies that `strerror_r' returns an `int', but many
+ systems (e.g., GNU C Library version 2.2.4) provide a different
+ version returning a `char *'. `AC_FUNC_STRERROR_R' can detect
+ which is in use (*note Particular Functions::).
+
+`strnlen'
+ AIX 4.3 provides a broken version which produces the following
+ results:
+
+ strnlen ("foobar", 0) = 0
+ strnlen ("foobar", 1) = 3
+ strnlen ("foobar", 2) = 2
+ strnlen ("foobar", 3) = 1
+ strnlen ("foobar", 4) = 0
+ strnlen ("foobar", 5) = 6
+ strnlen ("foobar", 6) = 6
+ strnlen ("foobar", 7) = 6
+ strnlen ("foobar", 8) = 6
+ strnlen ("foobar", 9) = 6
+
+`sysconf'
+ `_SC_PAGESIZE' is standard, but some older systems (e.g., HP-UX 9)
+ have `_SC_PAGE_SIZE' instead. This can be tested with `#ifdef'.
+
+`unlink'
+ The Posix spec says that `unlink' causes the given file to be
+ removed only after there are no more open file handles for it.
+ Some non-Posix hosts have trouble with this requirement, though,
+ and some DOS variants even corrupt the file system.
+
+`unsetenv'
+ On MinGW, `unsetenv' is not available, but a variable `FOO' can be
+ removed with a call `putenv ("FOO=")', as described under `putenv'
+ above.
+
+`va_copy'
+ The C99 standard provides `va_copy' for copying `va_list'
+ variables. It may be available in older environments too, though
+ possibly as `__va_copy' (e.g., `gcc' in strict pre-C99 mode).
+ These can be tested with `#ifdef'. A fallback to `memcpy (&dst,
+ &src, sizeof (va_list))' gives maximum portability.
+
+`va_list'
+ `va_list' is not necessarily just a pointer. It can be a `struct'
+ (e.g., `gcc' on Alpha), which means `NULL' is not portable. Or it
+ can be an array (e.g., `gcc' in some PowerPC configurations),
+ which means as a function parameter it can be effectively
+ call-by-reference and library routines might modify the value back
+ in the caller (e.g., `vsnprintf' in the GNU C Library 2.1).
+
+Signed `>>'
+ Normally the C `>>' right shift of a signed type replicates the
+ high bit, giving a so-called "arithmetic" shift. But care should
+ be taken since Standard C doesn't require that behavior. On those
+ few processors without a native arithmetic shift (for instance Cray
+ vector systems) zero bits may be shifted in, the same as a shift
+ of an unsigned type.
+
+Integer `/'
+ C divides signed integers by truncating their quotient toward zero,
+ yielding the same result as Fortran. However, before C99 the
+ standard allowed C implementations to take the floor or ceiling of
+ the quotient in some cases. Hardly any implementations took
+ advantage of this freedom, though, and it's probably not worth
+ worrying about this issue nowadays.
+
+
+File: autoconf.info, Node: Particular Functions, Next: Generic Functions, Prev: Function Portability, Up: Library Functions
+
+5.5.2 Particular Function Checks
+--------------------------------
+
+These macros check for particular C functions--whether they exist, and
+in some cases how they respond when given certain arguments.
+
+ -- Macro: AC_FUNC_ALLOCA
+ Check how to get `alloca'. Tries to get a builtin version by
+ checking for `alloca.h' or the predefined C preprocessor macros
+ `__GNUC__' and `_AIX'. If this macro finds `alloca.h', it defines
+ `HAVE_ALLOCA_H'.
+
+ If those attempts fail, it looks for the function in the standard C
+ library. If any of those methods succeed, it defines
+ `HAVE_ALLOCA'. Otherwise, it sets the output variable `ALLOCA' to
+ `${LIBOBJDIR}alloca.o' and defines `C_ALLOCA' (so programs can
+ periodically call `alloca (0)' to garbage collect). This variable
+ is separate from `LIBOBJS' so multiple programs can share the
+ value of `ALLOCA' without needing to create an actual library, in
+ case only some of them use the code in `LIBOBJS'. The
+ `${LIBOBJDIR}' prefix serves the same purpose as in `LIBOBJS'
+ (*note AC_LIBOBJ vs LIBOBJS::).
+
+ This macro does not try to get `alloca' from the System V R3
+ `libPW' or the System V R4 `libucb' because those libraries
+ contain some incompatible functions that cause trouble. Some
+ versions do not even contain `alloca' or contain a buggy version.
+ If you still want to use their `alloca', use `ar' to extract
+ `alloca.o' from them instead of compiling `alloca.c'.
+
+ Source files that use `alloca' should start with a piece of code
+ like the following, to declare it properly.
+
+ #ifdef STDC_HEADERS
+ # include <stdlib.h>
+ # include <stddef.h>
+ #else
+ # ifdef HAVE_STDLIB_H
+ # include <stdlib.h>
+ # endif
+ #endif
+ #ifdef HAVE_ALLOCA_H
+ # include <alloca.h>
+ #elif !defined alloca
+ # ifdef __GNUC__
+ # define alloca __builtin_alloca
+ # elif defined _AIX
+ # define alloca __alloca
+ # elif defined _MSC_VER
+ # include <malloc.h>
+ # define alloca _alloca
+ # elif !defined HAVE_ALLOCA
+ # ifdef __cplusplus
+ extern "C"
+ # endif
+ void *alloca (size_t);
+ # endif
+ #endif
+
+ -- Macro: AC_FUNC_CHOWN
+ If the `chown' function is available and works (in particular, it
+ should accept `-1' for `uid' and `gid'), define `HAVE_CHOWN'. The
+ result of this macro is cached in the `ac_cv_func_chown_works'
+ variable.
+
+ -- Macro: AC_FUNC_CLOSEDIR_VOID
+ If the `closedir' function does not return a meaningful value,
+ define `CLOSEDIR_VOID'. Otherwise, callers ought to check its
+ return value for an error indicator.
+
+ Currently this test is implemented by running a test program. When
+ cross compiling the pessimistic assumption that `closedir' does not
+ return a meaningful value is made.
+
+ The result of this macro is cached in the
+ `ac_cv_func_closedir_void' variable.
+
+ This macro is obsolescent, as `closedir' returns a meaningful value
+ on current systems. New programs need not use this macro.
+
+ -- Macro: AC_FUNC_ERROR_AT_LINE
+ If the `error_at_line' function is not found, require an
+ `AC_LIBOBJ' replacement of `error'.
+
+ The result of this macro is cached in the `ac_cv_lib_error_at_line'
+ variable.
+
+ The `AC_FUNC_ERROR_AT_LINE' macro is obsolescent. New programs
+ should use Gnulib's `error' module. *Note Gnulib::.
+
+ -- Macro: AC_FUNC_FNMATCH
+ If the `fnmatch' function conforms to Posix, define
+ `HAVE_FNMATCH'. Detect common implementation bugs, for example,
+ the bugs in Solaris 2.4.
+
+ Unlike the other specific `AC_FUNC' macros, `AC_FUNC_FNMATCH' does
+ not replace a broken/missing `fnmatch'. This is for historical
+ reasons. See `AC_REPLACE_FNMATCH' below.
+
+ The result of this macro is cached in the
+ `ac_cv_func_fnmatch_works' variable.
+
+ This macro is obsolescent. New programs should use Gnulib's
+ `fnmatch-posix' module. *Note Gnulib::.
+
+ -- Macro: AC_FUNC_FNMATCH_GNU
+ Behave like `AC_REPLACE_FNMATCH' (_replace_) but also test whether
+ `fnmatch' supports GNU extensions. Detect common implementation
+ bugs, for example, the bugs in the GNU C Library 2.1.
+
+ The result of this macro is cached in the `ac_cv_func_fnmatch_gnu'
+ variable.
+
+ This macro is obsolescent. New programs should use Gnulib's
+ `fnmatch-gnu' module. *Note Gnulib::.
+
+ -- Macro: AC_FUNC_FORK
+ This macro checks for the `fork' and `vfork' functions. If a
+ working `fork' is found, define `HAVE_WORKING_FORK'. This macro
+ checks whether `fork' is just a stub by trying to run it.
+
+ If `vfork.h' is found, define `HAVE_VFORK_H'. If a working
+ `vfork' is found, define `HAVE_WORKING_VFORK'. Otherwise, define
+ `vfork' to be `fork' for backward compatibility with previous
+ versions of `autoconf'. This macro checks for several known
+ errors in implementations of `vfork' and considers the system to
+ not have a working `vfork' if it detects any of them. It is not
+ considered to be an implementation error if a child's invocation
+ of `signal' modifies the parent's signal handler, since child
+ processes rarely change their signal handlers.
+
+ Since this macro defines `vfork' only for backward compatibility
+ with previous versions of `autoconf' you're encouraged to define it
+ yourself in new code:
+ #ifndef HAVE_WORKING_VFORK
+ # define vfork fork
+ #endif
+
+ The results of this macro are cached in the `ac_cv_func_fork_works'
+ and `ac_cv_func_vfork_works' variables. In order to override the
+ test, you also need to set the `ac_cv_func_fork' and
+ `ac_cv_func_vfork' variables.
+
+ -- Macro: AC_FUNC_FSEEKO
+ If the `fseeko' function is available, define `HAVE_FSEEKO'.
+ Define `_LARGEFILE_SOURCE' if necessary to make the prototype
+ visible on some systems (e.g., glibc 2.2). Otherwise linkage
+ problems may occur when compiling with `AC_SYS_LARGEFILE' on
+ largefile-sensitive systems where `off_t' does not default to a
+ 64bit entity. All systems with `fseeko' also supply `ftello'.
+
+ -- Macro: AC_FUNC_GETGROUPS
+ If the `getgroups' function is available and works (unlike on
+ Ultrix 4.3, where `getgroups (0, 0)' always fails), define
+ `HAVE_GETGROUPS'. Set `GETGROUPS_LIBS' to any libraries needed to
+ get that function. This macro runs `AC_TYPE_GETGROUPS'.
+
+ -- Macro: AC_FUNC_GETLOADAVG
+ Check how to get the system load averages. To perform its tests
+ properly, this macro needs the file `getloadavg.c'; therefore, be
+ sure to set the `AC_LIBOBJ' replacement directory properly (see
+ *note Generic Functions::, `AC_CONFIG_LIBOBJ_DIR').
+
+ If the system has the `getloadavg' function, define
+ `HAVE_GETLOADAVG', and set `GETLOADAVG_LIBS' to any libraries
+ necessary to get that function. Also add `GETLOADAVG_LIBS' to
+ `LIBS'. Otherwise, require an `AC_LIBOBJ' replacement for
+ `getloadavg' with source code in `DIR/getloadavg.c', and possibly
+ define several other C preprocessor macros and output variables:
+
+ 1. Define `C_GETLOADAVG'.
+
+ 2. Define `SVR4', `DGUX', `UMAX', or `UMAX4_3' if on those
+ systems.
+
+ 3. If `nlist.h' is found, define `HAVE_NLIST_H'.
+
+ 4. If `struct nlist' has an `n_un.n_name' member, define
+ `HAVE_STRUCT_NLIST_N_UN_N_NAME'. The obsolete symbol
+ `NLIST_NAME_UNION' is still defined, but do not depend upon
+ it.
+
+ 5. Programs may need to be installed set-group-ID (or
+ set-user-ID) for `getloadavg' to work. In this case, define
+ `GETLOADAVG_PRIVILEGED', set the output variable `NEED_SETGID'
+ to `true' (and otherwise to `false'), and set `KMEM_GROUP' to
+ the name of the group that should own the installed program.
+
+ The `AC_FUNC_GETLOADAVG' macro is obsolescent. New programs should
+ use Gnulib's `getloadavg' module. *Note Gnulib::.
+
+ -- Macro: AC_FUNC_GETMNTENT
+ Check for `getmntent' in the standard C library, and then in the
+ `sun', `seq', and `gen' libraries, for UNICOS, IRIX 4, PTX, and
+ UnixWare, respectively. Then, if `getmntent' is available, define
+ `HAVE_GETMNTENT' and set `ac_cv_func_getmntent' to `yes'.
+ Otherwise set `ac_cv_func_getmntent' to `no'.
+
+ The result of this macro can be overridden by setting the cache
+ variable `ac_cv_search_getmntent'.
+
+ -- Macro: AC_FUNC_GETPGRP
+ Define `GETPGRP_VOID' if it is an error to pass 0 to `getpgrp';
+ this is the Posix behavior. On older BSD systems, you must pass 0
+ to `getpgrp', as it takes an argument and behaves like Posix's
+ `getpgid'.
+
+ #ifdef GETPGRP_VOID
+ pid = getpgrp ();
+ #else
+ pid = getpgrp (0);
+ #endif
+
+ This macro does not check whether `getpgrp' exists at all; if you
+ need to work in that situation, first call `AC_CHECK_FUNC' for
+ `getpgrp'.
+
+ The result of this macro is cached in the `ac_cv_func_getpgrp_void'
+ variable.
+
+ This macro is obsolescent, as current systems have a `getpgrp'
+ whose signature conforms to Posix. New programs need not use this
+ macro.
+
+ -- Macro: AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
+ If `link' is a symbolic link, then `lstat' should treat `link/'
+ the same as `link/.'. However, many older `lstat' implementations
+ incorrectly ignore trailing slashes.
+
+ It is safe to assume that if `lstat' incorrectly ignores trailing
+ slashes, then other symbolic-link-aware functions like `unlink'
+ also incorrectly ignore trailing slashes.
+
+ If `lstat' behaves properly, define
+ `LSTAT_FOLLOWS_SLASHED_SYMLINK', otherwise require an `AC_LIBOBJ'
+ replacement of `lstat'.
+
+ The result of this macro is cached in the
+ `ac_cv_func_lstat_dereferences_slashed_symlink' variable.
+
+ The `AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK' macro is obsolescent.
+ New programs should use Gnulib's `lstat' module. *Note Gnulib::.
+
+ -- Macro: AC_FUNC_MALLOC
+ If the `malloc' function is compatible with the GNU C library
+ `malloc' (i.e., `malloc (0)' returns a valid pointer), define
+ `HAVE_MALLOC' to 1. Otherwise define `HAVE_MALLOC' to 0, ask for
+ an `AC_LIBOBJ' replacement for `malloc', and define `malloc' to
+ `rpl_malloc' so that the native `malloc' is not used in the main
+ project.
+
+ Typically, the replacement file `malloc.c' should look like (note
+ the `#undef malloc'):
+
+ #include <config.h>
+ #undef malloc
+
+ #include <sys/types.h>
+
+ void *malloc ();
+
+ /* Allocate an N-byte block of memory from the heap.
+ If N is zero, allocate a 1-byte block. */
+
+ void *
+ rpl_malloc (size_t n)
+ {
+ if (n == 0)
+ n = 1;
+ return malloc (n);
+ }
+
+ The result of this macro is cached in the
+ `ac_cv_func_malloc_0_nonnull' variable.
+
+ -- Macro: AC_FUNC_MBRTOWC
+ Define `HAVE_MBRTOWC' to 1 if the function `mbrtowc' and the type
+ `mbstate_t' are properly declared.
+
+ The result of this macro is cached in the `ac_cv_func_mbrtowc'
+ variable.
+
+ -- Macro: AC_FUNC_MEMCMP
+ If the `memcmp' function is not available, or does not work on
+ 8-bit data (like the one on SunOS 4.1.3), or fails when comparing
+ 16 bytes or more and with at least one buffer not starting on a
+ 4-byte boundary (such as the one on NeXT x86 OpenStep), require an
+ `AC_LIBOBJ' replacement for `memcmp'.
+
+ The result of this macro is cached in the
+ `ac_cv_func_memcmp_working' variable.
+
+ This macro is obsolescent, as current systems have a working
+ `memcmp'. New programs need not use this macro.
+
+ -- Macro: AC_FUNC_MKTIME
+ If the `mktime' function is not available, or does not work
+ correctly, require an `AC_LIBOBJ' replacement for `mktime'. For
+ the purposes of this test, `mktime' should conform to the Posix
+ standard and should be the inverse of `localtime'.
+
+ The result of this macro is cached in the
+ `ac_cv_func_working_mktime' variable.
+
+ The `AC_FUNC_MKTIME' macro is obsolescent. New programs should
+ use Gnulib's `mktime' module. *Note Gnulib::.
+
+ -- Macro: AC_FUNC_MMAP
+ If the `mmap' function exists and works correctly, define
+ `HAVE_MMAP'. This checks only private fixed mapping of
+ already-mapped memory.
+
+ The result of this macro is cached in the
+ `ac_cv_func_mmap_fixed_mapped' variable.
+
+ -- Macro: AC_FUNC_OBSTACK
+ If the obstacks are found, define `HAVE_OBSTACK', else require an
+ `AC_LIBOBJ' replacement for `obstack'.
+
+ The result of this macro is cached in the `ac_cv_func_obstack'
+ variable.
+
+ -- Macro: AC_FUNC_REALLOC
+ If the `realloc' function is compatible with the GNU C library
+ `realloc' (i.e., `realloc (NULL, 0)' returns a valid pointer),
+ define `HAVE_REALLOC' to 1. Otherwise define `HAVE_REALLOC' to 0,
+ ask for an `AC_LIBOBJ' replacement for `realloc', and define
+ `realloc' to `rpl_realloc' so that the native `realloc' is not
+ used in the main project. See `AC_FUNC_MALLOC' for details.
+
+ The result of this macro is cached in the
+ `ac_cv_func_realloc_0_nonnull' variable.
+
+ -- Macro: AC_FUNC_SELECT_ARGTYPES
+ Determines the correct type to be passed for each of the `select'
+ function's arguments, and defines those types in
+ `SELECT_TYPE_ARG1', `SELECT_TYPE_ARG234', and `SELECT_TYPE_ARG5'
+ respectively. `SELECT_TYPE_ARG1' defaults to `int',
+ `SELECT_TYPE_ARG234' defaults to `int *', and `SELECT_TYPE_ARG5'
+ defaults to `struct timeval *'.
+
+ This macro is obsolescent, as current systems have a `select' whose
+ signature conforms to Posix. New programs need not use this macro.
+
+ -- Macro: AC_FUNC_SETPGRP
+ If `setpgrp' takes no argument (the Posix version), define
+ `SETPGRP_VOID'. Otherwise, it is the BSD version, which takes two
+ process IDs as arguments. This macro does not check whether
+ `setpgrp' exists at all; if you need to work in that situation,
+ first call `AC_CHECK_FUNC' for `setpgrp'.
+
+ The result of this macro is cached in the `ac_cv_func_setpgrp_void'
+ variable.
+
+ This macro is obsolescent, as current systems have a `setpgrp'
+ whose signature conforms to Posix. New programs need not use this
+ macro.
+
+ -- Macro: AC_FUNC_STAT
+ -- Macro: AC_FUNC_LSTAT
+ Determine whether `stat' or `lstat' have the bug that it succeeds
+ when given the zero-length file name as argument. The `stat' and
+ `lstat' from SunOS 4.1.4 and the Hurd (as of 1998-11-01) do this.
+
+ If it does, then define `HAVE_STAT_EMPTY_STRING_BUG' (or
+ `HAVE_LSTAT_EMPTY_STRING_BUG') and ask for an `AC_LIBOBJ'
+ replacement of it.
+
+ The results of these macros are cached in the
+ `ac_cv_func_stat_empty_string_bug' and the
+ `ac_cv_func_lstat_empty_string_bug' variables, respectively.
+
+ These macros are obsolescent, as no current systems have the bug.
+ New programs need not use these macros.
+
+ -- Macro: AC_FUNC_STRCOLL
+ If the `strcoll' function exists and works correctly, define
+ `HAVE_STRCOLL'. This does a bit more than
+ `AC_CHECK_FUNCS(strcoll)', because some systems have incorrect
+ definitions of `strcoll' that should not be used.
+
+ The result of this macro is cached in the
+ `ac_cv_func_strcoll_works' variable.
+
+ -- Macro: AC_FUNC_STRERROR_R
+ If `strerror_r' is available, define `HAVE_STRERROR_R', and if it
+ is declared, define `HAVE_DECL_STRERROR_R'. If it returns a `char
+ *' message, define `STRERROR_R_CHAR_P'; otherwise it returns an
+ `int' error number. The Thread-Safe Functions option of Posix
+ requires `strerror_r' to return `int', but many systems
+ (including, for example, version 2.2.4 of the GNU C Library)
+ return a `char *' value that is not necessarily equal to the
+ buffer argument.
+
+ The result of this macro is cached in the
+ `ac_cv_func_strerror_r_char_p' variable.
+
+ -- Macro: AC_FUNC_STRFTIME
+ Check for `strftime' in the `intl' library, for SCO Unix. Then,
+ if `strftime' is available, define `HAVE_STRFTIME'.
+
+ This macro is obsolescent, as no current systems require the `intl'
+ library for `strftime'. New programs need not use this macro.
+
+ -- Macro: AC_FUNC_STRTOD
+ If the `strtod' function does not exist or doesn't work correctly,
+ ask for an `AC_LIBOBJ' replacement of `strtod'. In this case,
+ because `strtod.c' is likely to need `pow', set the output
+ variable `POW_LIB' to the extra library needed.
+
+ This macro caches its result in the `ac_cv_func_strtod' variable
+ and depends upon the result in the `ac_cv_func_pow' variable.
+
+ The `AC_FUNC_STRTOD' macro is obsolescent. New programs should
+ use Gnulib's `strtod' module. *Note Gnulib::.
+
+ -- Macro: AC_FUNC_STRTOLD
+ If the `strtold' function exists and conforms to C99, define
+ `HAVE_STRTOLD'.
+
+ This macro caches its result in the `ac_cv_func_strtold' variable.
+
+ -- Macro: AC_FUNC_STRNLEN
+ If the `strnlen' function is not available, or is buggy (like the
+ one from AIX 4.3), require an `AC_LIBOBJ' replacement for it.
+
+ This macro caches its result in the `ac_cv_func_strnlen_working'
+ variable.
+
+ -- Macro: AC_FUNC_UTIME_NULL
+ If `utime (FILE, NULL)' sets FILE's timestamp to the present,
+ define `HAVE_UTIME_NULL'.
+
+ This macro caches its result in the `ac_cv_func_utime_null'
+ variable.
+
+ This macro is obsolescent, as all current systems have a `utime'
+ that behaves this way. New programs need not use this macro.
+
+ -- Macro: AC_FUNC_VPRINTF
+ If `vprintf' is found, define `HAVE_VPRINTF'. Otherwise, if
+ `_doprnt' is found, define `HAVE_DOPRNT'. (If `vprintf' is
+ available, you may assume that `vfprintf' and `vsprintf' are also
+ available.)
+
+ This macro is obsolescent, as all current systems have `vprintf'.
+ New programs need not use this macro.
+
+ -- Macro: AC_REPLACE_FNMATCH
+ If the `fnmatch' function does not conform to Posix (see
+ `AC_FUNC_FNMATCH'), ask for its `AC_LIBOBJ' replacement.
+
+ The files `fnmatch.c', `fnmatch_loop.c', and `fnmatch_.h' in the
+ `AC_LIBOBJ' replacement directory are assumed to contain a copy of
+ the source code of GNU `fnmatch'. If necessary, this source code
+ is compiled as an `AC_LIBOBJ' replacement, and the `fnmatch_.h'
+ file is linked to `fnmatch.h' so that it can be included in place
+ of the system `<fnmatch.h>'.
+
+ This macro caches its result in the `ac_cv_func_fnmatch_works'
+ variable.
+
+ This macro is obsolescent, as it assumes the use of particular
+ source files. New programs should use Gnulib's `fnmatch-posix'
+ module, which provides this macro along with the source files.
+ *Note Gnulib::.
+
+
+File: autoconf.info, Node: Generic Functions, Prev: Particular Functions, Up: Library Functions
+
+5.5.3 Generic Function Checks
+-----------------------------
+
+These macros are used to find functions not covered by the "particular"
+test macros. If the functions might be in libraries other than the
+default C library, first call `AC_CHECK_LIB' for those libraries. If
+you need to check the behavior of a function as well as find out
+whether it is present, you have to write your own test for it (*note
+Writing Tests::).
+
+ -- Macro: AC_CHECK_FUNC (FUNCTION, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND])
+ If C function FUNCTION is available, run shell commands
+ ACTION-IF-FOUND, otherwise ACTION-IF-NOT-FOUND. If you just want
+ to define a symbol if the function is available, consider using
+ `AC_CHECK_FUNCS' instead. This macro checks for functions with C
+ linkage even when `AC_LANG(C++)' has been called, since C is more
+ standardized than C++. (*note Language Choice::, for more
+ information about selecting the language for checks.)
+
+ This macro caches its result in the `ac_cv_func_FUNCTION' variable.
+
+ -- Macro: AC_CHECK_FUNCS (FUNCTION..., [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND])
+ For each FUNCTION enumerated in the blank-or-newline-separated
+ argument list, define `HAVE_FUNCTION' (in all capitals) if it is
+ available. If ACTION-IF-FOUND is given, it is additional shell
+ code to execute when one of the functions is found. You can give
+ it a value of `break' to break out of the loop on the first match.
+ If ACTION-IF-NOT-FOUND is given, it is executed when one of the
+ functions is not found.
+
+ Results are cached for each FUNCTION as in `AC_CHECK_FUNC'.
+
+ -- Macro: AC_CHECK_FUNCS_ONCE (FUNCTION...)
+ For each FUNCTION enumerated in the blank-or-newline-separated
+ argument list, define `HAVE_FUNCTION' (in all capitals) if it is
+ available. This is a once-only variant of `AC_CHECK_FUNCS'. It
+ generates the checking code at most once, so that `configure' is
+ smaller and faster; but the checks cannot be conditionalized and
+ are always done once, early during the `configure' run.
+
+
+ Autoconf follows a philosophy that was formed over the years by those
+who have struggled for portability: isolate the portability issues in
+specific files, and then program as if you were in a Posix environment.
+Some functions may be missing or unfixable, and your package must be
+ready to replace them.
+
+ Suitable replacements for many such problem functions are available
+from Gnulib (*note Gnulib::).
+
+ -- Macro: AC_LIBOBJ (FUNCTION)
+ Specify that `FUNCTION.c' must be included in the executables to
+ replace a missing or broken implementation of FUNCTION.
+
+ Technically, it adds `FUNCTION.$ac_objext' to the output variable
+ `LIBOBJS' if it is not already in, and calls `AC_LIBSOURCE' for
+ `FUNCTION.c'. You should not directly change `LIBOBJS', since
+ this is not traceable.
+
+ -- Macro: AC_LIBSOURCE (FILE)
+ Specify that FILE might be needed to compile the project. If you
+ need to know what files might be needed by a `configure.ac', you
+ should trace `AC_LIBSOURCE'. FILE must be a literal.
+
+ This macro is called automatically from `AC_LIBOBJ', but you must
+ call it explicitly if you pass a shell variable to `AC_LIBOBJ'. In
+ that case, since shell variables cannot be traced statically, you
+ must pass to `AC_LIBSOURCE' any possible files that the shell
+ variable might cause `AC_LIBOBJ' to need. For example, if you
+ want to pass a variable `$foo_or_bar' to `AC_LIBOBJ' that holds
+ either `"foo"' or `"bar"', you should do:
+
+ AC_LIBSOURCE([foo.c])
+ AC_LIBSOURCE([bar.c])
+ AC_LIBOBJ([$foo_or_bar])
+
+ There is usually a way to avoid this, however, and you are
+ encouraged to simply call `AC_LIBOBJ' with literal arguments.
+
+ Note that this macro replaces the obsolete `AC_LIBOBJ_DECL', with
+ slightly different semantics: the old macro took the function name,
+ e.g., `foo', as its argument rather than the file name.
+
+ -- Macro: AC_LIBSOURCES (FILES)
+ Like `AC_LIBSOURCE', but accepts one or more FILES in a
+ comma-separated M4 list. Thus, the above example might be
+ rewritten:
+
+ AC_LIBSOURCES([foo.c, bar.c])
+ AC_LIBOBJ([$foo_or_bar])
+
+ -- Macro: AC_CONFIG_LIBOBJ_DIR (DIRECTORY)
+ Specify that `AC_LIBOBJ' replacement files are to be found in
+ DIRECTORY, a name relative to the top level of the source tree.
+ The replacement directory defaults to `.', the top level
+ directory, and the most typical value is `lib', corresponding to
+ `AC_CONFIG_LIBOBJ_DIR([lib])'.
+
+ `configure' might need to know the replacement directory for the
+ following reasons: (i) some checks use the replacement files, (ii)
+ some macros bypass broken system headers by installing links to the
+ replacement headers (iii) when used in conjunction with Automake,
+ within each makefile, DIRECTORY is used as a relative path from
+ `$(top_srcdir)' to each object named in `LIBOBJS' and `LTLIBOBJS',
+ etc.
+
+
+ It is common to merely check for the existence of a function, and ask
+for its `AC_LIBOBJ' replacement if missing. The following macro is a
+convenient shorthand.
+
+ -- Macro: AC_REPLACE_FUNCS (FUNCTION...)
+ Like `AC_CHECK_FUNCS', but uses `AC_LIBOBJ(FUNCTION)' as
+ ACTION-IF-NOT-FOUND. You can declare your replacement function by
+ enclosing the prototype in `#ifndef HAVE_FUNCTION'. If the system
+ has the function, it probably declares it in a header file you
+ should be including, so you shouldn't redeclare it lest your
+ declaration conflict.
+
+
+File: autoconf.info, Node: Header Files, Next: Declarations, Prev: Library Functions, Up: Existing Tests
+
+5.6 Header Files
+================
+
+The following macros check for the presence of certain C header files.
+If there is no macro specifically defined to check for a header file
+you need, and you don't need to check for any special properties of it,
+then you can use one of the general header-file check macros.
+
+* Menu:
+
+* Header Portability:: Collected knowledge on common headers
+* Particular Headers:: Special handling to find certain headers
+* Generic Headers:: How to find other headers
+
+
+File: autoconf.info, Node: Header Portability, Next: Particular Headers, Up: Header Files
+
+5.6.1 Portability of Headers
+----------------------------
+
+This section documents some collected knowledge about common headers,
+and the problems they cause. By definition, this list always requires
+additions. A much more complete list is maintained by the Gnulib
+project (*note Gnulib::), covering *note Posix Headers: (gnulib)Header
+File Substitutes. and *note Glibc Headers: (gnulib)Glibc Header File
+Substitutes. Please help us keep the gnulib list as complete as
+possible.
+
+`limits.h'
+ C99 says that `limits.h' defines `LLONG_MIN', `LLONG_MAX', and
+ `ULLONG_MAX', but many almost-C99 environments (e.g., default GCC
+ 4.0.2 + glibc 2.4) do not define them.
+
+`inttypes.h' vs. `stdint.h'
+ The C99 standard says that `inttypes.h' includes `stdint.h', so
+ there's no need to include `stdint.h' separately in a standard
+ environment. Some implementations have `inttypes.h' but not
+ `stdint.h' (e.g., Solaris 7), but we don't know of any
+ implementation that has `stdint.h' but not `inttypes.h'.
+
+`linux/irda.h'
+ It requires `linux/types.h' and `sys/socket.h'.
+
+`linux/random.h'
+ It requires `linux/types.h'.
+
+`net/if.h'
+ On Darwin, this file requires that `sys/socket.h' be included
+ beforehand. One should run:
+
+ AC_CHECK_HEADERS([sys/socket.h])
+ AC_CHECK_HEADERS([net/if.h], [], [],
+ [#include <stdio.h>
+ #ifdef STDC_HEADERS
+ # include <stdlib.h>
+ # include <stddef.h>
+ #else
+ # ifdef HAVE_STDLIB_H
+ # include <stdlib.h>
+ # endif
+ #endif
+ #ifdef HAVE_SYS_SOCKET_H
+ # include <sys/socket.h>
+ #endif
+ ])
+
+`netinet/if_ether.h'
+ On Darwin, this file requires that `stdio.h' and `sys/socket.h' be
+ included beforehand. One should run:
+
+ AC_CHECK_HEADERS([sys/socket.h])
+ AC_CHECK_HEADERS([netinet/if_ether.h], [], [],
+ [#include <stdio.h>
+ #ifdef STDC_HEADERS
+ # include <stdlib.h>
+ # include <stddef.h>
+ #else
+ # ifdef HAVE_STDLIB_H
+ # include <stdlib.h>
+ # endif
+ #endif
+ #ifdef HAVE_SYS_SOCKET_H
+ # include <sys/socket.h>
+ #endif
+ ])
+
+`stdint.h'
+ See above, item `inttypes.h' vs. `stdint.h'.
+
+`stdlib.h'
+ On many systems (e.g., Darwin), `stdio.h' is a prerequisite.
+
+`sys/mount.h'
+ On FreeBSD 4.8 on ia32 and using gcc version 2.95.4,
+ `sys/params.h' is a prerequisite.
+
+`sys/ptem.h'
+ On Solaris 8, `sys/stream.h' is a prerequisite.
+
+`sys/socket.h'
+ On Darwin, `stdlib.h' is a prerequisite.
+
+`sys/ucred.h'
+ On Tru64 5.1, `sys/types.h' is a prerequisite.
+
+`X11/extensions/scrnsaver.h'
+ Using XFree86, this header requires `X11/Xlib.h', which is probably
+ so required that you might not even consider looking for it.
+
+ AC_CHECK_HEADERS([X11/extensions/scrnsaver.h], [], [],
+ [[#include <X11/Xlib.h>
+ ]])
+
+
+File: autoconf.info, Node: Particular Headers, Next: Generic Headers, Prev: Header Portability, Up: Header Files
+
+5.6.2 Particular Header Checks
+------------------------------
+
+These macros check for particular system header files--whether they
+exist, and in some cases whether they declare certain symbols.
+
+ -- Macro: AC_CHECK_HEADER_STDBOOL
+ Check whether `stdbool.h' exists and conforms to C99, and cache the
+ result in the `ac_cv_header_stdbool_h' variable. If the type
+ `_Bool' is defined, define `HAVE__BOOL' to 1.
+
+ This macro is intended for use by Gnulib (*note Gnulib::) and other
+ packages that supply a substitute `stdbool.h' on platforms lacking
+ a conforming one. The `AC_HEADER_STDBOOL' macro is better for code
+ that explicitly checks for `stdbool.h'.
+
+ -- Macro: AC_HEADER_ASSERT
+ Check whether to enable assertions in the style of `assert.h'.
+ Assertions are enabled by default, but the user can override this
+ by invoking `configure' with the `--disable-assert' option.
+
+ -- Macro: AC_HEADER_DIRENT
+ Check for the following header files. For the first one that is
+ found and defines `DIR', define the listed C preprocessor macro:
+
+ `dirent.h' `HAVE_DIRENT_H'
+ `sys/ndir.h' `HAVE_SYS_NDIR_H'
+ `sys/dir.h' `HAVE_SYS_DIR_H'
+ `ndir.h' `HAVE_NDIR_H'
+
+ The directory-library declarations in your source code should look
+ something like the following:
+
+ #include <sys/types.h>
+ #ifdef HAVE_DIRENT_H
+ # include <dirent.h>
+ # define NAMLEN(dirent) strlen ((dirent)->d_name)
+ #else
+ # define dirent direct
+ # define NAMLEN(dirent) ((dirent)->d_namlen)
+ # ifdef HAVE_SYS_NDIR_H
+ # include <sys/ndir.h>
+ # endif
+ # ifdef HAVE_SYS_DIR_H
+ # include <sys/dir.h>
+ # endif
+ # ifdef HAVE_NDIR_H
+ # include <ndir.h>
+ # endif
+ #endif
+
+ Using the above declarations, the program would declare variables
+ to be of type `struct dirent', not `struct direct', and would
+ access the length of a directory entry name by passing a pointer
+ to a `struct dirent' to the `NAMLEN' macro.
+
+ This macro also checks for the SCO Xenix `dir' and `x' libraries.
+
+ This macro is obsolescent, as all current systems with directory
+ libraries have `<dirent.h>'. New programs need not use this macro.
+
+ Also see `AC_STRUCT_DIRENT_D_INO' and `AC_STRUCT_DIRENT_D_TYPE'
+ (*note Particular Structures::).
+
+ -- Macro: AC_HEADER_MAJOR
+ If `sys/types.h' does not define `major', `minor', and `makedev',
+ but `sys/mkdev.h' does, define `MAJOR_IN_MKDEV'; otherwise, if
+ `sys/sysmacros.h' does, define `MAJOR_IN_SYSMACROS'.
+
+ -- Macro: AC_HEADER_RESOLV
+ Checks for header `resolv.h', checking for prerequisites first.
+ To properly use `resolv.h', your code should contain something like
+ the following:
+
+ #ifdef HAVE_SYS_TYPES_H
+ # include <sys/types.h>
+ #endif
+ #ifdef HAVE_NETINET_IN_H
+ # include <netinet/in.h> /* inet_ functions / structs */
+ #endif
+ #ifdef HAVE_ARPA_NAMESER_H
+ # include <arpa/nameser.h> /* DNS HEADER struct */
+ #endif
+ #ifdef HAVE_NETDB_H
+ # include <netdb.h>
+ #endif
+ #include <resolv.h>
+
+ -- Macro: AC_HEADER_STAT
+ If the macros `S_ISDIR', `S_ISREG', etc. defined in `sys/stat.h'
+ do not work properly (returning false positives), define
+ `STAT_MACROS_BROKEN'. This is the case on Tektronix UTekV, Amdahl
+ UTS and Motorola System V/88.
+
+ This macro is obsolescent, as no current systems have the bug.
+ New programs need not use this macro.
+
+ -- Macro: AC_HEADER_STDBOOL
+ If `stdbool.h' exists and conforms to C99, define `HAVE_STDBOOL_H'
+ to 1; if the type `_Bool' is defined, define `HAVE__BOOL' to 1.
+ To fulfill the C99 requirements, your program could contain the
+ following code:
+
+ #ifdef HAVE_STDBOOL_H
+ # include <stdbool.h>
+ #else
+ # ifndef HAVE__BOOL
+ # ifdef __cplusplus
+ typedef bool _Bool;
+ # else
+ # define _Bool signed char
+ # endif
+ # endif
+ # define bool _Bool
+ # define false 0
+ # define true 1
+ # define __bool_true_false_are_defined 1
+ #endif
+
+ Alternatively you can use the `stdbool' package of Gnulib (*note
+ Gnulib::). It simplifies your code so that it can say just
+ `#include <stdbool.h>', and it adds support for less-common
+ platforms.
+
+ This macro caches its result in the `ac_cv_header_stdbool_h'
+ variable.
+
+ This macro differs from `AC_CHECK_HEADER_STDBOOL' only in that it
+ defines `HAVE_STDBOOL_H' whereas `AC_CHECK_HEADER_STDBOOL' does
+ not.
+
+ -- Macro: AC_HEADER_STDC
+ Define `STDC_HEADERS' if the system has C header files conforming
+ to ANSI C89 (ISO C90). Specifically, this macro checks for
+ `stdlib.h', `stdarg.h', `string.h', and `float.h'; if the system
+ has those, it probably has the rest of the C89 header files. This
+ macro also checks whether `string.h' declares `memchr' (and thus
+ presumably the other `mem' functions), whether `stdlib.h' declare
+ `free' (and thus presumably `malloc' and other related functions),
+ and whether the `ctype.h' macros work on characters with the high
+ bit set, as the C standard requires.
+
+ If you use this macro, your code can refer to `STDC_HEADERS' to
+ determine whether the system has conforming header files (and
+ probably C library functions).
+
+ This macro caches its result in the `ac_cv_header_stdc' variable.
+
+ This macro is obsolescent, as current systems have conforming
+ header files. New programs need not use this macro.
+
+ Nowadays `string.h' is part of the C standard and declares
+ functions like `strcpy', and `strings.h' is standardized by Posix
+ and declares BSD functions like `bcopy'; but historically, string
+ functions were a major sticking point in this area. If you still
+ want to worry about portability to ancient systems without
+ standard headers, there is so much variation that it is probably
+ easier to declare the functions you use than to figure out exactly
+ what the system header files declare. Some ancient systems
+ contained a mix of functions from the C standard and from BSD;
+ some were mostly standard but lacked `memmove'; some defined the
+ BSD functions as macros in `string.h' or `strings.h'; some had
+ only the BSD functions but `string.h'; some declared the memory
+ functions in `memory.h', some in `string.h'; etc. It is probably
+ sufficient to check for one string function and one memory
+ function; if the library had the standard versions of those then
+ it probably had most of the others. If you put the following in
+ `configure.ac':
+
+ # This example is obsolescent.
+ # Nowadays you can omit these macro calls.
+ AC_HEADER_STDC
+ AC_CHECK_FUNCS([strchr memcpy])
+
+ then, in your code, you can use declarations like this:
+
+ /* This example is obsolescent.
+ Nowadays you can just #include <string.h>. */
+ #ifdef STDC_HEADERS
+ # include <string.h>
+ #else
+ # ifndef HAVE_STRCHR
+ # define strchr index
+ # define strrchr rindex
+ # endif
+ char *strchr (), *strrchr ();
+ # ifndef HAVE_MEMCPY
+ # define memcpy(d, s, n) bcopy ((s), (d), (n))
+ # define memmove(d, s, n) bcopy ((s), (d), (n))
+ # endif
+ #endif
+
+ If you use a function like `memchr', `memset', `strtok', or
+ `strspn', which have no BSD equivalent, then macros don't suffice
+ to port to ancient hosts; you must provide an implementation of
+ each function. An easy way to incorporate your implementations
+ only when needed (since the ones in system C libraries may be hand
+ optimized) is to, taking `memchr' for example, put it in
+ `memchr.c' and use `AC_REPLACE_FUNCS([memchr])'.
+
+ -- Macro: AC_HEADER_SYS_WAIT
+ If `sys/wait.h' exists and is compatible with Posix, define
+ `HAVE_SYS_WAIT_H'. Incompatibility can occur if `sys/wait.h' does
+ not exist, or if it uses the old BSD `union wait' instead of `int'
+ to store a status value. If `sys/wait.h' is not Posix compatible,
+ then instead of including it, define the Posix macros with their
+ usual interpretations. Here is an example:
+
+ #include <sys/types.h>
+ #ifdef HAVE_SYS_WAIT_H
+ # include <sys/wait.h>
+ #endif
+ #ifndef WEXITSTATUS
+ # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
+ #endif
+ #ifndef WIFEXITED
+ # define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+ #endif
+
+ This macro caches its result in the `ac_cv_header_sys_wait_h'
+ variable.
+
+ This macro is obsolescent, as current systems are compatible with
+ Posix. New programs need not use this macro.
+
+ `_POSIX_VERSION' is defined when `unistd.h' is included on Posix
+systems. If there is no `unistd.h', it is definitely not a Posix
+system. However, some non-Posix systems do have `unistd.h'.
+
+ The way to check whether the system supports Posix is:
+
+ #ifdef HAVE_UNISTD_H
+ # include <sys/types.h>
+ # include <unistd.h>
+ #endif
+
+ #ifdef _POSIX_VERSION
+ /* Code for Posix systems. */
+ #endif
+
+ -- Macro: AC_HEADER_TIME
+ If a program may include both `time.h' and `sys/time.h', define
+ `TIME_WITH_SYS_TIME'. On some ancient systems, `sys/time.h'
+ included `time.h', but `time.h' was not protected against multiple
+ inclusion, so programs could not explicitly include both files.
+ This macro is useful in programs that use, for example, `struct
+ timeval' as well as `struct tm'. It is best used in conjunction
+ with `HAVE_SYS_TIME_H', which can be checked for using
+ `AC_CHECK_HEADERS([sys/time.h])'.
+
+ #ifdef TIME_WITH_SYS_TIME
+ # include <sys/time.h>
+ # include <time.h>
+ #else
+ # ifdef HAVE_SYS_TIME_H
+ # include <sys/time.h>
+ # else
+ # include <time.h>
+ # endif
+ #endif
+
+ This macro caches its result in the `ac_cv_header_time' variable.
+
+ This macro is obsolescent, as current systems can include both
+ files when they exist. New programs need not use this macro.
+
+ -- Macro: AC_HEADER_TIOCGWINSZ
+ If the use of `TIOCGWINSZ' requires `<sys/ioctl.h>', then define
+ `GWINSZ_IN_SYS_IOCTL'. Otherwise `TIOCGWINSZ' can be found in
+ `<termios.h>'.
+
+ Use:
+
+ #ifdef HAVE_TERMIOS_H
+ # include <termios.h>
+ #endif
+
+ #ifdef GWINSZ_IN_SYS_IOCTL
+ # include <sys/ioctl.h>
+ #endif
+
+
+File: autoconf.info, Node: Generic Headers, Prev: Particular Headers, Up: Header Files
+
+5.6.3 Generic Header Checks
+---------------------------
+
+These macros are used to find system header files not covered by the
+"particular" test macros. If you need to check the contents of a header
+as well as find out whether it is present, you have to write your own
+test for it (*note Writing Tests::).
+
+ -- Macro: AC_CHECK_HEADER (HEADER-FILE, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND], [INCLUDES])
+ If the system header file HEADER-FILE is compilable, execute shell
+ commands ACTION-IF-FOUND, otherwise execute ACTION-IF-NOT-FOUND.
+ If you just want to define a symbol if the header file is
+ available, consider using `AC_CHECK_HEADERS' instead.
+
+ INCLUDES is decoded to determine the appropriate include
+ directives. If omitted or empty, `configure' will check for both
+ header existence (with the preprocessor) and usability (with the
+ compiler), using `AC_INCLUDES_DEFAULT' for the compile test. If
+ there is a discrepancy between the results, a warning is issued to
+ the user, and the compiler results are favored (*note Present But
+ Cannot Be Compiled::). In general, favoring the compiler results
+ means that a header will be treated as not found even though the
+ file exists, because you did not provide enough prerequisites.
+
+ Providing a non-empty INCLUDES argument allows the code to provide
+ any prerequisites prior to including the header under test; it is
+ common to use the argument `AC_INCLUDES_DEFAULT' (*note Default
+ Includes::). With an explicit fourth argument, no preprocessor
+ test is needed. As a special case, an INCLUDES of exactly `-'
+ triggers the older preprocessor check, which merely determines
+ existence of the file in the preprocessor search path; this should
+ only be used as a last resort (it is safer to determine the actual
+ prerequisites and perform a compiler check, or else use
+ `AC_PREPROC_IFELSE' to make it obvious that only a preprocessor
+ check is desired).
+
+ This macro caches its result in the `ac_cv_header_HEADER-FILE'
+ variable, with characters not suitable for a variable name mapped
+ to underscores.
+
+ -- Macro: AC_CHECK_HEADERS (HEADER-FILE..., [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND], [INCLUDES])
+ For each given system header file HEADER-FILE in the
+ blank-separated argument list that exists, define
+ `HAVE_HEADER-FILE' (in all capitals). If ACTION-IF-FOUND is
+ given, it is additional shell code to execute when one of the
+ header files is found. You can give it a value of `break' to
+ break out of the loop on the first match. If ACTION-IF-NOT-FOUND
+ is given, it is executed when one of the header files is not found.
+
+ INCLUDES is interpreted as in `AC_CHECK_HEADER', in order to
+ choose the set of preprocessor directives supplied before the
+ header under test.
+
+ This macro caches its result in the `ac_cv_header_HEADER-FILE'
+ variable, with characters not suitable for a variable name mapped
+ to underscores.
+
+ Previous versions of Autoconf merely checked whether the header was
+accepted by the preprocessor. This was changed because the old test was
+inappropriate for typical uses. Headers are typically used to compile,
+not merely to preprocess, and the old behavior sometimes accepted
+headers that clashed at compile-time (*note Present But Cannot Be
+Compiled::). If you need to check whether a header is preprocessable,
+you can use `AC_PREPROC_IFELSE' (*note Running the Preprocessor::).
+
+ Actually requiring a header to compile improves the robustness of the
+test, but it also requires that you make sure that headers that must be
+included before the HEADER-FILE be part of the INCLUDES, (*note Default
+Includes::). If looking for `bar.h', which requires that `foo.h' be
+included before if it exists, we suggest the following scheme:
+
+AC_CHECK_HEADERS([foo.h])
+AC_CHECK_HEADERS([bar.h], [], [],
+[#ifdef HAVE_FOO_H
+# include <foo.h>
+#endif
+])
+
+ The following variant generates smaller, faster `configure' files if
+you do not need the full power of `AC_CHECK_HEADERS'.
+
+ -- Macro: AC_CHECK_HEADERS_ONCE (HEADER-FILE...)
+ For each given system header file HEADER-FILE in the
+ blank-separated argument list that exists, define
+ `HAVE_HEADER-FILE' (in all capitals). This is a once-only variant
+ of `AC_CHECK_HEADERS'. It generates the checking code at most
+ once, so that `configure' is smaller and faster; but the checks
+ cannot be conditionalized and are always done once, early during
+ the `configure' run. Thus, this macro is only safe for checking
+ headers that do not have prerequisites beyond what
+ `AC_INCLUDES_DEFAULT' provides.
+
+
+File: autoconf.info, Node: Declarations, Next: Structures, Prev: Header Files, Up: Existing Tests
+
+5.7 Declarations
+================
+
+The following macros check for the declaration of variables and
+functions. If there is no macro specifically defined to check for a
+symbol you need, then you can use the general macros (*note Generic
+Declarations::) or, for more complex tests, you may use
+`AC_COMPILE_IFELSE' (*note Running the Compiler::).
+
+* Menu:
+
+* Particular Declarations:: Macros to check for certain declarations
+* Generic Declarations:: How to find other declarations
+
+
+File: autoconf.info, Node: Particular Declarations, Next: Generic Declarations, Up: Declarations
+
+5.7.1 Particular Declaration Checks
+-----------------------------------
+
+There are no specific macros for declarations.
+
+
+File: autoconf.info, Node: Generic Declarations, Prev: Particular Declarations, Up: Declarations
+
+5.7.2 Generic Declaration Checks
+--------------------------------
+
+These macros are used to find declarations not covered by the
+"particular" test macros.
+
+ -- Macro: AC_CHECK_DECL (SYMBOL, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
+ If SYMBOL (a function, variable, or constant) is not declared in
+ INCLUDES and a declaration is needed, run the shell commands
+ ACTION-IF-NOT-FOUND, otherwise ACTION-IF-FOUND. INCLUDES is a
+ series of include directives, defaulting to `AC_INCLUDES_DEFAULT'
+ (*note Default Includes::), which are used prior to the
+ declaration under test.
+
+ This macro actually tests whether SYMBOL is defined as a macro or
+ can be used as an r-value, not whether it is really declared,
+ because it is much safer to avoid introducing extra declarations
+ when they are not needed. In order to facilitate use of C++ and
+ overloaded function declarations, it is possible to specify
+ function argument types in parentheses for types which can be
+ zero-initialized:
+
+ AC_CHECK_DECL([basename(char *)])
+
+ This macro caches its result in the `ac_cv_have_decl_SYMBOL'
+ variable, with characters not suitable for a variable name mapped
+ to underscores.
+
+ -- Macro: AC_CHECK_DECLS (SYMBOLS, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
+ For each of the SYMBOLS (_comma_-separated list with optional
+ function argument types for C++ overloads), define
+ `HAVE_DECL_SYMBOL' (in all capitals) to `1' if SYMBOL is declared,
+ otherwise to `0'. If ACTION-IF-NOT-FOUND is given, it is
+ additional shell code to execute when one of the function
+ declarations is needed, otherwise ACTION-IF-FOUND is executed.
+
+ INCLUDES is a series of include directives, defaulting to
+ `AC_INCLUDES_DEFAULT' (*note Default Includes::), which are used
+ prior to the declarations under test.
+
+ This macro uses an M4 list as first argument:
+ AC_CHECK_DECLS([strdup])
+ AC_CHECK_DECLS([strlen])
+ AC_CHECK_DECLS([malloc, realloc, calloc, free])
+ AC_CHECK_DECLS([j0], [], [], [[#include <math.h>]])
+ AC_CHECK_DECLS([[basename(char *)], [dirname(char *)]])
+
+ Unlike the other `AC_CHECK_*S' macros, when a SYMBOL is not
+ declared, `HAVE_DECL_SYMBOL' is defined to `0' instead of leaving
+ `HAVE_DECL_SYMBOL' undeclared. When you are _sure_ that the check
+ was performed, use `HAVE_DECL_SYMBOL' in `#if':
+
+ #if !HAVE_DECL_SYMBOL
+ extern char *symbol;
+ #endif
+
+ If the test may have not been performed, however, because it is
+ safer _not_ to declare a symbol than to use a declaration that
+ conflicts with the system's one, you should use:
+
+ #if defined HAVE_DECL_MALLOC && !HAVE_DECL_MALLOC
+ void *malloc (size_t *s);
+ #endif
+
+ You fall into the second category only in extreme situations:
+ either your files may be used without being configured, or they
+ are used during the configuration. In most cases the traditional
+ approach is enough.
+
+ This macro caches its results in `ac_cv_have_decl_SYMBOL'
+ variables, with characters not suitable for a variable name mapped
+ to underscores.
+
+ -- Macro: AC_CHECK_DECLS_ONCE (SYMBOLS)
+ For each of the SYMBOLS (_comma_-separated list), define
+ `HAVE_DECL_SYMBOL' (in all capitals) to `1' if SYMBOL is declared
+ in the default include files, otherwise to `0'. This is a
+ once-only variant of `AC_CHECK_DECLS'. It generates the checking
+ code at most once, so that `configure' is smaller and faster; but
+ the checks cannot be conditionalized and are always done once,
+ early during the `configure' run.
+
+
+File: autoconf.info, Node: Structures, Next: Types, Prev: Declarations, Up: Existing Tests
+
+5.8 Structures
+==============
+
+The following macros check for the presence of certain members in C
+structures. If there is no macro specifically defined to check for a
+member you need, then you can use the general structure-member macros
+(*note Generic Structures::) or, for more complex tests, you may use
+`AC_COMPILE_IFELSE' (*note Running the Compiler::).
+
+* Menu:
+
+* Particular Structures:: Macros to check for certain structure members
+* Generic Structures:: How to find other structure members
+
+
+File: autoconf.info, Node: Particular Structures, Next: Generic Structures, Up: Structures
+
+5.8.1 Particular Structure Checks
+---------------------------------
+
+The following macros check for certain structures or structure members.
+
+ -- Macro: AC_STRUCT_DIRENT_D_INO
+ Perform all the actions of `AC_HEADER_DIRENT' (*note Particular
+ Headers::). Then, if `struct dirent' contains a `d_ino' member,
+ define `HAVE_STRUCT_DIRENT_D_INO'.
+
+ `HAVE_STRUCT_DIRENT_D_INO' indicates only the presence of `d_ino',
+ not whether its contents are always reliable. Traditionally, a
+ zero `d_ino' indicated a deleted directory entry, though current
+ systems hide this detail from the user and never return zero
+ `d_ino' values. Many current systems report an incorrect `d_ino'
+ for a directory entry that is a mount point.
+
+ -- Macro: AC_STRUCT_DIRENT_D_TYPE
+ Perform all the actions of `AC_HEADER_DIRENT' (*note Particular
+ Headers::). Then, if `struct dirent' contains a `d_type' member,
+ define `HAVE_STRUCT_DIRENT_D_TYPE'.
+
+ -- Macro: AC_STRUCT_ST_BLOCKS
+ If `struct stat' contains an `st_blocks' member, define
+ `HAVE_STRUCT_STAT_ST_BLOCKS'. Otherwise, require an `AC_LIBOBJ'
+ replacement of `fileblocks'. The former name, `HAVE_ST_BLOCKS' is
+ to be avoided, as its support will cease in the future.
+
+ This macro caches its result in the
+ `ac_cv_member_struct_stat_st_blocks' variable.
+
+ -- Macro: AC_STRUCT_TM
+ If `time.h' does not define `struct tm', define `TM_IN_SYS_TIME',
+ which means that including `sys/time.h' had better define `struct
+ tm'.
+
+ This macro is obsolescent, as `time.h' defines `struct tm' in
+ current systems. New programs need not use this macro.
+
+ -- Macro: AC_STRUCT_TIMEZONE
+ Figure out how to get the current timezone. If `struct tm' has a
+ `tm_zone' member, define `HAVE_STRUCT_TM_TM_ZONE' (and the
+ obsoleted `HAVE_TM_ZONE'). Otherwise, if the external array
+ `tzname' is found, define `HAVE_TZNAME'; if it is declared, define
+ `HAVE_DECL_TZNAME'.
+
+
+File: autoconf.info, Node: Generic Structures, Prev: Particular Structures, Up: Structures
+
+5.8.2 Generic Structure Checks
+------------------------------
+
+These macros are used to find structure members not covered by the
+"particular" test macros.
+
+ -- Macro: AC_CHECK_MEMBER (AGGREGATE.MEMBER, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
+ Check whether MEMBER is a member of the aggregate AGGREGATE. If
+ no INCLUDES are specified, the default includes are used (*note
+ Default Includes::).
+
+ AC_CHECK_MEMBER([struct passwd.pw_gecos], [],
+ [AC_MSG_ERROR([we need `passwd.pw_gecos'])],
+ [[#include <pwd.h>]])
+
+ You can use this macro for submembers:
+
+ AC_CHECK_MEMBER(struct top.middle.bot)
+
+ This macro caches its result in the
+ `ac_cv_member_AGGREGATE_MEMBER' variable, with characters not
+ suitable for a variable name mapped to underscores.
+
+ -- Macro: AC_CHECK_MEMBERS (MEMBERS, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
+ Check for the existence of each `AGGREGATE.MEMBER' of MEMBERS
+ using the previous macro. When MEMBER belongs to AGGREGATE,
+ define `HAVE_AGGREGATE_MEMBER' (in all capitals, with spaces and
+ dots replaced by underscores). If ACTION-IF-FOUND is given, it is
+ executed for each of the found members. If ACTION-IF-NOT-FOUND is
+ given, it is executed for each of the members that could not be
+ found.
+
+ INCLUDES is a series of include directives, defaulting to
+ `AC_INCLUDES_DEFAULT' (*note Default Includes::), which are used
+ prior to the members under test.
+
+ This macro uses M4 lists:
+ AC_CHECK_MEMBERS([struct stat.st_rdev, struct stat.st_blksize])
+
+
+File: autoconf.info, Node: Types, Next: Compilers and Preprocessors, Prev: Structures, Up: Existing Tests
+
+5.9 Types
+=========
+
+The following macros check for C types, either builtin or typedefs. If
+there is no macro specifically defined to check for a type you need, and
+you don't need to check for any special properties of it, then you can
+use a general type-check macro.
+
+* Menu:
+
+* Particular Types:: Special handling to find certain types
+* Generic Types:: How to find other types
+
+
+File: autoconf.info, Node: Particular Types, Next: Generic Types, Up: Types
+
+5.9.1 Particular Type Checks
+----------------------------
+
+These macros check for particular C types in `sys/types.h', `stdlib.h',
+`stdint.h', `inttypes.h' and others, if they exist.
+
+ The Gnulib `stdint' module is an alternate way to define many of
+these symbols; it is useful if you prefer your code to assume a
+C99-or-better environment. *Note Gnulib::.
+
+ -- Macro: AC_TYPE_GETGROUPS
+ Define `GETGROUPS_T' to be whichever of `gid_t' or `int' is the
+ base type of the array argument to `getgroups'.
+
+ This macro caches the base type in the `ac_cv_type_getgroups'
+ variable.
+
+ -- Macro: AC_TYPE_INT8_T
+ If `stdint.h' or `inttypes.h' does not define the type `int8_t',
+ define `int8_t' to a signed integer type that is exactly 8 bits
+ wide and that uses two's complement representation, if such a type
+ exists. If you are worried about porting to hosts that lack such
+ a type, you can use the results of this macro in C89-or-later code
+ as follows:
+
+ #if HAVE_STDINT_H
+ # include <stdint.h>
+ #endif
+ #if defined INT8_MAX || defined int8_t
+ _code using int8_t_
+ #else
+ _complicated alternative using >8-bit 'signed char'_
+ #endif
+
+ This macro caches the type in the `ac_cv_c_int8_t' variable.
+
+ -- Macro: AC_TYPE_INT16_T
+ This is like `AC_TYPE_INT8_T', except for 16-bit integers.
+
+ -- Macro: AC_TYPE_INT32_T
+ This is like `AC_TYPE_INT8_T', except for 32-bit integers.
+
+ -- Macro: AC_TYPE_INT64_T
+ This is like `AC_TYPE_INT8_T', except for 64-bit integers.
+
+ -- Macro: AC_TYPE_INTMAX_T
+ If `stdint.h' or `inttypes.h' defines the type `intmax_t', define
+ `HAVE_INTMAX_T'. Otherwise, define `intmax_t' to the widest
+ signed integer type.
+
+ -- Macro: AC_TYPE_INTPTR_T
+ If `stdint.h' or `inttypes.h' defines the type `intptr_t', define
+ `HAVE_INTPTR_T'. Otherwise, define `intptr_t' to a signed integer
+ type wide enough to hold a pointer, if such a type exists.
+
+ -- Macro: AC_TYPE_LONG_DOUBLE
+ If the C compiler supports a working `long double' type, define
+ `HAVE_LONG_DOUBLE'. The `long double' type might have the same
+ range and precision as `double'.
+
+ This macro caches its result in the `ac_cv_type_long_double'
+ variable.
+
+ This macro is obsolescent, as current C compilers support `long
+ double'. New programs need not use this macro.
+
+ -- Macro: AC_TYPE_LONG_DOUBLE_WIDER
+ If the C compiler supports a working `long double' type with more
+ range or precision than the `double' type, define
+ `HAVE_LONG_DOUBLE_WIDER'.
+
+ This macro caches its result in the `ac_cv_type_long_double_wider'
+ variable.
+
+ -- Macro: AC_TYPE_LONG_LONG_INT
+ If the C compiler supports a working `long long int' type, define
+ `HAVE_LONG_LONG_INT'. However, this test does not test `long long
+ int' values in preprocessor `#if' expressions, because too many
+ compilers mishandle such expressions. *Note Preprocessor
+ Arithmetic::.
+
+ This macro caches its result in the `ac_cv_type_long_long_int'
+ variable.
+
+ -- Macro: AC_TYPE_MBSTATE_T
+ Define `HAVE_MBSTATE_T' if `<wchar.h>' declares the `mbstate_t'
+ type. Also, define `mbstate_t' to be a type if `<wchar.h>' does
+ not declare it.
+
+ This macro caches its result in the `ac_cv_type_mbstate_t'
+ variable.
+
+ -- Macro: AC_TYPE_MODE_T
+ Define `mode_t' to a suitable type, if standard headers do not
+ define it.
+
+ This macro caches its result in the `ac_cv_type_mode_t' variable.
+
+ -- Macro: AC_TYPE_OFF_T
+ Define `off_t' to a suitable type, if standard headers do not
+ define it.
+
+ This macro caches its result in the `ac_cv_type_off_t' variable.
+
+ -- Macro: AC_TYPE_PID_T
+ Define `pid_t' to a suitable type, if standard headers do not
+ define it.
+
+ This macro caches its result in the `ac_cv_type_pid_t' variable.
+
+ -- Macro: AC_TYPE_SIZE_T
+ Define `size_t' to a suitable type, if standard headers do not
+ define it.
+
+ This macro caches its result in the `ac_cv_type_size_t' variable.
+
+ -- Macro: AC_TYPE_SSIZE_T
+ Define `ssize_t' to a suitable type, if standard headers do not
+ define it.
+
+ This macro caches its result in the `ac_cv_type_ssize_t' variable.
+
+ -- Macro: AC_TYPE_UID_T
+ Define `uid_t' and `gid_t' to suitable types, if standard headers
+ do not define them.
+
+ This macro caches its result in the `ac_cv_type_uid_t' variable.
+
+ -- Macro: AC_TYPE_UINT8_T
+ If `stdint.h' or `inttypes.h' does not define the type `uint8_t',
+ define `uint8_t' to an unsigned integer type that is exactly 8
+ bits wide, if such a type exists. This is like `AC_TYPE_INT8_T',
+ except for unsigned integers.
+
+ -- Macro: AC_TYPE_UINT16_T
+ This is like `AC_TYPE_UINT8_T', except for 16-bit integers.
+
+ -- Macro: AC_TYPE_UINT32_T
+ This is like `AC_TYPE_UINT8_T', except for 32-bit integers.
+
+ -- Macro: AC_TYPE_UINT64_T
+ This is like `AC_TYPE_UINT8_T', except for 64-bit integers.
+
+ -- Macro: AC_TYPE_UINTMAX_T
+ If `stdint.h' or `inttypes.h' defines the type `uintmax_t', define
+ `HAVE_UINTMAX_T'. Otherwise, define `uintmax_t' to the widest
+ unsigned integer type.
+
+ -- Macro: AC_TYPE_UINTPTR_T
+ If `stdint.h' or `inttypes.h' defines the type `uintptr_t', define
+ `HAVE_UINTPTR_T'. Otherwise, define `uintptr_t' to an unsigned
+ integer type wide enough to hold a pointer, if such a type exists.
+
+ -- Macro: AC_TYPE_UNSIGNED_LONG_LONG_INT
+ If the C compiler supports a working `unsigned long long int' type,
+ define `HAVE_UNSIGNED_LONG_LONG_INT'. However, this test does not
+ test `unsigned long long int' values in preprocessor `#if'
+ expressions, because too many compilers mishandle such expressions.
+ *Note Preprocessor Arithmetic::.
+
+ This macro caches its result in the
+ `ac_cv_type_unsigned_long_long_int' variable.
+
+
+File: autoconf.info, Node: Generic Types, Prev: Particular Types, Up: Types
+
+5.9.2 Generic Type Checks
+-------------------------
+
+These macros are used to check for types not covered by the "particular"
+test macros.
+
+ -- Macro: AC_CHECK_TYPE (TYPE, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
+ Check whether TYPE is defined. It may be a compiler builtin type
+ or defined by the INCLUDES. INCLUDES is a series of include
+ directives, defaulting to `AC_INCLUDES_DEFAULT' (*note Default
+ Includes::), which are used prior to the type under test.
+
+ In C, TYPE must be a type-name, so that the expression `sizeof
+ (TYPE)' is valid (but `sizeof ((TYPE))' is not). The same test is
+ applied when compiling for C++, which means that in C++ TYPE
+ should be a type-id and should not be an anonymous `struct' or
+ `union'.
+
+ This macro caches its result in the `ac_cv_type_TYPE' variable,
+ with `*' mapped to `p' and other characters not suitable for a
+ variable name mapped to underscores.
+
+ -- Macro: AC_CHECK_TYPES (TYPES, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND], [INCLUDES = `AC_INCLUDES_DEFAULT'])
+ For each TYPE of the TYPES that is defined, define `HAVE_TYPE' (in
+ all capitals). Each TYPE must follow the rules of
+ `AC_CHECK_TYPE'. If no INCLUDES are specified, the default
+ includes are used (*note Default Includes::). If ACTION-IF-FOUND
+ is given, it is additional shell code to execute when one of the
+ types is found. If ACTION-IF-NOT-FOUND is given, it is executed
+ when one of the types is not found.
+
+ This macro uses M4 lists:
+ AC_CHECK_TYPES([ptrdiff_t])
+ AC_CHECK_TYPES([unsigned long long int, uintmax_t])
+ AC_CHECK_TYPES([float_t], [], [], [[#include <math.h>]])
+
+
+ Autoconf, up to 2.13, used to provide to another version of
+`AC_CHECK_TYPE', broken by design. In order to keep backward
+compatibility, a simple heuristic, quite safe but not totally, is
+implemented. In case of doubt, read the documentation of the former
+`AC_CHECK_TYPE', see *note Obsolete Macros::.
+
+
+File: autoconf.info, Node: Compilers and Preprocessors, Next: System Services, Prev: Types, Up: Existing Tests
+
+5.10 Compilers and Preprocessors
+================================
+
+All the tests for compilers (`AC_PROG_CC', `AC_PROG_CXX',
+`AC_PROG_F77') define the output variable `EXEEXT' based on the output
+of the compiler, typically to the empty string if Posix and `.exe' if a
+DOS variant.
+
+ They also define the output variable `OBJEXT' based on the output of
+the compiler, after `.c' files have been excluded, typically to `o' if
+Posix, `obj' if a DOS variant.
+
+ If the compiler being used does not produce executables, the tests
+fail. If the executables can't be run, and cross-compilation is not
+enabled, they fail too. *Note Manual Configuration::, for more on
+support for cross compiling.
+
+* Menu:
+
+* Specific Compiler Characteristics:: Some portability issues
+* Generic Compiler Characteristics:: Language independent tests and features
+* C Compiler:: Checking its characteristics
+* C++ Compiler:: Likewise
+* Objective C Compiler:: Likewise
+* Objective C++ Compiler:: Likewise
+* Erlang Compiler and Interpreter:: Likewise
+* Fortran Compiler:: Likewise
+* Go Compiler:: Likewise
+
+
+File: autoconf.info, Node: Specific Compiler Characteristics, Next: Generic Compiler Characteristics, Up: Compilers and Preprocessors
+
+5.10.1 Specific Compiler Characteristics
+----------------------------------------
+
+Some compilers exhibit different behaviors.
+
+Static/Dynamic Expressions
+ Autoconf relies on a trick to extract one bit of information from
+ the C compiler: using negative array sizes. For instance the
+ following excerpt of a C source demonstrates how to test whether
+ `int' objects are 4 bytes wide:
+
+ static int test_array[sizeof (int) == 4 ? 1 : -1];
+
+ To our knowledge, there is a single compiler that does not support
+ this trick: the HP C compilers (the real ones, not only the
+ "bundled") on HP-UX 11.00. They incorrectly reject the above
+ program with the diagnostic "Variable-length arrays cannot have
+ static storage." This bug comes from HP compilers' mishandling of
+ `sizeof (int)', not from the `? 1 : -1', and Autoconf works around
+ this problem by casting `sizeof (int)' to `long int' before
+ comparing it.
+
+
+File: autoconf.info, Node: Generic Compiler Characteristics, Next: C Compiler, Prev: Specific Compiler Characteristics, Up: Compilers and Preprocessors
+
+5.10.2 Generic Compiler Characteristics
+---------------------------------------
+
+ -- Macro: AC_CHECK_SIZEOF (TYPE-OR-EXPR, [UNUSED], [INCLUDES =
+ `AC_INCLUDES_DEFAULT'])
+ Define `SIZEOF_TYPE-OR-EXPR' (*note Standard Symbols::) to be the
+ size in bytes of TYPE-OR-EXPR, which may be either a type or an
+ expression returning a value that has a size. If the expression
+ `sizeof (TYPE-OR-EXPR)' is invalid, the result is 0. INCLUDES is
+ a series of include directives, defaulting to
+ `AC_INCLUDES_DEFAULT' (*note Default Includes::), which are used
+ prior to the expression under test.
+
+ This macro now works even when cross-compiling. The UNUSED
+ argument was used when cross-compiling.
+
+ For example, the call
+
+ AC_CHECK_SIZEOF([int *])
+
+ defines `SIZEOF_INT_P' to be 8 on DEC Alpha AXP systems.
+
+ This macro caches its result in the `ac_cv_sizeof_TYPE-OR-EXPR'
+ variable, with `*' mapped to `p' and other characters not suitable
+ for a variable name mapped to underscores.
+
+ -- Macro: AC_CHECK_ALIGNOF (TYPE, [INCLUDES = `AC_INCLUDES_DEFAULT'])
+ Define `ALIGNOF_TYPE' (*note Standard Symbols::) to be the
+ alignment in bytes of TYPE. `TYPE y;' must be valid as a
+ structure member declaration. If `type' is unknown, the result is
+ 0. If no INCLUDES are specified, the default includes are used
+ (*note Default Includes::).
+
+ This macro caches its result in the `ac_cv_alignof_TYPE-OR-EXPR'
+ variable, with `*' mapped to `p' and other characters not suitable
+ for a variable name mapped to underscores.
+
+ -- Macro: AC_COMPUTE_INT (VAR, EXPRESSION, [INCLUDES =
+ `AC_INCLUDES_DEFAULT'], [ACTION-IF-FAILS])
+ Store into the shell variable VAR the value of the integer
+ EXPRESSION. The value should fit in an initializer in a C
+ variable of type `signed long'. To support cross compilation (in
+ which case, the macro only works on hosts that use twos-complement
+ arithmetic), it should be possible to evaluate the expression at
+ compile-time. If no INCLUDES are specified, the default includes
+ are used (*note Default Includes::).
+
+ Execute ACTION-IF-FAILS if the value cannot be determined
+ correctly.
+
+ -- Macro: AC_LANG_WERROR
+ Normally Autoconf ignores warnings generated by the compiler,
+ linker, and preprocessor. If this macro is used, warnings count
+ as fatal errors for the current language. This macro is useful
+ when the results of configuration are used where warnings are
+ unacceptable; for instance, if parts of a program are built with
+ the GCC `-Werror' option. If the whole program is built using
+ `-Werror' it is often simpler to put `-Werror' in the compiler
+ flags (`CFLAGS', etc.).
+
+ -- Macro: AC_OPENMP
+ OpenMP (http://www.openmp.org/) specifies extensions of C, C++,
+ and Fortran that simplify optimization of shared memory
+ parallelism, which is a common problem on multicore CPUs.
+
+ If the current language is C, the macro `AC_OPENMP' sets the
+ variable `OPENMP_CFLAGS' to the C compiler flags needed for
+ supporting OpenMP. `OPENMP_CFLAGS' is set to empty if the
+ compiler already supports OpenMP, if it has no way to activate
+ OpenMP support, or if the user rejects OpenMP support by invoking
+ `configure' with the `--disable-openmp' option.
+
+ `OPENMP_CFLAGS' needs to be used when compiling programs, when
+ preprocessing program source, and when linking programs.
+ Therefore you need to add `$(OPENMP_CFLAGS)' to the `CFLAGS' of C
+ programs that use OpenMP. If you preprocess OpenMP-specific C
+ code, you also need to add `$(OPENMP_CFLAGS)' to `CPPFLAGS'. The
+ presence of OpenMP support is revealed at compile time by the
+ preprocessor macro `_OPENMP'.
+
+ Linking a program with `OPENMP_CFLAGS' typically adds one more
+ shared library to the program's dependencies, so its use is
+ recommended only on programs that actually require OpenMP.
+
+ If the current language is C++, `AC_OPENMP' sets the variable
+ `OPENMP_CXXFLAGS', suitably for the C++ compiler. The same remarks
+ hold as for C.
+
+ If the current language is Fortran 77 or Fortran, `AC_OPENMP' sets
+ the variable `OPENMP_FFLAGS' or `OPENMP_FCFLAGS', respectively.
+ Similar remarks as for C hold, except that `CPPFLAGS' is not used
+ for Fortran, and no preprocessor macro signals OpenMP support.
+
+ For portability, it is best to avoid spaces between `#' and
+ `pragma omp'. That is, write `#pragma omp', not `# pragma omp'.
+ The Sun WorkShop 6.2 C compiler chokes on the latter.
+
+ This macro caches its result in the `ac_cv_prog_c_openmp',
+ `ac_cv_prog_cxx_openmp', `ac_cv_prog_f77_openmp', or
+ `ac_cv_prog_fc_openmp' variable, depending on the current language.
+
+
+File: autoconf.info, Node: C Compiler, Next: C++ Compiler, Prev: Generic Compiler Characteristics, Up: Compilers and Preprocessors
+
+5.10.3 C Compiler Characteristics
+---------------------------------
+
+The following macros provide ways to find and exercise a C Compiler.
+There are a few constructs that ought to be avoided, but do not deserve
+being checked for, since they can easily be worked around.
+
+Don't use lines containing solitary backslashes
+ They tickle a bug in the HP-UX C compiler (checked on HP-UX 10.20,
+ 11.00, and 11i). When given the following source:
+
+ #ifdef __STDC__
+ /\
+ * A comment with backslash-newlines in it. %{ %} *\
+ \
+ /
+ char str[] = "\\
+ " A string with backslash-newlines in it %{ %} \\
+ "";
+ char apostrophe = '\\
+ \
+ '\
+ ';
+ #endif
+
+ the compiler incorrectly fails with the diagnostics
+ "Non-terminating comment at end of file" and "Missing `#endif' at
+ end of file." Removing the lines with solitary backslashes solves
+ the problem.
+
+Don't compile several files at once if output matters to you
+ Some compilers, such as HP's, report names of files being compiled
+ when given more than one file operand. For instance:
+
+ $ cc a.c b.c
+ a.c:
+ b.c:
+
+ This can cause problems if you observe the output of the compiler
+ to detect failures. Invoking `cc -c a.c && cc -c b.c && cc -o c
+ a.o b.o' solves the issue.
+
+Don't rely on `#error' failing
+ The IRIX C compiler does not fail when #error is preprocessed; it
+ simply emits a diagnostic and continues, exiting successfully. So,
+ instead of an error directive like `#error "Unsupported word size"'
+ it is more portable to use an invalid directive like `#Unsupported
+ word size' in Autoconf tests. In ordinary source code, `#error' is
+ OK, since installers with inadequate compilers like IRIX can simply
+ examine these compilers' diagnostic output.
+
+Don't rely on correct `#line' support
+ On Solaris, `c89' (at least Sun C 5.3 through 5.8) diagnoses
+ `#line' directives whose line numbers are greater than 32767.
+ Nothing in Posix makes this invalid. That is why Autoconf stopped
+ issuing `#line' directives.
+
+ -- Macro: AC_PROG_CC ([COMPILER-SEARCH-LIST])
+ Determine a C compiler to use. If `CC' is not already set in the
+ environment, check for `gcc' and `cc', then for other C compilers.
+ Set output variable `CC' to the name of the compiler found.
+
+ This macro may, however, be invoked with an optional first argument
+ which, if specified, must be a blank-separated list of C compilers
+ to search for. This just gives the user an opportunity to specify
+ an alternative search list for the C compiler. For example, if
+ you didn't like the default order, then you could invoke
+ `AC_PROG_CC' like this:
+
+ AC_PROG_CC([gcc cl cc])
+
+ If the C compiler does not handle function prototypes correctly by
+ default, try to add an option to output variable `CC' to make it
+ so. This macro tries various options that select
+ standard-conformance modes on various systems.
+
+ After calling this macro you can check whether the C compiler has
+ been set to accept ANSI C89 (ISO C90); if not, the shell variable
+ `ac_cv_prog_cc_c89' is set to `no'. See also `AC_C_PROTOTYPES'
+ below.
+
+ If using the GNU C compiler, set shell variable `GCC' to `yes'.
+ If output variable `CFLAGS' was not already set, set it to `-g
+ -O2' for the GNU C compiler (`-O2' on systems where GCC does not
+ accept `-g'), or `-g' for other compilers. If your package does
+ not like this default, then it is acceptable to insert the line `:
+ ${CFLAGS=""}' after `AC_INIT' and before `AC_PROG_CC' to select an
+ empty default instead.
+
+ Many Autoconf macros use a compiler, and thus call
+ `AC_REQUIRE([AC_PROG_CC])' to ensure that the compiler has been
+ determined before the body of the outermost `AC_DEFUN' macro.
+ Although `AC_PROG_CC' is safe to directly expand multiple times, it
+ performs certain checks (such as the proper value of `EXEEXT') only
+ on the first invocation. Therefore, care must be used when
+ invoking this macro from within another macro rather than at the
+ top level (*note Expanded Before Required::).
+
+ -- Macro: AC_PROG_CC_C_O
+ If the C compiler does not accept the `-c' and `-o' options
+ simultaneously, define `NO_MINUS_C_MINUS_O'. This macro actually
+ tests both the compiler found by `AC_PROG_CC', and, if different,
+ the first `cc' in the path. The test fails if one fails. This
+ macro was created for GNU Make to choose the default C compilation
+ rule.
+
+ For the compiler COMPILER, this macro caches its result in the
+ `ac_cv_prog_cc_COMPILER_c_o' variable.
+
+ -- Macro: AC_PROG_CPP
+ Set output variable `CPP' to a command that runs the C
+ preprocessor. If `$CC -E' doesn't work, `/lib/cpp' is used. It
+ is only portable to run `CPP' on files with a `.c' extension.
+
+ Some preprocessors don't indicate missing include files by the
+ error status. For such preprocessors an internal variable is set
+ that causes other macros to check the standard error from the
+ preprocessor and consider the test failed if any warnings have
+ been reported. For most preprocessors, though, warnings do not
+ cause include-file tests to fail unless `AC_PROG_CPP_WERROR' is
+ also specified.
+
+ -- Macro: AC_PROG_CPP_WERROR
+ This acts like `AC_PROG_CPP', except it treats warnings from the
+ preprocessor as errors even if the preprocessor exit status
+ indicates success. This is useful for avoiding headers that
+ generate mandatory warnings, such as deprecation notices.
+
+ The following macros check for C compiler or machine architecture
+features. To check for characteristics not listed here, use
+`AC_COMPILE_IFELSE' (*note Running the Compiler::) or `AC_RUN_IFELSE'
+(*note Runtime::).
+
+ -- Macro: AC_PROG_CC_STDC
+ If the C compiler cannot compile ISO Standard C (currently C99),
+ try to add an option to output variable `CC' to make it work. If
+ the compiler does not support C99, fall back to supporting ANSI
+ C89 (ISO C90).
+
+ After calling this macro you can check whether the C compiler has
+ been set to accept Standard C; if not, the shell variable
+ `ac_cv_prog_cc_stdc' is set to `no'.
+
+ -- Macro: AC_PROG_CC_C89
+ If the C compiler is not in ANSI C89 (ISO C90) mode by default,
+ try to add an option to output variable `CC' to make it so. This
+ macro tries various options that select ANSI C89 on some system or
+ another, preferring extended functionality modes over strict
+ conformance modes. It considers the compiler to be in ANSI C89
+ mode if it handles function prototypes correctly.
+
+ After calling this macro you can check whether the C compiler has
+ been set to accept ANSI C89; if not, the shell variable
+ `ac_cv_prog_cc_c89' is set to `no'.
+
+ This macro is called automatically by `AC_PROG_CC'.
+
+ -- Macro: AC_PROG_CC_C99
+ If the C compiler is not in C99 mode by default, try to add an
+ option to output variable `CC' to make it so. This macro tries
+ various options that select C99 on some system or another,
+ preferring extended functionality modes over strict conformance
+ modes. It considers the compiler to be in C99 mode if it handles
+ `_Bool', `//' comments, flexible array members, `inline', signed
+ and unsigned `long long int', mixed code and declarations, named
+ initialization of structs, `restrict', `va_copy', varargs macros,
+ variable declarations in `for' loops, and variable length arrays.
+
+ After calling this macro you can check whether the C compiler has
+ been set to accept C99; if not, the shell variable
+ `ac_cv_prog_cc_c99' is set to `no'.
+
+ -- Macro: AC_C_BACKSLASH_A
+ Define `HAVE_C_BACKSLASH_A' to 1 if the C compiler understands
+ `\a'.
+
+ This macro is obsolescent, as current C compilers understand `\a'.
+ New programs need not use this macro.
+
+ -- Macro: AC_C_BIGENDIAN ([ACTION-IF-TRUE], [ACTION-IF-FALSE],
+ [ACTION-IF-UNKNOWN], [ACTION-IF-UNIVERSAL])
+ If words are stored with the most significant byte first (like
+ Motorola and SPARC CPUs), execute ACTION-IF-TRUE. If words are
+ stored with the least significant byte first (like Intel and VAX
+ CPUs), execute ACTION-IF-FALSE.
+
+ This macro runs a test-case if endianness cannot be determined
+ from the system header files. When cross-compiling, the test-case
+ is not run but grep'ed for some magic values. ACTION-IF-UNKNOWN
+ is executed if the latter case fails to determine the byte sex of
+ the host system.
+
+ In some cases a single run of a compiler can generate code for
+ multiple architectures. This can happen, for example, when
+ generating Mac OS X universal binary files, which work on both
+ PowerPC and Intel architectures. In this case, the different
+ variants might be for different architectures whose endiannesses
+ differ. If `configure' detects this, it executes
+ ACTION-IF-UNIVERSAL instead of ACTION-IF-UNKNOWN.
+
+ The default for ACTION-IF-TRUE is to define `WORDS_BIGENDIAN'.
+ The default for ACTION-IF-FALSE is to do nothing. The default for
+ ACTION-IF-UNKNOWN is to abort configure and tell the installer how
+ to bypass this test. And finally, the default for
+ ACTION-IF-UNIVERSAL is to ensure that `WORDS_BIGENDIAN' is defined
+ if and only if a universal build is detected and the current code
+ is big-endian; this default works only if `autoheader' is used
+ (*note autoheader Invocation::).
+
+ If you use this macro without specifying ACTION-IF-UNIVERSAL, you
+ should also use `AC_CONFIG_HEADERS'; otherwise `WORDS_BIGENDIAN'
+ may be set incorrectly for Mac OS X universal binary files.
+
+ -- Macro: AC_C_CONST
+ If the C compiler does not fully support the `const' keyword,
+ define `const' to be empty. Some C compilers that do not define
+ `__STDC__' do support `const'; some compilers that define
+ `__STDC__' do not completely support `const'. Programs can simply
+ use `const' as if every C compiler supported it; for those that
+ don't, the makefile or configuration header file defines it as
+ empty.
+
+ Occasionally installers use a C++ compiler to compile C code,
+ typically because they lack a C compiler. This causes problems
+ with `const', because C and C++ treat `const' differently. For
+ example:
+
+ const int foo;
+
+ is valid in C but not in C++. These differences unfortunately
+ cannot be papered over by defining `const' to be empty.
+
+ If `autoconf' detects this situation, it leaves `const' alone, as
+ this generally yields better results in practice. However, using a
+ C++ compiler to compile C code is not recommended or supported, and
+ installers who run into trouble in this area should get a C
+ compiler like GCC to compile their C code.
+
+ This macro caches its result in the `ac_cv_c_const' variable.
+
+ This macro is obsolescent, as current C compilers support `const'.
+ New programs need not use this macro.
+
+ -- Macro: AC_C_RESTRICT
+ If the C compiler recognizes a variant spelling for the `restrict'
+ keyword (`__restrict', `__restrict__', or `_Restrict'), then
+ define `restrict' to that; this is more likely to do the right
+ thing with compilers that support language variants where plain
+ `restrict' is not a keyword. Otherwise, if the C compiler
+ recognizes the `restrict' keyword, don't do anything. Otherwise,
+ define `restrict' to be empty. Thus, programs may simply use
+ `restrict' as if every C compiler supported it; for those that do
+ not, the makefile or configuration header defines it away.
+
+ Although support in C++ for the `restrict' keyword is not
+ required, several C++ compilers do accept the keyword. This macro
+ works for them, too.
+
+ This macro caches `no' in the `ac_cv_c_restrict' variable if
+ `restrict' is not supported, and a supported spelling otherwise.
+
+ -- Macro: AC_C_VOLATILE
+ If the C compiler does not understand the keyword `volatile',
+ define `volatile' to be empty. Programs can simply use `volatile'
+ as if every C compiler supported it; for those that do not, the
+ makefile or configuration header defines it as empty.
+
+ If the correctness of your program depends on the semantics of
+ `volatile', simply defining it to be empty does, in a sense, break
+ your code. However, given that the compiler does not support
+ `volatile', you are at its mercy anyway. At least your program
+ compiles, when it wouldn't before. *Note Volatile Objects::, for
+ more about `volatile'.
+
+ In general, the `volatile' keyword is a standard C feature, so you
+ might expect that `volatile' is available only when `__STDC__' is
+ defined. However, Ultrix 4.3's native compiler does support
+ volatile, but does not define `__STDC__'.
+
+ This macro is obsolescent, as current C compilers support
+ `volatile'. New programs need not use this macro.
+
+ -- Macro: AC_C_INLINE
+ If the C compiler supports the keyword `inline', do nothing.
+ Otherwise define `inline' to `__inline__' or `__inline' if it
+ accepts one of those, otherwise define `inline' to be empty.
+
+ -- Macro: AC_C_CHAR_UNSIGNED
+ If the C type `char' is unsigned, define `__CHAR_UNSIGNED__',
+ unless the C compiler predefines it.
+
+ These days, using this macro is not necessary. The same
+ information can be determined by this portable alternative, thus
+ avoiding the use of preprocessor macros in the namespace reserved
+ for the implementation.
+
+ #include <limits.h>
+ #if CHAR_MIN == 0
+ # define CHAR_UNSIGNED 1
+ #endif
+
+ -- Macro: AC_C_STRINGIZE
+ If the C preprocessor supports the stringizing operator, define
+ `HAVE_STRINGIZE'. The stringizing operator is `#' and is found in
+ macros such as this:
+
+ #define x(y) #y
+
+ This macro is obsolescent, as current C compilers support the
+ stringizing operator. New programs need not use this macro.
+
+ -- Macro: AC_C_FLEXIBLE_ARRAY_MEMBER
+ If the C compiler supports flexible array members, define
+ `FLEXIBLE_ARRAY_MEMBER' to nothing; otherwise define it to 1.
+ That way, a declaration like this:
+
+ struct s
+ {
+ size_t n_vals;
+ double val[FLEXIBLE_ARRAY_MEMBER];
+ };
+
+ will let applications use the "struct hack" even with compilers
+ that do not support flexible array members. To allocate and use
+ such an object, you can use code like this:
+
+ size_t i;
+ size_t n = compute_value_count ();
+ struct s *p =
+ malloc (offsetof (struct s, val)
+ + n * sizeof (double));
+ p->n_vals = n;
+ for (i = 0; i < n; i++)
+ p->val[i] = compute_value (i);
+
+ -- Macro: AC_C_VARARRAYS
+ If the C compiler supports variable-length arrays, define
+ `HAVE_C_VARARRAYS'. A variable-length array is an array of
+ automatic storage duration whose length is determined at run time,
+ when the array is declared.
+
+ -- Macro: AC_C_TYPEOF
+ If the C compiler supports GCC's `typeof' syntax either directly or
+ through a different spelling of the keyword (e.g., `__typeof__'),
+ define `HAVE_TYPEOF'. If the support is available only through a
+ different spelling, define `typeof' to that spelling.
+
+ -- Macro: AC_C_PROTOTYPES
+ If function prototypes are understood by the compiler (as
+ determined by `AC_PROG_CC'), define `PROTOTYPES' and
+ `__PROTOTYPES'. Defining `__PROTOTYPES' is for the benefit of
+ header files that cannot use macros that infringe on user name
+ space.
+
+ This macro is obsolescent, as current C compilers support
+ prototypes. New programs need not use this macro.
+
+ -- Macro: AC_PROG_GCC_TRADITIONAL
+ Add `-traditional' to output variable `CC' if using the GNU C
+ compiler and `ioctl' does not work properly without
+ `-traditional'. That usually happens when the fixed header files
+ have not been installed on an old system.
+
+ This macro is obsolescent, since current versions of the GNU C
+ compiler fix the header files automatically when installed.
+
+
+File: autoconf.info, Node: C++ Compiler, Next: Objective C Compiler, Prev: C Compiler, Up: Compilers and Preprocessors
+
+5.10.4 C++ Compiler Characteristics
+-----------------------------------
+
+ -- Macro: AC_PROG_CXX ([COMPILER-SEARCH-LIST])
+ Determine a C++ compiler to use. Check whether the environment
+ variable `CXX' or `CCC' (in that order) is set; if so, then set
+ output variable `CXX' to its value.
+
+ Otherwise, if the macro is invoked without an argument, then
+ search for a C++ compiler under the likely names (first `g++' and
+ `c++' then other names). If none of those checks succeed, then as
+ a last resort set `CXX' to `g++'.
+
+ This macro may, however, be invoked with an optional first argument
+ which, if specified, must be a blank-separated list of C++
+ compilers to search for. This just gives the user an opportunity
+ to specify an alternative search list for the C++ compiler. For
+ example, if you didn't like the default order, then you could
+ invoke `AC_PROG_CXX' like this:
+
+ AC_PROG_CXX([gcc cl KCC CC cxx cc++ xlC aCC c++ g++])
+
+ If using the GNU C++ compiler, set shell variable `GXX' to `yes'.
+ If output variable `CXXFLAGS' was not already set, set it to `-g
+ -O2' for the GNU C++ compiler (`-O2' on systems where G++ does not
+ accept `-g'), or `-g' for other compilers. If your package does
+ not like this default, then it is acceptable to insert the line `:
+ ${CXXFLAGS=""}' after `AC_INIT' and before `AC_PROG_CXX' to select
+ an empty default instead.
+
+
+ -- Macro: AC_PROG_CXXCPP
+ Set output variable `CXXCPP' to a command that runs the C++
+ preprocessor. If `$CXX -E' doesn't work, `/lib/cpp' is used. It
+ is portable to run `CXXCPP' only on files with a `.c', `.C',
+ `.cc', or `.cpp' extension.
+
+ Some preprocessors don't indicate missing include files by the
+ error status. For such preprocessors an internal variable is set
+ that causes other macros to check the standard error from the
+ preprocessor and consider the test failed if any warnings have
+ been reported. However, it is not known whether such broken
+ preprocessors exist for C++.
+
+ -- Macro: AC_PROG_CXX_C_O
+ Test whether the C++ compiler accepts the options `-c' and `-o'
+ simultaneously, and define `CXX_NO_MINUS_C_MINUS_O', if it does
+ not.
+
+
+File: autoconf.info, Node: Objective C Compiler, Next: Objective C++ Compiler, Prev: C++ Compiler, Up: Compilers and Preprocessors
+
+5.10.5 Objective C Compiler Characteristics
+-------------------------------------------
+
+ -- Macro: AC_PROG_OBJC ([COMPILER-SEARCH-LIST])
+ Determine an Objective C compiler to use. If `OBJC' is not already
+ set in the environment, check for Objective C compilers. Set
+ output variable `OBJC' to the name of the compiler found.
+
+ This macro may, however, be invoked with an optional first argument
+ which, if specified, must be a blank-separated list of Objective C
+ compilers to search for. This just gives the user an opportunity
+ to specify an alternative search list for the Objective C
+ compiler. For example, if you didn't like the default order, then
+ you could invoke `AC_PROG_OBJC' like this:
+
+ AC_PROG_OBJC([gcc objcc objc])
+
+ If using the GNU Objective C compiler, set shell variable `GOBJC'
+ to `yes'. If output variable `OBJCFLAGS' was not already set, set
+ it to `-g -O2' for the GNU Objective C compiler (`-O2' on systems
+ where `gcc' does not accept `-g'), or `-g' for other compilers.
+
+ -- Macro: AC_PROG_OBJCPP
+ Set output variable `OBJCPP' to a command that runs the Objective C
+ preprocessor. If `$OBJC -E' doesn't work, `/lib/cpp' is used.
+
+
+File: autoconf.info, Node: Objective C++ Compiler, Next: Erlang Compiler and Interpreter, Prev: Objective C Compiler, Up: Compilers and Preprocessors
+
+5.10.6 Objective C++ Compiler Characteristics
+---------------------------------------------
+
+ -- Macro: AC_PROG_OBJCXX ([COMPILER-SEARCH-LIST])
+ Determine an Objective C++ compiler to use. If `OBJCXX' is not
+ already set in the environment, check for Objective C++ compilers.
+ Set output variable `OBJCXX' to the name of the compiler found.
+
+ This macro may, however, be invoked with an optional first argument
+ which, if specified, must be a blank-separated list of Objective
+ C++ compilers to search for. This just gives the user an
+ opportunity to specify an alternative search list for the
+ Objective C++ compiler. For example, if you didn't like the
+ default order, then you could invoke `AC_PROG_OBJCXX' like this:
+
+ AC_PROG_OBJCXX([gcc g++ objcc++ objcxx])
+
+ If using the GNU Objective C++ compiler, set shell variable
+ `GOBJCXX' to `yes'. If output variable `OBJCXXFLAGS' was not
+ already set, set it to `-g -O2' for the GNU Objective C++ compiler
+ (`-O2' on systems where `gcc' does not accept `-g'), or `-g' for
+ other compilers.
+
+ -- Macro: AC_PROG_OBJCXXCPP
+ Set output variable `OBJCXXCPP' to a command that runs the
+ Objective C++ preprocessor. If `$OBJCXX -E' doesn't work,
+ `/lib/cpp' is used.
+
+
+File: autoconf.info, Node: Erlang Compiler and Interpreter, Next: Fortran Compiler, Prev: Objective C++ Compiler, Up: Compilers and Preprocessors
+
+5.10.7 Erlang Compiler and Interpreter Characteristics
+------------------------------------------------------
+
+Autoconf defines the following macros for determining paths to the
+essential Erlang/OTP programs:
+
+ -- Macro: AC_ERLANG_PATH_ERLC ([VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
+ Determine an Erlang compiler to use. If `ERLC' is not already set
+ in the environment, check for `erlc'. Set output variable `ERLC'
+ to the complete path of the compiler command found. In addition,
+ if `ERLCFLAGS' is not set in the environment, set it to an empty
+ value.
+
+ The two optional arguments have the same meaning as the two last
+ arguments of macro `AC_PATH_PROG' for looking for the `erlc'
+ program. For example, to look for `erlc' only in the
+ `/usr/lib/erlang/bin' directory:
+
+ AC_ERLANG_PATH_ERLC([not found], [/usr/lib/erlang/bin])
+
+ -- Macro: AC_ERLANG_NEED_ERLC ([PATH = `$PATH'])
+ A simplified variant of the `AC_ERLANG_PATH_ERLC' macro, that
+ prints an error message and exits the `configure' script if the
+ `erlc' program is not found.
+
+ -- Macro: AC_ERLANG_PATH_ERL ([VALUE-IF-NOT-FOUND], [PATH = `$PATH'])
+ Determine an Erlang interpreter to use. If `ERL' is not already
+ set in the environment, check for `erl'. Set output variable
+ `ERL' to the complete path of the interpreter command found.
+
+ The two optional arguments have the same meaning as the two last
+ arguments of macro `AC_PATH_PROG' for looking for the `erl'
+ program. For example, to look for `erl' only in the
+ `/usr/lib/erlang/bin' directory:
+
+ AC_ERLANG_PATH_ERL([not found], [/usr/lib/erlang/bin])
+
+ -- Macro: AC_ERLANG_NEED_ERL ([PATH = `$PATH'])
+ A simplified variant of the `AC_ERLANG_PATH_ERL' macro, that
+ prints an error message and exits the `configure' script if the
+ `erl' program is not found.
+
+
+File: autoconf.info, Node: Fortran Compiler, Next: Go Compiler, Prev: Erlang Compiler and Interpreter, Up: Compilers and Preprocessors
+
+5.10.8 Fortran Compiler Characteristics
+---------------------------------------
+
+The Autoconf Fortran support is divided into two categories: legacy
+Fortran 77 macros (`F77'), and modern Fortran macros (`FC'). The
+former are intended for traditional Fortran 77 code, and have output
+variables like `F77', `FFLAGS', and `FLIBS'. The latter are for newer
+programs that can (or must) compile under the newer Fortran standards,
+and have output variables like `FC', `FCFLAGS', and `FCLIBS'.
+
+ Except for the macros `AC_FC_SRCEXT', `AC_FC_FREEFORM',
+`AC_FC_FIXEDFORM', and `AC_FC_LINE_LENGTH' (see below), the `FC' and
+`F77' macros behave almost identically, and so they are documented
+together in this section.
+
+ -- Macro: AC_PROG_F77 ([COMPILER-SEARCH-LIST])
+ Determine a Fortran 77 compiler to use. If `F77' is not already
+ set in the environment, then check for `g77' and `f77', and then
+ some other names. Set the output variable `F77' to the name of
+ the compiler found.
+
+ This macro may, however, be invoked with an optional first argument
+ which, if specified, must be a blank-separated list of Fortran 77
+ compilers to search for. This just gives the user an opportunity
+ to specify an alternative search list for the Fortran 77 compiler.
+ For example, if you didn't like the default order, then you could
+ invoke `AC_PROG_F77' like this:
+
+ AC_PROG_F77([fl32 f77 fort77 xlf g77 f90 xlf90])
+
+ If using `g77' (the GNU Fortran 77 compiler), then set the shell
+ variable `G77' to `yes'. If the output variable `FFLAGS' was not
+ already set in the environment, then set it to `-g -02' for `g77'
+ (or `-O2' where `g77' does not accept `-g'). Otherwise, set
+ `FFLAGS' to `-g' for all other Fortran 77 compilers.
+
+ The result of the GNU test is cached in the
+ `ac_cv_f77_compiler_gnu' variable, acceptance of `-g' in the
+ `ac_cv_prog_f77_g' variable.
+
+ -- Macro: AC_PROG_FC ([COMPILER-SEARCH-LIST], [DIALECT])
+ Determine a Fortran compiler to use. If `FC' is not already set in
+ the environment, then `dialect' is a hint to indicate what Fortran
+ dialect to search for; the default is to search for the newest
+ available dialect. Set the output variable `FC' to the name of
+ the compiler found.
+
+ By default, newer dialects are preferred over older dialects, but
+ if `dialect' is specified then older dialects are preferred
+ starting with the specified dialect. `dialect' can currently be
+ one of Fortran 77, Fortran 90, or Fortran 95. However, this is
+ only a hint of which compiler _name_ to prefer (e.g., `f90' or
+ `f95'), and no attempt is made to guarantee that a particular
+ language standard is actually supported. Thus, it is preferable
+ that you avoid the `dialect' option, and use AC_PROG_FC only for
+ code compatible with the latest Fortran standard.
+
+ This macro may, alternatively, be invoked with an optional first
+ argument which, if specified, must be a blank-separated list of
+ Fortran compilers to search for, just as in `AC_PROG_F77'.
+
+ If using `gfortran' or `g77' (the GNU Fortran compilers), then set
+ the shell variable `GFC' to `yes'. If the output variable
+ `FCFLAGS' was not already set in the environment, then set it to
+ `-g -02' for GNU `g77' (or `-O2' where `g77' does not accept
+ `-g'). Otherwise, set `FCFLAGS' to `-g' for all other Fortran
+ compilers.
+
+ The result of the GNU test is cached in the `ac_cv_fc_compiler_gnu'
+ variable, acceptance of `-g' in the `ac_cv_prog_fc_g' variable.
+
+ -- Macro: AC_PROG_F77_C_O
+ -- Macro: AC_PROG_FC_C_O
+ Test whether the Fortran compiler accepts the options `-c' and
+ `-o' simultaneously, and define `F77_NO_MINUS_C_MINUS_O' or
+ `FC_NO_MINUS_C_MINUS_O', respectively, if it does not.
+
+ The result of the test is cached in the `ac_cv_prog_f77_c_o' or
+ `ac_cv_prog_fc_c_o' variable, respectively.
+
+ The following macros check for Fortran compiler characteristics. To
+check for characteristics not listed here, use `AC_COMPILE_IFELSE'
+(*note Running the Compiler::) or `AC_RUN_IFELSE' (*note Runtime::),
+making sure to first set the current language to Fortran 77 or Fortran
+via `AC_LANG([Fortran 77])' or `AC_LANG(Fortran)' (*note Language
+Choice::).
+
+ -- Macro: AC_F77_LIBRARY_LDFLAGS
+ -- Macro: AC_FC_LIBRARY_LDFLAGS
+ Determine the linker flags (e.g., `-L' and `-l') for the "Fortran
+ intrinsic and runtime libraries" that are required to successfully
+ link a Fortran program or shared library. The output variable
+ `FLIBS' or `FCLIBS' is set to these flags (which should be
+ included after `LIBS' when linking).
+
+ This macro is intended to be used in those situations when it is
+ necessary to mix, e.g., C++ and Fortran source code in a single
+ program or shared library (*note Mixing Fortran 77 With C and C++:
+ (automake)Mixing Fortran 77 With C and C++.).
+
+ For example, if object files from a C++ and Fortran compiler must
+ be linked together, then the C++ compiler/linker must be used for
+ linking (since special C++-ish things need to happen at link time
+ like calling global constructors, instantiating templates,
+ enabling exception support, etc.).
+
+ However, the Fortran intrinsic and runtime libraries must be
+ linked in as well, but the C++ compiler/linker doesn't know by
+ default how to add these Fortran 77 libraries. Hence, this macro
+ was created to determine these Fortran libraries.
+
+ The macros `AC_F77_DUMMY_MAIN' and `AC_FC_DUMMY_MAIN' or
+ `AC_F77_MAIN' and `AC_FC_MAIN' are probably also necessary to link
+ C/C++ with Fortran; see below. Further, it is highly recommended
+ that you use `AC_CONFIG_HEADERS' (*note Configuration Headers::)
+ because the complex defines that the function wrapper macros create
+ may not work with C/C++ compiler drivers.
+
+ These macros internally compute the flag needed to verbose linking
+ output and cache it in `ac_cv_prog_f77_v' or `ac_cv_prog_fc_v'
+ variables, respectively. The computed linker flags are cached in
+ `ac_cv_f77_libs' or `ac_cv_fc_libs', respectively.
+
+ -- Macro: AC_F77_DUMMY_MAIN ([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND =
+ `AC_MSG_FAILURE'])
+ -- Macro: AC_FC_DUMMY_MAIN ([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND =
+ `AC_MSG_FAILURE'])
+ With many compilers, the Fortran libraries detected by
+ `AC_F77_LIBRARY_LDFLAGS' or `AC_FC_LIBRARY_LDFLAGS' provide their
+ own `main' entry function that initializes things like Fortran
+ I/O, and which then calls a user-provided entry function named
+ (say) `MAIN__' to run the user's program. The `AC_F77_DUMMY_MAIN'
+ and `AC_FC_DUMMY_MAIN' or `AC_F77_MAIN' and `AC_FC_MAIN' macros
+ figure out how to deal with this interaction.
+
+ When using Fortran for purely numerical functions (no I/O, etc.)
+ often one prefers to provide one's own `main' and skip the Fortran
+ library initializations. In this case, however, one may still
+ need to provide a dummy `MAIN__' routine in order to prevent
+ linking errors on some systems. `AC_F77_DUMMY_MAIN' or
+ `AC_FC_DUMMY_MAIN' detects whether any such routine is _required_
+ for linking, and what its name is; the shell variable
+ `F77_DUMMY_MAIN' or `FC_DUMMY_MAIN' holds this name, `unknown'
+ when no solution was found, and `none' when no such dummy main is
+ needed.
+
+ By default, ACTION-IF-FOUND defines `F77_DUMMY_MAIN' or
+ `FC_DUMMY_MAIN' to the name of this routine (e.g., `MAIN__') _if_
+ it is required. ACTION-IF-NOT-FOUND defaults to exiting with an
+ error.
+
+ In order to link with Fortran routines, the user's C/C++ program
+ should then include the following code to define the dummy main if
+ it is needed:
+
+ #ifdef F77_DUMMY_MAIN
+ # ifdef __cplusplus
+ extern "C"
+ # endif
+ int F77_DUMMY_MAIN () { return 1; }
+ #endif
+
+ (Replace `F77' with `FC' for Fortran instead of Fortran 77.)
+
+ Note that this macro is called automatically from `AC_F77_WRAPPERS'
+ or `AC_FC_WRAPPERS'; there is generally no need to call it
+ explicitly unless one wants to change the default actions.
+
+ The result of this macro is cached in the `ac_cv_f77_dummy_main' or
+ `ac_cv_fc_dummy_main' variable, respectively.
+
+ -- Macro: AC_F77_MAIN
+ -- Macro: AC_FC_MAIN
+ As discussed above, many Fortran libraries allow you to provide an
+ entry point called (say) `MAIN__' instead of the usual `main',
+ which is then called by a `main' function in the Fortran libraries
+ that initializes things like Fortran I/O. The `AC_F77_MAIN' and
+ `AC_FC_MAIN' macros detect whether it is _possible_ to utilize
+ such an alternate main function, and defines `F77_MAIN' and
+ `FC_MAIN' to the name of the function. (If no alternate main
+ function name is found, `F77_MAIN' and `FC_MAIN' are simply
+ defined to `main'.)
+
+ Thus, when calling Fortran routines from C that perform things
+ like I/O, one should use this macro and declare the "main"
+ function like so:
+
+ #ifdef __cplusplus
+ extern "C"
+ #endif
+ int F77_MAIN (int argc, char *argv[]);
+
+ (Again, replace `F77' with `FC' for Fortran instead of Fortran 77.)
+
+ The result of this macro is cached in the `ac_cv_f77_main' or
+ `ac_cv_fc_main' variable, respectively.
+
+ -- Macro: AC_F77_WRAPPERS
+ -- Macro: AC_FC_WRAPPERS
+ Defines C macros `F77_FUNC (name, NAME)', `FC_FUNC (name, NAME)',
+ `F77_FUNC_(name, NAME)', and `FC_FUNC_(name, NAME)' to properly
+ mangle the names of C/C++ identifiers, and identifiers with
+ underscores, respectively, so that they match the name-mangling
+ scheme used by the Fortran compiler.
+
+ Fortran is case-insensitive, and in order to achieve this the
+ Fortran compiler converts all identifiers into a canonical case
+ and format. To call a Fortran subroutine from C or to write a C
+ function that is callable from Fortran, the C program must
+ explicitly use identifiers in the format expected by the Fortran
+ compiler. In order to do this, one simply wraps all C identifiers
+ in one of the macros provided by `AC_F77_WRAPPERS' or
+ `AC_FC_WRAPPERS'. For example, suppose you have the following
+ Fortran 77 subroutine:
+
+ subroutine foobar (x, y)
+ double precision x, y
+ y = 3.14159 * x
+ return
+ end
+
+ You would then declare its prototype in C or C++ as:
+
+ #define FOOBAR_F77 F77_FUNC (foobar, FOOBAR)
+ #ifdef __cplusplus
+ extern "C" /* prevent C++ name mangling */
+ #endif
+ void FOOBAR_F77 (double *x, double *y);
+
+ Note that we pass both the lowercase and uppercase versions of the
+ function name to `F77_FUNC' so that it can select the right one.
+ Note also that all parameters to Fortran 77 routines are passed as
+ pointers (*note Mixing Fortran 77 With C and C++: (automake)Mixing
+ Fortran 77 With C and C++.).
+
+ (Replace `F77' with `FC' for Fortran instead of Fortran 77.)
+
+ Although Autoconf tries to be intelligent about detecting the
+ name-mangling scheme of the Fortran compiler, there may be Fortran
+ compilers that it doesn't support yet. In this case, the above
+ code generates a compile-time error, but some other behavior
+ (e.g., disabling Fortran-related features) can be induced by
+ checking whether `F77_FUNC' or `FC_FUNC' is defined.
+
+ Now, to call that routine from a C program, we would do something
+ like:
+
+ {
+ double x = 2.7183, y;
+ FOOBAR_F77 (&x, &y);
+ }
+
+ If the Fortran identifier contains an underscore (e.g., `foo_bar'),
+ you should use `F77_FUNC_' or `FC_FUNC_' instead of `F77_FUNC' or
+ `FC_FUNC' (with the same arguments). This is because some Fortran
+ compilers mangle names differently if they contain an underscore.
+
+ The name mangling scheme is encoded in the `ac_cv_f77_mangling' or
+ `ac_cv_fc_mangling' cache variable, respectively, and also used for
+ the `AC_F77_FUNC' and `AC_FC_FUNC' macros described below.
+
+ -- Macro: AC_F77_FUNC (NAME, [SHELLVAR])
+ -- Macro: AC_FC_FUNC (NAME, [SHELLVAR])
+ Given an identifier NAME, set the shell variable SHELLVAR to hold
+ the mangled version NAME according to the rules of the Fortran
+ linker (see also `AC_F77_WRAPPERS' or `AC_FC_WRAPPERS'). SHELLVAR
+ is optional; if it is not supplied, the shell variable is simply
+ NAME. The purpose of this macro is to give the caller a way to
+ access the name-mangling information other than through the C
+ preprocessor as above, for example, to call Fortran routines from
+ some language other than C/C++.
+
+ -- Macro: AC_FC_SRCEXT (EXT, [ACTION-IF-SUCCESS], [ACTION-IF-FAILURE =
+ `AC_MSG_FAILURE'])
+ -- Macro: AC_FC_PP_SRCEXT (EXT, [ACTION-IF-SUCCESS],
+ [ACTION-IF-FAILURE = `AC_MSG_FAILURE'])
+ By default, the `FC' macros perform their tests using a `.f'
+ extension for source-code files. Some compilers, however, only
+ enable newer language features for appropriately named files,
+ e.g., Fortran 90 features only for `.f90' files, or preprocessing
+ only with `.F' files or maybe other upper-case extensions. On the
+ other hand, some other compilers expect all source files to end in
+ `.f' and require special flags to support other file name
+ extensions. The `AC_FC_SRCEXT' and `AC_FC_PP_SRCEXT' macros deal
+ with these issues.
+
+ The `AC_FC_SRCEXT' macro tries to get the `FC' compiler to accept
+ files ending with the extension `.EXT' (i.e., EXT does _not_
+ contain the dot). If any special compiler flags are needed for
+ this, it stores them in the output variable `FCFLAGS_EXT'. This
+ extension and these flags are then used for all subsequent `FC'
+ tests (until `AC_FC_SRCEXT' or `AC_FC_PP_SRCEXT' is called another
+ time).
+
+ For example, you would use `AC_FC_SRCEXT(f90)' to employ the
+ `.f90' extension in future tests, and it would set the
+ `FCFLAGS_f90' output variable with any extra flags that are needed
+ to compile such files.
+
+ Similarly, the `AC_FC_PP_SRCEXT' macro tries to get the `FC'
+ compiler to preprocess and compile files with the extension
+ `.EXT'. When both `fpp' and `cpp' style preprocessing are
+ provided, the former is preferred, as the latter may treat
+ continuation lines, `//' tokens, and white space differently from
+ what some Fortran dialects expect. Conversely, if you do not want
+ files to be preprocessed, use only lower-case characters in the
+ file name extension. Like with `AC_FC_SRCEXT(f90)', any needed
+ flags are stored in the `FCFLAGS_EXT' variable.
+
+ The `FCFLAGS_EXT' flags can _not_ be simply absorbed into
+ `FCFLAGS', for two reasons based on the limitations of some
+ compilers. First, only one `FCFLAGS_EXT' can be used at a time,
+ so files with different extensions must be compiled separately.
+ Second, `FCFLAGS_EXT' must appear _immediately_ before the
+ source-code file name when compiling. So, continuing the example
+ above, you might compile a `foo.f90' file in your makefile with the
+ command:
+
+ foo.o: foo.f90
+ $(FC) -c $(FCFLAGS) $(FCFLAGS_f90) '$(srcdir)/foo.f90'
+
+ If `AC_FC_SRCEXT' or `AC_FC_PP_SRCEXT' succeeds in compiling files
+ with the EXT extension, it calls ACTION-IF-SUCCESS (defaults to
+ nothing). If it fails, and cannot find a way to make the `FC'
+ compiler accept such files, it calls ACTION-IF-FAILURE (defaults
+ to exiting with an error message).
+
+ The `AC_FC_SRCEXT' and `AC_FC_PP_SRCEXT' macros cache their
+ results in `ac_cv_fc_srcext_EXT' and `ac_cv_fc_pp_srcext_EXT'
+ variables, respectively.
+
+ -- Macro: AC_FC_PP_DEFINE ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE =
+ `AC_MSG_FAILURE'])
+ Find a flag to specify defines for preprocessed Fortran. Not all
+ Fortran compilers use `-D'. Substitute `FC_DEFINE' with the
+ result and call ACTION-IF-SUCCESS (defaults to nothing) if
+ successful, and ACTION-IF-FAILURE (defaults to failing with an
+ error message) if not.
+
+ This macro calls `AC_FC_PP_SRCEXT([F])' in order to learn how to
+ preprocess a `conftest.F' file, but restores a previously used
+ Fortran source file extension afterwards again.
+
+ The result of this test is cached in the `ac_cv_fc_pp_define'
+ variable.
+
+ -- Macro: AC_FC_FREEFORM ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE =
+ `AC_MSG_FAILURE'])
+ Try to ensure that the Fortran compiler (`$FC') allows free-format
+ source code (as opposed to the older fixed-format style from
+ Fortran 77). If necessary, it may add some additional flags to
+ `FCFLAGS'.
+
+ This macro is most important if you are using the default `.f'
+ extension, since many compilers interpret this extension as
+ indicating fixed-format source unless an additional flag is
+ supplied. If you specify a different extension with
+ `AC_FC_SRCEXT', such as `.f90', then `AC_FC_FREEFORM' ordinarily
+ succeeds without modifying `FCFLAGS'. For extensions which the
+ compiler does not know about, the flag set by the `AC_FC_SRCEXT'
+ macro might let the compiler assume Fortran 77 by default, however.
+
+ If `AC_FC_FREEFORM' succeeds in compiling free-form source, it
+ calls ACTION-IF-SUCCESS (defaults to nothing). If it fails, it
+ calls ACTION-IF-FAILURE (defaults to exiting with an error
+ message).
+
+ The result of this test, or `none' or `unknown', is cached in the
+ `ac_cv_fc_freeform' variable.
+
+ -- Macro: AC_FC_FIXEDFORM ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE =
+ `AC_MSG_FAILURE'])
+ Try to ensure that the Fortran compiler (`$FC') allows the old
+ fixed-format source code (as opposed to free-format style). If
+ necessary, it may add some additional flags to `FCFLAGS'.
+
+ This macro is needed for some compilers alias names like `xlf95'
+ which assume free-form source code by default, and in case you
+ want to use fixed-form source with an extension like `.f90' which
+ many compilers interpret as free-form by default. If you specify
+ a different extension with `AC_FC_SRCEXT', such as `.f', then
+ `AC_FC_FIXEDFORM' ordinarily succeeds without modifying `FCFLAGS'.
+
+ If `AC_FC_FIXEDFORM' succeeds in compiling fixed-form source, it
+ calls ACTION-IF-SUCCESS (defaults to nothing). If it fails, it
+ calls ACTION-IF-FAILURE (defaults to exiting with an error
+ message).
+
+ The result of this test, or `none' or `unknown', is cached in the
+ `ac_cv_fc_fixedform' variable.
+
+ -- Macro: AC_FC_LINE_LENGTH ([LENGTH], [ACTION-IF-SUCCESS],
+ [ACTION-IF-FAILURE = `AC_MSG_FAILURE'])
+ Try to ensure that the Fortran compiler (`$FC') accepts long source
+ code lines. The LENGTH argument may be given as 80, 132, or
+ unlimited, and defaults to 132. Note that line lengths above 254
+ columns are not portable, and some compilers do not accept more
+ than 132 columns at least for fixed format source. If necessary,
+ it may add some additional flags to `FCFLAGS'.
+
+ If `AC_FC_LINE_LENGTH' succeeds in compiling fixed-form source, it
+ calls ACTION-IF-SUCCESS (defaults to nothing). If it fails, it
+ calls ACTION-IF-FAILURE (defaults to exiting with an error
+ message).
+
+ The result of this test, or `none' or `unknown', is cached in the
+ `ac_cv_fc_line_length' variable.
+
+ -- Macro: AC_FC_CHECK_BOUNDS ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE
+ = `AC_MSG_FAILURE'])
+ The `AC_FC_CHECK_BOUNDS' macro tries to enable array bounds
+ checking in the Fortran compiler. If successful, the
+ ACTION-IF-SUCCESS is called and any needed flags are added to
+ `FCFLAGS'. Otherwise, ACTION-IF-FAILURE is called, which defaults
+ to failing with an error message. The macro currently requires
+ Fortran 90 or a newer dialect.
+
+ The result of the macro is cached in the `ac_cv_fc_check_bounds'
+ variable.
+
+ -- Macro: AC_F77_IMPLICIT_NONE ([ACTION-IF-SUCCESS],
+ [ACTION-IF-FAILURE = `AC_MSG_FAILURE'])
+ -- Macro: AC_FC_IMPLICIT_NONE ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE
+ = `AC_MSG_FAILURE'])
+ Try to disallow implicit declarations in the Fortran compiler. If
+ successful, ACTION-IF-SUCCESS is called and any needed flags are
+ added to `FFLAGS' or `FCFLAGS', respectively. Otherwise,
+ ACTION-IF-FAILURE is called, which defaults to failing with an
+ error message.
+
+ The result of these macros are cached in the
+ `ac_cv_f77_implicit_none' and `ac_cv_fc_implicit_none' variables,
+ respectively.
+
+ -- Macro: AC_FC_MODULE_EXTENSION
+ Find the Fortran 90 module file name extension. Most Fortran 90
+ compilers store module information in files separate from the
+ object files. The module files are usually named after the name
+ of the module rather than the source file name, with characters
+ possibly turned to upper case, plus an extension, often `.mod'.
+
+ Not all compilers use module files at all, or by default. The Cray
+ Fortran compiler requires `-e m' in order to store and search
+ module information in `.mod' files rather than in object files.
+ Likewise, the Fujitsu Fortran compilers uses the `-Am' option to
+ indicate how module information is stored.
+
+ The `AC_FC_MODULE_EXTENSION' macro computes the module extension
+ without the leading dot, and stores that in the `FC_MODEXT'
+ variable. If the compiler does not produce module files, or the
+ extension cannot be determined, `FC_MODEXT' is empty. Typically,
+ the result of this macro may be used in cleanup `make' rules as
+ follows:
+
+ clean-modules:
+ -test -z "$(FC_MODEXT)" || rm -f *.$(FC_MODEXT)
+
+ The extension, or `unknown', is cached in the
+ `ac_cv_fc_module_ext' variable.
+
+ -- Macro: AC_FC_MODULE_FLAG ([ACTION-IF-SUCCESS], [ACTION-IF-FAILURE =
+ `AC_MSG_FAILURE'])
+ Find the compiler flag to include Fortran 90 module information
+ from another directory, and store that in the `FC_MODINC' variable.
+ Call ACTION-IF-SUCCESS (defaults to nothing) if successful, and
+ set `FC_MODINC' to empty and call ACTION-IF-FAILURE (defaults to
+ exiting with an error message) if not.
+
+ Most Fortran 90 compilers provide a way to specify module
+ directories. Some have separate flags for the directory to write
+ module files to, and directories to search them in, whereas others
+ only allow writing to the current directory or to the first
+ directory specified in the include path. Further, with some
+ compilers, the module search path and the preprocessor search path
+ can only be modified with the same flag. Thus, for portability,
+ write module files to the current directory only and list that as
+ first directory in the search path.
+
+ There may be no whitespace between `FC_MODINC' and the following
+ directory name, but `FC_MODINC' may contain trailing white space.
+ For example, if you use Automake and would like to search `../lib'
+ for module files, you can use the following:
+
+ AM_FCFLAGS = $(FC_MODINC). $(FC_MODINC)../lib
+
+ Inside `configure' tests, you can use:
+
+ if test -n "$FC_MODINC"; then
+ FCFLAGS="$FCFLAGS $FC_MODINC. $FC_MODINC../lib"
+ fi
+
+ The flag is cached in the `ac_cv_fc_module_flag' variable. The
+ substituted value of `FC_MODINC' may refer to the `ac_empty' dummy
+ placeholder empty variable, to avoid losing the significant
+ trailing whitespace in a `Makefile'.
+
+ -- Macro: AC_FC_MODULE_OUTPUT_FLAG ([ACTION-IF-SUCCESS],
+ [ACTION-IF-FAILURE = `AC_MSG_FAILURE'])
+ Find the compiler flag to write Fortran 90 module information to
+ another directory, and store that in the `FC_MODOUT' variable.
+ Call ACTION-IF-SUCCESS (defaults to nothing) if successful, and
+ set `FC_MODOUT' to empty and call ACTION-IF-FAILURE (defaults to
+ exiting with an error message) if not.
+
+ Not all Fortran 90 compilers write module files, and of those that
+ do, not all allow writing to a directory other than the current
+ one, nor do all have separate flags for writing and reading; see
+ the description of `AC_FC_MODULE_FLAG' above. If you need to be
+ able to write to another directory, for maximum portability use
+ `FC_MODOUT' before any `FC_MODINC' and include both the current
+ directory and the one you write to in the search path:
+
+ AM_FCFLAGS = $(FC_MODOUT)../mod $(FC_MODINC)../mod $(FC_MODINC). ...
+
+ The flag is cached in the `ac_cv_fc_module_output_flag' variable.
+ The substituted value of `FC_MODOUT' may refer to the `ac_empty'
+ dummy placeholder empty variable, to avoid losing the significant
+ trailing whitespace in a `Makefile'.
+
+
+File: autoconf.info, Node: Go Compiler, Prev: Fortran Compiler, Up: Compilers and Preprocessors
+
+5.10.9 Go Compiler Characteristics
+----------------------------------
+
+Autoconf provides basic support for the Go programming language when
+using the `gccgo' compiler (there is currently no support for the `6g'
+and `8g' compilers).
+
+ -- Macro: AC_PROG_GO ([COMPILER-SEARCH-LIST])
+ Find the Go compiler to use. Check whether the environment
+ variable `GOC' is set; if so, then set output variable `GOC' to its
+ value.
+
+ Otherwise, if the macro is invoked without an argument, then
+ search for a Go compiler named `gccgo'. If it is not found, then
+ as a last resort set `GOC' to `gccgo'.
+
+ This macro may be invoked with an optional first argument which, if
+ specified, must be a blank-separated list of Go compilers to
+ search for.
+
+ If output variable `GOFLAGS' was not already set, set it to `-g
+ -O2'. If your package does not like this default, `GOFLAGS' may
+ be set before `AC_PROG_GO'.
+
+
+File: autoconf.info, Node: System Services, Next: Posix Variants, Prev: Compilers and Preprocessors, Up: Existing Tests
+
+5.11 System Services
+====================
+
+The following macros check for operating system services or
+capabilities.
+
+ -- Macro: AC_PATH_X
+ Try to locate the X Window System include files and libraries. If
+ the user gave the command line options `--x-includes=DIR' and
+ `--x-libraries=DIR', use those directories.
+
+ If either or both were not given, get the missing values by running
+ `xmkmf' (or an executable pointed to by the `XMKMF' environment
+ variable) on a trivial `Imakefile' and examining the makefile that
+ it produces. Setting `XMKMF' to `false' disables this method.
+
+ If this method fails to find the X Window System, `configure'
+ looks for the files in several directories where they often reside.
+ If either method is successful, set the shell variables
+ `x_includes' and `x_libraries' to their locations, unless they are
+ in directories the compiler searches by default.
+
+ If both methods fail, or the user gave the command line option
+ `--without-x', set the shell variable `no_x' to `yes'; otherwise
+ set it to the empty string.
+
+ -- Macro: AC_PATH_XTRA
+ An enhanced version of `AC_PATH_X'. It adds the C compiler flags
+ that X needs to output variable `X_CFLAGS', and the X linker flags
+ to `X_LIBS'. Define `X_DISPLAY_MISSING' if X is not available.
+
+ This macro also checks for special libraries that some systems
+ need in order to compile X programs. It adds any that the system
+ needs to output variable `X_EXTRA_LIBS'. And it checks for
+ special X11R6 libraries that need to be linked with before
+ `-lX11', and adds any found to the output variable `X_PRE_LIBS'.
+
+
+ -- Macro: AC_SYS_INTERPRETER
+ Check whether the system supports starting scripts with a line of
+ the form `#!/bin/sh' to select the interpreter to use for the
+ script. After running this macro, shell code in `configure.ac'
+ can check the shell variable `interpval'; it is set to `yes' if
+ the system supports `#!', `no' if not.
+
+ -- Macro: AC_SYS_LARGEFILE
+ Arrange for 64-bit file offsets, known as large-file support
+ (http://www.unix-systems.org/version2/whatsnew/lfs20mar.html). On
+ some hosts, one must use special compiler options to build
+ programs that can access large files. Append any such options to
+ the output variable `CC'. Define `_FILE_OFFSET_BITS' and
+ `_LARGE_FILES' if necessary.
+
+ Large-file support can be disabled by configuring with the
+ `--disable-largefile' option.
+
+ If you use this macro, check that your program works even when
+ `off_t' is wider than `long int', since this is common when
+ large-file support is enabled. For example, it is not correct to
+ print an arbitrary `off_t' value `X' with `printf ("%ld", (long
+ int) X)'.
+
+ The LFS introduced the `fseeko' and `ftello' functions to replace
+ their C counterparts `fseek' and `ftell' that do not use `off_t'.
+ Take care to use `AC_FUNC_FSEEKO' to make their prototypes
+ available when using them and large-file support is enabled.
+
+ -- Macro: AC_SYS_LONG_FILE_NAMES
+ If the system supports file names longer than 14 characters, define
+ `HAVE_LONG_FILE_NAMES'.
+
+ -- Macro: AC_SYS_POSIX_TERMIOS
+ Check to see if the Posix termios headers and functions are
+ available on the system. If so, set the shell variable
+ `ac_cv_sys_posix_termios' to `yes'. If not, set the variable to
+ `no'.
+
+
+File: autoconf.info, Node: Posix Variants, Next: Erlang Libraries, Prev: System Services, Up: Existing Tests
+
+5.12 Posix Variants
+===================
+
+The following macro makes it possible to use features of Posix that are
+extensions to C, as well as platform extensions not defined by Posix.
+
+ -- Macro: AC_USE_SYSTEM_EXTENSIONS
+ This macro was introduced in Autoconf 2.60. If possible, enable
+ extensions to C or Posix on hosts that normally disable the
+ extensions, typically due to standards-conformance namespace
+ issues. This should be called before any macros that run the C
+ compiler. The following preprocessor macros are defined where
+ appropriate:
+
+ `_GNU_SOURCE'
+ Enable extensions on GNU/Linux.
+
+ `__EXTENSIONS__'
+ Enable general extensions on Solaris.
+
+ `_POSIX_PTHREAD_SEMANTICS'
+ Enable threading extensions on Solaris.
+
+ `_TANDEM_SOURCE'
+ Enable extensions for the HP NonStop platform.
+
+ `_ALL_SOURCE'
+ Enable extensions for AIX 3, and for Interix.
+
+ `_POSIX_SOURCE'
+ Enable Posix functions for Minix.
+
+ `_POSIX_1_SOURCE'
+ Enable additional Posix functions for Minix.
+
+ `_MINIX'
+ Identify Minix platform. This particular preprocessor macro
+ is obsolescent, and may be removed in a future release of
+ Autoconf.
+
+
+File: autoconf.info, Node: Erlang Libraries, Prev: Posix Variants, Up: Existing Tests
+
+5.13 Erlang Libraries
+=====================
+
+The following macros check for an installation of Erlang/OTP, and for
+the presence of certain Erlang libraries. All those macros require the
+configuration of an Erlang interpreter and an Erlang compiler (*note
+Erlang Compiler and Interpreter::).
+
+ -- Macro: AC_ERLANG_SUBST_ERTS_VER
+ Set the output variable `ERLANG_ERTS_VER' to the version of the
+ Erlang runtime system (as returned by Erlang's
+ `erlang:system_info(version)' function). The result of this test
+ is cached if caching is enabled when running `configure'. The
+ `ERLANG_ERTS_VER' variable is not intended to be used for testing
+ for features of specific ERTS versions, but to be used for
+ substituting the ERTS version in Erlang/OTP release resource files
+ (`.rel' files), as shown below.
+
+ -- Macro: AC_ERLANG_SUBST_ROOT_DIR
+ Set the output variable `ERLANG_ROOT_DIR' to the path to the base
+ directory in which Erlang/OTP is installed (as returned by Erlang's
+ `code:root_dir/0' function). The result of this test is cached if
+ caching is enabled when running `configure'.
+
+ -- Macro: AC_ERLANG_SUBST_LIB_DIR
+ Set the output variable `ERLANG_LIB_DIR' to the path of the library
+ directory of Erlang/OTP (as returned by Erlang's `code:lib_dir/0'
+ function), which subdirectories each contain an installed
+ Erlang/OTP library. The result of this test is cached if caching
+ is enabled when running `configure'.
+
+ -- Macro: AC_ERLANG_CHECK_LIB (LIBRARY, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND])
+ Test whether the Erlang/OTP library LIBRARY is installed by
+ calling Erlang's `code:lib_dir/1' function. The result of this
+ test is cached if caching is enabled when running `configure'.
+ ACTION-IF-FOUND is a list of shell commands to run if the library
+ is installed; ACTION-IF-NOT-FOUND is a list of shell commands to
+ run if it is not. Additionally, if the library is installed, the
+ output variable `ERLANG_LIB_DIR_LIBRARY' is set to the path to the
+ library installation directory, and the output variable
+ `ERLANG_LIB_VER_LIBRARY' is set to the version number that is part
+ of the subdirectory name, if it is in the standard form
+ (`LIBRARY-VERSION'). If the directory name does not have a
+ version part, `ERLANG_LIB_VER_LIBRARY' is set to the empty string.
+ If the library is not installed, `ERLANG_LIB_DIR_LIBRARY' and
+ `ERLANG_LIB_VER_LIBRARY' are set to `"not found"'. For example,
+ to check if library `stdlib' is installed:
+
+ AC_ERLANG_CHECK_LIB([stdlib],
+ [echo "stdlib version \"$ERLANG_LIB_VER_stdlib\""
+ echo "is installed in \"$ERLANG_LIB_DIR_stdlib\""],
+ [AC_MSG_ERROR([stdlib was not found!])])
+
+ The `ERLANG_LIB_VER_LIBRARY' variables (set by
+ `AC_ERLANG_CHECK_LIB') and the `ERLANG_ERTS_VER' variable (set by
+ `AC_ERLANG_SUBST_ERTS_VER') are not intended to be used for
+ testing for features of specific versions of libraries or of the
+ Erlang runtime system. Those variables are intended to be
+ substituted in Erlang release resource files (`.rel' files). For
+ instance, to generate a `example.rel' file for an application
+ depending on the `stdlib' library, `configure.ac' could contain:
+
+ AC_ERLANG_SUBST_ERTS_VER
+ AC_ERLANG_CHECK_LIB([stdlib],
+ [],
+ [AC_MSG_ERROR([stdlib was not found!])])
+ AC_CONFIG_FILES([example.rel])
+
+ The `example.rel.in' file used to generate `example.rel' should
+ contain:
+
+ {release,
+ {"@PACKAGE@", "@VERSION@"},
+ {erts, "@ERLANG_ERTS_VER@"},
+ [{stdlib, "@ERLANG_LIB_VER_stdlib@"},
+ {@PACKAGE@, "@VERSION@"}]}.
+
+ In addition to the above macros, which test installed Erlang
+libraries, the following macros determine the paths to the directories
+into which newly built Erlang libraries are to be installed:
+
+ -- Macro: AC_ERLANG_SUBST_INSTALL_LIB_DIR
+ Set the `ERLANG_INSTALL_LIB_DIR' output variable to the directory
+ into which every built Erlang library should be installed in a
+ separate subdirectory. If this variable is not set in the
+ environment when `configure' runs, its default value is
+ `${libdir}/erlang/lib'.
+
+ -- Macro: AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR (LIBRARY, VERSION)
+ Set the `ERLANG_INSTALL_LIB_DIR_LIBRARY' output variable to the
+ directory into which the built Erlang library LIBRARY version
+ VERSION should be installed. If this variable is not set in the
+ environment when `configure' runs, its default value is
+ `$ERLANG_INSTALL_LIB_DIR/LIBRARY-VERSION', the value of the
+ `ERLANG_INSTALL_LIB_DIR' variable being set by the
+ `AC_ERLANG_SUBST_INSTALL_LIB_DIR' macro.
+
+
+File: autoconf.info, Node: Writing Tests, Next: Results, Prev: Existing Tests, Up: Top
+
+6 Writing Tests
+***************
+
+If the existing feature tests don't do something you need, you have to
+write new ones. These macros are the building blocks. They provide
+ways for other macros to check whether various kinds of features are
+available and report the results.
+
+ This chapter contains some suggestions and some of the reasons why
+the existing tests are written the way they are. You can also learn a
+lot about how to write Autoconf tests by looking at the existing ones.
+If something goes wrong in one or more of the Autoconf tests, this
+information can help you understand the assumptions behind them, which
+might help you figure out how to best solve the problem.
+
+ These macros check the output of the compiler system of the current
+language (*note Language Choice::). They do not cache the results of
+their tests for future use (*note Caching Results::), because they don't
+know enough about the information they are checking for to generate a
+cache variable name. They also do not print any messages, for the same
+reason. The checks for particular kinds of features call these macros
+and do cache their results and print messages about what they're
+checking for.
+
+ When you write a feature test that could be applicable to more than
+one software package, the best thing to do is encapsulate it in a new
+macro. *Note Writing Autoconf Macros::, for how to do that.
+
+* Menu:
+
+* Language Choice:: Selecting which language to use for testing
+* Writing Test Programs:: Forging source files for compilers
+* Running the Preprocessor:: Detecting preprocessor symbols
+* Running the Compiler:: Detecting language or header features
+* Running the Linker:: Detecting library features
+* Runtime:: Testing for runtime features
+* Systemology:: A zoology of operating systems
+* Multiple Cases:: Tests for several possible values
+
+
+File: autoconf.info, Node: Language Choice, Next: Writing Test Programs, Up: Writing Tests
+
+6.1 Language Choice
+===================
+
+Autoconf-generated `configure' scripts check for the C compiler and its
+features by default. Packages that use other programming languages
+(maybe more than one, e.g., C and C++) need to test features of the
+compilers for the respective languages. The following macros determine
+which programming language is used in the subsequent tests in
+`configure.ac'.
+
+ -- Macro: AC_LANG (LANGUAGE)
+ Do compilation tests using the compiler, preprocessor, and file
+ extensions for the specified LANGUAGE.
+
+ Supported languages are:
+
+ `C'
+ Do compilation tests using `CC' and `CPP' and use extension
+ `.c' for test programs. Use compilation flags: `CPPFLAGS'
+ with `CPP', and both `CPPFLAGS' and `CFLAGS' with `CC'.
+
+ `C++'
+ Do compilation tests using `CXX' and `CXXCPP' and use
+ extension `.C' for test programs. Use compilation flags:
+ `CPPFLAGS' with `CXXCPP', and both `CPPFLAGS' and `CXXFLAGS'
+ with `CXX'.
+
+ `Fortran 77'
+ Do compilation tests using `F77' and use extension `.f' for
+ test programs. Use compilation flags: `FFLAGS'.
+
+ `Fortran'
+ Do compilation tests using `FC' and use extension `.f' (or
+ whatever has been set by `AC_FC_SRCEXT') for test programs.
+ Use compilation flags: `FCFLAGS'.
+
+ `Erlang'
+ Compile and execute tests using `ERLC' and `ERL' and use
+ extension `.erl' for test Erlang modules. Use compilation
+ flags: `ERLCFLAGS'.
+
+ `Objective C'
+ Do compilation tests using `OBJC' and `OBJCPP' and use
+ extension `.m' for test programs. Use compilation flags:
+ `CPPFLAGS' with `OBJCPP', and both `CPPFLAGS' and `OBJCFLAGS'
+ with `OBJC'.
+
+ `Objective C++'
+ Do compilation tests using `OBJCXX' and `OBJCXXCPP' and use
+ extension `.mm' for test programs. Use compilation flags:
+ `CPPFLAGS' with `OBJCXXCPP', and both `CPPFLAGS' and
+ `OBJCXXFLAGS' with `OBJCXX'.
+
+ `Go'
+ Do compilation tests using `GOC' and use extension `.go' for
+ test programs. Use compilation flags `GOFLAGS'.
+
+ -- Macro: AC_LANG_PUSH (LANGUAGE)
+ Remember the current language (as set by `AC_LANG') on a stack, and
+ then select the LANGUAGE. Use this macro and `AC_LANG_POP' in
+ macros that need to temporarily switch to a particular language.
+
+ -- Macro: AC_LANG_POP ([LANGUAGE])
+ Select the language that is saved on the top of the stack, as set
+ by `AC_LANG_PUSH', and remove it from the stack.
+
+ If given, LANGUAGE specifies the language we just _quit_. It is a
+ good idea to specify it when it's known (which should be the
+ case...), since Autoconf detects inconsistencies.
+
+ AC_LANG_PUSH([Fortran 77])
+ # Perform some tests on Fortran 77.
+ # ...
+ AC_LANG_POP([Fortran 77])
+
+ -- Macro: AC_LANG_ASSERT (LANGUAGE)
+ Check statically that the current language is LANGUAGE. You
+ should use this in your language specific macros to avoid that
+ they be called with an inappropriate language.
+
+ This macro runs only at `autoconf' time, and incurs no cost at
+ `configure' time. Sadly enough and because Autoconf is a two
+ layer language (1), the macros `AC_LANG_PUSH' and `AC_LANG_POP'
+ cannot be "optimizing", therefore as much as possible you ought to
+ avoid using them to wrap your code, rather, require from the user
+ to run the macro with a correct current language, and check it
+ with `AC_LANG_ASSERT'. And anyway, that may help the user
+ understand she is running a Fortran macro while expecting a result
+ about her Fortran 77 compiler...
+
+ -- Macro: AC_REQUIRE_CPP
+ Ensure that whichever preprocessor would currently be used for
+ tests has been found. Calls `AC_REQUIRE' (*note Prerequisite
+ Macros::) with an argument of either `AC_PROG_CPP' or
+ `AC_PROG_CXXCPP', depending on which language is current.
+
+ ---------- Footnotes ----------
+
+ (1) Because M4 is not aware of Sh code, especially conditionals,
+some optimizations that look nice statically may produce incorrect
+results at runtime.
+
+
+File: autoconf.info, Node: Writing Test Programs, Next: Running the Preprocessor, Prev: Language Choice, Up: Writing Tests
+
+6.2 Writing Test Programs
+=========================
+
+Autoconf tests follow a common scheme: feed some program with some
+input, and most of the time, feed a compiler with some source file.
+This section is dedicated to these source samples.
+
+* Menu:
+
+* Guidelines:: General rules for writing test programs
+* Test Functions:: Avoiding pitfalls in test programs
+* Generating Sources:: Source program boilerplate
+
+
+File: autoconf.info, Node: Guidelines, Next: Test Functions, Up: Writing Test Programs
+
+6.2.1 Guidelines for Test Programs
+----------------------------------
+
+The most important rule to follow when writing testing samples is:
+
+ _Look for realism._
+
+ This motto means that testing samples must be written with the same
+strictness as real programs are written. In particular, you should
+avoid "shortcuts" and simplifications.
+
+ Don't just play with the preprocessor if you want to prepare a
+compilation. For instance, using `cpp' to check whether a header is
+functional might let your `configure' accept a header which causes some
+_compiler_ error. Do not hesitate to check a header with other headers
+included before, especially required headers.
+
+ Make sure the symbols you use are properly defined, i.e., refrain
+from simply declaring a function yourself instead of including the
+proper header.
+
+ Test programs should not write to standard output. They should exit
+with status 0 if the test succeeds, and with status 1 otherwise, so
+that success can be distinguished easily from a core dump or other
+failure; segmentation violations and other failures produce a nonzero
+exit status. Unless you arrange for `exit' to be declared, test
+programs should `return', not `exit', from `main', because on many
+systems `exit' is not declared by default.
+
+ Test programs can use `#if' or `#ifdef' to check the values of
+preprocessor macros defined by tests that have already run. For
+example, if you call `AC_HEADER_STDBOOL', then later on in
+`configure.ac' you can have a test program that includes `stdbool.h'
+conditionally:
+
+ #ifdef HAVE_STDBOOL_H
+ # include <stdbool.h>
+ #endif
+
+ Both `#if HAVE_STDBOOL_H' and `#ifdef HAVE_STDBOOL_H' will work with
+any standard C compiler. Some developers prefer `#if' because it is
+easier to read, while others prefer `#ifdef' because it avoids
+diagnostics with picky compilers like GCC with the `-Wundef' option.
+
+ If a test program needs to use or create a data file, give it a name
+that starts with `conftest', such as `conftest.data'. The `configure'
+script cleans up by running `rm -f -r conftest*' after running test
+programs and if the script is interrupted.
+
+
+File: autoconf.info, Node: Test Functions, Next: Generating Sources, Prev: Guidelines, Up: Writing Test Programs
+
+6.2.2 Test Functions
+--------------------
+
+These days it's safe to assume support for function prototypes
+(introduced in C89).
+
+ Functions that test programs declare should also be conditionalized
+for C++, which requires `extern "C"' prototypes. Make sure to not
+include any header files containing clashing prototypes.
+
+ #ifdef __cplusplus
+ extern "C"
+ #endif
+ void *valloc (size_t);
+
+ If a test program calls a function with invalid parameters (just to
+see whether it exists), organize the program to ensure that it never
+invokes that function. You can do this by calling it in another
+function that is never invoked. You can't do it by putting it after a
+call to `exit', because GCC version 2 knows that `exit' never returns
+and optimizes out any code that follows it in the same block.
+
+ If you include any header files, be sure to call the functions
+relevant to them with the correct number of arguments, even if they are
+just 0, to avoid compilation errors due to prototypes. GCC version 2
+has internal prototypes for several functions that it automatically
+inlines; for example, `memcpy'. To avoid errors when checking for
+them, either pass them the correct number of arguments or redeclare them
+with a different return type (such as `char').
+
+
+File: autoconf.info, Node: Generating Sources, Prev: Test Functions, Up: Writing Test Programs
+
+6.2.3 Generating Sources
+------------------------
+
+Autoconf provides a set of macros that can be used to generate test
+source files. They are written to be language generic, i.e., they
+actually depend on the current language (*note Language Choice::) to
+"format" the output properly.
+
+ -- Macro: AC_LANG_CONFTEST (SOURCE)
+ Save the SOURCE text in the current test source file:
+ `conftest.EXTENSION' where the EXTENSION depends on the current
+ language. As of Autoconf 2.63b, the source file also contains the
+ results of all of the `AC_DEFINE' performed so far.
+
+ Note that the SOURCE is evaluated exactly once, like regular
+ Autoconf macro arguments, and therefore (i) you may pass a macro
+ invocation, (ii) if not, be sure to double quote if needed.
+
+ This macro issues a warning during `autoconf' processing if SOURCE
+ does not include an expansion of the macro
+ `AC_LANG_DEFINES_PROVIDED' (note that both `AC_LANG_SOURCE' and
+ `AC_LANG_PROGRAM' call this macro, and thus avoid the warning).
+
+ This macro is seldom called directly, but is used under the hood
+ by more common macros such as `AC_COMPILE_IFELSE' and
+ `AC_RUN_IFELSE'.
+
+ -- Macro: AC_LANG_DEFINES_PROVIDED
+ This macro is called as a witness that the file
+ `conftest.EXTENSION' appropriate for the current language is
+ complete, including all previously determined results from
+ `AC_DEFINE'. This macro is seldom called directly, but exists if
+ you have a compelling reason to write a conftest file without using
+ `AC_LANG_SOURCE', yet still want to avoid a syntax warning from
+ `AC_LANG_CONFTEST'.
+
+ -- Macro: AC_LANG_SOURCE (SOURCE)
+ Expands into the SOURCE, with the definition of all the
+ `AC_DEFINE' performed so far. This macro includes an expansion of
+ `AC_LANG_DEFINES_PROVIDED'.
+
+ In many cases, you may find it more convenient to use the wrapper
+ `AC_LANG_PROGRAM'.
+
+ For instance, executing (observe the double quotation!):
+
+ AC_INIT([Hello], [1.0], [bug-hello@example.org], [],
+ [http://www.example.org/])
+ AC_DEFINE([HELLO_WORLD], ["Hello, World\n"],
+ [Greetings string.])
+ AC_LANG([C])
+ AC_LANG_CONFTEST(
+ [AC_LANG_SOURCE([[const char hw[] = "Hello, World\n";]])])
+ gcc -E -dD conftest.c
+
+on a system with `gcc' installed, results in:
+
+ ...
+ # 1 "conftest.c"
+
+ #define PACKAGE_NAME "Hello"
+ #define PACKAGE_TARNAME "hello"
+ #define PACKAGE_VERSION "1.0"
+ #define PACKAGE_STRING "Hello 1.0"
+ #define PACKAGE_BUGREPORT "bug-hello@example.org"
+ #define PACKAGE_URL "http://www.example.org/"
+ #define HELLO_WORLD "Hello, World\n"
+
+ const char hw[] = "Hello, World\n";
+
+ When the test language is Fortran, Erlang, or Go, the `AC_DEFINE'
+definitions are not automatically translated into constants in the
+source code by this macro.
+
+ -- Macro: AC_LANG_PROGRAM (PROLOGUE, BODY)
+ Expands into a source file which consists of the PROLOGUE, and
+ then BODY as body of the main function (e.g., `main' in C). Since
+ it uses `AC_LANG_SOURCE', the features of the latter are available.
+
+ For instance:
+
+ AC_INIT([Hello], [1.0], [bug-hello@example.org], [],
+ [http://www.example.org/])
+ AC_DEFINE([HELLO_WORLD], ["Hello, World\n"],
+ [Greetings string.])
+ AC_LANG_CONFTEST(
+ [AC_LANG_PROGRAM([[const char hw[] = "Hello, World\n";]],
+ [[fputs (hw, stdout);]])])
+ gcc -E -dD conftest.c
+
+on a system with `gcc' installed, results in:
+
+ ...
+ # 1 "conftest.c"
+
+ #define PACKAGE_NAME "Hello"
+ #define PACKAGE_TARNAME "hello"
+ #define PACKAGE_VERSION "1.0"
+ #define PACKAGE_STRING "Hello 1.0"
+ #define PACKAGE_BUGREPORT "bug-hello@example.org"
+ #define PACKAGE_URL "http://www.example.org/"
+ #define HELLO_WORLD "Hello, World\n"
+
+ const char hw[] = "Hello, World\n";
+ int
+ main ()
+ {
+ fputs (hw, stdout);
+ ;
+ return 0;
+ }
+
+ In Erlang tests, the created source file is that of an Erlang module
+called `conftest' (`conftest.erl'). This module defines and exports at
+least one `start/0' function, which is called to perform the test. The
+PROLOGUE is optional code that is inserted between the module header and
+the `start/0' function definition. BODY is the body of the `start/0'
+function without the final period (*note Runtime::, about constraints
+on this function's behavior).
+
+ For instance:
+
+ AC_INIT([Hello], [1.0], [bug-hello@example.org])
+ AC_LANG(Erlang)
+ AC_LANG_CONFTEST(
+ [AC_LANG_PROGRAM([[-define(HELLO_WORLD, "Hello, world!").]],
+ [[io:format("~s~n", [?HELLO_WORLD])]])])
+ cat conftest.erl
+
+results in:
+
+ -module(conftest).
+ -export([start/0]).
+ -define(HELLO_WORLD, "Hello, world!").
+ start() ->
+ io:format("~s~n", [?HELLO_WORLD])
+ .
+
+ -- Macro: AC_LANG_CALL (PROLOGUE, FUNCTION)
+ Expands into a source file which consists of the PROLOGUE, and
+ then a call to the FUNCTION as body of the main function (e.g.,
+ `main' in C). Since it uses `AC_LANG_PROGRAM', the feature of the
+ latter are available.
+
+ This function will probably be replaced in the future by a version
+ which would enable specifying the arguments. The use of this
+ macro is not encouraged, as it violates strongly the typing system.
+
+ This macro cannot be used for Erlang tests.
+
+ -- Macro: AC_LANG_FUNC_LINK_TRY (FUNCTION)
+ Expands into a source file which uses the FUNCTION in the body of
+ the main function (e.g., `main' in C). Since it uses
+ `AC_LANG_PROGRAM', the features of the latter are available.
+
+ As `AC_LANG_CALL', this macro is documented only for completeness.
+ It is considered to be severely broken, and in the future will be
+ removed in favor of actual function calls (with properly typed
+ arguments).
+
+ This macro cannot be used for Erlang tests.
+
+
+File: autoconf.info, Node: Running the Preprocessor, Next: Running the Compiler, Prev: Writing Test Programs, Up: Writing Tests
+
+6.3 Running the Preprocessor
+============================
+
+Sometimes one might need to run the preprocessor on some source file.
+_Usually it is a bad idea_, as you typically need to _compile_ your
+project, not merely run the preprocessor on it; therefore you certainly
+want to run the compiler, not the preprocessor. Resist the temptation
+of following the easiest path.
+
+ Nevertheless, if you need to run the preprocessor, then use
+`AC_PREPROC_IFELSE'.
+
+ The macros described in this section cannot be used for tests in
+Erlang, Fortran, or Go, since those languages require no preprocessor.
+
+ -- Macro: AC_PREPROC_IFELSE (INPUT, [ACTION-IF-TRUE],
+ [ACTION-IF-FALSE])
+ Run the preprocessor of the current language (*note Language
+ Choice::) on the INPUT, run the shell commands ACTION-IF-TRUE on
+ success, ACTION-IF-FALSE otherwise. The INPUT can be made by
+ `AC_LANG_PROGRAM' and friends.
+
+ This macro uses `CPPFLAGS', but not `CFLAGS', because `-g', `-O',
+ etc. are not valid options to many C preprocessors.
+
+ It is customary to report unexpected failures with
+ `AC_MSG_FAILURE'. If needed, ACTION-IF-TRUE can further access
+ the preprocessed output in the file `conftest.i'.
+
+ For instance:
+
+ AC_INIT([Hello], [1.0], [bug-hello@example.org])
+ AC_DEFINE([HELLO_WORLD], ["Hello, World\n"],
+ [Greetings string.])
+ AC_PREPROC_IFELSE(
+ [AC_LANG_PROGRAM([[const char hw[] = "Hello, World\n";]],
+ [[fputs (hw, stdout);]])],
+ [AC_MSG_RESULT([OK])],
+ [AC_MSG_FAILURE([unexpected preprocessor failure])])
+
+results in:
+
+ checking for gcc... gcc
+ checking for C compiler default output file name... a.out
+ checking whether the C compiler works... yes
+ checking whether we are cross compiling... no
+ checking for suffix of executables...
+ checking for suffix of object files... o
+ checking whether we are using the GNU C compiler... yes
+ checking whether gcc accepts -g... yes
+ checking for gcc option to accept ISO C89... none needed
+ checking how to run the C preprocessor... gcc -E
+ OK
+
+
+ The macro `AC_TRY_CPP' (*note Obsolete Macros::) used to play the
+role of `AC_PREPROC_IFELSE', but double quotes its argument, making it
+impossible to use it to elaborate sources. You are encouraged to get
+rid of your old use of the macro `AC_TRY_CPP' in favor of
+`AC_PREPROC_IFELSE', but, in the first place, are you sure you need to
+run the _preprocessor_ and not the compiler?
+
+ -- Macro: AC_EGREP_HEADER (PATTERN, HEADER-FILE, ACTION-IF-FOUND,
+ [ACTION-IF-NOT-FOUND])
+ If the output of running the preprocessor on the system header file
+ HEADER-FILE matches the extended regular expression PATTERN,
+ execute shell commands ACTION-IF-FOUND, otherwise execute
+ ACTION-IF-NOT-FOUND.
+
+ -- Macro: AC_EGREP_CPP (PATTERN, PROGRAM, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND])
+ PROGRAM is the text of a C or C++ program, on which shell
+ variable, back quote, and backslash substitutions are performed.
+ If the output of running the preprocessor on PROGRAM matches the
+ extended regular expression PATTERN, execute shell commands
+ ACTION-IF-FOUND, otherwise execute ACTION-IF-NOT-FOUND.
+
+
+File: autoconf.info, Node: Running the Compiler, Next: Running the Linker, Prev: Running the Preprocessor, Up: Writing Tests
+
+6.4 Running the Compiler
+========================
+
+To check for a syntax feature of the current language's (*note Language
+Choice::) compiler, such as whether it recognizes a certain keyword, or
+simply to try some library feature, use `AC_COMPILE_IFELSE' to try to
+compile a small program that uses that feature.
+
+ -- Macro: AC_COMPILE_IFELSE (INPUT, [ACTION-IF-TRUE],
+ [ACTION-IF-FALSE])
+ Run the compiler and compilation flags of the current language
+ (*note Language Choice::) on the INPUT, run the shell commands
+ ACTION-IF-TRUE on success, ACTION-IF-FALSE otherwise. The INPUT
+ can be made by `AC_LANG_PROGRAM' and friends.
+
+ It is customary to report unexpected failures with
+ `AC_MSG_FAILURE'. This macro does not try to link; use
+ `AC_LINK_IFELSE' if you need to do that (*note Running the
+ Linker::). If needed, ACTION-IF-TRUE can further access the
+ just-compiled object file `conftest.$OBJEXT'.
+
+ This macro uses `AC_REQUIRE' for the compiler associated with the
+ current language, which means that if the compiler has not yet been
+ determined, the compiler determination will be made prior to the
+ body of the outermost `AC_DEFUN' macro that triggered this macro to
+ expand (*note Expanded Before Required::).
+
+ For tests in Erlang, the INPUT must be the source code of a module
+named `conftest'. `AC_COMPILE_IFELSE' generates a `conftest.beam' file
+that can be interpreted by the Erlang virtual machine (`ERL'). It is
+recommended to use `AC_LANG_PROGRAM' to specify the test program, to
+ensure that the Erlang module has the right name.
+
+
+File: autoconf.info, Node: Running the Linker, Next: Runtime, Prev: Running the Compiler, Up: Writing Tests
+
+6.5 Running the Linker
+======================
+
+To check for a library, a function, or a global variable, Autoconf
+`configure' scripts try to compile and link a small program that uses
+it. This is unlike Metaconfig, which by default uses `nm' or `ar' on
+the C library to try to figure out which functions are available.
+Trying to link with the function is usually a more reliable approach
+because it avoids dealing with the variations in the options and output
+formats of `nm' and `ar' and in the location of the standard libraries.
+It also allows configuring for cross-compilation or checking a
+function's runtime behavior if needed. On the other hand, it can be
+slower than scanning the libraries once, but accuracy is more important
+than speed.
+
+ `AC_LINK_IFELSE' is used to compile test programs to test for
+functions and global variables. It is also used by `AC_CHECK_LIB' to
+check for libraries (*note Libraries::), by adding the library being
+checked for to `LIBS' temporarily and trying to link a small program.
+
+ -- Macro: AC_LINK_IFELSE (INPUT, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
+ Run the compiler (and compilation flags) and the linker of the
+ current language (*note Language Choice::) on the INPUT, run the
+ shell commands ACTION-IF-TRUE on success, ACTION-IF-FALSE
+ otherwise. The INPUT can be made by `AC_LANG_PROGRAM' and
+ friends. If needed, ACTION-IF-TRUE can further access the
+ just-linked program file `conftest$EXEEXT'.
+
+ `LDFLAGS' and `LIBS' are used for linking, in addition to the
+ current compilation flags.
+
+ It is customary to report unexpected failures with
+ `AC_MSG_FAILURE'. This macro does not try to execute the program;
+ use `AC_RUN_IFELSE' if you need to do that (*note Runtime::).
+
+ The `AC_LINK_IFELSE' macro cannot be used for Erlang tests, since
+Erlang programs are interpreted and do not require linking.
+
+
+File: autoconf.info, Node: Runtime, Next: Systemology, Prev: Running the Linker, Up: Writing Tests
+
+6.6 Checking Runtime Behavior
+=============================
+
+Sometimes you need to find out how a system performs at runtime, such
+as whether a given function has a certain capability or bug. If you
+can, make such checks when your program runs instead of when it is
+configured. You can check for things like the machine's endianness when
+your program initializes itself.
+
+ If you really need to test for a runtime behavior while configuring,
+you can write a test program to determine the result, and compile and
+run it using `AC_RUN_IFELSE'. Avoid running test programs if possible,
+because this prevents people from configuring your package for
+cross-compiling.
+
+ -- Macro: AC_RUN_IFELSE (INPUT, [ACTION-IF-TRUE], [ACTION-IF-FALSE],
+ [ACTION-IF-CROSS-COMPILING = `AC_MSG_FAILURE'])
+ Run the compiler (and compilation flags) and the linker of the
+ current language (*note Language Choice::) on the INPUT, then
+ execute the resulting program. If the program returns an exit
+ status of 0 when executed, run shell commands ACTION-IF-TRUE.
+ Otherwise, run shell commands ACTION-IF-FALSE.
+
+ The INPUT can be made by `AC_LANG_PROGRAM' and friends. `LDFLAGS'
+ and `LIBS' are used for linking, in addition to the compilation
+ flags of the current language (*note Language Choice::).
+ Additionally, ACTION-IF-TRUE can run `./conftest$EXEEXT' for
+ further testing.
+
+ In the ACTION-IF-FALSE section, the failing exit status is
+ available in the shell variable `$?'. This exit status might be
+ that of a failed compilation, or it might be that of a failed
+ program execution.
+
+ If cross-compilation mode is enabled (this is the case if either
+ the compiler being used does not produce executables that run on
+ the system where `configure' is being run, or if the options
+ `--build' and `--host' were both specified and their values are
+ different), then the test program is not run. If the optional
+ shell commands ACTION-IF-CROSS-COMPILING are given, those commands
+ are run instead; typically these commands provide pessimistic
+ defaults that allow cross-compilation to work even if the guess
+ was wrong. If the fourth argument is empty or omitted, but
+ cross-compilation is detected, then `configure' prints an error
+ message and exits. If you want your package to be useful in a
+ cross-compilation scenario, you _should_ provide a non-empty
+ ACTION-IF-CROSS-COMPILING clause, as well as wrap the
+ `AC_RUN_IFELSE' compilation inside an `AC_CACHE_CHECK' (*note
+ Caching Results::) which allows the user to override the
+ pessimistic default if needed.
+
+ It is customary to report unexpected failures with
+ `AC_MSG_FAILURE'.
+
+ `autoconf' prints a warning message when creating `configure' each
+time it encounters a call to `AC_RUN_IFELSE' with no
+ACTION-IF-CROSS-COMPILING argument given. If you are not concerned
+about users configuring your package for cross-compilation, you may
+ignore the warning. A few of the macros distributed with Autoconf
+produce this warning message; but if this is a problem for you, please
+report it as a bug, along with an appropriate pessimistic guess to use
+instead.
+
+ To configure for cross-compiling you can also choose a value for
+those parameters based on the canonical system name (*note Manual
+Configuration::). Alternatively, set up a test results cache file with
+the correct values for the host system (*note Caching Results::).
+
+ To provide a default for calls of `AC_RUN_IFELSE' that are embedded
+in other macros, including a few of the ones that come with Autoconf,
+you can test whether the shell variable `cross_compiling' is set to
+`yes', and then use an alternate method to get the results instead of
+calling the macros.
+
+ It is also permissible to temporarily assign to `cross_compiling' in
+order to force tests to behave as though they are in a
+cross-compilation environment, particularly since this provides a way to
+test your ACTION-IF-CROSS-COMPILING even when you are not using a
+cross-compiler.
+
+ # We temporarily set cross-compile mode to force AC_COMPUTE_INT
+ # to use the slow link-only method
+ save_cross_compiling=$cross_compiling
+ cross_compiling=yes
+ AC_COMPUTE_INT([...])
+ cross_compiling=$save_cross_compiling
+
+ A C or C++ runtime test should be portable. *Note Portable C and
+C++::.
+
+ Erlang tests must exit themselves the Erlang VM by calling the
+`halt/1' function: the given status code is used to determine the
+success of the test (status is `0') or its failure (status is different
+than `0'), as explained above. It must be noted that data output
+through the standard output (e.g., using `io:format/2') may be
+truncated when halting the VM. Therefore, if a test must output
+configuration information, it is recommended to create and to output
+data into the temporary file named `conftest.out', using the functions
+of module `file'. The `conftest.out' file is automatically deleted by
+the `AC_RUN_IFELSE' macro. For instance, a simplified implementation
+of Autoconf's `AC_ERLANG_SUBST_LIB_DIR' macro is:
+
+ AC_INIT([LibdirTest], [1.0], [bug-libdirtest@example.org])
+ AC_ERLANG_NEED_ERL
+ AC_LANG(Erlang)
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([], [dnl
+ file:write_file("conftest.out", code:lib_dir()),
+ halt(0)])],
+ [echo "code:lib_dir() returned: `cat conftest.out`"],
+ [AC_MSG_FAILURE([test Erlang program execution failed])])
+
+
+File: autoconf.info, Node: Systemology, Next: Multiple Cases, Prev: Runtime, Up: Writing Tests
+
+6.7 Systemology
+===============
+
+This section aims at presenting some systems and pointers to
+documentation. It may help you addressing particular problems reported
+by users.
+
+ Posix-conforming systems (http://www.opengroup.org/susv3) are
+derived from the Unix operating system
+(http://www.bell-labs.com/history/unix/).
+
+ The Rosetta Stone for Unix (http://bhami.com/rosetta.html) contains
+a table correlating the features of various Posix-conforming systems.
+Unix History (http://www.levenez.com/unix/) is a simplified diagram of
+how many Unix systems were derived from each other.
+
+ The Heirloom Project (http://heirloom.sourceforge.net/) provides
+some variants of traditional implementations of Unix utilities.
+
+Darwin
+ Darwin is also known as Mac OS X. Beware that the file system
+ _can_ be case-preserving, but case insensitive. This can cause
+ nasty problems, since for instance the installation attempt for a
+ package having an `INSTALL' file can result in `make install'
+ report that nothing was to be done!
+
+ That's all dependent on whether the file system is a UFS (case
+ sensitive) or HFS+ (case preserving). By default Apple wants you
+ to install the OS on HFS+. Unfortunately, there are some pieces of
+ software which really need to be built on UFS. We may want to
+ rebuild Darwin to have both UFS and HFS+ available (and put the
+ /local/build tree on the UFS).
+
+QNX 4.25
+ QNX is a realtime operating system running on Intel architecture
+ meant to be scalable from the small embedded systems to the hundred
+ processor super-computer. It claims to be Posix certified. More
+ information is available on the QNX home page
+ (http://www.qnx.com/).
+
+Tru64
+ Documentation of several versions of Tru64
+ (http://h30097.www3.hp.com/docs/) is available in different
+ formats.
+
+Unix version 7
+ Officially this was called the "Seventh Edition" of "the UNIX
+ time-sharing system" but we use the more-common name "Unix version
+ 7". Documentation is available in the Unix Seventh Edition Manual
+ (http://plan9.bell-labs.com/7thEdMan/). Previous versions of Unix
+ are called "Unix version 6", etc., but they were not as widely
+ used.
+
+
+File: autoconf.info, Node: Multiple Cases, Prev: Systemology, Up: Writing Tests
+
+6.8 Multiple Cases
+==================
+
+Some operations are accomplished in several possible ways, depending on
+the OS variant. Checking for them essentially requires a "case
+statement". Autoconf does not directly provide one; however, it is
+easy to simulate by using a shell variable to keep track of whether a
+way to perform the operation has been found yet.
+
+ Here is an example that uses the shell variable `fstype' to keep
+track of whether the remaining cases need to be checked. Note that
+since the value of `fstype' is under our control, we don't have to use
+the longer `test "x$fstype" = xno'.
+
+ AC_MSG_CHECKING([how to get file system type])
+ fstype=no
+ # The order of these tests is important.
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statvfs.h>
+ #include <sys/fstyp.h>]])],
+ [AC_DEFINE([FSTYPE_STATVFS], [1],
+ [Define if statvfs exists.])
+ fstype=SVR4])
+ if test $fstype = no; then
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statfs.h>
+ #include <sys/fstyp.h>]])],
+ [AC_DEFINE([FSTYPE_USG_STATFS], [1],
+ [Define if USG statfs.])
+ fstype=SVR3])
+ fi
+ if test $fstype = no; then
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statfs.h>
+ #include <sys/vmount.h>]])]),
+ [AC_DEFINE([FSTYPE_AIX_STATFS], [1],
+ [Define if AIX statfs.])
+ fstype=AIX])
+ fi
+ # (more cases omitted here)
+ AC_MSG_RESULT([$fstype])
+
+
+File: autoconf.info, Node: Results, Next: Programming in M4, Prev: Writing Tests, Up: Top
+
+7 Results of Tests
+******************
+
+Once `configure' has determined whether a feature exists, what can it
+do to record that information? There are four sorts of things it can
+do: define a C preprocessor symbol, set a variable in the output files,
+save the result in a cache file for future `configure' runs, and print
+a message letting the user know the result of the test.
+
+* Menu:
+
+* Defining Symbols:: Defining C preprocessor symbols
+* Setting Output Variables:: Replacing variables in output files
+* Special Chars in Variables:: Characters to beware of in variables
+* Caching Results:: Speeding up subsequent `configure' runs
+* Printing Messages:: Notifying `configure' users
+
+
+File: autoconf.info, Node: Defining Symbols, Next: Setting Output Variables, Up: Results
+
+7.1 Defining C Preprocessor Symbols
+===================================
+
+A common action to take in response to a feature test is to define a C
+preprocessor symbol indicating the results of the test. That is done by
+calling `AC_DEFINE' or `AC_DEFINE_UNQUOTED'.
+
+ By default, `AC_OUTPUT' places the symbols defined by these macros
+into the output variable `DEFS', which contains an option
+`-DSYMBOL=VALUE' for each symbol defined. Unlike in Autoconf version
+1, there is no variable `DEFS' defined while `configure' is running.
+To check whether Autoconf macros have already defined a certain C
+preprocessor symbol, test the value of the appropriate cache variable,
+as in this example:
+
+ AC_CHECK_FUNC([vprintf], [AC_DEFINE([HAVE_VPRINTF], [1],
+ [Define if vprintf exists.])])
+ if test "x$ac_cv_func_vprintf" != xyes; then
+ AC_CHECK_FUNC([_doprnt], [AC_DEFINE([HAVE_DOPRNT], [1],
+ [Define if _doprnt exists.])])
+ fi
+
+ If `AC_CONFIG_HEADERS' has been called, then instead of creating
+`DEFS', `AC_OUTPUT' creates a header file by substituting the correct
+values into `#define' statements in a template file. *Note
+Configuration Headers::, for more information about this kind of output.
+
+ -- Macro: AC_DEFINE (VARIABLE, VALUE, [DESCRIPTION])
+ -- Macro: AC_DEFINE (VARIABLE)
+ Define VARIABLE to VALUE (verbatim), by defining a C preprocessor
+ macro for VARIABLE. VARIABLE should be a C identifier, optionally
+ suffixed by a parenthesized argument list to define a C
+ preprocessor macro with arguments. The macro argument list, if
+ present, should be a comma-separated list of C identifiers,
+ possibly terminated by an ellipsis `...' if C99 syntax is employed.
+ VARIABLE should not contain comments, white space, trigraphs,
+ backslash-newlines, universal character names, or non-ASCII
+ characters.
+
+ VALUE may contain backslash-escaped newlines, which will be
+ preserved if you use `AC_CONFIG_HEADERS' but flattened if passed
+ via `@DEFS@' (with no effect on the compilation, since the
+ preprocessor sees only one line in the first place). VALUE should
+ not contain raw newlines. If you are not using
+ `AC_CONFIG_HEADERS', VALUE should not contain any `#' characters,
+ as `make' tends to eat them. To use a shell variable, use
+ `AC_DEFINE_UNQUOTED' instead.
+
+ DESCRIPTION is only useful if you are using `AC_CONFIG_HEADERS'.
+ In this case, DESCRIPTION is put into the generated `config.h.in'
+ as the comment before the macro define. The following example
+ defines the C preprocessor variable `EQUATION' to be the string
+ constant `"$a > $b"':
+
+ AC_DEFINE([EQUATION], ["$a > $b"],
+ [Equation string.])
+
+ If neither VALUE nor DESCRIPTION are given, then VALUE defaults to
+ 1 instead of to the empty string. This is for backwards
+ compatibility with older versions of Autoconf, but this usage is
+ obsolescent and may be withdrawn in future versions of Autoconf.
+
+ If the VARIABLE is a literal string, it is passed to
+ `m4_pattern_allow' (*note Forbidden Patterns::).
+
+ If multiple `AC_DEFINE' statements are executed for the same
+ VARIABLE name (not counting any parenthesized argument list), the
+ last one wins.
+
+ -- Macro: AC_DEFINE_UNQUOTED (VARIABLE, VALUE, [DESCRIPTION])
+ -- Macro: AC_DEFINE_UNQUOTED (VARIABLE)
+ Like `AC_DEFINE', but three shell expansions are
+ performed--once--on VARIABLE and VALUE: variable expansion (`$'),
+ command substitution (``'), and backslash escaping (`\'), as if in
+ an unquoted here-document. Single and double quote characters in
+ the value have no special meaning. Use this macro instead of
+ `AC_DEFINE' when VARIABLE or VALUE is a shell variable. Examples:
+
+ AC_DEFINE_UNQUOTED([config_machfile], ["$machfile"],
+ [Configuration machine file.])
+ AC_DEFINE_UNQUOTED([GETGROUPS_T], [$ac_cv_type_getgroups],
+ [getgroups return type.])
+ AC_DEFINE_UNQUOTED([$ac_tr_hdr], [1],
+ [Translated header name.])
+
+ Due to a syntactical bizarreness of the Bourne shell, do not use
+semicolons to separate `AC_DEFINE' or `AC_DEFINE_UNQUOTED' calls from
+other macro calls or shell code; that can cause syntax errors in the
+resulting `configure' script. Use either blanks or newlines. That is,
+do this:
+
+ AC_CHECK_HEADER([elf.h],
+ [AC_DEFINE([SVR4], [1], [System V Release 4]) LIBS="-lelf $LIBS"])
+
+or this:
+
+ AC_CHECK_HEADER([elf.h],
+ [AC_DEFINE([SVR4], [1], [System V Release 4])
+ LIBS="-lelf $LIBS"])
+
+instead of this:
+
+ AC_CHECK_HEADER([elf.h],
+ [AC_DEFINE([SVR4], [1], [System V Release 4]); LIBS="-lelf $LIBS"])
+
+
+File: autoconf.info, Node: Setting Output Variables, Next: Special Chars in Variables, Prev: Defining Symbols, Up: Results
+
+7.2 Setting Output Variables
+============================
+
+Another way to record the results of tests is to set "output
+variables", which are shell variables whose values are substituted into
+files that `configure' outputs. The two macros below create new output
+variables. *Note Preset Output Variables::, for a list of output
+variables that are always available.
+
+ -- Macro: AC_SUBST (VARIABLE, [VALUE])
+ Create an output variable from a shell variable. Make `AC_OUTPUT'
+ substitute the variable VARIABLE into output files (typically one
+ or more makefiles). This means that `AC_OUTPUT' replaces
+ instances of `@VARIABLE@' in input files with the value that the
+ shell variable VARIABLE has when `AC_OUTPUT' is called. The value
+ can contain any non-`NUL' character, including newline. If you
+ are using Automake 1.11 or newer, for newlines in values you might
+ want to consider using `AM_SUBST_NOTMAKE' to prevent `automake'
+ from adding a line `VARIABLE = @VARIABLE@' to the `Makefile.in'
+ files (*note Automake: (automake)Optional.).
+
+ Variable occurrences should not overlap: e.g., an input file should
+ not contain `@VAR1@VAR2@' if VAR1 and VAR2 are variable names.
+ The substituted value is not rescanned for more output variables;
+ occurrences of `@VARIABLE@' in the value are inserted literally
+ into the output file. (The algorithm uses the special marker
+ `|#_!!_#|' internally, so neither the substituted value nor the
+ output file may contain `|#_!!_#|'.)
+
+ If VALUE is given, in addition assign it to VARIABLE.
+
+ The string VARIABLE is passed to `m4_pattern_allow' (*note
+ Forbidden Patterns::).
+
+ -- Macro: AC_SUBST_FILE (VARIABLE)
+ Another way to create an output variable from a shell variable.
+ Make `AC_OUTPUT' insert (without substitutions) the contents of
+ the file named by shell variable VARIABLE into output files. This
+ means that `AC_OUTPUT' replaces instances of `@VARIABLE@' in
+ output files (such as `Makefile.in') with the contents of the file
+ that the shell variable VARIABLE names when `AC_OUTPUT' is called.
+ Set the variable to `/dev/null' for cases that do not have a file
+ to insert. This substitution occurs only when the `@VARIABLE@' is
+ on a line by itself, optionally surrounded by spaces and tabs. The
+ substitution replaces the whole line, including the spaces, tabs,
+ and the terminating newline.
+
+ This macro is useful for inserting makefile fragments containing
+ special dependencies or other `make' directives for particular host
+ or target types into makefiles. For example, `configure.ac' could
+ contain:
+
+ AC_SUBST_FILE([host_frag])
+ host_frag=$srcdir/conf/sun4.mh
+
+ and then a `Makefile.in' could contain:
+
+ @host_frag@
+
+ The string VARIABLE is passed to `m4_pattern_allow' (*note
+ Forbidden Patterns::).
+
+ Running `configure' in varying environments can be extremely
+dangerous. If for instance the user runs `CC=bizarre-cc ./configure',
+then the cache, `config.h', and many other output files depend upon
+`bizarre-cc' being the C compiler. If for some reason the user runs
+`./configure' again, or if it is run via `./config.status --recheck',
+(*Note Automatic Remaking::, and *note config.status Invocation::),
+then the configuration can be inconsistent, composed of results
+depending upon two different compilers.
+
+ Environment variables that affect this situation, such as `CC'
+above, are called "precious variables", and can be declared as such by
+`AC_ARG_VAR'.
+
+ -- Macro: AC_ARG_VAR (VARIABLE, DESCRIPTION)
+ Declare VARIABLE is a precious variable, and include its
+ DESCRIPTION in the variable section of `./configure --help'.
+
+ Being precious means that
+ - VARIABLE is substituted via `AC_SUBST'.
+
+ - The value of VARIABLE when `configure' was launched is saved
+ in the cache, including if it was not specified on the command
+ line but via the environment. Indeed, while `configure' can
+ notice the definition of `CC' in `./configure CC=bizarre-cc',
+ it is impossible to notice it in `CC=bizarre-cc ./configure',
+ which, unfortunately, is what most users do.
+
+ We emphasize that it is the _initial_ value of VARIABLE which
+ is saved, not that found during the execution of `configure'.
+ Indeed, specifying `./configure FOO=foo' and letting
+ `./configure' guess that `FOO' is `foo' can be two different
+ things.
+
+ - VARIABLE is checked for consistency between two `configure'
+ runs. For instance:
+
+ $ ./configure --silent --config-cache
+ $ CC=cc ./configure --silent --config-cache
+ configure: error: `CC' was not set in the previous run
+ configure: error: changes in the environment can compromise \
+ the build
+ configure: error: run `make distclean' and/or \
+ `rm config.cache' and start over
+
+ and similarly if the variable is unset, or if its content is
+ changed. If the content has white space changes only, then
+ the error is degraded to a warning only, but the old value is
+ reused.
+
+ - VARIABLE is kept during automatic reconfiguration (*note
+ config.status Invocation::) as if it had been passed as a
+ command line argument, including when no cache is used:
+
+ $ CC=/usr/bin/cc ./configure var=raboof --silent
+ $ ./config.status --recheck
+ running CONFIG_SHELL=/bin/sh /bin/sh ./configure var=raboof \
+ CC=/usr/bin/cc --no-create --no-recursion
+
+
+File: autoconf.info, Node: Special Chars in Variables, Next: Caching Results, Prev: Setting Output Variables, Up: Results
+
+7.3 Special Characters in Output Variables
+==========================================
+
+Many output variables are intended to be evaluated both by `make' and
+by the shell. Some characters are expanded differently in these two
+contexts, so to avoid confusion these variables' values should not
+contain any of the following characters:
+
+ " # $ & ' ( ) * ; < > ? [ \ ^ ` |
+
+ Also, these variables' values should neither contain newlines, nor
+start with `~', nor contain white space or `:' immediately followed by
+`~'. The values can contain nonempty sequences of white space
+characters like tabs and spaces, but each such sequence might
+arbitrarily be replaced by a single space during substitution.
+
+ These restrictions apply both to the values that `configure'
+computes, and to the values set directly by the user. For example, the
+following invocations of `configure' are problematic, since they
+attempt to use special characters within `CPPFLAGS' and white space
+within `$(srcdir)':
+
+ CPPFLAGS='-DOUCH="&\"#$*?"' '../My Source/ouch-1.0/configure'
+
+ '../My Source/ouch-1.0/configure' CPPFLAGS='-DOUCH="&\"#$*?"'
+
+
+File: autoconf.info, Node: Caching Results, Next: Printing Messages, Prev: Special Chars in Variables, Up: Results
+
+7.4 Caching Results
+===================
+
+To avoid checking for the same features repeatedly in various
+`configure' scripts (or in repeated runs of one script), `configure'
+can optionally save the results of many checks in a "cache file" (*note
+Cache Files::). If a `configure' script runs with caching enabled and
+finds a cache file, it reads the results of previous runs from the
+cache and avoids rerunning those checks. As a result, `configure' can
+then run much faster than if it had to perform all of the checks every
+time.
+
+ -- Macro: AC_CACHE_VAL (CACHE-ID, COMMANDS-TO-SET-IT)
+ Ensure that the results of the check identified by CACHE-ID are
+ available. If the results of the check were in the cache file
+ that was read, and `configure' was not given the `--quiet' or
+ `--silent' option, print a message saying that the result was
+ cached; otherwise, run the shell commands COMMANDS-TO-SET-IT. If
+ the shell commands are run to determine the value, the value is
+ saved in the cache file just before `configure' creates its output
+ files. *Note Cache Variable Names::, for how to choose the name
+ of the CACHE-ID variable.
+
+ The COMMANDS-TO-SET-IT _must have no side effects_ except for
+ setting the variable CACHE-ID, see below.
+
+ -- Macro: AC_CACHE_CHECK (MESSAGE, CACHE-ID, COMMANDS-TO-SET-IT)
+ A wrapper for `AC_CACHE_VAL' that takes care of printing the
+ messages. This macro provides a convenient shorthand for the most
+ common way to use these macros. It calls `AC_MSG_CHECKING' for
+ MESSAGE, then `AC_CACHE_VAL' with the CACHE-ID and COMMANDS
+ arguments, and `AC_MSG_RESULT' with CACHE-ID.
+
+ The COMMANDS-TO-SET-IT _must have no side effects_ except for
+ setting the variable CACHE-ID, see below.
+
+ It is common to find buggy macros using `AC_CACHE_VAL' or
+`AC_CACHE_CHECK', because people are tempted to call `AC_DEFINE' in the
+COMMANDS-TO-SET-IT. Instead, the code that _follows_ the call to
+`AC_CACHE_VAL' should call `AC_DEFINE', by examining the value of the
+cache variable. For instance, the following macro is broken:
+
+ AC_DEFUN([AC_SHELL_TRUE],
+ [AC_CACHE_CHECK([whether true(1) works], [my_cv_shell_true_works],
+ [my_cv_shell_true_works=no
+ (true) 2>/dev/null && my_cv_shell_true_works=yes
+ if test "x$my_cv_shell_true_works" = xyes; then
+ AC_DEFINE([TRUE_WORKS], [1],
+ [Define if `true(1)' works properly.])
+ fi])
+ ])
+
+This fails if the cache is enabled: the second time this macro is run,
+`TRUE_WORKS' _will not be defined_. The proper implementation is:
+
+ AC_DEFUN([AC_SHELL_TRUE],
+ [AC_CACHE_CHECK([whether true(1) works], [my_cv_shell_true_works],
+ [my_cv_shell_true_works=no
+ (true) 2>/dev/null && my_cv_shell_true_works=yes])
+ if test "x$my_cv_shell_true_works" = xyes; then
+ AC_DEFINE([TRUE_WORKS], [1],
+ [Define if `true(1)' works properly.])
+ fi
+ ])
+
+ Also, COMMANDS-TO-SET-IT should not print any messages, for example
+with `AC_MSG_CHECKING'; do that before calling `AC_CACHE_VAL', so the
+messages are printed regardless of whether the results of the check are
+retrieved from the cache or determined by running the shell commands.
+
+* Menu:
+
+* Cache Variable Names:: Shell variables used in caches
+* Cache Files:: Files `configure' uses for caching
+* Cache Checkpointing:: Loading and saving the cache file
+
+
+File: autoconf.info, Node: Cache Variable Names, Next: Cache Files, Up: Caching Results
+
+7.4.1 Cache Variable Names
+--------------------------
+
+The names of cache variables should have the following format:
+
+ PACKAGE-PREFIX_cv_VALUE-TYPE_SPECIFIC-VALUE_[ADDITIONAL-OPTIONS]
+
+for example, `ac_cv_header_stat_broken' or
+`ac_cv_prog_gcc_traditional'. The parts of the variable name are:
+
+PACKAGE-PREFIX
+ An abbreviation for your package or organization; the same prefix
+ you begin local Autoconf macros with, except lowercase by
+ convention. For cache values used by the distributed Autoconf
+ macros, this value is `ac'.
+
+`_cv_'
+ Indicates that this shell variable is a cache value. This string
+ _must_ be present in the variable name, including the leading
+ underscore.
+
+VALUE-TYPE
+ A convention for classifying cache values, to produce a rational
+ naming system. The values used in Autoconf are listed in *note
+ Macro Names::.
+
+SPECIFIC-VALUE
+ Which member of the class of cache values this test applies to.
+ For example, which function (`alloca'), program (`gcc'), or output
+ variable (`INSTALL').
+
+ADDITIONAL-OPTIONS
+ Any particular behavior of the specific member that this test
+ applies to. For example, `broken' or `set'. This part of the
+ name may be omitted if it does not apply.
+
+ The values assigned to cache variables may not contain newlines.
+Usually, their values are Boolean (`yes' or `no') or the names of files
+or functions; so this is not an important restriction. *note Cache
+Variable Index:: for an index of cache variables with documented
+semantics.
+
+
+File: autoconf.info, Node: Cache Files, Next: Cache Checkpointing, Prev: Cache Variable Names, Up: Caching Results
+
+7.4.2 Cache Files
+-----------------
+
+A cache file is a shell script that caches the results of configure
+tests run on one system so they can be shared between configure scripts
+and configure runs. It is not useful on other systems. If its contents
+are invalid for some reason, the user may delete or edit it, or override
+documented cache variables on the `configure' command line.
+
+ By default, `configure' uses no cache file, to avoid problems caused
+by accidental use of stale cache files.
+
+ To enable caching, `configure' accepts `--config-cache' (or `-C') to
+cache results in the file `config.cache'. Alternatively,
+`--cache-file=FILE' specifies that FILE be the cache file. The cache
+file is created if it does not exist already. When `configure' calls
+`configure' scripts in subdirectories, it uses the `--cache-file'
+argument so that they share the same cache. *Note Subdirectories::,
+for information on configuring subdirectories with the
+`AC_CONFIG_SUBDIRS' macro.
+
+ `config.status' only pays attention to the cache file if it is given
+the `--recheck' option, which makes it rerun `configure'.
+
+ It is wrong to try to distribute cache files for particular system
+types. There is too much room for error in doing that, and too much
+administrative overhead in maintaining them. For any features that
+can't be guessed automatically, use the standard method of the canonical
+system type and linking files (*note Manual Configuration::).
+
+ The site initialization script can specify a site-wide cache file to
+use, instead of the usual per-program cache. In this case, the cache
+file gradually accumulates information whenever someone runs a new
+`configure' script. (Running `configure' merges the new cache results
+with the existing cache file.) This may cause problems, however, if
+the system configuration (e.g., the installed libraries or compilers)
+changes and the stale cache file is not deleted.
+
+ If `configure' is interrupted at the right time when it updates a
+cache file outside of the build directory where the `configure' script
+is run, it may leave behind a temporary file named after the cache file
+with digits following it. You may safely delete such a file.
+
+
+File: autoconf.info, Node: Cache Checkpointing, Prev: Cache Files, Up: Caching Results
+
+7.4.3 Cache Checkpointing
+-------------------------
+
+If your configure script, or a macro called from `configure.ac', happens
+to abort the configure process, it may be useful to checkpoint the cache
+a few times at key points using `AC_CACHE_SAVE'. Doing so reduces the
+amount of time it takes to rerun the configure script with (hopefully)
+the error that caused the previous abort corrected.
+
+ -- Macro: AC_CACHE_LOAD
+ Loads values from existing cache file, or creates a new cache file
+ if a cache file is not found. Called automatically from `AC_INIT'.
+
+ -- Macro: AC_CACHE_SAVE
+ Flushes all cached values to the cache file. Called automatically
+ from `AC_OUTPUT', but it can be quite useful to call
+ `AC_CACHE_SAVE' at key points in `configure.ac'.
+
+ For instance:
+
+ ... AC_INIT, etc. ...
+ # Checks for programs.
+ AC_PROG_CC
+ AC_PROG_AWK
+ ... more program checks ...
+ AC_CACHE_SAVE
+
+ # Checks for libraries.
+ AC_CHECK_LIB([nsl], [gethostbyname])
+ AC_CHECK_LIB([socket], [connect])
+ ... more lib checks ...
+ AC_CACHE_SAVE
+
+ # Might abort...
+ AM_PATH_GTK([1.0.2], [], [AC_MSG_ERROR([GTK not in path])])
+ AM_PATH_GTKMM([0.9.5], [], [AC_MSG_ERROR([GTK not in path])])
+ ... AC_OUTPUT, etc. ...
+
+
+File: autoconf.info, Node: Printing Messages, Prev: Caching Results, Up: Results
+
+7.5 Printing Messages
+=====================
+
+`configure' scripts need to give users running them several kinds of
+information. The following macros print messages in ways appropriate
+for each kind. The arguments to all of them get enclosed in shell
+double quotes, so the shell performs variable and back-quote
+substitution on them.
+
+ These macros are all wrappers around the `echo' shell command. They
+direct output to the appropriate file descriptor (*note File Descriptor
+Macros::). `configure' scripts should rarely need to run `echo'
+directly to print messages for the user. Using these macros makes it
+easy to change how and when each kind of message is printed; such
+changes need only be made to the macro definitions and all the callers
+change automatically.
+
+ To diagnose static issues, i.e., when `autoconf' is run, see *note
+Diagnostic Macros::.
+
+ -- Macro: AC_MSG_CHECKING (FEATURE-DESCRIPTION)
+ Notify the user that `configure' is checking for a particular
+ feature. This macro prints a message that starts with `checking '
+ and ends with `...' and no newline. It must be followed by a call
+ to `AC_MSG_RESULT' to print the result of the check and the
+ newline. The FEATURE-DESCRIPTION should be something like
+ `whether the Fortran compiler accepts C++ comments' or `for c89'.
+
+ This macro prints nothing if `configure' is run with the `--quiet'
+ or `--silent' option.
+
+ -- Macro: AC_MSG_RESULT (RESULT-DESCRIPTION)
+ Notify the user of the results of a check. RESULT-DESCRIPTION is
+ almost always the value of the cache variable for the check,
+ typically `yes', `no', or a file name. This macro should follow a
+ call to `AC_MSG_CHECKING', and the RESULT-DESCRIPTION should be
+ the completion of the message printed by the call to
+ `AC_MSG_CHECKING'.
+
+ This macro prints nothing if `configure' is run with the `--quiet'
+ or `--silent' option.
+
+ -- Macro: AC_MSG_NOTICE (MESSAGE)
+ Deliver the MESSAGE to the user. It is useful mainly to print a
+ general description of the overall purpose of a group of feature
+ checks, e.g.,
+
+ AC_MSG_NOTICE([checking if stack overflow is detectable])
+
+ This macro prints nothing if `configure' is run with the `--quiet'
+ or `--silent' option.
+
+ -- Macro: AC_MSG_ERROR (ERROR-DESCRIPTION, [EXIT-STATUS = `$?/1'])
+ Notify the user of an error that prevents `configure' from
+ completing. This macro prints an error message to the standard
+ error output and exits `configure' with EXIT-STATUS (`$?' by
+ default, except that `0' is converted to `1'). ERROR-DESCRIPTION
+ should be something like `invalid value $HOME for \$HOME'.
+
+ The ERROR-DESCRIPTION should start with a lower-case letter, and
+ "cannot" is preferred to "can't".
+
+ -- Macro: AC_MSG_FAILURE (ERROR-DESCRIPTION, [EXIT-STATUS])
+ This `AC_MSG_ERROR' wrapper notifies the user of an error that
+ prevents `configure' from completing _and_ that additional details
+ are provided in `config.log'. This is typically used when
+ abnormal results are found during a compilation.
+
+ -- Macro: AC_MSG_WARN (PROBLEM-DESCRIPTION)
+ Notify the `configure' user of a possible problem. This macro
+ prints the message to the standard error output; `configure'
+ continues running afterward, so macros that call `AC_MSG_WARN'
+ should provide a default (back-up) behavior for the situations
+ they warn about. PROBLEM-DESCRIPTION should be something like `ln
+ -s seems to make hard links'.
+
+
+File: autoconf.info, Node: Programming in M4, Next: Programming in M4sh, Prev: Results, Up: Top
+
+8 Programming in M4
+*******************
+
+Autoconf is written on top of two layers: "M4sugar", which provides
+convenient macros for pure M4 programming, and "M4sh", which provides
+macros dedicated to shell script generation.
+
+ As of this version of Autoconf, these two layers still contain
+experimental macros, whose interface might change in the future. As a
+matter of fact, _anything that is not documented must not be used_.
+
+* Menu:
+
+* M4 Quotation:: Protecting macros from unwanted expansion
+* Using autom4te:: The Autoconf executables backbone
+* Programming in M4sugar:: Convenient pure M4 macros
+* Debugging via autom4te:: Figuring out what M4 was doing
+
+
+File: autoconf.info, Node: M4 Quotation, Next: Using autom4te, Up: Programming in M4
+
+8.1 M4 Quotation
+================
+
+The most common problem with existing macros is an improper quotation.
+This section, which users of Autoconf can skip, but which macro writers
+_must_ read, first justifies the quotation scheme that was chosen for
+Autoconf and then ends with a rule of thumb. Understanding the former
+helps one to follow the latter.
+
+* Menu:
+
+* Active Characters:: Characters that change the behavior of M4
+* One Macro Call:: Quotation and one macro call
+* Quoting and Parameters:: M4 vs. shell parameters
+* Quotation and Nested Macros:: Macros calling macros
+* Changequote is Evil:: Worse than INTERCAL: M4 + changequote
+* Quadrigraphs:: Another way to escape special characters
+* Balancing Parentheses:: Dealing with unbalanced parentheses
+* Quotation Rule Of Thumb:: One parenthesis, one quote
+
+
+File: autoconf.info, Node: Active Characters, Next: One Macro Call, Up: M4 Quotation
+
+8.1.1 Active Characters
+-----------------------
+
+To fully understand where proper quotation is important, you first need
+to know what the special characters are in Autoconf: `#' introduces a
+comment inside which no macro expansion is performed, `,' separates
+arguments, `[' and `]' are the quotes themselves(1), `(' and `)' (which
+M4 tries to match by pairs), and finally `$' inside a macro definition.
+
+ In order to understand the delicate case of macro calls, we first
+have to present some obvious failures. Below they are "obvious-ified",
+but when you find them in real life, they are usually in disguise.
+
+ Comments, introduced by a hash and running up to the newline, are
+opaque tokens to the top level: active characters are turned off, and
+there is no macro expansion:
+
+ # define([def], ine)
+ =># define([def], ine)
+
+ Each time there can be a macro expansion, there is a quotation
+expansion, i.e., one level of quotes is stripped:
+
+ int tab[10];
+ =>int tab10;
+ [int tab[10];]
+ =>int tab[10];
+
+ Without this in mind, the reader might try hopelessly to use her
+macro `array':
+
+ define([array], [int tab[10];])
+ array
+ =>int tab10;
+ [array]
+ =>array
+
+How can you correctly output the intended results(2)?
+
+ ---------- Footnotes ----------
+
+ (1) By itself, M4 uses ``' and `''; it is the M4sugar layer that
+sets up the preferred quotes of `[' and `]'.
+
+ (2) Using `defn'.
+
+
+File: autoconf.info, Node: One Macro Call, Next: Quoting and Parameters, Prev: Active Characters, Up: M4 Quotation
+
+8.1.2 One Macro Call
+--------------------
+
+Let's proceed on the interaction between active characters and macros
+with this small macro, which just returns its first argument:
+
+ define([car], [$1])
+
+The two pairs of quotes above are not part of the arguments of
+`define'; rather, they are understood by the top level when it tries to
+find the arguments of `define'. Therefore, assuming `car' is not
+already defined, it is equivalent to write:
+
+ define(car, $1)
+
+But, while it is acceptable for a `configure.ac' to avoid unnecessary
+quotes, it is bad practice for Autoconf macros which must both be more
+robust and also advocate perfect style.
+
+ At the top level, there are only two possibilities: either you quote
+or you don't:
+
+ car(foo, bar, baz)
+ =>foo
+ [car(foo, bar, baz)]
+ =>car(foo, bar, baz)
+
+ Let's pay attention to the special characters:
+
+ car(#)
+ error-->EOF in argument list
+
+ The closing parenthesis is hidden in the comment; with a hypothetical
+quoting, the top level understood it this way:
+
+ car([#)]
+
+Proper quotation, of course, fixes the problem:
+
+ car([#])
+ =>#
+
+ Here are more examples:
+
+ car(foo, bar)
+ =>foo
+ car([foo, bar])
+ =>foo, bar
+ car((foo, bar))
+ =>(foo, bar)
+ car([(foo], [bar)])
+ =>(foo
+ define([a], [b])
+ =>
+ car(a)
+ =>b
+ car([a])
+ =>b
+ car([[a]])
+ =>a
+ car([[[a]]])
+ =>[a]
+
+
+File: autoconf.info, Node: Quoting and Parameters, Next: Quotation and Nested Macros, Prev: One Macro Call, Up: M4 Quotation
+
+8.1.3 Quoting and Parameters
+----------------------------
+
+When M4 encounters `$' within a macro definition, followed immediately
+by a character it recognizes (`0'...`9', `#', `@', or `*'), it will
+perform M4 parameter expansion. This happens regardless of how many
+layers of quotes the parameter expansion is nested within, or even if
+it occurs in text that will be rescanned as a comment.
+
+ define([none], [$1])
+ =>
+ define([one], [[$1]])
+ =>
+ define([two], [[[$1]]])
+ =>
+ define([comment], [# $1])
+ =>
+ define([active], [ACTIVE])
+ =>
+ none([active])
+ =>ACTIVE
+ one([active])
+ =>active
+ two([active])
+ =>[active]
+ comment([active])
+ =># active
+
+ On the other hand, since autoconf generates shell code, you often
+want to output shell variable expansion, rather than performing M4
+parameter expansion. To do this, you must use M4 quoting to separate
+the `$' from the next character in the definition of your macro. If
+the macro definition occurs in single-quoted text, then insert another
+level of quoting; if the usage is already inside a double-quoted
+string, then split it into concatenated strings.
+
+ define([single], [a single-quoted $[]1 definition])
+ =>
+ define([double], [[a double-quoted $][1 definition]])
+ =>
+ single
+ =>a single-quoted $1 definition
+ double
+ =>a double-quoted $1 definition
+
+ Posix states that M4 implementations are free to provide
+implementation extensions when `${' is encountered in a macro
+definition. Autoconf reserves the longer sequence `${{' for use with
+planned extensions that will be available in the future GNU M4 2.0, but
+guarantees that all other instances of `${' will be output literally.
+Therefore, this idiom can also be used to output shell code parameter
+references:
+
+ define([first], [${1}])first
+ =>${1}
+
+ Posix also states that `$11' should expand to the first parameter
+concatenated with a literal `1', although some versions of GNU M4
+expand the eleventh parameter instead. For portability, you should
+only use single-digit M4 parameter expansion.
+
+ With this in mind, we can explore the cases where macros invoke
+macros...
+
+
+File: autoconf.info, Node: Quotation and Nested Macros, Next: Changequote is Evil, Prev: Quoting and Parameters, Up: M4 Quotation
+
+8.1.4 Quotation and Nested Macros
+---------------------------------
+
+The examples below use the following macros:
+
+ define([car], [$1])
+ define([active], [ACT, IVE])
+ define([array], [int tab[10]])
+
+ Each additional embedded macro call introduces other possible
+interesting quotations:
+
+ car(active)
+ =>ACT
+ car([active])
+ =>ACT, IVE
+ car([[active]])
+ =>active
+
+ In the first case, the top level looks for the arguments of `car',
+and finds `active'. Because M4 evaluates its arguments before applying
+the macro, `active' is expanded, which results in:
+
+ car(ACT, IVE)
+ =>ACT
+
+In the second case, the top level gives `active' as first and only
+argument of `car', which results in:
+
+ active
+ =>ACT, IVE
+
+i.e., the argument is evaluated _after_ the macro that invokes it. In
+the third case, `car' receives `[active]', which results in:
+
+ [active]
+ =>active
+
+exactly as we already saw above.
+
+ The example above, applied to a more realistic example, gives:
+
+ car(int tab[10];)
+ =>int tab10;
+ car([int tab[10];])
+ =>int tab10;
+ car([[int tab[10];]])
+ =>int tab[10];
+
+Huh? The first case is easily understood, but why is the second wrong,
+and the third right? To understand that, you must know that after M4
+expands a macro, the resulting text is immediately subjected to macro
+expansion and quote removal. This means that the quote removal occurs
+twice--first before the argument is passed to the `car' macro, and
+second after the `car' macro expands to the first argument.
+
+ As the author of the Autoconf macro `car', you then consider it to
+be incorrect that your users have to double-quote the arguments of
+`car', so you "fix" your macro. Let's call it `qar' for quoted car:
+
+ define([qar], [[$1]])
+
+and check that `qar' is properly fixed:
+
+ qar([int tab[10];])
+ =>int tab[10];
+
+Ahhh! That's much better.
+
+ But note what you've done: now that the result of `qar' is always a
+literal string, the only time a user can use nested macros is if she
+relies on an _unquoted_ macro call:
+
+ qar(active)
+ =>ACT
+ qar([active])
+ =>active
+
+leaving no way for her to reproduce what she used to do with `car':
+
+ car([active])
+ =>ACT, IVE
+
+Worse yet: she wants to use a macro that produces a set of `cpp' macros:
+
+ define([my_includes], [#include <stdio.h>])
+ car([my_includes])
+ =>#include <stdio.h>
+ qar(my_includes)
+ error-->EOF in argument list
+
+ This macro, `qar', because it double quotes its arguments, forces
+its users to leave their macro calls unquoted, which is dangerous.
+Commas and other active symbols are interpreted by M4 before they are
+given to the macro, often not in the way the users expect. Also,
+because `qar' behaves differently from the other macros, it's an
+exception that should be avoided in Autoconf.
+
+
+File: autoconf.info, Node: Changequote is Evil, Next: Quadrigraphs, Prev: Quotation and Nested Macros, Up: M4 Quotation
+
+8.1.5 `changequote' is Evil
+---------------------------
+
+The temptation is often high to bypass proper quotation, in particular
+when it's late at night. Then, many experienced Autoconf hackers
+finally surrender to the dark side of the force and use the ultimate
+weapon: `changequote'.
+
+ The M4 builtin `changequote' belongs to a set of primitives that
+allow one to adjust the syntax of the language to adjust it to one's
+needs. For instance, by default M4 uses ``' and `'' as quotes, but in
+the context of shell programming (and actually of most programming
+languages), that's about the worst choice one can make: because of
+strings and back-quoted expressions in shell code (such as `'this'' and
+``that`'), and because of literal characters in usual programming
+languages (as in `'0''), there are many unbalanced ``' and `''. Proper
+M4 quotation then becomes a nightmare, if not impossible. In order to
+make M4 useful in such a context, its designers have equipped it with
+`changequote', which makes it possible to choose another pair of
+quotes. M4sugar, M4sh, Autoconf, and Autotest all have chosen to use
+`[' and `]'. Not especially because they are unlikely characters, but
+_because they are characters unlikely to be unbalanced_.
+
+ There are other magic primitives, such as `changecom' to specify
+what syntactic forms are comments (it is common to see `changecom(<!--,
+-->)' when M4 is used to produce HTML pages), `changeword' and
+`changesyntax' to change other syntactic details (such as the character
+to denote the Nth argument, `$' by default, the parentheses around
+arguments, etc.).
+
+ These primitives are really meant to make M4 more useful for specific
+domains: they should be considered like command line options:
+`--quotes', `--comments', `--words', and `--syntax'. Nevertheless,
+they are implemented as M4 builtins, as it makes M4 libraries self
+contained (no need for additional options).
+
+ There lies the problem...
+
+
+ The problem is that it is then tempting to use them in the middle of
+an M4 script, as opposed to its initialization. This, if not carefully
+thought out, can lead to disastrous effects: _you are changing the
+language in the middle of the execution_. Changing and restoring the
+syntax is often not enough: if you happened to invoke macros in between,
+these macros are lost, as the current syntax is probably not the one
+they were implemented with.
+
+
+File: autoconf.info, Node: Quadrigraphs, Next: Balancing Parentheses, Prev: Changequote is Evil, Up: M4 Quotation
+
+8.1.6 Quadrigraphs
+------------------
+
+When writing an Autoconf macro you may occasionally need to generate
+special characters that are difficult to express with the standard
+Autoconf quoting rules. For example, you may need to output the regular
+expression `[^[]', which matches any character other than `['. This
+expression contains unbalanced brackets so it cannot be put easily into
+an M4 macro.
+
+ Additionally, there are a few m4sugar macros (such as `m4_split' and
+`m4_expand') which internally use special markers in addition to the
+regular quoting characters. If the arguments to these macros contain
+the literal strings `-=<{(' or `)}>=-', the macros might behave
+incorrectly.
+
+ You can work around these problems by using one of the following
+"quadrigraphs":
+
+`@<:@'
+ `['
+
+`@:>@'
+ `]'
+
+`@S|@'
+ `$'
+
+`@%:@'
+ `#'
+
+`@{:@'
+ `('
+
+`@:}@'
+ `)'
+
+`@&t@'
+ Expands to nothing.
+
+ Quadrigraphs are replaced at a late stage of the translation process,
+after `m4' is run, so they do not get in the way of M4 quoting. For
+example, the string `^@<:@', independently of its quotation, appears as
+`^[' in the output.
+
+ The empty quadrigraph can be used:
+
+ - to mark trailing spaces explicitly
+
+ Trailing spaces are smashed by `autom4te'. This is a feature.
+
+ - to produce quadrigraphs and other strings reserved by m4sugar
+
+ For instance `@<@&t@:@' produces `@<:@'. For a more contrived
+ example:
+
+ m4_define([a], [A])m4_define([b], [B])m4_define([c], [C])dnl
+ m4_split([a )}>=- b -=<{( c])
+ =>[a], [], [B], [], [c]
+ m4_split([a )}@&t@>=- b -=<@&t@{( c])
+ =>[a], [)}>=-], [b], [-=<{(], [c]
+
+ - to escape _occurrences_ of forbidden patterns
+
+ For instance you might want to mention `AC_FOO' in a comment, while
+ still being sure that `autom4te' still catches unexpanded `AC_*'.
+ Then write `AC@&t@_FOO'.
+
+ The name `@&t@' was suggested by Paul Eggert:
+
+ I should give some credit to the `@&t@' pun. The `&' is my own
+ invention, but the `t' came from the source code of the ALGOL68C
+ compiler, written by Steve Bourne (of Bourne shell fame), and
+ which used `mt' to denote the empty string. In C, it would have
+ looked like something like:
+
+ char const mt[] = "";
+
+ but of course the source code was written in Algol 68.
+
+ I don't know where he got `mt' from: it could have been his own
+ invention, and I suppose it could have been a common pun around the
+ Cambridge University computer lab at the time.
+
+
+File: autoconf.info, Node: Balancing Parentheses, Next: Quotation Rule Of Thumb, Prev: Quadrigraphs, Up: M4 Quotation
+
+8.1.7 Dealing with unbalanced parentheses
+-----------------------------------------
+
+One of the pitfalls of portable shell programming is that `case'
+statements require unbalanced parentheses (*note Limitations of Shell
+Builtins: case.). With syntax highlighting editors, the presence of
+unbalanced `)' can interfere with editors that perform syntax
+highlighting of macro contents based on finding the matching `('.
+Another concern is how much editing must be done when transferring code
+snippets between shell scripts and macro definitions. But most
+importantly, the presence of unbalanced parentheses can introduce
+expansion bugs.
+
+ For an example, here is an underquoted attempt to use the macro
+`my_case', which happens to expand to a portable `case' statement:
+
+ AC_DEFUN([my_case],
+ [case $file_name in
+ *.c) echo "C source code";;
+ esac])
+ AS_IF(:, my_case)
+
+In the above example, the `AS_IF' call underquotes its arguments. As a
+result, the unbalanced `)' generated by the premature expansion of
+`my_case' results in expanding `AS_IF' with a truncated parameter, and
+the expansion is syntactically invalid:
+
+ if :; then
+ case $file_name in
+ *.c
+ fi echo "C source code";;
+ esac)
+
+ If nothing else, this should emphasize the importance of the quoting
+arguments to macro calls. On the other hand, there are several
+variations for defining `my_case' to be more robust, even when used
+without proper quoting, each with some benefits and some drawbacks.
+
+ Creative literal shell comment
+ AC_DEFUN([my_case],
+ [case $file_name in #(
+ *.c) echo "C source code";;
+ esac])
+ This version provides balanced parentheses to several editors, and
+ can be copied and pasted into a terminal as is. Unfortunately, it
+ is still unbalanced as an Autoconf argument, since `#(' is an M4
+ comment that masks the normal properties of `('.
+
+ Quadrigraph shell comment
+ AC_DEFUN([my_case],
+ [case $file_name in @%:@(
+ *.c) echo "C source code";;
+ esac])
+ This version provides balanced parentheses to even more editors,
+ and can be used as a balanced Autoconf argument. Unfortunately,
+ it requires some editing before it can be copied and pasted into a
+ terminal, and the use of the quadrigraph `@%:@' for `#' reduces
+ readability.
+
+ Quoting just the parenthesis
+ AC_DEFUN([my_case],
+ [case $file_name in
+ *.c[)] echo "C source code";;
+ esac])
+ This version quotes the `)', so that it can be used as a balanced
+ Autoconf argument. As written, this is not balanced to an editor,
+ but it can be coupled with `[#(]' to meet that need, too.
+ However, it still requires some edits before it can be copied and
+ pasted into a terminal.
+
+ Double-quoting the entire statement
+ AC_DEFUN([my_case],
+ [[case $file_name in #(
+ *.c) echo "C source code";;
+ esac]])
+ Since the entire macro is double-quoted, there is no problem with
+ using this as an Autoconf argument; and since the double-quoting
+ is over the entire statement, this code can be easily copied and
+ pasted into a terminal. However, the double quoting prevents the
+ expansion of any macros inside the case statement, which may cause
+ its own set of problems.
+
+ Using `AS_CASE'
+ AC_DEFUN([my_case],
+ [AS_CASE([$file_name],
+ [*.c], [echo "C source code"])])
+ This version avoids the balancing issue altogether, by relying on
+ `AS_CASE' (*note Common Shell Constructs::); it also allows for the
+ expansion of `AC_REQUIRE' to occur prior to the entire case
+ statement, rather than within a branch of the case statement that
+ might not be taken. However, the abstraction comes with a penalty
+ that it is no longer a quick copy, paste, and edit to get back to
+ shell code.
+
+
+File: autoconf.info, Node: Quotation Rule Of Thumb, Prev: Balancing Parentheses, Up: M4 Quotation
+
+8.1.8 Quotation Rule Of Thumb
+-----------------------------
+
+To conclude, the quotation rule of thumb is:
+
+ _One pair of quotes per pair of parentheses._
+
+ Never over-quote, never under-quote, in particular in the definition
+of macros. In the few places where the macros need to use brackets
+(usually in C program text or regular expressions), properly quote _the
+arguments_!
+
+ It is common to read Autoconf programs with snippets like:
+
+ AC_TRY_LINK(
+ changequote(<<, >>)dnl
+ <<#include <time.h>
+ #ifndef tzname /* For SGI. */
+ extern char *tzname[]; /* RS6000 and others reject char **tzname. */
+ #endif>>,
+ changequote([, ])dnl
+ [atoi (*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no)
+
+which is incredibly useless since `AC_TRY_LINK' is _already_ double
+quoting, so you just need:
+
+ AC_TRY_LINK(
+ [#include <time.h>
+ #ifndef tzname /* For SGI. */
+ extern char *tzname[]; /* RS6000 and others reject char **tzname. */
+ #endif],
+ [atoi (*tzname);],
+ [ac_cv_var_tzname=yes],
+ [ac_cv_var_tzname=no])
+
+The M4-fluent reader might note that these two examples are rigorously
+equivalent, since M4 swallows both the `changequote(<<, >>)' and `<<'
+`>>' when it "collects" the arguments: these quotes are not part of the
+arguments!
+
+ Simplified, the example above is just doing this:
+
+ changequote(<<, >>)dnl
+ <<[]>>
+ changequote([, ])dnl
+
+instead of simply:
+
+ [[]]
+
+ With macros that do not double quote their arguments (which is the
+rule), double-quote the (risky) literals:
+
+ AC_LINK_IFELSE([AC_LANG_PROGRAM(
+ [[#include <time.h>
+ #ifndef tzname /* For SGI. */
+ extern char *tzname[]; /* RS6000 and others reject char **tzname. */
+ #endif]],
+ [atoi (*tzname);])],
+ [ac_cv_var_tzname=yes],
+ [ac_cv_var_tzname=no])
+
+ Please note that the macro `AC_TRY_LINK' is obsolete, so you really
+should be using `AC_LINK_IFELSE' instead.
+
+ *Note Quadrigraphs::, for what to do if you run into a hopeless case
+where quoting does not suffice.
+
+ When you create a `configure' script using newly written macros,
+examine it carefully to check whether you need to add more quotes in
+your macros. If one or more words have disappeared in the M4 output,
+you need more quotes. When in doubt, quote.
+
+ However, it's also possible to put on too many layers of quotes. If
+this happens, the resulting `configure' script may contain unexpanded
+macros. The `autoconf' program checks for this problem by looking for
+the string `AC_' in `configure'. However, this heuristic does not work
+in general: for example, it does not catch overquoting in `AC_DEFINE'
+descriptions.
+
+
+File: autoconf.info, Node: Using autom4te, Next: Programming in M4sugar, Prev: M4 Quotation, Up: Programming in M4
+
+8.2 Using `autom4te'
+====================
+
+The Autoconf suite, including M4sugar, M4sh, and Autotest, in addition
+to Autoconf per se, heavily rely on M4. All these different uses
+revealed common needs factored into a layer over M4: `autom4te'(1).
+
+ `autom4te' is a preprocessor that is like `m4'. It supports M4
+extensions designed for use in tools like Autoconf.
+
+* Menu:
+
+* autom4te Invocation:: A GNU M4 wrapper
+* Customizing autom4te:: Customizing the Autoconf package
+
+ ---------- Footnotes ----------
+
+ (1) Yet another great name from Lars J. Aas.
+
+
+File: autoconf.info, Node: autom4te Invocation, Next: Customizing autom4te, Up: Using autom4te
+
+8.2.1 Invoking `autom4te'
+-------------------------
+
+The command line arguments are modeled after M4's:
+
+ autom4te OPTIONS FILES
+
+where the FILES are directly passed to `m4'. By default, GNU M4 is
+found during configuration, but the environment variable `M4' can be
+set to tell `autom4te' where to look. In addition to the regular
+expansion, it handles the replacement of the quadrigraphs (*note
+Quadrigraphs::), and of `__oline__', the current line in the output.
+It supports an extended syntax for the FILES:
+
+`FILE.m4f'
+ This file is an M4 frozen file. Note that _all the previous files
+ are ignored_. See the option `--melt' for the rationale.
+
+`FILE?'
+ If found in the library path, the FILE is included for expansion,
+ otherwise it is ignored instead of triggering a failure.
+
+
+ Of course, it supports the Autoconf common subset of options:
+
+`--help'
+`-h'
+ Print a summary of the command line options and exit.
+
+`--version'
+`-V'
+ Print the version number of Autoconf and exit.
+
+`--verbose'
+`-v'
+ Report processing steps.
+
+`--debug'
+`-d'
+ Don't remove the temporary files and be even more verbose.
+
+`--include=DIR'
+`-I DIR'
+ Also look for input files in DIR. Multiple invocations accumulate.
+
+`--output=FILE'
+`-o FILE'
+ Save output (script or trace) to FILE. The file `-' stands for
+ the standard output.
+
+
+ As an extension of `m4', it includes the following options:
+
+`--warnings=CATEGORY'
+`-W CATEGORY'
+ Report the warnings related to CATEGORY (which can actually be a
+ comma separated list). *Note Reporting Messages::, macro
+ `AC_DIAGNOSE', for a comprehensive list of categories. Special
+ values include:
+
+ `all'
+ report all the warnings
+
+ `none'
+ report none
+
+ `error'
+ treats warnings as errors
+
+ `no-CATEGORY'
+ disable warnings falling into CATEGORY
+
+ Warnings about `syntax' are enabled by default, and the environment
+ variable `WARNINGS', a comma separated list of categories, is
+ honored. `autom4te -W CATEGORY' actually behaves as if you had
+ run:
+
+ autom4te --warnings=syntax,$WARNINGS,CATEGORY
+
+ For example, if you want to disable defaults and `WARNINGS' of
+ `autom4te', but enable the warnings about obsolete constructs, you
+ would use `-W none,obsolete'.
+
+ `autom4te' displays a back trace for errors, but not for warnings;
+ if you want them, just pass `-W error'.
+
+`--melt'
+`-M'
+ Do not use frozen files. Any argument `FILE.m4f' is replaced by
+ `FILE.m4'. This helps tracing the macros which are executed only
+ when the files are frozen, typically `m4_define'. For instance,
+ running:
+
+ autom4te --melt 1.m4 2.m4f 3.m4 4.m4f input.m4
+
+ is roughly equivalent to running:
+
+ m4 1.m4 2.m4 3.m4 4.m4 input.m4
+
+ while
+
+ autom4te 1.m4 2.m4f 3.m4 4.m4f input.m4
+
+ is equivalent to:
+
+ m4 --reload-state=4.m4f input.m4
+
+`--freeze'
+`-F'
+ Produce a frozen state file. `autom4te' freezing is stricter than
+ M4's: it must produce no warnings, and no output other than empty
+ lines (a line with white space is _not_ empty) and comments
+ (starting with `#'). Unlike `m4''s similarly-named option, this
+ option takes no argument:
+
+ autom4te 1.m4 2.m4 3.m4 --freeze --output=3.m4f
+
+ corresponds to
+
+ m4 1.m4 2.m4 3.m4 --freeze-state=3.m4f
+
+`--mode=OCTAL-MODE'
+`-m OCTAL-MODE'
+ Set the mode of the non-traces output to OCTAL-MODE; by default
+ `0666'.
+
+
+ As another additional feature over `m4', `autom4te' caches its
+results. GNU M4 is able to produce a regular output and traces at the
+same time. Traces are heavily used in the GNU Build System:
+`autoheader' uses them to build `config.h.in', `autoreconf' to
+determine what GNU Build System components are used, `automake' to
+"parse" `configure.ac' etc. To avoid recomputation, traces are cached
+while performing regular expansion, and conversely. This cache is
+(actually, the caches are) stored in the directory `autom4te.cache'.
+_It can safely be removed_ at any moment (especially if for some reason
+`autom4te' considers it trashed).
+
+`--cache=DIRECTORY'
+`-C DIRECTORY'
+ Specify the name of the directory where the result should be
+ cached. Passing an empty value disables caching. Be sure to pass
+ a relative file name, as for the time being, global caches are not
+ supported.
+
+`--no-cache'
+ Don't cache the results.
+
+`--force'
+`-f'
+ If a cache is used, consider it obsolete (but update it anyway).
+
+
+ Because traces are so important to the GNU Build System, `autom4te'
+provides high level tracing features as compared to M4, and helps
+exploiting the cache:
+
+`--trace=MACRO[:FORMAT]'
+`-t MACRO[:FORMAT]'
+ Trace the invocations of MACRO according to the FORMAT. Multiple
+ `--trace' arguments can be used to list several macros. Multiple
+ `--trace' arguments for a single macro are not cumulative;
+ instead, you should just make FORMAT as long as needed.
+
+ The FORMAT is a regular string, with newlines if desired, and
+ several special escape codes. It defaults to `$f:$l:$n:$%'. It
+ can use the following special escapes:
+
+ `$$'
+ The character `$'.
+
+ `$f'
+ The file name from which MACRO is called.
+
+ `$l'
+ The line number from which MACRO is called.
+
+ `$d'
+ The depth of the MACRO call. This is an M4 technical detail
+ that you probably don't want to know about.
+
+ `$n'
+ The name of the MACRO.
+
+ `$NUM'
+ The NUMth argument of the call to MACRO.
+
+ `$@'
+ `$SEP@'
+ `${SEPARATOR}@'
+ All the arguments passed to MACRO, separated by the character
+ SEP or the string SEPARATOR (`,' by default). Each argument
+ is quoted, i.e., enclosed in a pair of square brackets.
+
+ `$*'
+ `$SEP*'
+ `${SEPARATOR}*'
+ As above, but the arguments are not quoted.
+
+ `$%'
+ `$SEP%'
+ `${SEPARATOR}%'
+ As above, but the arguments are not quoted, all new line
+ characters in the arguments are smashed, and the default
+ separator is `:'.
+
+ The escape `$%' produces single-line trace outputs (unless
+ you put newlines in the `separator'), while `$@' and `$*' do
+ not.
+
+ *Note autoconf Invocation::, for examples of trace uses.
+
+`--preselect=MACRO'
+`-p MACRO'
+ Cache the traces of MACRO, but do not enable traces. This is
+ especially important to save CPU cycles in the future. For
+ instance, when invoked, `autoconf' preselects all the macros that
+ `autoheader', `automake', `autoreconf', etc., trace, so that
+ running `m4' is not needed to trace them: the cache suffices.
+ This results in a huge speed-up.
+
+
+ Finally, `autom4te' introduces the concept of "Autom4te libraries".
+They consists in a powerful yet extremely simple feature: sets of
+combined command line arguments:
+
+`--language=LANGUAGE'
+`-l LANGUAGE'
+ Use the LANGUAGE Autom4te library. Current languages include:
+
+ `M4sugar'
+ create M4sugar output.
+
+ `M4sh'
+ create M4sh executable shell scripts.
+
+ `Autotest'
+ create Autotest executable test suites.
+
+ `Autoconf-without-aclocal-m4'
+ create Autoconf executable configure scripts without reading
+ `aclocal.m4'.
+
+ `Autoconf'
+ create Autoconf executable configure scripts. This language
+ inherits all the characteristics of
+ `Autoconf-without-aclocal-m4' and additionally reads
+ `aclocal.m4'.
+
+`--prepend-include=DIR'
+`-B DIR'
+ Prepend directory DIR to the search path. This is used to include
+ the language-specific files before any third-party macros.
+
+
+ As an example, if Autoconf is installed in its default location,
+`/usr/local', the command `autom4te -l m4sugar foo.m4' is strictly
+equivalent to the command:
+
+ autom4te --prepend-include /usr/local/share/autoconf \
+ m4sugar/m4sugar.m4f --warnings syntax foo.m4
+
+Recursive expansion applies here: the command `autom4te -l m4sh foo.m4'
+is the same as `autom4te --language M4sugar m4sugar/m4sh.m4f foo.m4',
+i.e.:
+
+ autom4te --prepend-include /usr/local/share/autoconf \
+ m4sugar/m4sugar.m4f m4sugar/m4sh.m4f --mode 777 foo.m4
+
+The definition of the languages is stored in `autom4te.cfg'.
+
+
+File: autoconf.info, Node: Customizing autom4te, Prev: autom4te Invocation, Up: Using autom4te
+
+8.2.2 Customizing `autom4te'
+----------------------------
+
+One can customize `autom4te' via `~/.autom4te.cfg' (i.e., as found in
+the user home directory), and `./.autom4te.cfg' (i.e., as found in the
+directory from which `autom4te' is run). The order is first reading
+`autom4te.cfg', then `~/.autom4te.cfg', then `./.autom4te.cfg', and
+finally the command line arguments.
+
+ In these text files, comments are introduced with `#', and empty
+lines are ignored. Customization is performed on a per-language basis,
+wrapped in between a `begin-language: "LANGUAGE"', `end-language:
+"LANGUAGE"' pair.
+
+ Customizing a language stands for appending options (*note autom4te
+Invocation::) to the current definition of the language. Options, and
+more generally arguments, are introduced by `args: ARGUMENTS'. You may
+use the traditional shell syntax to quote the ARGUMENTS.
+
+ As an example, to disable Autoconf caches (`autom4te.cache')
+globally, include the following lines in `~/.autom4te.cfg':
+
+## ------------------ ##
+## User Preferences. ##
+## ------------------ ##
+
+begin-language: "Autoconf-without-aclocal-m4"
+args: --no-cache
+end-language: "Autoconf-without-aclocal-m4"
+
+
+File: autoconf.info, Node: Programming in M4sugar, Next: Debugging via autom4te, Prev: Using autom4te, Up: Programming in M4
+
+8.3 Programming in M4sugar
+==========================
+
+M4 by itself provides only a small, but sufficient, set of all-purpose
+macros. M4sugar introduces additional generic macros. Its name was
+coined by Lars J. Aas: "Readability And Greater Understanding Stands 4
+M4sugar".
+
+ M4sugar reserves the macro namespace `^_m4_' for internal use, and
+the macro namespace `^m4_' for M4sugar macros. You should not define
+your own macros into these namespaces.
+
+* Menu:
+
+* Redefined M4 Macros:: M4 builtins changed in M4sugar
+* Diagnostic Macros:: Diagnostic messages from M4sugar
+* Diversion support:: Diversions in M4sugar
+* Conditional constructs:: Conditions in M4
+* Looping constructs:: Iteration in M4
+* Evaluation Macros:: More quotation and evaluation control
+* Text processing Macros:: String manipulation in M4
+* Number processing Macros:: Arithmetic computation in M4
+* Set manipulation Macros:: Set manipulation in M4
+* Forbidden Patterns:: Catching unexpanded macros
+
+
+File: autoconf.info, Node: Redefined M4 Macros, Next: Diagnostic Macros, Up: Programming in M4sugar
+
+8.3.1 Redefined M4 Macros
+-------------------------
+
+With a few exceptions, all the M4 native macros are moved in the `m4_'
+pseudo-namespace, e.g., M4sugar renames `define' as `m4_define' etc.
+
+ The list of macros unchanged from M4, except for their name, is:
+ - m4_builtin
+
+ - m4_changecom
+
+ - m4_changequote
+
+ - m4_debugfile
+
+ - m4_debugmode
+
+ - m4_decr
+
+ - m4_define
+
+ - m4_divnum
+
+ - m4_errprint
+
+ - m4_esyscmd
+
+ - m4_eval
+
+ - m4_format
+
+ - m4_ifdef
+
+ - m4_incr
+
+ - m4_index
+
+ - m4_indir
+
+ - m4_len
+
+ - m4_pushdef
+
+ - m4_shift
+
+ - m4_substr
+
+ - m4_syscmd
+
+ - m4_sysval
+
+ - m4_traceoff
+
+ - m4_traceon
+
+ - m4_translit
+
+ Some M4 macros are redefined, and are slightly incompatible with
+their native equivalent.
+
+ -- Macro: __file__
+ -- Macro: __line__
+ All M4 macros starting with `__' retain their original name: for
+ example, no `m4__file__' is defined.
+
+ -- Macro: __oline__
+ This is not technically a macro, but a feature of Autom4te. The
+ sequence `__oline__' can be used similarly to the other m4sugar
+ location macros, but rather than expanding to the location of the
+ input file, it is translated to the line number where it appears
+ in the output file after all other M4 expansions.
+
+ -- Macro: dnl
+ This macro kept its original name: no `m4_dnl' is defined.
+
+ -- Macro: m4_bpatsubst (STRING, REGEXP, [REPLACEMENT])
+ This macro corresponds to `patsubst'. The name `m4_patsubst' is
+ kept for future versions of M4sugar, once GNU M4 2.0 is released
+ and supports extended regular expression syntax.
+
+ -- Macro: m4_bregexp (STRING, REGEXP, [REPLACEMENT])
+ This macro corresponds to `regexp'. The name `m4_regexp' is kept
+ for future versions of M4sugar, once GNU M4 2.0 is released and
+ supports extended regular expression syntax.
+
+ -- Macro: m4_copy (SOURCE, DEST)
+ -- Macro: m4_copy_force (SOURCE, DEST)
+ -- Macro: m4_rename (SOURCE, DEST)
+ -- Macro: m4_rename_force (SOURCE, DEST)
+ These macros aren't directly builtins, but are closely related to
+ `m4_pushdef' and `m4_defn'. `m4_copy' and `m4_rename' ensure that
+ DEST is undefined, while `m4_copy_force' and `m4_rename_force'
+ overwrite any existing definition. All four macros then proceed
+ to copy the entire pushdef stack of definitions of SOURCE over to
+ DEST. `m4_copy' and `m4_copy_force' preserve the source
+ (including in the special case where SOURCE is undefined), while
+ `m4_rename' and `m4_rename_force' undefine the original macro name
+ (making it an error to rename an undefined SOURCE).
+
+ Note that attempting to invoke a renamed macro might not work,
+ since the macro may have a dependence on helper macros accessed
+ via composition of `$0' but that were not also renamed; likewise,
+ other macros may have a hard-coded dependence on SOURCE and could
+ break if SOURCE has been deleted. On the other hand, it is always
+ safe to rename a macro to temporarily move it out of the way, then
+ rename it back later to restore original semantics.
+
+ -- Macro: m4_defn (MACRO...)
+ This macro fails if MACRO is not defined, even when using older
+ versions of M4 that did not warn. See `m4_undefine'.
+ Unfortunately, in order to support these older versions of M4,
+ there are some situations involving unbalanced quotes where
+ concatenating multiple macros together will work in newer M4 but
+ not in m4sugar; use quadrigraphs to work around this.
+
+ -- Macro: m4_divert (DIVERSION)
+ M4sugar relies heavily on diversions, so rather than behaving as a
+ primitive, `m4_divert' behaves like:
+ m4_divert_pop()m4_divert_push([DIVERSION])
+ *Note Diversion support::, for more details about the use of the
+ diversion stack. In particular, this implies that DIVERSION
+ should be a named diversion rather than a raw number. But be
+ aware that it is seldom necessary to explicitly change the
+ diversion stack, and that when done incorrectly, it can lead to
+ syntactically invalid scripts.
+
+ -- Macro: m4_dumpdef (NAME...)
+ -- Macro: m4_dumpdefs (NAME...)
+ `m4_dumpdef' is like the M4 builtin, except that this version
+ requires at least one argument, output always goes to standard
+ error rather than the current debug file, no sorting is done on
+ multiple arguments, and an error is issued if any NAME is
+ undefined. `m4_dumpdefs' is a convenience macro that calls
+ `m4_dumpdef' for all of the `m4_pushdef' stack of definitions,
+ starting with the current, and silently does nothing if NAME is
+ undefined.
+
+ Unfortunately, due to a limitation in M4 1.4.x, any macro defined
+ as a builtin is output as the empty string. This behavior is
+ rectified by using M4 1.6 or newer. However, this behavior
+ difference means that `m4_dumpdef' should only be used while
+ developing m4sugar macros, and never in the final published form
+ of a macro.
+
+ -- Macro: m4_esyscmd_s (COMMAND)
+ Like `m4_esyscmd', this macro expands to the result of running
+ COMMAND in a shell. The difference is that any trailing newlines
+ are removed, so that the output behaves more like shell command
+ substitution.
+
+ -- Macro: m4_exit (EXIT-STATUS)
+ This macro corresponds to `m4exit'.
+
+ -- Macro: m4_if (COMMENT)
+ -- Macro: m4_if (STRING-1, STRING-2, EQUAL, [NOT-EQUAL])
+ -- Macro: m4_if (STRING-1, STRING-2, EQUAL-1, STRING-3, STRING-4,
+ EQUAL-2, ..., [NOT-EQUAL])
+ This macro corresponds to `ifelse'. STRING-1 and STRING-2 are
+ compared literally, so usually one of the two arguments is passed
+ unquoted. *Note Conditional constructs::, for more conditional
+ idioms.
+
+ -- Macro: m4_include (FILE)
+ -- Macro: m4_sinclude (FILE)
+ Like the M4 builtins, but warn against multiple inclusions of FILE.
+
+ -- Macro: m4_mkstemp (TEMPLATE)
+ -- Macro: m4_maketemp (TEMPLATE)
+ Posix requires `maketemp' to replace the trailing `X' characters
+ in TEMPLATE with the process id, without regards to the existence
+ of a file by that name, but this a security hole. When this was
+ pointed out to the Posix folks, they agreed to invent a new macro
+ `mkstemp' that always creates a uniquely named file, but not all
+ versions of GNU M4 support the new macro. In M4sugar,
+ `m4_maketemp' and `m4_mkstemp' are synonyms for each other, and
+ both have the secure semantics regardless of which macro the
+ underlying M4 provides.
+
+ -- Macro: m4_popdef (MACRO...)
+ This macro fails if MACRO is not defined, even when using older
+ versions of M4 that did not warn. See `m4_undefine'.
+
+ -- Macro: m4_undefine (MACRO...)
+ This macro fails if MACRO is not defined, even when using older
+ versions of M4 that did not warn. Use
+
+ m4_ifdef([MACRO], [m4_undefine([MACRO])])
+
+ if you are not sure whether MACRO is defined.
+
+ -- Macro: m4_undivert (DIVERSION...)
+ Unlike the M4 builtin, at least one DIVERSION must be specified.
+ Also, since the M4sugar diversion stack prefers named diversions,
+ the use of `m4_undivert' to include files is risky. *Note
+ Diversion support::, for more details about the use of the
+ diversion stack. But be aware that it is seldom necessary to
+ explicitly change the diversion stack, and that when done
+ incorrectly, it can lead to syntactically invalid scripts.
+
+ -- Macro: m4_wrap (TEXT)
+ -- Macro: m4_wrap_lifo (TEXT)
+ These macros correspond to `m4wrap'. Posix requires arguments of
+ multiple wrap calls to be reprocessed at EOF in the same order as
+ the original calls (first-in, first-out). GNU M4 versions through
+ 1.4.10, however, reprocess them in reverse order (last-in,
+ first-out). Both orders are useful, therefore, you can rely on
+ `m4_wrap' to provide FIFO semantics and `m4_wrap_lifo' for LIFO
+ semantics, regardless of the underlying GNU M4 version.
+
+ Unlike the GNU M4 builtin, these macros only recognize one
+ argument, and avoid token pasting between consecutive invocations.
+ On the other hand, nested calls to `m4_wrap' from within wrapped
+ text work just as in the builtin.
+
+
+File: autoconf.info, Node: Diagnostic Macros, Next: Diversion support, Prev: Redefined M4 Macros, Up: Programming in M4sugar
+
+8.3.2 Diagnostic messages from M4sugar
+--------------------------------------
+
+When macros statically diagnose abnormal situations, benign or fatal,
+they should report them using these macros. For issuing dynamic issues,
+i.e., when `configure' is run, see *note Printing Messages::.
+
+ -- Macro: m4_assert (EXPRESSION, [EXIT-STATUS = `1'])
+ Assert that the arithmetic EXPRESSION evaluates to non-zero.
+ Otherwise, issue a fatal error, and exit `autom4te' with
+ EXIT-STATUS.
+
+ -- Macro: m4_errprintn (MESSAGE)
+ Similar to the builtin `m4_errprint', except that a newline is
+ guaranteed after MESSAGE.
+
+ -- Macro: m4_fatal (MESSAGE)
+ Report a severe error MESSAGE prefixed with the current location,
+ and have `autom4te' die.
+
+ -- Macro: m4_location
+ Useful as a prefix in a message line. Short for:
+ __file__:__line__
+
+ -- Macro: m4_warn (CATEGORY, MESSAGE)
+ Report MESSAGE as a warning (or as an error if requested by the
+ user) if warnings of the CATEGORY are turned on. If the message
+ is emitted, it is prefixed with the current location, and followed
+ by a call trace of all macros defined via `AC_DEFUN' used to get
+ to the current expansion. You are encouraged to use standard
+ categories, which currently include:
+
+ `all'
+ messages that don't fall into one of the following
+ categories. Use of an empty CATEGORY is equivalent.
+
+ `cross'
+ related to cross compilation issues.
+
+ `obsolete'
+ use of an obsolete construct.
+
+ `syntax'
+ dubious syntactic constructs, incorrectly ordered macro calls.
+
+
+File: autoconf.info, Node: Diversion support, Next: Conditional constructs, Prev: Diagnostic Macros, Up: Programming in M4sugar
+
+8.3.3 Diversion support
+-----------------------
+
+M4sugar makes heavy use of diversions under the hood, because it is
+often the case that text that must appear early in the output is not
+discovered until late in the input. Additionally, some of the
+topological sorting algorithms used in resolving macro dependencies use
+diversions. However, most macros should not need to change diversions
+directly, but rather rely on higher-level M4sugar macros to manage
+diversions transparently. If you change diversions improperly, you
+risk generating a syntactically invalid script, because an incorrect
+diversion will violate assumptions made by many macros about whether
+prerequisite text has been previously output. In short, if you
+manually change the diversion, you should not expect any macros
+provided by the Autoconf package to work until you have restored the
+diversion stack back to its original state.
+
+ In the rare case that it is necessary to write a macro that
+explicitly outputs text to a different diversion, it is important to be
+aware of an M4 limitation regarding diversions: text only goes to a
+diversion if it is not part of argument collection. Therefore, any
+macro that changes the current diversion cannot be used as an unquoted
+argument to another macro, but must be expanded at the top level. The
+macro `m4_expand' will diagnose any attempt to change diversions, since
+it is generally useful only as an argument to another macro. The
+following example shows what happens when diversion manipulation is
+attempted within macro arguments:
+
+ m4_do([normal text]
+ m4_divert_push([KILL])unwanted[]m4_divert_pop([KILL])
+ [m4_divert_push([KILL])discarded[]m4_divert_pop([KILL])])dnl
+ =>normal text
+ =>unwanted
+
+Notice that the unquoted text `unwanted' is output, even though it was
+processed while the current diversion was `KILL', because it was
+collected as part of the argument to `m4_do'. However, the text
+`discarded' disappeared as desired, because the diversion changes were
+single-quoted, and were not expanded until the top-level rescan of the
+output of `m4_do'.
+
+ To make diversion management easier, M4sugar uses the concept of
+named diversions. Rather than using diversion numbers directly, it is
+nicer to associate a name with each diversion. The diversion number
+associated with a particular diversion name is an implementation
+detail, and a syntax warning is issued if a diversion number is used
+instead of a name. In general, you should not output text to a named
+diversion until after calling the appropriate initialization routine
+for your language (`m4_init', `AS_INIT', `AT_INIT', ...), although
+there are some exceptions documented below.
+
+ M4sugar defines two named diversions.
+`KILL'
+ Text written to this diversion is discarded. This is the default
+ diversion once M4sugar is initialized.
+
+`GROW'
+ This diversion is used behind the scenes by topological sorting
+ macros, such as `AC_REQUIRE'.
+
+ M4sh adds several more named diversions.
+`BINSH'
+ This diversion is reserved for the `#!' interpreter line.
+
+`HEADER-REVISION'
+ This diversion holds text from `AC_REVISION'.
+
+`HEADER-COMMENT'
+ This diversion holds comments about the purpose of a file.
+
+`HEADER-COPYRIGHT'
+ This diversion is managed by `AC_COPYRIGHT'.
+
+`M4SH-SANITIZE'
+ This diversion contains M4sh sanitization code, used to ensure
+ M4sh is executing in a reasonable shell environment.
+
+`M4SH-INIT'
+ This diversion contains M4sh initialization code, initializing
+ variables that are required by other M4sh macros.
+
+`BODY'
+ This diversion contains the body of the shell code, and is the
+ default diversion once M4sh is initialized.
+
+ Autotest inherits diversions from M4sh, and changes the default
+diversion from `BODY' back to `KILL'. It also adds several more named
+diversions, with the following subset designed for developer use.
+`PREPARE_TESTS'
+ This diversion contains initialization sequences which are executed
+ after `atconfig' and `atlocal', and after all command line
+ arguments have been parsed, but prior to running any tests. It
+ can be used to set up state that is required across all tests.
+ This diversion will work even before `AT_INIT'.
+
+ Autoconf inherits diversions from M4sh, and adds the following named
+diversions which developers can utilize.
+`DEFAULTS'
+ This diversion contains shell variable assignments to set defaults
+ that must be in place before arguments are parsed. This diversion
+ is placed early enough in `configure' that it is unsafe to expand
+ any autoconf macros into this diversion.
+
+`HELP_ENABLE'
+ If `AC_PRESERVE_HELP_ORDER' was used, then text placed in this
+ diversion will be included as part of a quoted here-doc providing
+ all of the `--help' output of `configure' related to options
+ created by `AC_ARG_WITH' and `AC_ARG_ENABLE'.
+
+`INIT_PREPARE'
+ This diversion occurs after all command line options have been
+ parsed, but prior to the main body of the `configure' script. This
+ diversion is the last chance to insert shell code such as variable
+ assignments or shell function declarations that will used by the
+ expansion of other macros.
+
+ For now, the remaining named diversions of Autoconf, Autoheader, and
+Autotest are not documented. In other words, intentionally outputting
+text into an undocumented diversion is subject to breakage in a future
+release of Autoconf.
+
+ -- Macro: m4_cleardivert (DIVERSION...)
+ Permanently discard any text that has been diverted into DIVERSION.
+
+ -- Macro: m4_divert_once (DIVERSION, [CONTENT])
+ Similar to `m4_divert_text', except that CONTENT is only output to
+ DIVERSION if this is the first time that `m4_divert_once' has been
+ called with its particular arguments.
+
+ -- Macro: m4_divert_pop ([DIVERSION])
+ If provided, check that the current diversion is indeed DIVERSION.
+ Then change to the diversion located earlier on the stack, giving
+ an error if an attempt is made to pop beyond the initial m4sugar
+ diversion of `KILL'.
+
+ -- Macro: m4_divert_push (DIVERSION)
+ Remember the former diversion on the diversion stack, and output
+ subsequent text into DIVERSION. M4sugar maintains a diversion
+ stack, and issues an error if there is not a matching pop for every
+ push.
+
+ -- Macro: m4_divert_text (DIVERSION, [CONTENT])
+ Output CONTENT and a newline into DIVERSION, without affecting the
+ current diversion. Shorthand for:
+ m4_divert_push([DIVERSION])CONTENT
+ m4_divert_pop([DIVERSION])dnl
+
+ One use of `m4_divert_text' is to develop two related macros, where
+ macro `MY_A' does the work, but adjusts what work is performed
+ based on whether the optional macro `MY_B' has also been expanded.
+ Of course, it is possible to use `AC_BEFORE' within `MY_A' to
+ require that `MY_B' occurs first, if it occurs at all. But this
+ imposes an ordering restriction on the user; it would be nicer if
+ macros `MY_A' and `MY_B' can be invoked in either order. The trick
+ is to let `MY_B' leave a breadcrumb in an early diversion, which
+ `MY_A' can then use to determine whether `MY_B' has been expanded.
+
+ AC_DEFUN([MY_A],
+ [# various actions
+ if test -n "$b_was_used"; then
+ # extra action
+ fi])
+ AC_DEFUN([MY_B],
+ [AC_REQUIRE([MY_A])dnl
+ m4_divert_text([INIT_PREPARE], [b_was_used=true])])
+
+
+ -- Macro: m4_init
+ Initialize the M4sugar environment, setting up the default named
+ diversion to be `KILL'.
+
+
+File: autoconf.info, Node: Conditional constructs, Next: Looping constructs, Prev: Diversion support, Up: Programming in M4sugar
+
+8.3.4 Conditional constructs
+----------------------------
+
+The following macros provide additional conditional constructs as
+convenience wrappers around `m4_if'.
+
+ -- Macro: m4_bmatch (STRING, REGEX-1, VALUE-1, [REGEX-2], [VALUE-2],
+ ..., [DEFAULT])
+ The string STRING is repeatedly compared against a series of REGEX
+ arguments; if a match is found, the expansion is the corresponding
+ VALUE, otherwise, the macro moves on to the next REGEX. If no
+ REGEX match, then the result is the optional DEFAULT, or nothing.
+
+ -- Macro: m4_bpatsubsts (STRING, REGEX-1, SUBST-1, [REGEX-2],
+ [SUBST-2], ...)
+ The string STRING is altered by REGEX-1 and SUBST-1, as if by:
+ m4_bpatsubst([[STRING]], [REGEX], [SUBST])
+
+ The result of the substitution is then passed through the next set
+ of REGEX and SUBST, and so forth. An empty SUBST implies deletion
+ of any matched portions in the current string. Note that this
+ macro over-quotes STRING; this behavior is intentional, so that
+ the result of each step of the recursion remains as a quoted
+ string. However, it means that anchors (`^' and `$' in the REGEX
+ will line up with the extra quotations, and not the characters of
+ the original string. The overquoting is removed after the final
+ substitution.
+
+ -- Macro: m4_case (STRING, VALUE-1, IF-VALUE-1, [VALUE-2],
+ [IF-VALUE-2], ..., [DEFAULT])
+ Test STRING against multiple VALUE possibilities, resulting in the
+ first IF-VALUE for a match, or in the optional DEFAULT. This is
+ shorthand for:
+ m4_if([STRING], [VALUE-1], [IF-VALUE-1],
+ [STRING], [VALUE-2], [IF-VALUE-2], ...,
+ [DEFAULT])
+
+ -- Macro: m4_cond (TEST-1, VALUE-1, IF-VALUE-1, [TEST-2], [VALUE-2],
+ [IF-VALUE-2], ..., [DEFAULT])
+ This macro was introduced in Autoconf 2.62. Similar to `m4_if',
+ except that each TEST is expanded only when it is encountered.
+ This is useful for short-circuiting expensive tests; while `m4_if'
+ requires all its strings to be expanded up front before doing
+ comparisons, `m4_cond' only expands a TEST when all earlier tests
+ have failed.
+
+ For an example, these two sequences give the same result, but in
+ the case where `$1' does not contain a backslash, the `m4_cond'
+ version only expands `m4_index' once, instead of five times, for
+ faster computation if this is a common case for `$1'. Notice that
+ every third argument is unquoted for `m4_if', and quoted for
+ `m4_cond':
+
+ m4_if(m4_index([$1], [\]), [-1], [$2],
+ m4_eval(m4_index([$1], [\\]) >= 0), [1], [$2],
+ m4_eval(m4_index([$1], [\$]) >= 0), [1], [$2],
+ m4_eval(m4_index([$1], [\`]) >= 0), [1], [$3],
+ m4_eval(m4_index([$1], [\"]) >= 0), [1], [$3],
+ [$2])
+ m4_cond([m4_index([$1], [\])], [-1], [$2],
+ [m4_eval(m4_index([$1], [\\]) >= 0)], [1], [$2],
+ [m4_eval(m4_index([$1], [\$]) >= 0)], [1], [$2],
+ [m4_eval(m4_index([$1], [\`]) >= 0)], [1], [$3],
+ [m4_eval(m4_index([$1], [\"]) >= 0)], [1], [$3],
+ [$2])
+
+ -- Macro: m4_default (EXPR-1, EXPR-2)
+ -- Macro: m4_default_quoted (EXPR-1, EXPR-2)
+ -- Macro: m4_default_nblank (EXPR-1, [EXPR-2])
+ -- Macro: m4_default_nblank_quoted (EXPR-1, [EXPR-2])
+ If EXPR-1 contains text, use it. Otherwise, select EXPR-2.
+ `m4_default' expands the result, while `m4_default_quoted' does
+ not. Useful for providing a fixed default if the expression that
+ results in EXPR-1 would otherwise be empty. The difference
+ between `m4_default' and `m4_default_nblank' is whether an
+ argument consisting of just blanks (space, tab, newline) is
+ significant. When using the expanding versions, note that an
+ argument may contain text but still expand to an empty string.
+
+ m4_define([active], [ACTIVE])dnl
+ m4_define([empty], [])dnl
+ m4_define([demo1], [m4_default([$1], [$2])])dnl
+ m4_define([demo2], [m4_default_quoted([$1], [$2])])dnl
+ m4_define([demo3], [m4_default_nblank([$1], [$2])])dnl
+ m4_define([demo4], [m4_default_nblank_quoted([$1], [$2])])dnl
+ demo1([active], [default])
+ =>ACTIVE
+ demo1([], [active])
+ =>ACTIVE
+ demo1([empty], [text])
+ =>
+ -demo1([ ], [active])-
+ =>- -
+ demo2([active], [default])
+ =>active
+ demo2([], [active])
+ =>active
+ demo2([empty], [text])
+ =>empty
+ -demo2([ ], [active])-
+ =>- -
+ demo3([active], [default])
+ =>ACTIVE
+ demo3([], [active])
+ =>ACTIVE
+ demo3([empty], [text])
+ =>
+ -demo3([ ], [active])-
+ =>-ACTIVE-
+ demo4([active], [default])
+ =>active
+ demo4([], [active])
+ =>active
+ demo4([empty], [text])
+ =>empty
+ -demo4([ ], [active])-
+ =>-active-
+
+ -- Macro: m4_define_default (MACRO, [DEFAULT-DEFINITION])
+ If MACRO does not already have a definition, then define it to
+ DEFAULT-DEFINITION.
+
+ -- Macro: m4_ifblank (COND, [IF-BLANK], [IF-TEXT])
+ -- Macro: m4_ifnblank (COND, [IF-TEXT], [IF-BLANK])
+ If COND is empty or consists only of blanks (space, tab, newline),
+ then expand IF-BLANK; otherwise, expand IF-TEXT. Two variants
+ exist, in order to make it easier to select the correct logical
+ sense when using only two parameters. Note that this is more
+ efficient than the equivalent behavior of:
+ m4_ifval(m4_normalize([COND]), IF-TEXT, IF-BLANK)
+
+ -- Macro: m4_ifndef (MACRO, IF-NOT-DEFINED, [IF-DEFINED])
+ This is shorthand for:
+ m4_ifdef([MACRO], [IF-DEFINED], [IF-NOT-DEFINED])
+
+ -- Macro: m4_ifset (MACRO, [IF-TRUE], [IF-FALSE])
+ If MACRO is undefined, or is defined as the empty string, expand
+ to IF-FALSE. Otherwise, expands to IF-TRUE. Similar to:
+ m4_ifval(m4_defn([MACRO]), [IF-TRUE], [IF-FALSE])
+ except that it is not an error if MACRO is undefined.
+
+ -- Macro: m4_ifval (COND, [IF-TRUE], [IF-FALSE])
+ Expands to IF-TRUE if COND is not empty, otherwise to IF-FALSE.
+ This is shorthand for:
+ m4_if([COND], [], [IF-FALSE], [IF-TRUE])
+
+ -- Macro: m4_ifvaln (COND, [IF-TRUE], [IF-FALSE])
+ Similar to `m4_ifval', except guarantee that a newline is present
+ after any non-empty expansion. Often followed by `dnl'.
+
+ -- Macro: m4_n (TEXT)
+ Expand to TEXT, and add a newline if TEXT is not empty. Often
+ followed by `dnl'.
+
+
+File: autoconf.info, Node: Looping constructs, Next: Evaluation Macros, Prev: Conditional constructs, Up: Programming in M4sugar
+
+8.3.5 Looping constructs
+------------------------
+
+The following macros are useful in implementing recursive algorithms in
+M4, including loop operations. An M4 list is formed by quoting a list
+of quoted elements; generally the lists are comma-separated, although
+`m4_foreach_w' is whitespace-separated. For example, the list `[[a],
+[b,c]]' contains two elements: `[a]' and `[b,c]'. It is common to see
+lists with unquoted elements when those elements are not likely to be
+macro names, as in `[fputc_unlocked, fgetc_unlocked]'.
+
+ Although not generally recommended, it is possible for quoted lists
+to have side effects; all side effects are expanded only once, and
+prior to visiting any list element. On the other hand, the fact that
+unquoted macros are expanded exactly once means that macros without
+side effects can be used to generate lists. For example,
+
+ m4_foreach([i], [[1], [2], [3]m4_errprintn([hi])], [i])
+ error-->hi
+ =>123
+ m4_define([list], [[1], [2], [3]])
+ =>
+ m4_foreach([i], [list], [i])
+ =>123
+
+ -- Macro: m4_argn (N, [ARG]...)
+ Extracts argument N (larger than 0) from the remaining arguments.
+ If there are too few arguments, the empty string is used. For any
+ N besides 1, this is more efficient than the similar
+ `m4_car(m4_shiftn([N], [], [ARG...]))'.
+
+ -- Macro: m4_car (ARG...)
+ Expands to the quoted first ARG. Can be used with `m4_cdr' to
+ recursively iterate through a list. Generally, when using quoted
+ lists of quoted elements, `m4_car' should be called without any
+ extra quotes.
+
+ -- Macro: m4_cdr (ARG...)
+ Expands to a quoted list of all but the first ARG, or the empty
+ string if there was only one argument. Generally, when using
+ quoted lists of quoted elements, `m4_cdr' should be called without
+ any extra quotes.
+
+ For example, this is a simple implementation of `m4_map'; note how
+ each iteration checks for the end of recursion, then merely
+ applies the first argument to the first element of the list, then
+ repeats with the rest of the list. (The actual implementation in
+ M4sugar is a bit more involved, to gain some speed and share code
+ with `m4_map_sep', and also to avoid expanding side effects in
+ `$2' twice).
+ m4_define([m4_map], [m4_ifval([$2],
+ [m4_apply([$1], m4_car($2))[]$0([$1], m4_cdr($2))])])dnl
+ m4_map([ m4_eval], [[[1]], [[1+1]], [[10],[16]]])
+ => 1 2 a
+
+ -- Macro: m4_for (VAR, FIRST, LAST, [STEP], EXPRESSION)
+ Loop over the numeric values between FIRST and LAST including
+ bounds by increments of STEP. For each iteration, expand
+ EXPRESSION with the numeric value assigned to VAR. If STEP is
+ omitted, it defaults to `1' or `-1' depending on the order of the
+ limits. If given, STEP has to match this order. The number of
+ iterations is determined independently from definition of VAR;
+ iteration cannot be short-circuited or lengthened by modifying VAR
+ from within EXPRESSION.
+
+ -- Macro: m4_foreach (VAR, LIST, EXPRESSION)
+ Loop over the comma-separated M4 list LIST, assigning each value
+ to VAR, and expand EXPRESSION. The following example outputs two
+ lines:
+
+ m4_foreach([myvar], [[foo], [bar, baz]],
+ [echo myvar
+ ])dnl
+ =>echo foo
+ =>echo bar, baz
+
+ Note that for some forms of EXPRESSION, it may be faster to use
+ `m4_map_args'.
+
+ -- Macro: m4_foreach_w (VAR, LIST, EXPRESSION)
+ Loop over the white-space-separated list LIST, assigning each value
+ to VAR, and expand EXPRESSION. If VAR is only referenced once in
+ EXPRESSION, it is more efficient to use `m4_map_args_w'.
+
+ The deprecated macro `AC_FOREACH' is an alias of `m4_foreach_w'.
+
+ -- Macro: m4_map (MACRO, LIST)
+ -- Macro: m4_mapall (MACRO, LIST)
+ -- Macro: m4_map_sep (MACRO, SEPARATOR, LIST)
+ -- Macro: m4_mapall_sep (MACRO, SEPARATOR, LIST)
+ Loop over the comma separated quoted list of argument descriptions
+ in LIST, and invoke MACRO with the arguments. An argument
+ description is in turn a comma-separated quoted list of quoted
+ elements, suitable for `m4_apply'. The macros `m4_map' and
+ `m4_map_sep' ignore empty argument descriptions, while `m4_mapall'
+ and `m4_mapall_sep' invoke MACRO with no arguments. The macros
+ `m4_map_sep' and `m4_mapall_sep' additionally expand SEPARATOR
+ between invocations of MACRO.
+
+ Note that SEPARATOR is expanded, unlike in `m4_join'. When
+ separating output with commas, this means that the map result can
+ be used as a series of arguments, by using a single-quoted comma as
+ SEPARATOR, or as a single string, by using a double-quoted comma.
+
+ m4_map([m4_count], [])
+ =>
+ m4_map([ m4_count], [[],
+ [[1]],
+ [[1], [2]]])
+ => 1 2
+ m4_mapall([ m4_count], [[],
+ [[1]],
+ [[1], [2]]])
+ => 0 1 2
+ m4_map_sep([m4_eval], [,], [[[1+2]],
+ [[10], [16]]])
+ =>3,a
+ m4_map_sep([m4_echo], [,], [[[a]], [[b]]])
+ =>a,b
+ m4_count(m4_map_sep([m4_echo], [,], [[[a]], [[b]]]))
+ =>2
+ m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]])
+ =>a,b
+ m4_count(m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]]))
+ =>1
+
+ -- Macro: m4_map_args (MACRO, ARG...)
+ Repeatedly invoke MACRO with each successive ARG as its only
+ argument. In the following example, three solutions are presented
+ with the same expansion; the solution using `m4_map_args' is the
+ most efficient.
+ m4_define([active], [ACTIVE])dnl
+ m4_foreach([var], [[plain], [active]], [ m4_echo(m4_defn([var]))])
+ => plain active
+ m4_map([ m4_echo], [[[plain]], [[active]]])
+ => plain active
+ m4_map_args([ m4_echo], [plain], [active])
+ => plain active
+
+ In cases where it is useful to operate on additional parameters
+ besides the list elements, the macro `m4_curry' can be used in
+ MACRO to supply the argument currying necessary to generate the
+ desired argument list. In the following example, `list_add_n' is
+ more efficient than `list_add_x'. On the other hand, using
+ `m4_map_args_sep' can be even more efficient.
+
+ m4_define([list], [[1], [2], [3]])dnl
+ m4_define([add], [m4_eval(([$1]) + ([$2]))])dnl
+ dnl list_add_n(N, ARG...)
+ dnl Output a list consisting of each ARG added to N
+ m4_define([list_add_n],
+ [m4_shift(m4_map_args([,m4_curry([add], [$1])], m4_shift($@)))])dnl
+ list_add_n([1], list)
+ =>2,3,4
+ list_add_n([2], list)
+ =>3,4,5
+ m4_define([list_add_x],
+ [m4_shift(m4_foreach([var], m4_dquote(m4_shift($@)),
+ [,add([$1],m4_defn([var]))]))])dnl
+ list_add_x([1], list)
+ =>2,3,4
+
+ -- Macro: m4_map_args_pair (MACRO, [MACRO-END = `macro'], ARG...)
+ For every pair of arguments ARG, invoke MACRO with two arguments.
+ If there is an odd number of arguments, invoke MACRO-END, which
+ defaults to MACRO, with the remaining argument.
+
+ m4_map_args_pair([, m4_reverse], [], [1], [2], [3])
+ =>, 2, 1, 3
+ m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3])
+ =>, 2, 1, [3]
+ m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3], [4])
+ =>, 2, 1, 4, 3
+
+ -- Macro: m4_map_args_sep ([PRE], [POST], [SEP], ARG...)
+ Expand the sequence `PRE[ARG]POST' for each argument, additionally
+ expanding SEP between arguments. One common use of this macro is
+ constructing a macro call, where the opening and closing
+ parentheses are split between PRE and POST; in particular,
+ `m4_map_args([MACRO], [ARG])' is equivalent to
+ `m4_map_args_sep([MACRO(], [)], [], [ARG])'. This macro provides
+ the most efficient means for iterating over an arbitrary list of
+ arguments, particularly when repeatedly constructing a macro call
+ with more arguments than ARG.
+
+ -- Macro: m4_map_args_w (STRING, [PRE], [POST], [SEP])
+ Expand the sequence `PRE[word]POST' for each word in the
+ whitespace-separated STRING, additionally expanding SEP between
+ words. This macro provides the most efficient means for iterating
+ over a whitespace-separated string. In particular,
+ `m4_map_args_w([STRING], [ACTION(], [)])' is more efficient than
+ `m4_foreach_w([var], [STRING], [ACTION(m4_defn([var]))])'.
+
+ -- Macro: m4_shiftn (COUNT, ...)
+ -- Macro: m4_shift2 (...)
+ -- Macro: m4_shift3 (...)
+ `m4_shiftn' performs COUNT iterations of `m4_shift', along with
+ validation that enough arguments were passed in to match the shift
+ count, and that the count is positive. `m4_shift2' and
+ `m4_shift3' are specializations of `m4_shiftn', introduced in
+ Autoconf 2.62, and are more efficient for two and three shifts,
+ respectively.
+
+ -- Macro: m4_stack_foreach (MACRO, ACTION)
+ -- Macro: m4_stack_foreach_lifo (MACRO, ACTION)
+ For each of the `m4_pushdef' definitions of MACRO, expand ACTION
+ with the single argument of a definition of MACRO.
+ `m4_stack_foreach' starts with the oldest definition, while
+ `m4_stack_foreach_lifo' starts with the current definition.
+ ACTION should not push or pop definitions of MACRO, nor is there
+ any guarantee that the current definition of MACRO matches the
+ argument that was passed to ACTION. The macro `m4_curry' can be
+ used if ACTION needs more than one argument, although in that case
+ it is more efficient to use M4_STACK_FOREACH_SEP.
+
+ Due to technical limitations, there are a few low-level m4sugar
+ functions, such as `m4_pushdef', that cannot be used as the MACRO
+ argument.
+
+ m4_pushdef([a], [1])m4_pushdef([a], [2])dnl
+ m4_stack_foreach([a], [ m4_incr])
+ => 2 3
+ m4_stack_foreach_lifo([a], [ m4_curry([m4_substr], [abcd])])
+ => cd bcd
+
+ -- Macro: m4_stack_foreach_sep (MACRO, [PRE], [POST], [SEP])
+ -- Macro: m4_stack_foreach_sep_lifo (MACRO, [PRE], [POST], [SEP])
+ Expand the sequence `PRE[definition]POST' for each `m4_pushdef'
+ definition of MACRO, additionally expanding SEP between
+ definitions. `m4_stack_foreach_sep' visits the oldest definition
+ first, while `m4_stack_foreach_sep_lifo' visits the current
+ definition first. This macro provides the most efficient means
+ for iterating over a pushdef stack. In particular,
+ `m4_stack_foreach([MACRO], [ACTION])' is short for
+ `m4_stack_foreach_sep([MACRO], [ACTION(], [)])'.
+
+
+File: autoconf.info, Node: Evaluation Macros, Next: Text processing Macros, Prev: Looping constructs, Up: Programming in M4sugar
+
+8.3.6 Evaluation Macros
+-----------------------
+
+The following macros give some control over the order of the evaluation
+by adding or removing levels of quotes.
+
+ -- Macro: m4_apply (MACRO, LIST)
+ Apply the elements of the quoted, comma-separated LIST as the
+ arguments to MACRO. If LIST is empty, invoke MACRO without
+ arguments. Note the difference between `m4_indir', which expects
+ its first argument to be a macro name but can use names that are
+ otherwise invalid, and `m4_apply', where MACRO can contain other
+ text, but must end in a valid macro name.
+ m4_apply([m4_count], [])
+ =>0
+ m4_apply([m4_count], [[]])
+ =>1
+ m4_apply([m4_count], [[1], [2]])
+ =>2
+ m4_apply([m4_join], [[|], [1], [2]])
+ =>1|2
+
+ -- Macro: m4_count (ARG, ...)
+ This macro returns the decimal count of the number of arguments it
+ was passed.
+
+ -- Macro: m4_curry (MACRO, ARG...)
+ This macro performs argument currying. The expansion of this
+ macro is another macro name that expects exactly one argument;
+ that argument is then appended to the ARG list, and then MACRO is
+ expanded with the resulting argument list.
+
+ m4_curry([m4_curry], [m4_reverse], [1])([2])([3])
+ =>3, 2, 1
+
+ Unfortunately, due to a limitation in M4 1.4.x, it is not possible
+ to pass the definition of a builtin macro as the argument to the
+ output of `m4_curry'; the empty string is used instead of the
+ builtin token. This behavior is rectified by using M4 1.6 or
+ newer.
+
+ -- Macro: m4_do (ARG, ...)
+ This macro loops over its arguments and expands each ARG in
+ sequence. Its main use is for readability; it allows the use of
+ indentation and fewer `dnl' to result in the same expansion. This
+ macro guarantees that no expansion will be concatenated with
+ subsequent text; to achieve full concatenation, use
+ `m4_unquote(m4_join([], ARG...))'.
+
+ m4_define([ab],[1])m4_define([bc],[2])m4_define([abc],[3])dnl
+ m4_do([a],[b])c
+ =>abc
+ m4_unquote(m4_join([],[a],[b]))c
+ =>3
+ m4_define([a],[A])m4_define([b],[B])m4_define([c],[C])dnl
+ m4_define([AB],[4])m4_define([BC],[5])m4_define([ABC],[6])dnl
+ m4_do([a],[b])c
+ =>ABC
+ m4_unquote(m4_join([],[a],[b]))c
+ =>3
+
+ -- Macro: m4_dquote (ARG, ...)
+ Return the arguments as a quoted list of quoted arguments.
+ Conveniently, if there is just one ARG, this effectively adds a
+ level of quoting.
+
+ -- Macro: m4_dquote_elt (ARG, ...)
+ Return the arguments as a series of double-quoted arguments.
+ Whereas `m4_dquote' returns a single argument, `m4_dquote_elt'
+ returns as many arguments as it was passed.
+
+ -- Macro: m4_echo (ARG, ...)
+ Return the arguments, with the same level of quoting. Other than
+ discarding whitespace after unquoted commas, this macro is a no-op.
+
+ -- Macro: m4_expand (ARG)
+ Return the expansion of ARG as a quoted string. Whereas
+ `m4_quote' is designed to collect expanded text into a single
+ argument, `m4_expand' is designed to perform one level of expansion
+ on quoted text. One distinction is in the treatment of whitespace
+ following a comma in the original ARG. Any time multiple
+ arguments are collected into one with `m4_quote', the M4 argument
+ collection rules discard the whitespace. However, with
+ `m4_expand', whitespace is preserved, even after the expansion of
+ macros contained in ARG. Additionally, `m4_expand' is able to
+ expand text that would involve an unterminated comment, whereas
+ expanding that same text as the argument to `m4_quote' runs into
+ difficulty in finding the end of the argument. Since manipulating
+ diversions during argument collection is inherently unsafe,
+ `m4_expand' issues an error if ARG attempts to change the current
+ diversion (*note Diversion support::).
+
+ m4_define([active], [ACT, IVE])dnl
+ m4_define([active2], [[ACT, IVE]])dnl
+ m4_quote(active, active)
+ =>ACT,IVE,ACT,IVE
+ m4_expand([active, active])
+ =>ACT, IVE, ACT, IVE
+ m4_quote(active2, active2)
+ =>ACT, IVE,ACT, IVE
+ m4_expand([active2, active2])
+ =>ACT, IVE, ACT, IVE
+ m4_expand([# m4_echo])
+ =># m4_echo
+ m4_quote(# m4_echo)
+ )
+ =># m4_echo)
+ =>
+
+ Note that `m4_expand' cannot handle an ARG that expands to literal
+ unbalanced quotes, but that quadrigraphs can be used when
+ unbalanced output is necessary. Likewise, unbalanced parentheses
+ should be supplied with double quoting or a quadrigraph.
+
+ m4_define([pattern], [[!@<:@]])dnl
+ m4_define([bar], [BAR])dnl
+ m4_expand([case $foo in
+ m4_defn([pattern])@:}@ bar ;;
+ *[)] blah ;;
+ esac])
+ =>case $foo in
+ => [![]) BAR ;;
+ => *) blah ;;
+ =>esac
+
+ -- Macro: m4_ignore (...)
+ This macro was introduced in Autoconf 2.62. Expands to nothing,
+ ignoring all of its arguments. By itself, this isn't very useful.
+ However, it can be used to conditionally ignore an arbitrary
+ number of arguments, by deciding which macro name to apply to a
+ list of arguments.
+ dnl foo outputs a message only if [debug] is defined.
+ m4_define([foo],
+ [m4_ifdef([debug],[AC_MSG_NOTICE],[m4_ignore])([debug message])])
+
+ Note that for earlier versions of Autoconf, the macro `__gnu__' can
+ serve the same purpose, although it is less readable.
+
+ -- Macro: m4_make_list (ARG, ...)
+ This macro exists to aid debugging of M4sugar algorithms. Its net
+ effect is similar to `m4_dquote'--it produces a quoted list of
+ quoted arguments, for each ARG. The difference is that this
+ version uses a comma-newline separator instead of just comma, to
+ improve readability of the list; with the result that it is less
+ efficient than `m4_dquote'.
+ m4_define([zero],[0])m4_define([one],[1])m4_define([two],[2])dnl
+ m4_dquote(zero, [one], [[two]])
+ =>[0],[one],[[two]]
+ m4_make_list(zero, [one], [[two]])
+ =>[0],
+ =>[one],
+ =>[[two]]
+ m4_foreach([number], m4_dquote(zero, [one], [[two]]), [ number])
+ => 0 1 two
+ m4_foreach([number], m4_make_list(zero, [one], [[two]]), [ number])
+ => 0 1 two
+
+ -- Macro: m4_quote (ARG, ...)
+ Return the arguments as a single entity, i.e., wrap them into a
+ pair of quotes. This effectively collapses multiple arguments
+ into one, although it loses whitespace after unquoted commas in
+ the process.
+
+ -- Macro: m4_reverse (ARG, ...)
+ Outputs each argument with the same level of quoting, but in
+ reverse order, and with space following each comma for readability.
+
+ m4_define([active], [ACT,IVE])
+ =>
+ m4_reverse(active, [active])
+ =>active, IVE, ACT
+
+ -- Macro: m4_unquote (ARG, ...)
+ This macro was introduced in Autoconf 2.62. Expand each argument,
+ separated by commas. For a single ARG, this effectively removes a
+ layer of quoting, and `m4_unquote([ARG])' is more efficient than
+ the equivalent `m4_do([ARG])'. For multiple arguments, this
+ results in an unquoted list of expansions. This is commonly used
+ with `m4_split', in order to convert a single quoted list into a
+ series of quoted elements.
+
+ The following example aims at emphasizing the difference between
+several scenarios: not using these macros, using `m4_defn', using
+`m4_quote', using `m4_dquote', and using `m4_expand'.
+
+ $ cat example.m4
+ dnl Overquote, so that quotes are visible.
+ m4_define([show], [$[]1 = [$1], $[]@ = [$@]])
+ m4_define([a], [A])
+ m4_define([mkargs], [1, 2[,] 3])
+ m4_define([arg1], [[$1]])
+ m4_divert([0])dnl
+ show(a, b)
+ show([a, b])
+ show(m4_quote(a, b))
+ show(m4_dquote(a, b))
+ show(m4_expand([a, b]))
+
+ arg1(mkargs)
+ arg1([mkargs])
+ arg1(m4_defn([mkargs]))
+ arg1(m4_quote(mkargs))
+ arg1(m4_dquote(mkargs))
+ arg1(m4_expand([mkargs]))
+ $ autom4te -l m4sugar example.m4
+ $1 = A, $@ = [A],[b]
+ $1 = a, b, $@ = [a, b]
+ $1 = A,b, $@ = [A,b]
+ $1 = [A],[b], $@ = [[A],[b]]
+ $1 = A, b, $@ = [A, b]
+
+ 1
+ mkargs
+ 1, 2[,] 3
+ 1,2, 3
+ [1],[2, 3]
+ 1, 2, 3
+
+
+File: autoconf.info, Node: Text processing Macros, Next: Number processing Macros, Prev: Evaluation Macros, Up: Programming in M4sugar
+
+8.3.7 String manipulation in M4
+-------------------------------
+
+The following macros may be used to manipulate strings in M4. Many of
+the macros in this section intentionally result in quoted strings as
+output, rather than subjecting the arguments to further expansions. As
+a result, if you are manipulating text that contains active M4
+characters, the arguments are passed with single quoting rather than
+double.
+
+ -- Macro: m4_append (MACRO-NAME, STRING, [SEPARATOR])
+ -- Macro: m4_append_uniq (MACRO-NAME, STRING, [SEPARATOR] [IF-UNIQ],
+ [IF-DUPLICATE])
+ Redefine MACRO-NAME to its former contents with SEPARATOR and
+ STRING added at the end. If MACRO-NAME was undefined before (but
+ not if it was defined but empty), then no SEPARATOR is added. As
+ of Autoconf 2.62, neither STRING nor SEPARATOR are expanded during
+ this macro; instead, they are expanded when MACRO-NAME is invoked.
+
+ `m4_append' can be used to grow strings, and `m4_append_uniq' to
+ grow strings without duplicating substrings. Additionally,
+ `m4_append_uniq' takes two optional parameters as of Autoconf 2.62;
+ IF-UNIQ is expanded if STRING was appended, and IF-DUPLICATE is
+ expanded if STRING was already present. Also, `m4_append_uniq'
+ warns if SEPARATOR is not empty, but occurs within STRING, since
+ that can lead to duplicates.
+
+ Note that `m4_append' can scale linearly in the length of the final
+ string, depending on the quality of the underlying M4
+ implementation, while `m4_append_uniq' has an inherent quadratic
+ scaling factor. If an algorithm can tolerate duplicates in the
+ final string, use the former for speed. If duplicates must be
+ avoided, consider using `m4_set_add' instead (*note Set
+ manipulation Macros::).
+
+ m4_define([active], [ACTIVE])dnl
+ m4_append([sentence], [This is an])dnl
+ m4_append([sentence], [ active ])dnl
+ m4_append([sentence], [symbol.])dnl
+ sentence
+ =>This is an ACTIVE symbol.
+ m4_undefine([active])dnl
+ =>This is an active symbol.
+ m4_append_uniq([list], [one], [, ], [new], [existing])
+ =>new
+ m4_append_uniq([list], [one], [, ], [new], [existing])
+ =>existing
+ m4_append_uniq([list], [two], [, ], [new], [existing])
+ =>new
+ m4_append_uniq([list], [three], [, ], [new], [existing])
+ =>new
+ m4_append_uniq([list], [two], [, ], [new], [existing])
+ =>existing
+ list
+ =>one, two, three
+ m4_dquote(list)
+ =>[one],[two],[three]
+ m4_append([list2], [one], [[, ]])dnl
+ m4_append_uniq([list2], [two], [[, ]])dnl
+ m4_append([list2], [three], [[, ]])dnl
+ list2
+ =>one, two, three
+ m4_dquote(list2)
+ =>[one, two, three]
+
+ -- Macro: m4_append_uniq_w (MACRO-NAME, STRINGS)
+ This macro was introduced in Autoconf 2.62. It is similar to
+ `m4_append_uniq', but treats STRINGS as a whitespace separated
+ list of words to append, and only appends unique words.
+ MACRO-NAME is updated with a single space between new words.
+ m4_append_uniq_w([numbers], [1 1 2])dnl
+ m4_append_uniq_w([numbers], [ 2 3 ])dnl
+ numbers
+ =>1 2 3
+
+ -- Macro: m4_chomp (STRING)
+ -- Macro: m4_chomp_all (STRING)
+ Output STRING in quotes, but without a trailing newline. The
+ macro `m4_chomp' is slightly faster, and removes at most one
+ newline; the macro `m4_chomp_all' removes all consecutive trailing
+ newlines. Unlike `m4_flatten', embedded newlines are left intact,
+ and backslash does not influence the result.
+
+ -- Macro: m4_combine ([SEPARATOR], PREFIX-LIST, [INFIX], SUFFIX-1,
+ [SUFFIX-2], ...)
+ This macro produces a quoted string containing the pairwise
+ combination of every element of the quoted, comma-separated
+ PREFIX-LIST, and every element from the SUFFIX arguments. Each
+ pairwise combination is joined with INFIX in the middle, and
+ successive pairs are joined by SEPARATOR. No expansion occurs on
+ any of the arguments. No output occurs if either the PREFIX or
+ SUFFIX list is empty, but the lists can contain empty elements.
+ m4_define([a], [oops])dnl
+ m4_combine([, ], [[a], [b], [c]], [-], [1], [2], [3])
+ =>a-1, a-2, a-3, b-1, b-2, b-3, c-1, c-2, c-3
+ m4_combine([, ], [[a], [b]], [-])
+ =>
+ m4_combine([, ], [[a], [b]], [-], [])
+ =>a-, b-
+ m4_combine([, ], [], [-], [1], [2])
+ =>
+ m4_combine([, ], [[]], [-], [1], [2])
+ =>-1, -2
+
+ -- Macro: m4_escape (STRING)
+ Convert all instances of `[', `]', `#', and `$' within STRING into
+ their respective quadrigraphs. The result is still a quoted
+ string.
+
+ -- Macro: m4_flatten (STRING)
+ Flatten STRING into a single line. Delete all backslash-newline
+ pairs, and replace all remaining newlines with a space. The
+ result is still a quoted string.
+
+ -- Macro: m4_join ([SEPARATOR], ARGS...)
+ -- Macro: m4_joinall ([SEPARATOR], ARGS...)
+ Concatenate each ARG, separated by SEPARATOR. `joinall' uses
+ every argument, while `join' omits empty arguments so that there
+ are no back-to-back separators in the output. The result is a
+ quoted string.
+ m4_define([active], [ACTIVE])dnl
+ m4_join([|], [one], [], [active], [two])
+ =>one|active|two
+ m4_joinall([|], [one], [], [active], [two])
+ =>one||active|two
+
+ Note that if all you intend to do is join ARGS with commas between
+ them, to form a quoted list suitable for `m4_foreach', it is more
+ efficient to use `m4_dquote'.
+
+ -- Macro: m4_newline ([TEXT])
+ This macro was introduced in Autoconf 2.62, and expands to a
+ newline, followed by any TEXT. It is primarily useful for
+ maintaining macro formatting, and ensuring that M4 does not
+ discard leading whitespace during argument collection.
+
+ -- Macro: m4_normalize (STRING)
+ Remove leading and trailing spaces and tabs, sequences of
+ backslash-then-newline, and replace multiple spaces, tabs, and
+ newlines with a single space. This is a combination of
+ `m4_flatten' and `m4_strip'. To determine if STRING consists only
+ of bytes that would be removed by `m4_normalize', you can use
+ `m4_ifblank'.
+
+ -- Macro: m4_re_escape (STRING)
+ Backslash-escape all characters in STRING that are active in
+ regexps.
+
+ -- Macro: m4_split (STRING, [REGEXP = `[\t ]+'])
+ Split STRING into an M4 list of elements quoted by `[' and `]',
+ while keeping white space at the beginning and at the end. If
+ REGEXP is given, use it instead of `[\t ]+' for splitting. If
+ STRING is empty, the result is an empty list.
+
+ -- Macro: m4_strip (STRING)
+ Strip whitespace from STRING. Sequences of spaces and tabs are
+ reduced to a single space, then leading and trailing spaces are
+ removed. The result is still a quoted string. Note that this
+ does not interfere with newlines; if you want newlines stripped as
+ well, consider `m4_flatten', or do it all at once with
+ `m4_normalize'. To quickly test if STRING has only whitespace,
+ use `m4_ifblank'.
+
+ -- Macro: m4_text_box (MESSAGE, [FRAME = `-'])
+ Add a text box around MESSAGE, using FRAME as the border character
+ above and below the message. The FRAME argument must be a single
+ byte, and does not support quadrigraphs. The frame correctly
+ accounts for the subsequent expansion of MESSAGE. For example:
+ m4_define([macro], [abc])dnl
+ m4_text_box([macro])
+ =>## --- ##
+ =>## abc ##
+ =>## --- ##
+
+ The MESSAGE must contain balanced quotes and parentheses, although
+ quadrigraphs can be used to work around this.
+
+ -- Macro: m4_text_wrap (STRING, [PREFIX], [PREFIX1 = `PREFIX'], [WIDTH
+ = `79'])
+ Break STRING into a series of whitespace-separated words, then
+ output those words separated by spaces, and wrapping lines any
+ time the output would exceed WIDTH columns. If given, PREFIX1
+ begins the first line, and PREFIX begins all wrapped lines. If
+ PREFIX1 is longer than PREFIX, then the first line consists of
+ just PREFIX1. If PREFIX is longer than PREFIX1, padding is
+ inserted so that the first word of STRING begins at the same
+ indentation as all wrapped lines. Note that using literal tab
+ characters in any of the arguments will interfere with the
+ calculation of width. No expansions occur on PREFIX, PREFIX1, or
+ the words of STRING, although quadrigraphs are recognized.
+
+ For some examples:
+ m4_text_wrap([Short string */], [ ], [/* ], [20])
+ =>/* Short string */
+ m4_text_wrap([Much longer string */], [ ], [/* ], [20])
+ =>/* Much longer
+ => string */
+ m4_text_wrap([Short doc.], [ ], [ --short ], [30])
+ => --short Short doc.
+ m4_text_wrap([Short doc.], [ ], [ --too-wide ], [30])
+ => --too-wide
+ => Short doc.
+ m4_text_wrap([Super long documentation.], [ ],
+ [ --too-wide ], 30)
+ => --too-wide
+ => Super long
+ => documentation.
+
+ -- Macro: m4_tolower (STRING)
+ -- Macro: m4_toupper (STRING)
+ Return STRING with letters converted to upper or lower case,
+ respectively.
+
+
+File: autoconf.info, Node: Number processing Macros, Next: Set manipulation Macros, Prev: Text processing Macros, Up: Programming in M4sugar
+
+8.3.8 Arithmetic computation in M4
+----------------------------------
+
+The following macros facilitate integer arithmetic operations. Where a
+parameter is documented as taking an arithmetic expression, you can use
+anything that can be parsed by `m4_eval'.
+
+ -- Macro: m4_cmp (EXPR-1, EXPR-2)
+ Compare the arithmetic expressions EXPR-1 and EXPR-2, and expand
+ to `-1' if EXPR-1 is smaller, `0' if they are equal, and `1' if
+ EXPR-1 is larger.
+
+ -- Macro: m4_list_cmp (LIST-1, LIST-2)
+ Compare the two M4 lists consisting of comma-separated arithmetic
+ expressions, left to right. Expand to `-1' for the first element
+ pairing where the value from LIST-1 is smaller, `1' where the
+ value from LIST-2 is smaller, or `0' if both lists have the same
+ values. If one list is shorter than the other, the remaining
+ elements of the longer list are compared against zero.
+ m4_list_cmp([1, 0], [1])
+ =>0
+ m4_list_cmp([1, [1 * 0]], [1, 0])
+ =>0
+ m4_list_cmp([1, 2], [1, 0])
+ =>1
+ m4_list_cmp([1, [1+1], 3],[1, 2])
+ =>1
+ m4_list_cmp([1, 2, -3], [1, 2])
+ =>-1
+ m4_list_cmp([1, 0], [1, 2])
+ =>-1
+ m4_list_cmp([1], [1, 2])
+ =>-1
+
+ -- Macro: m4_max (ARG, ...)
+ This macro was introduced in Autoconf 2.62. Expand to the decimal
+ value of the maximum arithmetic expression among all the arguments.
+
+ -- Macro: m4_min (ARG, ...)
+ This macro was introduced in Autoconf 2.62. Expand to the decimal
+ value of the minimum arithmetic expression among all the arguments.
+
+ -- Macro: m4_sign (EXPR)
+ Expand to `-1' if the arithmetic expression EXPR is negative, `1'
+ if it is positive, and `0' if it is zero.
+
+ -- Macro: m4_version_compare (VERSION-1, VERSION-2)
+ This macro was introduced in Autoconf 2.53, but had a number of
+ usability limitations that were not lifted until Autoconf 2.62.
+ Compare the version strings VERSION-1 and VERSION-2, and expand to
+ `-1' if VERSION-1 is smaller, `0' if they are the same, or `1'
+ VERSION-2 is smaller. Version strings must be a list of elements
+ separated by `.', `,' or `-', where each element is a number along
+ with optional case-insensitive letters designating beta releases.
+ The comparison stops at the leftmost element that contains a
+ difference, although a 0 element compares equal to a missing
+ element.
+
+ It is permissible to include commit identifiers in VERSION, such
+ as an abbreviated SHA1 of the commit, provided there is still a
+ monotonically increasing prefix to allow for accurate version-based
+ comparisons. For example, this paragraph was written when the
+ development snapshot of autoconf claimed to be at version
+ `2.61a-248-dc51', or 248 commits after the 2.61a release, with an
+ abbreviated commit identification of `dc51'.
+
+ m4_version_compare([1.1], [2.0])
+ =>-1
+ m4_version_compare([2.0b], [2.0a])
+ =>1
+ m4_version_compare([1.1.1], [1.1.1a])
+ =>-1
+ m4_version_compare([1.2], [1.1.1a])
+ =>1
+ m4_version_compare([1.0], [1])
+ =>0
+ m4_version_compare([1.1pre], [1.1PRE])
+ =>0
+ m4_version_compare([1.1a], [1,10])
+ =>-1
+ m4_version_compare([2.61a], [2.61a-248-dc51])
+ =>-1
+ m4_version_compare([2.61b], [2.61a-248-dc51])
+ =>1
+
+ -- Macro: m4_version_prereq (VERSION, [IF-NEW-ENOUGH], [IF-OLD =
+ `m4_fatal'])
+ Compares VERSION against the version of Autoconf currently
+ running. If the running version is at VERSION or newer, expand
+ IF-NEW-ENOUGH, but if VERSION is larger than the version currently
+ executing, expand IF-OLD, which defaults to printing an error
+ message and exiting m4sugar with status 63. When given only one
+ argument, this behaves like `AC_PREREQ' (*note Versioning::).
+ Remember that the autoconf philosophy favors feature checks over
+ version checks.
+
+
+File: autoconf.info, Node: Set manipulation Macros, Next: Forbidden Patterns, Prev: Number processing Macros, Up: Programming in M4sugar
+
+8.3.9 Set manipulation in M4
+----------------------------
+
+Sometimes, it is necessary to track a set of data, where the order does
+not matter and where there are no duplicates in the set. The following
+macros facilitate set manipulations. Each set is an opaque object,
+which can only be accessed via these basic operations. The underlying
+implementation guarantees linear scaling for set creation, which is more
+efficient than using the quadratic `m4_append_uniq'. Both set names
+and values can be arbitrary strings, except for unbalanced quotes.
+This implementation ties up memory for removed elements until the next
+operation that must traverse all the elements of a set; and although
+that may slow down some operations until the memory for removed elements
+is pruned, it still guarantees linear performance.
+
+ -- Macro: m4_set_add (SET, VALUE, [IF-UNIQ], [IF-DUP])
+ Adds the string VALUE as a member of set SET. Expand IF-UNIQ if
+ the element was added, or IF-DUP if it was previously in the set.
+ Operates in amortized constant time, so that set creation scales
+ linearly.
+
+ -- Macro: m4_set_add_all (SET, VALUE...)
+ Adds each VALUE to the set SET. This is slightly more efficient
+ than repeatedly invoking `m4_set_add'.
+
+ -- Macro: m4_set_contains (SET, VALUE, [IF-PRESENT], [IF-ABSENT])
+ Expands IF-PRESENT if the string VALUE is a member of SET,
+ otherwise IF-ABSENT.
+
+ m4_set_contains([a], [1], [yes], [no])
+ =>no
+ m4_set_add([a], [1], [added], [dup])
+ =>added
+ m4_set_add([a], [1], [added], [dup])
+ =>dup
+ m4_set_contains([a], [1], [yes], [no])
+ =>yes
+ m4_set_remove([a], [1], [removed], [missing])
+ =>removed
+ m4_set_contains([a], [1], [yes], [no])
+ =>no
+ m4_set_remove([a], [1], [removed], [missing])
+ =>missing
+
+ -- Macro: m4_set_contents (SET, [SEP])
+ -- Macro: m4_set_dump (SET, [SEP])
+ Expands to a single string consisting of all the members of the set
+ SET, each separated by SEP, which is not expanded.
+ `m4_set_contents' leaves the elements in SET but reclaims any
+ memory occupied by removed elements, while `m4_set_dump' is a
+ faster one-shot action that also deletes the set. No provision is
+ made for disambiguating members that contain a non-empty SEP as a
+ substring; use `m4_set_empty' to distinguish between an empty set
+ and the set containing only the empty string. The order of the
+ output is unspecified; in the current implementation, part of the
+ speed of `m4_set_dump' results from using a different output order
+ than `m4_set_contents'. These macros scale linearly in the size
+ of the set before memory pruning, and `m4_set_contents([SET],
+ [SEP])' is faster than `m4_joinall([SEP]m4_set_listc([SET]))'.
+
+ m4_set_add_all([a], [1], [2], [3])
+ =>
+ m4_set_contents([a], [-])
+ =>1-2-3
+ m4_joinall([-]m4_set_listc([a]))
+ =>1-2-3
+ m4_set_dump([a], [-])
+ =>3-2-1
+ m4_set_contents([a])
+ =>
+ m4_set_add([a], [])
+ =>
+ m4_set_contents([a], [-])
+ =>
+
+ -- Macro: m4_set_delete (SET)
+ Delete all elements and memory associated with SET. This is
+ linear in the set size, and faster than removing one element at a
+ time.
+
+ -- Macro: m4_set_difference (SETA, SETB)
+ -- Macro: m4_set_intersection (SETA, SETB)
+ -- Macro: m4_set_union (SETA, SETB)
+ Compute the relation between SETA and SETB, and output the result
+ as a list of quoted arguments without duplicates and with a
+ leading comma. Set difference selects the elements in SETA but
+ not SETB, intersection selects only elements in both sets, and
+ union selects elements in either set. These actions are linear in
+ the sum of the set sizes. The leading comma is necessary to
+ distinguish between no elements and the empty string as the only
+ element.
+
+ m4_set_add_all([a], [1], [2], [3])
+ =>
+ m4_set_add_all([b], [3], [], [4])
+ =>
+ m4_set_difference([a], [b])
+ =>,1,2
+ m4_set_difference([b], [a])
+ =>,,4
+ m4_set_intersection([a], [b])
+ =>,3
+ m4_set_union([a], [b])
+ =>,1,2,3,,4
+
+ -- Macro: m4_set_empty (SET, [IF-EMPTY], [IF-ELEMENTS])
+ Expand IF-EMPTY if the set SET has no elements, otherwise expand
+ IF-ELEMENTS. This macro operates in constant time. Using this
+ macro can help disambiguate output from `m4_set_contents' or
+ `m4_set_list'.
+
+ -- Macro: m4_set_foreach (SET, VARIABLE, ACTION)
+ For each element in the set SET, expand ACTION with the macro
+ VARIABLE defined as the set element. Behavior is unspecified if
+ ACTION recursively lists the contents of SET (although listing
+ other sets is acceptable), or if it modifies the set in any way
+ other than removing the element currently contained in VARIABLE.
+ This macro is faster than the corresponding `m4_foreach([VARIABLE],
+ m4_indir([m4_dquote]m4_set_listc([SET])), [ACTION])', although
+ `m4_set_map' might be faster still.
+
+ m4_set_add_all([a]m4_for([i], [1], [5], [], [,i]))
+ =>
+ m4_set_contents([a])
+ =>12345
+ m4_set_foreach([a], [i],
+ [m4_if(m4_eval(i&1), [0], [m4_set_remove([a], i, [i])])])
+ =>24
+ m4_set_contents([a])
+ =>135
+
+ -- Macro: m4_set_list (SET)
+ -- Macro: m4_set_listc (SET)
+ Produce a list of arguments, where each argument is a quoted
+ element from the set SET. The variant `m4_set_listc' is
+ unambiguous, by adding a leading comma if there are any set
+ elements, whereas the variant `m4_set_list' cannot distinguish
+ between an empty set and a set containing only the empty string.
+ These can be directly used in macros that take multiple arguments,
+ such as `m4_join' or `m4_set_add_all', or wrapped by `m4_dquote'
+ for macros that take a quoted list, such as `m4_map' or
+ `m4_foreach'. Any memory occupied by removed elements is
+ reclaimed during these macros.
+
+ m4_set_add_all([a], [1], [2], [3])
+ =>
+ m4_set_list([a])
+ =>1,2,3
+ m4_set_list([b])
+ =>
+ m4_set_listc([b])
+ =>
+ m4_count(m4_set_list([b]))
+ =>1
+ m4_set_empty([b], [0], [m4_count(m4_set_list([b]))])
+ =>0
+ m4_set_add([b], [])
+ =>
+ m4_set_list([b])
+ =>
+ m4_set_listc([b])
+ =>,
+ m4_count(m4_set_list([b]))
+ =>1
+ m4_set_empty([b], [0], [m4_count(m4_set_list([b]))])
+ =>1
+
+ -- Macro: m4_set_map (SET, ACTION)
+ For each element in the set SET, expand ACTION with a single
+ argument of the set element. Behavior is unspecified if ACTION
+ recursively lists the contents of SET (although listing other sets
+ is acceptable), or if it modifies the set in any way other than
+ removing the element passed as an argument. This macro is faster
+ than either corresponding counterpart of
+ `m4_map_args([ACTION]m4_set_listc([SET]))' or
+ `m4_set_foreach([SET], [var], [ACTION(m4_defn([var]))])'. It is
+ possible to use `m4_curry' if more than one argument is needed for
+ ACTION, although it is more efficient to use `m4_set_map_sep' in
+ that case.
+
+ -- Macro: m4_set_map_sep (SET, [PRE], [POST], [SEP])
+ For each element in the set SET, expand `PRE[element]POST',
+ additionally expanding SEP between elements. Behavior is
+ unspecified if the expansion recursively lists the contents of SET
+ (although listing other sets is acceptable), or if it modifies the
+ set in any way other than removing the element visited by the
+ expansion. This macro provides the most efficient means for
+ non-destructively visiting the elements of a set; in particular,
+ `m4_set_map([SET], [ACTION])' is equivalent to
+ `m4_set_map_sep([SET], [ACTION(], [)])'.
+
+ -- Macro: m4_set_remove (SET, VALUE, [IF-PRESENT], [IF-ABSENT])
+ If VALUE is an element in the set SET, then remove it and expand
+ IF-PRESENT. Otherwise expand IF-ABSENT. This macro operates in
+ constant time so that multiple removals will scale linearly rather
+ than quadratically; but when used outside of `m4_set_foreach' or
+ `m4_set_map', it leaves memory occupied until the set is later
+ compacted by `m4_set_contents' or `m4_set_list'. Several other
+ set operations are then less efficient between the time of element
+ removal and subsequent memory compaction, but still maintain their
+ guaranteed scaling performance.
+
+ -- Macro: m4_set_size (SET)
+ Expand to the size of the set SET. This implementation operates
+ in constant time, and is thus more efficient than
+ `m4_eval(m4_count(m4_set_listc([set])) - 1)'.
+
+
+File: autoconf.info, Node: Forbidden Patterns, Prev: Set manipulation Macros, Up: Programming in M4sugar
+
+8.3.10 Forbidden Patterns
+-------------------------
+
+M4sugar provides a means to define suspicious patterns, patterns
+describing tokens which should not be found in the output. For
+instance, if an Autoconf `configure' script includes tokens such as
+`AC_DEFINE', or `dnl', then most probably something went wrong
+(typically a macro was not evaluated because of overquotation).
+
+ M4sugar forbids all the tokens matching `^_?m4_' and `^dnl$'.
+Additional layers, such as M4sh and Autoconf, add additional forbidden
+patterns to the list.
+
+ -- Macro: m4_pattern_forbid (PATTERN)
+ Declare that no token matching PATTERN must be found in the output.
+ Comments are not checked; this can be a problem if, for instance,
+ you have some macro left unexpanded after an `#include'. No
+ consensus is currently found in the Autoconf community, as some
+ people consider it should be valid to name macros in comments
+ (which doesn't make sense to the authors of this documentation:
+ input, such as macros, should be documented by `dnl' comments;
+ reserving `#'-comments to document the output).
+
+ Of course, you might encounter exceptions to these generic rules, for
+instance you might have to refer to `$m4_flags'.
+
+ -- Macro: m4_pattern_allow (PATTERN)
+ Any token matching PATTERN is allowed, including if it matches an
+ `m4_pattern_forbid' pattern.
+
+
+File: autoconf.info, Node: Debugging via autom4te, Prev: Programming in M4sugar, Up: Programming in M4
+
+8.4 Debugging via autom4te
+==========================
+
+At times, it is desirable to see what was happening inside m4, to see
+why output was not matching expectations. However, post-processing done
+by `autom4te' means that directly using the m4 builtin `m4_traceon' is
+likely to interfere with operation. Also, frequent diversion changes
+and the concept of forbidden tokens make it difficult to use `m4_defn'
+to generate inline comments in the final output.
+
+ There are a couple of tools to help with this. One is the use of the
+`--trace' option provided by `autom4te' (as well as each of the
+programs that wrap `autom4te', such as `autoconf'), in order to inspect
+when a macro is called and with which arguments. For example, when
+this paragraph was written, the autoconf version could be found by:
+
+ $ autoconf --trace=AC_INIT
+ configure.ac:23:AC_INIT:GNU Autoconf:2.63b.95-3963:bug-autoconf@gnu.org
+ $ autoconf --trace='AC_INIT:version is $2'
+ version is 2.63b.95-3963
+
+ Another trick is to print out the expansion of various m4
+expressions to standard error or to an independent file, with no
+further m4 expansion, and without interfering with diversion changes or
+the post-processing done to standard output. `m4_errprintn' shows a
+given expression on standard error. For example, if you want to see
+the expansion of an autoconf primitive or of one of your autoconf
+macros, you can do it like this:
+
+ $ cat <<\EOF > configure.ac
+ AC_INIT
+ m4_errprintn([The definition of AC_DEFINE_UNQUOTED:])
+ m4_errprintn(m4_defn([AC_DEFINE_UNQUOTED]))
+ AC_OUTPUT
+ EOF
+ $ autoconf
+ error-->The definition of AC_DEFINE_UNQUOTED:
+ error-->_AC_DEFINE_Q([], $@)
+
+
+File: autoconf.info, Node: Programming in M4sh, Next: Writing Autoconf Macros, Prev: Programming in M4, Up: Top
+
+9 Programming in M4sh
+*********************
+
+M4sh, pronounced "mash", is aiming at producing portable Bourne shell
+scripts. This name was coined by Lars J. Aas, who notes that,
+according to the Webster's Revised Unabridged Dictionary (1913):
+
+ Mash \Mash\, n. [Akin to G. meisch, maisch, meische, maische,
+ mash, wash, and prob. to AS. miscian to mix. See "Mix".]
+
+ 1. A mass of mixed ingredients reduced to a soft pulpy state by
+ beating or pressure...
+
+ 2. A mixture of meal or bran and water fed to animals.
+
+ 3. A mess; trouble. [Obs.] -Beau. & Fl.
+
+ M4sh reserves the M4 macro namespace `^_AS_' for internal use, and
+the namespace `^AS_' for M4sh macros. It also reserves the shell and
+environment variable namespace `^as_', and the here-document delimiter
+namespace `^_AS[A-Z]' in the output file. You should not define your
+own macros or output shell code that conflicts with these namespaces.
+
+* Menu:
+
+* Common Shell Constructs:: Portability layer for common shell constructs
+* Polymorphic Variables:: Support for indirect variable names
+* Initialization Macros:: Macros to establish a sane shell environment
+* File Descriptor Macros:: File descriptor macros for input and output
+
+
+File: autoconf.info, Node: Common Shell Constructs, Next: Polymorphic Variables, Up: Programming in M4sh
+
+9.1 Common Shell Constructs
+===========================
+
+M4sh provides portable alternatives for some common shell constructs
+that unfortunately are not portable in practice.
+
+ -- Macro: AS_BOX (TEXT, [CHAR = `-'])
+ Expand into shell code that will output TEXT surrounded by a box
+ with CHAR in the top and bottom border. TEXT should not contain a
+ newline, but may contain shell expansions valid for unquoted
+ here-documents. CHAR defaults to `-', but can be any character
+ except `/', `'', `"', `\', `&', or ``'. This is useful for
+ outputting a comment box into log files to separate distinct
+ phases of script operation.
+
+ -- Macro: AS_CASE (WORD, [PATTERN1], [IF-MATCHED1], ..., [DEFAULT])
+ Expand into a shell `case' statement, where WORD is matched
+ against one or more patterns. IF-MATCHED is run if the
+ corresponding pattern matched WORD, else DEFAULT is run. Avoids
+ several portability issues (*note Limitations of Shell Builtins:
+ case.).
+
+ -- Macro: AS_DIRNAME (FILE-NAME)
+ Output the directory portion of FILE-NAME. For example, if
+ `$file' is `/one/two/three', the command
+ `dir=`AS_DIRNAME(["$file"])`' sets `dir' to `/one/two'.
+
+ This interface may be improved in the future to avoid forks and
+ losing trailing newlines.
+
+ -- Macro: AS_ECHO (WORD)
+ Emits WORD to the standard output, followed by a newline. WORD
+ must be a single shell word (typically a quoted string). The
+ bytes of WORD are output as-is, even if it starts with "-" or
+ contains "\". Redirections can be placed outside the macro
+ invocation. This is much more portable than using `echo' (*note
+ Limitations of Shell Builtins: echo.).
+
+ -- Macro: AS_ECHO_N (WORD)
+ Emits WORD to the standard output, without a following newline.
+ WORD must be a single shell word (typically a quoted string) and,
+ for portability, should not include more than one newline. The
+ bytes of WORD are output as-is, even if it starts with "-" or
+ contains "\". Redirections can be placed outside the macro
+ invocation.
+
+ -- Macro: AS_ESCAPE (STRING, [CHARS = ``\"$'])
+ Expands to STRING, with any characters in CHARS escaped with a
+ backslash (`\'). CHARS should be at most four bytes long, and
+ only contain characters from the set ``\"$'; however, characters
+ may be safely listed more than once in CHARS for the sake of
+ syntax highlighting editors. The current implementation expands
+ STRING after adding escapes; if STRING contains macro calls that
+ in turn expand to text needing shell quoting, you can use
+ `AS_ESCAPE(m4_dquote(m4_expand([string])))'.
+
+ The default for CHARS (`\"$`') is the set of characters needing
+ escapes when STRING will be used literally within double quotes.
+ One common variant is the set of characters to protect when STRING
+ will be used literally within back-ticks or an unquoted
+ here-document (`\$`'). Another common variant is `""', which can
+ be used to form a double-quoted string containing the same
+ expansions that would have occurred if STRING were expanded in an
+ unquoted here-document; however, when using this variant, care
+ must be taken that STRING does not use double quotes within
+ complex variable expansions (such as `${foo-`echo "hi"`}') that
+ would be broken with improper escapes.
+
+ This macro is often used with `AS_ECHO'. For an example, observe
+ the output generated by the shell code generated from this snippet:
+
+ foo=bar
+ AS_ECHO(["AS_ESCAPE(["$foo" = ])AS_ESCAPE(["$foo"], [""])"])
+ =>"$foo" = "bar"
+ m4_define([macro], [a, [\b]])
+ AS_ECHO(["AS_ESCAPE([[macro]])"])
+ =>macro
+ AS_ECHO(["AS_ESCAPE([macro])"])
+ =>a, b
+ AS_ECHO(["AS_ESCAPE(m4_dquote(m4_expand([macro])))"])
+ =>a, \b
+
+ To escape a string that will be placed within single quotes, use:
+
+ m4_bpatsubst([[STRING]], ['], ['\\''])
+
+ -- Macro: AS_EXECUTABLE_P (FILE)
+ Emit code to probe whether FILE is a regular file with executable
+ permissions (and not a directory with search permissions). The
+ caller is responsible for quoting FILE.
+
+ -- Macro: AS_EXIT ([STATUS = `$?'])
+ Emit code to exit the shell with STATUS, defaulting to `$?'. This
+ macro works around shells that see the exit status of the command
+ prior to `exit' inside a `trap 0' handler (*note Limitations of
+ Shell Builtins: trap.).
+
+ -- Macro: AS_IF (TEST1, [RUN-IF-TRUE1], ..., [RUN-IF-FALSE])
+ Run shell code TEST1. If TEST1 exits with a zero status then run
+ shell code RUN-IF-TRUE1, else examine further tests. If no test
+ exits with a zero status, run shell code RUN-IF-FALSE, with
+ simplifications if either RUN-IF-TRUE1 or RUN-IF-FALSE is empty.
+ For example,
+
+ AS_IF([test "x$foo" = xyes], [HANDLE_FOO([yes])],
+ [test "x$foo" != xno], [HANDLE_FOO([maybe])],
+ [echo foo not specified])
+
+ ensures any required macros of `HANDLE_FOO' are expanded before
+ the first test.
+
+ -- Macro: AS_MKDIR_P (FILE-NAME)
+ Make the directory FILE-NAME, including intervening directories as
+ necessary. This is equivalent to `mkdir -p -- FILE-NAME', except
+ that it is portable to older versions of `mkdir' that lack support
+ for the `-p' option or for the `--' delimiter (*note Limitations
+ of Usual Tools: mkdir.). Also, `AS_MKDIR_P' succeeds if FILE-NAME
+ is a symbolic link to an existing directory, even though Posix is
+ unclear whether `mkdir -p' should succeed in that case. If
+ creation of FILE-NAME fails, exit the script.
+
+ Also see the `AC_PROG_MKDIR_P' macro (*note Particular Programs::).
+
+ -- Macro: AS_SET_STATUS (STATUS)
+ Emit shell code to set the value of `$?' to STATUS, as efficiently
+ as possible. However, this is not guaranteed to abort a shell
+ running with `set -e' (*note Limitations of Shell Builtins: set.).
+ This should also be used at the end of a complex shell function
+ instead of `return' (*note Shell Functions::) to avoid a DJGPP
+ shell bug.
+
+ -- Macro: AS_TR_CPP (EXPRESSION)
+ Transform EXPRESSION into a valid right-hand side for a C
+ `#define'. For example:
+
+ # This outputs "#define HAVE_CHAR_P 1".
+ # Notice the m4 quoting around #, to prevent an m4 comment
+ type="char *"
+ echo "[#]define AS_TR_CPP([HAVE_$type]) 1"
+
+ -- Macro: AS_TR_SH (EXPRESSION)
+ Transform EXPRESSION into shell code that generates a valid shell
+ variable name. The result is literal when possible at m4 time,
+ but must be used with `eval' if EXPRESSION causes shell
+ indirections. For example:
+
+ # This outputs "Have it!".
+ header="sys/some file.h"
+ eval AS_TR_SH([HAVE_$header])=yes
+ if test "x$HAVE_sys_some_file_h" = xyes; then echo "Have it!"; fi
+
+ -- Macro: AS_SET_CATFILE (VAR, DIR, FILE)
+ Set the polymorphic shell variable VAR to DIR/FILE, but optimizing
+ the common cases (DIR or FILE is `.', FILE is absolute, etc.).
+
+ -- Macro: AS_UNSET (VAR)
+ Unsets the shell variable VAR, working around bugs in older shells
+ (*note Limitations of Shell Builtins: unset.). VAR can be a
+ literal or indirect variable name.
+
+ -- Macro: AS_VERSION_COMPARE (VERSION-1, VERSION-2, [ACTION-IF-LESS],
+ [ACTION-IF-EQUAL], [ACTION-IF-GREATER])
+ Compare two strings VERSION-1 and VERSION-2, possibly containing
+ shell variables, as version strings, and expand ACTION-IF-LESS,
+ ACTION-IF-EQUAL, or ACTION-IF-GREATER depending upon the result.
+ The algorithm to compare is similar to the one used by strverscmp
+ in glibc (*note String/Array Comparison: (libc)String/Array
+ Comparison.).
+
+
+File: autoconf.info, Node: Polymorphic Variables, Next: Initialization Macros, Prev: Common Shell Constructs, Up: Programming in M4sh
+
+9.2 Support for indirect variable names
+=======================================
+
+Often, it is convenient to write a macro that will emit shell code
+operating on a shell variable. The simplest case is when the variable
+name is known. But a more powerful idiom is writing shell code that can
+work through an indirection, where another variable or command
+substitution produces the name of the variable to actually manipulate.
+M4sh supports the notion of polymorphic shell variables, making it easy
+to write a macro that can deal with either literal or indirect variable
+names and output shell code appropriate for both use cases. Behavior is
+undefined if expansion of an indirect variable does not result in a
+literal variable name.
+
+ -- Macro: AS_LITERAL_IF (EXPRESSION, [IF-LITERAL], [IF-NOT],
+ [IF-SIMPLE-REF = `IF-NOT'])
+ -- Macro: AS_LITERAL_WORD_IF (EXPRESSION, [IF-LITERAL], [IF-NOT],
+ [IF-SIMPLE-REF = `IF-NOT'])
+ If the expansion of EXPRESSION is definitely a shell literal,
+ expand IF-LITERAL. If the expansion of EXPRESSION looks like it
+ might contain shell indirections (such as `$var' or ``expr`'),
+ then IF-NOT is expanded. Sometimes, it is possible to output
+ optimized code if EXPRESSION consists only of shell variable
+ expansions (such as `${var}'), in which case IF-SIMPLE-REF can be
+ provided; but defaulting to IF-NOT should always be safe.
+ `AS_LITERAL_WORD_IF' only expands IF-LITERAL if EXPRESSION looks
+ like a single shell word, containing no whitespace; while
+ `AS_LITERAL_IF' allows whitespace in EXPRESSION.
+
+ In order to reduce the time spent recognizing whether an
+ EXPRESSION qualifies as a literal or a simple indirection, the
+ implementation is somewhat conservative: EXPRESSION must be a
+ single shell word (possibly after stripping whitespace),
+ consisting only of bytes that would have the same meaning whether
+ unquoted or enclosed in double quotes (for example, `a.b' results
+ in IF-LITERAL, even though it is not a valid shell variable name;
+ while both `'a'' and `[$]' result in IF-NOT, because they behave
+ differently than `"'a'"' and `"[$]"'). This macro can be used in
+ contexts for recognizing portable file names (such as in the
+ implementation of `AC_LIBSOURCE'), or coupled with some
+ transliterations for forming valid variable names (such as in the
+ implementation of `AS_TR_SH', which uses an additional
+ `m4_translit' to convert `.' to `_').
+
+ This example shows how to read the contents of the shell variable
+ `bar', exercising all three arguments to `AS_LITERAL_IF'. It
+ results in a script that will output the line `hello' three times.
+
+ AC_DEFUN([MY_ACTION],
+ [AS_LITERAL_IF([$1],
+ [echo "$$1"],
+ [AS_VAR_COPY([var], [$1])
+ echo "$var"],
+ [eval 'echo "$'"$1"\"])])
+ foo=bar bar=hello
+ MY_ACTION([bar])
+ MY_ACTION([`echo bar`])
+ MY_ACTION([$foo])
+
+ -- Macro: AS_VAR_APPEND (VAR, TEXT)
+ Emit shell code to append the shell expansion of TEXT to the end
+ of the current contents of the polymorphic shell variable VAR,
+ taking advantage of shells that provide the `+=' extension for more
+ efficient scaling.
+
+ For situations where the final contents of VAR are relatively
+ short (less than 256 bytes), it is more efficient to use the
+ simpler code sequence of `VAR=${VAR}TEXT' (or its polymorphic
+ equivalent of `AS_VAR_COPY([t], [VAR])' and `AS_VAR_SET([VAR],
+ ["$t"TEXT])'). But in the case when the script will be repeatedly
+ appending text into `var', issues of scaling start to become
+ apparent. A naive implementation requires execution time linear
+ to the length of the current contents of VAR as well as the length
+ of TEXT for a single append, for an overall quadratic scaling with
+ multiple appends. This macro takes advantage of shells which
+ provide the extension `VAR+=TEXT', which can provide amortized
+ constant time for a single append, for an overall linear scaling
+ with multiple appends. Note that unlike `AS_VAR_SET', this macro
+ requires that TEXT be quoted properly to avoid field splitting and
+ file name expansion.
+
+ -- Macro: AS_VAR_ARITH (VAR, EXPRESSION)
+ Emit shell code to compute the arithmetic expansion of EXPRESSION,
+ assigning the result as the contents of the polymorphic shell
+ variable VAR. The code takes advantage of shells that provide
+ `$(())' for fewer forks, but uses `expr' as a fallback.
+ Therefore, the syntax for a valid EXPRESSION is rather limited:
+ all operators must occur as separate shell arguments and with
+ proper quoting, there is no portable equality operator, all
+ variables containing numeric values must be expanded prior to the
+ computation, all numeric values must be provided in decimal
+ without leading zeroes, and the first shell argument should not be
+ a negative number. In the following example, this snippet will
+ print `(2+3)*4 == 20'.
+
+ bar=3
+ AS_VAR_ARITH([foo], [\( 2 + $bar \) \* 4])
+ echo "(2+$bar)*4 == $foo"
+
+ -- Macro: AS_VAR_COPY (DEST, SOURCE)
+ Emit shell code to assign the contents of the polymorphic shell
+ variable SOURCE to the polymorphic shell variable DEST. For
+ example, executing this M4sh snippet will output `bar hi':
+
+ foo=bar bar=hi
+ AS_VAR_COPY([a], [foo])
+ AS_VAR_COPY([b], [$foo])
+ echo "$a $b"
+
+ When it is necessary to access the contents of an indirect variable
+ inside a shell double-quoted context, the recommended idiom is to
+ first copy the contents into a temporary literal shell variable.
+
+ for header in stdint_h inttypes_h ; do
+ AS_VAR_COPY([var], [ac_cv_header_$header])
+ echo "$header detected: $var"
+ done
+
+ -- Macro: AS_VAR_IF (VAR, [WORD], [IF-EQUAL], [IF-NOT-EQUAL])
+ Output a shell conditional statement. If the contents of the
+ polymorphic shell variable VAR match the string WORD, execute
+ IF-EQUAL; otherwise execute IF-NOT-EQUAL. WORD must be a single
+ shell word (typically a quoted string). Avoids shell bugs if an
+ interrupt signal arrives while a command substitution in VAR is
+ being expanded.
+
+ -- Macro: AS_VAR_PUSHDEF (M4-NAME, VALUE)
+ -- Macro: AS_VAR_POPDEF (M4-NAME)
+ A common M4sh idiom involves composing shell variable names from
+ an m4 argument (for example, writing a macro that uses a cache
+ variable). VALUE can be an arbitrary string, which will be
+ transliterated into a valid shell name by `AS_TR_SH'. In order to
+ access the composed variable name based on VALUE, it is easier to
+ declare a temporary m4 macro M4-NAME with `AS_VAR_PUSHDEF', then
+ use that macro as the argument to subsequent `AS_VAR' macros as a
+ polymorphic variable name, and finally free the temporary macro
+ with `AS_VAR_POPDEF'. These macros are often followed with `dnl',
+ to avoid excess newlines in the output.
+
+ Here is an involved example, that shows the power of writing
+ macros that can handle composed shell variable names:
+
+ m4_define([MY_CHECK_HEADER],
+ [AS_VAR_PUSHDEF([my_Header], [ac_cv_header_$1])dnl
+ AS_VAR_IF([my_Header], [yes], [echo "header $1 detected"])dnl
+ AS_VAR_POPDEF([my_Header])dnl
+ ])
+ MY_CHECK_HEADER([stdint.h])
+ for header in inttypes.h stdlib.h ; do
+ MY_CHECK_HEADER([$header])
+ done
+
+ In the above example, `MY_CHECK_HEADER' can operate on polymorphic
+ variable names. In the first invocation, the m4 argument is
+ `stdint.h', which transliterates into a literal `stdint_h'. As a
+ result, the temporary macro `my_Header' expands to the literal
+ shell name `ac_cv_header_stdint_h'. In the second invocation, the
+ m4 argument to `MY_CHECK_HEADER' is `$header', and the temporary
+ macro `my_Header' expands to the indirect shell name
+ `$as_my_Header'. During the shell execution of the for loop, when
+ `$header' contains `inttypes.h', then `$as_my_Header' contains
+ `ac_cv_header_inttypes_h'. If this script is then run on a
+ platform where all three headers have been previously detected, the
+ output of the script will include:
+
+ header stdint.h detected
+ header inttypes.h detected
+ header stdlib.h detected
+
+ -- Macro: AS_VAR_SET (VAR, [VALUE])
+ Emit shell code to assign the contents of the polymorphic shell
+ variable VAR to the shell expansion of VALUE. VALUE is not
+ subject to field splitting or file name expansion, so if command
+ substitution is used, it may be done with ``""`' rather than using
+ an intermediate variable (*note Shell Substitutions::). However,
+ VALUE does undergo rescanning for additional macro names; behavior
+ is unspecified if late expansion results in any shell
+ meta-characters.
+
+ -- Macro: AS_VAR_SET_IF (VAR, [IF-SET], [IF-UNDEF])
+ Emit a shell conditional statement, which executes IF-SET if the
+ polymorphic shell variable `var' is set to any value, and IF-UNDEF
+ otherwise.
+
+ -- Macro: AS_VAR_TEST_SET (VAR)
+ Emit a shell statement that results in a successful exit status
+ only if the polymorphic shell variable `var' is set.
+
+
+File: autoconf.info, Node: Initialization Macros, Next: File Descriptor Macros, Prev: Polymorphic Variables, Up: Programming in M4sh
+
+9.3 Initialization Macros
+=========================
+
+ -- Macro: AS_BOURNE_COMPATIBLE
+ Set up the shell to be more compatible with the Bourne shell as
+ standardized by Posix, if possible. This may involve setting
+ environment variables, or setting options, or similar
+ implementation-specific actions. This macro is deprecated, since
+ `AS_INIT' already invokes it.
+
+ -- Macro: AS_INIT
+ Initialize the M4sh environment. This macro calls `m4_init', then
+ outputs the `#! /bin/sh' line, a notice about where the output was
+ generated from, and code to sanitize the environment for the rest
+ of the script. Among other initializations, this sets `SHELL' to
+ the shell chosen to run the script (*note CONFIG_SHELL::), and
+ `LC_ALL' to ensure the C locale. Finally, it changes the current
+ diversion to `BODY'. `AS_INIT' is called automatically by
+ `AC_INIT' and `AT_INIT', so shell code in `configure',
+ `config.status', and `testsuite' all benefit from a sanitized
+ shell environment.
+
+ -- Macro: AS_INIT_GENERATED (FILE, [COMMENT])
+ Emit shell code to start the creation of a subsidiary shell script
+ in FILE, including changing FILE to be executable. This macro
+ populates the child script with information learned from the parent
+ (thus, the emitted code is equivalent in effect, but more
+ efficient, than the code output by `AS_INIT',
+ `AS_BOURNE_COMPATIBLE', and `AS_SHELL_SANITIZE'). If present,
+ COMMENT is output near the beginning of the child, prior to the
+ shell initialization code, and is subject to parameter expansion,
+ command substitution, and backslash quote removal. The parent
+ script should check the exit status after this macro, in case FILE
+ could not be properly created (for example, if the disk was full).
+ If successfully created, the parent script can then proceed to
+ append additional M4sh constructs into the child script.
+
+ Note that the child script starts life without a log file open, so
+ if the parent script uses logging (*note AS_MESSAGE_LOG_FD::), you
+ must temporarily disable any attempts to use the log file until
+ after emitting code to open a log within the child. On the other
+ hand, if the parent script has `AS_MESSAGE_FD' redirected
+ somewhere besides `1', then the child script already has code that
+ copies stdout to that descriptor. Currently, the suggested idiom
+ for writing a M4sh shell script from within another script is:
+
+ AS_INIT_GENERATED([FILE], [[# My child script.
+ ]]) || { AS_ECHO(["Failed to create child script"]); AS_EXIT; }
+ m4_pushdef([AS_MESSAGE_LOG_FD])dnl
+ cat >> "FILE" <<\__EOF__
+ # Code to initialize AS_MESSAGE_LOG_FD
+ m4_popdef([AS_MESSAGE_LOG_FD])dnl
+ # Additional code
+ __EOF__
+
+ This, however, may change in the future as the M4sh interface is
+ stabilized further.
+
+ Also, be aware that use of `LINENO' within the child script may
+ report line numbers relative to their location in the parent
+ script, even when using `AS_LINENO_PREPARE', if the parent script
+ was unable to locate a shell with working `LINENO' support.
+
+ -- Macro: AS_LINENO_PREPARE
+ Find a shell that supports the special variable `LINENO', which
+ contains the number of the currently executing line. This macro is
+ automatically invoked by `AC_INIT' in configure scripts.
+
+ -- Macro: AS_ME_PREPARE
+ Set up variable `as_me' to be the basename of the currently
+ executing script. This macro is automatically invoked by
+ `AC_INIT' in configure scripts.
+
+ -- Macro: AS_TMPDIR (PREFIX, [DIR = `${TMPDIR:=/tmp}'])
+ Create, as safely as possible, a temporary sub-directory within
+ DIR with a name starting with PREFIX. PREFIX should be 2-4
+ characters, to make it slightly easier to identify the owner of
+ the directory. If DIR is omitted, then the value of `TMPDIR' will
+ be used (defaulting to `/tmp'). On success, the name of the newly
+ created directory is stored in the shell variable `tmp'. On
+ error, the script is aborted.
+
+ Typically, this macro is coupled with some exit traps to delete
+ the created directory and its contents on exit or interrupt.
+ However, there is a slight window between when the directory is
+ created and when the name is actually known to the shell, so an
+ interrupt at the right moment might leave the temporary directory
+ behind. Hence it is important to use a PREFIX that makes it
+ easier to determine if a leftover temporary directory from an
+ interrupted script is safe to delete.
+
+ The use of the output variable `$tmp' rather than something in the
+ `as_' namespace is historical; it has the unfortunate consequence
+ that reusing this otherwise common name for any other purpose
+ inside your script has the potential to break any cleanup traps
+ designed to remove the temporary directory.
+
+ -- Macro: AS_SHELL_SANITIZE
+ Initialize the shell suitably for `configure' scripts. This has
+ the effect of `AS_BOURNE_COMPATIBLE', and sets some other
+ environment variables for predictable results from configuration
+ tests. For example, it sets `LC_ALL' to change to the default C
+ locale. *Note Special Shell Variables::. This macro is
+ deprecated, since `AS_INIT' already invokes it.
+
+
+File: autoconf.info, Node: File Descriptor Macros, Prev: Initialization Macros, Up: Programming in M4sh
+
+9.4 File Descriptor Macros
+==========================
+
+The following macros define file descriptors used to output messages
+(or input values) from `configure' scripts. For example:
+
+ echo "$wombats found" >&AS_MESSAGE_LOG_FD
+ echo 'Enter desired kangaroo count:' >&AS_MESSAGE_FD
+ read kangaroos <&AS_ORIGINAL_STDIN_FD`
+
+However doing so is seldom needed, because Autoconf provides higher
+level macros as described below.
+
+ -- Macro: AS_MESSAGE_FD
+ The file descriptor for `checking for...' messages and results.
+ By default, `AS_INIT' sets this to `1' for standalone M4sh
+ clients. However, `AC_INIT' shuffles things around to another file
+ descriptor, in order to allow the `-q' option of `configure' to
+ choose whether messages should go to the script's standard output
+ or be discarded.
+
+ If you want to display some messages, consider using one of the
+ printing macros (*note Printing Messages::) instead. Copies of
+ messages output via these macros are also recorded in `config.log'.
+
+ -- Macro: AS_MESSAGE_LOG_FD
+ This must either be empty, or expand to a file descriptor for log
+ messages. By default, `AS_INIT' sets this macro to the empty
+ string for standalone M4sh clients, thus disabling logging.
+ However, `AC_INIT' shuffles things around so that both `configure'
+ and `config.status' use `config.log' for log messages. Macros
+ that run tools, like `AC_COMPILE_IFELSE' (*note Running the
+ Compiler::), redirect all output to this descriptor. You may want
+ to do so if you develop such a low-level macro.
+
+ -- Macro: AS_ORIGINAL_STDIN_FD
+ This must expand to a file descriptor for the original standard
+ input. By default, `AS_INIT' sets this macro to `0' for standalone
+ M4sh clients. However, `AC_INIT' shuffles things around for
+ safety.
+
+ When `configure' runs, it may accidentally execute an interactive
+ command that has the same name as the non-interactive meant to be
+ used or checked. If the standard input was the terminal, such
+ interactive programs would cause `configure' to stop, pending some
+ user input. Therefore `configure' redirects its standard input
+ from `/dev/null' during its initialization. This is not normally
+ a problem, since `configure' normally does not need user input.
+
+ In the extreme case where your `configure' script really needs to
+ obtain some values from the original standard input, you can read
+ them explicitly from `AS_ORIGINAL_STDIN_FD'.
+
+
+File: autoconf.info, Node: Writing Autoconf Macros, Next: Portable Shell, Prev: Programming in M4sh, Up: Top
+
+10 Writing Autoconf Macros
+**************************
+
+When you write a feature test that could be applicable to more than one
+software package, the best thing to do is encapsulate it in a new macro.
+Here are some instructions and guidelines for writing Autoconf macros.
+
+* Menu:
+
+* Macro Definitions:: Basic format of an Autoconf macro
+* Macro Names:: What to call your new macros
+* Reporting Messages:: Notifying `autoconf' users
+* Dependencies Between Macros:: What to do when macros depend on other macros
+* Obsoleting Macros:: Warning about old ways of doing things
+* Coding Style:: Writing Autoconf macros a` la Autoconf
+
+
+File: autoconf.info, Node: Macro Definitions, Next: Macro Names, Up: Writing Autoconf Macros
+
+10.1 Macro Definitions
+======================
+
+ -- Macro: AC_DEFUN (NAME, [BODY])
+ Autoconf macros are defined using the `AC_DEFUN' macro, which is
+ similar to the M4 builtin `m4_define' macro; this creates a macro
+ named NAME and with BODY as its expansion. In addition to
+ defining a macro, `AC_DEFUN' adds to it some code that is used to
+ constrain the order in which macros are called, while avoiding
+ redundant output (*note Prerequisite Macros::).
+
+ An Autoconf macro definition looks like this:
+
+ AC_DEFUN(MACRO-NAME, MACRO-BODY)
+
+ You can refer to any arguments passed to the macro as `$1', `$2',
+etc. *Note How to define new macros: (m4.info)Definitions, for more
+complete information on writing M4 macros.
+
+ Most macros fall in one of two general categories. The first
+category includes macros which take arguments, in order to generate
+output parameterized by those arguments. Macros in this category are
+designed to be directly expanded, often multiple times, and should not
+be used as the argument to `AC_REQUIRE'. The other category includes
+macros which are shorthand for a fixed block of text, and therefore do
+not take arguments. For this category of macros, directly expanding
+the macro multiple times results in redundant output, so it is more
+common to use the macro as the argument to `AC_REQUIRE', or to declare
+the macro with `AC_DEFUN_ONCE' (*note One-Shot Macros::).
+
+ Be sure to properly quote both the MACRO-BODY _and_ the MACRO-NAME
+to avoid any problems if the macro happens to have been previously
+defined.
+
+ Each macro should have a header comment that gives its prototype,
+and a brief description. When arguments have default values, display
+them in the prototype. For example:
+
+ # AC_MSG_ERROR(ERROR, [EXIT-STATUS = 1])
+ # --------------------------------------
+ m4_define([AC_MSG_ERROR],
+ [{ AS_MESSAGE([error: $1], [2])
+ exit m4_default([$2], [1]); }])
+
+ Comments about the macro should be left in the header comment. Most
+other comments make their way into `configure', so just keep using `#'
+to introduce comments.
+
+ If you have some special comments about pure M4 code, comments that
+make no sense in `configure' and in the header comment, then use the
+builtin `dnl': it causes M4 to discard the text through the next
+newline.
+
+ Keep in mind that `dnl' is rarely needed to introduce comments;
+`dnl' is more useful to get rid of the newlines following macros that
+produce no output, such as `AC_REQUIRE'.
+
+ Public third-party macros need to use `AC_DEFUN', and not
+`m4_define', in order to be found by `aclocal' (*note Extending
+aclocal: (automake)Extending aclocal.). Additionally, if it is ever
+determined that a macro should be made obsolete, it is easy to convert
+from `AC_DEFUN' to `AU_DEFUN' in order to have `autoupdate' assist the
+user in choosing a better alternative, but there is no corresponding
+way to make `m4_define' issue an upgrade notice (*note AU_DEFUN::).
+
+ There is another subtle, but important, difference between using
+`m4_define' and `AC_DEFUN': only the former is unaffected by
+`AC_REQUIRE'. When writing a file, it is always safe to replace a
+block of text with a `m4_define' macro that will expand to the same
+text. But replacing a block of text with an `AC_DEFUN' macro with the
+same content does not necessarily give the same results, because it
+changes the location where any embedded but unsatisfied `AC_REQUIRE'
+invocations within the block will be expanded. For an example of this,
+see *note Expanded Before Required::.
+
+
+File: autoconf.info, Node: Macro Names, Next: Reporting Messages, Prev: Macro Definitions, Up: Writing Autoconf Macros
+
+10.2 Macro Names
+================
+
+All of the public Autoconf macros have all-uppercase names in the
+namespace `^AC_' to prevent them from accidentally conflicting with
+other text; Autoconf also reserves the namespace `^_AC_' for internal
+macros. All shell variables that they use for internal purposes have
+mostly-lowercase names starting with `ac_'. Autoconf also uses
+here-document delimiters in the namespace `^_AC[A-Z]'. During
+`configure', files produced by Autoconf make heavy use of the file
+system namespace `^conf'.
+
+ Since Autoconf is built on top of M4sugar (*note Programming in
+M4sugar::) and M4sh (*note Programming in M4sh::), you must also be
+aware of those namespaces (`^_?\(m4\|AS\)_'). And since `configure.ac'
+is also designed to be scanned by Autoheader, Autoscan, Autoupdate, and
+Automake, you should be aware of the `^_?A[HNUM]_' namespaces. In
+general, you _should not use_ the namespace of a package that does not
+own the macro or shell code you are writing.
+
+ To ensure that your macros don't conflict with present or future
+Autoconf macros, you should prefix your own macro names and any shell
+variables they use with some other sequence. Possibilities include your
+initials, or an abbreviation for the name of your organization or
+software package. Historically, people have not always followed the
+rule of using a namespace appropriate for their package, and this has
+made it difficult for determining the origin of a macro (and where to
+report bugs about that macro), as well as difficult for the true
+namespace owner to add new macros without interference from pre-existing
+uses of third-party macros. Perhaps the best example of this confusion
+is the `AM_GNU_GETTEXT' macro, which belongs, not to Automake, but to
+Gettext.
+
+ Most of the Autoconf macros' names follow a structured naming
+convention that indicates the kind of feature check by the name. The
+macro names consist of several words, separated by underscores, going
+from most general to most specific. The names of their cache variables
+use the same convention (*note Cache Variable Names::, for more
+information on them).
+
+ The first word of the name after the namespace initials (such as
+`AC_') usually tells the category of the feature being tested. Here
+are the categories used in Autoconf for specific test macros, the kind
+of macro that you are more likely to write. They are also used for
+cache variables, in all-lowercase. Use them where applicable; where
+they're not, invent your own categories.
+
+`C'
+ C language builtin features.
+
+`DECL'
+ Declarations of C variables in header files.
+
+`FUNC'
+ Functions in libraries.
+
+`GROUP'
+ Posix group owners of files.
+
+`HEADER'
+ Header files.
+
+`LIB'
+ C libraries.
+
+`PROG'
+ The base names of programs.
+
+`MEMBER'
+ Members of aggregates.
+
+`SYS'
+ Operating system features.
+
+`TYPE'
+ C builtin or declared types.
+
+`VAR'
+ C variables in libraries.
+
+ After the category comes the name of the particular feature being
+tested. Any further words in the macro name indicate particular aspects
+of the feature. For example, `AC_PROG_CC_STDC' checks whether the C
+compiler supports ISO Standard C.
+
+ An internal macro should have a name that starts with an underscore;
+Autoconf internals should therefore start with `_AC_'. Additionally, a
+macro that is an internal subroutine of another macro should have a
+name that starts with an underscore and the name of that other macro,
+followed by one or more words saying what the internal macro does. For
+example, `AC_PATH_X' has internal macros `_AC_PATH_X_XMKMF' and
+`_AC_PATH_X_DIRECT'.
+
+
+File: autoconf.info, Node: Reporting Messages, Next: Dependencies Between Macros, Prev: Macro Names, Up: Writing Autoconf Macros
+
+10.3 Reporting Messages
+=======================
+
+When macros statically diagnose abnormal situations, benign or fatal, it
+is possible to make `autoconf' detect the problem, and refuse to create
+`configure' in the case of an error. The macros in this section are
+considered obsolescent, and new code should use M4sugar macros for this
+purpose, see *note Diagnostic Macros::.
+
+ On the other hand, it is possible to want to detect errors when
+`configure' is run, which are dependent on the environment of the user
+rather than the maintainer. For dynamic diagnostics, see *note
+Printing Messages::.
+
+ -- Macro: AC_DIAGNOSE (CATEGORY, MESSAGE)
+ Report MESSAGE as a warning (or as an error if requested by the
+ user) if warnings of the CATEGORY are turned on. This macro is
+ obsolescent; you are encouraged to use:
+ m4_warn([CATEGORY], [MESSAGE])
+ instead. *Note m4_warn::, for more details, including valid
+ CATEGORY names.
+
+ -- Macro: AC_WARNING (MESSAGE)
+ Report MESSAGE as a syntax warning. This macro is obsolescent;
+ you are encouraged to use:
+ m4_warn([syntax], [MESSAGE])
+ instead. *Note m4_warn::, for more details, as well as better
+ finer-grained categories of warnings (not all problems have to do
+ with syntax).
+
+ -- Macro: AC_FATAL (MESSAGE)
+ Report a severe error MESSAGE, and have `autoconf' die. This
+ macro is obsolescent; you are encouraged to use:
+ m4_fatal([MESSAGE])
+ instead. *Note m4_fatal::, for more details.
+
+ When the user runs `autoconf -W error', warnings from `m4_warn'
+(including those issued through `AC_DIAGNOSE' and `AC_WARNING') are
+reported as errors, see *note autoconf Invocation::.
+
+
+File: autoconf.info, Node: Dependencies Between Macros, Next: Obsoleting Macros, Prev: Reporting Messages, Up: Writing Autoconf Macros
+
+10.4 Dependencies Between Macros
+================================
+
+Some Autoconf macros depend on other macros having been called first in
+order to work correctly. Autoconf provides a way to ensure that certain
+macros are called if needed and a way to warn the user if macros are
+called in an order that might cause incorrect operation.
+
+* Menu:
+
+* Prerequisite Macros:: Ensuring required information
+* Suggested Ordering:: Warning about possible ordering problems
+* One-Shot Macros:: Ensuring a macro is called only once
+
+
+File: autoconf.info, Node: Prerequisite Macros, Next: Suggested Ordering, Up: Dependencies Between Macros
+
+10.4.1 Prerequisite Macros
+--------------------------
+
+A macro that you write might need to use values that have previously
+been computed by other macros. For example, `AC_DECL_YYTEXT' examines
+the output of `flex' or `lex', so it depends on `AC_PROG_LEX' having
+been called first to set the shell variable `LEX'.
+
+ Rather than forcing the user of the macros to keep track of the
+dependencies between them, you can use the `AC_REQUIRE' macro to do it
+automatically. `AC_REQUIRE' can ensure that a macro is only called if
+it is needed, and only called once.
+
+ -- Macro: AC_REQUIRE (MACRO-NAME)
+ If the M4 macro MACRO-NAME has not already been called, call it
+ (without any arguments). Make sure to quote MACRO-NAME with
+ square brackets. MACRO-NAME must have been defined using
+ `AC_DEFUN' or else contain a call to `AC_PROVIDE' to indicate that
+ it has been called.
+
+ `AC_REQUIRE' must be used inside a macro defined by `AC_DEFUN'; it
+ must not be called from the top level. Also, it does not make
+ sense to require a macro that takes parameters.
+
+ `AC_REQUIRE' is often misunderstood. It really implements
+dependencies between macros in the sense that if one macro depends upon
+another, the latter is expanded _before_ the body of the former. To be
+more precise, the required macro is expanded before the outermost
+defined macro in the current expansion stack. In particular,
+`AC_REQUIRE([FOO])' is not replaced with the body of `FOO'. For
+instance, this definition of macros:
+
+ AC_DEFUN([TRAVOLTA],
+ [test "$body_temperature_in_celsius" -gt "38" &&
+ dance_floor=occupied])
+ AC_DEFUN([NEWTON_JOHN],
+ [test "x$hair_style" = xcurly &&
+ dance_floor=occupied])
+
+ AC_DEFUN([RESERVE_DANCE_FLOOR],
+ [if date | grep '^Sat.*pm' >/dev/null 2>&1; then
+ AC_REQUIRE([TRAVOLTA])
+ AC_REQUIRE([NEWTON_JOHN])
+ fi])
+
+with this `configure.ac'
+
+ AC_INIT([Dance Manager], [1.0], [bug-dance@example.org])
+ RESERVE_DANCE_FLOOR
+ if test "x$dance_floor" = xoccupied; then
+ AC_MSG_ERROR([cannot pick up here, let's move])
+ fi
+
+does not leave you with a better chance to meet a kindred soul at other
+times than Saturday night since it expands into:
+
+ test "$body_temperature_in_Celsius" -gt "38" &&
+ dance_floor=occupied
+ test "x$hair_style" = xcurly &&
+ dance_floor=occupied
+ fi
+ if date | grep '^Sat.*pm' >/dev/null 2>&1; then
+
+
+ fi
+
+ This behavior was chosen on purpose: (i) it prevents messages in
+required macros from interrupting the messages in the requiring macros;
+(ii) it avoids bad surprises when shell conditionals are used, as in:
+
+ if ...; then
+ AC_REQUIRE([SOME_CHECK])
+ fi
+ ...
+ SOME_CHECK
+
+ However, this implementation can lead to another class of problems.
+Consider the case where an outer macro first expands, then indirectly
+requires, an inner macro:
+
+ AC_DEFUN([TESTA], [[echo in A
+ if test -n "$SEEN_A" ; then echo duplicate ; fi
+ SEEN_A=:]])
+ AC_DEFUN([TESTB], [AC_REQUIRE([TESTA])[echo in B
+ if test -z "$SEEN_A" ; then echo bug ; fi]])
+ AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]])
+ AC_DEFUN([OUTER], [[echo in OUTER]
+ TESTA
+ TESTC])
+ OUTER
+
+Prior to Autoconf 2.64, the implementation of `AC_REQUIRE' recognized
+that `TESTB' needed to be hoisted prior to the expansion of `OUTER',
+but because `TESTA' had already been directly expanded, it failed to
+hoist `TESTA'. Therefore, the expansion of `TESTB' occurs prior to its
+prerequisites, leading to the following output:
+
+ in B
+ bug
+ in OUTER
+ in A
+ in C
+
+Newer Autoconf is smart enough to recognize this situation, and hoists
+`TESTA' even though it has already been expanded, but issues a syntax
+warning in the process. This is because the hoisted expansion of
+`TESTA' defeats the purpose of using `AC_REQUIRE' to avoid redundant
+code, and causes its own set of problems if the hoisted macro is not
+idempotent:
+
+ in A
+ in B
+ in OUTER
+ in A
+ duplicate
+ in C
+
+ The bug is not in Autoconf, but in the macro definitions. If you
+ever pass a particular macro name to `AC_REQUIRE', then you are implying
+that the macro only needs to be expanded once. But to enforce this,
+either the macro must be declared with `AC_DEFUN_ONCE' (although this
+only helps in Autoconf 2.64 or newer), or all uses of that macro should
+be through `AC_REQUIRE'; directly expanding the macro defeats the point
+of using `AC_REQUIRE' to eliminate redundant expansion. In the
+example, this rule of thumb was violated because `TESTB' requires
+`TESTA' while `OUTER' directly expands it. One way of fixing the bug
+is to factor `TESTA' into two macros, the portion designed for direct
+and repeated use (here, named `TESTA'), and the portion designed for
+one-shot output and used only inside `AC_REQUIRE' (here, named
+`TESTA_PREREQ'). Then, by fixing all clients to use the correct
+calling convention according to their needs:
+
+ AC_DEFUN([TESTA], [AC_REQUIRE([TESTA_PREREQ])[echo in A]])
+ AC_DEFUN([TESTA_PREREQ], [[echo in A_PREREQ
+ if test -n "$SEEN_A" ; then echo duplicate ; fi
+ SEEN_A=:]])
+ AC_DEFUN([TESTB], [AC_REQUIRE([TESTA_PREREQ])[echo in B
+ if test -z "$SEEN_A" ; then echo bug ; fi]])
+ AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]])
+ AC_DEFUN([OUTER], [[echo in OUTER]
+ TESTA
+ TESTC])
+ OUTER
+
+the resulting output will then obey all dependency rules and avoid any
+syntax warnings, whether the script is built with old or new Autoconf
+versions:
+
+ in A_PREREQ
+ in B
+ in OUTER
+ in A
+ in C
+
+ The helper macros `AS_IF' and `AS_CASE' may be used to enforce
+expansion of required macros outside of shell conditional constructs.
+You are furthermore encouraged, although not required, to put all
+`AC_REQUIRE' calls at the beginning of a macro. You can use `dnl' to
+avoid the empty lines they leave.
+
+
+File: autoconf.info, Node: Suggested Ordering, Next: One-Shot Macros, Prev: Prerequisite Macros, Up: Dependencies Between Macros
+
+10.4.2 Suggested Ordering
+-------------------------
+
+Some macros should be run before another macro if both are called, but
+neither _requires_ that the other be called. For example, a macro that
+changes the behavior of the C compiler should be called before any
+macros that run the C compiler. Many of these dependencies are noted in
+the documentation.
+
+ Autoconf provides the `AC_BEFORE' macro to warn users when macros
+with this kind of dependency appear out of order in a `configure.ac'
+file. The warning occurs when creating `configure' from
+`configure.ac', not when running `configure'.
+
+ For example, `AC_PROG_CPP' checks whether the C compiler can run the
+C preprocessor when given the `-E' option. It should therefore be
+called after any macros that change which C compiler is being used,
+such as `AC_PROG_CC'. So `AC_PROG_CC' contains:
+
+ AC_BEFORE([$0], [AC_PROG_CPP])dnl
+
+This warns the user if a call to `AC_PROG_CPP' has already occurred
+when `AC_PROG_CC' is called.
+
+ -- Macro: AC_BEFORE (THIS-MACRO-NAME, CALLED-MACRO-NAME)
+ Make M4 print a warning message to the standard error output if
+ CALLED-MACRO-NAME has already been called. THIS-MACRO-NAME should
+ be the name of the macro that is calling `AC_BEFORE'. The macro
+ CALLED-MACRO-NAME must have been defined using `AC_DEFUN' or else
+ contain a call to `AC_PROVIDE' to indicate that it has been called.
+
+
+File: autoconf.info, Node: One-Shot Macros, Prev: Suggested Ordering, Up: Dependencies Between Macros
+
+10.4.3 One-Shot Macros
+----------------------
+
+Some macros should be called only once, either because calling them
+multiple time is unsafe, or because it is bad style. For instance
+Autoconf ensures that `AC_CANONICAL_BUILD' and cousins (*note
+Canonicalizing::) are evaluated only once, because it makes no sense to
+run these expensive checks more than once. Such one-shot macros can be
+defined using `AC_DEFUN_ONCE'.
+
+ -- Macro: AC_DEFUN_ONCE (MACRO-NAME, MACRO-BODY)
+ Declare macro MACRO-NAME like `AC_DEFUN' would (*note Macro
+ Definitions::), but add additional logic that guarantees that only
+ the first use of the macro (whether by direct expansion or
+ `AC_REQUIRE') causes an expansion of MACRO-BODY; the expansion
+ will occur before the start of any enclosing macro defined by
+ `AC_DEFUN'. Subsequent expansions are silently ignored.
+ Generally, it does not make sense for MACRO-BODY to use parameters
+ such as `$1'.
+
+ Prior to Autoconf 2.64, a macro defined by `AC_DEFUN_ONCE' would
+emit a warning if it was directly expanded a second time, so for
+portability, it is better to use `AC_REQUIRE' than direct invocation of
+MACRO-NAME inside a macro defined by `AC_DEFUN' (*note Prerequisite
+Macros::).
+
+
+File: autoconf.info, Node: Obsoleting Macros, Next: Coding Style, Prev: Dependencies Between Macros, Up: Writing Autoconf Macros
+
+10.5 Obsoleting Macros
+======================
+
+Configuration and portability technology has evolved over the years.
+Often better ways of solving a particular problem are developed, or
+ad-hoc approaches are systematized. This process has occurred in many
+parts of Autoconf. One result is that some of the macros are now
+considered "obsolete"; they still work, but are no longer considered
+the best thing to do, hence they should be replaced with more modern
+macros. Ideally, `autoupdate' should replace the old macro calls with
+their modern implementation.
+
+ Autoconf provides a simple means to obsolete a macro.
+
+ -- Macro: AU_DEFUN (OLD-MACRO, IMPLEMENTATION, [MESSAGE])
+ Define OLD-MACRO as IMPLEMENTATION. The only difference with
+ `AC_DEFUN' is that the user is warned that OLD-MACRO is now
+ obsolete.
+
+ If she then uses `autoupdate', the call to OLD-MACRO is replaced
+ by the modern IMPLEMENTATION. MESSAGE should include information
+ on what to do after running `autoupdate'; `autoupdate' prints it
+ as a warning, and includes it in the updated `configure.ac' file.
+
+ The details of this macro are hairy: if `autoconf' encounters an
+ `AU_DEFUN'ed macro, all macros inside its second argument are
+ expanded as usual. However, when `autoupdate' is run, only M4 and
+ M4sugar macros are expanded here, while all other macros are
+ disabled and appear literally in the updated `configure.ac'.
+
+ -- Macro: AU_ALIAS (OLD-NAME, NEW-NAME)
+ Used if the OLD-NAME is to be replaced by a call to NEW-MACRO with
+ the same parameters. This happens for example if the macro was
+ renamed.
+
+
+File: autoconf.info, Node: Coding Style, Prev: Obsoleting Macros, Up: Writing Autoconf Macros
+
+10.6 Coding Style
+=================
+
+The Autoconf macros follow a strict coding style. You are encouraged to
+follow this style, especially if you intend to distribute your macro,
+either by contributing it to Autoconf itself or the Autoconf Macro
+Archive (http://www.gnu.org/software/autoconf-archive/), or by other
+means.
+
+ The first requirement is to pay great attention to the quotation.
+For more details, see *note Autoconf Language::, and *note M4
+Quotation::.
+
+ Do not try to invent new interfaces. It is likely that there is a
+macro in Autoconf that resembles the macro you are defining: try to
+stick to this existing interface (order of arguments, default values,
+etc.). We _are_ conscious that some of these interfaces are not
+perfect; nevertheless, when harmless, homogeneity should be preferred
+over creativity.
+
+ Be careful about clashes both between M4 symbols and between shell
+variables.
+
+ If you stick to the suggested M4 naming scheme (*note Macro Names::),
+you are unlikely to generate conflicts. Nevertheless, when you need to
+set a special value, _avoid using a regular macro name_; rather, use an
+"impossible" name. For instance, up to version 2.13, the macro
+`AC_SUBST' used to remember what SYMBOL macros were already defined by
+setting `AC_SUBST_SYMBOL', which is a regular macro name. But since
+there is a macro named `AC_SUBST_FILE', it was just impossible to
+`AC_SUBST(FILE)'! In this case, `AC_SUBST(SYMBOL)' or
+`_AC_SUBST(SYMBOL)' should have been used (yes, with the parentheses).
+
+ No Autoconf macro should ever enter the user-variable name space;
+i.e., except for the variables that are the actual result of running the
+macro, all shell variables should start with `ac_'. In addition, small
+macros or any macro that is likely to be embedded in other macros
+should be careful not to use obvious names.
+
+ Do not use `dnl' to introduce comments: most of the comments you are
+likely to write are either header comments which are not output anyway,
+or comments that should make their way into `configure'. There are
+exceptional cases where you do want to comment special M4 constructs,
+in which case `dnl' is right, but keep in mind that it is unlikely.
+
+ M4 ignores the leading blanks and newlines before each argument.
+Use this feature to indent in such a way that arguments are (more or
+less) aligned with the opening parenthesis of the macro being called.
+For instance, instead of
+
+ AC_CACHE_CHECK(for EMX OS/2 environment,
+ ac_cv_emxos2,
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [return __EMX__;])],
+ [ac_cv_emxos2=yes], [ac_cv_emxos2=no])])
+
+write
+
+ AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])],
+ [ac_cv_emxos2=yes],
+ [ac_cv_emxos2=no])])
+
+or even
+
+ AC_CACHE_CHECK([for EMX OS/2 environment],
+ [ac_cv_emxos2],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
+ [return __EMX__;])],
+ [ac_cv_emxos2=yes],
+ [ac_cv_emxos2=no])])
+
+ When using `AC_RUN_IFELSE' or any macro that cannot work when
+cross-compiling, provide a pessimistic value (typically `no').
+
+ Feel free to use various tricks to prevent auxiliary tools, such as
+syntax-highlighting editors, from behaving improperly. For instance,
+instead of:
+
+ m4_bpatsubst([$1], [$"])
+
+use
+
+ m4_bpatsubst([$1], [$""])
+
+so that Emacsen do not open an endless "string" at the first quote.
+For the same reasons, avoid:
+
+ test $[#] != 0
+
+and use:
+
+ test $[@%:@] != 0
+
+Otherwise, the closing bracket would be hidden inside a `#'-comment,
+breaking the bracket-matching highlighting from Emacsen. Note the
+preferred style to escape from M4: `$[1]', `$[@]', etc. Do not escape
+when it is unnecessary. Common examples of useless quotation are
+`[$]$1' (write `$$1'), `[$]var' (use `$var'), etc. If you add
+portability issues to the picture, you'll prefer `${1+"$[@]"}' to
+`"[$]@"', and you'll prefer do something better than hacking Autoconf
+`:-)'.
+
+ When using `sed', don't use `-e' except for indenting purposes.
+With the `s' and `y' commands, the preferred separator is `/' unless
+`/' itself might appear in the pattern or replacement, in which case
+you should use `|', or optionally `,' if you know the pattern and
+replacement cannot contain a file name. If none of these characters
+will do, choose a printable character that cannot appear in the pattern
+or replacement. Characters from the set `"#$&'()*;<=>?`|~' are good
+choices if the pattern or replacement might contain a file name, since
+they have special meaning to the shell and are less likely to occur in
+file names.
+
+ *Note Macro Definitions::, for details on how to define a macro. If
+a macro doesn't use `AC_REQUIRE', is expected to never be the object of
+an `AC_REQUIRE' directive, and macros required by other macros inside
+arguments do not need to be expanded before this macro, then use
+`m4_define'. In case of doubt, use `AC_DEFUN'. Also take into account
+that public third-party macros need to use `AC_DEFUN' in order to be
+found by `aclocal' (*note Extending aclocal: (automake)Extending
+aclocal.). All the `AC_REQUIRE' statements should be at the beginning
+of the macro, and each statement should be followed by `dnl'.
+
+ You should not rely on the number of arguments: instead of checking
+whether an argument is missing, test that it is not empty. It provides
+both a simpler and a more predictable interface to the user, and saves
+room for further arguments.
+
+ Unless the macro is short, try to leave the closing `])' at the
+beginning of a line, followed by a comment that repeats the name of the
+macro being defined. This introduces an additional newline in
+`configure'; normally, that is not a problem, but if you want to remove
+it you can use `[]dnl' on the last line. You can similarly use `[]dnl'
+after a macro call to remove its newline. `[]dnl' is recommended
+instead of `dnl' to ensure that M4 does not interpret the `dnl' as
+being attached to the preceding text or macro output. For example,
+instead of:
+
+ AC_DEFUN([AC_PATH_X],
+ [AC_MSG_CHECKING([for X])
+ AC_REQUIRE_CPP()
+ # ...omitted...
+ AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
+ fi])
+
+you would write:
+
+ AC_DEFUN([AC_PATH_X],
+ [AC_REQUIRE_CPP()[]dnl
+ AC_MSG_CHECKING([for X])
+ # ...omitted...
+ AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
+ fi[]dnl
+ ])# AC_PATH_X
+
+ If the macro is long, try to split it into logical chunks.
+Typically, macros that check for a bug in a function and prepare its
+`AC_LIBOBJ' replacement should have an auxiliary macro to perform this
+setup. Do not hesitate to introduce auxiliary macros to factor your
+code.
+
+ In order to highlight the recommended coding style, here is a macro
+written the old way:
+
+ dnl Check for EMX on OS/2.
+ dnl _AC_EMXOS2
+ AC_DEFUN(_AC_EMXOS2,
+ [AC_CACHE_CHECK(for EMX OS/2 environment, ac_cv_emxos2,
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, return __EMX__;)],
+ ac_cv_emxos2=yes, ac_cv_emxos2=no)])
+ test "x$ac_cv_emxos2" = xyes && EMXOS2=yes])
+
+and the new way:
+
+ # _AC_EMXOS2
+ # ----------
+ # Check for EMX on OS/2.
+ m4_define([_AC_EMXOS2],
+ [AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])],
+ [ac_cv_emxos2=yes],
+ [ac_cv_emxos2=no])])
+ test "x$ac_cv_emxos2" = xyes && EMXOS2=yes[]dnl
+ ])# _AC_EMXOS2
+
+
+File: autoconf.info, Node: Portable Shell, Next: Portable Make, Prev: Writing Autoconf Macros, Up: Top
+
+11 Portable Shell Programming
+*****************************
+
+When writing your own checks, there are some shell-script programming
+techniques you should avoid in order to make your code portable. The
+Bourne shell and upward-compatible shells like the Korn shell and Bash
+have evolved over the years, and many features added to the original
+System7 shell are now supported on all interesting porting targets.
+However, the following discussion between Russ Allbery and Robert Lipe
+is worth reading:
+
+Russ Allbery:
+
+ The GNU assumption that `/bin/sh' is the one and only shell leads
+ to a permanent deadlock. Vendors don't want to break users'
+ existing shell scripts, and there are some corner cases in the
+ Bourne shell that are not completely compatible with a Posix
+ shell. Thus, vendors who have taken this route will _never_
+ (OK..."never say never") replace the Bourne shell (as `/bin/sh')
+ with a Posix shell.
+
+Robert Lipe:
+
+ This is exactly the problem. While most (at least most System
+ V's) do have a Bourne shell that accepts shell functions most
+ vendor `/bin/sh' programs are not the Posix shell.
+
+ So while most modern systems do have a shell _somewhere_ that
+ meets the Posix standard, the challenge is to find it.
+
+ For this reason, part of the job of M4sh (*note Programming in
+M4sh::) is to find such a shell. But to prevent trouble, if you're not
+using M4sh you should not take advantage of features that were added
+after Unix version 7, circa 1977 (*note Systemology::); you should not
+use aliases, negated character classes, or even `unset'. `#' comments,
+while not in Unix version 7, were retrofitted in the original Bourne
+shell and can be assumed to be part of the least common denominator.
+
+ On the other hand, if you're using M4sh you can assume that the shell
+has the features that were added in SVR2 (circa 1984), including shell
+functions, `return', `unset', and I/O redirection for builtins. For
+more information, refer to `http://www.in-ulm.de/~mascheck/bourne/'.
+However, some pitfalls have to be avoided for portable use of these
+constructs; these will be documented in the rest of this chapter. See
+in particular *note Shell Functions:: and *note Limitations of Shell
+Builtins: Limitations of Builtins.
+
+ Some ancient systems have quite small limits on the length of the
+`#!' line; for instance, 32 bytes (not including the newline) on SunOS
+4. However, these ancient systems are no longer of practical concern.
+
+ The set of external programs you should run in a `configure' script
+is fairly small. *Note Utilities in Makefiles: (standards)Utilities in
+Makefiles, for the list. This restriction allows users to start out
+with a fairly small set of programs and build the rest, avoiding too
+many interdependencies between packages.
+
+ Some of these external utilities have a portable subset of features;
+see *note Limitations of Usual Tools::.
+
+ There are other sources of documentation about shells. The
+specification for the Posix Shell Command Language
+(http://www.opengroup.org/susv3/utilities/xcu_chap02.html), though more
+generous than the restrictive shell subset described above, is fairly
+portable nowadays. Also please see the Shell FAQs
+(http://www.faqs.org/faqs/unix-faq/shell/).
+
+* Menu:
+
+* Shellology:: A zoology of shells
+* Invoking the Shell:: Invoking the shell as a command
+* Here-Documents:: Quirks and tricks
+* File Descriptors:: FDs and redirections
+* Signal Handling:: Shells, signals, and headaches
+* File System Conventions:: File names
+* Shell Pattern Matching:: Pattern matching
+* Shell Substitutions:: Variable and command expansions
+* Assignments:: Varying side effects of assignments
+* Parentheses:: Parentheses in shell scripts
+* Slashes:: Slashes in shell scripts
+* Special Shell Variables:: Variables you should not change
+* Shell Functions:: What to look out for if you use them
+* Limitations of Builtins:: Portable use of not so portable /bin/sh
+* Limitations of Usual Tools:: Portable use of portable tools
+
+
+File: autoconf.info, Node: Shellology, Next: Invoking the Shell, Up: Portable Shell
+
+11.1 Shellology
+===============
+
+There are several families of shells, most prominently the Bourne family
+and the C shell family which are deeply incompatible. If you want to
+write portable shell scripts, avoid members of the C shell family. The
+the Shell difference FAQ
+(http://www.faqs.org/faqs/unix-faq/shell/shell-differences/) includes a
+small history of Posix shells, and a comparison between several of them.
+
+ Below we describe some of the members of the Bourne shell family.
+
+Ash
+ Ash is often used on GNU/Linux and BSD systems as a light-weight
+ Bourne-compatible shell. Ash 0.2 has some bugs that are fixed in
+ the 0.3.x series, but portable shell scripts should work around
+ them, since version 0.2 is still shipped with many GNU/Linux
+ distributions.
+
+ To be compatible with Ash 0.2:
+
+ - don't use `$?' after expanding empty or unset variables, or
+ at the start of an `eval':
+
+ foo=
+ false
+ $foo
+ echo "Do not use it: $?"
+ false
+ eval 'echo "Do not use it: $?"'
+
+ - don't use command substitution within variable expansion:
+
+ cat ${FOO=`bar`}
+
+ - beware that single builtin substitutions are not performed by
+ a subshell, hence their effect applies to the current shell!
+ *Note Shell Substitutions::, item "Command Substitution".
+
+Bash
+ To detect whether you are running Bash, test whether
+ `BASH_VERSION' is set. To require Posix compatibility, run `set
+ -o posix'. *Note Bash Posix Mode: (bash)Bash POSIX Mode, for
+ details.
+
+Bash 2.05 and later
+ Versions 2.05 and later of Bash use a different format for the
+ output of the `set' builtin, designed to make evaluating its
+ output easier. However, this output is not compatible with earlier
+ versions of Bash (or with many other shells, probably). So if you
+ use Bash 2.05 or higher to execute `configure', you'll need to use
+ Bash 2.05 for all other build tasks as well.
+
+Ksh
+ The Korn shell is compatible with the Bourne family and it mostly
+ conforms to Posix. It has two major variants commonly called
+ `ksh88' and `ksh93', named after the years of initial release. It
+ is usually called `ksh', but is called `sh' on some hosts if you
+ set your path appropriately.
+
+ Solaris systems have three variants: `/usr/bin/ksh' is `ksh88'; it
+ is standard on Solaris 2.0 and later. `/usr/xpg4/bin/sh' is a
+ Posix-compliant variant of `ksh88'; it is standard on Solaris 9
+ and later. `/usr/dt/bin/dtksh' is `ksh93'. Variants that are not
+ standard may be parts of optional packages. There is no extra
+ charge for these packages, but they are not part of a minimal OS
+ install and therefore some installations may not have it.
+
+ Starting with Tru64 Version 4.0, the Korn shell `/usr/bin/ksh' is
+ also available as `/usr/bin/posix/sh'. If the environment
+ variable `BIN_SH' is set to `xpg4', subsidiary invocations of the
+ standard shell conform to Posix.
+
+Pdksh
+ A public-domain clone of the Korn shell called `pdksh' is widely
+ available: it has most of the `ksh88' features along with a few of
+ its own. It usually sets `KSH_VERSION', except if invoked as
+ `/bin/sh' on OpenBSD, and similarly to Bash you can require Posix
+ compatibility by running `set -o posix'. Unfortunately, with
+ `pdksh' 5.2.14 (the latest stable version as of January 2007)
+ Posix mode is buggy and causes `pdksh' to depart from Posix in at
+ least one respect, see *note Shell Substitutions::.
+
+Zsh
+ To detect whether you are running `zsh', test whether
+ `ZSH_VERSION' is set. By default `zsh' is _not_ compatible with
+ the Bourne shell: you must execute `emulate sh', and for `zsh'
+ versions before 3.1.6-dev-18 you must also set `NULLCMD' to `:'.
+ *Note Compatibility: (zsh)Compatibility, for details.
+
+ The default Mac OS X `sh' was originally Zsh; it was changed to
+ Bash in Mac OS X 10.2.
+
+
+File: autoconf.info, Node: Invoking the Shell, Next: Here-Documents, Prev: Shellology, Up: Portable Shell
+
+11.2 Invoking the Shell
+=======================
+
+The Korn shell (up to at least version M-12/28/93d) has a bug when
+invoked on a file whose name does not contain a slash. It first
+searches for the file's name in `PATH', and if found it executes that
+rather than the original file. For example, assuming there is a binary
+executable `/usr/bin/script' in your `PATH', the last command in the
+following example fails because the Korn shell finds `/usr/bin/script'
+and refuses to execute it as a shell script:
+
+ $ touch xxyzzyz script
+ $ ksh xxyzzyz
+ $ ksh ./script
+ $ ksh script
+ ksh: script: cannot execute
+
+ Bash 2.03 has a bug when invoked with the `-c' option: if the
+option-argument ends in backslash-newline, Bash incorrectly reports a
+syntax error. The problem does not occur if a character follows the
+backslash:
+
+ $ $ bash -c 'echo foo \
+ > '
+ bash: -c: line 2: syntax error: unexpected end of file
+ $ bash -c 'echo foo \
+ > '
+ foo
+
+*Note Backslash-Newline-Empty::, for how this can cause problems in
+makefiles.
+
+
+File: autoconf.info, Node: Here-Documents, Next: File Descriptors, Prev: Invoking the Shell, Up: Portable Shell
+
+11.3 Here-Documents
+===================
+
+Don't rely on `\' being preserved just because it has no special
+meaning together with the next symbol. In the native `sh' on OpenBSD
+2.7 `\"' expands to `"' in here-documents with unquoted delimiter. As
+a general rule, if `\\' expands to `\' use `\\' to get `\'.
+
+ With OpenBSD 2.7's `sh'
+
+ $ cat <<EOF
+ > \" \\
+ > EOF
+ " \
+
+and with Bash:
+
+ bash-2.04$ cat <<EOF
+ > \" \\
+ > EOF
+ \" \
+
+ Using command substitutions in a here-document that is fed to a shell
+function is not portable. For example, with Solaris 10 `/bin/sh':
+
+ $ kitty () { cat; }
+ $ kitty <<EOF
+ > `echo ok`
+ > EOF
+ /tmp/sh199886: cannot open
+ $ echo $?
+ 1
+
+ Some shells mishandle large here-documents: for example, Solaris 10
+`dtksh' and the UnixWare 7.1.1 Posix shell, which are derived from Korn
+shell version M-12/28/93d, mishandle braced variable expansion that
+crosses a 1024- or 4096-byte buffer boundary within a here-document.
+Only the part of the variable name after the boundary is used. For
+example, `${variable}' could be replaced by the expansion of `${ble}'.
+If the end of the variable name is aligned with the block boundary, the
+shell reports an error, as if you used `${}'. Instead of
+`${variable-default}', the shell may expand `${riable-default}', or
+even `${fault}'. This bug can often be worked around by omitting the
+braces: `$variable'. The bug was fixed in `ksh93g' (1998-04-30) but as
+of 2006 many operating systems were still shipping older versions with
+the bug.
+
+ Empty here-documents are not portable either; with the following
+code, `zsh' up to at least version 4.3.10 creates a file with a single
+newline, whereas other shells create an empty file:
+
+ cat >file <<EOF
+ EOF
+
+ Many shells (including the Bourne shell) implement here-documents
+inefficiently. In particular, some shells can be extremely inefficient
+when a single statement contains many here-documents. For instance if
+your `configure.ac' includes something like:
+
+ if <cross_compiling>; then
+ assume this and that
+ else
+ check this
+ check that
+ check something else
+ ...
+ on and on forever
+ ...
+ fi
+
+ A shell parses the whole `if'/`fi' construct, creating temporary
+files for each here-document in it. Some shells create links for such
+here-documents on every `fork', so that the clean-up code they had
+installed correctly removes them. It is creating the links that can
+take the shell forever.
+
+ Moving the tests out of the `if'/`fi', or creating multiple
+`if'/`fi' constructs, would improve the performance significantly.
+Anyway, this kind of construct is not exactly the typical use of
+Autoconf. In fact, it's even not recommended, because M4 macros can't
+look into shell conditionals, so we may fail to expand a macro when it
+was expanded before in a conditional path, and the condition turned out
+to be false at runtime, and we end up not executing the macro at all.
+
+ Be careful with the use of `<<-' to unindent here-documents. The
+behavior is only portable for stripping leading <TAB>s, and things can
+silently break if an overzealous editor converts to using leading
+spaces (not all shells are nice enough to warn about unterminated
+here-documents).
+
+ $ printf 'cat <<-x\n\t1\n\t 2\n\tx\n' | bash && echo done
+ 1
+ 2
+ done
+ $ printf 'cat <<-x\n 1\n 2\n x\n' | bash-3.2 && echo done
+ 1
+ 2
+ x
+ done
+
+
+File: autoconf.info, Node: File Descriptors, Next: Signal Handling, Prev: Here-Documents, Up: Portable Shell
+
+11.4 File Descriptors
+=====================
+
+Most shells, if not all (including Bash, Zsh, Ash), output traces on
+stderr, even for subshells. This might result in undesirable content
+if you meant to capture the standard-error output of the inner command:
+
+ $ ash -x -c '(eval "echo foo >&2") 2>stderr'
+ $ cat stderr
+ + eval echo foo >&2
+ + echo foo
+ foo
+ $ bash -x -c '(eval "echo foo >&2") 2>stderr'
+ $ cat stderr
+ + eval 'echo foo >&2'
+ ++ echo foo
+ foo
+ $ zsh -x -c '(eval "echo foo >&2") 2>stderr'
+ # Traces on startup files deleted here.
+ $ cat stderr
+ +zsh:1> eval echo foo >&2
+ +zsh:1> echo foo
+ foo
+
+One workaround is to grep out uninteresting lines, hoping not to remove
+good ones.
+
+ If you intend to redirect both standard error and standard output,
+redirect standard output first. This works better with HP-UX, since
+its shell mishandles tracing if standard error is redirected first:
+
+ $ sh -x -c ': 2>err >out'
+ + :
+ + 2> err $ cat err
+ 1> out
+
+ Don't try to redirect the standard error of a command substitution.
+It must be done _inside_ the command substitution. When running `: `cd
+/zorglub` 2>/dev/null' expect the error message to escape, while `: `cd
+/zorglub 2>/dev/null`' works properly.
+
+ On the other hand, some shells, such as Solaris or FreeBSD
+`/bin/sh', warn about missing programs before performing redirections.
+Therefore, to silently check whether a program exists, it is necessary
+to perform redirections on a subshell or brace group:
+ $ /bin/sh -c 'nosuch 2>/dev/null'
+ nosuch: not found
+ $ /bin/sh -c '(nosuch) 2>/dev/null'
+ $ /bin/sh -c '{ nosuch; } 2>/dev/null'
+ $ bash -c 'nosuch 2>/dev/null'
+
+ FreeBSD 6.2 sh may mix the trace output lines from the statements in
+a shell pipeline.
+
+ It is worth noting that Zsh (but not Ash nor Bash) makes it possible
+in assignments though: `foo=`cd /zorglub` 2>/dev/null'.
+
+ Some shells, like `ash', don't recognize bi-directional redirection
+(`<>'). And even on shells that recognize it, it is not portable to
+use on fifos: Posix does not require read-write support for named
+pipes, and Cygwin does not support it:
+
+ $ mkfifo fifo
+ $ exec 5<>fifo
+ $ echo hi >&5
+ bash: echo: write error: Communication error on send
+
+Furthermore, versions of `dash' before 0.5.6 mistakenly truncate
+regular files when using `<>':
+
+ $ echo a > file
+ $ bash -c ': 1<>file'; cat file
+ a
+ $ dash -c ': 1<>file'; cat file
+ $ rm a
+
+ When catering to old systems, don't redirect the same file descriptor
+several times, as you are doomed to failure under Ultrix.
+
+ ULTRIX V4.4 (Rev. 69) System #31: Thu Aug 10 19:42:23 GMT 1995
+ UWS V4.4 (Rev. 11)
+ $ eval 'echo matter >fullness' >void
+ illegal io
+ $ eval '(echo matter >fullness)' >void
+ illegal io
+ $ (eval '(echo matter >fullness)') >void
+ Ambiguous output redirect.
+
+In each case the expected result is of course `fullness' containing
+`matter' and `void' being empty. However, this bug is probably not of
+practical concern to modern platforms.
+
+ Solaris 10 `sh' will try to optimize away a `:' command (even if it
+is redirected) in a loop after the first iteration, or in a shell
+function after the first call:
+
+ $ for i in 1 2 3 ; do : >x$i; done
+ $ ls x*
+ x1
+ $ f () { : >$1; }; f y1; f y2; f y3;
+ $ ls y*
+ y1
+
+As a workaround, `echo' or `eval' can be used.
+
+ Don't rely on file descriptors 0, 1, and 2 remaining closed in a
+subsidiary program. If any of these descriptors is closed, the
+operating system may open an unspecified file for the descriptor in the
+new process image. Posix 2008 says this may be done only if the
+subsidiary program is set-user-ID or set-group-ID, but HP-UX 11.23 does
+it even for ordinary programs, and the next version of Posix will allow
+HP-UX behavior.
+
+ If you want a file descriptor above 2 to be inherited into a child
+process, then you must use redirections specific to that command or a
+containing subshell or command group, rather than relying on `exec' in
+the shell. In `ksh' as well as HP-UX `sh', file descriptors above 2
+which are opened using `exec N>file' are closed by a subsequent `exec'
+(such as that involved in the fork-and-exec which runs a program or
+script):
+
+ $ echo 'echo hello >&5' >k
+ $ /bin/sh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t
+ hello
+ $ bash -c 'exec 5>t; ksh ./k; exec 5>&-; cat t
+ hello
+ $ ksh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t
+ ./k[1]: 5: cannot open [Bad file number]
+ $ ksh -c '(ksh ./k) 5>t; cat t'
+ hello
+ $ ksh -c '{ ksh ./k; } 5>t; cat t'
+ hello
+ $ ksh -c '5>t ksh ./k; cat t
+ hello
+
+ Don't rely on duplicating a closed file descriptor to cause an
+error. With Solaris `/bin/sh', failed duplication is silently ignored,
+which can cause unintended leaks to the original file descriptor. In
+this example, observe the leak to standard output:
+
+ $ bash -c 'echo hi >&3' 3>&-; echo $?
+ bash: 3: Bad file descriptor
+ 1
+ $ /bin/sh -c 'echo hi >&3' 3>&-; echo $?
+ hi
+ 0
+
+ Fortunately, an attempt to close an already closed file descriptor
+will portably succeed. Likewise, it is safe to use either style of
+`N<&-' or `N>&-' for closing a file descriptor, even if it doesn't
+match the read/write mode that the file descriptor was opened with.
+
+ DOS variants cannot rename or remove open files, such as in `mv foo
+bar >foo' or `rm foo >foo', even though this is perfectly portable
+among Posix hosts.
+
+ A few ancient systems reserved some file descriptors. By convention,
+file descriptor 3 was opened to `/dev/tty' when you logged into Eighth
+Edition (1985) through Tenth Edition Unix (1989). File descriptor 4
+had a special use on the Stardent/Kubota Titan (circa 1990), though we
+don't now remember what it was. Both these systems are obsolete, so
+it's now safe to treat file descriptors 3 and 4 like any other file
+descriptors.
+
+ On the other hand, you can't portably use multi-digit file
+descriptors. Solaris `ksh' doesn't understand any file descriptor
+larger than `9':
+
+ $ bash -c 'exec 10>&-'; echo $?
+ 0
+ $ ksh -c 'exec 9>&-'; echo $?
+ 0
+ $ ksh -c 'exec 10>&-'; echo $?
+ ksh[1]: exec: 10: not found
+ 127
+
+
+File: autoconf.info, Node: Signal Handling, Next: File System Conventions, Prev: File Descriptors, Up: Portable Shell
+
+11.5 Signal Handling
+====================
+
+Portable handling of signals within the shell is another major source of
+headaches. This is worsened by the fact that various different,
+mutually incompatible approaches are possible in this area, each with
+its distinctive merits and demerits. A detailed description of these
+possible approaches, as well as of their pros and cons, can be found in
+this article (http://www.cons.org/cracauer/sigint.html).
+
+ Solaris 10 `/bin/sh' automatically traps most signals by default;
+the shell still exits with error upon termination by one of those
+signals, but in such a case the exit status might be somewhat
+unexpected (even if allowed by POSIX, strictly speaking):
+
+ $ bash -c 'kill -1 $$'; echo $? # Will exit 128 + (signal number).
+ Hangup
+ 129
+ $ /bin/ksh -c 'kill -15 $$'; echo $? # Likewise.
+ Terminated
+ 143
+ $ for sig in 1 2 3 15; do
+ > echo $sig:
+ > /bin/sh -c "kill -$s \$\$"; echo $?
+ > done
+ signal 1:
+ Hangup
+ 129
+ signal 2:
+ 208
+ signal 3:
+ 208
+ signal 15:
+ 208
+
+ This gets even worse if one is using the POSIX `wait' interface to
+get details about the shell process terminations: it will result in the
+shell having exited normally, rather than by receiving a signal.
+
+ $ cat > foo.c <<'END'
+ #include <stdio.h> /* for printf */
+ #include <stdlib.h> /* for system */
+ #include <sys/wait.h> /* for WIF* macros */
+ int main(void)
+ {
+ int status = system ("kill -15 $$");
+ printf ("Terminated by signal: %s\n",
+ WIFSIGNALED (status) ? "yes" : "no");
+ printf ("Exited normally: %s\n",
+ WIFEXITED (status) ? "yes" : "no");
+ return 0;
+ }
+ END
+ $ cc -o foo foo.c
+ $ ./a.out # On GNU/Linux
+ Terminated by signal: no
+ Exited normally: yes
+ $ ./a.out # On Solaris 10
+ Terminated by signal: yes
+ Exited normally: no
+
+ Various shells seem to handle `SIGQUIT' specially: they ignore it
+even if it is not blocked, and even if the shell is not running
+interactively (in fact, even if the shell has no attached tty); among
+these shells are at least Bash (from version 2 onwards), Zsh 4.3.12,
+Solaris 10 `/bin/ksh' and `/usr/xpg4/bin/sh', and AT&T `ksh93' (2011).
+Still, `SIGQUIT' seems to be trappable quite portably within all these
+shells. OTOH, some other shells doesn't special-case the handling of
+`SIGQUIT'; among these shells are at least `pdksh' 5.2.14, Solaris 10
+and NetBSD 5.1 `/bin/sh', and the Almquist Shell 0.5.5.1.
+
+ Some shells (especially Korn shells and derivatives) might try to
+propagate to themselves a signal that has killed a child process; this
+is not a bug, but a conscious design choice (although its overall value
+might be debatable). The exact details of how this is attained vary
+from shell to shell. For example, upon running `perl -e 'kill 2, $$'',
+after the perl process has been interrupted AT&T `ksh93' (2011) will
+proceed to send itself a `SIGINT', while Solaris 10 `/bin/ksh' and
+`/usr/xpg4/bin/sh' will proceed to exit with status 130 (i.e., 128 +
+2). In any case, if there is an active trap associated with `SIGINT',
+those shells will correctly execute it.
+
+ Some Korn shells, when a child process die due receiving a signal
+with signal number N, can leave in `$?' an exit status of 256+N instead
+of the more common 128+N. Observe the difference between AT&T `ksh93'
+(2011) and `bash' 4.1.5 on Debian:
+
+ $ /bin/ksh -c 'sh -c "kill -1 \$\$"; echo $?'
+ /bin/ksh: line 1: 7837: Hangup
+ 257
+ $ /bin/bash -c 'sh -c "kill -1 \$\$"; echo $?'
+ /bin/bash: line 1: 7861 Hangup (sh -c "kill -1 \$\$")
+ 129
+
+This `ksh' behavior is allowed by POSIX, if implemented with due care;
+see this Austin Group discussion
+(http://www.austingroupbugs.net/view.php?id=51) for more background.
+However, if it is not implemented with proper care, such a behavior
+might cause problems in some corner cases. To see why, assume we have
+a "wrapper" script like this:
+
+ #!/bin/sh
+ # Ignore some signals in the shell only, not in its child processes.
+ trap : 1 2 13 15
+ wrapped_command "$@"
+ ret=$?
+ other_command
+ exit $ret
+
+If `wrapped_command' is interrupted by a `SIGHUP' (which has signal
+number 1), `ret' will be set to 257. Unless the `exit' shell builtin
+is smart enough to understand that such a value can only have
+originated from a signal, and adjust the final wait status of the shell
+appropriately, the value 257 will just get truncated to 1 by the
+closing `exit' call, so that a caller of the script will have no way to
+determine that termination by a signal was involved. Observe the
+different behavior of AT&T `ksh93' (2011) and `bash' 4.1.5 on Debian:
+
+ $ cat foo.sh
+ #!/bin/sh
+ sh -c 'kill -1 $$'
+ ret=$?
+ echo $ret
+ exit $ret
+ $ /bin/ksh foo.sh; echo $?
+ foo.sh: line 2: 12479: Hangup
+ 257
+ 1
+ $ /bin/bash foo.sh; echo $?
+ foo.sh: line 2: 12487 Hangup (sh -c 'kill -1 $$')
+ 129
+ 129
+
+
+File: autoconf.info, Node: File System Conventions, Next: Shell Pattern Matching, Prev: Signal Handling, Up: Portable Shell
+
+11.6 File System Conventions
+============================
+
+Autoconf uses shell-script processing extensively, so the file names
+that it processes should not contain characters that are special to the
+shell. Special characters include space, tab, newline, NUL, and the
+following:
+
+ " # $ & ' ( ) * ; < = > ? [ \ ` |
+
+ Also, file names should not begin with `~' or `-', and should
+contain neither `-' immediately after `/' nor `~' immediately after
+`:'. On Posix-like platforms, directory names should not contain `:',
+as this runs afoul of `:' used as the path separator.
+
+ These restrictions apply not only to the files that you distribute,
+but also to the absolute file names of your source, build, and
+destination directories.
+
+ On some Posix-like platforms, `!' and `^' are special too, so they
+should be avoided.
+
+ Posix lets implementations treat leading `//' specially, but
+requires leading `///' and beyond to be equivalent to `/'. Most Unix
+variants treat `//' like `/'. However, some treat `//' as a
+"super-root" that can provide access to files that are not otherwise
+reachable from `/'. The super-root tradition began with Apollo
+Domain/OS, which died out long ago, but unfortunately Cygwin has
+revived it.
+
+ While `autoconf' and friends are usually run on some Posix variety,
+they can be used on other systems, most notably DOS variants. This
+impacts several assumptions regarding file names.
+
+For example, the following code:
+
+ case $foo_dir in
+ /*) # Absolute
+ ;;
+ *)
+ foo_dir=$dots$foo_dir ;;
+ esac
+
+fails to properly detect absolute file names on those systems, because
+they can use a drivespec, and usually use a backslash as directory
+separator. If you want to be portable to DOS variants (at the price of
+rejecting valid but oddball Posix file names like `a:\b'), you can
+check for absolute file names like this:
+
+ case $foo_dir in
+ [\\/]* | ?:[\\/]* ) # Absolute
+ ;;
+ *)
+ foo_dir=$dots$foo_dir ;;
+ esac
+
+Make sure you quote the brackets if appropriate and keep the backslash
+as first character (*note Limitations of Shell Builtins: case.).
+
+ Also, because the colon is used as part of a drivespec, these
+systems don't use it as path separator. When creating or accessing
+paths, you can use the `PATH_SEPARATOR' output variable instead.
+`configure' sets this to the appropriate value for the build system
+(`:' or `;') when it starts up.
+
+ File names need extra care as well. While DOS variants that are
+Posixy enough to run `autoconf' (such as DJGPP) are usually able to
+handle long file names properly, there are still limitations that can
+seriously break packages. Several of these issues can be easily
+detected by the doschk
+(ftp://ftp.gnu.org/gnu/non-gnu/doschk/doschk-1.1.tar.gz) package.
+
+ A short overview follows; problems are marked with SFN/LFN to
+indicate where they apply: SFN means the issues are only relevant to
+plain DOS, not to DOS under Microsoft Windows variants, while LFN
+identifies problems that exist even under Microsoft Windows variants.
+
+No multiple dots (SFN)
+ DOS cannot handle multiple dots in file names. This is an
+ especially important thing to remember when building a portable
+ configure script, as `autoconf' uses a .in suffix for template
+ files.
+
+ This is perfectly OK on Posix variants:
+
+ AC_CONFIG_HEADERS([config.h])
+ AC_CONFIG_FILES([source.c foo.bar])
+ AC_OUTPUT
+
+ but it causes problems on DOS, as it requires `config.h.in',
+ `source.c.in' and `foo.bar.in'. To make your package more portable
+ to DOS-based environments, you should use this instead:
+
+ AC_CONFIG_HEADERS([config.h:config.hin])
+ AC_CONFIG_FILES([source.c:source.cin foo.bar:foobar.in])
+ AC_OUTPUT
+
+No leading dot (SFN)
+ DOS cannot handle file names that start with a dot. This is
+ usually not important for `autoconf'.
+
+Case insensitivity (LFN)
+ DOS is case insensitive, so you cannot, for example, have both a
+ file called `INSTALL' and a directory called `install'. This also
+ affects `make'; if there's a file called `INSTALL' in the
+ directory, `make install' does nothing (unless the `install'
+ target is marked as PHONY).
+
+The 8+3 limit (SFN)
+ Because the DOS file system only stores the first 8 characters of
+ the file name and the first 3 of the extension, those must be
+ unique. That means that `foobar-part1.c', `foobar-part2.c' and
+ `foobar-prettybird.c' all resolve to the same file name
+ (`FOOBAR-P.C'). The same goes for `foo.bar' and `foo.bartender'.
+
+ The 8+3 limit is not usually a problem under Microsoft Windows, as
+ it uses numeric tails in the short version of file names to make
+ them unique. However, a registry setting can turn this behavior
+ off. While this makes it possible to share file trees containing
+ long file names between SFN and LFN environments, it also means
+ the above problem applies there as well.
+
+Invalid characters (LFN)
+ Some characters are invalid in DOS file names, and should therefore
+ be avoided. In a LFN environment, these are `/', `\', `?', `*',
+ `:', `<', `>', `|' and `"'. In a SFN environment, other
+ characters are also invalid. These include `+', `,', `[' and `]'.
+
+Invalid names (LFN)
+ Some DOS file names are reserved, and cause problems if you try to
+ use files with those names. These names include `CON', `AUX',
+ `COM1', `COM2', `COM3', `COM4', `LPT1', `LPT2', `LPT3', `NUL', and
+ `PRN'. File names are case insensitive, so even names like
+ `aux/config.guess' are disallowed.
+
+
+
+File: autoconf.info, Node: Shell Pattern Matching, Next: Shell Substitutions, Prev: File System Conventions, Up: Portable Shell
+
+11.7 Shell Pattern Matching
+===========================
+
+Nowadays portable patterns can use negated character classes like
+`[!-aeiou]'. The older syntax `[^-aeiou]' is supported by some shells
+but not others; hence portable scripts should never use `^' as the
+first character of a bracket pattern.
+
+ Outside the C locale, patterns like `[a-z]' are problematic since
+they may match characters that are not lower-case letters.
+
+
+File: autoconf.info, Node: Shell Substitutions, Next: Assignments, Prev: Shell Pattern Matching, Up: Portable Shell
+
+11.8 Shell Substitutions
+========================
+
+Contrary to a persistent urban legend, the Bourne shell does not
+systematically split variables and back-quoted expressions, in
+particular on the right-hand side of assignments and in the argument of
+`case'. For instance, the following code:
+
+ case "$given_srcdir" in
+ .) top_srcdir="`echo "$dots" | sed 's|/$||'`" ;;
+ *) top_srcdir="$dots$given_srcdir" ;;
+ esac
+
+is more readable when written as:
+
+ case $given_srcdir in
+ .) top_srcdir=`echo "$dots" | sed 's|/$||'` ;;
+ *) top_srcdir=$dots$given_srcdir ;;
+ esac
+
+and in fact it is even _more_ portable: in the first case of the first
+attempt, the computation of `top_srcdir' is not portable, since not all
+shells properly understand `"`..."..."...`"', for example Solaris 10
+ksh:
+
+ $ foo="`echo " bar" | sed 's, ,,'`"
+ ksh: : cannot execute
+ ksh: bar | sed 's, ,,': cannot execute
+
+Posix does not specify behavior for this sequence. On the other hand,
+behavior for `"`...\"...\"...`"' is specified by Posix, but in
+practice, not all shells understand it the same way: pdksh 5.2.14
+prints spurious quotes when in Posix mode:
+
+ $ echo "`echo \"hello\"`"
+ hello
+ $ set -o posix
+ $ echo "`echo \"hello\"`"
+ "hello"
+
+There is just no portable way to use double-quoted strings inside
+double-quoted back-quoted expressions (pfew!).
+
+ Bash 4.1 has a bug where quoted empty strings adjacent to unquoted
+parameter expansions are elided during word splitting. Meanwhile, zsh
+does not perform word splitting except when in Bourne compatibility
+mode. In the example below, the correct behavior is to have five
+arguments to the function, and exactly two spaces on either side of the
+middle `-', since word splitting collapses multiple spaces in `$f' but
+leaves empty arguments intact.
+
+ $ bash -c 'n() { echo "$#$@"; }; f=" - "; n - ""$f"" -'
+ 3- - -
+ $ ksh -c 'n() { echo "$#$@"; }; f=" - "; n - ""$f"" -'
+ 5- - -
+ $ zsh -c 'n() { echo "$#$@"; }; f=" - "; n - ""$f"" -'
+ 3- - -
+ $ zsh -c 'emulate sh;
+ > n() { echo "$#$@"; }; f=" - "; n - ""$f"" -'
+ 5- - -
+
+You can work around this by doing manual word splitting, such as using
+`"$str" $list' rather than `"$str"$list'.
+
+ There are also portability pitfalls with particular expansions:
+
+`$@'
+ One of the most famous shell-portability issues is related to
+ `"$@"'. When there are no positional arguments, Posix says that
+ `"$@"' is supposed to be equivalent to nothing, but the original
+ Unix version 7 Bourne shell treated it as equivalent to `""'
+ instead, and this behavior survives in later implementations like
+ Digital Unix 5.0.
+
+ The traditional way to work around this portability problem is to
+ use `${1+"$@"}'. Unfortunately this method does not work with Zsh
+ (3.x and 4.x), which is used on Mac OS X. When emulating the
+ Bourne shell, Zsh performs word splitting on `${1+"$@"}':
+
+ zsh $ emulate sh
+ zsh $ for i in "$@"; do echo $i; done
+ Hello World
+ !
+ zsh $ for i in ${1+"$@"}; do echo $i; done
+ Hello
+ World
+ !
+
+ Zsh handles plain `"$@"' properly, but we can't use plain `"$@"'
+ because of the portability problems mentioned above. One
+ workaround relies on Zsh's "global aliases" to convert `${1+"$@"}'
+ into `"$@"' by itself:
+
+ test "${ZSH_VERSION+set}" = set && alias -g '${1+"$@"}'='"$@"'
+
+ Zsh only recognizes this alias when a shell word matches it
+ exactly; `"foo"${1+"$@"}' remains subject to word splitting.
+ Since this case always yields at least one shell word, use plain
+ `"$@"'.
+
+ A more conservative workaround is to avoid `"$@"' if it is
+ possible that there may be no positional arguments. For example,
+ instead of:
+
+ cat conftest.c "$@"
+
+ you can use this instead:
+
+ case $# in
+ 0) cat conftest.c;;
+ *) cat conftest.c "$@";;
+ esac
+
+ Autoconf macros often use the `set' command to update `$@', so if
+ you are writing shell code intended for `configure' you should not
+ assume that the value of `$@' persists for any length of time.
+
+`${10}'
+ The 10th, 11th, ... positional parameters can be accessed only
+ after a `shift'. The 7th Edition shell reported an error if given
+ `${10}', and Solaris 10 `/bin/sh' still acts that way:
+
+ $ set 1 2 3 4 5 6 7 8 9 10
+ $ echo ${10}
+ bad substitution
+
+ Conversely, not all shells obey the Posix rule that when braces are
+ omitted, multiple digits beyond a `$' imply the single-digit
+ positional parameter expansion concatenated with the remaining
+ literal digits. To work around the issue, you must use braces.
+
+ $ bash -c 'set a b c d e f g h i j; echo $10 ${1}0'
+ a0 a0
+ $ dash -c 'set a b c d e f g h i j; echo $10 ${1}0'
+ j a0
+
+`${VAR:-VALUE}'
+ Old BSD shells, including the Ultrix `sh', don't accept the colon
+ for any shell substitution, and complain and die. Similarly for
+ ${VAR:=VALUE}, ${VAR:?VALUE}, etc. However, all shells that
+ support functions allow the use of colon in shell substitution,
+ and since m4sh requires functions, you can portably use null
+ variable substitution patterns in configure scripts.
+
+`${VAR+VALUE}'
+ When using `${VAR-VALUE}' or `${VAR-VALUE}' for providing
+ alternate substitutions, VALUE must either be a single shell word,
+ quoted, or in the context of an unquoted here-document. Solaris
+ `/bin/sh' complains otherwise.
+
+ $ /bin/sh -c 'echo ${a-b c}'
+ /bin/sh: bad substitution
+ $ /bin/sh -c 'echo ${a-'\''b c'\''}'
+ b c
+ $ /bin/sh -c 'echo "${a-b c}"'
+ b c
+ $ /bin/sh -c 'cat <<EOF
+ ${a-b c}
+ EOF
+ b c
+
+ According to Posix, if an expansion occurs inside double quotes,
+ then the use of unquoted double quotes within VALUE is
+ unspecified, and any single quotes become literal characters; in
+ that case, escaping must be done with backslash. Likewise, the
+ use of unquoted here-documents is a case where double quotes have
+ unspecified results:
+
+ $ /bin/sh -c 'echo "${a-"b c"}"'
+ /bin/sh: bad substitution
+ $ ksh -c 'echo "${a-"b c"}"'
+ b c
+ $ bash -c 'echo "${a-"b c"}"'
+ b c
+ $ /bin/sh -c 'a=; echo ${a+'\''b c'\''}'
+ b c
+ $ /bin/sh -c 'a=; echo "${a+'\''b c'\''}"'
+ 'b c'
+ $ /bin/sh -c 'a=; echo "${a+\"b c\"}"'
+ "b c"
+ $ /bin/sh -c 'a=; echo "${a+b c}"'
+ b c
+ $ /bin/sh -c 'cat <<EOF
+ ${a-"b c"}
+ EOF'
+ "b c"
+ $ /bin/sh -c 'cat <<EOF
+ ${a-'b c'}
+ EOF'
+ 'b c'
+ $ bash -c 'cat <<EOF
+ ${a-"b c"}
+ EOF'
+ b c
+ $ bash -c 'cat <<EOF
+ ${a-'b c'}
+ EOF'
+ 'b c'
+
+ Perhaps the easiest way to work around quoting issues in a manner
+ portable to all shells is to place the results in a temporary
+ variable, then use `$t' as the VALUE, rather than trying to inline
+ the expression needing quoting.
+
+ $ /bin/sh -c 't="b c\"'\''}\\"; echo "${a-$t}"'
+ b c"'}\
+ $ ksh -c 't="b c\"'\''}\\"; echo "${a-$t}"'
+ b c"'}\
+ $ bash -c 't="b c\"'\''}\\"; echo "${a-$t}"'
+ b c"'}\
+
+`${VAR=VALUE}'
+ When using `${VAR=VALUE}' to assign a default value to VAR,
+ remember that even though the assignment to VAR does not undergo
+ file name expansion, the result of the variable expansion does
+ unless the expansion occurred within double quotes. In particular,
+ when using `:' followed by unquoted variable expansion for the
+ side effect of setting a default value, if the final value of
+ `$var' contains any globbing characters (either from VALUE or from
+ prior contents), the shell has to spend time performing file name
+ expansion and field splitting even though those results will not be
+ used. Therefore, it is a good idea to consider double quotes when
+ performing default initialization; while remembering how this
+ impacts any quoting characters appearing in VALUE.
+
+ $ time bash -c ': "${a=/usr/bin/*}"; echo "$a"'
+ /usr/bin/*
+
+ real 0m0.005s
+ user 0m0.002s
+ sys 0m0.003s
+ $ time bash -c ': ${a=/usr/bin/*}; echo "$a"'
+ /usr/bin/*
+
+ real 0m0.039s
+ user 0m0.026s
+ sys 0m0.009s
+ $ time bash -c 'a=/usr/bin/*; : ${a=noglob}; echo "$a"'
+ /usr/bin/*
+
+ real 0m0.031s
+ user 0m0.020s
+ sys 0m0.010s
+
+ $ time bash -c 'a=/usr/bin/*; : "${a=noglob}"; echo "$a"'
+ /usr/bin/*
+
+ real 0m0.006s
+ user 0m0.002s
+ sys 0m0.003s
+
+ As with `+' and `-', you must use quotes when using `=' if the
+ VALUE contains more than one shell word; either single quotes for
+ just the VALUE, or double quotes around the entire expansion:
+
+ $ : ${var1='Some words'}
+ $ : "${var2=like this}"
+ $ echo $var1 $var2
+ Some words like this
+
+ otherwise some shells, such as Solaris `/bin/sh' or on Digital
+ Unix V 5.0, die because of a "bad substitution". Meanwhile, Posix
+ requires that with `=', quote removal happens prior to the
+ assignment, and the expansion be the final contents of VAR without
+ quoting (and thus subject to field splitting), in contrast to the
+ behavior with `-' passing the quoting through to the final
+ expansion. However, `bash' 4.1 does not obey this rule.
+
+ $ ksh -c 'echo ${var-a\ \ b}'
+ a b
+ $ ksh -c 'echo ${var=a\ \ b}'
+ a b
+ $ bash -c 'echo ${var=a\ \ b}'
+ a b
+
+ Finally, Posix states that when mixing `${a=b}' with regular
+ commands, it is unspecified whether the assignments affect the
+ parent shell environment. It is best to perform assignments
+ independently from commands, to avoid the problems demonstrated in
+ this example:
+
+ $ bash -c 'x= y=${x:=b} sh -c "echo +\$x+\$y+";echo -$x-'
+ +b+b+
+ -b-
+ $ /bin/sh -c 'x= y=${x:=b} sh -c "echo +\$x+\$y+";echo -$x-'
+ ++b+
+ --
+ $ ksh -c 'x= y=${x:=b} sh -c "echo +\$x+\$y+";echo -$x-'
+ +b+b+
+ --
+
+`${VAR=VALUE}'
+ Solaris `/bin/sh' has a frightening bug in its handling of literal
+ assignments. Imagine you need set a variable to a string
+ containing `}'. This `}' character confuses Solaris `/bin/sh'
+ when the affected variable was already set. This bug can be
+ exercised by running:
+
+ $ unset foo
+ $ foo=${foo='}'}
+ $ echo $foo
+ }
+ $ foo=${foo='}' # no error; this hints to what the bug is
+ $ echo $foo
+ }
+ $ foo=${foo='}'}
+ $ echo $foo
+ }}
+ ^ ugh!
+
+ It seems that `}' is interpreted as matching `${', even though it
+ is enclosed in single quotes. The problem doesn't happen using
+ double quotes, or when using a temporary variable holding the
+ problematic string.
+
+`${VAR=EXPANDED-VALUE}'
+ On Ultrix, running
+
+ default="yu,yaa"
+ : ${var="$default"}
+
+ sets VAR to `M-yM-uM-,M-yM-aM-a', i.e., the 8th bit of each char
+ is set. You don't observe the phenomenon using a simple `echo
+ $var' since apparently the shell resets the 8th bit when it
+ expands $var. Here are two means to make this shell confess its
+ sins:
+
+ $ cat -v <<EOF
+ $var
+ EOF
+
+ and
+
+ $ set | grep '^var=' | cat -v
+
+ One classic incarnation of this bug is:
+
+ default="a b c"
+ : ${list="$default"}
+ for c in $list; do
+ echo $c
+ done
+
+ You'll get `a b c' on a single line. Why? Because there are no
+ spaces in `$list': there are `M- ', i.e., spaces with the 8th bit
+ set, hence no IFS splitting is performed!!!
+
+ One piece of good news is that Ultrix works fine with `:
+ ${list=$default}'; i.e., if you _don't_ quote. The bad news is
+ then that QNX 4.25 then sets LIST to the _last_ item of DEFAULT!
+
+ The portable way out consists in using a double assignment, to
+ switch the 8th bit twice on Ultrix:
+
+ list=${list="$default"}
+
+ ...but beware of the `}' bug from Solaris (see above). For safety,
+ use:
+
+ test "${var+set}" = set || var={VALUE}
+
+`${#VAR}'
+`${VAR%WORD}'
+`${VAR%%WORD}'
+`${VAR#WORD}'
+`${VAR##WORD}'
+ Posix requires support for these usages, but they do not work with
+ many traditional shells, e.g., Solaris 10 `/bin/sh'.
+
+ Also, `pdksh' 5.2.14 mishandles some WORD forms. For example if
+ `$1' is `a/b' and `$2' is `a', then `${1#$2}' should yield `/b',
+ but with `pdksh' it yields the empty string.
+
+``COMMANDS`'
+ Posix requires shells to trim all trailing newlines from command
+ output before substituting it, so assignments like `dir=`echo
+ "$file" | tr a A`' do not work as expected if `$file' ends in a
+ newline.
+
+ While in general it makes no sense, do not substitute a single
+ builtin with side effects, because Ash 0.2, trying to optimize,
+ does not fork a subshell to perform the command.
+
+ For instance, if you wanted to check that `cd' is silent, do not
+ use `test -z "`cd /`"' because the following can happen:
+
+ $ pwd
+ /tmp
+ $ test -z "`cd /`" && pwd
+ /
+
+ The result of `foo=`exit 1`' is left as an exercise to the reader.
+
+ The MSYS shell leaves a stray byte in the expansion of a
+ double-quoted command substitution of a native program, if the end
+ of the substitution is not aligned with the end of the double
+ quote. This may be worked around by inserting another pair of
+ quotes:
+
+ $ echo "`printf 'foo\r\n'` bar" > broken
+ $ echo "`printf 'foo\r\n'`"" bar" | cmp - broken
+ - broken differ: char 4, line 1
+
+ Upon interrupt or SIGTERM, some shells may abort a command
+ substitution, replace it with a null string, and wrongly evaluate
+ the enclosing command before entering the trap or ending the
+ script. This can lead to spurious errors:
+
+ $ sh -c 'if test `sleep 5; echo hi` = hi; then echo yes; fi'
+ $ ^C
+ sh: test: hi: unexpected operator/operand
+
+ You can avoid this by assigning the command substitution to a
+ temporary variable:
+
+ $ sh -c 'res=`sleep 5; echo hi`
+ if test "x$res" = xhi; then echo yes; fi'
+ $ ^C
+
+`$(COMMANDS)'
+ This construct is meant to replace ``COMMANDS`', and it has most
+ of the problems listed under ``COMMANDS`'.
+
+ This construct can be nested while this is impossible to do
+ portably with back quotes. Unfortunately it is not yet
+ universally supported. Most notably, even recent releases of
+ Solaris don't support it:
+
+ $ showrev -c /bin/sh | grep version
+ Command version: SunOS 5.10 Generic 121005-03 Oct 2006
+ $ echo $(echo blah)
+ syntax error: `(' unexpected
+
+ nor does IRIX 6.5's Bourne shell:
+ $ uname -a
+ IRIX firebird-image 6.5 07151432 IP22
+ $ echo $(echo blah)
+ $(echo blah)
+
+ If you do use `$(COMMANDS)', make sure that the commands do not
+ start with a parenthesis, as that would cause confusion with a
+ different notation `$((EXPRESSION))' that in modern shells is an
+ arithmetic expression not a command. To avoid the confusion,
+ insert a space between the two opening parentheses.
+
+ Avoid COMMANDS that contain unbalanced parentheses in
+ here-documents, comments, or case statement patterns, as many
+ shells mishandle them. For example, Bash 3.1, `ksh88', `pdksh'
+ 5.2.14, and Zsh 4.2.6 all mishandle the following valid command:
+
+ echo $(case x in x) echo hello;; esac)
+
+`$((EXPRESSION))'
+ Arithmetic expansion is not portable as some shells (most notably
+ Solaris 10 `/bin/sh') don't support it.
+
+ Among shells that do support `$(( ))', not all of them obey the
+ Posix rule that octal and hexadecimal constants must be recognized:
+
+ $ bash -c 'echo $(( 010 + 0x10 ))'
+ 24
+ $ zsh -c 'echo $(( 010 + 0x10 ))'
+ 26
+ $ zsh -c 'emulate sh; echo $(( 010 + 0x10 ))'
+ 24
+ $ pdksh -c 'echo $(( 010 + 0x10 ))'
+ pdksh: 010 + 0x10 : bad number `0x10'
+ $ pdksh -c 'echo $(( 010 ))'
+ 10
+
+ When it is available, using arithmetic expansion provides a
+ noticeable speedup in script execution; but testing for support
+ requires `eval' to avoid syntax errors. The following construct
+ is used by `AS_VAR_ARITH' to provide arithmetic computation when
+ all arguments are provided in decimal and without a leading zero,
+ and all operators are properly quoted and appear as distinct
+ arguments:
+
+ if ( eval 'test $(( 1 + 1 )) = 2' ) 2>/dev/null; then
+ eval 'func_arith ()
+ {
+ func_arith_result=$(( $* ))
+ }'
+ else
+ func_arith ()
+ {
+ func_arith_result=`expr "$@"`
+ }
+ fi
+ func_arith 1 + 1
+ foo=$func_arith_result
+
+`^'
+ Always quote `^', otherwise traditional shells such as `/bin/sh'
+ on Solaris 10 treat this like `|'.
+
+
+
+File: autoconf.info, Node: Assignments, Next: Parentheses, Prev: Shell Substitutions, Up: Portable Shell
+
+11.9 Assignments
+================
+
+When setting several variables in a row, be aware that the order of the
+evaluation is undefined. For instance `foo=1 foo=2; echo $foo' gives
+`1' with Solaris `/bin/sh', but `2' with Bash. You must use `;' to
+enforce the order: `foo=1; foo=2; echo $foo'.
+
+ Don't rely on the following to find `subdir/program':
+
+ PATH=subdir$PATH_SEPARATOR$PATH program
+
+as this does not work with Zsh 3.0.6. Use something like this instead:
+
+ (PATH=subdir$PATH_SEPARATOR$PATH; export PATH; exec program)
+
+ Don't rely on the exit status of an assignment: Ash 0.2 does not
+change the status and propagates that of the last statement:
+
+ $ false || foo=bar; echo $?
+ 1
+ $ false || foo=`:`; echo $?
+ 0
+
+and to make things even worse, QNX 4.25 just sets the exit status to 0
+in any case:
+
+ $ foo=`exit 1`; echo $?
+ 0
+
+ To assign default values, follow this algorithm:
+
+ 1. If the default value is a literal and does not contain any closing
+ brace, use:
+
+ : "${var='my literal'}"
+
+ 2. If the default value contains no closing brace, has to be
+ expanded, and the variable being initialized is not intended to be
+ IFS-split (i.e., it's not a list), then use:
+
+ : ${var="$default"}
+
+ 3. If the default value contains no closing brace, has to be
+ expanded, and the variable being initialized is intended to be
+ IFS-split (i.e., it's a list), then use:
+
+ var=${var="$default"}
+
+ 4. If the default value contains a closing brace, then use:
+
+ test "${var+set}" = set || var="has a '}'"
+
+ In most cases `var=${var="$default"}' is fine, but in case of doubt,
+just use the last form. *Note Shell Substitutions::, items
+`${VAR:-VALUE}' and `${VAR=VALUE}' for the rationale.
+
+
+File: autoconf.info, Node: Parentheses, Next: Slashes, Prev: Assignments, Up: Portable Shell
+
+11.10 Parentheses in Shell Scripts
+==================================
+
+Beware of two opening parentheses in a row, as many shell
+implementations treat them specially, and Posix says that a portable
+script cannot use `((' outside the `$((' form used for shell
+arithmetic. In traditional shells, `((cat))' behaves like `(cat)'; but
+many shells, including Bash and the Korn shell, treat `((cat))' as an
+arithmetic expression equivalent to `let "cat"', and may or may not
+report an error when they detect that `cat' is not a number. As another
+example, `pdksh' 5.2.14 does not treat the following code as a
+traditional shell would:
+
+ if ((true) || false); then
+ echo ok
+ fi
+
+To work around this problem, insert a space between the two opening
+parentheses. There is a similar problem and workaround with `$(('; see
+*note Shell Substitutions::.
+
+
+File: autoconf.info, Node: Slashes, Next: Special Shell Variables, Prev: Parentheses, Up: Portable Shell
+
+11.11 Slashes in Shell Scripts
+==============================
+
+Unpatched Tru64 5.1 `sh' omits the last slash of command-line arguments
+that contain two trailing slashes:
+
+ $ echo / // /// //// .// //.
+ / / // /// ./ //.
+ $ x=//
+ $ eval "echo \$x"
+ /
+ $ set -x
+ $ echo abc | tr -t ab //
+ + echo abc
+ + tr -t ab /
+ /bc
+
+ Unpatched Tru64 4.0 `sh' adds a slash after `"$var"' if the variable
+is empty and the second double-quote is followed by a word that begins
+and ends with slash:
+
+ $ sh -xc 'p=; echo "$p"/ouch/'
+ p=
+ + echo //ouch/
+ //ouch/
+
+ However, our understanding is that patches are available, so perhaps
+it's not worth worrying about working around these horrendous bugs.
+
+
+File: autoconf.info, Node: Special Shell Variables, Next: Shell Functions, Prev: Slashes, Up: Portable Shell
+
+11.12 Special Shell Variables
+=============================
+
+Some shell variables should not be used, since they can have a deep
+influence on the behavior of the shell. In order to recover a sane
+behavior from the shell, some variables should be unset; M4sh takes
+care of this and provides fallback values, whenever needed, to cater
+for a very old `/bin/sh' that does not support `unset'. (*note
+Portable Shell Programming: Portable Shell.).
+
+ As a general rule, shell variable names containing a lower-case
+letter are safe; you can define and use these variables without
+worrying about their effect on the underlying system, and without
+worrying about whether the shell changes them unexpectedly. (The
+exception is the shell variable `status', as described below.)
+
+ Here is a list of names that are known to cause trouble. This list
+is not exhaustive, but you should be safe if you avoid the name
+`status' and names containing only upper-case letters and underscores.
+
+`?'
+ Not all shells correctly reset `$?' after conditionals (*note
+ Limitations of Shell Builtins: if.). Not all shells manage `$?'
+ correctly in shell functions (*note Shell Functions::) or in traps
+ (*note Limitations of Shell Builtins: trap.). Not all shells reset
+ `$?' to zero after an empty command.
+
+ $ bash -c 'false; $empty; echo $?'
+ 0
+ $ zsh -c 'false; $empty; echo $?'
+ 1
+
+`_'
+ Many shells reserve `$_' for various purposes, e.g., the name of
+ the last command executed.
+
+`BIN_SH'
+ In Tru64, if `BIN_SH' is set to `xpg4', subsidiary invocations of
+ the standard shell conform to Posix.
+
+`CDPATH'
+ When this variable is set it specifies a list of directories to
+ search when invoking `cd' with a relative file name that did not
+ start with `./' or `../'. Posix 1003.1-2001 says that if a
+ nonempty directory name from `CDPATH' is used successfully, `cd'
+ prints the resulting absolute file name. Unfortunately this
+ output can break idioms like `abs=`cd src && pwd`' because `abs'
+ receives the name twice. Also, many shells do not conform to this
+ part of Posix; for example, `zsh' prints the result only if a
+ directory name other than `.' was chosen from `CDPATH'.
+
+ In practice the shells that have this problem also support
+ `unset', so you can work around the problem as follows:
+
+ (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+ You can also avoid output by ensuring that your directory name is
+ absolute or anchored at `./', as in `abs=`cd ./src && pwd`'.
+
+ Configure scripts use M4sh, which automatically unsets `CDPATH' if
+ possible, so you need not worry about this problem in those
+ scripts.
+
+`CLICOLOR_FORCE'
+ When this variable is set, some implementations of tools like `ls'
+ attempt to add color to their output via terminal escape
+ sequences, even when the output is not directed to a terminal, and
+ can thus cause spurious failures in scripts. Configure scripts
+ use M4sh, which automatically unsets this variable.
+
+`DUALCASE'
+ In the MKS shell, case statements and file name generation are
+ case-insensitive unless `DUALCASE' is nonzero. Autoconf-generated
+ scripts export this variable when they start up.
+
+`ENV'
+`MAIL'
+`MAILPATH'
+`PS1'
+`PS2'
+`PS4'
+ These variables should not matter for shell scripts, since they are
+ supposed to affect only interactive shells. However, at least one
+ shell (the pre-3.0 UWIN Korn shell) gets confused about whether it
+ is interactive, which means that (for example) a `PS1' with a side
+ effect can unexpectedly modify `$?'. To work around this bug,
+ M4sh scripts (including `configure' scripts) do something like
+ this:
+
+ (unset ENV) >/dev/null 2>&1 && unset ENV MAIL MAILPATH
+ PS1='$ '
+ PS2='> '
+ PS4='+ '
+
+ (actually, there is some complication due to bugs in `unset';
+ *note Limitations of Shell Builtins: unset.).
+
+`FPATH'
+ The Korn shell uses `FPATH' to find shell functions, so avoid
+ `FPATH' in portable scripts. `FPATH' is consulted after `PATH',
+ but you still need to be wary of tests that use `PATH' to find
+ whether a command exists, since they might report the wrong result
+ if `FPATH' is also set.
+
+`GREP_OPTIONS'
+ When this variable is set, some implementations of `grep' honor
+ these options, even if the options include direction to enable
+ colored output via terminal escape sequences, and the result can
+ cause spurious failures when the output is not directed to a
+ terminal. Configure scripts use M4sh, which automatically unsets
+ this variable.
+
+`IFS'
+ Long ago, shell scripts inherited `IFS' from the environment, but
+ this caused many problems so modern shells ignore any environment
+ settings for `IFS'.
+
+ Don't set the first character of `IFS' to backslash. Indeed,
+ Bourne shells use the first character (backslash) when joining the
+ components in `"$@"' and some shells then reinterpret (!) the
+ backslash escapes, so you can end up with backspace and other
+ strange characters.
+
+ The proper value for `IFS' (in regular code, not when performing
+ splits) is `<SPC><TAB><RET>'. The first character is especially
+ important, as it is used to join the arguments in `$*'; however,
+ note that traditional shells, but also bash-2.04, fail to adhere
+ to this and join with a space anyway.
+
+ M4sh guarantees that `IFS' will have the default value at the
+ beginning of a script, and many macros within autoconf rely on this
+ setting. It is okay to use blocks of shell code that temporarily
+ change the value of `IFS' in order to split on another character,
+ but remember to restore it before expanding further macros.
+
+ Unsetting `IFS' instead of resetting it to the default sequence is
+ not suggested, since code that tries to save and restore the
+ variable's value will incorrectly reset it to an empty value, thus
+ disabling field splitting:
+
+ unset IFS
+ # default separators used for field splitting
+
+ save_IFS=$IFS
+ IFS=:
+ # ...
+ IFS=$save_IFS
+ # no field splitting performed
+
+`LANG'
+`LC_ALL'
+`LC_COLLATE'
+`LC_CTYPE'
+`LC_MESSAGES'
+`LC_MONETARY'
+`LC_NUMERIC'
+`LC_TIME'
+ You should set all these variables to `C' because so much
+ configuration code assumes the C locale and Posix requires that
+ locale environment variables be set to `C' if the C locale is
+ desired; `configure' scripts and M4sh do that for you. Export
+ these variables after setting them.
+
+`LANGUAGE'
+ `LANGUAGE' is not specified by Posix, but it is a GNU extension
+ that overrides `LC_ALL' in some cases, so you (or M4sh) should set
+ it too.
+
+`LC_ADDRESS'
+`LC_IDENTIFICATION'
+`LC_MEASUREMENT'
+`LC_NAME'
+`LC_PAPER'
+`LC_TELEPHONE'
+ These locale environment variables are GNU extensions. They are
+ treated like their Posix brethren (`LC_COLLATE', etc.) as
+ described above.
+
+`LINENO'
+ Most modern shells provide the current line number in `LINENO'.
+ Its value is the line number of the beginning of the current
+ command. M4sh, and hence Autoconf, attempts to execute
+ `configure' with a shell that supports `LINENO'. If no such shell
+ is available, it attempts to implement `LINENO' with a Sed prepass
+ that replaces each instance of the string `$LINENO' (not followed
+ by an alphanumeric character) with the line's number. In M4sh
+ scripts you should execute `AS_LINENO_PREPARE' so that these
+ workarounds are included in your script; configure scripts do this
+ automatically in `AC_INIT'.
+
+ You should not rely on `LINENO' within `eval' or shell functions,
+ as the behavior differs in practice. The presence of a quoted
+ newline within simple commands can alter which line number is used
+ as the starting point for `$LINENO' substitutions within that
+ command. Also, the possibility of the Sed prepass means that you
+ should not rely on `$LINENO' when quoted, when in here-documents,
+ or when line continuations are used. Subshells should be OK,
+ though. In the following example, lines 1, 9, and 14 are
+ portable, but the other instances of `$LINENO' do not have
+ deterministic values:
+
+ $ cat lineno
+ echo 1. $LINENO
+ echo "2. $LINENO
+ 3. $LINENO"
+ cat <<EOF
+ 5. $LINENO
+ 6. $LINENO
+ 7. \$LINENO
+ EOF
+ ( echo 9. $LINENO )
+ eval 'echo 10. $LINENO'
+ eval 'echo 11. $LINENO
+ echo 12. $LINENO'
+ echo 13. '$LINENO'
+ echo 14. $LINENO '
+ 15.' $LINENO
+ f () { echo $1 $LINENO;
+ echo $1 $LINENO }
+ f 18.
+ echo 19. \
+ $LINENO
+ $ bash-3.2 ./lineno
+ 1. 1
+ 2. 3
+ 3. 3
+ 5. 4
+ 6. 4
+ 7. $LINENO
+ 9. 9
+ 10. 10
+ 11. 12
+ 12. 13
+ 13. $LINENO
+ 14. 14
+ 15. 14
+ 18. 16
+ 18. 17
+ 19. 19
+ $ zsh-4.3.4 ./lineno
+ 1. 1
+ 2. 2
+ 3. 2
+ 5. 4
+ 6. 4
+ 7. $LINENO
+ 9. 9
+ 10. 1
+ 11. 1
+ 12. 2
+ 13. $LINENO
+ 14. 14
+ 15. 14
+ 18. 0
+ 18. 1
+ 19. 19
+ $ pdksh-5.2.14 ./lineno
+ 1. 1
+ 2. 2
+ 3. 2
+ 5. 4
+ 6. 4
+ 7. $LINENO
+ 9. 9
+ 10. 0
+ 11. 0
+ 12. 0
+ 13. $LINENO
+ 14. 14
+ 15. 14
+ 18. 16
+ 18. 17
+ 19. 19
+ $ sed '=' <lineno |
+ > sed '
+ > N
+ > s,$,-,
+ > t loop
+ > :loop
+ > s,^\([0-9]*\)\(.*\)[$]LINENO\([^a-zA-Z0-9_]\),\1\2\1\3,
+ > t loop
+ > s,-$,,
+ > s,^[0-9]*\n,,
+ > ' |
+ > sh
+ 1. 1
+ 2. 2
+ 3. 3
+ 5. 5
+ 6. 6
+ 7. \7
+ 9. 9
+ 10. 10
+ 11. 11
+ 12. 12
+ 13. 13
+ 14. 14
+ 15. 15
+ 18. 16
+ 18. 17
+ 19. 20
+
+ In particular, note that `config.status' (and any other subsidiary
+ script created by `AS_INIT_GENERATED') might report line numbers
+ relative to the parent script as a result of the potential Sed
+ pass.
+
+`NULLCMD'
+ When executing the command `>foo', `zsh' executes `$NULLCMD >foo'
+ unless it is operating in Bourne shell compatibility mode and the
+ `zsh' version is newer than 3.1.6-dev-18. If you are using an
+ older `zsh' and forget to set `NULLCMD', your script might be
+ suspended waiting for data on its standard input.
+
+`options'
+ For `zsh' 4.3.10, `options' is treated as an associative array
+ even after `emulate sh', so it should not be used.
+
+`PATH_SEPARATOR'
+ On DJGPP systems, the `PATH_SEPARATOR' environment variable can be
+ set to either `:' or `;' to control the path separator Bash uses
+ to set up certain environment variables (such as `PATH'). You can
+ set this variable to `;' if you want `configure' to use `;' as a
+ separator; this might be useful if you plan to use non-Posix
+ shells to execute files. *Note File System Conventions::, for
+ more information about `PATH_SEPARATOR'.
+
+`POSIXLY_CORRECT'
+ In the GNU environment, exporting `POSIXLY_CORRECT' with any value
+ (even empty) causes programs to try harder to conform to Posix.
+ Autoconf does not directly manipulate this variable, but `bash'
+ ties the shell variable `POSIXLY_CORRECT' to whether the script is
+ running in Posix mode. Therefore, take care when exporting or
+ unsetting this variable, so as not to change whether `bash' is in
+ Posix mode.
+
+ $ bash --posix -c 'set -o | grep posix
+ > unset POSIXLY_CORRECT
+ > set -o | grep posix'
+ posix on
+ posix off
+
+`PWD'
+ Posix 1003.1-2001 requires that `cd' and `pwd' must update the
+ `PWD' environment variable to point to the logical name of the
+ current directory, but traditional shells do not support this.
+ This can cause confusion if one shell instance maintains `PWD' but
+ a subsidiary and different shell does not know about `PWD' and
+ executes `cd'; in this case `PWD' points to the wrong directory.
+ Use ``pwd`' rather than `$PWD'.
+
+`RANDOM'
+ Many shells provide `RANDOM', a variable that returns a different
+ integer each time it is used. Most of the time, its value does not
+ change when it is not used, but on IRIX 6.5 the value changes all
+ the time. This can be observed by using `set'. It is common
+ practice to use `$RANDOM' as part of a file name, but code
+ shouldn't rely on `$RANDOM' expanding to a nonempty string.
+
+`status'
+ This variable is an alias to `$?' for `zsh' (at least 3.1.6),
+ hence read-only. Do not use it.
+
+
+File: autoconf.info, Node: Shell Functions, Next: Limitations of Builtins, Prev: Special Shell Variables, Up: Portable Shell
+
+11.13 Shell Functions
+=====================
+
+Nowadays, it is difficult to find a shell that does not support shell
+functions at all. However, some differences should be expected.
+
+ When declaring a shell function, you must include whitespace between
+the `)' after the function name and the start of the compound
+expression, to avoid upsetting `ksh'. While it is possible to use any
+compound command, most scripts use `{...}'.
+
+ $ /bin/sh -c 'a(){ echo hi;}; a'
+ hi
+ $ ksh -c 'a(){ echo hi;}; a'
+ ksh: syntax error at line 1: `}' unexpected
+ $ ksh -c 'a() { echo hi;}; a'
+ hi
+
+ Inside a shell function, you should not rely on the error status of a
+subshell if the last command of that subshell was `exit' or `trap', as
+this triggers bugs in zsh 4.x; while Autoconf tries to find a shell
+that does not exhibit the bug, zsh might be the only shell present on
+the user's machine.
+
+ Likewise, the state of `$?' is not reliable when entering a shell
+function. This has the effect that using a function as the first
+command in a `trap' handler can cause problems.
+
+ $ bash -c 'foo() { echo $?; }; trap foo 0; (exit 2); exit 2'; echo $?
+ 2
+ 2
+ $ ash -c 'foo() { echo $?; }; trap foo 0; (exit 2); exit 2'; echo $?
+ 0
+ 2
+
+ DJGPP bash 2.04 has a bug in that `return' from a shell function
+which also used a command substitution causes a segmentation fault. To
+work around the issue, you can use `return' from a subshell, or
+`AS_SET_STATUS' as last command in the execution flow of the function
+(*note Common Shell Constructs::).
+
+ Not all shells treat shell functions as simple commands impacted by
+`set -e', for example with Solaris 10 `/bin/sh':
+
+ $ bash -c 'f() { return 1; }; set -e; f; echo oops'
+ $ /bin/sh -c 'f() { return 1; }; set -e; f; echo oops'
+ oops
+
+ Shell variables and functions may share the same namespace, for
+example with Solaris 10 `/bin/sh':
+
+ $ f () { :; }; f=; f
+ f: not found
+
+For this reason, Autoconf (actually M4sh, *note Programming in M4sh::)
+uses the prefix `as_fn_' for its functions.
+
+ Handling of positional parameters and shell options varies among
+shells. For example, Korn shells reset and restore trace output (`set
+-x') and other options upon function entry and exit. Inside a function,
+IRIX sh sets `$0' to the function name.
+
+ It is not portable to pass temporary environment variables to shell
+functions. Solaris `/bin/sh' does not see the variable. Meanwhile,
+not all shells follow the Posix rule that the assignment must affect
+the current environment in the same manner as special built-ins.
+
+ $ /bin/sh -c 'func() { echo $a;}; a=1 func; echo $a'
+ =>
+ =>
+ $ ash -c 'func() { echo $a;}; a=1 func; echo $a'
+ =>1
+ =>
+ $ bash -c 'set -o posix; func() { echo $a;}; a=1 func; echo $a'
+ =>1
+ =>1
+
+ Some ancient Bourne shell variants with function support did not
+reset `$I, I >= 0', upon function exit, so effectively the arguments of
+the script were lost after the first function invocation. It is
+probably not worth worrying about these shells any more.
+
+ With AIX sh, a `trap' on 0 installed in a shell function triggers at
+function exit rather than at script exit. *Note Limitations of Shell
+Builtins: trap.
+
+
+File: autoconf.info, Node: Limitations of Builtins, Next: Limitations of Usual Tools, Prev: Shell Functions, Up: Portable Shell
+
+11.14 Limitations of Shell Builtins
+===================================
+
+No, no, we are serious: some shells do have limitations! :)
+
+ You should always keep in mind that any builtin or command may
+support options, and therefore differ in behavior with arguments
+starting with a dash. For instance, even the innocent `echo "$word"'
+can give unexpected results when `word' starts with a dash. It is
+often possible to avoid this problem using `echo "x$word"', taking the
+`x' into account later in the pipe. Many of these limitations can be
+worked around using M4sh (*note Programming in M4sh::).
+
+`.'
+ Use `.' only with regular files (use `test -f'). Bash 2.03, for
+ instance, chokes on `. /dev/null'. Remember that `.' uses `PATH'
+ if its argument contains no slashes. Also, some shells, including
+ bash 3.2, implicitly append the current directory to this `PATH'
+ search, even though Posix forbids it. So if you want to use `.'
+ on a file `foo' in the current directory, you must use `. ./foo'.
+
+ Not all shells gracefully handle syntax errors within a sourced
+ file. On one extreme, some non-interactive shells abort the
+ entire script. On the other, `zsh' 4.3.10 has a bug where it
+ fails to react to the syntax error.
+
+ $ echo 'fi' > syntax
+ $ bash -c '. ./syntax; echo $?'
+ ./syntax: line 1: syntax error near unexpected token `fi'
+ ./syntax: line 1: `fi'
+ 1
+ $ ash -c '. ./syntax; echo $?'
+ ./syntax: 1: Syntax error: "fi" unexpected
+ $ zsh -c '. ./syntax; echo $?'
+ ./syntax:1: parse error near `fi'
+ 0
+
+`!'
+ The Unix version 7 shell did not support negating the exit status
+ of commands with `!', and this feature is still absent from some
+ shells (e.g., Solaris `/bin/sh'). Other shells, such as FreeBSD
+ `/bin/sh' or `ash', have bugs when using `!':
+
+ $ sh -c '! : | :'; echo $?
+ 1
+ $ ash -c '! : | :'; echo $?
+ 0
+ $ sh -c '! { :; }'; echo $?
+ 1
+ $ ash -c '! { :; }'; echo $?
+ {: not found
+ Syntax error: "}" unexpected
+ 2
+
+ Shell code like this:
+
+ if ! cmp file1 file2 >/dev/null 2>&1; then
+ echo files differ or trouble
+ fi
+
+ is therefore not portable in practice. Typically it is easy to
+ rewrite such code, e.g.:
+
+ cmp file1 file2 >/dev/null 2>&1 ||
+ echo files differ or trouble
+
+ More generally, one can always rewrite `! COMMAND' as:
+
+ if COMMAND; then (exit 1); else :; fi
+
+`{...}'
+ Bash 3.2 (and earlier versions) sometimes does not properly set
+ `$?' when failing to write redirected output of a compound command.
+ This problem is most commonly observed with `{...}'; it does not
+ occur with `(...)'. For example:
+
+ $ bash -c '{ echo foo; } >/bad; echo $?'
+ bash: line 1: /bad: Permission denied
+ 0
+ $ bash -c 'while :; do echo; done >/bad; echo $?'
+ bash: line 1: /bad: Permission denied
+ 0
+
+ To work around the bug, prepend `:;':
+
+ $ bash -c ':;{ echo foo; } >/bad; echo $?'
+ bash: line 1: /bad: Permission denied
+ 1
+
+ Posix requires a syntax error if a brace list has no contents.
+ However, not all shells obey this rule; and on shells where empty
+ lists are permitted, the effect on `$?' is inconsistent. To avoid
+ problems, ensure that a brace list is never empty.
+
+ $ bash -c 'false; { }; echo $?' || echo $?
+ bash: line 1: syntax error near unexpected token `}'
+ bash: line 1: `false; { }; echo $?'
+ 2
+ $ zsh -c 'false; { }; echo $?' || echo $?
+ 1
+ $ pdksh -c 'false; { }; echo $?' || echo $?
+ 0
+
+`break'
+ The use of `break 2' etc. is safe.
+
+`case'
+ You don't need to quote the argument; no splitting is performed.
+
+ You don't need the final `;;', but you should use it.
+
+ Posix requires support for `case' patterns with opening
+ parentheses like this:
+
+ case $file_name in
+ (*.c) echo "C source code";;
+ esac
+
+ but the `(' in this example is not portable to many Bourne shell
+ implementations, which is a pity for those of us using tools that
+ rely on balanced parentheses. For instance, with Solaris
+ `/bin/sh':
+
+ $ case foo in (foo) echo foo;; esac
+ error-->syntax error: `(' unexpected
+
+ The leading `(' can be omitted safely. Unfortunately, there are
+ contexts where unbalanced parentheses cause other problems, such
+ as when using a syntax-highlighting editor that searches for the
+ balancing counterpart, or more importantly, when using a case
+ statement as an underquoted argument to an Autoconf macro. *Note
+ Balancing Parentheses::, for tradeoffs involved in various styles
+ of dealing with unbalanced `)'.
+
+ Zsh handles pattern fragments derived from parameter expansions or
+ command substitutions as though quoted:
+
+ $ pat=\?; case aa in ?$pat) echo match;; esac
+ $ pat=\?; case a? in ?$pat) echo match;; esac
+ match
+
+ Because of a bug in its `fnmatch', Bash fails to properly handle
+ backslashes in character classes:
+
+ bash-2.02$ case /tmp in [/\\]*) echo OK;; esac
+ bash-2.02$
+
+ This is extremely unfortunate, since you are likely to use this
+ code to handle Posix or MS-DOS absolute file names. To work
+ around this bug, always put the backslash first:
+
+ bash-2.02$ case '\TMP' in [\\/]*) echo OK;; esac
+ OK
+ bash-2.02$ case /tmp in [\\/]*) echo OK;; esac
+ OK
+
+ Many Bourne shells cannot handle closing brackets in character
+ classes correctly.
+
+ Some shells also have problems with backslash escaping in case you
+ do not want to match the backslash: both a backslash and the
+ escaped character match this pattern. To work around this,
+ specify the character class in a variable, so that quote removal
+ does not apply afterwards, and the special characters don't have
+ to be backslash-escaped:
+
+ $ case '\' in [\<]) echo OK;; esac
+ OK
+ $ scanset='[<]'; case '\' in $scanset) echo OK;; esac
+ $
+
+ Even with this, Solaris `ksh' matches a backslash if the set
+ contains any of the characters `|', `&', `(', or `)'.
+
+ Conversely, Tru64 `ksh' (circa 2003) erroneously always matches a
+ closing parenthesis if not specified in a character class:
+
+ $ case foo in *\)*) echo fail ;; esac
+ fail
+ $ case foo in *')'*) echo fail ;; esac
+ fail
+
+ Some shells, such as Ash 0.3.8, are confused by an empty
+ `case'/`esac':
+
+ ash-0.3.8 $ case foo in esac;
+ error-->Syntax error: ";" unexpected (expecting ")")
+
+ Posix requires `case' to give an exit status of 0 if no cases
+ match. However, `/bin/sh' in Solaris 10 does not obey this rule.
+ Meanwhile, it is unclear whether a case that matches, but contains
+ no statements, must also change the exit status to 0. The M4sh
+ macro `AS_CASE' works around these inconsistencies.
+
+ $ bash -c 'case `false` in ?) ;; esac; echo $?'
+ 0
+ $ /bin/sh -c 'case `false` in ?) ;; esac; echo $?'
+ 255
+
+`cd'
+ Posix 1003.1-2001 requires that `cd' must support the `-L'
+ ("logical") and `-P' ("physical") options, with `-L' being the
+ default. However, traditional shells do not support these
+ options, and their `cd' command has the `-P' behavior.
+
+ Portable scripts should assume neither option is supported, and
+ should assume neither behavior is the default. This can be a bit
+ tricky, since the Posix default behavior means that, for example,
+ `ls ..' and `cd ..' may refer to different directories if the
+ current logical directory is a symbolic link. It is safe to use
+ `cd DIR' if DIR contains no `..' components. Also,
+ Autoconf-generated scripts check for this problem when computing
+ variables like `ac_top_srcdir' (*note Configuration Actions::), so
+ it is safe to `cd' to these variables.
+
+ Posix states that behavior is undefined if `cd' is given an
+ explicit empty argument. Some shells do nothing, some change to
+ the first entry in `CDPATH', some change to `HOME', and some exit
+ the shell rather than returning an error. Unfortunately, this
+ means that if `$var' is empty, then `cd "$var"' is less predictable
+ than `cd $var' (at least the latter is well-behaved in all shells
+ at changing to `HOME', although this is probably not what you
+ wanted in a script). You should check that a directory name was
+ supplied before trying to change locations.
+
+ *Note Special Shell Variables::, for portability problems involving
+ `cd' and the `CDPATH' environment variable. Also please see the
+ discussion of the `pwd' command.
+
+`echo'
+ The simple `echo' is probably the most surprising source of
+ portability troubles. It is not possible to use `echo' portably
+ unless both options and escape sequences are omitted. Don't
+ expect any option.
+
+ Do not use backslashes in the arguments, as there is no consensus
+ on their handling. For `echo '\n' | wc -l', the `sh' of Solaris
+ outputs 2, but Bash and Zsh (in `sh' emulation mode) output 1.
+ The problem is truly `echo': all the shells understand `'\n'' as
+ the string composed of a backslash and an `n'. Within a command
+ substitution, `echo 'string\c'' will mess up the internal state of
+ ksh88 on AIX 6.1 so that it will print the first character `s'
+ only, followed by a newline, and then entirely drop the output of
+ the next echo in a command substitution.
+
+ Because of these problems, do not pass a string containing
+ arbitrary characters to `echo'. For example, `echo "$foo"' is safe
+ only if you know that FOO's value cannot contain backslashes and
+ cannot start with `-'.
+
+ If this may not be true, `printf' is in general safer and easier
+ to use than `echo' and `echo -n'. Thus, scripts where portability
+ is not a major concern should use `printf '%s\n'' whenever `echo'
+ could fail, and similarly use `printf %s' instead of `echo -n'.
+ For portable shell scripts, instead, it is suggested to use a
+ here-document like this:
+
+ cat <<EOF
+ $foo
+ EOF
+
+ Alternatively, M4sh provides `AS_ECHO' and `AS_ECHO_N' macros
+ which choose between various portable implementations: `echo' or
+ `print' where they work, `printf' if it is available, or else
+ other creative tricks in order to work around the above problems.
+
+`eval'
+ The `eval' command is useful in limited circumstances, e.g., using
+ commands like `eval table_$key=\$value' and `eval
+ value=table_$key' to simulate a hash table when the key is known
+ to be alphanumeric.
+
+ You should also be wary of common bugs in `eval' implementations.
+ In some shell implementations (e.g., older `ash', OpenBSD 3.8
+ `sh', `pdksh' v5.2.14 99/07/13.2, and `zsh' 4.2.5), the arguments
+ of `eval' are evaluated in a context where `$?' is 0, so they
+ exhibit behavior like this:
+
+ $ false; eval 'echo $?'
+ 0
+
+ The correct behavior here is to output a nonzero value, but
+ portable scripts should not rely on this.
+
+ You should not rely on `LINENO' within `eval'. *Note Special
+ Shell Variables::.
+
+ Note that, even though these bugs are easily avoided, `eval' is
+ tricky to use on arbitrary arguments. It is obviously unwise to
+ use `eval $cmd' if the string value of `cmd' was derived from an
+ untrustworthy source. But even if the string value is valid,
+ `eval $cmd' might not work as intended, since it causes field
+ splitting and file name expansion to occur twice, once for the
+ `eval' and once for the command itself. It is therefore safer to
+ use `eval "$cmd"'. For example, if CMD has the value `cat
+ test?.c', `eval $cmd' might expand to the equivalent of `cat
+ test;.c' if there happens to be a file named `test;.c' in the
+ current directory; and this in turn mistakenly attempts to invoke
+ `cat' on the file `test' and then execute the command `.c'. To
+ avoid this problem, use `eval "$cmd"' rather than `eval $cmd'.
+
+ However, suppose that you want to output the text of the evaluated
+ command just before executing it. Assuming the previous example,
+ `echo "Executing: $cmd"' outputs `Executing: cat test?.c', but
+ this output doesn't show the user that `test;.c' is the actual name
+ of the copied file. Conversely, `eval "echo Executing: $cmd"'
+ works on this example, but it fails with `cmd='cat foo >bar'',
+ since it mistakenly replaces the contents of `bar' by the string
+ `cat foo'. No simple, general, and portable solution to this
+ problem is known.
+
+`exec'
+ Posix describes several categories of shell built-ins. Special
+ built-ins (such as `exit') must impact the environment of the
+ current shell, and need not be available through `exec'. All
+ other built-ins are regular, and must not propagate variable
+ assignments to the environment of the current shell. However, the
+ group of regular built-ins is further distinguished by commands
+ that do not require a `PATH' search (such as `cd'), in contrast to
+ built-ins that are offered as a more efficient version of
+ something that must still be found in a `PATH' search (such as
+ `echo'). Posix is not clear on whether `exec' must work with the
+ list of 17 utilities that are invoked without a `PATH' search, and
+ many platforms lack an executable for some of those built-ins:
+
+ $ sh -c 'exec cd /tmp'
+ sh: line 0: exec: cd: not found
+
+ All other built-ins that provide utilities specified by Posix must
+ have a counterpart executable that exists on `PATH', although Posix
+ allows `exec' to use the built-in instead of the executable. For
+ example, contrast `bash' 3.2 and `pdksh' 5.2.14:
+
+ $ bash -c 'pwd --version' | head -n1
+ bash: line 0: pwd: --: invalid option
+ pwd: usage: pwd [-LP]
+ $ bash -c 'exec pwd --version' | head -n1
+ pwd (GNU coreutils) 6.10
+ $ pdksh -c 'exec pwd --version' | head -n1
+ pdksh: pwd: --: unknown option
+
+ When it is desired to avoid a regular shell built-in, the
+ workaround is to use some other forwarding command, such as `env'
+ or `nice', that will ensure a path search:
+
+ $ pdksh -c 'exec true --version' | head -n1
+ $ pdksh -c 'nice true --version' | head -n1
+ true (GNU coreutils) 6.10
+ $ pdksh -c 'env true --version' | head -n1
+ true (GNU coreutils) 6.10
+
+`exit'
+ The default value of `exit' is supposed to be `$?'; unfortunately,
+ some shells, such as the DJGPP port of Bash 2.04, just perform
+ `exit 0'.
+
+ bash-2.04$ foo=`exit 1` || echo fail
+ fail
+ bash-2.04$ foo=`(exit 1)` || echo fail
+ fail
+ bash-2.04$ foo=`(exit 1); exit` || echo fail
+ bash-2.04$
+
+ Using `exit $?' restores the expected behavior.
+
+ Some shell scripts, such as those generated by `autoconf', use a
+ trap to clean up before exiting. If the last shell command exited
+ with nonzero status, the trap also exits with nonzero status so
+ that the invoker can tell that an error occurred.
+
+ Unfortunately, in some shells, such as Solaris `/bin/sh', an exit
+ trap ignores the `exit' command's argument. In these shells, a
+ trap cannot determine whether it was invoked by plain `exit' or by
+ `exit 1'. Instead of calling `exit' directly, use the
+ `AC_MSG_ERROR' macro that has a workaround for this problem.
+
+`export'
+ The builtin `export' dubs a shell variable "environment variable".
+ Each update of exported variables corresponds to an update of the
+ environment variables. Conversely, each environment variable
+ received by the shell when it is launched should be imported as a
+ shell variable marked as exported.
+
+ Alas, many shells, such as Solaris `/bin/sh', IRIX 6.3, IRIX 5.2,
+ AIX 4.1.5, and Digital Unix 4.0, forget to `export' the
+ environment variables they receive. As a result, two variables
+ coexist: the environment variable and the shell variable. The
+ following code demonstrates this failure:
+
+ #!/bin/sh
+ echo $FOO
+ FOO=bar
+ echo $FOO
+ exec /bin/sh $0
+
+ when run with `FOO=foo' in the environment, these shells print
+ alternately `foo' and `bar', although they should print only `foo'
+ and then a sequence of `bar's.
+
+ Therefore you should `export' again each environment variable that
+ you update; the export can occur before or after the assignment.
+
+ Posix is not clear on whether the `export' of an undefined
+ variable causes the variable to be defined with the value of an
+ empty string, or merely marks any future definition of a variable
+ by that name for export. Various shells behave differently in
+ this regard:
+
+ $ sh -c 'export foo; env | grep foo'
+ $ ash -c 'export foo; env | grep foo'
+ foo=
+
+ Posix requires `export' to honor assignments made as arguments,
+ but older shells do not support this, including `/bin/sh' in
+ Solaris 10. Portable scripts should separate assignments and
+ exports into different statements.
+
+ $ bash -c 'export foo=bar; echo $foo'
+ bar
+ $ /bin/sh -c 'export foo=bar; echo $foo'
+ /bin/sh: foo=bar: is not an identifier
+ $ /bin/sh -c 'export foo; foo=bar; echo $foo'
+ bar
+
+`false'
+ Don't expect `false' to exit with status 1: in native Solaris
+ `/bin/false' exits with status 255.
+
+`for'
+ To loop over positional arguments, use:
+
+ for arg
+ do
+ echo "$arg"
+ done
+
+ You may _not_ leave the `do' on the same line as `for', since some
+ shells improperly grok:
+
+ for arg; do
+ echo "$arg"
+ done
+
+ If you want to explicitly refer to the positional arguments, given
+ the `$@' bug (*note Shell Substitutions::), use:
+
+ for arg in ${1+"$@"}; do
+ echo "$arg"
+ done
+
+ But keep in mind that Zsh, even in Bourne shell emulation mode,
+ performs word splitting on `${1+"$@"}'; see *note Shell
+ Substitutions::, item `$@', for more.
+
+ In Solaris `/bin/sh', when the list of arguments of a `for' loop
+ starts with _unquoted_ tokens looking like variable assignments,
+ the loop is not executed on those tokens:
+
+ $ /bin/sh -c 'for v in a=b c=d x e=f; do echo $v; done'
+ x
+ e=f
+
+ Thankfully, quoting the assignment-like tokens, or starting the
+ list with other tokens (including unquoted variable expansion that
+ results in an assignment-like result), avoids the problem, so it
+ is easy to work around:
+
+ $ /bin/sh -c 'for v in "a=b"; do echo $v; done'
+ a=b
+ $ /bin/sh -c 'x=a=b; for v in $x c=d; do echo $v; done'
+ a=b
+ c=d
+
+`if'
+ Using `!' is not portable. Instead of:
+
+ if ! cmp -s file file.new; then
+ mv file.new file
+ fi
+
+ use:
+
+ if cmp -s file file.new; then :; else
+ mv file.new file
+ fi
+
+ Or, especially if the "else" branch is short, you can use `||'.
+ In M4sh, the `AS_IF' macro provides an easy way to write these
+ kinds of conditionals:
+
+ AS_IF([cmp -s file file.new], [], [mv file.new file])
+
+ This is especially useful in other M4 macros, where the "then" and
+ "else" branches might be macro arguments.
+
+ Some very old shells did not reset the exit status from an `if'
+ with no `else':
+
+ $ if (exit 42); then true; fi; echo $?
+ 42
+
+ whereas a proper shell should have printed `0'. But this is no
+ longer a portability problem; any shell that supports functions
+ gets it correct. However, it explains why some makefiles have
+ lengthy constructs:
+
+ if test -f "$file"; then
+ install "$file" "$dest"
+ else
+ :
+ fi
+
+`printf'
+ A format string starting with a `-' can cause problems. Bash
+ interprets it as an option and gives an error. And `--' to mark
+ the end of options is not good in the NetBSD Almquist shell (e.g.,
+ 0.4.6) which takes that literally as the format string. Putting
+ the `-' in a `%c' or `%s' is probably easiest:
+
+ printf %s -foo
+
+ Bash 2.03 mishandles an escape sequence that happens to evaluate
+ to `%':
+
+ $ printf '\045'
+ bash: printf: `%': missing format character
+
+ Large outputs may cause trouble. On Solaris 2.5.1 through 10, for
+ example, `/usr/bin/printf' is buggy, so when using `/bin/sh' the
+ command `printf %010000x 123' normally dumps core.
+
+ Since `printf' is not always a shell builtin, there is a potential
+ speed penalty for using `printf '%s\n'' as a replacement for an
+ `echo' that does not interpret `\' or leading `-'. With Solaris
+ `ksh', it is possible to use `print -r --' for this role instead.
+
+ *Note Limitations of Shell Builtins: echo for a discussion of
+ portable alternatives to both `printf' and `echo'.
+
+`pwd'
+ With modern shells, plain `pwd' outputs a "logical" directory
+ name, some of whose components may be symbolic links. These
+ directory names are in contrast to "physical" directory names,
+ whose components are all directories.
+
+ Posix 1003.1-2001 requires that `pwd' must support the `-L'
+ ("logical") and `-P' ("physical") options, with `-L' being the
+ default. However, traditional shells do not support these
+ options, and their `pwd' command has the `-P' behavior.
+
+ Portable scripts should assume neither option is supported, and
+ should assume neither behavior is the default. Also, on many hosts
+ `/bin/pwd' is equivalent to `pwd -P', but Posix does not require
+ this behavior and portable scripts should not rely on it.
+
+ Typically it's best to use plain `pwd'. On modern hosts this
+ outputs logical directory names, which have the following
+ advantages:
+
+ * Logical names are what the user specified.
+
+ * Physical names may not be portable from one installation host
+ to another due to network file system gymnastics.
+
+ * On modern hosts `pwd -P' may fail due to lack of permissions
+ to some parent directory, but plain `pwd' cannot fail for this
+ reason.
+
+ Also please see the discussion of the `cd' command.
+
+`read'
+ No options are portable, not even support `-r' (Solaris `/bin/sh'
+ for example). Tru64/OSF 5.1 `sh' treats `read' as a special
+ built-in, so it may exit if input is redirected from a
+ non-existent or unreadable file.
+
+`set'
+ With the FreeBSD 6.0 shell, the `set' command (without any
+ options) does not sort its output.
+
+ The `set' builtin faces the usual problem with arguments starting
+ with a dash. Modern shells such as Bash or Zsh understand `--' to
+ specify the end of the options (any argument after `--' is a
+ parameter, even `-x' for instance), but many traditional shells
+ (e.g., Solaris 10 `/bin/sh') simply stop option processing as soon
+ as a non-option argument is found. Therefore, use `dummy' or
+ simply `x' to end the option processing, and use `shift' to pop it
+ out:
+
+ set x $my_list; shift
+
+ Avoid `set -', e.g., `set - $my_list'. Posix no longer requires
+ support for this command, and in traditional shells `set -
+ $my_list' resets the `-v' and `-x' options, which makes scripts
+ harder to debug.
+
+ Some nonstandard shells do not recognize more than one option
+ (e.g., `set -e -x' assigns `-x' to the command line). It is
+ better to combine them:
+
+ set -ex
+
+ The option `-e' has historically been underspecified, with enough
+ ambiguities to cause numerous differences across various shell
+ implementations; see for example this overview
+ (http://www.in-ulm.de/~mascheck/various/set-e/), or this link
+ (http://www.austingroupbugs.net/view.php?id=52), documenting a
+ change to Posix 2008 to match `ksh88' behavior. Note that mixing
+ `set -e' and shell functions is asking for surprises:
+
+ set -e
+ doit()
+ {
+ rm file
+ echo one
+ }
+ doit || echo two
+
+ According to the recommendation, `one' should always be output
+ regardless of whether the `rm' failed, because it occurs within
+ the body of the shell function `doit' invoked on the left side of
+ `||', where the effects of `set -e' are not enforced. Likewise,
+ `two' should never be printed, since the failure of `rm' does not
+ abort the function, such that the status of `doit' is 0.
+
+ The BSD shell has had several problems with the `-e' option.
+ Older versions of the BSD shell (circa 1990) mishandled `&&',
+ `||', `if', and `case' when `-e' was in effect, causing the shell
+ to exit unexpectedly in some cases. This was particularly a
+ problem with makefiles, and led to circumlocutions like `sh -c
+ 'test -f file || touch file'', where the seemingly-unnecessary `sh
+ -c '...'' wrapper works around the bug (*note Failure in Make
+ Rules::).
+
+ Even relatively-recent versions of the BSD shell (e.g., OpenBSD
+ 3.4) wrongly exit with `-e' if the last command within a compound
+ statement fails and is guarded by an `&&' only. For example:
+
+ #! /bin/sh
+ set -e
+ foo=''
+ test -n "$foo" && exit 1
+ echo one
+ if :; then
+ test -n "$foo" && exit 1
+ echo two
+ test -n "$foo" && exit 1
+ fi
+ echo three
+
+ does not print `three'. One workaround is to change the last
+ instance of `test -n "$foo" && exit 1' to be `if test -n "$foo";
+ then exit 1; fi' instead. Another possibility is to warn BSD
+ users not to use `sh -e'.
+
+ When `set -e' is in effect, a failed command substitution in
+ Solaris `/bin/sh' cannot be ignored, even with `||'.
+
+ $ /bin/sh -c 'set -e; foo=`false` || echo foo; echo bar'
+ $ bash -c 'set -e; foo=`false` || echo foo; echo bar'
+ foo
+ bar
+
+ Moreover, a command substitution, successful or not, causes this
+ shell to exit from a failing outer command even in presence of an
+ `&&' list:
+
+ $ bash -c 'set -e; false `true` && echo notreached; echo ok'
+ ok
+ $ sh -c 'set -e; false `true` && echo notreached; echo ok'
+ $
+
+ Portable scripts should not use `set -e' if `trap' is used to
+ install an exit handler. This is because Tru64/OSF 5.1 `sh'
+ sometimes enters the trap handler with the exit status of the
+ command prior to the one that triggered the errexit handler:
+
+ $ sh -ec 'trap '\''echo $?'\'' 0; false'
+ 0
+ $ sh -c 'set -e; trap '\''echo $?'\'' 0; false'
+ 1
+
+ Thus, when writing a script in M4sh, rather than trying to rely on
+ `set -e', it is better to append `|| AS_EXIT' to any statement
+ where it is desirable to abort on failure.
+
+ Job control is not provided by all shells, so the use of `set -m'
+ or `set -b' must be done with care. When using `zsh' in native
+ mode, asynchronous notification (`set -b') is enabled by default,
+ and using `emulate sh' to switch to Posix mode does not clear this
+ setting (although asynchronous notification has no impact unless
+ job monitoring is also enabled). Also, `zsh' 4.3.10 and earlier
+ have a bug where job control can be manipulated in interactive
+ shells, but not in subshells or scripts. Furthermore, some
+ shells, like `pdksh', fail to treat subshells as interactive, even
+ though the parent shell was.
+
+ $ echo $ZSH_VERSION
+ 4.3.10
+ $ set -m; echo $?
+ 0
+ $ zsh -c 'set -m; echo $?'
+ set: can't change option: -m
+ $ (set -m); echo $?
+ set: can't change option: -m
+ 1
+ $ pdksh -ci 'echo $-; (echo $-)'
+ cim
+ c
+
+ Use of `set -n' (typically via `sh -n script') to validate a
+ script is not foolproof. Modern `ksh93' tries to be helpful by
+ informing you about better syntax, but switching the script to use
+ the suggested syntax in order to silence the warnings would render
+ the script no longer portable to older shells:
+
+ $ ksh -nc '``'
+ ksh: warning: line 1: `...` obsolete, use $(...)
+ 0
+
+ Furthermore, on ancient hosts, such as SunOS 4, `sh -n' could go
+ into an infinite loop; even with that bug fixed, Solaris 8
+ `/bin/sh' takes extremely long to parse large scripts. Autoconf
+ itself uses `sh -n' within its testsuite to check that correct
+ scripts were generated, but only after first probing for other
+ shell features (such as `test -n "${BASH_VERSION+set}"') that
+ indicate a reasonably fast and working implementation.
+
+`shift'
+ Not only is `shift'ing a bad idea when there is nothing left to
+ shift, but in addition it is not portable: the shell of MIPS
+ RISC/OS 4.52 refuses to do it.
+
+ Don't use `shift 2' etc.; while it in the SVR1 shell (1983), it is
+ also absent in many pre-Posix shells.
+
+`source'
+ This command is not portable, as Posix does not require it; use
+ `.' instead.
+
+`test'
+ The `test' program is the way to perform many file and string
+ tests. It is often invoked by the alternate name `[', but using
+ that name in Autoconf code is asking for trouble since it is an M4
+ quote character.
+
+ The `-a', `-o', `(', and `)' operands are not present in all
+ implementations, and have been marked obsolete by Posix 2008.
+ This is because there are inherent ambiguities in using them. For
+ example, `test "$1" -a "$2"' looks like a binary operator to check
+ whether two strings are both non-empty, but if `$1' is the literal
+ `!', then some implementations of `test' treat it as a negation of
+ the unary operator `-a'.
+
+ Thus, portable uses of `test' should never have more than four
+ arguments, and scripts should use shell constructs like `&&' and
+ `||' instead. If you combine `&&' and `||' in the same statement,
+ keep in mind that they have equal precedence, so it is often
+ better to parenthesize even when this is redundant. For example:
+
+ # Not portable:
+ test "X$a" = "X$b" -a \
+ '(' "X$c" != "X$d" -o "X$e" = "X$f" ')'
+
+ # Portable:
+ test "X$a" = "X$b" &&
+ { test "X$c" != "X$d" || test "X$e" = "X$f"; }
+
+ `test' does not process options like most other commands do; for
+ example, it does not recognize the `--' argument as marking the
+ end of options.
+
+ It is safe to use `!' as a `test' operator. For example, `if test
+ ! -d foo; ...' is portable even though `if ! test -d foo; ...' is
+ not.
+
+`test' (files)
+ To enable `configure' scripts to support cross-compilation, they
+ shouldn't do anything that tests features of the build system
+ instead of the host system. But occasionally you may find it
+ necessary to check whether some arbitrary file exists. To do so,
+ use `test -f', `test -r', or `test -x'. Do not use `test -e',
+ because Solaris 10 `/bin/sh' lacks it. To test for symbolic links
+ on systems that have them, use `test -h' rather than `test -L';
+ either form conforms to Posix 1003.1-2001, but older shells like
+ Solaris 8 `/bin/sh' support only `-h'.
+
+ For historical reasons, Posix reluctantly allows implementations of
+ `test -x' that will succeed for the root user, even if no execute
+ permissions are present. Furthermore, shells do not all agree on
+ whether Access Control Lists should affect `test -r', `test -w',
+ and `test -x'; some shells base test results strictly on the
+ current user id compared to file owner and mode, as if by
+ `stat(2)'; while other shells base test results on whether the
+ current user has the given right, even if that right is only
+ granted by an ACL, as if by `faccessat(2)'. Furthermore, there is
+ a classic time of check to time of use race between any use of
+ `test' followed by operating on the just-checked file. Therefore,
+ it is a good idea to write scripts that actually attempt an
+ operation, and are prepared for the resulting failure if
+ permission is denied, rather than trying to avoid an operation
+ based solely on whether `test' guessed that it might not be
+ permitted.
+
+`test' (strings)
+ Posix says that `test "STRING"' succeeds if STRING is not null,
+ but this usage is not portable to traditional platforms like
+ Solaris 10 `/bin/sh', which mishandle strings like `!' and `-n'.
+
+ Posix also says that `test ! "STRING"', `test -n "STRING"' and
+ `test -z "STRING"' work with any string, but many shells (such as
+ Solaris, AIX 3.2, UNICOS 10.0.0.6, Digital Unix 4, etc.) get
+ confused if STRING looks like an operator:
+
+ $ test -n =
+ test: argument expected
+ $ test ! -n
+ test: argument expected
+ $ test -z ")"; echo $?
+ 0
+
+ Similarly, Posix says that both `test "STRING1" = "STRING2"' and
+ `test "STRING1" != "STRING2"' work for any pairs of strings, but
+ in practice this is not true for troublesome strings that look
+ like operators or parentheses, or that begin with `-'.
+
+ It is best to protect such strings with a leading `X', e.g., `test
+ "XSTRING" != X' rather than `test -n "STRING"' or `test !
+ "STRING"'.
+
+ It is common to find variations of the following idiom:
+
+ test -n "`echo $ac_feature | sed 's/[-a-zA-Z0-9_]//g'`" &&
+ ACTION
+
+ to take an action when a token matches a given pattern. Such
+ constructs should be avoided by using:
+
+ case $ac_feature in
+ *[!-a-zA-Z0-9_]*) ACTION;;
+ esac
+
+ If the pattern is a complicated regular expression that cannot be
+ expressed as a shell pattern, use something like this instead:
+
+ expr "X$ac_feature" : 'X.*[^-a-zA-Z0-9_]' >/dev/null &&
+ ACTION
+
+ `expr "XFOO" : "XBAR"' is more robust than `echo "XFOO" | grep
+ "^XBAR"', because it avoids problems when `FOO' contains
+ backslashes.
+
+`trap'
+ It is safe to trap at least the signals 1, 2, 13, and 15. You can
+ also trap 0, i.e., have the `trap' run when the script ends
+ (either via an explicit `exit', or the end of the script). The
+ trap for 0 should be installed outside of a shell function, or AIX
+ 5.3 `/bin/sh' will invoke the trap at the end of this function.
+
+ Posix says that `trap - 1 2 13 15' resets the traps for the
+ specified signals to their default values, but many common shells
+ (e.g., Solaris `/bin/sh') misinterpret this and attempt to execute
+ a "command" named `-' when the specified conditions arise. Posix
+ 2008 also added a requirement to support `trap 1 2 13 15' to reset
+ traps, as this is supported by a larger set of shells, but there
+ are still shells like `dash' that mistakenly try to execute `1'
+ instead of resetting the traps. Therefore, there is no portable
+ workaround, except for `trap - 0', for which `trap '' 0' is a
+ portable substitute.
+
+ Although Posix is not absolutely clear on this point, it is widely
+ admitted that when entering the trap `$?' should be set to the exit
+ status of the last command run before the trap. The ambiguity can
+ be summarized as: "when the trap is launched by an `exit', what is
+ the _last_ command run: that before `exit', or `exit' itself?"
+
+ Bash considers `exit' to be the last command, while Zsh and
+ Solaris `/bin/sh' consider that when the trap is run it is _still_
+ in the `exit', hence it is the previous exit status that the trap
+ receives:
+
+ $ cat trap.sh
+ trap 'echo $?' 0
+ (exit 42); exit 0
+ $ zsh trap.sh
+ 42
+ $ bash trap.sh
+ 0
+
+ The portable solution is then simple: when you want to `exit 42',
+ run `(exit 42); exit 42', the first `exit' being used to set the
+ exit status to 42 for Zsh, and the second to trigger the trap and
+ pass 42 as exit status for Bash. In M4sh, this is covered by using
+ `AS_EXIT'.
+
+ The shell in FreeBSD 4.0 has the following bug: `$?' is reset to 0
+ by empty lines if the code is inside `trap'.
+
+ $ trap 'false
+
+ echo $?' 0
+ $ exit
+ 0
+
+ Fortunately, this bug only affects `trap'.
+
+ Several shells fail to execute an exit trap that is defined inside
+ a subshell, when the last command of that subshell is not a
+ builtin. A workaround is to use `exit $?' as the shell builtin.
+
+ $ bash -c '(trap "echo hi" 0; /bin/true)'
+ hi
+ $ /bin/sh -c '(trap "echo hi" 0; /bin/true)'
+ $ /bin/sh -c '(trap "echo hi" 0; /bin/true; exit $?)'
+ hi
+
+ Likewise, older implementations of `bash' failed to preserve `$?'
+ across an exit trap consisting of a single cleanup command.
+
+ $ bash -c 'trap "/bin/true" 0; exit 2'; echo $?
+ 2
+ $ bash-2.05b -c 'trap "/bin/true" 0; exit 2'; echo $?
+ 0
+ $ bash-2.05b -c 'trap ":; /bin/true" 0; exit 2'; echo $?
+ 2
+
+`true'
+ Don't worry: as far as we know `true' is portable. Nevertheless,
+ it's not always a builtin (e.g., Bash 1.x), and the portable shell
+ community tends to prefer using `:'. This has a funny side
+ effect: when asked whether `false' is more portable than `true'
+ Alexandre Oliva answered:
+
+ In a sense, yes, because if it doesn't exist, the shell will
+ produce an exit status of failure, which is correct for
+ `false', but not for `true'.
+
+ Remember that even though `:' ignores its arguments, it still takes
+ time to compute those arguments. It is a good idea to use double
+ quotes around any arguments to `:' to avoid time spent in field
+ splitting and file name expansion.
+
+`unset'
+ In some nonconforming shells (e.g., Solaris 10 `/bin/ksh' and
+ `/usr/xpg4/bin/sh', NetBSD 5.99.43 sh, or Bash 2.05a), `unset FOO'
+ fails when `FOO' is not set. This can interfere with `set -e'
+ operation. You can use
+
+ FOO=; unset FOO
+
+ if you are not sure that `FOO' is set.
+
+ A few ancient shells lack `unset' entirely. For some variables
+ such as `PS1', you can use a neutralizing value instead:
+
+ PS1='$ '
+
+ Usually, shells that do not support `unset' need less effort to
+ make the environment sane, so for example is not a problem if you
+ cannot unset `CDPATH' on those shells. However, Bash 2.01
+ mishandles `unset MAIL' and `unset MAILPATH' in some cases and
+ dumps core. So, you should do something like
+
+ ( (unset MAIL) || exit 1) >/dev/null 2>&1 && unset MAIL || :
+
+ *Note Special Shell Variables::, for some neutralizing values.
+ Also, see *note Limitations of Builtins: export, for the case of
+ environment variables.
+
+`wait'
+ The exit status of `wait' is not always reliable.
+
+
+File: autoconf.info, Node: Limitations of Usual Tools, Prev: Limitations of Builtins, Up: Portable Shell
+
+11.15 Limitations of Usual Tools
+================================
+
+The small set of tools you can expect to find on any machine can still
+include some limitations you should be aware of.
+
+`awk'
+ Don't leave white space before the opening parenthesis in a user
+ function call. Posix does not allow this and GNU Awk rejects it:
+
+ $ gawk 'function die () { print "Aaaaarg!" }
+ BEGIN { die () }'
+ gawk: cmd. line:2: BEGIN { die () }
+ gawk: cmd. line:2: ^ parse error
+ $ gawk 'function die () { print "Aaaaarg!" }
+ BEGIN { die() }'
+ Aaaaarg!
+
+ Posix says that if a program contains only `BEGIN' actions, and
+ contains no instances of `getline', then the program merely
+ executes the actions without reading input. However, traditional
+ Awk implementations (such as Solaris 10 `awk') read and discard
+ input in this case. Portable scripts can redirect input from
+ `/dev/null' to work around the problem. For example:
+
+ awk 'BEGIN {print "hello world"}' </dev/null
+
+ Posix says that in an `END' action, `$NF' (and presumably, `$1')
+ retain their value from the last record read, if no intervening
+ `getline' occurred. However, some implementations (such as
+ Solaris 10 `/usr/bin/awk', `nawk', or Darwin `awk') reset these
+ variables. A workaround is to use an intermediate variable prior
+ to the `END' block. For example:
+
+ $ cat end.awk
+ { tmp = $1 }
+ END { print "a", $1, $NF, "b", tmp }
+ $ echo 1 | awk -f end.awk
+ a b 1
+ $ echo 1 | gawk -f end.awk
+ a 1 1 b 1
+
+ If you want your program to be deterministic, don't depend on `for'
+ on arrays:
+
+ $ cat for.awk
+ END {
+ arr["foo"] = 1
+ arr["bar"] = 1
+ for (i in arr)
+ print i
+ }
+ $ gawk -f for.awk </dev/null
+ foo
+ bar
+ $ nawk -f for.awk </dev/null
+ bar
+ foo
+
+ Some Awk implementations, such as HP-UX 11.0's native one,
+ mishandle anchors:
+
+ $ echo xfoo | $AWK '/foo|^bar/ { print }'
+ $ echo bar | $AWK '/foo|^bar/ { print }'
+ bar
+ $ echo xfoo | $AWK '/^bar|foo/ { print }'
+ xfoo
+ $ echo bar | $AWK '/^bar|foo/ { print }'
+ bar
+
+ Either do not depend on such patterns (i.e., use `/^(.*foo|bar)/',
+ or use a simple test to reject such implementations.
+
+ On `ia64-hp-hpux11.23', Awk mishandles `printf' conversions after
+ `%u':
+
+ $ awk 'BEGIN { printf "%u %d\n", 0, -1 }'
+ 0 0
+
+ AIX version 5.2 has an arbitrary limit of 399 on the length of
+ regular expressions and literal strings in an Awk program.
+
+ Traditional Awk implementations derived from Unix version 7, such
+ as Solaris `/bin/awk', have many limitations and do not conform to
+ Posix. Nowadays `AC_PROG_AWK' (*note Particular Programs::) finds
+ you an Awk that doesn't have these problems, but if for some
+ reason you prefer not to use `AC_PROG_AWK' you may need to address
+ them. For more detailed descriptions, see *note `awk' language
+ history: (gawk)Language History.
+
+ Traditional Awk does not support multidimensional arrays or
+ user-defined functions.
+
+ Traditional Awk does not support the `-v' option. You can use
+ assignments after the program instead, e.g., `$AWK '{print v $1}'
+ v=x'; however, don't forget that such assignments are not
+ evaluated until they are encountered (e.g., after any `BEGIN'
+ action).
+
+ Traditional Awk does not support the keywords `delete' or `do'.
+
+ Traditional Awk does not support the expressions `A?B:C', `!A',
+ `A^B', or `A^=B'.
+
+ Traditional Awk does not support the predefined `CONVFMT' or
+ `ENVIRON' variables.
+
+ Traditional Awk supports only the predefined functions `exp',
+ `index', `int', `length', `log', `split', `sprintf', `sqrt', and
+ `substr'.
+
+ Traditional Awk `getline' is not at all compatible with Posix;
+ avoid it.
+
+ Traditional Awk has `for (i in a) ...' but no other uses of the
+ `in' keyword. For example, it lacks `if (i in a) ...'.
+
+ In code portable to both traditional and modern Awk, `FS' must be a
+ string containing just one ordinary character, and similarly for
+ the field-separator argument to `split'.
+
+ Traditional Awk has a limit of 99 fields in a record. Since some
+ Awk implementations, like Tru64's, split the input even if you
+ don't refer to any field in the script, to circumvent this
+ problem, set `FS' to an unusual character and use `split'.
+
+ Traditional Awk has a limit of at most 99 bytes in a number
+ formatted by `OFMT'; for example, `OFMT="%.300e"; print 0.1;'
+ typically dumps core.
+
+ The original version of Awk had a limit of at most 99 bytes per
+ `split' field, 99 bytes per `substr' substring, and 99 bytes per
+ run of non-special characters in a `printf' format, but these bugs
+ have been fixed on all practical hosts that we know of.
+
+ HP-UX 11.00 and IRIX 6.5 Awk require that input files have a line
+ length of at most 3070 bytes.
+
+`basename'
+ Not all hosts have a working `basename'. You can use `expr'
+ instead.
+
+`cat'
+ Don't rely on any option.
+
+`cc'
+ The command `cc -c foo.c' traditionally produces an object file
+ named `foo.o'. Most compilers allow `-c' to be combined with `-o'
+ to specify a different object file name, but Posix does not
+ require this combination and a few compilers lack support for it.
+ *Note C Compiler::, for how GNU Make tests for this feature with
+ `AC_PROG_CC_C_O'.
+
+ When a compilation such as `cc -o foo foo.c' fails, some compilers
+ (such as CDS on Reliant Unix) leave a `foo.o'.
+
+ HP-UX `cc' doesn't accept `.S' files to preprocess and assemble.
+ `cc -c foo.S' appears to succeed, but in fact does nothing.
+
+ The default executable, produced by `cc foo.c', can be
+
+ * `a.out' -- usual Posix convention.
+
+ * `b.out' -- i960 compilers (including `gcc').
+
+ * `a.exe' -- DJGPP port of `gcc'.
+
+ * `a_out.exe' -- GNV `cc' wrapper for DEC C on OpenVMS.
+
+ * `foo.exe' -- various MS-DOS compilers.
+
+ The C compiler's traditional name is `cc', but other names like
+ `gcc' are common. Posix 1003.1-2001 specifies the name `c99', but
+ older Posix editions specified `c89' and anyway these standard
+ names are rarely used in practice. Typically the C compiler is
+ invoked from makefiles that use `$(CC)', so the value of the `CC'
+ make variable selects the compiler name.
+
+`chgrp'
+`chown'
+ It is not portable to change a file's group to a group that the
+ owner does not belong to.
+
+`chmod'
+ Avoid usages like `chmod -w file'; use `chmod a-w file' instead,
+ for two reasons. First, plain `-w' does not necessarily make the
+ file unwritable, since it does not affect mode bits that
+ correspond to bits in the file mode creation mask. Second, Posix
+ says that the `-w' might be interpreted as an
+ implementation-specific option, not as a mode; Posix suggests
+ using `chmod -- -w file' to avoid this confusion, but unfortunately
+ `--' does not work on some older hosts.
+
+`cmp'
+ `cmp' performs a raw data comparison of two files, while `diff'
+ compares two text files. Therefore, if you might compare DOS
+ files, even if only checking whether two files are different, use
+ `diff' to avoid spurious differences due to differences of newline
+ encoding.
+
+`cp'
+ Avoid the `-r' option, since Posix 1003.1-2004 marks it as
+ obsolescent and its behavior on special files is
+ implementation-defined. Use `-R' instead. On GNU hosts the two
+ options are equivalent, but on Solaris hosts (for example) `cp -r'
+ reads from pipes instead of replicating them. AIX 5.3 `cp -R' may
+ corrupt its own memory with some directory hierarchies and error
+ out or dump core:
+
+ mkdir -p 12345678/12345678/12345678/12345678
+ touch 12345678/12345678/x
+ cp -R 12345678 t
+ cp: 0653-440 12345678/12345678/: name too long.
+
+ Some `cp' implementations (e.g., BSD/OS 4.2) do not allow trailing
+ slashes at the end of nonexistent destination directories. To
+ avoid this problem, omit the trailing slashes. For example, use
+ `cp -R source /tmp/newdir' rather than `cp -R source /tmp/newdir/'
+ if `/tmp/newdir' does not exist.
+
+ The ancient SunOS 4 `cp' does not support `-f', although its `mv'
+ does.
+
+ Traditionally, file timestamps had 1-second resolution, and `cp
+ -p' copied the timestamps exactly. However, many modern file
+ systems have timestamps with 1-nanosecond resolution.
+ Unfortunately, some older `cp -p' implementations truncate
+ timestamps when copying files, which can cause the destination
+ file to appear to be older than the source. The exact amount of
+ truncation depends on the resolution of the system calls that `cp'
+ uses. Traditionally this was `utime', which has 1-second
+ resolution. Less-ancient `cp' implementations such as GNU Core
+ Utilities 5.0.91 (2003) use `utimes', which has 1-microsecond
+ resolution. Modern implementations such as GNU Core Utilities
+ 6.12 (2008) can set timestamps to the full nanosecond resolution,
+ using the modern system calls `futimens' and `utimensat' when they
+ are available. As of 2011, though, many platforms do not yet
+ fully support these new system calls.
+
+ Bob Proulx notes that `cp -p' always _tries_ to copy ownerships.
+ But whether it actually does copy ownerships or not is a system
+ dependent policy decision implemented by the kernel. If the
+ kernel allows it then it happens. If the kernel does not allow it
+ then it does not happen. It is not something `cp' itself has
+ control over.
+
+ In Unix System V any user can chown files to any other user, and
+ System V also has a non-sticky `/tmp'. That probably derives from
+ the heritage of System V in a business environment without hostile
+ users. BSD changed this to be a more secure model where only root
+ can `chown' files and a sticky `/tmp' is used. That undoubtedly
+ derives from the heritage of BSD in a campus environment.
+
+ GNU/Linux and Solaris by default follow BSD, but can be configured
+ to allow a System V style `chown'. On the other hand, HP-UX
+ follows System V, but can be configured to use the modern security
+ model and disallow `chown'. Since it is an
+ administrator-configurable parameter you can't use the name of the
+ kernel as an indicator of the behavior.
+
+`date'
+ Some versions of `date' do not recognize special `%' directives,
+ and unfortunately, instead of complaining, they just pass them
+ through, and exit with success:
+
+ $ uname -a
+ OSF1 medusa.sis.pasteur.fr V5.1 732 alpha
+ $ date "+%s"
+ %s
+
+`diff'
+ Option `-u' is nonportable.
+
+ Some implementations, such as Tru64's, fail when comparing to
+ `/dev/null'. Use an empty file instead.
+
+`dirname'
+ Not all hosts have a working `dirname', and you should instead use
+ `AS_DIRNAME' (*note Programming in M4sh::). For example:
+
+ dir=`dirname "$file"` # This is not portable.
+ dir=`AS_DIRNAME(["$file"])` # This is more portable.
+
+`egrep'
+ Posix 1003.1-2001 no longer requires `egrep', but many hosts do
+ not yet support the Posix replacement `grep -E'. Also, some
+ traditional implementations do not work on long input lines. To
+ work around these problems, invoke `AC_PROG_EGREP' and then use
+ `$EGREP'.
+
+ Portable extended regular expressions should use `\' only to escape
+ characters in the string `$()*+.?[\^{|'. For example, `\}' is not
+ portable, even though it typically matches `}'.
+
+ The empty alternative is not portable. Use `?' instead. For
+ instance with Digital Unix v5.0:
+
+ > printf "foo\n|foo\n" | $EGREP '^(|foo|bar)$'
+ |foo
+ > printf "bar\nbar|\n" | $EGREP '^(foo|bar|)$'
+ bar|
+ > printf "foo\nfoo|\n|bar\nbar\n" | $EGREP '^(foo||bar)$'
+ foo
+ |bar
+
+ `$EGREP' also suffers the limitations of `grep' (*note Limitations
+ of Usual Tools: grep.).
+
+`expr'
+ Not all implementations obey the Posix rule that `--' separates
+ options from arguments; likewise, not all implementations provide
+ the extension to Posix that the first argument can be treated as
+ part of a valid expression rather than an invalid option if it
+ begins with `-'. When performing arithmetic, use `expr 0 + $var'
+ if `$var' might be a negative number, to keep `expr' from
+ interpreting it as an option.
+
+ No `expr' keyword starts with `X', so use `expr X"WORD" :
+ 'XREGEX'' to keep `expr' from misinterpreting WORD.
+
+ Don't use `length', `substr', `match' and `index'.
+
+`expr' (`|')
+ You can use `|'. Although Posix does require that `expr '''
+ return the empty string, it does not specify the result when you
+ `|' together the empty string (or zero) with the empty string. For
+ example:
+
+ expr '' \| ''
+
+ Posix 1003.2-1992 returns the empty string for this case, but
+ traditional Unix returns `0' (Solaris is one such example). In
+ Posix 1003.1-2001, the specification was changed to match
+ traditional Unix's behavior (which is bizarre, but it's too late
+ to fix this). Please note that the same problem does arise when
+ the empty string results from a computation, as in:
+
+ expr bar : foo \| foo : bar
+
+ Avoid this portability problem by avoiding the empty string.
+
+`expr' (`:')
+ Portable `expr' regular expressions should use `\' to escape only
+ characters in the string `$()*.0123456789[\^n{}'. For example,
+ alternation, `\|', is common but Posix does not require its
+ support, so it should be avoided in portable scripts. Similarly,
+ `\+' and `\?' should be avoided.
+
+ Portable `expr' regular expressions should not begin with `^'.
+ Patterns are automatically anchored so leading `^' is not needed
+ anyway.
+
+ On the other hand, the behavior of the `$' anchor is not portable
+ on multi-line strings. Posix is ambiguous whether the anchor
+ applies to each line, as was done in older versions of the GNU
+ Core Utilities, or whether it applies only to the end of the
+ overall string, as in Coreutils 6.0 and most other implementations.
+
+ $ baz='foo
+ > bar'
+ $ expr "X$baz" : 'X\(foo\)$'
+
+ $ expr-5.97 "X$baz" : 'X\(foo\)$'
+ foo
+
+ The Posix standard is ambiguous as to whether `expr 'a' : '\(b\)''
+ outputs `0' or the empty string. In practice, it outputs the
+ empty string on most platforms, but portable scripts should not
+ assume this. For instance, the QNX 4.25 native `expr' returns `0'.
+
+ One might think that a way to get a uniform behavior would be to
+ use the empty string as a default value:
+
+ expr a : '\(b\)' \| ''
+
+ Unfortunately this behaves exactly as the original expression; see
+ the `expr' (`|') entry for more information.
+
+ Some ancient `expr' implementations (e.g., SunOS 4 `expr' and
+ Solaris 8 `/usr/ucb/expr') have a silly length limit that causes
+ `expr' to fail if the matched substring is longer than 120 bytes.
+ In this case, you might want to fall back on `echo|sed' if `expr'
+ fails. Nowadays this is of practical importance only for the rare
+ installer who mistakenly puts `/usr/ucb' before `/usr/bin' in
+ `PATH'.
+
+ On Mac OS X 10.4, `expr' mishandles the pattern `[^-]' in some
+ cases. For example, the command
+ expr Xpowerpc-apple-darwin8.1.0 : 'X[^-]*-[^-]*-\(.*\)'
+
+ outputs `apple-darwin8.1.0' rather than the correct `darwin8.1.0'.
+ This particular case can be worked around by substituting `[^--]'
+ for `[^-]'.
+
+ Don't leave, there is some more!
+
+ The QNX 4.25 `expr', in addition of preferring `0' to the empty
+ string, has a funny behavior in its exit status: it's always 1
+ when parentheses are used!
+
+ $ val=`expr 'a' : 'a'`; echo "$?: $val"
+ 0: 1
+ $ val=`expr 'a' : 'b'`; echo "$?: $val"
+ 1: 0
+
+ $ val=`expr 'a' : '\(a\)'`; echo "?: $val"
+ 1: a
+ $ val=`expr 'a' : '\(b\)'`; echo "?: $val"
+ 1: 0
+
+ In practice this can be a big problem if you are ready to catch
+ failures of `expr' programs with some other method (such as using
+ `sed'), since you may get twice the result. For instance
+
+ $ expr 'a' : '\(a\)' || echo 'a' | sed 's/^\(a\)$/\1/'
+
+ outputs `a' on most hosts, but `aa' on QNX 4.25. A simple
+ workaround consists of testing `expr' and using a variable set to
+ `expr' or to `false' according to the result.
+
+ Tru64 `expr' incorrectly treats the result as a number, if it can
+ be interpreted that way:
+
+ $ expr 00001 : '.*\(...\)'
+ 1
+
+ On HP-UX 11, `expr' only supports a single sub-expression.
+
+ $ expr 'Xfoo' : 'X\(f\(oo\)*\)$'
+ expr: More than one '\(' was used.
+
+`fgrep'
+ Posix 1003.1-2001 no longer requires `fgrep', but many hosts do
+ not yet support the Posix replacement `grep -F'. Also, some
+ traditional implementations do not work on long input lines. To
+ work around these problems, invoke `AC_PROG_FGREP' and then use
+ `$FGREP'.
+
+ Tru64/OSF 5.1 `fgrep' does not match an empty pattern.
+
+`find'
+ The option `-maxdepth' seems to be GNU specific. Tru64 v5.1,
+ NetBSD 1.5 and Solaris `find' commands do not understand it.
+
+ The replacement of `{}' is guaranteed only if the argument is
+ exactly _{}_, not if it's only a part of an argument. For
+ instance on DU, and HP-UX 10.20 and HP-UX 11:
+
+ $ touch foo
+ $ find . -name foo -exec echo "{}-{}" \;
+ {}-{}
+
+ while GNU `find' reports `./foo-./foo'.
+
+`grep'
+ Portable scripts can rely on the `grep' options `-c', `-l', `-n',
+ and `-v', but should avoid other options. For example, don't use
+ `-w', as Posix does not require it and Irix 6.5.16m's `grep' does
+ not support it. Also, portable scripts should not combine `-c'
+ with `-l', as Posix does not allow this.
+
+ Some of the options required by Posix are not portable in practice.
+ Don't use `grep -q' to suppress output, because many `grep'
+ implementations (e.g., Solaris) do not support `-q'. Don't use
+ `grep -s' to suppress output either, because Posix says `-s' does
+ not suppress output, only some error messages; also, the `-s'
+ option of traditional `grep' behaved like `-q' does in most modern
+ implementations. Instead, redirect the standard output and
+ standard error (in case the file doesn't exist) of `grep' to
+ `/dev/null'. Check the exit status of `grep' to determine whether
+ it found a match.
+
+ The QNX4 implementation fails to count lines with `grep -c '$'',
+ but works with `grep -c '^''. Other alternatives for counting
+ lines are to use `sed -n '$='' or `wc -l'.
+
+ Some traditional `grep' implementations do not work on long input
+ lines. On AIX the default `grep' silently truncates long lines on
+ the input before matching.
+
+ Also, many implementations do not support multiple regexps with
+ `-e': they either reject `-e' entirely (e.g., Solaris) or honor
+ only the last pattern (e.g., IRIX 6.5 and NeXT). To work around
+ these problems, invoke `AC_PROG_GREP' and then use `$GREP'.
+
+ Another possible workaround for the multiple `-e' problem is to
+ separate the patterns by newlines, for example:
+
+ grep 'foo
+ bar' in.txt
+
+ except that this fails with traditional `grep' implementations and
+ with OpenBSD 3.8 `grep'.
+
+ Traditional `grep' implementations (e.g., Solaris) do not support
+ the `-E' or `-F' options. To work around these problems, invoke
+ `AC_PROG_EGREP' and then use `$EGREP', and similarly for
+ `AC_PROG_FGREP' and `$FGREP'. Even if you are willing to require
+ support for Posix `grep', your script should not use both `-E' and
+ `-F', since Posix does not allow this combination.
+
+ Portable `grep' regular expressions should use `\' only to escape
+ characters in the string `$()*.0123456789[\^{}'. For example,
+ alternation, `\|', is common but Posix does not require its
+ support in basic regular expressions, so it should be avoided in
+ portable scripts. Solaris and HP-UX `grep' do not support it.
+ Similarly, the following escape sequences should also be avoided:
+ `\<', `\>', `\+', `\?', `\`', `\'', `\B', `\b', `\S', `\s', `\W',
+ and `\w'.
+
+ Posix does not specify the behavior of `grep' on binary files. An
+ example where this matters is using BSD `grep' to search text that
+ includes embedded ANSI escape sequences for colored output to
+ terminals (`\033[m' is the sequence to restore normal output); the
+ behavior depends on whether input is seekable:
+
+ $ printf 'esc\033[mape\n' > sample
+ $ grep . sample
+ Binary file sample matches
+ $ cat sample | grep .
+ escape
+
+`join'
+ Solaris 8 `join' has bugs when the second operand is standard
+ input, and when standard input is a pipe. For example, the
+ following shell script causes Solaris 8 `join' to loop forever:
+
+ cat >file <<'EOF'
+ 1 x
+ 2 y
+ EOF
+ cat file | join file -
+
+ Use `join - file' instead.
+
+ On NetBSD, `join -a 1 file1 file2' mistakenly behaves like `join
+ -a 1 -a 2 1 file1 file2', resulting in a usage warning; the
+ workaround is to use `join -a1 file1 file2' instead.
+
+`ln'
+ Don't rely on `ln' having a `-f' option. Symbolic links are not
+ available on old systems; use `$(LN_S)' as a portable substitute.
+
+ For versions of the DJGPP before 2.04, `ln' emulates symbolic links
+ to executables by generating a stub that in turn calls the real
+ program. This feature also works with nonexistent files like in
+ the Posix spec. So `ln -s file link' generates `link.exe', which
+ attempts to call `file.exe' if run. But this feature only works
+ for executables, so `cp -p' is used instead for these systems.
+ DJGPP versions 2.04 and later have full support for symbolic links.
+
+`ls'
+ The portable options are `-acdilrtu'. Current practice is for
+ `-l' to output both owner and group, even though ancient versions
+ of `ls' omitted the group.
+
+ On ancient hosts, `ls foo' sent the diagnostic `foo not found' to
+ standard output if `foo' did not exist. Hence a shell command
+ like `sources=`ls *.c 2>/dev/null`' did not always work, since it
+ was equivalent to `sources='*.c not found'' in the absence of `.c'
+ files. This is no longer a practical problem, since current `ls'
+ implementations send diagnostics to standard error.
+
+ The behavior of `ls' on a directory that is being concurrently
+ modified is not always predictable, because of a data race where
+ cached information returned by `readdir' does not match the current
+ directory state. In fact, MacOS 10.5 has an intermittent bug where
+ `readdir', and thus `ls', sometimes lists a file more than once if
+ other files were added or removed from the directory immediately
+ prior to the `ls' call. Since `ls' already sorts its output, the
+ duplicate entries can be avoided by piping the results through
+ `uniq'.
+
+`mkdir'
+ No `mkdir' option is portable to older systems. Instead of `mkdir
+ -p FILE-NAME', you should use `AS_MKDIR_P(FILE-NAME)' (*note
+ Programming in M4sh::) or `AC_PROG_MKDIR_P' (*note Particular
+ Programs::).
+
+ Combining the `-m' and `-p' options, as in `mkdir -m go-w -p DIR',
+ often leads to trouble. FreeBSD `mkdir' incorrectly attempts to
+ change the permissions of DIR even if it already exists. HP-UX
+ 11.23 and IRIX 6.5 `mkdir' often assign the wrong permissions to
+ any newly-created parents of DIR.
+
+ Posix does not clearly specify whether `mkdir -p foo' should
+ succeed when `foo' is a symbolic link to an already-existing
+ directory. The GNU Core Utilities 5.1.0 `mkdir' succeeds, but
+ Solaris `mkdir' fails.
+
+ Traditional `mkdir -p' implementations suffer from race conditions.
+ For example, if you invoke `mkdir -p a/b' and `mkdir -p a/c' at
+ the same time, both processes might detect that `a' is missing,
+ one might create `a', then the other might try to create `a' and
+ fail with a `File exists' diagnostic. The GNU Core Utilities
+ (`fileutils' version 4.1), FreeBSD 5.0, NetBSD 2.0.2, and OpenBSD
+ 2.4 are known to be race-free when two processes invoke `mkdir -p'
+ simultaneously, but earlier versions are vulnerable. Solaris
+ `mkdir' is still vulnerable as of Solaris 10, and other
+ traditional Unix systems are probably vulnerable too. This
+ possible race is harmful in parallel builds when several Make
+ rules call `mkdir -p' to construct directories. You may use
+ `install-sh -d' as a safe replacement, provided this script is
+ recent enough; the copy shipped with Autoconf 2.60 and Automake
+ 1.10 is OK, but copies from older versions are vulnerable.
+
+`mkfifo'
+`mknod'
+ The GNU Coding Standards state that `mknod' is safe to use on
+ platforms where it has been tested to exist; but it is generally
+ portable only for creating named FIFOs, since device numbers are
+ platform-specific. Autotest uses `mkfifo' to implement parallel
+ testsuites. Posix states that behavior is unspecified when
+ opening a named FIFO for both reading and writing; on at least
+ Cygwin, this results in failure on any attempt to read or write to
+ that file descriptor.
+
+`mktemp'
+ Shell scripts can use temporary files safely with `mktemp', but it
+ does not exist on all systems. A portable way to create a safe
+ temporary file name is to create a temporary directory with mode
+ 700 and use a file inside this directory. Both methods prevent
+ attackers from gaining control, though `mktemp' is far less likely
+ to fail gratuitously under attack.
+
+ Here is sample code to create a new temporary directory `$dir'
+ safely:
+
+ # Create a temporary directory $dir in $TMPDIR (default /tmp).
+ # Use mktemp if possible; otherwise fall back on mkdir,
+ # with $RANDOM to make collisions less likely.
+ : "${TMPDIR:=/tmp}"
+ {
+ dir=`
+ (umask 077 && mktemp -d "$TMPDIR/fooXXXXXX") 2>/dev/null
+ ` &&
+ test -d "$dir"
+ } || {
+ dir=$TMPDIR/foo$$-$RANDOM
+ (umask 077 && mkdir "$dir")
+ } || exit $?
+
+`mv'
+ The only portable options are `-f' and `-i'.
+
+ Moving individual files between file systems is portable (it was
+ in Unix version 6), but it is not always atomic: when doing `mv
+ new existing', there's a critical section where neither the old
+ nor the new version of `existing' actually exists.
+
+ On some systems moving files from `/tmp' can sometimes cause
+ undesirable (but perfectly valid) warnings, even if you created
+ these files. This is because `/tmp' belongs to a group that
+ ordinary users are not members of, and files created in `/tmp'
+ inherit the group of `/tmp'. When the file is copied, `mv' issues
+ a diagnostic without failing:
+
+ $ touch /tmp/foo
+ $ mv /tmp/foo .
+ error-->mv: ./foo: set owner/group (was: 100/0): Operation not permitted
+ $ echo $?
+ 0
+ $ ls foo
+ foo
+
+ This annoying behavior conforms to Posix, unfortunately.
+
+ Moving directories across mount points is not portable, use `cp'
+ and `rm'.
+
+ DOS variants cannot rename or remove open files, and do not
+ support commands like `mv foo bar >foo', even though this is
+ perfectly portable among Posix hosts.
+
+`od'
+ In Mac OS X 10.3, `od' does not support the standard Posix options
+ `-A', `-j', `-N', or `-t', or the XSI option `-s'. The only
+ supported Posix option is `-v', and the only supported XSI options
+ are those in `-bcdox'. The BSD `hexdump' program can be used
+ instead.
+
+ This problem no longer exists in Mac OS X 10.4.3.
+
+`rm'
+ The `-f' and `-r' options are portable.
+
+ It is not portable to invoke `rm' without options or operands. On
+ the other hand, Posix now requires `rm -f' to silently succeed
+ when there are no operands (useful for constructs like `rm -rf
+ $filelist' without first checking if `$filelist' was empty). But
+ this was not always portable; at least NetBSD `rm' built before
+ 2008 would fail with a diagnostic.
+
+ A file might not be removed even if its parent directory is
+ writable and searchable. Many Posix hosts cannot remove a mount
+ point, a named stream, a working directory, or a last link to a
+ file that is being executed.
+
+ DOS variants cannot rename or remove open files, and do not
+ support commands like `rm foo >foo', even though this is perfectly
+ portable among Posix hosts.
+
+`rmdir'
+ Just as with `rm', some platforms refuse to remove a working
+ directory.
+
+`sed'
+ Patterns should not include the separator (unless escaped), even
+ as part of a character class. In conformance with Posix, the Cray
+ `sed' rejects `s/[^/]*$//': use `s%[^/]*$%%'. Even when escaped,
+ patterns should not include separators that are also used as `sed'
+ metacharacters. For example, GNU sed 4.0.9 rejects
+ `s,x\{1\,\},,', while sed 4.1 strips the backslash before the comma
+ before evaluating the basic regular expression.
+
+ Avoid empty patterns within parentheses (i.e., `\(\)'). Posix does
+ not require support for empty patterns, and Unicos 9 `sed' rejects
+ them.
+
+ Unicos 9 `sed' loops endlessly on patterns like `.*\n.*'.
+
+ Sed scripts should not use branch labels longer than 7 characters
+ and should not contain comments; AIX 5.3 `sed' rejects indented
+ comments. HP-UX sed has a limit of 99 commands (not counting `:'
+ commands) and 48 labels, which cannot be circumvented by using
+ more than one script file. It can execute up to 19 reads with the
+ `r' command per cycle. Solaris `/usr/ucb/sed' rejects usages that
+ exceed a limit of about 6000 bytes for the internal representation
+ of commands.
+
+ Avoid redundant `;', as some `sed' implementations, such as NetBSD
+ 1.4.2's, incorrectly try to interpret the second `;' as a command:
+
+ $ echo a | sed 's/x/x/;;s/x/x/'
+ sed: 1: "s/x/x/;;s/x/x/": invalid command code ;
+
+ Some `sed' implementations have a buffer limited to 4000 bytes,
+ and this limits the size of input lines, output lines, and internal
+ buffers that can be processed portably. Likewise, not all `sed'
+ implementations can handle embedded `NUL' or a missing trailing
+ newline.
+
+ Remember that ranges within a bracket expression of a regular
+ expression are only well-defined in the `C' (or `POSIX') locale.
+ Meanwhile, support for character classes like `[[:upper:]]' is not
+ yet universal, so if you cannot guarantee the setting of `LC_ALL',
+ it is better to spell out a range `[ABCDEFGHIJKLMNOPQRSTUVWXYZ]'
+ than to rely on `[A-Z]'.
+
+ Additionally, Posix states that regular expressions are only
+ well-defined on characters. Unfortunately, there exist platforms
+ such as MacOS X 10.5 where not all 8-bit byte values are valid
+ characters, even though that platform has a single-byte `C'
+ locale. And Posix allows the existence of a multi-byte `C'
+ locale, although that does not yet appear to be a common
+ implementation. At any rate, it means that not all bytes will be
+ matched by the regular expression `.':
+
+ $ printf '\200\n' | LC_ALL=C sed -n /./p | wc -l
+ 0
+ $ printf '\200\n' | LC_ALL=en_US.ISO8859-1 sed -n /./p | wc -l
+ 1
+
+ Portable `sed' regular expressions should use `\' only to escape
+ characters in the string `$()*.0123456789[\^n{}'. For example,
+ alternation, `\|', is common but Posix does not require its
+ support, so it should be avoided in portable scripts. Solaris
+ `sed' does not support alternation; e.g., `sed '/a\|b/d'' deletes
+ only lines that contain the literal string `a|b'. Similarly, `\+'
+ and `\?' should be avoided.
+
+ Anchors (`^' and `$') inside groups are not portable.
+
+ Nested parentheses in patterns (e.g., `\(\(a*\)b*)\)') are quite
+ portable to current hosts, but was not supported by some ancient
+ `sed' implementations like SVR3.
+
+ Some `sed' implementations, e.g., Solaris, restrict the special
+ role of the asterisk `*' to one-character regular expressions and
+ back-references, and the special role of interval expressions
+ `\{M\}', `\{M,\}', or `\{M,N\}' to one-character regular
+ expressions. This may lead to unexpected behavior:
+
+ $ echo '1*23*4' | /usr/bin/sed 's/\(.\)*/x/g'
+ x2x4
+ $ echo '1*23*4' | /usr/xpg4/bin/sed 's/\(.\)*/x/g'
+ x
+
+ The `-e' option is mostly portable. However, its argument cannot
+ start with `a', `c', or `i', as this runs afoul of a Tru64 5.1 bug.
+ Also, its argument cannot be empty, as this fails on AIX 5.3.
+ Some people prefer to use `-e':
+
+ sed -e 'COMMAND-1' \
+ -e 'COMMAND-2'
+
+ as opposed to the equivalent:
+
+ sed '
+ COMMAND-1
+ COMMAND-2
+ '
+
+ The following usage is sometimes equivalent:
+
+ sed 'COMMAND-1;COMMAND-2'
+
+ but Posix says that this use of a semicolon has undefined effect if
+ COMMAND-1's verb is `{', `a', `b', `c', `i', `r', `t', `w', `:',
+ or `#', so you should use semicolon only with simple scripts that
+ do not use these verbs.
+
+ Posix up to the 2008 revision requires the argument of the `-e'
+ option to be a syntactically complete script. GNU `sed' allows to
+ pass multiple script fragments, each as argument of a separate
+ `-e' option, that are then combined, with newlines between the
+ fragments, and a future Posix revision may allow this as well.
+ This approach is not portable with script fragments ending in
+ backslash; for example, the `sed' programs on Solaris 10, HP-UX
+ 11, and AIX don't allow splitting in this case:
+
+ $ echo a | sed -n -e 'i\
+ 0'
+ 0
+ $ echo a | sed -n -e 'i\' -e 0
+ Unrecognized command: 0
+
+ In practice, however, this technique of joining fragments through
+ `-e' works for multiple `sed' functions within `{' and `}', even
+ if that is not specified by Posix:
+
+ $ echo a | sed -n -e '/a/{' -e s/a/b/ -e p -e '}'
+ b
+
+ Commands inside { } brackets are further restricted. Posix 2008
+ says that they cannot be preceded by addresses, `!', or `;', and
+ that each command must be followed immediately by a newline,
+ without any intervening blanks or semicolons. The closing bracket
+ must be alone on a line, other than white space preceding or
+ following it. However, a future version of Posix may standardize
+ the use of addresses within brackets.
+
+ Contrary to yet another urban legend, you may portably use `&' in
+ the replacement part of the `s' command to mean "what was
+ matched". All descendants of Unix version 7 `sed' (at least; we
+ don't have first hand experience with older `sed' implementations)
+ have supported it.
+
+ Posix requires that you must not have any white space between `!'
+ and the following command. It is OK to have blanks between the
+ address and the `!'. For instance, on Solaris:
+
+ $ echo "foo" | sed -n '/bar/ ! p'
+ error-->Unrecognized command: /bar/ ! p
+ $ echo "foo" | sed -n '/bar/! p'
+ error-->Unrecognized command: /bar/! p
+ $ echo "foo" | sed -n '/bar/ !p'
+ foo
+
+ Posix also says that you should not combine `!' and `;'. If you
+ use `!', it is best to put it on a command that is delimited by
+ newlines rather than `;'.
+
+ Also note that Posix requires that the `b', `t', `r', and `w'
+ commands be followed by exactly one space before their argument.
+ On the other hand, no white space is allowed between `:' and the
+ subsequent label name.
+
+ If a sed script is specified on the command line and ends in an
+ `a', `c', or `i' command, the last line of inserted text should be
+ followed by a newline. Otherwise some `sed' implementations
+ (e.g., OpenBSD 3.9) do not append a newline to the inserted text.
+
+ Many `sed' implementations (e.g., MacOS X 10.4, OpenBSD 3.9,
+ Solaris 10 `/usr/ucb/sed') strip leading white space from the text
+ of `a', `c', and `i' commands. Prepend a backslash to work around
+ this incompatibility with Posix:
+
+ $ echo flushleft | sed 'a\
+ > indented
+ > '
+ flushleft
+ indented
+ $ echo foo | sed 'a\
+ > \ indented
+ > '
+ flushleft
+ indented
+
+ Posix requires that with an empty regular expression, the last
+ non-empty regular expression from either an address specification
+ or substitution command is applied. However, busybox 1.6.1
+ complains when using a substitution command with a replacement
+ containing a back-reference to an empty regular expression; the
+ workaround is repeating the regular expression.
+
+ $ echo abc | busybox sed '/a\(b\)c/ s//\1/'
+ sed: No previous regexp.
+ $ echo abc | busybox sed '/a\(b\)c/ s/a\(b\)c/\1/'
+ b
+
+`sed' (`t')
+ Some old systems have `sed' that "forget" to reset their `t' flag
+ when starting a new cycle. For instance on MIPS RISC/OS, and on
+ IRIX 5.3, if you run the following `sed' script (the line numbers
+ are not actual part of the texts):
+
+ s/keep me/kept/g # a
+ t end # b
+ s/.*/deleted/g # c
+ :end # d
+
+ on
+
+ delete me # 1
+ delete me # 2
+ keep me # 3
+ delete me # 4
+
+ you get
+
+ deleted
+ delete me
+ kept
+ deleted
+
+ instead of
+
+ deleted
+ deleted
+ kept
+ deleted
+
+ Why? When processing line 1, (c) matches, therefore sets the `t'
+ flag, and the output is produced. When processing line 2, the `t'
+ flag is still set (this is the bug). Command (a) fails to match,
+ but `sed' is not supposed to clear the `t' flag when a
+ substitution fails. Command (b) sees that the flag is set,
+ therefore it clears it, and jumps to (d), hence you get `delete me'
+ instead of `deleted'. When processing line (3), `t' is clear, (a)
+ matches, so the flag is set, hence (b) clears the flags and jumps.
+ Finally, since the flag is clear, line 4 is processed properly.
+
+ There are two things one should remember about `t' in `sed'.
+ Firstly, always remember that `t' jumps if _some_ substitution
+ succeeded, not only the immediately preceding substitution.
+ Therefore, always use a fake `t clear' followed by a `:clear' on
+ the next line, to reset the `t' flag where needed.
+
+ Secondly, you cannot rely on `sed' to clear the flag at each new
+ cycle.
+
+ One portable implementation of the script above is:
+
+ t clear
+ :clear
+ s/keep me/kept/g
+ t end
+ s/.*/deleted/g
+ :end
+
+`sleep'
+ Using `sleep' is generally portable. However, remember that
+ adding a `sleep' to work around timestamp issues, with a minimum
+ granularity of one second, doesn't scale well for parallel builds
+ on modern machines with sub-second process completion.
+
+`sort'
+ Remember that sort order is influenced by the current locale.
+ Inside `configure', the C locale is in effect, but in Makefile
+ snippets, you may need to specify `LC_ALL=C sort'.
+
+`tar'
+ There are multiple file formats for `tar'; if you use Automake,
+ the macro `AM_INIT_AUTOMAKE' has some options controlling which
+ level of portability to use.
+
+`touch'
+ If you specify the desired timestamp (e.g., with the `-r' option),
+ older `touch' implementations use the `utime' or `utimes' system
+ call, which can result in the same kind of timestamp truncation
+ problems that `cp -p' has.
+
+ On ancient BSD systems, `touch' or any command that results in an
+ empty file does not update the timestamps, so use a command like
+ `echo' as a workaround. Also, GNU `touch' 3.16r (and presumably
+ all before that) fails to work on SunOS 4.1.3 when the empty file
+ is on an NFS-mounted 4.2 volume. However, these problems are no
+ longer of practical concern.
+
+`tr'
+ Not all versions of `tr' handle all backslash character escapes.
+ For example, Solaris 10 `/usr/ucb/tr' falls over, even though
+ Solaris contains more modern `tr' in other locations. Using octal
+ escapes is more portable for carriage returns, since `\015' is the
+ same for both ASCII and EBCDIC, and since use of literal carriage
+ returns in scripts causes a number of other problems. But for
+ other characters, like newline, using octal escapes ties the
+ operation to ASCII, so it is better to use literal characters.
+
+ $ { echo moon; echo light; } | /usr/ucb/tr -d '\n' ; echo
+ moo
+ light
+ $ { echo moon; echo light; } | /usr/bin/tr -d '\n' ; echo
+ moonlight
+ $ { echo moon; echo light; } | /usr/ucb/tr -d '\012' ; echo
+ moonlight
+ $ nl='
+ '; { echo moon; echo light; } | /usr/ucb/tr -d "$nl" ; echo
+ moonlight
+
+ Not all versions of `tr' recognize direct ranges of characters: at
+ least Solaris `/usr/bin/tr' still fails to do so. But you can use
+ `/usr/xpg4/bin/tr' instead, or add brackets (which in Posix
+ transliterate to themselves).
+
+ $ echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr a-z A-Z
+ HAZy FAntAZy
+ $ echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr '[a-z]' '[A-Z]'
+ HAZY FANTAZY
+ $ echo "Hazy Fantazy" | LC_ALL=C /usr/xpg4/bin/tr a-z A-Z
+ HAZY FANTAZY
+
+ When providing two arguments, be sure the second string is at
+ least as long as the first.
+
+ $ echo abc | /usr/xpg4/bin/tr bc d
+ adc
+ $ echo abc | coreutils/tr bc d
+ add
+
+ Posix requires `tr' to operate on binary files. But at least
+ Solaris `/usr/ucb/tr' and `/usr/bin/tr' silently discard `NUL' in
+ the input prior to doing any translation. When using `tr' to
+ process a binary file that may contain `NUL' bytes, it is
+ necessary to use `/usr/xpg4/bin/tr' instead, or `/usr/xpg6/bin/tr'
+ if that is available.
+
+ $ printf 'a\0b' | /usr/ucb/tr x x | od -An -tx1
+ 61 62
+ $ printf 'a\0b' | /usr/bin/tr x x | od -An -tx1
+ 61 62
+ $ printf 'a\0b' | /usr/xpg4/bin/tr x x | od -An -tx1
+ 61 00 62
+
+ Solaris `/usr/ucb/tr' additionally fails to handle `\0' as the
+ octal escape for `NUL'.
+
+ $ printf 'abc' | /usr/ucb/tr 'bc' '\0d' | od -An -tx1
+ 61 62 63
+ $ printf 'abc' | /usr/bin/tr 'bc' '\0d' | od -An -tx1
+ 61 00 64
+ $ printf 'abc' | /usr/xpg4/bin/tr 'bc' '\0d' | od -An -tx1
+ 61 00 64
+
+
+
+File: autoconf.info, Node: Portable Make, Next: Portable C and C++, Prev: Portable Shell, Up: Top
+
+12 Portable Make Programming
+****************************
+
+Writing portable makefiles is an art. Since a makefile's commands are
+executed by the shell, you must consider the shell portability issues
+already mentioned. However, other issues are specific to `make' itself.
+
+* Menu:
+
+* $< in Ordinary Make Rules:: $< in ordinary rules
+* Failure in Make Rules:: Failing portably in rules
+* Special Chars in Names:: Special Characters in Macro Names
+* Backslash-Newline-Empty:: Empty lines after backslash-newline
+* Backslash-Newline Comments:: Spanning comments across line boundaries
+* Long Lines in Makefiles:: Line length limitations
+* Macros and Submakes:: `make macro=value' and submakes
+* The Make Macro MAKEFLAGS:: `$(MAKEFLAGS)' portability issues
+* The Make Macro SHELL:: `$(SHELL)' portability issues
+* Parallel Make:: Parallel `make' quirks
+* Comments in Make Rules:: Other problems with Make comments
+* Newlines in Make Rules:: Using literal newlines in rules
+* Comments in Make Macros:: Other problems with Make comments in macros
+* Trailing whitespace in Make Macros:: Macro substitution problems
+* Command-line Macros and whitespace:: Whitespace trimming of values
+* obj/ and Make:: Don't name a subdirectory `obj'
+* make -k Status:: Exit status of `make -k'
+* VPATH and Make:: `VPATH' woes
+* Single Suffix Rules:: Single suffix rules and separated dependencies
+* Timestamps and Make:: Subsecond timestamp resolution
+
+
+File: autoconf.info, Node: $< in Ordinary Make Rules, Next: Failure in Make Rules, Up: Portable Make
+
+12.1 `$<' in Ordinary Make Rules
+================================
+
+Posix says that the `$<' construct in makefiles can be used only in
+inference rules and in the `.DEFAULT' rule; its meaning in ordinary
+rules is unspecified. Solaris `make' for instance replaces it with the
+empty string. OpenBSD (3.0 and later) `make' diagnoses these uses and
+errors out.
+
+
+File: autoconf.info, Node: Failure in Make Rules, Next: Special Chars in Names, Prev: $< in Ordinary Make Rules, Up: Portable Make
+
+12.2 Failure in Make Rules
+==========================
+
+Posix 2008 requires that `make' must invoke each command with the
+equivalent of a `sh -e -c' subshell, which causes the subshell to exit
+immediately if a subsidiary simple-command fails, although not all
+`make' implementations have historically followed this rule. For
+example, the command `touch T; rm -f U' may attempt to remove `U' even
+if the `touch' fails, although this is not permitted with Posix make.
+One way to work around failures in simple commands is to reword them so
+that they always succeed, e.g., `touch T || :; rm -f U'. However, even
+this approach can run into common bugs in BSD implementations of the
+`-e' option of `sh' and `set' (*note Limitations of Shell Builtins:
+set.), so if you are worried about porting to buggy BSD shells it may
+be simpler to migrate complicated `make' actions into separate scripts.
+
+
+File: autoconf.info, Node: Special Chars in Names, Next: Backslash-Newline-Empty, Prev: Failure in Make Rules, Up: Portable Make
+
+12.3 Special Characters in Make Macro Names
+===========================================
+
+Posix limits macro names to nonempty strings containing only ASCII
+letters and digits, `.', and `_'. Many `make' implementations allow a
+wider variety of characters, but portable makefiles should avoid them.
+It is portable to start a name with a special character, e.g.,
+`$(.FOO)'.
+
+ Some ancient `make' implementations don't support leading
+underscores in macro names. An example is NEWS-OS 4.2R.
+
+ $ cat Makefile
+ _am_include = #
+ _am_quote =
+ all:; @echo this is test
+ $ make
+ Make: Must be a separator on rules line 2. Stop.
+ $ cat Makefile2
+ am_include = #
+ am_quote =
+ all:; @echo this is test
+ $ make -f Makefile2
+ this is test
+
+However, this problem is no longer of practical concern.
+
+
+File: autoconf.info, Node: Backslash-Newline-Empty, Next: Backslash-Newline Comments, Prev: Special Chars in Names, Up: Portable Make
+
+12.4 Backslash-Newline Before Empty Lines
+=========================================
+
+A bug in Bash 2.03 can cause problems if a Make rule contains a
+backslash-newline followed by line that expands to nothing. For
+example, on Solaris 8:
+
+ SHELL = /bin/bash
+ EMPTY =
+ foo:
+ touch foo \
+ $(EMPTY)
+
+executes
+
+ /bin/bash -c 'touch foo \
+ '
+
+which fails with a syntax error, due to the Bash bug. To avoid this
+problem, avoid nullable macros in the last line of a multiline command.
+
+ On some versions of HP-UX, `make' reads multiple newlines following
+a backslash, continuing to the next non-empty line. For example,
+
+ FOO = one \
+
+ BAR = two
+
+ test:
+ : FOO is "$(FOO)"
+ : BAR is "$(BAR)"
+
+shows `FOO' equal to `one BAR = two'. Other implementations sensibly
+let a backslash continue only to the immediately following line.
+
+
+File: autoconf.info, Node: Backslash-Newline Comments, Next: Long Lines in Makefiles, Prev: Backslash-Newline-Empty, Up: Portable Make
+
+12.5 Backslash-Newline in Make Comments
+=======================================
+
+According to Posix, Make comments start with `#' and continue until an
+unescaped newline is reached.
+
+ $ cat Makefile
+ # A = foo \
+ bar \
+ baz
+
+ all:
+ @echo ok
+ $ make # GNU make
+ ok
+
+However this is not always the case. Some implementations discard
+everything from `#' through the end of the line, ignoring any trailing
+backslash.
+
+ $ pmake # BSD make
+ "Makefile", line 3: Need an operator
+ Fatal errors encountered -- cannot continue
+
+Therefore, if you want to comment out a multi-line definition, prefix
+each line with `#', not only the first.
+
+ # A = foo \
+ # bar \
+ # baz
+
+
+File: autoconf.info, Node: Long Lines in Makefiles, Next: Macros and Submakes, Prev: Backslash-Newline Comments, Up: Portable Make
+
+12.6 Long Lines in Makefiles
+============================
+
+Tru64 5.1's `make' has been reported to crash when given a makefile
+with lines longer than around 20 kB. Earlier versions are reported to
+exit with `Line too long' diagnostics.
+
+
+File: autoconf.info, Node: Macros and Submakes, Next: The Make Macro MAKEFLAGS, Prev: Long Lines in Makefiles, Up: Portable Make
+
+12.7 `make macro=value' and Submakes
+====================================
+
+A command-line variable definition such as `foo=bar' overrides any
+definition of `foo' in a makefile. Some `make' implementations (such
+as GNU `make') propagate this override to subsidiary invocations of
+`make'. Some other implementations do not pass the substitution along
+to submakes.
+
+ $ cat Makefile
+ foo = foo
+ one:
+ @echo $(foo)
+ $(MAKE) two
+ two:
+ @echo $(foo)
+ $ make foo=bar # GNU make 3.79.1
+ bar
+ make two
+ make[1]: Entering directory `/home/adl'
+ bar
+ make[1]: Leaving directory `/home/adl'
+ $ pmake foo=bar # BSD make
+ bar
+ pmake two
+ foo
+
+ You have a few possibilities if you do want the `foo=bar' override
+to propagate to submakes. One is to use the `-e' option, which causes
+all environment variables to have precedence over the makefile macro
+definitions, and declare foo as an environment variable:
+
+ $ env foo=bar make -e
+
+ The `-e' option is propagated to submakes automatically, and since
+the environment is inherited between `make' invocations, the `foo'
+macro is overridden in submakes as expected.
+
+ This syntax (`foo=bar make -e') is portable only when used outside
+of a makefile, for instance from a script or from the command line.
+When run inside a `make' rule, GNU `make' 3.80 and prior versions
+forget to propagate the `-e' option to submakes.
+
+ Moreover, using `-e' could have unexpected side effects if your
+environment contains some other macros usually defined by the makefile.
+(See also the note about `make -e' and `SHELL' below.)
+
+ If you can foresee all macros that a user might want to override,
+then you can propagate them to submakes manually, from your makefile:
+
+ foo = foo
+ one:
+ @echo $(foo)
+ $(MAKE) foo=$(foo) two
+ two:
+ @echo $(foo)
+
+ Another way to propagate a variable to submakes in a portable way is
+to expand an extra variable in every invocation of `$(MAKE)' within
+your makefile:
+
+ foo = foo
+ one:
+ @echo $(foo)
+ $(MAKE) $(SUBMAKEFLAGS) two
+ two:
+ @echo $(foo)
+
+ Users must be aware that this technique is in use to take advantage
+of it, e.g. with `make foo=bar SUBMAKEFLAGS='foo=bar'', but it allows
+any macro to be overridden. Makefiles generated by `automake' use this
+technique, expanding `$(AM_MAKEFLAGS)' on the command lines of submakes
+(*note Automake: (automake)Subdirectories.).
+
+
+File: autoconf.info, Node: The Make Macro MAKEFLAGS, Next: The Make Macro SHELL, Prev: Macros and Submakes, Up: Portable Make
+
+12.8 The Make Macro MAKEFLAGS
+=============================
+
+Posix requires `make' to use `MAKEFLAGS' to affect the current and
+recursive invocations of make, but allows implementations several
+formats for the variable. It is tricky to parse `$MAKEFLAGS' to
+determine whether `-s' for silent execution or `-k' for continued
+execution are in effect. For example, you cannot assume that the first
+space-separated word in `$MAKEFLAGS' contains single-letter options,
+since in the Cygwin version of GNU `make' it is either `--unix' or
+`--win32' with the second word containing single-letter options.
+
+ $ cat Makefile
+ all:
+ @echo MAKEFLAGS = $(MAKEFLAGS)
+ $ make
+ MAKEFLAGS = --unix
+ $ make -k
+ MAKEFLAGS = --unix -k
+
+
+File: autoconf.info, Node: The Make Macro SHELL, Next: Parallel Make, Prev: The Make Macro MAKEFLAGS, Up: Portable Make
+
+12.9 The Make Macro `SHELL'
+===========================
+
+Posix-compliant `make' internally uses the `$(SHELL)' macro to spawn
+shell processes and execute Make rules. This is a builtin macro
+supplied by `make', but it can be modified by a makefile or by a
+command-line argument.
+
+ Not all `make' implementations define this `SHELL' macro. Tru64
+`make' is an example; this implementation always uses `/bin/sh'. So
+it's a good idea to always define `SHELL' in your makefiles. If you
+use Autoconf, do
+
+ SHELL = @SHELL@
+
+If you use Automake, this is done for you.
+
+ Do not force `SHELL = /bin/sh' because that is not correct
+everywhere. Remember, `/bin/sh' is not Posix compliant on many
+systems, such as FreeBSD 4, NetBSD 3, AIX 3, Solaris 10, or Tru64.
+Additionally, DJGPP lacks `/bin/sh', and when its GNU `make' port sees
+such a setting it enters a special emulation mode where features like
+pipes and redirections are emulated on top of DOS's `command.com'.
+Unfortunately this emulation is incomplete; for instance it does not
+handle command substitutions. Using `@SHELL@' means that your makefile
+will benefit from the same improved shell, such as `bash' or `ksh',
+that was discovered during `configure', so that you aren't fighting two
+different sets of shell bugs between the two contexts.
+
+ Posix-compliant `make' should never acquire the value of $(SHELL)
+from the environment, even when `make -e' is used (otherwise, think
+about what would happen to your rules if `SHELL=/bin/tcsh').
+
+ However not all `make' implementations have this exception. For
+instance it's not surprising that Tru64 `make' doesn't protect `SHELL',
+since it doesn't use it.
+
+ $ cat Makefile
+ SHELL = /bin/sh
+ FOO = foo
+ all:
+ @echo $(SHELL)
+ @echo $(FOO)
+ $ env SHELL=/bin/tcsh FOO=bar make -e # Tru64 Make
+ /bin/tcsh
+ bar
+ $ env SHELL=/bin/tcsh FOO=bar gmake -e # GNU make
+ /bin/sh
+ bar
+
+ Conversely, `make' is not supposed to export any changes to the
+macro `SHELL' to child processes. Again, many implementations break
+this rule:
+
+ $ cat Makefile
+ all:
+ @echo $(SHELL)
+ @printenv SHELL
+ $ env SHELL=sh make -e SHELL=/bin/ksh # BSD Make, GNU make 3.80
+ /bin/ksh
+ /bin/ksh
+ $ env SHELL=sh gmake -e SHELL=/bin/ksh # GNU make 3.81
+ /bin/ksh
+ sh
+
+
+File: autoconf.info, Node: Parallel Make, Next: Comments in Make Rules, Prev: The Make Macro SHELL, Up: Portable Make
+
+12.10 Parallel Make
+===================
+
+Support for parallel execution in `make' implementation varies.
+Generally, using GNU make is your best bet.
+
+ When NetBSD or FreeBSD `make' are run in parallel mode, they will
+reuse the same shell for multiple commands within one recipe. This can
+have various unexpected consequences. For example, changes of
+directories or variables persist between recipes, so that:
+
+ all:
+ @var=value; cd /; pwd; echo $$var; echo $$$$
+ @pwd; echo $$var; echo $$$$
+
+may output the following with `make -j1', at least on NetBSD up to 5.1
+and FreeBSD up to 8.2:
+
+ /
+ value
+ 32235
+ /
+ value
+ 32235
+
+while without `-j1', or with `-B', the output looks less surprising:
+
+ /
+ value
+ 32238
+ /tmp
+
+ 32239
+
+Another consequence is that, if one command in a recipe uses `exit 0'
+to indicate a successful exit, the shell will be gone and the remaining
+commands of this recipe will not be executed.
+
+ The BSD `make' implementations, when run in parallel mode, will also
+pass the `Makefile' recipes to the shell through its standard input,
+thus making it unusable from the recipes:
+
+ $ cat Makefile
+ read:
+ @read line; echo LINE: $$line
+ $ echo foo | make read
+ LINE: foo
+ $ echo foo | make -j1 read # NetBSD 5.1 and FreeBSD 8.2
+ LINE:
+
+Moreover, when FreeBSD `make' (up at least to 8.2) is run in parallel
+mode, it implements the `@' and `-' "recipe modifiers" by dynamically
+modifying the active shell flags. This behavior has the effects of
+potentially clobbering the exit status of recipes silenced with the `@'
+modifier if they also unset the `errexit' shell flag, and of mangling
+the output in unexpected ways:
+
+ $ cat Makefile
+ a:
+ @echo $$-; set +e; false
+ b:
+ -echo $$-; false; echo set -
+ $ make a; echo status: $?
+ ehBc
+ *** Error code 1
+ status: 1
+ $ make -j1 a; echo status: $?
+ ehB
+ status: 0
+ $ make b
+ echo $-; echo set -
+ hBc
+ set -
+ $ make -j1 b
+ echo $-; echo hvB
+
+You can avoid all these issues by using the `-B' option to enable
+compatibility semantics. However, that will effectively also disable
+all parallelism as that will cause prerequisites to be updated in the
+order they are listed in a rule.
+
+ Some make implementations (among them, FreeBSD `make', NetBSD
+`make', and Solaris `dmake'), when invoked with a `-jN' option, connect
+the standard output and standard error of all their child processes to
+pipes or temporary regular files. This can lead to subtly different
+semantics in the behavior of the spawned processes. For example, even
+if the `make' standard output is connected to a tty, the recipe command
+will not be:
+
+ $ cat Makefile
+ all:
+ @test -t 1 && echo "Is a tty" || echo "Is not a tty"
+ $ make -j 2 # FreeBSD 8.2 make
+ Is not a tty
+ $ make -j 2 # NetBSD 5.1 make
+ --- all ---
+ Is not a tty
+ $ dmake -j 2 # Solaris 10 dmake
+ HOSTNAME --> 1 job
+ HOSTNAME --> Job output
+ Is not a tty
+
+On the other hand:
+
+ $ make -j 2 # GNU make, Heirloom make
+ Is a tty
+
+The above examples also show additional status output produced in
+parallel mode for targets being updated by Solaris `dmake' and NetBSD
+`make' (but _not_ by FreeBSD `make').
+
+ Furthermore, parallel runs of those `make' implementations will
+route standard error from commands that they spawn into their own
+standard output, and may remove leading whitespace from output lines.
+
+
+File: autoconf.info, Node: Comments in Make Rules, Next: Newlines in Make Rules, Prev: Parallel Make, Up: Portable Make
+
+12.11 Comments in Make Rules
+============================
+
+Never put comments in a rule.
+
+ Some `make' treat anything starting with a tab as a command for the
+current rule, even if the tab is immediately followed by a `#'. The
+`make' from Tru64 Unix V5.1 is one of them. The following makefile
+runs `# foo' through the shell.
+
+ all:
+ # foo
+
+ As a workaround, you can use the `:' no-op command with a string
+argument that gets ignored:
+
+ all:
+ : "foo"
+
+ Conversely, if you want to use the `#' character in some command,
+you can only do so by expanding it inside a rule (*note Comments in
+Make Macros::). So for example, if `COMMENT_CHAR' is substituted by
+`config.status' as `#', then the following substitutes `@COMMENT_CHAR@'
+in a generated header:
+
+ foo.h: foo.h.in
+ sed -e 's|@''COMMENT_CHAR''@|@COMMENT_CHAR@|g' \
+ $(srcdir)/foo.h.in > $@
+
+ The funny shell quoting avoids a substitution at `config.status' run
+time of the left-hand side of the `sed' `s' command.
+
+
+File: autoconf.info, Node: Newlines in Make Rules, Next: Comments in Make Macros, Prev: Comments in Make Rules, Up: Portable Make
+
+12.12 Newlines in Make Rules
+============================
+
+In shell scripts, newlines can be used inside string literals. But in
+the shell statements of `Makefile' rules, this is not possible: A
+newline not preceded by a backslash is a separator between shell
+statements. Whereas a newline that is preceded by a backslash becomes
+part of the shell statement according to POSIX, but gets replaced,
+together with the backslash that precedes it, by a space in GNU `make'
+3.80 and older. So, how can a newline be used in a string literal?
+
+ The trick is to set up a shell variable that contains a newline:
+
+ nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"
+
+ For example, in order to create a multiline `sed' expression that
+inserts a blank line after every line of a file, this code can be used:
+
+ nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"; \
+ sed -e "s/\$$/\\$${nl}/" < input > output
+
+
+File: autoconf.info, Node: Comments in Make Macros, Next: Trailing whitespace in Make Macros, Prev: Newlines in Make Rules, Up: Portable Make
+
+12.13 Comments in Make Macros
+=============================
+
+Avoid putting comments in macro values as far as possible. Posix
+specifies that the text starting from the `#' sign until the end of the
+line is to be ignored, which has the unfortunate effect of disallowing
+them even within quotes. Thus, the following might lead to a syntax
+error at compile time:
+
+ CPPFLAGS = "-DCOMMENT_CHAR='#'"
+
+as `CPPFLAGS' may be expanded to `"-DCOMMENT_CHAR=''.
+
+ Most `make' implementations disregard this and treat single and
+double quotes specially here. Also, GNU `make' lets you put `#' into a
+macro value by escaping it with a backslash, i.e., `\#'. However,
+neither of these usages are portable. *Note Comments in Make Rules::,
+for a portable alternative.
+
+ Even without quoting involved, comments can have surprising effects,
+because the whitespace before them is part of the variable value:
+
+ foo = bar # trailing comment
+ print: ; @echo "$(foo)."
+
+prints `bar .', which is usually not intended, and can expose `make'
+bugs as described below.
+
+
+File: autoconf.info, Node: Trailing whitespace in Make Macros, Next: Command-line Macros and whitespace, Prev: Comments in Make Macros, Up: Portable Make
+
+12.14 Trailing whitespace in Make Macros
+========================================
+
+GNU `make' 3.80 mistreats trailing whitespace in macro substitutions
+and appends another spurious suffix:
+
+ empty =
+ foo = bar $(empty)
+ print: ; @echo $(foo:=.test)
+
+prints `bar.test .test'.
+
+ BSD and Solaris `make' implementations do not honor trailing
+whitespace in macro definitions as Posix requires:
+
+ foo = bar # Note the space after "bar".
+ print: ; @echo $(foo)t
+
+prints `bart' instead of `bar t'. To work around this, you can use a
+helper macro as in the previous example.
+
+
+File: autoconf.info, Node: Command-line Macros and whitespace, Next: obj/ and Make, Prev: Trailing whitespace in Make Macros, Up: Portable Make
+
+12.15 Command-line Macros and whitespace
+========================================
+
+Some `make' implementations may strip trailing whitespace off of macros
+set on the command line in addition to leading whitespace. Further,
+some may strip leading whitespace off of macros set from environment
+variables:
+
+ $ echo 'print: ; @echo "x$(foo)x$(bar)x"' |
+ foo=' f f ' make -f - bar=' b b '
+ x f f xb b x # AIX, BSD, GNU make
+ xf f xb b x # HP-UX, IRIX, Tru64/OSF make
+ x f f xb bx # Solaris make
+
+
+File: autoconf.info, Node: obj/ and Make, Next: make -k Status, Prev: Command-line Macros and whitespace, Up: Portable Make
+
+12.16 The `obj/' Subdirectory and Make
+======================================
+
+Never name one of your subdirectories `obj/' if you don't like
+surprises.
+
+ If an `obj/' directory exists, BSD `make' enters it before reading
+the makefile. Hence the makefile in the current directory is not read.
+
+ $ cat Makefile
+ all:
+ echo Hello
+ $ cat obj/Makefile
+ all:
+ echo World
+ $ make # GNU make
+ echo Hello
+ Hello
+ $ pmake # BSD make
+ echo World
+ World
+
+
+File: autoconf.info, Node: make -k Status, Next: VPATH and Make, Prev: obj/ and Make, Up: Portable Make
+
+12.17 Exit Status of `make -k'
+==============================
+
+Do not rely on the exit status of `make -k'. Some implementations
+reflect whether they encountered an error in their exit status; other
+implementations always succeed.
+
+ $ cat Makefile
+ all:
+ false
+ $ make -k; echo exit status: $? # GNU make
+ false
+ make: *** [all] Error 1
+ exit status: 2
+ $ pmake -k; echo exit status: $? # BSD make
+ false
+ *** Error code 1 (continuing)
+ exit status: 0
+
+
+File: autoconf.info, Node: VPATH and Make, Next: Single Suffix Rules, Prev: make -k Status, Up: Portable Make
+
+12.18 `VPATH' and Make
+======================
+
+Posix does not specify the semantics of `VPATH'. Typically, `make'
+supports `VPATH', but its implementation is not consistent.
+
+ Autoconf and Automake support makefiles whose usages of `VPATH' are
+portable to recent-enough popular implementations of `make', but to
+keep the resulting makefiles portable, a package's makefile prototypes
+must take the following issues into account. These issues are
+complicated and are often poorly understood, and installers who use
+`VPATH' should expect to find many bugs in this area. If you use
+`VPATH', the simplest way to avoid these portability bugs is to stick
+with GNU `make', since it is the most commonly-used `make' among
+Autoconf users.
+
+ Here are some known issues with some `VPATH' implementations.
+
+* Menu:
+
+* Variables listed in VPATH:: `VPATH' must be literal on ancient hosts
+* VPATH and Double-colon:: Problems with `::' on ancient hosts
+* $< in Explicit Rules:: `$<' does not work in ordinary rules
+* Automatic Rule Rewriting:: `VPATH' goes wild on Solaris
+* Tru64 Directory Magic:: `mkdir' goes wild on Tru64
+* Make Target Lookup:: More details about `VPATH' lookup
+
+
+File: autoconf.info, Node: Variables listed in VPATH, Next: VPATH and Double-colon, Up: VPATH and Make
+
+12.18.1 Variables listed in `VPATH'
+-----------------------------------
+
+Do not set `VPATH' to the value of another variable, for example `VPATH
+= $(srcdir)', because some ancient versions of `make' do not do
+variable substitutions on the value of `VPATH'. For example, use this
+
+ srcdir = @srcdir@
+ VPATH = @srcdir@
+
+rather than `VPATH = $(srcdir)'. Note that with GNU Automake, there is
+no need to set this yourself.
+
+
+File: autoconf.info, Node: VPATH and Double-colon, Next: $< in Explicit Rules, Prev: Variables listed in VPATH, Up: VPATH and Make
+
+12.18.2 `VPATH' and Double-colon Rules
+--------------------------------------
+
+With ancient versions of Sun `make', any assignment to `VPATH' causes
+`make' to execute only the first set of double-colon rules. However,
+this problem is no longer of practical concern.
+
+
+File: autoconf.info, Node: $< in Explicit Rules, Next: Automatic Rule Rewriting, Prev: VPATH and Double-colon, Up: VPATH and Make
+
+12.18.3 `$<' Not Supported in Explicit Rules
+--------------------------------------------
+
+Using `$<' in explicit rules is not portable. The prerequisite file
+must be named explicitly in the rule. If you want to find the
+prerequisite via a `VPATH' search, you have to code the whole thing
+manually. *Note Build Directories::.
+
+
+File: autoconf.info, Node: Automatic Rule Rewriting, Next: Tru64 Directory Magic, Prev: $< in Explicit Rules, Up: VPATH and Make
+
+12.18.4 Automatic Rule Rewriting
+--------------------------------
+
+Some `make' implementations, such as Solaris and Tru64, search for
+prerequisites in `VPATH' and then rewrite each occurrence as a plain
+word in the rule. For instance:
+
+ # This isn't portable to GNU make.
+ VPATH = ../pkg/src
+ f.c: if.c
+ cp if.c f.c
+
+executes `cp ../pkg/src/if.c f.c' if `if.c' is found in `../pkg/src'.
+
+ However, this rule leads to real problems in practice. For example,
+if the source directory contains an ordinary file named `test' that is
+used in a dependency, Solaris `make' rewrites commands like `if test -r
+foo; ...' to `if ../pkg/src/test -r foo; ...', which is typically
+undesirable. In fact, `make' is completely unaware of shell syntax
+used in the rules, so the VPATH rewrite can potentially apply to _any_
+whitespace-separated word in a rule, including shell variables,
+functions, and keywords.
+
+ $ mkdir build
+ $ cd build
+ $ cat > Makefile <<'END'
+ VPATH = ..
+ all: arg func for echo
+ func () { for arg in "$$@"; do echo $$arg; done; }; \
+ func "hello world"
+ END
+ $ touch ../arg ../func ../for ../echo
+ $ make
+ ../func () { ../for ../arg in "$@"; do ../echo $arg; done; }; \
+ ../func "hello world"
+ sh: syntax error at line 1: `do' unexpected
+ *** Error code 2
+
+To avoid this problem, portable makefiles should never mention a source
+file or dependency whose name is that of a shell keyword like `for' or
+`until', a shell command like `cat' or `gcc' or `test', or a shell
+function or variable used in the corresponding `Makefile' recipe.
+
+ Because of these problems GNU `make' and many other `make'
+implementations do not rewrite commands, so portable makefiles should
+search `VPATH' manually. It is tempting to write this:
+
+ # This isn't portable to Solaris make.
+ VPATH = ../pkg/src
+ f.c: if.c
+ cp `test -f if.c || echo $(VPATH)/`if.c f.c
+
+However, the "prerequisite rewriting" still applies here. So if `if.c'
+is in `../pkg/src', Solaris and Tru64 `make' execute
+
+ cp `test -f ../pkg/src/if.c || echo ../pkg/src/`if.c f.c
+
+which reduces to
+
+ cp if.c f.c
+
+and thus fails. Oops.
+
+ A simple workaround, and good practice anyway, is to use `$?' and
+`$@' when possible:
+
+ VPATH = ../pkg/src
+ f.c: if.c
+ cp $? $@
+
+but this does not generalize well to commands with multiple
+prerequisites. A more general workaround is to rewrite the rule so that
+the prerequisite `if.c' never appears as a plain word. For example,
+these three rules would be safe, assuming `if.c' is in `../pkg/src' and
+the other files are in the working directory:
+
+ VPATH = ../pkg/src
+ f.c: if.c f1.c
+ cat `test -f ./if.c || echo $(VPATH)/`if.c f1.c >$@
+ g.c: if.c g1.c
+ cat `test -f 'if.c' || echo $(VPATH)/`if.c g1.c >$@
+ h.c: if.c h1.c
+ cat `test -f "if.c" || echo $(VPATH)/`if.c h1.c >$@
+
+ Things get worse when your prerequisites are in a macro.
+
+ VPATH = ../pkg/src
+ HEADERS = f.h g.h h.h
+ install-HEADERS: $(HEADERS)
+ for i in $(HEADERS); do \
+ $(INSTALL) -m 644 \
+ `test -f $$i || echo $(VPATH)/`$$i \
+ $(DESTDIR)$(includedir)/$$i; \
+ done
+
+ The above `install-HEADERS' rule is not Solaris-proof because `for i
+in $(HEADERS);' is expanded to `for i in f.h g.h h.h;' where `f.h' and
+`g.h' are plain words and are hence subject to `VPATH' adjustments.
+
+ If the three files are in `../pkg/src', the rule is run as:
+
+ for i in ../pkg/src/f.h ../pkg/src/g.h h.h; do \
+ install -m 644 \
+ `test -f $i || echo ../pkg/src/`$i \
+ /usr/local/include/$i; \
+ done
+
+ where the two first `install' calls fail. For instance, consider
+the `f.h' installation:
+
+ install -m 644 \
+ `test -f ../pkg/src/f.h || \
+ echo ../pkg/src/ \
+ `../pkg/src/f.h \
+ /usr/local/include/../pkg/src/f.h;
+
+It reduces to:
+
+ install -m 644 \
+ ../pkg/src/f.h \
+ /usr/local/include/../pkg/src/f.h;
+
+ Note that the manual `VPATH' search did not cause any problems here;
+however this command installs `f.h' in an incorrect directory.
+
+ Trying to quote `$(HEADERS)' in some way, as we did for `foo.c' a
+few makefiles ago, does not help:
+
+ install-HEADERS: $(HEADERS)
+ headers='$(HEADERS)'; \
+ for i in $$headers; do \
+ $(INSTALL) -m 644 \
+ `test -f $$i || echo $(VPATH)/`$$i \
+ $(DESTDIR)$(includedir)/$$i; \
+ done
+
+ Now, `headers='$(HEADERS)'' macro-expands to:
+
+ headers='f.h g.h h.h'
+
+but `g.h' is still a plain word. (As an aside, the idiom
+`headers='$(HEADERS)'; for i in $$headers;' is a good idea if
+`$(HEADERS)' can be empty, because some shells diagnose a syntax error
+on `for i in;'.)
+
+ One workaround is to strip this unwanted `../pkg/src/' prefix
+manually:
+
+ VPATH = ../pkg/src
+ HEADERS = f.h g.h h.h
+ install-HEADERS: $(HEADERS)
+ headers='$(HEADERS)'; \
+ for i in $$headers; do \
+ i=`expr "$$i" : '$(VPATH)/\(.*\)'`;
+ $(INSTALL) -m 644 \
+ `test -f $$i || echo $(VPATH)/`$$i \
+ $(DESTDIR)$(includedir)/$$i; \
+ done
+
+ Automake does something similar. However the above hack works only
+if the files listed in `HEADERS' are in the current directory or a
+subdirectory; they should not be in an enclosing directory. If we had
+`HEADERS = ../f.h', the above fragment would fail in a VPATH build with
+Tru64 `make'. The reason is that not only does Tru64 `make' rewrite
+dependencies, but it also simplifies them. Hence `../f.h' becomes
+`../pkg/f.h' instead of `../pkg/src/../f.h'. This obviously defeats
+any attempt to strip a leading `../pkg/src/' component.
+
+ The following example makes the behavior of Tru64 `make' more
+apparent.
+
+ $ cat Makefile
+ VPATH = sub
+ all: ../foo
+ echo ../foo
+ $ ls
+ Makefile foo
+ $ make
+ echo foo
+ foo
+
+Dependency `../foo' was found in `sub/../foo', but Tru64 `make'
+simplified it as `foo'. (Note that the `sub/' directory does not even
+exist, this just means that the simplification occurred before the file
+was checked for.)
+
+ For the record here is how SunOS 4 `make' behaves on this example.
+
+ $ make
+ make: Fatal error: Don't know how to make target `../foo'
+ $ mkdir sub
+ $ make
+ echo sub/../foo
+ sub/../foo
+
+
+File: autoconf.info, Node: Tru64 Directory Magic, Next: Make Target Lookup, Prev: Automatic Rule Rewriting, Up: VPATH and Make
+
+12.18.5 Tru64 `make' Creates Prerequisite Directories Magically
+---------------------------------------------------------------
+
+When a prerequisite is a subdirectory of `VPATH', Tru64 `make' creates
+it in the current directory.
+
+ $ mkdir -p foo/bar build
+ $ cd build
+ $ cat >Makefile <<END
+ VPATH = ..
+ all: foo/bar
+ END
+ $ make
+ mkdir foo
+ mkdir foo/bar
+
+ This can yield unexpected results if a rule uses a manual `VPATH'
+search as presented before.
+
+ VPATH = ..
+ all : foo/bar
+ command `test -d foo/bar || echo ../`foo/bar
+
+ The above `command' is run on the empty `foo/bar' directory that was
+created in the current directory.
+
+
+File: autoconf.info, Node: Make Target Lookup, Prev: Tru64 Directory Magic, Up: VPATH and Make
+
+12.18.6 Make Target Lookup
+--------------------------
+
+GNU `make' uses a complex algorithm to decide when it should use files
+found via a `VPATH' search. *Note How Directory Searches are
+Performed: (make)Search Algorithm.
+
+ If a target needs to be rebuilt, GNU `make' discards the file name
+found during the `VPATH' search for this target, and builds the file
+locally using the file name given in the makefile. If a target does
+not need to be rebuilt, GNU `make' uses the file name found during the
+`VPATH' search.
+
+ Other `make' implementations, like NetBSD `make', are easier to
+describe: the file name found during the `VPATH' search is used whether
+the target needs to be rebuilt or not. Therefore new files are created
+locally, but existing files are updated at their `VPATH' location.
+
+ OpenBSD and FreeBSD `make', however, never perform a `VPATH' search
+for a dependency that has an explicit rule. This is extremely annoying.
+
+ When attempting a `VPATH' build for an autoconfiscated package
+(e.g., `mkdir build && cd build && ../configure'), this means GNU
+`make' builds everything locally in the `build' directory, while BSD
+`make' builds new files locally and updates existing files in the
+source directory.
+
+ $ cat Makefile
+ VPATH = ..
+ all: foo.x bar.x
+ foo.x bar.x: newer.x
+ @echo Building $@
+ $ touch ../bar.x
+ $ touch ../newer.x
+ $ make # GNU make
+ Building foo.x
+ Building bar.x
+ $ pmake # NetBSD make
+ Building foo.x
+ Building ../bar.x
+ $ fmake # FreeBSD make, OpenBSD make
+ Building foo.x
+ Building bar.x
+ $ tmake # Tru64 make
+ Building foo.x
+ Building bar.x
+ $ touch ../bar.x
+ $ make # GNU make
+ Building foo.x
+ $ pmake # NetBSD make
+ Building foo.x
+ $ fmake # FreeBSD make, OpenBSD make
+ Building foo.x
+ Building bar.x
+ $ tmake # Tru64 make
+ Building foo.x
+ Building bar.x
+
+ Note how NetBSD `make' updates `../bar.x' in its VPATH location, and
+how FreeBSD, OpenBSD, and Tru64 `make' always update `bar.x', even when
+`../bar.x' is up to date.
+
+ Another point worth mentioning is that once GNU `make' has decided
+to ignore a `VPATH' file name (e.g., it ignored `../bar.x' in the above
+example) it continues to ignore it when the target occurs as a
+prerequisite of another rule.
+
+ The following example shows that GNU `make' does not look up `bar.x'
+in `VPATH' before performing the `.x.y' rule, because it ignored the
+`VPATH' result of `bar.x' while running the `bar.x: newer.x' rule.
+
+ $ cat Makefile
+ VPATH = ..
+ all: bar.y
+ bar.x: newer.x
+ @echo Building $@
+ .SUFFIXES: .x .y
+ .x.y:
+ cp $< $@
+ $ touch ../bar.x
+ $ touch ../newer.x
+ $ make # GNU make
+ Building bar.x
+ cp bar.x bar.y
+ cp: cannot stat `bar.x': No such file or directory
+ make: *** [bar.y] Error 1
+ $ pmake # NetBSD make
+ Building ../bar.x
+ cp ../bar.x bar.y
+ $ rm bar.y
+ $ fmake # FreeBSD make, OpenBSD make
+ echo Building bar.x
+ cp bar.x bar.y
+ cp: cannot stat `bar.x': No such file or directory
+ *** Error code 1
+ $ tmake # Tru64 make
+ Building bar.x
+ cp: bar.x: No such file or directory
+ *** Exit 1
+
+ Note that if you drop away the command from the `bar.x: newer.x'
+rule, GNU `make' magically starts to work: it knows that `bar.x' hasn't
+been updated, therefore it doesn't discard the result from `VPATH'
+(`../bar.x') in succeeding uses. Tru64 also works, but FreeBSD and
+OpenBSD still don't.
+
+ $ cat Makefile
+ VPATH = ..
+ all: bar.y
+ bar.x: newer.x
+ .SUFFIXES: .x .y
+ .x.y:
+ cp $< $@
+ $ touch ../bar.x
+ $ touch ../newer.x
+ $ make # GNU make
+ cp ../bar.x bar.y
+ $ rm bar.y
+ $ pmake # NetBSD make
+ cp ../bar.x bar.y
+ $ rm bar.y
+ $ fmake # FreeBSD make, OpenBSD make
+ cp bar.x bar.y
+ cp: cannot stat `bar.x': No such file or directory
+ *** Error code 1
+ $ tmake # Tru64 make
+ cp ../bar.x bar.y
+
+ It seems the sole solution that would please every `make'
+implementation is to never rely on `VPATH' searches for targets. In
+other words, `VPATH' should be reserved to unbuilt sources.
+
+
+File: autoconf.info, Node: Single Suffix Rules, Next: Timestamps and Make, Prev: VPATH and Make, Up: Portable Make
+
+12.19 Single Suffix Rules and Separated Dependencies
+====================================================
+
+A "Single Suffix Rule" is basically a usual suffix (inference) rule
+(`.from.to:'), but which _destination_ suffix is empty (`.from:').
+
+ "Separated dependencies" simply refers to listing the prerequisite
+of a target, without defining a rule. Usually one can list on the one
+hand side, the rules, and on the other hand side, the dependencies.
+
+ Solaris `make' does not support separated dependencies for targets
+defined by single suffix rules:
+
+ $ cat Makefile
+ .SUFFIXES: .in
+ foo: foo.in
+ .in:
+ cp $< $@
+ $ touch foo.in
+ $ make
+ $ ls
+ Makefile foo.in
+
+while GNU Make does:
+
+ $ gmake
+ cp foo.in foo
+ $ ls
+ Makefile foo foo.in
+
+ Note it works without the `foo: foo.in' dependency.
+
+ $ cat Makefile
+ .SUFFIXES: .in
+ .in:
+ cp $< $@
+ $ make foo
+ cp foo.in foo
+
+and it works with double suffix inference rules:
+
+ $ cat Makefile
+ foo.out: foo.in
+ .SUFFIXES: .in .out
+ .in.out:
+ cp $< $@
+ $ make
+ cp foo.in foo.out
+
+ As a result, in such a case, you have to write target rules.
+
+
+File: autoconf.info, Node: Timestamps and Make, Prev: Single Suffix Rules, Up: Portable Make
+
+12.20 Timestamp Resolution and Make
+===================================
+
+Traditionally, file timestamps had 1-second resolution, and `make' used
+those timestamps to determine whether one file was newer than the
+other. However, many modern file systems have timestamps with
+1-nanosecond resolution. Some `make' implementations look at the
+entire timestamp; others ignore the fractional part, which can lead to
+incorrect results. Normally this is not a problem, but in some extreme
+cases you may need to use tricks like `sleep 1' to work around
+timestamp truncation bugs.
+
+ Commands like `cp -p' and `touch -r' typically do not copy file
+timestamps to their full resolutions (*note Limitations of Usual Tools:
+touch.). Hence you should be wary of rules like this:
+
+ dest: src
+ cp -p src dest
+
+ as `dest' often appears to be older than `src' after the timestamp
+is truncated, and this can cause `make' to do needless rework the next
+time it is invoked. To work around this problem, you can use a
+timestamp file, e.g.:
+
+ dest-stamp: src
+ cp -p src dest
+ date >dest-stamp
+
+ Apart from timestamp resolution, there are also differences in
+handling equal timestamps. HP-UX `make' updates targets if it has the
+same time stamp as one of its prerequisites, in violation of Posix
+rules.
+
+ This can cause spurious rebuilds for repeated runs of `make'. This
+in turn can cause `make' to fail if it tries to rebuild generated files
+in a possibly read-only source tree with tools not present on the
+end-user machine. Use GNU `make' instead.
+
+
+File: autoconf.info, Node: Portable C and C++, Next: Manual Configuration, Prev: Portable Make, Up: Top
+
+13 Portable C and C++ Programming
+*********************************
+
+C and C++ programs often use low-level features of the underlying
+system, and therefore are often more difficult to make portable to other
+platforms.
+
+ Several standards have been developed to help make your programs more
+portable. If you write programs with these standards in mind, you can
+have greater confidence that your programs work on a wide variety of
+systems. *Note Language Standards Supported by GCC: (gcc)Standards,
+for a list of C-related standards. Many programs also assume the Posix
+standard (http://www.opengroup.org/susv3).
+
+ Some old code is written to be portable to K&R C, which predates any
+C standard. K&R C compilers are no longer of practical interest,
+though, and the rest of section assumes at least C89, the first C
+standard.
+
+ Program portability is a huge topic, and this section can only
+briefly introduce common pitfalls. *Note Portability between System
+Types: (standards)System Portability, for more information.
+
+* Menu:
+
+* Varieties of Unportability:: How to make your programs unportable
+* Integer Overflow:: When integers get too large
+* Preprocessor Arithmetic:: `#if' expression problems
+* Null Pointers:: Properties of null pointers
+* Buffer Overruns:: Subscript errors and the like
+* Volatile Objects:: `volatile' and signals
+* Floating Point Portability:: Portable floating-point arithmetic
+* Exiting Portably:: Exiting and the exit status
+
+
+File: autoconf.info, Node: Varieties of Unportability, Next: Integer Overflow, Up: Portable C and C++
+
+13.1 Varieties of Unportability
+===============================
+
+Autoconf tests and ordinary programs often need to test what is allowed
+on a system, and therefore they may need to deliberately exceed the
+boundaries of what the standards allow, if only to see whether an
+optional feature is present. When you write such a program, you should
+keep in mind the difference between constraints, unspecified behavior,
+and undefined behavior.
+
+ In C, a "constraint" is a rule that the compiler must enforce. An
+example constraint is that C programs must not declare a bit-field with
+negative width. Tests can therefore reliably assume that programs with
+negative-width bit-fields are rejected by a compiler that conforms to
+the standard.
+
+ "Unspecified behavior" is valid behavior, where the standard allows
+multiple possibilities. For example, the order of evaluation of
+function arguments is unspecified. Some unspecified behavior is
+"implementation-defined", i.e., documented by the implementation, but
+since Autoconf tests cannot read the documentation they cannot
+distinguish between implementation-defined and other unspecified
+behavior. It is common for Autoconf tests to probe implementations to
+determine otherwise-unspecified behavior.
+
+ "Undefined behavior" is invalid behavior, where the standard allows
+the implementation to do anything it pleases. For example,
+dereferencing a null pointer leads to undefined behavior. If possible,
+test programs should avoid undefined behavior, since a program with
+undefined behavior might succeed on a test that should fail.
+
+ The above rules apply to programs that are intended to conform to the
+standard. However, strictly-conforming programs are quite rare, since
+the standards are so limiting. A major goal of Autoconf is to support
+programs that use implementation features not described by the standard,
+and it is fairly common for test programs to violate the above rules, if
+the programs work well enough in practice.
+
+
+File: autoconf.info, Node: Integer Overflow, Next: Preprocessor Arithmetic, Prev: Varieties of Unportability, Up: Portable C and C++
+
+13.2 Integer Overflow
+=====================
+
+In practice many portable C programs assume that signed integer
+overflow wraps around reliably using two's complement arithmetic. Yet
+the C standard says that program behavior is undefined on overflow, and
+in a few cases C programs do not work on some modern implementations
+because their overflows do not wrap around as their authors expected.
+Conversely, in signed integer remainder, the C standard requires
+overflow behavior that is commonly not implemented.
+
+* Menu:
+
+* Integer Overflow Basics:: Why integer overflow is a problem
+* Signed Overflow Examples:: Examples of code assuming wraparound
+* Optimization and Wraparound:: Optimizations that break uses of wraparound
+* Signed Overflow Advice:: Practical advice for signed overflow issues
+* Signed Integer Division:: `INT_MIN / -1' and `INT_MIN % -1'
+
+
+File: autoconf.info, Node: Integer Overflow Basics, Next: Signed Overflow Examples, Up: Integer Overflow
+
+13.2.1 Basics of Integer Overflow
+---------------------------------
+
+In languages like C, unsigned integer overflow reliably wraps around;
+e.g., `UINT_MAX + 1' yields zero. This is guaranteed by the C standard
+and is portable in practice, unless you specify aggressive, nonstandard
+optimization options suitable only for special applications.
+
+ In contrast, the C standard says that signed integer overflow leads
+to undefined behavior where a program can do anything, including dumping
+core or overrunning a buffer. The misbehavior can even precede the
+overflow. Such an overflow can occur during addition, subtraction,
+multiplication, division, and left shift.
+
+ Despite this requirement of the standard, many C programs and
+Autoconf tests assume that signed integer overflow silently wraps
+around modulo a power of two, using two's complement arithmetic, so
+long as you cast the resulting value to a signed integer type or store
+it into a signed integer variable. If you use conservative
+optimization flags, such programs are generally portable to the vast
+majority of modern platforms, with a few exceptions discussed later.
+
+ For historical reasons the C standard also allows implementations
+with ones' complement or signed magnitude arithmetic, but it is safe to
+assume two's complement nowadays.
+
+ Also, overflow can occur when converting an out-of-range value to a
+signed integer type. Here a standard implementation must define what
+happens, but this might include raising an exception. In practice all
+known implementations support silent wraparound in this case, so you
+need not worry about other possibilities.
+
+
+File: autoconf.info, Node: Signed Overflow Examples, Next: Optimization and Wraparound, Prev: Integer Overflow Basics, Up: Integer Overflow
+
+13.2.2 Examples of Code Assuming Wraparound Overflow
+----------------------------------------------------
+
+There has long been a tension between what the C standard requires for
+signed integer overflow, and what C programs commonly assume. The
+standard allows aggressive optimizations based on assumptions that
+overflow never occurs, but many practical C programs rely on overflow
+wrapping around. These programs do not conform to the standard, but
+they commonly work in practice because compiler writers are
+understandably reluctant to implement optimizations that would break
+many programs, unless perhaps a user specifies aggressive optimization.
+
+ The C Standard says that if a program has signed integer overflow its
+behavior is undefined, and the undefined behavior can even precede the
+overflow. To take an extreme example:
+
+ if (password == expected_password)
+ allow_superuser_privileges ();
+ else if (counter++ == INT_MAX)
+ abort ();
+ else
+ printf ("%d password mismatches\n", counter);
+
+If the `int' variable `counter' equals `INT_MAX', `counter++' must
+overflow and the behavior is undefined, so the C standard allows the
+compiler to optimize away the test against `INT_MAX' and the `abort'
+call. Worse, if an earlier bug in the program lets the compiler deduce
+that `counter == INT_MAX' or that `counter' previously overflowed, the
+C standard allows the compiler to optimize away the password test and
+generate code that allows superuser privileges unconditionally.
+
+ Despite this requirement by the standard, it has long been common
+for C code to assume wraparound arithmetic after signed overflow, and
+all known practical C implementations support some C idioms that assume
+wraparound signed arithmetic, even if the idioms do not conform
+strictly to the standard. If your code looks like the following
+examples it will almost surely work with real-world compilers.
+
+ Here is an example derived from the 7th Edition Unix implementation
+of `atoi' (1979-01-10):
+
+ char *p;
+ int f, n;
+ ...
+ while (*p >= '0' && *p <= '9')
+ n = n * 10 + *p++ - '0';
+ return (f ? -n : n);
+
+Even if the input string is in range, on most modern machines this has
+signed overflow when computing the most negative integer (the `-n'
+overflows) or a value near an extreme integer (the first `+' overflows).
+
+ Here is another example, derived from the 7th Edition implementation
+of `rand' (1979-01-10). Here the programmer expects both
+multiplication and addition to wrap on overflow:
+
+ static long int randx = 1;
+ ...
+ randx = randx * 1103515245 + 12345;
+ return (randx >> 16) & 077777;
+
+ In the following example, derived from the GNU C Library 2.5
+implementation of `mktime' (2006-09-09), the code assumes wraparound
+arithmetic in `+' to detect signed overflow:
+
+ time_t t, t1, t2;
+ int sec_requested, sec_adjustment;
+ ...
+ t1 = t + sec_requested;
+ t2 = t1 + sec_adjustment;
+ if (((t1 < t) != (sec_requested < 0))
+ | ((t2 < t1) != (sec_adjustment < 0)))
+ return -1;
+
+ If your code looks like these examples, it is probably safe even
+though it does not strictly conform to the C standard. This might lead
+one to believe that one can generally assume wraparound on overflow,
+but that is not always true, as can be seen in the next section.
+
+
+File: autoconf.info, Node: Optimization and Wraparound, Next: Signed Overflow Advice, Prev: Signed Overflow Examples, Up: Integer Overflow
+
+13.2.3 Optimizations That Break Wraparound Arithmetic
+-----------------------------------------------------
+
+Compilers sometimes generate code that is incompatible with wraparound
+integer arithmetic. A simple example is an algebraic simplification: a
+compiler might translate `(i * 2000) / 1000' to `i * 2' because it
+assumes that `i * 2000' does not overflow. The translation is not
+equivalent to the original when overflow occurs: e.g., in the typical
+case of 32-bit signed two's complement wraparound `int', if `i' has
+type `int' and value `1073742', the original expression returns
+-2147483 but the optimized version returns the mathematically correct
+value 2147484.
+
+ More subtly, loop induction optimizations often exploit the undefined
+behavior of signed overflow. Consider the following contrived function
+`sumc':
+
+ int
+ sumc (int lo, int hi)
+ {
+ int sum = 0;
+ int i;
+ for (i = lo; i <= hi; i++)
+ sum ^= i * 53;
+ return sum;
+ }
+
+To avoid multiplying by 53 each time through the loop, an optimizing
+compiler might internally transform `sumc' to the equivalent of the
+following:
+
+ int
+ transformed_sumc (int lo, int hi)
+ {
+ int sum = 0;
+ int hic = hi * 53;
+ int ic;
+ for (ic = lo * 53; ic <= hic; ic += 53)
+ sum ^= ic;
+ return sum;
+ }
+
+This transformation is allowed by the C standard, but it is invalid for
+wraparound arithmetic when `INT_MAX / 53 < hi', because then the
+overflow in computing expressions like `hi * 53' can cause the
+expression `i <= hi' to yield a different value from the transformed
+expression `ic <= hic'.
+
+ For this reason, compilers that use loop induction and similar
+techniques often do not support reliable wraparound arithmetic when a
+loop induction variable like `ic' is involved. Since loop induction
+variables are generated by the compiler, and are not visible in the
+source code, it is not always trivial to say whether the problem
+affects your code.
+
+ Hardly any code actually depends on wraparound arithmetic in cases
+like these, so in practice these loop induction optimizations are almost
+always useful. However, edge cases in this area can cause problems.
+For example:
+
+ int j;
+ for (j = 1; 0 < j; j *= 2)
+ test (j);
+
+Here, the loop attempts to iterate through all powers of 2 that `int'
+can represent, but the C standard allows a compiler to optimize away
+the comparison and generate an infinite loop, under the argument that
+behavior is undefined on overflow. As of this writing this
+optimization is not done by any production version of GCC with `-O2',
+but it might be performed by other compilers, or by more aggressive GCC
+optimization options, and the GCC developers have not decided whether
+it will continue to work with GCC and `-O2'.
+
+
+File: autoconf.info, Node: Signed Overflow Advice, Next: Signed Integer Division, Prev: Optimization and Wraparound, Up: Integer Overflow
+
+13.2.4 Practical Advice for Signed Overflow Issues
+--------------------------------------------------
+
+Ideally the safest approach is to avoid signed integer overflow
+entirely. For example, instead of multiplying two signed integers, you
+can convert them to unsigned integers, multiply the unsigned values,
+then test whether the result is in signed range.
+
+ Rewriting code in this way will be inconvenient, though,
+particularly if the signed values might be negative. Also, it may hurt
+performance. Using unsigned arithmetic to check for overflow is
+particularly painful to do portably and efficiently when dealing with an
+integer type like `uid_t' whose width and signedness vary from platform
+to platform.
+
+ Furthermore, many C applications pervasively assume wraparound
+behavior and typically it is not easy to find and remove all these
+assumptions. Hence it is often useful to maintain nonstandard code
+that assumes wraparound on overflow, instead of rewriting the code.
+The rest of this section attempts to give practical advice for this
+situation.
+
+ If your code wants to detect signed integer overflow in `sum = a +
+b', it is generally safe to use an expression like `(sum < a) != (b <
+0)'.
+
+ If your code uses a signed loop index, make sure that the index
+cannot overflow, along with all signed expressions derived from the
+index. Here is a contrived example of problematic code with two
+instances of overflow.
+
+ for (i = INT_MAX - 10; i <= INT_MAX; i++)
+ if (i + 1 < 0)
+ {
+ report_overflow ();
+ break;
+ }
+
+Because of the two overflows, a compiler might optimize away or
+transform the two comparisons in a way that is incompatible with the
+wraparound assumption.
+
+ If your code uses an expression like `(i * 2000) / 1000' and you
+actually want the multiplication to wrap around on overflow, use
+unsigned arithmetic to do it, e.g., `((int) (i * 2000u)) / 1000'.
+
+ If your code assumes wraparound behavior and you want to insulate it
+against any GCC optimizations that would fail to support that behavior,
+you should use GCC's `-fwrapv' option, which causes signed overflow to
+wrap around reliably (except for division and remainder, as discussed
+in the next section).
+
+ If you need to port to platforms where signed integer overflow does
+not reliably wrap around (e.g., due to hardware overflow checking, or to
+highly aggressive optimizations), you should consider debugging with
+GCC's `-ftrapv' option, which causes signed overflow to raise an
+exception.
+
+
+File: autoconf.info, Node: Signed Integer Division, Prev: Signed Overflow Advice, Up: Integer Overflow
+
+13.2.5 Signed Integer Division and Integer Overflow
+---------------------------------------------------
+
+Overflow in signed integer division is not always harmless: for
+example, on CPUs of the i386 family, dividing `INT_MIN' by `-1' yields
+a SIGFPE signal which by default terminates the program. Worse, taking
+the remainder of these two values typically yields the same signal on
+these CPUs, even though the C standard requires `INT_MIN % -1' to yield
+zero because the expression does not overflow.
+
+
+File: autoconf.info, Node: Preprocessor Arithmetic, Next: Null Pointers, Prev: Integer Overflow, Up: Portable C and C++
+
+13.3 Preprocessor Arithmetic
+============================
+
+In C99, preprocessor arithmetic, used for `#if' expressions, must be
+evaluated as if all signed values are of type `intmax_t' and all
+unsigned values of type `uintmax_t'. Many compilers are buggy in this
+area, though. For example, as of 2007, Sun C mishandles `#if LLONG_MIN
+< 0' on a platform with 32-bit `long int' and 64-bit `long long int'.
+Also, some older preprocessors mishandle constants ending in `LL'. To
+work around these problems, you can compute the value of expressions
+like `LONG_MAX < LLONG_MAX' at `configure'-time rather than at
+`#if'-time.
+
+
+File: autoconf.info, Node: Null Pointers, Next: Buffer Overruns, Prev: Preprocessor Arithmetic, Up: Portable C and C++
+
+13.4 Properties of Null Pointers
+================================
+
+Most modern hosts reliably fail when you attempt to dereference a null
+pointer.
+
+ On almost all modern hosts, null pointers use an all-bits-zero
+internal representation, so you can reliably use `memset' with 0 to set
+all the pointers in an array to null values.
+
+ If `p' is a null pointer to an object type, the C expression `p + 0'
+always evaluates to `p' on modern hosts, even though the standard says
+that it has undefined behavior.
+
+
+File: autoconf.info, Node: Buffer Overruns, Next: Volatile Objects, Prev: Null Pointers, Up: Portable C and C++
+
+13.5 Buffer Overruns and Subscript Errors
+=========================================
+
+Buffer overruns and subscript errors are the most common dangerous
+errors in C programs. They result in undefined behavior because storing
+outside an array typically modifies storage that is used by some other
+object, and most modern systems lack runtime checks to catch these
+errors. Programs should not rely on buffer overruns being caught.
+
+ There is one exception to the usual rule that a portable program
+cannot address outside an array. In C, it is valid to compute the
+address just past an object, e.g., `&a[N]' where `a' has `N' elements,
+so long as you do not dereference the resulting pointer. But it is not
+valid to compute the address just before an object, e.g., `&a[-1]'; nor
+is it valid to compute two past the end, e.g., `&a[N+1]'. On most
+platforms `&a[-1] < &a[0] && &a[N] < &a[N+1]', but this is not reliable
+in general, and it is usually easy enough to avoid the potential
+portability problem, e.g., by allocating an extra unused array element
+at the start or end.
+
+ Valgrind (http://valgrind.org/) can catch many overruns. GCC users
+might also consider using the `-fmudflap' option to catch overruns.
+
+ Buffer overruns are usually caused by off-by-one errors, but there
+are more subtle ways to get them.
+
+ Using `int' values to index into an array or compute array sizes
+causes problems on typical 64-bit hosts where an array index might be
+2^31 or larger. Index values of type `size_t' avoid this problem, but
+cannot be negative. Index values of type `ptrdiff_t' are signed, and
+are wide enough in practice.
+
+ If you add or multiply two numbers to calculate an array size, e.g.,
+`malloc (x * sizeof y + z)', havoc ensues if the addition or
+multiplication overflows.
+
+ Many implementations of the `alloca' function silently misbehave and
+can generate buffer overflows if given sizes that are too large. The
+size limits are implementation dependent, but are at least 4000 bytes
+on all platforms that we know about.
+
+ The standard functions `asctime', `asctime_r', `ctime', `ctime_r',
+and `gets' are prone to buffer overflows, and portable code should not
+use them unless the inputs are known to be within certain limits. The
+time-related functions can overflow their buffers if given timestamps
+out of range (e.g., a year less than -999 or greater than 9999).
+Time-related buffer overflows cannot happen with recent-enough versions
+of the GNU C library, but are possible with other implementations. The
+`gets' function is the worst, since it almost invariably overflows its
+buffer when presented with an input line larger than the buffer.
+
+
+File: autoconf.info, Node: Volatile Objects, Next: Floating Point Portability, Prev: Buffer Overruns, Up: Portable C and C++
+
+13.6 Volatile Objects
+=====================
+
+The keyword `volatile' is often misunderstood in portable code. Its
+use inhibits some memory-access optimizations, but programmers often
+wish that it had a different meaning than it actually does.
+
+ `volatile' was designed for code that accesses special objects like
+memory-mapped device registers whose contents spontaneously change.
+Such code is inherently low-level, and it is difficult to specify
+portably what `volatile' means in these cases. The C standard says,
+"What constitutes an access to an object that has volatile-qualified
+type is implementation-defined," so in theory each implementation is
+supposed to fill in the gap by documenting what `volatile' means for
+that implementation. In practice, though, this documentation is
+usually absent or incomplete.
+
+ One area of confusion is the distinction between objects defined with
+volatile types, and volatile lvalues. From the C standard's point of
+view, an object defined with a volatile type has externally visible
+behavior. You can think of such objects as having little oscilloscope
+probes attached to them, so that the user can observe some properties of
+accesses to them, just as the user can observe data written to output
+files. However, the standard does not make it clear whether users can
+observe accesses by volatile lvalues to ordinary objects. For example:
+
+ /* Declare and access a volatile object.
+ Accesses to X are "visible" to users. */
+ static int volatile x;
+ x = 1;
+
+ /* Access two ordinary objects via a volatile lvalue.
+ It's not clear whether accesses to *P are "visible". */
+ int y;
+ int *z = malloc (sizeof (int));
+ int volatile *p;
+ p = &y;
+ *p = 1;
+ p = z;
+ *p = 1;
+
+ Programmers often wish that `volatile' meant "Perform the memory
+access here and now, without merging several memory accesses, without
+changing the memory word size, and without reordering." But the C
+standard does not require this. For objects defined with a volatile
+type, accesses must be done before the next sequence point; but
+otherwise merging, reordering, and word-size change is allowed. Worse,
+it is not clear from the standard whether volatile lvalues provide more
+guarantees in general than nonvolatile lvalues, if the underlying
+objects are ordinary.
+
+ Even when accessing objects defined with a volatile type, the C
+standard allows only extremely limited signal handlers: the behavior is
+undefined if a signal handler reads any nonlocal object, or writes to
+any nonlocal object whose type is not `sig_atomic_t volatile', or calls
+any standard library function other than `abort', `signal', and (if C99)
+`_Exit'. Hence C compilers need not worry about a signal handler
+disturbing ordinary computation, unless the computation accesses a
+`sig_atomic_t volatile' lvalue that is not a local variable. (There is
+an obscure exception for accesses via a pointer to a volatile
+character, since it may point into part of a `sig_atomic_t volatile'
+object.) Posix adds to the list of library functions callable from a
+portable signal handler, but otherwise is like the C standard in this
+area.
+
+ Some C implementations allow memory-access optimizations within each
+translation unit, such that actual behavior agrees with the behavior
+required by the standard only when calling a function in some other
+translation unit, and a signal handler acts like it was called from a
+different translation unit. The C standard hints that in these
+implementations, objects referred to by signal handlers "would require
+explicit specification of `volatile' storage, as well as other
+implementation-defined restrictions." But unfortunately even for this
+special case these other restrictions are often not documented well.
+*Note When is a Volatile Object Accessed?: (gcc)Volatiles, for some
+restrictions imposed by GCC. *Note Defining Signal Handlers:
+(libc)Defining Handlers, for some restrictions imposed by the GNU C
+library. Restrictions differ on other platforms.
+
+ If possible, it is best to use a signal handler that fits within the
+limits imposed by the C and Posix standards.
+
+ If this is not practical, you can try the following rules of thumb.
+A signal handler should access only volatile lvalues, preferably lvalues
+that refer to objects defined with a volatile type, and should not
+assume that the accessed objects have an internally consistent state if
+they are larger than a machine word. Furthermore, installers should
+employ compilers and compiler options that are commonly used for
+building operating system kernels, because kernels often need more from
+`volatile' than the C Standard requires, and installers who compile an
+application in a similar environment can sometimes benefit from the
+extra constraints imposed by kernels on compilers. Admittedly we are
+handwaving somewhat here, as there are few guarantees in this area; the
+rules of thumb may help to fix some bugs but there is a good chance
+that they will not fix them all.
+
+ For `volatile', C++ has the same problems that C does.
+Multithreaded applications have even more problems with `volatile', but
+they are beyond the scope of this section.
+
+ The bottom line is that using `volatile' typically hurts performance
+but should not hurt correctness. In some cases its use does help
+correctness, but these cases are often so poorly understood that all
+too often adding `volatile' to a data structure merely alleviates some
+symptoms of a bug while not fixing the bug in general.
+
+
+File: autoconf.info, Node: Floating Point Portability, Next: Exiting Portably, Prev: Volatile Objects, Up: Portable C and C++
+
+13.7 Floating Point Portability
+===============================
+
+Almost all modern systems use IEEE-754 floating point, and it is safe to
+assume IEEE-754 in most portable code these days. For more information,
+please see David Goldberg's classic paper What Every Computer Scientist
+Should Know About Floating-Point Arithmetic
+(http://www.validlab.com/goldberg/paper.pdf).
+
+
+File: autoconf.info, Node: Exiting Portably, Prev: Floating Point Portability, Up: Portable C and C++
+
+13.8 Exiting Portably
+=====================
+
+A C or C++ program can exit with status N by returning N from the
+`main' function. Portable programs are supposed to exit either with
+status 0 or `EXIT_SUCCESS' to succeed, or with status `EXIT_FAILURE' to
+fail, but in practice it is portable to fail by exiting with status 1,
+and test programs that assume Posix can fail by exiting with status
+values from 1 through 255. Programs on SunOS 2.0 (1985) through 3.5.2
+(1988) incorrectly exited with zero status when `main' returned
+nonzero, but ancient systems like these are no longer of practical
+concern.
+
+ A program can also exit with status N by passing N to the `exit'
+function, and a program can fail by calling the `abort' function. If a
+program is specialized to just some platforms, it can fail by calling
+functions specific to those platforms, e.g., `_exit' (Posix) and
+`_Exit' (C99). However, like other functions, an exit function should
+be declared, typically by including a header. For example, if a C
+program calls `exit', it should include `stdlib.h' either directly or
+via the default includes (*note Default Includes::).
+
+ A program can fail due to undefined behavior such as dereferencing a
+null pointer, but this is not recommended as undefined behavior allows
+an implementation to do whatever it pleases and this includes exiting
+successfully.
+
+
+File: autoconf.info, Node: Manual Configuration, Next: Site Configuration, Prev: Portable C and C++, Up: Top
+
+14 Manual Configuration
+***********************
+
+A few kinds of features can't be guessed automatically by running test
+programs. For example, the details of the object-file format, or
+special options that need to be passed to the compiler or linker. You
+can check for such features using ad-hoc means, such as having
+`configure' check the output of the `uname' program, or looking for
+libraries that are unique to particular systems. However, Autoconf
+provides a uniform method for handling unguessable features.
+
+* Menu:
+
+* Specifying Target Triplets:: Specifying target triplets
+* Canonicalizing:: Getting the canonical system type
+* Using System Type:: What to do with the system type
+
+
+File: autoconf.info, Node: Specifying Target Triplets, Next: Canonicalizing, Up: Manual Configuration
+
+14.1 Specifying target triplets
+===============================
+
+Autoconf-generated `configure' scripts can make decisions based on a
+canonical name for the system type, or "target triplet", which has the
+form: `CPU-VENDOR-OS', where OS can be `SYSTEM' or `KERNEL-SYSTEM'
+
+ `configure' can usually guess the canonical name for the type of
+system it's running on. To do so it runs a script called
+`config.guess', which infers the name using the `uname' command or
+symbols predefined by the C preprocessor.
+
+ Alternately, the user can specify the system type with command line
+arguments to `configure' (*note System Type::. Doing so is necessary
+when cross-compiling. In the most complex case of cross-compiling,
+three system types are involved. The options to specify them are:
+
+`--build=BUILD-TYPE'
+ the type of system on which the package is being configured and
+ compiled. It defaults to the result of running `config.guess'.
+ Specifying a BUILD-TYPE that differs from HOST-TYPE enables
+ cross-compilation mode.
+
+`--host=HOST-TYPE'
+ the type of system on which the package runs. By default it is the
+ same as the build machine. Specifying a HOST-TYPE that differs
+ from BUILD-TYPE, when BUILD-TYPE was also explicitly specified,
+ enables cross-compilation mode.
+
+`--target=TARGET-TYPE'
+ the type of system for which any compiler tools in the package
+ produce code (rarely needed). By default, it is the same as host.
+
+ If you mean to override the result of `config.guess', use `--build',
+not `--host', since the latter enables cross-compilation. For
+historical reasons, whenever you specify `--host', be sure to specify
+`--build' too; this will be fixed in the future. So, to enter
+cross-compilation mode, use a command like this
+
+ ./configure --build=i686-pc-linux-gnu --host=m68k-coff
+
+Note that if you do not specify `--host', `configure' fails if it can't
+run the code generated by the specified compiler. For example,
+configuring as follows fails:
+
+ ./configure CC=m68k-coff-gcc
+
+ When cross-compiling, `configure' will warn about any tools
+(compilers, linkers, assemblers) whose name is not prefixed with the
+host type. This is an aid to users performing cross-compilation.
+Continuing the example above, if a cross-compiler named `cc' is used
+with a native `pkg-config', then libraries found by `pkg-config' will
+likely cause subtle build failures; but using the names `m68k-coff-cc'
+and `m68k-coff-pkg-config' avoids any confusion. Avoiding the warning
+is as simple as creating the correct symlinks naming the cross tools.
+
+ `configure' recognizes short aliases for many system types; for
+example, `decstation' can be used instead of `mips-dec-ultrix4.2'.
+`configure' runs a script called `config.sub' to canonicalize system
+type aliases.
+
+ This section deliberately omits the description of the obsolete
+interface; see *note Hosts and Cross-Compilation::.
+
+
+File: autoconf.info, Node: Canonicalizing, Next: Using System Type, Prev: Specifying Target Triplets, Up: Manual Configuration
+
+14.2 Getting the Canonical System Type
+======================================
+
+The following macros make the system type available to `configure'
+scripts.
+
+ The variables `build_alias', `host_alias', and `target_alias' are
+always exactly the arguments of `--build', `--host', and `--target'; in
+particular, they are left empty if the user did not use them, even if
+the corresponding `AC_CANONICAL' macro was run. Any configure script
+may use these variables anywhere. These are the variables that should
+be used when in interaction with the user.
+
+ If you need to recognize some special environments based on their
+system type, run the following macros to get canonical system names.
+These variables are not set before the macro call.
+
+ If you use these macros, you must distribute `config.guess' and
+`config.sub' along with your source code. *Note Output::, for
+information about the `AC_CONFIG_AUX_DIR' macro which you can use to
+control in which directory `configure' looks for those scripts.
+
+ -- Macro: AC_CANONICAL_BUILD
+ Compute the canonical build-system type variable, `build', and its
+ three individual parts `build_cpu', `build_vendor', and `build_os'.
+
+ If `--build' was specified, then `build' is the canonicalization
+ of `build_alias' by `config.sub', otherwise it is determined by
+ the shell script `config.guess'.
+
+ -- Macro: AC_CANONICAL_HOST
+ Compute the canonical host-system type variable, `host', and its
+ three individual parts `host_cpu', `host_vendor', and `host_os'.
+
+ If `--host' was specified, then `host' is the canonicalization of
+ `host_alias' by `config.sub', otherwise it defaults to `build'.
+
+ -- Macro: AC_CANONICAL_TARGET
+ Compute the canonical target-system type variable, `target', and
+ its three individual parts `target_cpu', `target_vendor', and
+ `target_os'.
+
+ If `--target' was specified, then `target' is the canonicalization
+ of `target_alias' by `config.sub', otherwise it defaults to `host'.
+
+ Note that there can be artifacts due to the backward compatibility
+code. *Note Hosts and Cross-Compilation::, for more.
+
+
+File: autoconf.info, Node: Using System Type, Prev: Canonicalizing, Up: Manual Configuration
+
+14.3 Using the System Type
+==========================
+
+In `configure.ac' the system type is generally used by one or more
+`case' statements to select system-specifics. Shell wildcards can be
+used to match a group of system types.
+
+ For example, an extra assembler code object file could be chosen,
+giving access to a CPU cycle counter register. `$(CYCLE_OBJ)' in the
+following would be used in a makefile to add the object to a program or
+library.
+
+ AS_CASE([$host],
+ [alpha*-*-*], [CYCLE_OBJ=rpcc.o],
+ [i?86-*-*], [CYCLE_OBJ=rdtsc.o],
+ [CYCLE_OBJ=""]
+ )
+ AC_SUBST([CYCLE_OBJ])
+
+ `AC_CONFIG_LINKS' (*note Configuration Links::) is another good way
+to select variant source files, for example optimized code for some
+CPUs. The configured CPU type doesn't always indicate exact CPU types,
+so some runtime capability checks may be necessary too.
+
+ case $host in
+ alpha*-*-*) AC_CONFIG_LINKS([dither.c:alpha/dither.c]) ;;
+ powerpc*-*-*) AC_CONFIG_LINKS([dither.c:powerpc/dither.c]) ;;
+ *-*-*) AC_CONFIG_LINKS([dither.c:generic/dither.c]) ;;
+ esac
+
+ The host system type can also be used to find cross-compilation tools
+with `AC_CHECK_TOOL' (*note Generic Programs::).
+
+ The above examples all show `$host', since this is where the code is
+going to run. Only rarely is it necessary to test `$build' (which is
+where the build is being done).
+
+ Whenever you're tempted to use `$host' it's worth considering
+whether some sort of probe would be better. New system types come along
+periodically or previously missing features are added. Well-written
+probes can adapt themselves to such things, but hard-coded lists of
+names can't. Here are some guidelines,
+
+ * Availability of libraries and library functions should always be
+ checked by probing.
+
+ * Variant behavior of system calls is best identified with runtime
+ tests if possible, but bug workarounds or obscure difficulties
+ might have to be driven from `$host'.
+
+ * Assembler code is inevitably highly CPU-specific and is best
+ selected according to `$host_cpu'.
+
+ * Assembler variations like underscore prefix on globals or ELF
+ versus COFF type directives are however best determined by
+ probing, perhaps even examining the compiler output.
+
+ `$target' is for use by a package creating a compiler or similar.
+For ordinary packages it's meaningless and should not be used. It
+indicates what the created compiler should generate code for, if it can
+cross-compile. `$target' generally selects various hard-coded CPU and
+system conventions, since usually the compiler or tools under
+construction themselves determine how the target works.
+
+
+File: autoconf.info, Node: Site Configuration, Next: Running configure Scripts, Prev: Manual Configuration, Up: Top
+
+15 Site Configuration
+*********************
+
+`configure' scripts support several kinds of local configuration
+decisions. There are ways for users to specify where external software
+packages are, include or exclude optional features, install programs
+under modified names, and set default values for `configure' options.
+
+* Menu:
+
+* Help Formatting:: Customizing `configure --help'
+* External Software:: Working with other optional software
+* Package Options:: Selecting optional features
+* Pretty Help Strings:: Formatting help string
+* Option Checking:: Controlling checking of `configure' options
+* Site Details:: Configuring site details
+* Transforming Names:: Changing program names when installing
+* Site Defaults:: Giving `configure' local defaults
+
+
+File: autoconf.info, Node: Help Formatting, Next: External Software, Up: Site Configuration
+
+15.1 Controlling Help Output
+============================
+
+Users consult `configure --help' to learn of configuration decisions
+specific to your package. By default, `configure' breaks this output
+into sections for each type of option; within each section, help
+strings appear in the order `configure.ac' defines them:
+
+ Optional Features:
+ ...
+ --enable-bar include bar
+
+ Optional Packages:
+ ...
+ --with-foo use foo
+
+ -- Macro: AC_PRESERVE_HELP_ORDER
+ Request an alternate `--help' format, in which options of all
+ types appear together, in the order defined. Call this macro
+ before any `AC_ARG_ENABLE' or `AC_ARG_WITH'.
+
+ Optional Features and Packages:
+ ...
+ --enable-bar include bar
+ --with-foo use foo
+
+
+
+File: autoconf.info, Node: External Software, Next: Package Options, Prev: Help Formatting, Up: Site Configuration
+
+15.2 Working With External Software
+===================================
+
+Some packages require, or can optionally use, other software packages
+that are already installed. The user can give `configure' command line
+options to specify which such external software to use. The options
+have one of these forms:
+
+ --with-PACKAGE[=ARG]
+ --without-PACKAGE
+
+ For example, `--with-gnu-ld' means work with the GNU linker instead
+of some other linker. `--with-x' means work with The X Window System.
+
+ The user can give an argument by following the package name with `='
+and the argument. Giving an argument of `no' is for packages that are
+used by default; it says to _not_ use the package. An argument that is
+neither `yes' nor `no' could include a name or number of a version of
+the other package, to specify more precisely which other package this
+program is supposed to work with. If no argument is given, it defaults
+to `yes'. `--without-PACKAGE' is equivalent to `--with-PACKAGE=no'.
+
+ Normally `configure' scripts complain about `--with-PACKAGE' options
+that they do not support. *Note Option Checking::, for details, and
+for how to override the defaults.
+
+ For each external software package that may be used, `configure.ac'
+should call `AC_ARG_WITH' to detect whether the `configure' user asked
+to use it. Whether each package is used or not by default, and which
+arguments are valid, is up to you.
+
+ -- Macro: AC_ARG_WITH (PACKAGE, HELP-STRING, [ACTION-IF-GIVEN],
+ [ACTION-IF-NOT-GIVEN])
+ If the user gave `configure' the option `--with-PACKAGE' or
+ `--without-PACKAGE', run shell commands ACTION-IF-GIVEN. If
+ neither option was given, run shell commands ACTION-IF-NOT-GIVEN.
+ The name PACKAGE indicates another software package that this
+ program should work with. It should consist only of alphanumeric
+ characters, dashes, plus signs, and dots.
+
+ The option's argument is available to the shell commands
+ ACTION-IF-GIVEN in the shell variable `withval', which is actually
+ just the value of the shell variable named `with_PACKAGE', with
+ any non-alphanumeric characters in PACKAGE changed into `_'. You
+ may use that variable instead, if you wish.
+
+ The argument HELP-STRING is a description of the option that looks
+ like this:
+ --with-readline support fancy command line editing
+
+ HELP-STRING may be more than one line long, if more detail is
+ needed. Just make sure the columns line up in `configure --help'.
+ Avoid tabs in the help string. The easiest way to provide the
+ proper leading whitespace is to format your HELP-STRING with the
+ macro `AS_HELP_STRING' (*note Pretty Help Strings::).
+
+ The following example shows how to use the `AC_ARG_WITH' macro in
+ a common situation. You want to let the user decide whether to
+ enable support for an external library (e.g., the readline
+ library); if the user specified neither `--with-readline' nor
+ `--without-readline', you want to enable support for readline only
+ if the library is available on the system.
+
+ AC_ARG_WITH([readline],
+ [AS_HELP_STRING([--with-readline],
+ [support fancy command line editing @<:@default=check@:>@])],
+ [],
+ [with_readline=check])
+
+ LIBREADLINE=
+ AS_IF([test "x$with_readline" != xno],
+ [AC_CHECK_LIB([readline], [main],
+ [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
+ AC_DEFINE([HAVE_LIBREADLINE], [1],
+ [Define if you have libreadline])
+ ],
+ [if test "x$with_readline" != xcheck; then
+ AC_MSG_FAILURE(
+ [--with-readline was given, but test for readline failed])
+ fi
+ ], -lncurses)])
+
+ The next example shows how to use `AC_ARG_WITH' to give the user
+ the possibility to enable support for the readline library, in
+ case it is still experimental and not well tested, and is
+ therefore disabled by default.
+
+ AC_ARG_WITH([readline],
+ [AS_HELP_STRING([--with-readline],
+ [enable experimental support for readline])],
+ [],
+ [with_readline=no])
+
+ LIBREADLINE=
+ AS_IF([test "x$with_readline" != xno],
+ [AC_CHECK_LIB([readline], [main],
+ [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
+ AC_DEFINE([HAVE_LIBREADLINE], [1],
+ [Define if you have libreadline])
+ ],
+ [AC_MSG_FAILURE(
+ [--with-readline was given, but test for readline failed])],
+ [-lncurses])])
+
+ The last example shows how to use `AC_ARG_WITH' to give the user
+ the possibility to disable support for the readline library, given
+ that it is an important feature and that it should be enabled by
+ default.
+
+ AC_ARG_WITH([readline],
+ [AS_HELP_STRING([--without-readline],
+ [disable support for readline])],
+ [],
+ [with_readline=yes])
+
+ LIBREADLINE=
+ AS_IF([test "x$with_readline" != xno],
+ [AC_CHECK_LIB([readline], [main],
+ [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
+ AC_DEFINE([HAVE_LIBREADLINE], [1],
+ [Define if you have libreadline])
+ ],
+ [AC_MSG_FAILURE(
+ [readline test failed (--without-readline to disable)])],
+ [-lncurses])])
+
+ These three examples can be easily adapted to the case where
+ `AC_ARG_ENABLE' should be preferred to `AC_ARG_WITH' (see *note
+ Package Options::).
+
+
+File: autoconf.info, Node: Package Options, Next: Pretty Help Strings, Prev: External Software, Up: Site Configuration
+
+15.3 Choosing Package Options
+=============================
+
+If a software package has optional compile-time features, the user can
+give `configure' command line options to specify whether to compile
+them. The options have one of these forms:
+
+ --enable-FEATURE[=ARG]
+ --disable-FEATURE
+
+ These options allow users to choose which optional features to build
+and install. `--enable-FEATURE' options should never make a feature
+behave differently or cause one feature to replace another. They
+should only cause parts of the program to be built rather than left out.
+
+ The user can give an argument by following the feature name with `='
+and the argument. Giving an argument of `no' requests that the feature
+_not_ be made available. A feature with an argument looks like
+`--enable-debug=stabs'. If no argument is given, it defaults to `yes'.
+`--disable-FEATURE' is equivalent to `--enable-FEATURE=no'.
+
+ Normally `configure' scripts complain about `--enable-PACKAGE'
+options that they do not support. *Note Option Checking::, for
+details, and for how to override the defaults.
+
+ For each optional feature, `configure.ac' should call
+`AC_ARG_ENABLE' to detect whether the `configure' user asked to include
+it. Whether each feature is included or not by default, and which
+arguments are valid, is up to you.
+
+ -- Macro: AC_ARG_ENABLE (FEATURE, HELP-STRING, [ACTION-IF-GIVEN],
+ [ACTION-IF-NOT-GIVEN])
+ If the user gave `configure' the option `--enable-FEATURE' or
+ `--disable-FEATURE', run shell commands ACTION-IF-GIVEN. If
+ neither option was given, run shell commands ACTION-IF-NOT-GIVEN.
+ The name FEATURE indicates an optional user-level facility. It
+ should consist only of alphanumeric characters, dashes, plus
+ signs, and dots.
+
+ The option's argument is available to the shell commands
+ ACTION-IF-GIVEN in the shell variable `enableval', which is
+ actually just the value of the shell variable named
+ `enable_FEATURE', with any non-alphanumeric characters in FEATURE
+ changed into `_'. You may use that variable instead, if you wish.
+ The HELP-STRING argument is like that of `AC_ARG_WITH' (*note
+ External Software::).
+
+ You should format your HELP-STRING with the macro `AS_HELP_STRING'
+ (*note Pretty Help Strings::).
+
+ See the examples suggested with the definition of `AC_ARG_WITH'
+ (*note External Software::) to get an idea of possible
+ applications of `AC_ARG_ENABLE'.
+
+
+File: autoconf.info, Node: Pretty Help Strings, Next: Option Checking, Prev: Package Options, Up: Site Configuration
+
+15.4 Making Your Help Strings Look Pretty
+=========================================
+
+Properly formatting the `help strings' which are used in `AC_ARG_WITH'
+(*note External Software::) and `AC_ARG_ENABLE' (*note Package
+Options::) can be challenging. Specifically, you want your own `help
+strings' to line up in the appropriate columns of `configure --help'
+just like the standard Autoconf `help strings' do. This is the purpose
+of the `AS_HELP_STRING' macro.
+
+ -- Macro: AS_HELP_STRING (LEFT-HAND-SIDE, RIGHT-HAND-SIDE
+ [INDENT-COLUMN = `26'], [WRAP-COLUMN = `79'])
+ Expands into a help string that looks pretty when the user executes
+ `configure --help'. It is typically used in `AC_ARG_WITH' (*note
+ External Software::) or `AC_ARG_ENABLE' (*note Package Options::).
+ The following example makes this clearer.
+
+ AC_ARG_WITH([foo],
+ [AS_HELP_STRING([--with-foo],
+ [use foo (default is no)])],
+ [use_foo=$withval],
+ [use_foo=no])
+
+ Then the last few lines of `configure --help' appear like this:
+
+ --enable and --with options recognized:
+ --with-foo use foo (default is no)
+
+ Macro expansion is performed on the first argument. However, the
+ second argument of `AS_HELP_STRING' is treated as a whitespace
+ separated list of text to be reformatted, and is not subject to
+ macro expansion. Since it is not expanded, it should not be
+ double quoted. *Note Autoconf Language::, for a more detailed
+ explanation.
+
+ The `AS_HELP_STRING' macro is particularly helpful when the
+ LEFT-HAND-SIDE and/or RIGHT-HAND-SIDE are composed of macro
+ arguments, as shown in the following example. Be aware that
+ LEFT-HAND-SIDE may not expand to unbalanced quotes, although
+ quadrigraphs can be used.
+
+ AC_DEFUN([MY_ARG_WITH],
+ [AC_ARG_WITH(m4_translit([[$1]], [_], [-]),
+ [AS_HELP_STRING([--with-m4_translit([$1], [_], [-])],
+ [use $1 (default is $2)])],
+ [use_[]$1=$withval],
+ [use_[]$1=$2])])
+ MY_ARG_WITH([a_b], [no])
+ Here, the last few lines of `configure --help' will include:
+
+ --enable and --with options recognized:
+ --with-a-b use a_b (default is no)
+
+ The parameters INDENT-COLUMN and WRAP-COLUMN were introduced in
+ Autoconf 2.62. Generally, they should not be specified; they exist
+ for fine-tuning of the wrapping.
+ AS_HELP_STRING([--option], [description of option])
+ => --option description of option
+ AS_HELP_STRING([--option], [description of option], [15], [30])
+ => --option description of
+ => option
+
+
+File: autoconf.info, Node: Option Checking, Next: Site Details, Prev: Pretty Help Strings, Up: Site Configuration
+
+15.5 Controlling Checking of `configure' Options
+================================================
+
+The `configure' script checks its command-line options against a list
+of known options, like `--help' or `--config-cache'. An unknown option
+ordinarily indicates a mistake by the user and `configure' halts with
+an error. However, by default unknown `--with-PACKAGE' and
+`--enable-FEATURE' options elicit only a warning, to support
+configuring entire source trees.
+
+ Source trees often contain multiple packages with a top-level
+`configure' script that uses the `AC_CONFIG_SUBDIRS' macro (*note
+Subdirectories::). Because the packages generally support different
+`--with-PACKAGE' and `--enable-FEATURE' options, the GNU Coding
+Standards say they must accept unrecognized options without halting.
+Even a warning message is undesirable here, so `AC_CONFIG_SUBDIRS'
+automatically disables the warnings.
+
+ This default behavior may be modified in two ways. First, the
+installer can invoke `configure --disable-option-checking' to disable
+these warnings, or invoke `configure --enable-option-checking=fatal'
+options to turn them into fatal errors, respectively. Second, the
+maintainer can use `AC_DISABLE_OPTION_CHECKING'.
+
+ -- Macro: AC_DISABLE_OPTION_CHECKING
+ By default, disable warnings related to any unrecognized
+ `--with-PACKAGE' or `--enable-FEATURE' options. This is implied
+ by `AC_CONFIG_SUBDIRS'.
+
+ The installer can override this behavior by passing
+ `--enable-option-checking' (enable warnings) or
+ `--enable-option-checking=fatal' (enable errors) to `configure'.
+
+
+File: autoconf.info, Node: Site Details, Next: Transforming Names, Prev: Option Checking, Up: Site Configuration
+
+15.6 Configuring Site Details
+=============================
+
+Some software packages require complex site-specific information. Some
+examples are host names to use for certain services, company names, and
+email addresses to contact. Since some configuration scripts generated
+by Metaconfig ask for such information interactively, people sometimes
+wonder how to get that information in Autoconf-generated configuration
+scripts, which aren't interactive.
+
+ Such site configuration information should be put in a file that is
+edited _only by users_, not by programs. The location of the file can
+either be based on the `prefix' variable, or be a standard location
+such as the user's home directory. It could even be specified by an
+environment variable. The programs should examine that file at
+runtime, rather than at compile time. Runtime configuration is more
+convenient for users and makes the configuration process simpler than
+getting the information while configuring. *Note Variables for
+Installation Directories: (standards)Directory Variables, for more
+information on where to put data files.
+
+
+File: autoconf.info, Node: Transforming Names, Next: Site Defaults, Prev: Site Details, Up: Site Configuration
+
+15.7 Transforming Program Names When Installing
+===============================================
+
+Autoconf supports changing the names of programs when installing them.
+In order to use these transformations, `configure.ac' must call the
+macro `AC_ARG_PROGRAM'.
+
+ -- Macro: AC_ARG_PROGRAM
+ Place in output variable `program_transform_name' a sequence of
+ `sed' commands for changing the names of installed programs.
+
+ If any of the options described below are given to `configure',
+ program names are transformed accordingly. Otherwise, if
+ `AC_CANONICAL_TARGET' has been called and a `--target' value is
+ given, the target type followed by a dash is used as a prefix.
+ Otherwise, no program name transformation is done.
+
+* Menu:
+
+* Transformation Options:: `configure' options to transform names
+* Transformation Examples:: Sample uses of transforming names
+* Transformation Rules:: Makefile uses of transforming names
+
+
+File: autoconf.info, Node: Transformation Options, Next: Transformation Examples, Up: Transforming Names
+
+15.7.1 Transformation Options
+-----------------------------
+
+You can specify name transformations by giving `configure' these
+command line options:
+
+`--program-prefix=PREFIX'
+ prepend PREFIX to the names;
+
+`--program-suffix=SUFFIX'
+ append SUFFIX to the names;
+
+`--program-transform-name=EXPRESSION'
+ perform `sed' substitution EXPRESSION on the names.
+
+
+File: autoconf.info, Node: Transformation Examples, Next: Transformation Rules, Prev: Transformation Options, Up: Transforming Names
+
+15.7.2 Transformation Examples
+------------------------------
+
+These transformations are useful with programs that can be part of a
+cross-compilation development environment. For example, a
+cross-assembler running on a Sun 4 configured with
+`--target=i960-vxworks' is normally installed as `i960-vxworks-as',
+rather than `as', which could be confused with a native Sun 4 assembler.
+
+ You can force a program name to begin with `g', if you don't want
+GNU programs installed on your system to shadow other programs with the
+same name. For example, if you configure GNU `diff' with
+`--program-prefix=g', then when you run `make install' it is installed
+as `/usr/local/bin/gdiff'.
+
+ As a more sophisticated example, you could use
+
+ --program-transform-name='s/^/g/; s/^gg/g/; s/^gless/less/'
+ to prepend `g' to most of the program names in a source tree,
+excepting those like `gdb' that already have one and those like `less'
+and `lesskey' that aren't GNU programs. (That is assuming that you
+have a source tree containing those programs that is set up to use this
+feature.)
+
+ One way to install multiple versions of some programs simultaneously
+is to append a version number to the name of one or both. For example,
+if you want to keep Autoconf version 1 around for awhile, you can
+configure Autoconf version 2 using `--program-suffix=2' to install the
+programs as `/usr/local/bin/autoconf2', `/usr/local/bin/autoheader2',
+etc. Nevertheless, pay attention that only the binaries are renamed,
+therefore you'd have problems with the library files which might
+overlap.
+
+
+File: autoconf.info, Node: Transformation Rules, Prev: Transformation Examples, Up: Transforming Names
+
+15.7.3 Transformation Rules
+---------------------------
+
+Here is how to use the variable `program_transform_name' in a
+`Makefile.in':
+
+ PROGRAMS = cp ls rm
+ transform = @program_transform_name@
+ install:
+ for p in $(PROGRAMS); do \
+ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p | \
+ sed '$(transform)'`; \
+ done
+
+ uninstall:
+ for p in $(PROGRAMS); do \
+ rm -f $(DESTDIR)$(bindir)/`echo $$p | sed '$(transform)'`; \
+ done
+
+ It is guaranteed that `program_transform_name' is never empty, and
+that there are no useless separators. Therefore you may safely embed
+`program_transform_name' within a sed program using `;':
+
+ transform = @program_transform_name@
+ transform_exe = s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/
+
+ Whether to do the transformations on documentation files (Texinfo or
+`man') is a tricky question; there seems to be no perfect answer, due
+to the several reasons for name transforming. Documentation is not
+usually particular to a specific architecture, and Texinfo files do not
+conflict with system documentation. But they might conflict with
+earlier versions of the same files, and `man' pages sometimes do
+conflict with system documentation. As a compromise, it is probably
+best to do name transformations on `man' pages but not on Texinfo
+manuals.
+
+
+File: autoconf.info, Node: Site Defaults, Prev: Transforming Names, Up: Site Configuration
+
+15.8 Setting Site Defaults
+==========================
+
+Autoconf-generated `configure' scripts allow your site to provide
+default values for some configuration values. You do this by creating
+site- and system-wide initialization files.
+
+ If the environment variable `CONFIG_SITE' is set, `configure' uses
+its value as the name of a shell script to read; it is recommended that
+this be an absolute file name. Otherwise, it reads the shell script
+`PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site'
+if it exists. Thus, settings in machine-specific files override those
+in machine-independent ones in case of conflict.
+
+ Site files can be arbitrary shell scripts, but only certain kinds of
+code are really appropriate to be in them. Because `configure' reads
+any cache file after it has read any site files, a site file can define
+a default cache file to be shared between all Autoconf-generated
+`configure' scripts run on that system (*note Cache Files::). If you
+set a default cache file in a site file, it is a good idea to also set
+the output variable `CC' in that site file, because the cache file is
+only valid for a particular compiler, but many systems have several
+available.
+
+ You can examine or override the value set by a command line option to
+`configure' in a site file; options set shell variables that have the
+same names as the options, with any dashes turned into underscores.
+The exceptions are that `--without-' and `--disable-' options are like
+giving the corresponding `--with-' or `--enable-' option and the value
+`no'. Thus, `--cache-file=localcache' sets the variable `cache_file'
+to the value `localcache'; `--enable-warnings=no' or
+`--disable-warnings' sets the variable `enable_warnings' to the value
+`no'; `--prefix=/usr' sets the variable `prefix' to the value `/usr';
+etc.
+
+ Site files are also good places to set default values for other
+output variables, such as `CFLAGS', if you need to give them non-default
+values: anything you would normally do, repetitively, on the command
+line. If you use non-default values for PREFIX or EXEC_PREFIX
+(wherever you locate the site file), you can set them in the site file
+if you specify it with the `CONFIG_SITE' environment variable.
+
+ You can set some cache values in the site file itself. Doing this is
+useful if you are cross-compiling, where it is impossible to check
+features that require running a test program. You could "prime the
+cache" by setting those values correctly for that system in
+`PREFIX/etc/config.site'. To find out the names of the cache variables
+you need to set, see the documentation of the respective Autoconf
+macro. If the variables or their semantics are undocumented, you may
+need to look for shell variables with `_cv_' in their names in the
+affected `configure' scripts, or in the Autoconf M4 source code for
+those macros; but in that case, their name or semantics may change in a
+future Autoconf version.
+
+ The cache file is careful to not override any variables set in the
+site files. Similarly, you should not override command-line options in
+the site files. Your code should check that variables such as `prefix'
+and `cache_file' have their default values (as set near the top of
+`configure') before changing them.
+
+ Here is a sample file `/usr/share/local/gnu/share/config.site'. The
+command `configure --prefix=/usr/share/local/gnu' would read this file
+(if `CONFIG_SITE' is not set to a different file).
+
+ # /usr/share/local/gnu/share/config.site for configure
+ #
+ # Change some defaults.
+ test "$prefix" = NONE && prefix=/usr/share/local/gnu
+ test "$exec_prefix" = NONE && exec_prefix=/usr/local/gnu
+ test "$sharedstatedir" = '${prefix}/com' && sharedstatedir=/var
+ test "$localstatedir" = '${prefix}/var' && localstatedir=/var
+
+ # Give Autoconf 2.x generated configure scripts a shared default
+ # cache file for feature test results, architecture-specific.
+ if test "$cache_file" = /dev/null; then
+ cache_file="$prefix/var/config.cache"
+ # A cache file is only valid for one C compiler.
+ CC=gcc
+ fi
+
+ Another use of `config.site' is for priming the directory variables
+in a manner consistent with the Filesystem Hierarchy Standard (FHS).
+Once the following file is installed at `/usr/share/config.site', a
+user can execute simply `./configure --prefix=/usr' to get all the
+directories chosen in the locations recommended by FHS.
+
+ # /usr/share/config.site for FHS defaults when installing below /usr,
+ # and the respective settings were not changed on the command line.
+ if test "$prefix" = /usr; then
+ test "$sysconfdir" = '${prefix}/etc' && sysconfdir=/etc
+ test "$sharedstatedir" = '${prefix}/com' && sharedstatedir=/var
+ test "$localstatedir" = '${prefix}/var' && localstatedir=/var
+ fi
+
+ Likewise, on platforms where 64-bit libraries are built by default,
+then installed in `/usr/local/lib64' instead of `/usr/local/lib', it is
+appropriate to install `/usr/local/share/config.site':
+
+ # /usr/local/share/config.site for platforms that prefer
+ # the directory /usr/local/lib64 over /usr/local/lib.
+ test "$libdir" = '${exec_prefix}/lib' && libdir='${exec_prefix}/lib64'
+
+
+File: autoconf.info, Node: Running configure Scripts, Next: config.status Invocation, Prev: Site Configuration, Up: Top
+
+16 Running `configure' Scripts
+******************************
+
+Below are instructions on how to configure a package that uses a
+`configure' script, suitable for inclusion as an `INSTALL' file in the
+package. A plain-text version of `INSTALL' which you may use comes
+with Autoconf.
+
+* Menu:
+
+* Basic Installation:: Instructions for typical cases
+* Compilers and Options:: Selecting compilers and optimization
+* Multiple Architectures:: Compiling for multiple architectures at once
+* Installation Names:: Installing in different directories
+* Optional Features:: Selecting optional features
+* Particular Systems:: Particular systems
+* System Type:: Specifying the system type
+* Sharing Defaults:: Setting site-wide defaults for `configure'
+* Defining Variables:: Specifying the compiler etc.
+* configure Invocation:: Changing how `configure' runs
+
+
+File: autoconf.info, Node: Basic Installation, Next: Compilers and Options, Up: Running configure Scripts
+
+16.1 Basic Installation
+=======================
+
+Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package. The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package. More recommendations for GNU
+packages can be found in *note Makefile Conventions:
+(standards)Makefile Conventions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+ It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring. Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'. You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+ The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system.
+
+ Running `configure' might take a while. While running, it prints
+ some messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package, generally using the just-built uninstalled binaries.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation. When installing into a prefix owned by root, it is
+ recommended that the package be configured and built as a regular
+ user, and only the `make install' phase executed with root
+ privileges.
+
+ 5. Optionally, type `make installcheck' to repeat any self-tests, but
+ this time using the binaries in their final installed location.
+ This target does not install anything. Running this target as a
+ regular user, particularly if the prior `make install' required
+ root privileges, verifies that the installation completed
+ correctly.
+
+ 6. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+ 7. Often, you can also type `make uninstall' to remove the installed
+ files again. In practice, not all packages have tested that
+ uninstallation works correctly, even though it is required by the
+ GNU Coding Standards.
+
+ 8. Some packages, particularly those that use Automake, provide `make
+ distcheck', which can by used by developers to test that all other
+ targets like `make install' and `make uninstall' work correctly.
+ This target is generally not run by end users.
+
+
+File: autoconf.info, Node: Compilers and Options, Next: Multiple Architectures, Prev: Basic Installation, Up: Running configure Scripts
+
+16.2 Compilers and Options
+==========================
+
+Some systems require unusual options for compilation or linking that the
+`configure' script does not know about. Run `./configure --help' for
+details on some of the pertinent environment variables.
+
+ You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+
+File: autoconf.info, Node: Multiple Architectures, Next: Installation Names, Prev: Compilers and Options, Up: Running configure Scripts
+
+16.3 Compiling For Multiple Architectures
+=========================================
+
+You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you can use GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'. This
+is known as a "VPATH" build.
+
+ With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory. After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+ On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor. Like
+this:
+
+ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CPP="gcc -E" CXXCPP="g++ -E"
+
+ This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+
+File: autoconf.info, Node: Installation Names, Next: Optional Features, Prev: Multiple Architectures, Up: Running configure Scripts
+
+16.4 Installation Names
+=======================
+
+By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc. You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them. In general, the
+default for these options is expressed in terms of `${prefix}', so that
+specifying just `--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+ The most portable way to affect installation locations is to pass the
+correct locations to `configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+`make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+ The first method involves providing an override variable for each
+affected directory. For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+`${prefix}'. Any directories that were specified during `configure',
+but not in terms of `${prefix}', must each be overridden at install
+time for the entire installation to be relocated. The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+ The second method involves providing the `DESTDIR' variable. For
+example, `make install DESTDIR=/alternate/directory' will prepend
+`/alternate/directory' before all installation names. The approach of
+`DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters. On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of `${prefix}'
+at `configure' time.
+
+
+File: autoconf.info, Node: Optional Features, Next: Particular Systems, Prev: Installation Names, Up: Running configure Scripts
+
+16.5 Optional Features
+======================
+
+If the package supports it, you can cause programs to be installed with
+an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+ Some packages offer the ability to configure how verbose the
+execution of `make' will be. For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with `make V=1'; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with `make V=0'.
+
+
+File: autoconf.info, Node: Particular Systems, Next: System Type, Prev: Optional Features, Up: Running configure Scripts
+
+16.6 Particular systems
+=======================
+
+On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is
+not installed, it is recommended to use the following options in order
+to use an ANSI C compiler:
+
+ ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+ HP-UX `make' updates targets which have the same time stamps as
+their prerequisites, which makes it generally unusable when shipped
+generated files such as `configure' are involved. Use GNU `make'
+instead.
+
+ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file. The option `-nodtk' can be used as
+a workaround. If GNU CC is not installed, it is therefore recommended
+to try
+
+ ./configure CC="cc"
+
+and if that doesn't work, try
+
+ ./configure CC="cc -nodtk"
+
+ On Solaris, don't put `/usr/ucb' early in your `PATH'. This
+directory contains several dysfunctional programs; working variants of
+these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
+in your `PATH', put it _after_ `/usr/bin'.
+
+ On Haiku, software installed for all users goes in `/boot/common',
+not `/usr/local'. It is recommended to use the following options:
+
+ ./configure --prefix=/boot/common
+
+
+File: autoconf.info, Node: System Type, Next: Sharing Defaults, Prev: Particular Systems, Up: Running configure Scripts
+
+16.7 Specifying the System Type
+===============================
+
+There may be some features `configure' cannot figure out automatically,
+but needs to determine by the type of machine the package will run on.
+Usually, assuming the package is built to be run on the _same_
+architectures, `configure' can figure that out, but if it prints a
+message saying it cannot guess the machine type, give it the
+`--build=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS
+ KERNEL-OS
+
+ See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+
+File: autoconf.info, Node: Sharing Defaults, Next: Defining Variables, Prev: System Type, Up: Running configure Scripts
+
+16.8 Sharing Defaults
+=====================
+
+If you want to set default values for `configure' scripts to share, you
+can create a site shell script called `config.site' that gives default
+values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+
+File: autoconf.info, Node: Defining Variables, Next: configure Invocation, Prev: Sharing Defaults, Up: Running configure Scripts
+
+16.9 Defining Variables
+=======================
+
+Variables not defined in a site shell script can be set in the
+environment passed to `configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf limitation. Until the limitation is lifted, you can use
+this workaround:
+
+ CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+
+File: autoconf.info, Node: configure Invocation, Prev: Defining Variables, Up: Running configure Scripts
+
+16.10 `configure' Invocation
+============================
+
+`configure' recognizes the following options to control how it operates.
+
+`--help'
+`-h'
+ Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+ Print a summary of the options unique to this package's
+ `configure', and exit. The `short' variant lists options used
+ only in the top level, while the `recursive' variant lists options
+ also present in any nested packages.
+
+`--version'
+`-V'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally `config.cache'. FILE defaults to `/dev/null' to
+ disable caching.
+
+`--config-cache'
+`-C'
+ Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+ Use DIR as the installation prefix. *note Installation Names::
+ for more details, including other options available for fine-tuning
+ the installation locations.
+
+`--no-create'
+`-n'
+ Run the configure checks, but stop before creating any output
+ files.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
+
+
+File: autoconf.info, Node: config.status Invocation, Next: Obsolete Constructs, Prev: Running configure Scripts, Up: Top
+
+17 config.status Invocation
+***************************
+
+The `configure' script creates a file named `config.status', which
+actually configures, "instantiates", the template files. It also
+records the configuration options that were specified when the package
+was last configured in case reconfiguring is needed.
+
+ Synopsis:
+ ./config.status [OPTION]... [TAG]...
+
+ It configures each TAG; if none are specified, all the templates are
+instantiated. A TAG refers to a file or other tag associated with a
+configuration action, as specified by an `AC_CONFIG_ITEMS' macro (*note
+Configuration Actions::). The files must be specified without their
+dependencies, as in
+
+ ./config.status foobar
+
+not
+
+ ./config.status foobar:foo.in:bar.in
+
+ The supported options are:
+
+`--help'
+`-h'
+ Print a summary of the command line options, the list of the
+ template files, and exit.
+
+`--version'
+`-V'
+ Print the version number of Autoconf and the configuration
+ settings, and exit.
+
+`--config'
+ Print the configuration settings in reusable way, quoted for the
+ shell, and exit. For example, for a debugging build that
+ otherwise reuses the configuration from a different build
+ directory BUILD-DIR of a package in SRC-DIR, you could use the
+ following:
+
+ args=`BUILD-DIR/config.status --config`
+ eval SRC-DIR/configure "$args" CFLAGS=-g --srcdir=SRC-DIR
+
+ Note that it may be necessary to override a `--srcdir' setting
+ that was saved in the configuration, if the arguments are used in a
+ different build directory.
+
+`--silent'
+`--quiet'
+`-q'
+ Do not print progress messages.
+
+`--debug'
+`-d'
+ Don't remove the temporary files.
+
+`--file=FILE[:TEMPLATE]'
+ Require that FILE be instantiated as if
+ `AC_CONFIG_FILES(FILE:TEMPLATE)' was used. Both FILE and TEMPLATE
+ may be `-' in which case the standard output and/or standard
+ input, respectively, is used. If a TEMPLATE file name is
+ relative, it is first looked for in the build tree, and then in
+ the source tree. *Note Configuration Actions::, for more details.
+
+ This option and the following ones provide one way for separately
+ distributed packages to share the values computed by `configure'.
+ Doing so can be useful if some of the packages need a superset of
+ the features that one of them, perhaps a common library, does.
+ These options allow a `config.status' file to create files other
+ than the ones that its `configure.ac' specifies, so it can be used
+ for a different package, or for extracting a subset of values.
+ For example,
+
+ echo '@CC@' | ./config.status --file=-
+
+ provides the value of `@CC@' on standard output.
+
+`--header=FILE[:TEMPLATE]'
+ Same as `--file' above, but with `AC_CONFIG_HEADERS'.
+
+`--recheck'
+ Ask `config.status' to update itself and exit (no instantiation).
+ This option is useful if you change `configure', so that the
+ results of some tests might be different from the previous run.
+ The `--recheck' option reruns `configure' with the same arguments
+ you used before, plus the `--no-create' option, which prevents
+ `configure' from running `config.status' and creating `Makefile'
+ and other files, and the `--no-recursion' option, which prevents
+ `configure' from running other `configure' scripts in
+ subdirectories. (This is so other Make rules can run
+ `config.status' when it changes; *note Automatic Remaking::, for
+ an example).
+
+ `config.status' checks several optional environment variables that
+can alter its behavior:
+
+ -- Variable: CONFIG_SHELL
+ The shell with which to run `configure'. It must be
+ Bourne-compatible, and the absolute name of the shell should be
+ passed. The default is a shell that supports `LINENO' if
+ available, and `/bin/sh' otherwise.
+
+ -- Variable: CONFIG_STATUS
+ The file name to use for the shell script that records the
+ configuration. The default is `./config.status'. This variable is
+ useful when one package uses parts of another and the `configure'
+ scripts shouldn't be merged because they are maintained separately.
+
+ You can use `./config.status' in your makefiles. For example, in
+the dependencies given above (*note Automatic Remaking::),
+`config.status' is run twice when `configure.ac' has changed. If that
+bothers you, you can make each run only regenerate the files for that
+rule:
+ config.h: stamp-h
+ stamp-h: config.h.in config.status
+ ./config.status config.h
+ echo > stamp-h
+
+ Makefile: Makefile.in config.status
+ ./config.status Makefile
+
+ The calling convention of `config.status' has changed; see *note
+Obsolete config.status Use::, for details.
+
+
+File: autoconf.info, Node: Obsolete Constructs, Next: Using Autotest, Prev: config.status Invocation, Up: Top
+
+18 Obsolete Constructs
+**********************
+
+Autoconf changes, and throughout the years some constructs have been
+obsoleted. Most of the changes involve the macros, but in some cases
+the tools themselves, or even some concepts, are now considered
+obsolete.
+
+ You may completely skip this chapter if you are new to Autoconf. Its
+intention is mainly to help maintainers updating their packages by
+understanding how to move to more modern constructs.
+
+* Menu:
+
+* Obsolete config.status Use:: Obsolete convention for `config.status'
+* acconfig Header:: Additional entries in `config.h.in'
+* autoupdate Invocation:: Automatic update of `configure.ac'
+* Obsolete Macros:: Backward compatibility macros
+* Autoconf 1:: Tips for upgrading your files
+* Autoconf 2.13:: Some fresher tips
+
+
+File: autoconf.info, Node: Obsolete config.status Use, Next: acconfig Header, Up: Obsolete Constructs
+
+18.1 Obsolete `config.status' Invocation
+========================================
+
+`config.status' now supports arguments to specify the files to
+instantiate; see *note config.status Invocation::, for more details.
+Before, environment variables had to be used.
+
+ -- Variable: CONFIG_COMMANDS
+ The tags of the commands to execute. The default is the arguments
+ given to `AC_OUTPUT' and `AC_CONFIG_COMMANDS' in `configure.ac'.
+
+ -- Variable: CONFIG_FILES
+ The files in which to perform `@VARIABLE@' substitutions. The
+ default is the arguments given to `AC_OUTPUT' and
+ `AC_CONFIG_FILES' in `configure.ac'.
+
+ -- Variable: CONFIG_HEADERS
+ The files in which to substitute C `#define' statements. The
+ default is the arguments given to `AC_CONFIG_HEADERS'; if that
+ macro was not called, `config.status' ignores this variable.
+
+ -- Variable: CONFIG_LINKS
+ The symbolic links to establish. The default is the arguments
+ given to `AC_CONFIG_LINKS'; if that macro was not called,
+ `config.status' ignores this variable.
+
+ In *note config.status Invocation::, using this old interface, the
+example would be:
+
+ config.h: stamp-h
+ stamp-h: config.h.in config.status
+ CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_FILES= \
+ CONFIG_HEADERS=config.h ./config.status
+ echo > stamp-h
+
+ Makefile: Makefile.in config.status
+ CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_HEADERS= \
+ CONFIG_FILES=Makefile ./config.status
+
+(If `configure.ac' does not call `AC_CONFIG_HEADERS', there is no need
+to set `CONFIG_HEADERS' in the `make' rules. Equally for
+`CONFIG_COMMANDS', etc.)
+
+
+File: autoconf.info, Node: acconfig Header, Next: autoupdate Invocation, Prev: Obsolete config.status Use, Up: Obsolete Constructs
+
+18.2 `acconfig.h'
+=================
+
+In order to produce `config.h.in', `autoheader' needs to build or to
+find templates for each symbol. Modern releases of Autoconf use
+`AH_VERBATIM' and `AH_TEMPLATE' (*note Autoheader Macros::), but in
+older releases a file, `acconfig.h', contained the list of needed
+templates. `autoheader' copied comments and `#define' and `#undef'
+statements from `acconfig.h' in the current directory, if present.
+This file used to be mandatory if you `AC_DEFINE' any additional
+symbols.
+
+ Modern releases of Autoconf also provide `AH_TOP' and `AH_BOTTOM' if
+you need to prepend/append some information to `config.h.in'. Ancient
+versions of Autoconf had a similar feature: if `./acconfig.h' contains
+the string `@TOP@', `autoheader' copies the lines before the line
+containing `@TOP@' into the top of the file that it generates.
+Similarly, if `./acconfig.h' contains the string `@BOTTOM@',
+`autoheader' copies the lines after that line to the end of the file it
+generates. Either or both of those strings may be omitted. An even
+older alternate way to produce the same effect in ancient versions of
+Autoconf is to create the files `FILE.top' (typically `config.h.top')
+and/or `FILE.bot' in the current directory. If they exist,
+`autoheader' copies them to the beginning and end, respectively, of its
+output.
+
+ In former versions of Autoconf, the files used in preparing a
+software package for distribution were:
+ configure.ac --. .------> autoconf* -----> configure
+ +---+
+ [aclocal.m4] --+ `---.
+ [acsite.m4] ---' |
+ +--> [autoheader*] -> [config.h.in]
+ [acconfig.h] ----. |
+ +-----'
+ [config.h.top] --+
+ [config.h.bot] --'
+
+ Using only the `AH_' macros, `configure.ac' should be
+self-contained, and should not depend upon `acconfig.h' etc.
+
+
+File: autoconf.info, Node: autoupdate Invocation, Next: Obsolete Macros, Prev: acconfig Header, Up: Obsolete Constructs
+
+18.3 Using `autoupdate' to Modernize `configure.ac'
+===================================================
+
+The `autoupdate' program updates a `configure.ac' file that calls
+Autoconf macros by their old names to use the current macro names. In
+version 2 of Autoconf, most of the macros were renamed to use a more
+uniform and descriptive naming scheme. *Note Macro Names::, for a
+description of the new scheme. Although the old names still work
+(*note Obsolete Macros::, for a list of the old macros and the
+corresponding new names), you can make your `configure.ac' files more
+readable and make it easier to use the current Autoconf documentation
+if you update them to use the new macro names.
+
+ If given no arguments, `autoupdate' updates `configure.ac', backing
+up the original version with the suffix `~' (or the value of the
+environment variable `SIMPLE_BACKUP_SUFFIX', if that is set). If you
+give `autoupdate' an argument, it reads that file instead of
+`configure.ac' and writes the updated file to the standard output.
+
+`autoupdate' accepts the following options:
+
+`--help'
+`-h'
+ Print a summary of the command line options and exit.
+
+`--version'
+`-V'
+ Print the version number of Autoconf and exit.
+
+`--verbose'
+`-v'
+ Report processing steps.
+
+`--debug'
+`-d'
+ Don't remove the temporary files.
+
+`--force'
+`-f'
+ Force the update even if the file has not changed. Disregard the
+ cache.
+
+`--include=DIR'
+`-I DIR'
+ Also look for input files in DIR. Multiple invocations accumulate.
+ Directories are browsed from last to first.
+
+`--prepend-include=DIR'
+`-B DIR'
+ Prepend directory DIR to the search path. This is used to include
+ the language-specific files before any third-party macros.
+
+
+File: autoconf.info, Node: Obsolete Macros, Next: Autoconf 1, Prev: autoupdate Invocation, Up: Obsolete Constructs
+
+18.4 Obsolete Macros
+====================
+
+Several macros are obsoleted in Autoconf, for various reasons (typically
+they failed to quote properly, couldn't be extended for more recent
+issues, etc.). They are still supported, but deprecated: their use
+should be avoided.
+
+ During the jump from Autoconf version 1 to version 2, most of the
+macros were renamed to use a more uniform and descriptive naming scheme,
+but their signature did not change. *Note Macro Names::, for a
+description of the new naming scheme. Below, if there is just the
+mapping from old names to new names for these macros, the reader is
+invited to refer to the definition of the new macro for the signature
+and the description.
+
+ -- Macro: AC_AIX
+ This macro is a platform-specific subset of
+ `AC_USE_SYSTEM_EXTENSIONS' (*note AC_USE_SYSTEM_EXTENSIONS::).
+
+ -- Macro: AC_ALLOCA
+ Replaced by `AC_FUNC_ALLOCA' (*note AC_FUNC_ALLOCA::).
+
+ -- Macro: AC_ARG_ARRAY
+ Removed because of limited usefulness.
+
+ -- Macro: AC_C_CROSS
+ This macro is obsolete; it does nothing.
+
+ -- Macro: AC_C_LONG_DOUBLE
+ If the C compiler supports a working `long double' type with more
+ range or precision than the `double' type, define
+ `HAVE_LONG_DOUBLE'.
+
+ You should use `AC_TYPE_LONG_DOUBLE' or
+ `AC_TYPE_LONG_DOUBLE_WIDER' instead. *Note Particular Types::.
+
+ -- Macro: AC_CANONICAL_SYSTEM
+ Determine the system type and set output variables to the names of
+ the canonical system types. *Note Canonicalizing::, for details
+ about the variables this macro sets.
+
+ The user is encouraged to use either `AC_CANONICAL_BUILD', or
+ `AC_CANONICAL_HOST', or `AC_CANONICAL_TARGET', depending on the
+ needs. Using `AC_CANONICAL_TARGET' is enough to run the two other
+ macros (*note Canonicalizing::).
+
+ -- Macro: AC_CHAR_UNSIGNED
+ Replaced by `AC_C_CHAR_UNSIGNED' (*note AC_C_CHAR_UNSIGNED::).
+
+ -- Macro: AC_CHECK_TYPE (TYPE, DEFAULT)
+ Autoconf, up to 2.13, used to provide this version of
+ `AC_CHECK_TYPE', deprecated because of its flaws. First, although
+ it is a member of the `CHECK' clan, it does more than just
+ checking. Secondly, missing types are defined using `#define',
+ not `typedef', and this can lead to problems in the case of
+ pointer types.
+
+ This use of `AC_CHECK_TYPE' is obsolete and discouraged; see *note
+ Generic Types::, for the description of the current macro.
+
+ If the type TYPE is not defined, define it to be the C (or C++)
+ builtin type DEFAULT, e.g., `short int' or `unsigned int'.
+
+ This macro is equivalent to:
+
+ AC_CHECK_TYPE([TYPE], [],
+ [AC_DEFINE_UNQUOTED([TYPE], [DEFAULT],
+ [Define to `DEFAULT'
+ if <sys/types.h> does not define.])])
+
+ In order to keep backward compatibility, the two versions of
+ `AC_CHECK_TYPE' are implemented, selected using these heuristics:
+
+ 1. If there are three or four arguments, the modern version is
+ used.
+
+ 2. If the second argument appears to be a C or C++ type, then the
+ obsolete version is used. This happens if the argument is a
+ C or C++ _builtin_ type or a C identifier ending in `_t',
+ optionally followed by one of `[(* ' and then by a string of
+ zero or more characters taken from the set `[]()* _a-zA-Z0-9'.
+
+ 3. If the second argument is spelled with the alphabet of valid
+ C and C++ types, the user is warned and the modern version is
+ used.
+
+ 4. Otherwise, the modern version is used.
+
+ You are encouraged either to use a valid builtin type, or to use
+ the equivalent modern code (see above), or better yet, to use
+ `AC_CHECK_TYPES' together with
+
+ #ifndef HAVE_LOFF_T
+ typedef loff_t off_t;
+ #endif
+
+ -- Macro: AC_CHECKING (FEATURE-DESCRIPTION)
+ Same as
+
+ AC_MSG_NOTICE([checking FEATURE-DESCRIPTION...]
+
+ *Note AC_MSG_NOTICE::.
+
+ -- Macro: AC_COMPILE_CHECK (ECHO-TEXT, INCLUDES, FUNCTION-BODY,
+ ACTION-IF-TRUE, [ACTION-IF-FALSE])
+ This is an obsolete version of `AC_TRY_COMPILE' itself replaced by
+ `AC_COMPILE_IFELSE' (*note Running the Compiler::), with the
+ addition that it prints `checking for ECHO-TEXT' to the standard
+ output first, if ECHO-TEXT is non-empty. Use `AC_MSG_CHECKING'
+ and `AC_MSG_RESULT' instead to print messages (*note Printing
+ Messages::).
+
+ -- Macro: AC_CONST
+ Replaced by `AC_C_CONST' (*note AC_C_CONST::).
+
+ -- Macro: AC_CROSS_CHECK
+ Same as `AC_C_CROSS', which is obsolete too, and does nothing
+ `:-)'.
+
+ -- Macro: AC_CYGWIN
+ Check for the Cygwin environment in which case the shell variable
+ `CYGWIN' is set to `yes'. Don't use this macro, the dignified
+ means to check the nature of the host is using `AC_CANONICAL_HOST'
+ (*note Canonicalizing::). As a matter of fact this macro is
+ defined as:
+
+ AC_REQUIRE([AC_CANONICAL_HOST])[]dnl
+ case $host_os in
+ *cygwin* ) CYGWIN=yes;;
+ * ) CYGWIN=no;;
+ esac
+
+ Beware that the variable `CYGWIN' has a special meaning when
+ running Cygwin, and should not be changed. That's yet another
+ reason not to use this macro.
+
+ -- Macro: AC_DECL_SYS_SIGLIST
+ Same as:
+
+ AC_CHECK_DECLS([sys_siglist], [], [],
+ [#include <signal.h>
+ /* NetBSD declares sys_siglist in unistd.h. */
+ #ifdef HAVE_UNISTD_H
+ # include <unistd.h>
+ #endif
+ ])
+
+ *Note AC_CHECK_DECLS::.
+
+ -- Macro: AC_DECL_YYTEXT
+ Does nothing, now integrated in `AC_PROG_LEX' (*note
+ AC_PROG_LEX::).
+
+ -- Macro: AC_DIR_HEADER
+ Like calling `AC_FUNC_CLOSEDIR_VOID' (*note
+ AC_FUNC_CLOSEDIR_VOID::) and `AC_HEADER_DIRENT' (*note
+ AC_HEADER_DIRENT::), but defines a different set of C preprocessor
+ macros to indicate which header file is found:
+
+ Header Old Symbol New Symbol
+ `dirent.h' `DIRENT' `HAVE_DIRENT_H'
+ `sys/ndir.h' `SYSNDIR' `HAVE_SYS_NDIR_H'
+ `sys/dir.h' `SYSDIR' `HAVE_SYS_DIR_H'
+ `ndir.h' `NDIR' `HAVE_NDIR_H'
+
+ -- Macro: AC_DYNIX_SEQ
+ If on DYNIX/ptx, add `-lseq' to output variable `LIBS'. This
+ macro used to be defined as
+
+ AC_CHECK_LIB([seq], [getmntent], [LIBS="-lseq $LIBS"])
+
+ now it is just `AC_FUNC_GETMNTENT' (*note AC_FUNC_GETMNTENT::).
+
+ -- Macro: AC_EXEEXT
+ Defined the output variable `EXEEXT' based on the output of the
+ compiler, which is now done automatically. Typically set to empty
+ string if Posix and `.exe' if a DOS variant.
+
+ -- Macro: AC_EMXOS2
+ Similar to `AC_CYGWIN' but checks for the EMX environment on OS/2
+ and sets `EMXOS2'. Don't use this macro, the dignified means to
+ check the nature of the host is using `AC_CANONICAL_HOST' (*note
+ Canonicalizing::).
+
+ -- Macro: AC_ENABLE (FEATURE, ACTION-IF-GIVEN, [ACTION-IF-NOT-GIVEN])
+ This is an obsolete version of `AC_ARG_ENABLE' that does not
+ support providing a help string (*note AC_ARG_ENABLE::).
+
+ -- Macro: AC_ERROR
+ Replaced by `AC_MSG_ERROR' (*note AC_MSG_ERROR::).
+
+ -- Macro: AC_FIND_X
+ Replaced by `AC_PATH_X' (*note AC_PATH_X::).
+
+ -- Macro: AC_FIND_XTRA
+ Replaced by `AC_PATH_XTRA' (*note AC_PATH_XTRA::).
+
+ -- Macro: AC_FOREACH
+ Replaced by `m4_foreach_w' (*note m4_foreach_w::).
+
+ -- Macro: AC_FUNC_CHECK
+ Replaced by `AC_CHECK_FUNC' (*note AC_CHECK_FUNC::).
+
+ -- Macro: AC_FUNC_SETVBUF_REVERSED
+ Do nothing. Formerly, this macro checked whether `setvbuf' takes
+ the buffering type as its second argument and the buffer pointer
+ as the third, instead of the other way around, and defined
+ `SETVBUF_REVERSED'. However, the last systems to have the problem
+ were those based on SVR2, which became obsolete in 1987, and the
+ macro is no longer needed.
+
+ -- Macro: AC_FUNC_WAIT3
+ If `wait3' is found and fills in the contents of its third argument
+ (a `struct rusage *'), which HP-UX does not do, define
+ `HAVE_WAIT3'.
+
+ These days portable programs should use `waitpid', not `wait3', as
+ `wait3' has been removed from Posix.
+
+ -- Macro: AC_GCC_TRADITIONAL
+ Replaced by `AC_PROG_GCC_TRADITIONAL' (*note
+ AC_PROG_GCC_TRADITIONAL::).
+
+ -- Macro: AC_GETGROUPS_T
+ Replaced by `AC_TYPE_GETGROUPS' (*note AC_TYPE_GETGROUPS::).
+
+ -- Macro: AC_GETLOADAVG
+ Replaced by `AC_FUNC_GETLOADAVG' (*note AC_FUNC_GETLOADAVG::).
+
+ -- Macro: AC_GNU_SOURCE
+ This macro is a platform-specific subset of
+ `AC_USE_SYSTEM_EXTENSIONS' (*note AC_USE_SYSTEM_EXTENSIONS::).
+
+ -- Macro: AC_HAVE_FUNCS
+ Replaced by `AC_CHECK_FUNCS' (*note AC_CHECK_FUNCS::).
+
+ -- Macro: AC_HAVE_HEADERS
+ Replaced by `AC_CHECK_HEADERS' (*note AC_CHECK_HEADERS::).
+
+ -- Macro: AC_HAVE_LIBRARY (LIBRARY, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND], [OTHER-LIBRARIES])
+ This macro is equivalent to calling `AC_CHECK_LIB' with a FUNCTION
+ argument of `main'. In addition, LIBRARY can be written as any of
+ `foo', `-lfoo', or `libfoo.a'. In all of those cases, the
+ compiler is passed `-lfoo'. However, LIBRARY cannot be a shell
+ variable; it must be a literal name. *Note AC_CHECK_LIB::.
+
+ -- Macro: AC_HAVE_POUNDBANG
+ Replaced by `AC_SYS_INTERPRETER' (*note AC_SYS_INTERPRETER::).
+
+ -- Macro: AC_HEADER_CHECK
+ Replaced by `AC_CHECK_HEADER' (*note AC_CHECK_HEADER::).
+
+ -- Macro: AC_HEADER_EGREP
+ Replaced by `AC_EGREP_HEADER' (*note AC_EGREP_HEADER::).
+
+ -- Macro: AC_HELP_STRING
+ Replaced by `AS_HELP_STRING' (*note AS_HELP_STRING::).
+
+ -- Macro: AC_INIT (UNIQUE-FILE-IN-SOURCE-DIR)
+ Formerly `AC_INIT' used to have a single argument, and was
+ equivalent to:
+
+ AC_INIT
+ AC_CONFIG_SRCDIR(UNIQUE-FILE-IN-SOURCE-DIR)
+ See *note AC_INIT:: and *note AC_CONFIG_SRCDIR::.
+
+ -- Macro: AC_INLINE
+ Replaced by `AC_C_INLINE' (*note AC_C_INLINE::).
+
+ -- Macro: AC_INT_16_BITS
+ If the C type `int' is 16 bits wide, define `INT_16_BITS'. Use
+ `AC_CHECK_SIZEOF(int)' instead (*note AC_CHECK_SIZEOF::).
+
+ -- Macro: AC_IRIX_SUN
+ If on IRIX (Silicon Graphics Unix), add `-lsun' to output `LIBS'.
+ If you were using it to get `getmntent', use `AC_FUNC_GETMNTENT'
+ instead. If you used it for the NIS versions of the password and
+ group functions, use `AC_CHECK_LIB(sun, getpwnam)'. Up to
+ Autoconf 2.13, it used to be
+
+ AC_CHECK_LIB([sun], [getmntent], [LIBS="-lsun $LIBS"])
+
+ now it is defined as
+
+ AC_FUNC_GETMNTENT
+ AC_CHECK_LIB([sun], [getpwnam])
+
+ See *note AC_FUNC_GETMNTENT:: and *note AC_CHECK_LIB::.
+
+ -- Macro: AC_ISC_POSIX
+ This macro adds `-lcposix' to output variable `LIBS' if necessary
+ for Posix facilities. Sun dropped support for the obsolete
+ INTERACTIVE Systems Corporation Unix on 2006-07-23. New programs
+ need not use this macro. It is implemented as
+ `AC_SEARCH_LIBS([strerror], [cposix])' (*note AC_SEARCH_LIBS::).
+
+ -- Macro: AC_LANG_C
+ Same as `AC_LANG([C])' (*note AC_LANG::).
+
+ -- Macro: AC_LANG_CPLUSPLUS
+ Same as `AC_LANG([C++])' (*note AC_LANG::).
+
+ -- Macro: AC_LANG_FORTRAN77
+ Same as `AC_LANG([Fortran 77])' (*note AC_LANG::).
+
+ -- Macro: AC_LANG_RESTORE
+ Select the LANGUAGE that is saved on the top of the stack, as set
+ by `AC_LANG_SAVE', remove it from the stack, and call
+ `AC_LANG(LANGUAGE)'. *Note Language Choice::, for the preferred
+ way to change languages.
+
+ -- Macro: AC_LANG_SAVE
+ Remember the current language (as set by `AC_LANG') on a stack.
+ The current language does not change. `AC_LANG_PUSH' is preferred
+ (*note AC_LANG_PUSH::).
+
+ -- Macro: AC_LINK_FILES (SOURCE..., DEST...)
+ This is an obsolete version of `AC_CONFIG_LINKS' (*note
+ AC_CONFIG_LINKS::. An updated version of:
+
+ AC_LINK_FILES(config/$machine.h config/$obj_format.h,
+ host.h object.h)
+
+ is:
+
+ AC_CONFIG_LINKS([host.h:config/$machine.h
+ object.h:config/$obj_format.h])
+
+ -- Macro: AC_LN_S
+ Replaced by `AC_PROG_LN_S' (*note AC_PROG_LN_S::).
+
+ -- Macro: AC_LONG_64_BITS
+ Define `LONG_64_BITS' if the C type `long int' is 64 bits wide.
+ Use the generic macro `AC_CHECK_SIZEOF([long int])' instead (*note
+ AC_CHECK_SIZEOF::).
+
+ -- Macro: AC_LONG_DOUBLE
+ If the C compiler supports a working `long double' type with more
+ range or precision than the `double' type, define
+ `HAVE_LONG_DOUBLE'.
+
+ You should use `AC_TYPE_LONG_DOUBLE' or
+ `AC_TYPE_LONG_DOUBLE_WIDER' instead. *Note Particular Types::.
+
+ -- Macro: AC_LONG_FILE_NAMES
+ Replaced by
+ AC_SYS_LONG_FILE_NAMES
+ *Note AC_SYS_LONG_FILE_NAMES::.
+
+ -- Macro: AC_MAJOR_HEADER
+ Replaced by `AC_HEADER_MAJOR' (*note AC_HEADER_MAJOR::).
+
+ -- Macro: AC_MEMORY_H
+ Used to define `NEED_MEMORY_H' if the `mem' functions were defined
+ in `memory.h'. Today it is equivalent to
+ `AC_CHECK_HEADERS([memory.h])' (*note AC_CHECK_HEADERS::). Adjust
+ your code to depend upon `HAVE_MEMORY_H', not `NEED_MEMORY_H'; see
+ *note Standard Symbols::.
+
+ -- Macro: AC_MINGW32
+ Similar to `AC_CYGWIN' but checks for the MinGW compiler
+ environment and sets `MINGW32'. Don't use this macro, the
+ dignified means to check the nature of the host is using
+ `AC_CANONICAL_HOST' (*note Canonicalizing::).
+
+ -- Macro: AC_MINIX
+ This macro is a platform-specific subset of
+ `AC_USE_SYSTEM_EXTENSIONS' (*note AC_USE_SYSTEM_EXTENSIONS::).
+
+ -- Macro: AC_MINUS_C_MINUS_O
+ Replaced by `AC_PROG_CC_C_O' (*note AC_PROG_CC_C_O::).
+
+ -- Macro: AC_MMAP
+ Replaced by `AC_FUNC_MMAP' (*note AC_FUNC_MMAP::).
+
+ -- Macro: AC_MODE_T
+ Replaced by `AC_TYPE_MODE_T' (*note AC_TYPE_MODE_T::).
+
+ -- Macro: AC_OBJEXT
+ Defined the output variable `OBJEXT' based on the output of the
+ compiler, after .c files have been excluded. Typically set to `o'
+ if Posix, `obj' if a DOS variant. Now the compiler checking
+ macros handle this automatically.
+
+ -- Macro: AC_OBSOLETE (THIS-MACRO-NAME, [SUGGESTION])
+ Make M4 print a message to the standard error output warning that
+ THIS-MACRO-NAME is obsolete, and giving the file and line number
+ where it was called. THIS-MACRO-NAME should be the name of the
+ macro that is calling `AC_OBSOLETE'. If SUGGESTION is given, it
+ is printed at the end of the warning message; for example, it can
+ be a suggestion for what to use instead of THIS-MACRO-NAME.
+
+ For instance
+
+ AC_OBSOLETE([$0], [; use AC_CHECK_HEADERS(unistd.h) instead])dnl
+
+ You are encouraged to use `AU_DEFUN' instead, since it gives better
+ services to the user (*note AU_DEFUN::).
+
+ -- Macro: AC_OFF_T
+ Replaced by `AC_TYPE_OFF_T' (*note AC_TYPE_OFF_T::).
+
+ -- Macro: AC_OUTPUT ([FILE]..., [EXTRA-CMDS], [INIT-CMDS])
+ The use of `AC_OUTPUT' with arguments is deprecated. This
+ obsoleted interface is equivalent to:
+
+ AC_CONFIG_FILES(FILE...)
+ AC_CONFIG_COMMANDS([default],
+ EXTRA-CMDS, INIT-CMDS)
+ AC_OUTPUT
+
+ See *note AC_CONFIG_FILES::, *note AC_CONFIG_COMMANDS::, and *note
+ AC_OUTPUT::.
+
+ -- Macro: AC_OUTPUT_COMMANDS (EXTRA-CMDS, [INIT-CMDS])
+ Specify additional shell commands to run at the end of
+ `config.status', and shell commands to initialize any variables
+ from `configure'. This macro may be called multiple times. It is
+ obsolete, replaced by `AC_CONFIG_COMMANDS' (*note
+ AC_CONFIG_COMMANDS::).
+
+ Here is an unrealistic example:
+
+ fubar=27
+ AC_OUTPUT_COMMANDS([echo this is extra $fubar, and so on.],
+ [fubar=$fubar])
+ AC_OUTPUT_COMMANDS([echo this is another, extra, bit],
+ [echo init bit])
+
+ Aside from the fact that `AC_CONFIG_COMMANDS' requires an
+ additional key, an important difference is that
+ `AC_OUTPUT_COMMANDS' is quoting its arguments twice, unlike
+ `AC_CONFIG_COMMANDS'. This means that `AC_CONFIG_COMMANDS' can
+ safely be given macro calls as arguments:
+
+ AC_CONFIG_COMMANDS(foo, [my_FOO()])
+
+ Conversely, where one level of quoting was enough for literal
+ strings with `AC_OUTPUT_COMMANDS', you need two with
+ `AC_CONFIG_COMMANDS'. The following lines are equivalent:
+
+ AC_OUTPUT_COMMANDS([echo "Square brackets: []"])
+ AC_CONFIG_COMMANDS([default], [[echo "Square brackets: []"]])
+
+ -- Macro: AC_PID_T
+ Replaced by `AC_TYPE_PID_T' (*note AC_TYPE_PID_T::).
+
+ -- Macro: AC_PREFIX
+ Replaced by `AC_PREFIX_PROGRAM' (*note AC_PREFIX_PROGRAM::).
+
+ -- Macro: AC_PROGRAMS_CHECK
+ Replaced by `AC_CHECK_PROGS' (*note AC_CHECK_PROGS::).
+
+ -- Macro: AC_PROGRAMS_PATH
+ Replaced by `AC_PATH_PROGS' (*note AC_PATH_PROGS::).
+
+ -- Macro: AC_PROGRAM_CHECK
+ Replaced by `AC_CHECK_PROG' (*note AC_CHECK_PROG::).
+
+ -- Macro: AC_PROGRAM_EGREP
+ Replaced by `AC_EGREP_CPP' (*note AC_EGREP_CPP::).
+
+ -- Macro: AC_PROGRAM_PATH
+ Replaced by `AC_PATH_PROG' (*note AC_PATH_PROG::).
+
+ -- Macro: AC_REMOTE_TAPE
+ Removed because of limited usefulness.
+
+ -- Macro: AC_RESTARTABLE_SYSCALLS
+ This macro was renamed `AC_SYS_RESTARTABLE_SYSCALLS'. However,
+ these days portable programs should use `sigaction' with
+ `SA_RESTART' if they want restartable system calls. They should
+ not rely on `HAVE_RESTARTABLE_SYSCALLS', since nowadays whether a
+ system call is restartable is a dynamic issue, not a
+ configuration-time issue.
+
+ -- Macro: AC_RETSIGTYPE
+ Replaced by `AC_TYPE_SIGNAL' (*note AC_TYPE_SIGNAL::), which itself
+ is obsolete when assuming C89 or better.
+
+ -- Macro: AC_RSH
+ Removed because of limited usefulness.
+
+ -- Macro: AC_SCO_INTL
+ If on SCO Unix, add `-lintl' to output variable `LIBS'. This
+ macro used to do this:
+
+ AC_CHECK_LIB([intl], [strftime], [LIBS="-lintl $LIBS"])
+
+ Now it just calls `AC_FUNC_STRFTIME' instead (*note
+ AC_FUNC_STRFTIME::).
+
+ -- Macro: AC_SETVBUF_REVERSED
+ Replaced by
+ AC_FUNC_SETVBUF_REVERSED
+ *Note AC_FUNC_SETVBUF_REVERSED::.
+
+ -- Macro: AC_SET_MAKE
+ Replaced by `AC_PROG_MAKE_SET' (*note AC_PROG_MAKE_SET::).
+
+ -- Macro: AC_SIZEOF_TYPE
+ Replaced by `AC_CHECK_SIZEOF' (*note AC_CHECK_SIZEOF::).
+
+ -- Macro: AC_SIZE_T
+ Replaced by `AC_TYPE_SIZE_T' (*note AC_TYPE_SIZE_T::).
+
+ -- Macro: AC_STAT_MACROS_BROKEN
+ Replaced by `AC_HEADER_STAT' (*note AC_HEADER_STAT::).
+
+ -- Macro: AC_STDC_HEADERS
+ Replaced by `AC_HEADER_STDC' (*note AC_HEADER_STDC::).
+
+ -- Macro: AC_STRCOLL
+ Replaced by `AC_FUNC_STRCOLL' (*note AC_FUNC_STRCOLL::).
+
+ -- Macro: AC_STRUCT_ST_BLKSIZE
+ If `struct stat' contains an `st_blksize' member, define
+ `HAVE_STRUCT_STAT_ST_BLKSIZE'. The former name, `HAVE_ST_BLKSIZE'
+ is to be avoided, as its support will cease in the future. This
+ macro is obsoleted, and should be replaced by
+
+ AC_CHECK_MEMBERS([struct stat.st_blksize])
+ *Note AC_CHECK_MEMBERS::.
+
+ -- Macro: AC_STRUCT_ST_RDEV
+ If `struct stat' contains an `st_rdev' member, define
+ `HAVE_STRUCT_STAT_ST_RDEV'. The former name for this macro,
+ `HAVE_ST_RDEV', is to be avoided as it will cease to be supported
+ in the future. Actually, even the new macro is obsolete and
+ should be replaced by:
+ AC_CHECK_MEMBERS([struct stat.st_rdev])
+ *Note AC_CHECK_MEMBERS::.
+
+ -- Macro: AC_ST_BLKSIZE
+ Replaced by `AC_CHECK_MEMBERS' (*note AC_CHECK_MEMBERS::).
+
+ -- Macro: AC_ST_BLOCKS
+ Replaced by `AC_STRUCT_ST_BLOCKS' (*note AC_STRUCT_ST_BLOCKS::).
+
+ -- Macro: AC_ST_RDEV
+ Replaced by `AC_CHECK_MEMBERS' (*note AC_CHECK_MEMBERS::).
+
+ -- Macro: AC_SYS_RESTARTABLE_SYSCALLS
+ If the system automatically restarts a system call that is
+ interrupted by a signal, define `HAVE_RESTARTABLE_SYSCALLS'. This
+ macro does not check whether system calls are restarted in
+ general--it checks whether a signal handler installed with
+ `signal' (but not `sigaction') causes system calls to be
+ restarted. It does not check whether system calls can be
+ restarted when interrupted by signals that have no handler.
+
+ These days portable programs should use `sigaction' with
+ `SA_RESTART' if they want restartable system calls. They should
+ not rely on `HAVE_RESTARTABLE_SYSCALLS', since nowadays whether a
+ system call is restartable is a dynamic issue, not a
+ configuration-time issue.
+
+ -- Macro: AC_SYS_SIGLIST_DECLARED
+ This macro was renamed `AC_DECL_SYS_SIGLIST'. However, even that
+ name is obsolete, as the same functionality is now achieved via
+ `AC_CHECK_DECLS' (*note AC_CHECK_DECLS::).
+
+ -- Macro: AC_TEST_CPP
+ This macro was renamed `AC_TRY_CPP', which in turn was replaced by
+ `AC_PREPROC_IFELSE' (*note AC_PREPROC_IFELSE::).
+
+ -- Macro: AC_TEST_PROGRAM
+ This macro was renamed `AC_TRY_RUN', which in turn was replaced by
+ `AC_RUN_IFELSE' (*note AC_RUN_IFELSE::).
+
+ -- Macro: AC_TIMEZONE
+ Replaced by `AC_STRUCT_TIMEZONE' (*note AC_STRUCT_TIMEZONE::).
+
+ -- Macro: AC_TIME_WITH_SYS_TIME
+ Replaced by `AC_HEADER_TIME' (*note AC_HEADER_TIME::).
+
+ -- Macro: AC_TRY_COMPILE (INCLUDES, FUNCTION-BODY, [ACTION-IF-TRUE],
+ [ACTION-IF-FALSE])
+ Same as:
+
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[INCLUDES]],
+ [[FUNCTION-BODY]])],
+ [ACTION-IF-TRUE],
+ [ACTION-IF-FALSE])
+
+ *Note Running the Compiler::.
+
+ This macro double quotes both INCLUDES and FUNCTION-BODY.
+
+ For C and C++, INCLUDES is any `#include' statements needed by the
+ code in FUNCTION-BODY (INCLUDES is ignored if the currently
+ selected language is Fortran or Fortran 77). The compiler and
+ compilation flags are determined by the current language (*note
+ Language Choice::).
+
+ -- Macro: AC_TRY_CPP (INPUT, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
+ Same as:
+
+ AC_PREPROC_IFELSE(
+ [AC_LANG_SOURCE([[INPUT]])],
+ [ACTION-IF-TRUE],
+ [ACTION-IF-FALSE])
+
+ *Note Running the Preprocessor::.
+
+ This macro double quotes the INPUT.
+
+ -- Macro: AC_TRY_LINK (INCLUDES, FUNCTION-BODY, [ACTION-IF-TRUE],
+ [ACTION-IF-FALSE])
+ Same as:
+
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[INCLUDES]],
+ [[FUNCTION-BODY]])],
+ [ACTION-IF-TRUE],
+ [ACTION-IF-FALSE])
+
+ *Note Running the Compiler::.
+
+ This macro double quotes both INCLUDES and FUNCTION-BODY.
+
+ Depending on the current language (*note Language Choice::),
+ create a test program to see whether a function whose body
+ consists of FUNCTION-BODY can be compiled and linked. If the file
+ compiles and links successfully, run shell commands
+ ACTION-IF-FOUND, otherwise run ACTION-IF-NOT-FOUND.
+
+ This macro double quotes both INCLUDES and FUNCTION-BODY.
+
+ For C and C++, INCLUDES is any `#include' statements needed by the
+ code in FUNCTION-BODY (INCLUDES is ignored if the currently
+ selected language is Fortran or Fortran 77). The compiler and
+ compilation flags are determined by the current language (*note
+ Language Choice::), and in addition `LDFLAGS' and `LIBS' are used
+ for linking.
+
+ -- Macro: AC_TRY_LINK_FUNC (FUNCTION, [ACTION-IF-FOUND],
+ [ACTION-IF-NOT-FOUND])
+ This macro is equivalent to
+ AC_LINK_IFELSE([AC_LANG_CALL([], [FUNCTION])],
+ [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+ *Note AC_LINK_IFELSE::.
+
+ -- Macro: AC_TRY_RUN (PROGRAM, [ACTION-IF-TRUE], [ACTION-IF-FALSE],
+ [ACTION-IF-CROSS-COMPILING = `AC_MSG_FAILURE'])
+ Same as:
+
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[PROGRAM]])],
+ [ACTION-IF-TRUE],
+ [ACTION-IF-FALSE],
+ [ACTION-IF-CROSS-COMPILING])
+
+ *Note Runtime::.
+
+ -- Macro: AC_TYPE_SIGNAL
+ If `signal.h' declares `signal' as returning a pointer to a
+ function returning `void', define `RETSIGTYPE' to be `void';
+ otherwise, define it to be `int'. These days, it is portable to
+ assume C89, and that signal handlers return `void', without
+ needing to use this macro or `RETSIGTYPE'.
+
+ When targeting older K&R C, it is possible to define signal
+ handlers as returning type `RETSIGTYPE', and omit a return
+ statement:
+
+ RETSIGTYPE
+ hup_handler ()
+ {
+ ...
+ }
+
+ -- Macro: AC_UID_T
+ Replaced by `AC_TYPE_UID_T' (*note AC_TYPE_UID_T::).
+
+ -- Macro: AC_UNISTD_H
+ Same as `AC_CHECK_HEADERS([unistd.h])' (*note AC_CHECK_HEADERS::).
+
+ -- Macro: AC_USG
+ Define `USG' if the BSD string functions are defined in
+ `strings.h'. You should no longer depend upon `USG', but on
+ `HAVE_STRING_H'; see *note Standard Symbols::.
+
+ -- Macro: AC_UTIME_NULL
+ Replaced by `AC_FUNC_UTIME_NULL' (*note AC_FUNC_UTIME_NULL::).
+
+ -- Macro: AC_VALIDATE_CACHED_SYSTEM_TUPLE ([CMD])
+ If the cache file is inconsistent with the current host, target and
+ build system types, it used to execute CMD or print a default
+ error message. This is now handled by default.
+
+ -- Macro: AC_VERBOSE (RESULT-DESCRIPTION)
+ Replaced by `AC_MSG_RESULT' (*note AC_MSG_RESULT::).
+
+ -- Macro: AC_VFORK
+ Replaced by `AC_FUNC_FORK' (*note AC_FUNC_FORK::).
+
+ -- Macro: AC_VPRINTF
+ Replaced by `AC_FUNC_VPRINTF' (*note AC_FUNC_VPRINTF::).
+
+ -- Macro: AC_WAIT3
+ This macro was renamed `AC_FUNC_WAIT3'. However, these days
+ portable programs should use `waitpid', not `wait3', as `wait3'
+ has been removed from Posix.
+
+ -- Macro: AC_WARN
+ Replaced by `AC_MSG_WARN' (*note AC_MSG_WARN::).
+
+ -- Macro: AC_WITH (PACKAGE, ACTION-IF-GIVEN, [ACTION-IF-NOT-GIVEN])
+ This is an obsolete version of `AC_ARG_WITH' that does not support
+ providing a help string (*note AC_ARG_WITH::).
+
+ -- Macro: AC_WORDS_BIGENDIAN
+ Replaced by `AC_C_BIGENDIAN' (*note AC_C_BIGENDIAN::).
+
+ -- Macro: AC_XENIX_DIR
+ This macro used to add `-lx' to output variable `LIBS' if on
+ Xenix. Also, if `dirent.h' is being checked for, added `-ldir' to
+ `LIBS'. Now it is merely an alias of `AC_HEADER_DIRENT' instead,
+ plus some code to detect whether running XENIX on which you should
+ not depend:
+
+ AC_MSG_CHECKING([for Xenix])
+ AC_EGREP_CPP([yes],
+ [#if defined M_XENIX && !defined M_UNIX
+ yes
+ #endif],
+ [AC_MSG_RESULT([yes]); XENIX=yes],
+ [AC_MSG_RESULT([no]); XENIX=])
+ Don't use this macro, the dignified means to check the nature of
+ the host is using `AC_CANONICAL_HOST' (*note Canonicalizing::).
+
+ -- Macro: AC_YYTEXT_POINTER
+ This macro was renamed `AC_DECL_YYTEXT', which in turn was
+ integrated into `AC_PROG_LEX' (*note AC_PROG_LEX::).
+
+
+File: autoconf.info, Node: Autoconf 1, Next: Autoconf 2.13, Prev: Obsolete Macros, Up: Obsolete Constructs
+
+18.5 Upgrading From Version 1
+=============================
+
+Autoconf version 2 is mostly backward compatible with version 1.
+However, it introduces better ways to do some things, and doesn't
+support some of the ugly things in version 1. So, depending on how
+sophisticated your `configure.ac' files are, you might have to do some
+manual work in order to upgrade to version 2. This chapter points out
+some problems to watch for when upgrading. Also, perhaps your
+`configure' scripts could benefit from some of the new features in
+version 2; the changes are summarized in the file `NEWS' in the
+Autoconf distribution.
+
+* Menu:
+
+* Changed File Names:: Files you might rename
+* Changed Makefiles:: New things to put in `Makefile.in'
+* Changed Macros:: Macro calls you might replace
+* Changed Results:: Changes in how to check test results
+* Changed Macro Writing:: Better ways to write your own macros
+
+
+File: autoconf.info, Node: Changed File Names, Next: Changed Makefiles, Up: Autoconf 1
+
+18.5.1 Changed File Names
+-------------------------
+
+If you have an `aclocal.m4' installed with Autoconf (as opposed to in a
+particular package's source directory), you must rename it to
+`acsite.m4'. *Note autoconf Invocation::.
+
+ If you distribute `install.sh' with your package, rename it to
+`install-sh' so `make' builtin rules don't inadvertently create a file
+called `install' from it. `AC_PROG_INSTALL' looks for the script under
+both names, but it is best to use the new name.
+
+ If you were using `config.h.top', `config.h.bot', or `acconfig.h',
+you still can, but you have less clutter if you use the `AH_' macros.
+*Note Autoheader Macros::.
+
+
+File: autoconf.info, Node: Changed Makefiles, Next: Changed Macros, Prev: Changed File Names, Up: Autoconf 1
+
+18.5.2 Changed Makefiles
+------------------------
+
+Add `@CFLAGS@', `@CPPFLAGS@', and `@LDFLAGS@' in your `Makefile.in'
+files, so they can take advantage of the values of those variables in
+the environment when `configure' is run. Doing this isn't necessary,
+but it's a convenience for users.
+
+ Also add `@configure_input@' in a comment to each input file for
+`AC_OUTPUT', so that the output files contain a comment saying they
+were produced by `configure'. Automatically selecting the right
+comment syntax for all the kinds of files that people call `AC_OUTPUT'
+on became too much work.
+
+ Add `config.log' and `config.cache' to the list of files you remove
+in `distclean' targets.
+
+ If you have the following in `Makefile.in':
+
+ prefix = /usr/local
+ exec_prefix = $(prefix)
+
+you must change it to:
+
+ prefix = @prefix@
+ exec_prefix = @exec_prefix@
+
+The old behavior of replacing those variables without `@' characters
+around them has been removed.
+
+
+File: autoconf.info, Node: Changed Macros, Next: Changed Results, Prev: Changed Makefiles, Up: Autoconf 1
+
+18.5.3 Changed Macros
+---------------------
+
+Many of the macros were renamed in Autoconf version 2. You can still
+use the old names, but the new ones are clearer, and it's easier to find
+the documentation for them. *Note Obsolete Macros::, for a table
+showing the new names for the old macros. Use the `autoupdate' program
+to convert your `configure.ac' to using the new macro names. *Note
+autoupdate Invocation::.
+
+ Some macros have been superseded by similar ones that do the job
+better, but are not call-compatible. If you get warnings about calling
+obsolete macros while running `autoconf', you may safely ignore them,
+but your `configure' script generally works better if you follow the
+advice that is printed about what to replace the obsolete macros with.
+In particular, the mechanism for reporting the results of tests has
+changed. If you were using `echo' or `AC_VERBOSE' (perhaps via
+`AC_COMPILE_CHECK'), your `configure' script's output looks better if
+you switch to `AC_MSG_CHECKING' and `AC_MSG_RESULT'. *Note Printing
+Messages::. Those macros work best in conjunction with cache
+variables. *Note Caching Results::.
+
+
+File: autoconf.info, Node: Changed Results, Next: Changed Macro Writing, Prev: Changed Macros, Up: Autoconf 1
+
+18.5.4 Changed Results
+----------------------
+
+If you were checking the results of previous tests by examining the
+shell variable `DEFS', you need to switch to checking the values of the
+cache variables for those tests. `DEFS' no longer exists while
+`configure' is running; it is only created when generating output
+files. This difference from version 1 is because properly quoting the
+contents of that variable turned out to be too cumbersome and
+inefficient to do every time `AC_DEFINE' is called. *Note Cache
+Variable Names::.
+
+ For example, here is a `configure.ac' fragment written for Autoconf
+version 1:
+
+ AC_HAVE_FUNCS(syslog)
+ case "$DEFS" in
+ *-DHAVE_SYSLOG*) ;;
+ *) # syslog is not in the default libraries. See if it's in some other.
+ saved_LIBS="$LIBS"
+ for lib in bsd socket inet; do
+ AC_CHECKING(for syslog in -l$lib)
+ LIBS="-l$lib $saved_LIBS"
+ AC_HAVE_FUNCS(syslog)
+ case "$DEFS" in
+ *-DHAVE_SYSLOG*) break ;;
+ *) ;;
+ esac
+ LIBS="$saved_LIBS"
+ done ;;
+ esac
+
+ Here is a way to write it for version 2:
+
+ AC_CHECK_FUNCS([syslog])
+ if test "x$ac_cv_func_syslog" = xno; then
+ # syslog is not in the default libraries. See if it's in some other.
+ for lib in bsd socket inet; do
+ AC_CHECK_LIB([$lib], [syslog], [AC_DEFINE([HAVE_SYSLOG])
+ LIBS="-l$lib $LIBS"; break])
+ done
+ fi
+
+ If you were working around bugs in `AC_DEFINE_UNQUOTED' by adding
+backslashes before quotes, you need to remove them. It now works
+predictably, and does not treat quotes (except back quotes) specially.
+*Note Setting Output Variables::.
+
+ All of the Boolean shell variables set by Autoconf macros now use
+`yes' for the true value. Most of them use `no' for false, though for
+backward compatibility some use the empty string instead. If you were
+relying on a shell variable being set to something like 1 or `t' for
+true, you need to change your tests.
+
+
+File: autoconf.info, Node: Changed Macro Writing, Prev: Changed Results, Up: Autoconf 1
+
+18.5.5 Changed Macro Writing
+----------------------------
+
+When defining your own macros, you should now use `AC_DEFUN' instead of
+`define'. `AC_DEFUN' automatically calls `AC_PROVIDE' and ensures that
+macros called via `AC_REQUIRE' do not interrupt other macros, to
+prevent nested `checking...' messages on the screen. There's no actual
+harm in continuing to use the older way, but it's less convenient and
+attractive. *Note Macro Definitions::.
+
+ You probably looked at the macros that came with Autoconf as a guide
+for how to do things. It would be a good idea to take a look at the new
+versions of them, as the style is somewhat improved and they take
+advantage of some new features.
+
+ If you were doing tricky things with undocumented Autoconf internals
+(macros, variables, diversions), check whether you need to change
+anything to account for changes that have been made. Perhaps you can
+even use an officially supported technique in version 2 instead of
+kludging. Or perhaps not.
+
+ To speed up your locally written feature tests, add caching to them.
+See whether any of your tests are of general enough usefulness to
+encapsulate them into macros that you can share.
+
+
+File: autoconf.info, Node: Autoconf 2.13, Prev: Autoconf 1, Up: Obsolete Constructs
+
+18.6 Upgrading From Version 2.13
+================================
+
+The introduction of the previous section (*note Autoconf 1::) perfectly
+suits this section...
+
+ Autoconf version 2.50 is mostly backward compatible with version
+ 2.13. However, it introduces better ways to do some things, and
+ doesn't support some of the ugly things in version 2.13. So,
+ depending on how sophisticated your `configure.ac' files are, you
+ might have to do some manual work in order to upgrade to version
+ 2.50. This chapter points out some problems to watch for when
+ upgrading. Also, perhaps your `configure' scripts could benefit
+ from some of the new features in version 2.50; the changes are
+ summarized in the file `NEWS' in the Autoconf distribution.
+
+* Menu:
+
+* Changed Quotation:: Broken code which used to work
+* New Macros:: Interaction with foreign macros
+* Hosts and Cross-Compilation:: Bugward compatibility kludges
+* AC_LIBOBJ vs LIBOBJS:: LIBOBJS is a forbidden token
+* AC_ACT_IFELSE vs AC_TRY_ACT:: A more generic scheme for testing sources
+
+
+File: autoconf.info, Node: Changed Quotation, Next: New Macros, Up: Autoconf 2.13
+
+18.6.1 Changed Quotation
+------------------------
+
+The most important changes are invisible to you: the implementation of
+most macros have completely changed. This allowed more factorization of
+the code, better error messages, a higher uniformity of the user's
+interface etc. Unfortunately, as a side effect, some construct which
+used to (miraculously) work might break starting with Autoconf 2.50.
+The most common culprit is bad quotation.
+
+ For instance, in the following example, the message is not properly
+quoted:
+
+ AC_INIT
+ AC_CHECK_HEADERS(foo.h, ,
+ AC_MSG_ERROR(cannot find foo.h, bailing out))
+ AC_OUTPUT
+
+Autoconf 2.13 simply ignores it:
+
+ $ autoconf-2.13; ./configure --silent
+ creating cache ./config.cache
+ configure: error: cannot find foo.h
+ $
+
+while Autoconf 2.50 produces a broken `configure':
+
+ $ autoconf-2.50; ./configure --silent
+ configure: error: cannot find foo.h
+ ./configure: exit: bad non-numeric arg `bailing'
+ ./configure: exit: bad non-numeric arg `bailing'
+ $
+
+ The message needs to be quoted, and the `AC_MSG_ERROR' invocation
+too!
+
+ AC_INIT([Example], [1.0], [bug-example@example.org])
+ AC_CHECK_HEADERS([foo.h], [],
+ [AC_MSG_ERROR([cannot find foo.h, bailing out])])
+ AC_OUTPUT
+
+ Many many (and many more) Autoconf macros were lacking proper
+quotation, including no less than... `AC_DEFUN' itself!
+
+ $ cat configure.in
+ AC_DEFUN([AC_PROG_INSTALL],
+ [# My own much better version
+ ])
+ AC_INIT
+ AC_PROG_INSTALL
+ AC_OUTPUT
+ $ autoconf-2.13
+ autoconf: Undefined macros:
+ ***BUG in Autoconf--please report*** AC_FD_MSG
+ ***BUG in Autoconf--please report*** AC_EPI
+ configure.in:1:AC_DEFUN([AC_PROG_INSTALL],
+ configure.in:5:AC_PROG_INSTALL
+ $ autoconf-2.50
+ $
+
+
+File: autoconf.info, Node: New Macros, Next: Hosts and Cross-Compilation, Prev: Changed Quotation, Up: Autoconf 2.13
+
+18.6.2 New Macros
+-----------------
+
+While Autoconf was relatively dormant in the late 1990s, Automake
+provided Autoconf-like macros for a while. Starting with Autoconf 2.50
+in 2001, Autoconf provided versions of these macros, integrated in the
+`AC_' namespace, instead of `AM_'. But in order to ease the upgrading
+via `autoupdate', bindings to such `AM_' macros are provided.
+
+ Unfortunately older versions of Automake (e.g., Automake 1.4) did
+not quote the names of these macros. Therefore, when `m4' finds
+something like `AC_DEFUN(AM_TYPE_PTRDIFF_T, ...)' in `aclocal.m4',
+`AM_TYPE_PTRDIFF_T' is expanded, replaced with its Autoconf definition.
+
+ Fortunately Autoconf catches pre-`AC_INIT' expansions, and
+complains, in its own words:
+
+ $ cat configure.ac
+ AC_INIT([Example], [1.0], [bug-example@example.org])
+ AM_TYPE_PTRDIFF_T
+ $ aclocal-1.4
+ $ autoconf
+ aclocal.m4:17: error: m4_defn: undefined macro: _m4_divert_diversion
+ aclocal.m4:17: the top level
+ autom4te: m4 failed with exit status: 1
+ $
+
+ Modern versions of Automake no longer define most of these macros,
+and properly quote the names of the remaining macros. If you must use
+an old Automake, do not depend upon macros from Automake as it is
+simply not its job to provide macros (but the one it requires itself):
+
+ $ cat configure.ac
+ AC_INIT([Example], [1.0], [bug-example@example.org])
+ AM_TYPE_PTRDIFF_T
+ $ rm aclocal.m4
+ $ autoupdate
+ autoupdate: `configure.ac' is updated
+ $ cat configure.ac
+ AC_INIT([Example], [1.0], [bug-example@example.org])
+ AC_CHECK_TYPES([ptrdiff_t])
+ $ aclocal-1.4
+ $ autoconf
+ $
+
+
+File: autoconf.info, Node: Hosts and Cross-Compilation, Next: AC_LIBOBJ vs LIBOBJS, Prev: New Macros, Up: Autoconf 2.13
+
+18.6.3 Hosts and Cross-Compilation
+----------------------------------
+
+Based on the experience of compiler writers, and after long public
+debates, many aspects of the cross-compilation chain have changed:
+
+ - the relationship between the build, host, and target architecture
+ types,
+
+ - the command line interface for specifying them to `configure',
+
+ - the variables defined in `configure',
+
+ - the enabling of cross-compilation mode.
+
+
+ The relationship between build, host, and target have been cleaned
+up: the chain of default is now simply: target defaults to host, host to
+build, and build to the result of `config.guess'. Nevertheless, in
+order to ease the transition from 2.13 to 2.50, the following
+transition scheme is implemented. _Do not rely on it_, as it will be
+completely disabled in a couple of releases (we cannot keep it, as it
+proves to cause more problems than it cures).
+
+ They all default to the result of running `config.guess', unless you
+specify either `--build' or `--host'. In this case, the default
+becomes the system type you specified. If you specify both, and
+they're different, `configure' enters cross compilation mode, so it
+doesn't run any tests that require execution.
+
+ Hint: if you mean to override the result of `config.guess', prefer
+`--build' over `--host'.
+
+
+ For backward compatibility, `configure' accepts a system type as an
+option by itself. Such an option overrides the defaults for build,
+host, and target system types. The following configure statement
+configures a cross toolchain that runs on NetBSD/alpha but generates
+code for GNU Hurd/sparc, which is also the build platform.
+
+ ./configure --host=alpha-netbsd sparc-gnu
+
+
+ In Autoconf 2.13 and before, the variables `build', `host', and
+`target' had a different semantics before and after the invocation of
+`AC_CANONICAL_BUILD' etc. Now, the argument of `--build' is strictly
+copied into `build_alias', and is left empty otherwise. After the
+`AC_CANONICAL_BUILD', `build' is set to the canonicalized build type.
+To ease the transition, before, its contents is the same as that of
+`build_alias'. Do _not_ rely on this broken feature.
+
+ For consistency with the backward compatibility scheme exposed above,
+when `--host' is specified but `--build' isn't, the build system is
+assumed to be the same as `--host', and `build_alias' is set to that
+value. Eventually, this historically incorrect behavior will go away.
+
+
+ The former scheme to enable cross-compilation proved to cause more
+harm than good, in particular, it used to be triggered too easily,
+leaving regular end users puzzled in front of cryptic error messages.
+`configure' could even enter cross-compilation mode only because the
+compiler was not functional. This is mainly because `configure' used
+to try to detect cross-compilation, instead of waiting for an explicit
+flag from the user.
+
+ Now, `configure' enters cross-compilation mode if and only if
+`--host' is passed.
+
+ That's the short documentation. To ease the transition between 2.13
+and its successors, a more complicated scheme is implemented. _Do not
+rely on the following_, as it will be removed in the near future.
+
+ If you specify `--host', but not `--build', when `configure'
+performs the first compiler test it tries to run an executable produced
+by the compiler. If the execution fails, it enters cross-compilation
+mode. This is fragile. Moreover, by the time the compiler test is
+performed, it may be too late to modify the build-system type: other
+tests may have already been performed. Therefore, whenever you specify
+`--host', be sure to specify `--build' too.
+
+ ./configure --build=i686-pc-linux-gnu --host=m68k-coff
+
+enters cross-compilation mode. The former interface, which consisted
+in setting the compiler to a cross-compiler without informing
+`configure' is obsolete. For instance, `configure' fails if it can't
+run the code generated by the specified compiler if you configure as
+follows:
+
+ ./configure CC=m68k-coff-gcc
+
+
+File: autoconf.info, Node: AC_LIBOBJ vs LIBOBJS, Next: AC_ACT_IFELSE vs AC_TRY_ACT, Prev: Hosts and Cross-Compilation, Up: Autoconf 2.13
+
+18.6.4 `AC_LIBOBJ' vs. `LIBOBJS'
+--------------------------------
+
+Up to Autoconf 2.13, the replacement of functions was triggered via the
+variable `LIBOBJS'. Since Autoconf 2.50, the macro `AC_LIBOBJ' should
+be used instead (*note Generic Functions::). Starting at Autoconf
+2.53, the use of `LIBOBJS' is an error.
+
+ This change is mandated by the unification of the GNU Build System
+components. In particular, the various fragile techniques used to parse
+a `configure.ac' are all replaced with the use of traces. As a
+consequence, any action must be traceable, which obsoletes critical
+variable assignments. Fortunately, `LIBOBJS' was the only problem, and
+it can even be handled gracefully (read, "without your having to change
+something").
+
+ There were two typical uses of `LIBOBJS': asking for a replacement
+function, and adjusting `LIBOBJS' for Automake and/or Libtool.
+
+
+ As for function replacement, the fix is immediate: use `AC_LIBOBJ'.
+For instance:
+
+ LIBOBJS="$LIBOBJS fnmatch.o"
+ LIBOBJS="$LIBOBJS malloc.$ac_objext"
+
+should be replaced with:
+
+ AC_LIBOBJ([fnmatch])
+ AC_LIBOBJ([malloc])
+
+
+ When used with Automake 1.10 or newer, a suitable value for
+`LIBOBJDIR' is set so that the `LIBOBJS' and `LTLIBOBJS' can be
+referenced from any `Makefile.am'. Even without Automake, arranging
+for `LIBOBJDIR' to be set correctly enables referencing `LIBOBJS' and
+`LTLIBOBJS' in another directory. The `LIBOBJDIR' feature is
+experimental.
+
+
+File: autoconf.info, Node: AC_ACT_IFELSE vs AC_TRY_ACT, Prev: AC_LIBOBJ vs LIBOBJS, Up: Autoconf 2.13
+
+18.6.5 `AC_ACT_IFELSE' vs. `AC_TRY_ACT'
+---------------------------------------
+
+Since Autoconf 2.50, internal codes uses `AC_PREPROC_IFELSE',
+`AC_COMPILE_IFELSE', `AC_LINK_IFELSE', and `AC_RUN_IFELSE' on one hand
+and `AC_LANG_SOURCE', and `AC_LANG_PROGRAM' on the other hand instead
+of the deprecated `AC_TRY_CPP', `AC_TRY_COMPILE', `AC_TRY_LINK', and
+`AC_TRY_RUN'. The motivations where:
+ - a more consistent interface: `AC_TRY_COMPILE' etc. were double
+ quoting their arguments;
+
+ - the combinatoric explosion is solved by decomposing on the one
+ hand the generation of sources, and on the other hand executing
+ the program;
+
+ - this scheme helps supporting more languages than plain C and C++.
+
+ In addition to the change of syntax, the philosophy has changed too:
+while emphasis was put on speed at the expense of accuracy, today's
+Autoconf promotes accuracy of the testing framework at, ahem..., the
+expense of speed.
+
+ As a perfect example of what is _not_ to be done, here is how to
+find out whether a header file contains a particular declaration, such
+as a typedef, a structure, a structure member, or a function. Use
+`AC_EGREP_HEADER' instead of running `grep' directly on the header
+file; on some systems the symbol might be defined in another header
+file that the file you are checking includes.
+
+ As a (bad) example, here is how you should not check for C
+preprocessor symbols, either defined by header files or predefined by
+the C preprocessor: using `AC_EGREP_CPP':
+
+ AC_EGREP_CPP(yes,
+ [#ifdef _AIX
+ yes
+ #endif
+ ], is_aix=yes, is_aix=no)
+
+ The above example, properly written would (i) use `AC_LANG_PROGRAM',
+and (ii) run the compiler:
+
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [[#ifndef _AIX
+ error: This isn't AIX!
+ #endif
+ ]])],
+ [is_aix=yes],
+ [is_aix=no])
+
+
+File: autoconf.info, Node: Using Autotest, Next: FAQ, Prev: Obsolete Constructs, Up: Top
+
+19 Generating Test Suites with Autotest
+***************************************
+
+ *N.B.: This section describes a feature which is still
+ stabilizing. Although we believe that Autotest is useful as-is, this
+ documentation describes an interface which might change in the future:
+ do not depend upon Autotest without subscribing to the Autoconf mailing
+ lists.*
+
+ It is paradoxical that portable projects depend on nonportable tools
+to run their test suite. Autoconf by itself is the paragon of this
+problem: although it aims at perfectly portability, up to 2.13 its test
+suite was using DejaGNU, a rich and complex testing framework, but
+which is far from being standard on Posix systems. Worse yet, it was
+likely to be missing on the most fragile platforms, the very platforms
+that are most likely to torture Autoconf and exhibit deficiencies.
+
+ To circumvent this problem, many package maintainers have developed
+their own testing framework, based on simple shell scripts whose sole
+outputs are exit status values describing whether the test succeeded.
+Most of these tests share common patterns, and this can result in lots
+of duplicated code and tedious maintenance.
+
+ Following exactly the same reasoning that yielded to the inception of
+Autoconf, Autotest provides a test suite generation framework, based on
+M4 macros building a portable shell script. The suite itself is
+equipped with automatic logging and tracing facilities which greatly
+diminish the interaction with bug reporters, and simple timing reports.
+
+ Autoconf itself has been using Autotest for years, and we do attest
+that it has considerably improved the strength of the test suite and the
+quality of bug reports. Other projects are known to use some generation
+of Autotest, such as Bison, Free Recode, Free Wdiff, GNU Tar, each of
+them with different needs, and this usage has validated Autotest as a
+general testing framework.
+
+ Nonetheless, compared to DejaGNU, Autotest is inadequate for
+interactive tool testing, which is probably its main limitation.
+
+* Menu:
+
+* Using an Autotest Test Suite:: Autotest and the user
+* Writing Testsuites:: Autotest macros
+* testsuite Invocation:: Running `testsuite' scripts
+* Making testsuite Scripts:: Using autom4te to create `testsuite'
+
+
+File: autoconf.info, Node: Using an Autotest Test Suite, Next: Writing Testsuites, Up: Using Autotest
+
+19.1 Using an Autotest Test Suite
+=================================
+
+* Menu:
+
+* testsuite Scripts:: The concepts of Autotest
+* Autotest Logs:: Their contents
+
+
+File: autoconf.info, Node: testsuite Scripts, Next: Autotest Logs, Up: Using an Autotest Test Suite
+
+19.1.1 `testsuite' Scripts
+--------------------------
+
+Generating testing or validation suites using Autotest is rather easy.
+The whole validation suite is held in a file to be processed through
+`autom4te', itself using GNU M4 under the hood, to produce a
+stand-alone Bourne shell script which then gets distributed. Neither
+`autom4te' nor GNU M4 are needed at the installer's end.
+
+ Each test of the validation suite should be part of some test group.
+A "test group" is a sequence of interwoven tests that ought to be
+executed together, usually because one test in the group creates data
+files that a later test in the same group needs to read. Complex test
+groups make later debugging more tedious. It is much better to keep
+only a few tests per test group. Ideally there is only one test per
+test group.
+
+ For all but the simplest packages, some file such as `testsuite.at'
+does not fully hold all test sources, as these are often easier to
+maintain in separate files. Each of these separate files holds a single
+test group, or a sequence of test groups all addressing some common
+functionality in the package. In such cases, `testsuite.at' merely
+initializes the validation suite, and sometimes does elementary health
+checking, before listing include statements for all other test files.
+The special file `package.m4', containing the identification of the
+package, is automatically included if found.
+
+ A convenient alternative consists in moving all the global issues
+(local Autotest macros, elementary health checking, and `AT_INIT'
+invocation) into the file `local.at', and making `testsuite.at' be a
+simple list of `m4_include's of sub test suites. In such case,
+generating the whole test suite or pieces of it is only a matter of
+choosing the `autom4te' command line arguments.
+
+ The validation scripts that Autotest produces are by convention
+called `testsuite'. When run, `testsuite' executes each test group in
+turn, producing only one summary line per test to say if that
+particular test succeeded or failed. At end of all tests, summarizing
+counters get printed. One debugging directory is left for each test
+group which failed, if any: such directories are named
+`testsuite.dir/NN', where NN is the sequence number of the test group,
+and they include:
+
+ * a debugging script named `run' which reruns the test in "debug
+ mode" (*note testsuite Invocation::). The automatic generation of
+ debugging scripts has the purpose of easing the chase for bugs.
+
+ * all the files created with `AT_DATA'
+
+ * all the Erlang source code files created with `AT_CHECK_EUNIT'
+
+ * a log of the run, named `testsuite.log'
+
+ In the ideal situation, none of the tests fail, and consequently no
+debugging directory is left behind for validation.
+
+ It often happens in practice that individual tests in the validation
+suite need to get information coming out of the configuration process.
+Some of this information, common for all validation suites, is provided
+through the file `atconfig', automatically created by
+`AC_CONFIG_TESTDIR'. For configuration information which your testing
+environment specifically needs, you might prepare an optional file
+named `atlocal.in', instantiated by `AC_CONFIG_FILES'. The
+configuration process produces `atconfig' and `atlocal' out of these
+two input files, and these two produced files are automatically read by
+the `testsuite' script.
+
+ Here is a diagram showing the relationship between files.
+
+Files used in preparing a software package for distribution:
+
+ [package.m4] -->.
+ \
+ subfile-1.at ->. [local.at] ---->+
+ ... \ \
+ subfile-i.at ---->-- testsuite.at -->-- autom4te* -->testsuite
+ ... /
+ subfile-n.at ->'
+
+Files used in configuring a software package:
+
+ .--> atconfig
+ /
+ [atlocal.in] --> config.status* --<
+ \
+ `--> [atlocal]
+
+Files created during test suite execution:
+
+ atconfig -->. .--> testsuite.log
+ \ /
+ >-- testsuite* --<
+ / \
+ [atlocal] ->' `--> [testsuite.dir]
+
+
+File: autoconf.info, Node: Autotest Logs, Prev: testsuite Scripts, Up: Using an Autotest Test Suite
+
+19.1.2 Autotest Logs
+--------------------
+
+When run, the test suite creates a log file named after itself, e.g., a
+test suite named `testsuite' creates `testsuite.log'. It contains a
+lot of information, usually more than maintainers actually need, but
+therefore most of the time it contains all that is needed:
+
+command line arguments
+ A bad but unfortunately widespread habit consists of setting
+ environment variables before the command, such as in
+ `CC=my-home-grown-cc ./testsuite'. The test suite does not know
+ this change, hence (i) it cannot report it to you, and (ii) it
+ cannot preserve the value of `CC' for subsequent runs. Autoconf
+ faced exactly the same problem, and solved it by asking users to
+ pass the variable definitions as command line arguments. Autotest
+ requires this rule, too, but has no means to enforce it; the log
+ then contains a trace of the variables that were changed by the
+ user.
+
+`ChangeLog' excerpts
+ The topmost lines of all the `ChangeLog' files found in the source
+ hierarchy. This is especially useful when bugs are reported
+ against development versions of the package, since the version
+ string does not provide sufficient information to know the exact
+ state of the sources the user compiled. Of course, this relies on
+ the use of a `ChangeLog'.
+
+build machine
+ Running a test suite in a cross-compile environment is not an easy
+ task, since it would mean having the test suite run on a machine
+ BUILD, while running programs on a machine HOST. It is much
+ simpler to run both the test suite and the programs on HOST, but
+ then, from the point of view of the test suite, there remains a
+ single environment, HOST = BUILD. The log contains relevant
+ information on the state of the BUILD machine, including some
+ important environment variables.
+
+tested programs
+ The absolute file name and answers to `--version' of the tested
+ programs (see *note Writing Testsuites::, `AT_TESTED').
+
+configuration log
+ The contents of `config.log', as created by `configure', are
+ appended. It contains the configuration flags and a detailed
+ report on the configuration itself.
+
+
+File: autoconf.info, Node: Writing Testsuites, Next: testsuite Invocation, Prev: Using an Autotest Test Suite, Up: Using Autotest
+
+19.2 Writing `testsuite.at'
+===========================
+
+The `testsuite.at' is a Bourne shell script making use of special
+Autotest M4 macros. It often contains a call to `AT_INIT' near its
+beginning followed by one call to `m4_include' per source file for
+tests. Each such included file, or the remainder of `testsuite.at' if
+include files are not used, contain a sequence of test groups. Each
+test group begins with a call to `AT_SETUP', then an arbitrary number
+of shell commands or calls to `AT_CHECK', and then completes with a
+call to `AT_CLEANUP'. Multiple test groups can be categorized by a
+call to `AT_BANNER'.
+
+ All of the public Autotest macros have all-uppercase names in the
+namespace `^AT_' to prevent them from accidentally conflicting with
+other text; Autoconf also reserves the namespace `^_AT_' for internal
+macros. All shell variables used in the testsuite for internal
+purposes have mostly-lowercase names starting with `at_'. Autotest
+also uses here-document delimiters in the namespace `^_AT[A-Z]', and
+makes use of the file system namespace `^at-'.
+
+ Since Autoconf is built on top of M4sugar (*note Programming in
+M4sugar::) and M4sh (*note Programming in M4sh::), you must also be
+aware of those namespaces (`^_?\(m4\|AS\)_'). In general, you _should
+not use_ the namespace of a package that does not own the macro or
+shell code you are writing.
+
+ -- Macro: AT_INIT ([NAME])
+ Initialize Autotest. Giving a NAME to the test suite is
+ encouraged if your package includes several test suites. Before
+ this macro is called, `AT_PACKAGE_STRING' and
+ `AT_PACKAGE_BUGREPORT' must be defined, which are used to display
+ information about the testsuite to the user. Typically, these
+ macros are provided by a file `package.m4' built by `make' (*note
+ Making testsuite Scripts::), in order to inherit the package name,
+ version, and bug reporting address from `configure.ac'.
+
+ -- Macro: AT_COPYRIGHT (COPYRIGHT-NOTICE)
+ State that, in addition to the Free Software Foundation's
+ copyright on the Autotest macros, parts of your test suite are
+ covered by COPYRIGHT-NOTICE.
+
+ The COPYRIGHT-NOTICE shows up in both the head of `testsuite' and
+ in `testsuite --version'.
+
+ -- Macro: AT_ARG_OPTION (OPTIONS, HELP-TEXT, [ACTION-IF-GIVEN],
+ [ACTION-IF-NOT-GIVEN])
+ Accept options from the space-separated list OPTIONS, a list that
+ has leading dashes removed from the options. Long options will be
+ prefixed with `--', single-character options with `-'. The first
+ word in this list is the primary OPTION, any others are assumed to
+ be short-hand aliases. The variable associated with it is
+ `at_arg_OPTION', with any dashes in OPTION replaced with
+ underscores.
+
+ If the user passes `--OPTION' to the `testsuite', the variable
+ will be set to `:'. If the user does not pass the option, or
+ passes `--no-OPTION', then the variable will be set to `false'.
+
+ ACTION-IF-GIVEN is run each time the option is encountered; here,
+ the variable `at_optarg' will be set to `:' or `false' as
+ appropriate. `at_optarg' is actually just a copy of
+ `at_arg_OPTION'.
+
+ ACTION-IF-NOT-GIVEN will be run once after option parsing is
+ complete and if no option from OPTIONS was used.
+
+ HELP-TEXT is added to the end of the list of options shown in
+ `testsuite --help' (*note AS_HELP_STRING::).
+
+ It is recommended that you use a package-specific prefix to OPTIONS
+ names in order to avoid clashes with future Autotest built-in
+ options.
+
+ -- Macro: AT_ARG_OPTION_ARG (OPTIONS, HELP-TEXT, [ACTION-IF-GIVEN],
+ [ACTION-IF-NOT-GIVEN])
+ Accept options with arguments from the space-separated list
+ OPTIONS, a list that has leading dashes removed from the options.
+ Long options will be prefixed with `--', single-character options
+ with `-'. The first word in this list is the primary OPTION, any
+ others are assumed to be short-hand aliases. The variable
+ associated with it is `at_arg_OPTION', with any dashes in OPTION
+ replaced with underscores.
+
+ If the user passes `--OPTION=ARG' or `--OPTION ARG' to the
+ `testsuite', the variable will be set to `ARG'.
+
+ ACTION-IF-GIVEN is run each time the option is encountered; here,
+ the variable `at_optarg' will be set to `ARG'. `at_optarg' is
+ actually just a copy of `at_arg_OPTION'.
+
+ ACTION-IF-NOT-GIVEN will be run once after option parsing is
+ complete and if no option from OPTIONS was used.
+
+ HELP-TEXT is added to the end of the list of options shown in
+ `testsuite --help' (*note AS_HELP_STRING::).
+
+ It is recommended that you use a package-specific prefix to OPTIONS
+ names in order to avoid clashes with future Autotest built-in
+ options.
+
+ -- Macro: AT_COLOR_TESTS
+ Enable colored test results by default when the output is
+ connected to a terminal.
+
+ -- Macro: AT_TESTED (EXECUTABLES)
+ Log the file name and answer to `--version' of each program in
+ space-separated list EXECUTABLES. Several invocations register
+ new executables, in other words, don't fear registering one program
+ several times.
+
+ Autotest test suites rely on `PATH' to find the tested program.
+ This avoids the need to generate absolute names of the various
+ tools, and makes it possible to test installed programs.
+ Therefore, knowing which programs are being exercised is crucial
+ to understanding problems in the test suite itself, or its
+ occasional misuses. It is a good idea to also subscribe foreign
+ programs you depend upon, to avoid incompatible diagnostics.
+
+
+ -- Macro: AT_BANNER (TEST-CATEGORY-NAME)
+ This macro identifies the start of a category of related test
+ groups. When the resulting `testsuite' is invoked with more than
+ one test group to run, its output will include a banner containing
+ TEST-CATEGORY-NAME prior to any tests run from that category. The
+ banner should be no more than about 40 or 50 characters. A blank
+ banner indicates uncategorized tests; an empty line will be
+ inserted after tests from an earlier category, effectively ending
+ that category.
+
+ -- Macro: AT_SETUP (TEST-GROUP-NAME)
+ This macro starts a group of related tests, all to be executed in
+ the same subshell. It accepts a single argument, which holds a
+ few words (no more than about 30 or 40 characters) quickly
+ describing the purpose of the test group being started.
+ TEST-GROUP-NAME must not expand to unbalanced quotes, although
+ quadrigraphs can be used.
+
+ -- Macro: AT_KEYWORDS (KEYWORDS)
+ Associate the space-separated list of KEYWORDS to the enclosing
+ test group. This makes it possible to run "slices" of the test
+ suite. For instance, if some of your test groups exercise some
+ `foo' feature, then using `AT_KEYWORDS(foo)' lets you run
+ `./testsuite -k foo' to run exclusively these test groups. The
+ TEST-GROUP-NAME of the test group is automatically recorded to
+ `AT_KEYWORDS'.
+
+ Several invocations within a test group accumulate new keywords.
+ In other words, don't fear registering the same keyword several
+ times in a test group.
+
+ -- Macro: AT_CAPTURE_FILE (FILE)
+ If the current test group fails, log the contents of FILE.
+ Several identical calls within one test group have no additional
+ effect.
+
+ -- Macro: AT_FAIL_IF (SHELL-CONDITION)
+ Make the test group fail and skip the rest of its execution, if
+ SHELL-CONDITION is true. SHELL-CONDITION is a shell expression
+ such as a `test' command. Tests before `AT_FAIL_IF' will be
+ executed and may still cause the test group to be skipped. You
+ can instantiate this macro many times from within the same test
+ group.
+
+ You should use this macro only for very simple failure conditions.
+ If the SHELL-CONDITION could emit any kind of output you should
+ instead use `AT_CHECK' like
+ AT_CHECK([if SHELL-CONDITION; then exit 99; fi])
+ so that such output is properly recorded in the `testsuite.log'
+ file.
+
+ -- Macro: AT_SKIP_IF (SHELL-CONDITION)
+ Determine whether the test should be skipped because it requires
+ features that are unsupported on the machine under test.
+ SHELL-CONDITION is a shell expression such as a `test' command.
+ Tests before `AT_SKIP_IF' will be executed and may still cause the
+ test group to fail. You can instantiate this macro many times
+ from within the same test group.
+
+ You should use this macro only for very simple skip conditions.
+ If the SHELL-CONDITION could emit any kind of output you should
+ instead use `AT_CHECK' like
+ AT_CHECK([if SHELL-CONDITION; then exit 77; fi])
+ so that such output is properly recorded in the `testsuite.log'
+ file.
+
+ -- Macro: AT_XFAIL_IF (SHELL-CONDITION)
+ Determine whether the test is expected to fail because it is a
+ known bug (for unsupported features, you should skip the test).
+ SHELL-CONDITION is a shell expression such as a `test' command;
+ you can instantiate this macro many times from within the same
+ test group, and one of the conditions is enough to turn the test
+ into an expected failure.
+
+ -- Macro: AT_CLEANUP
+ End the current test group.
+
+
+ -- Macro: AT_DATA (FILE, CONTENTS)
+ Initialize an input data FILE with given CONTENTS. Of course, the
+ CONTENTS have to be properly quoted between square brackets to
+ protect against included commas or spurious M4 expansion.
+ CONTENTS must be empty or end with a newline. FILE must be a
+ single shell word that expands into a single file name.
+
+ -- Macro: AT_CHECK (COMMANDS, [STATUS = `0'], [STDOUT], [STDERR],
+ [RUN-IF-FAIL], [RUN-IF-PASS])
+ -- Macro: AT_CHECK_UNQUOTED (COMMANDS, [STATUS = `0'], [STDOUT],
+ [STDERR], [RUN-IF-FAIL], [RUN-IF-PASS])
+ Execute a test by performing given shell COMMANDS in a subshell.
+ COMMANDS is output as-is, so shell expansions are honored. These
+ commands should normally exit with STATUS, while producing expected
+ STDOUT and STDERR contents. If COMMANDS exit with unexpected
+ status 77, then the rest of the test group is skipped. If
+ COMMANDS exit with unexpected status 99, then the test group is
+ immediately failed. Otherwise, if this test fails, run shell
+ commands RUN-IF-FAIL or, if this test passes, run shell commands
+ RUN-IF-PASS, both inside the current shell execution environment.
+ At the beginning of RUN-IF-FAIL and RUN-IF-PASS, the status of
+ COMMANDS is available in the `at_status' shell variable.
+
+ This macro must be invoked in between `AT_SETUP' and `AT_CLEANUP'.
+
+ If STATUS is the literal `ignore', then the corresponding exit
+ status is not checked, except for the special cases of 77 (skip)
+ and 99 (hard failure). The existence of hard failures allows one
+ to mark a test as an expected failure with `AT_XFAIL_IF' because a
+ feature has not yet been implemented, but to still distinguish
+ between gracefully handling the missing feature and dumping core.
+ A hard failure also inhibits post-test actions in RUN-IF-FAIL.
+
+ If the value of the STDOUT or STDERR parameter is one of the
+ literals in the following table, then the test treats the output
+ according to the rules of that literal. Otherwise, the value of
+ the parameter is treated as text that must exactly match the
+ output given by COMMANDS on standard output and standard error
+ (including an empty parameter for no output); any differences are
+ captured in the testsuite log and the test is failed (unless an
+ unexpected exit status of 77 skipped the test instead). The
+ difference between `AT_CHECK' and `AT_CHECK_UNQUOTED' is that only
+ the latter performs shell variable expansion (`$'), command
+ substitution (``'), and backslash escaping (`\') on comparison
+ text given in the STDOUT and STDERR arguments; if the text
+ includes a trailing newline, this would be the same as if it were
+ specified via an unquoted here-document. (However, there is no
+ difference in the interpretation of COMMANDS).
+
+ `ignore'
+ The content of the output is ignored, but still captured in
+ the test group log (if the testsuite is run with option `-v',
+ the test group log is displayed as the test is run; if the
+ test group later fails, the test group log is also copied
+ into the overall testsuite log). This action is valid for
+ both STDOUT and STDERR.
+
+ `ignore-nolog'
+ The content of the output is ignored, and nothing is captured
+ in the log files. If COMMANDS are likely to produce binary
+ output (including long lines) or large amounts of output,
+ then logging the output can make it harder to locate details
+ related to subsequent tests within the group, and could
+ potentially corrupt terminal display of a user running
+ `testsuite -v'.
+
+ `stdout'
+ For the STDOUT parameter, capture the content of standard
+ output to both the file `stdout' and the test group log.
+ Subsequent commands in the test group can then post-process
+ the file. This action is often used when it is desired to
+ use `grep' to look for a substring in the output, or when the
+ output must be post-processed to normalize error messages
+ into a common form.
+
+ `stderr'
+ Like `stdout', except that it only works for the STDERR
+ parameter, and the standard error capture file will be named
+ `stderr'.
+
+ `stdout-nolog'
+ `stderr-nolog'
+ Like `stdout' or `stderr', except that the captured output is
+ not duplicated into the test group log. This action is
+ particularly useful for an intermediate check that produces
+ large amounts of data, which will be followed by another
+ check that filters down to the relevant data, as it makes it
+ easier to locate details in the log.
+
+ `expout'
+ For the STDOUT parameter, compare standard output contents
+ with the previously created file `expout', and list any
+ differences in the testsuite log.
+
+ `experr'
+ Like `expout', except that it only works for the STDERR
+ parameter, and the standard error contents are compared with
+ `experr'.
+
+ -- Macro: AT_CHECK_EUNIT (MODULE, TEST-SPEC, [ERLFLAGS],
+ [RUN-IF-FAIL], [RUN-IF-PASS])
+ Initialize and execute an Erlang module named MODULE that performs
+ tests following the TEST-SPEC EUnit test specification. TEST-SPEC
+ must be a valid EUnit test specification, as defined in the EUnit
+ Reference Manual (http://erlang.org/doc/apps/eunit/index.html).
+ ERLFLAGS are optional command-line options passed to the Erlang
+ interpreter to execute the test Erlang module. Typically,
+ ERLFLAGS defines at least the paths to directories containing the
+ compiled Erlang modules under test, as `-pa path1 path2 ...'.
+
+ For example, the unit tests associated with Erlang module `testme',
+ which compiled code is in subdirectory `src', can be performed
+ with:
+
+ AT_CHECK_EUNIT([testme_testsuite], [{module, testme}],
+ [-pa "${abs_top_builddir}/src"])
+
+ This macro must be invoked in between `AT_SETUP' and `AT_CLEANUP'.
+
+ Variables `ERL', `ERLC', and (optionally) `ERLCFLAGS' must be
+ defined as the path of the Erlang interpreter, the path of the
+ Erlang compiler, and the command-line flags to pass to the
+ compiler, respectively. Those variables should be configured in
+ `configure.ac' using the `AC_ERLANG_PATH_ERL' and
+ `AC_ERLANG_PATH_ERLC' macros, and the configured values of those
+ variables are automatically defined in the testsuite. If `ERL' or
+ `ERLC' is not defined, the test group is skipped.
+
+ If the EUnit library cannot be found, i.e. if module `eunit' cannot
+ be loaded, the test group is skipped. Otherwise, if TEST-SPEC is
+ an invalid EUnit test specification, the test group fails.
+ Otherwise, if the EUnit test passes, shell commands RUN-IF-PASS
+ are executed or, if the EUnit test fails, shell commands
+ RUN-IF-FAIL are executed and the test group fails.
+
+ Only the generated test Erlang module is automatically compiled and
+ executed. If TEST-SPEC involves testing other Erlang modules,
+ e.g. module `testme' in the example above, those modules must be
+ already compiled.
+
+ If the testsuite is run in verbose mode, with option `--verbose',
+ EUnit is also run in verbose mode to output more details about
+ individual unit tests.
+
+
+File: autoconf.info, Node: testsuite Invocation, Next: Making testsuite Scripts, Prev: Writing Testsuites, Up: Using Autotest
+
+19.3 Running `testsuite' Scripts
+================================
+
+Autotest test suites support the following options:
+
+`--help'
+`-h'
+ Display the list of options and exit successfully.
+
+`--version'
+`-V'
+ Display the version of the test suite and exit successfully.
+
+`--directory=DIR'
+`-C DIR'
+ Change the current directory to DIR before creating any files.
+ Useful for running the testsuite in a subdirectory from a top-level
+ Makefile.
+
+`--jobs[=N]'
+`-j[N]'
+ Run N tests in parallel, if possible. If N is not given, run all
+ given tests in parallel. Note that there should be no space
+ before the argument to `-j', as `-j NUMBER' denotes the separate
+ arguments `-j' and `NUMBER', see below.
+
+ In parallel mode, the standard input device of the testsuite
+ script is not available to commands inside a test group.
+ Furthermore, banner lines are not printed, and the summary line
+ for each test group is output after the test group completes.
+ Summary lines may appear unordered. If verbose and trace output
+ are enabled (see below), they may appear intermixed from
+ concurrently running tests.
+
+ Parallel mode requires the `mkfifo' command to work, and will be
+ silently disabled otherwise.
+
+`--clean'
+`-c'
+ Remove all the files the test suite might have created and exit.
+ Meant for `clean' Make targets.
+
+`--list'
+`-l'
+ List all the tests (or only the selection), including their
+ possible keywords.
+
+
+ By default all tests are performed (or described with `--list')
+silently in the default environment, but the environment, set of tests,
+and verbosity level can be tuned:
+
+`VARIABLE=VALUE'
+ Set the environment VARIABLE to VALUE. Use this rather than
+ `FOO=foo ./testsuite' as debugging scripts would then run in a
+ different environment.
+
+ The variable `AUTOTEST_PATH' specifies the testing path to prepend
+ to `PATH'. Relative directory names (not starting with `/') are
+ considered to be relative to the top level of the package being
+ built. All directories are made absolute, first starting from the
+ top level _build_ tree, then from the _source_ tree. For instance
+ `./testsuite AUTOTEST_PATH=tests:bin' for a `/src/foo-1.0' source
+ package built in `/tmp/foo' results in
+ `/tmp/foo/tests:/tmp/foo/bin' and then
+ `/src/foo-1.0/tests:/src/foo-1.0/bin' being prepended to `PATH'.
+
+`NUMBER'
+`NUMBER-NUMBER'
+`NUMBER-'
+`-NUMBER'
+ Add the corresponding test groups, with obvious semantics, to the
+ selection.
+
+`--keywords=KEYWORDS'
+`-k KEYWORDS'
+ Add to the selection the test groups with title or keywords
+ (arguments to `AT_SETUP' or `AT_KEYWORDS') that match _all_
+ keywords of the comma separated list KEYWORDS, case-insensitively.
+ Use `!' immediately before the keyword to invert the selection for
+ this keyword. By default, the keywords match whole words; enclose
+ them in `.*' to also match parts of words.
+
+ For example, running
+
+ ./testsuite -k 'autoupdate,.*FUNC.*'
+
+ selects all tests tagged `autoupdate' _and_ with tags containing
+ `FUNC' (as in `AC_CHECK_FUNC', `AC_FUNC_ALLOCA', etc.), while
+
+ ./testsuite -k '!autoupdate' -k '.*FUNC.*'
+
+ selects all tests not tagged `autoupdate' _or_ with tags
+ containing `FUNC'.
+
+`--errexit'
+`-e'
+ If any test fails, immediately abort testing. This implies
+ `--debug': post test group clean up, and top-level logging are
+ inhibited. This option is meant for the full test suite, it is
+ not really useful for generated debugging scripts. If the
+ testsuite is run in parallel mode using `--jobs', then
+ concurrently running tests will finish before exiting.
+
+`--verbose'
+`-v'
+ Force more verbosity in the detailed output of what is being done.
+ This is the default for debugging scripts.
+
+`--color'
+`--color[=never|auto|always]'
+ Enable colored test results. Without an argument, or with
+ `always', test results will be colored. With `never', color mode
+ is turned off. Otherwise, if either the macro `AT_COLOR_TESTS' is
+ used by the testsuite author, or the argument `auto' is given,
+ then test results are colored if standard output is connected to a
+ terminal.
+
+`--debug'
+`-d'
+ Do not remove the files after a test group was performed--but they
+ are still removed _before_, therefore using this option is sane
+ when running several test groups. Create debugging scripts. Do
+ not overwrite the top-level log (in order to preserve a supposedly
+ existing full log file). This is the default for debugging
+ scripts, but it can also be useful to debug the testsuite itself.
+
+`--recheck'
+ Add to the selection all test groups that failed or passed
+ unexpectedly during the last non-debugging test run.
+
+`--trace'
+`-x'
+ Trigger shell tracing of the test groups.
+
+ Besides these options accepted by every Autotest testsuite, the
+testsuite author might have added package-specific options via the
+`AT_ARG_OPTION' and `AT_ARG_OPTION_ARG' macros (*note Writing
+Testsuites::); refer to `testsuite --help' and the package
+documentation for details.
+
+
+File: autoconf.info, Node: Making testsuite Scripts, Prev: testsuite Invocation, Up: Using Autotest
+
+19.4 Making `testsuite' Scripts
+===============================
+
+For putting Autotest into movement, you need some configuration and
+makefile machinery. We recommend, at least if your package uses deep or
+shallow hierarchies, that you use `tests/' as the name of the directory
+holding all your tests and their makefile. Here is a check list of
+things to do.
+
+ - Make sure to create the file `package.m4', which defines the
+ identity of the package. It must define `AT_PACKAGE_STRING', the
+ full signature of the package, and `AT_PACKAGE_BUGREPORT', the
+ address to which bug reports should be sent. For sake of
+ completeness, we suggest that you also define `AT_PACKAGE_NAME',
+ `AT_PACKAGE_TARNAME', `AT_PACKAGE_VERSION', and `AT_PACKAGE_URL'.
+ *Note Initializing configure::, for a description of these
+ variables. Be sure to distribute `package.m4' and to put it into
+ the source hierarchy: the test suite ought to be shipped! See
+ below for an example `Makefile' excerpt.
+
+ - Invoke `AC_CONFIG_TESTDIR'.
+
+ -- Macro: AC_CONFIG_TESTDIR (DIRECTORY, [TEST-PATH = `directory'])
+ An Autotest test suite is to be configured in DIRECTORY. This
+ macro causes `DIRECTORY/atconfig' to be created by
+ `config.status' and sets the default `AUTOTEST_PATH' to
+ TEST-PATH (*note testsuite Invocation::).
+
+ - Still within `configure.ac', as appropriate, ensure that some
+ `AC_CONFIG_FILES' command includes substitution for
+ `tests/atlocal'.
+
+ - The appropriate `Makefile' should be modified so the validation in
+ your package is triggered by `make check'. An example is provided
+ below.
+
+ With Automake, here is a minimal example for inclusion in
+`tests/Makefile.am', in order to link `make check' with a validation
+suite.
+
+ # The `:;' works around a Bash 3.2 bug when the output is not writable.
+ $(srcdir)/package.m4: $(top_srcdir)/configure.ac
+ :;{ \
+ echo '# Signature of the current package.' && \
+ echo 'm4_define([AT_PACKAGE_NAME],' && \
+ echo ' [$(PACKAGE_NAME)])' && \
+ echo 'm4_define([AT_PACKAGE_TARNAME],' && \
+ echo ' [$(PACKAGE_TARNAME)])' && \
+ echo 'm4_define([AT_PACKAGE_VERSION],' && \
+ echo ' [$(PACKAGE_VERSION)])' && \
+ echo 'm4_define([AT_PACKAGE_STRING],' && \
+ echo ' [$(PACKAGE_STRING)])' && \
+ echo 'm4_define([AT_PACKAGE_BUGREPORT],' && \
+ echo ' [$(PACKAGE_BUGREPORT)])'; \
+ echo 'm4_define([AT_PACKAGE_URL],' && \
+ echo ' [$(PACKAGE_URL)])'; \
+ } >'$(srcdir)/package.m4'
+
+ EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) atlocal.in
+ TESTSUITE = $(srcdir)/testsuite
+
+ check-local: atconfig atlocal $(TESTSUITE)
+ $(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS)
+
+ installcheck-local: atconfig atlocal $(TESTSUITE)
+ $(SHELL) '$(TESTSUITE)' AUTOTEST_PATH='$(bindir)' \
+ $(TESTSUITEFLAGS)
+
+ clean-local:
+ test ! -f '$(TESTSUITE)' || \
+ $(SHELL) '$(TESTSUITE)' --clean
+
+ AUTOM4TE = $(SHELL) $(srcdir)/build-aux/missing --run autom4te
+ AUTOTEST = $(AUTOM4TE) --language=autotest
+ $(TESTSUITE): $(srcdir)/testsuite.at $(srcdir)/package.m4
+ $(AUTOTEST) -I '$(srcdir)' -o $@.tmp $@.at
+ mv $@.tmp $@
+
+ Note that the built testsuite is distributed; this is necessary
+because users might not have Autoconf installed, and thus would not be
+able to rebuild it. Likewise, the use of `missing' provides the user
+with a nicer error message if they modify a source file to the
+testsuite, and accidentally trigger the rebuild rules.
+
+ You might want to list explicitly the dependencies, i.e., the list of
+the files `testsuite.at' includes.
+
+ If you don't use Automake, you should include the above example in
+`tests/Makefile.in', along with additional lines inspired from the
+following:
+
+ subdir = tests
+ PACKAGE_NAME = @PACKAGE_NAME@
+ PACKAGE_TARNAME = @PACKAGE_TARNAME@
+ PACKAGE_VERSION = @PACKAGE_VERSION@
+ PACKAGE_STRING = @PACKAGE_STRING@
+ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+ PACKAGE_URL = @PACKAGE_URL@
+
+ atconfig: $(top_builddir)/config.status
+ cd $(top_builddir) && \
+ $(SHELL) ./config.status $(subdir)/$@
+
+ atlocal: $(srcdir)/atlocal.in $(top_builddir)/config.status
+ cd $(top_builddir) && \
+ $(SHELL) ./config.status $(subdir)/$@
+
+and manage to have `$(EXTRA_DIST)' distributed. You will also want to
+distribute the file `build-aux/missing' from the Automake project; a
+copy of this file resides in the Autoconf source tree.
+
+ With all this in place, and if you have not initialized
+`TESTSUITEFLAGS' within your makefile, you can fine-tune test suite
+execution with this variable, for example:
+
+ make check TESTSUITEFLAGS='-v -d -x 75 -k AC_PROG_CC CFLAGS=-g'
+
+
+File: autoconf.info, Node: FAQ, Next: History, Prev: Using Autotest, Up: Top
+
+20 Frequent Autoconf Questions, with answers
+********************************************
+
+Several questions about Autoconf come up occasionally. Here some of
+them are addressed.
+
+* Menu:
+
+* Distributing:: Distributing `configure' scripts
+* Why GNU M4:: Why not use the standard M4?
+* Bootstrapping:: Autoconf and GNU M4 require each other?
+* Why Not Imake:: Why GNU uses `configure' instead of Imake
+* Defining Directories:: Passing `datadir' to program
+* Autom4te Cache:: What is it? Can I remove it?
+* Present But Cannot Be Compiled:: Compiler and Preprocessor Disagree
+* Expanded Before Required:: Expanded Before Required
+* Debugging:: Debugging `configure' scripts
+
+
+File: autoconf.info, Node: Distributing, Next: Why GNU M4, Up: FAQ
+
+20.1 Distributing `configure' Scripts
+=====================================
+
+ What are the restrictions on distributing `configure'
+ scripts that Autoconf generates? How does that affect my
+ programs that use them?
+
+ There are no restrictions on how the configuration scripts that
+Autoconf produces may be distributed or used. In Autoconf version 1,
+they were covered by the GNU General Public License. We still encourage
+software authors to distribute their work under terms like those of the
+GPL, but doing so is not required to use Autoconf.
+
+ Of the other files that might be used with `configure',
+`config.h.in' is under whatever copyright you use for your
+`configure.ac'. `config.sub' and `config.guess' have an exception to
+the GPL when they are used with an Autoconf-generated `configure'
+script, which permits you to distribute them under the same terms as
+the rest of your package. `install-sh' is from the X Consortium and is
+not copyrighted.
+
+
+File: autoconf.info, Node: Why GNU M4, Next: Bootstrapping, Prev: Distributing, Up: FAQ
+
+20.2 Why Require GNU M4?
+========================
+
+ Why does Autoconf require GNU M4?
+
+ Many M4 implementations have hard-coded limitations on the size and
+number of macros that Autoconf exceeds. They also lack several builtin
+macros that it would be difficult to get along without in a
+sophisticated application like Autoconf, including:
+
+ m4_builtin
+ m4_indir
+ m4_bpatsubst
+ __file__
+ __line__
+
+ Autoconf requires version 1.4.6 or later of GNU M4.
+
+ Since only software maintainers need to use Autoconf, and since GNU
+M4 is simple to configure and install, it seems reasonable to require
+GNU M4 to be installed also. Many maintainers of GNU and other free
+software already have most of the GNU utilities installed, since they
+prefer them.
+
+
+File: autoconf.info, Node: Bootstrapping, Next: Why Not Imake, Prev: Why GNU M4, Up: FAQ
+
+20.3 How Can I Bootstrap?
+=========================
+
+ If Autoconf requires GNU M4 and GNU M4 has an Autoconf
+ `configure' script, how do I bootstrap? It seems like a chicken
+ and egg problem!
+
+ This is a misunderstanding. Although GNU M4 does come with a
+`configure' script produced by Autoconf, Autoconf is not required in
+order to run the script and install GNU M4. Autoconf is only required
+if you want to change the M4 `configure' script, which few people have
+to do (mainly its maintainer).
+
+
+File: autoconf.info, Node: Why Not Imake, Next: Defining Directories, Prev: Bootstrapping, Up: FAQ
+
+20.4 Why Not Imake?
+===================
+
+ Why not use Imake instead of `configure' scripts?
+
+ Several people have written addressing this question, so adaptations
+of their explanations are included here.
+
+ The following answer is based on one written by Richard Pixley:
+
+ Autoconf generated scripts frequently work on machines that it has
+ never been set up to handle before. That is, it does a good job of
+ inferring a configuration for a new system. Imake cannot do this.
+
+ Imake uses a common database of host specific data. For X11, this
+ makes sense because the distribution is made as a collection of
+ tools, by one central authority who has control over the database.
+
+ GNU tools are not released this way. Each GNU tool has a
+ maintainer; these maintainers are scattered across the world.
+ Using a common database would be a maintenance nightmare.
+ Autoconf may appear to be this kind of database, but in fact it is
+ not. Instead of listing host dependencies, it lists program
+ requirements.
+
+ If you view the GNU suite as a collection of native tools, then the
+ problems are similar. But the GNU development tools can be
+ configured as cross tools in almost any host+target permutation.
+ All of these configurations can be installed concurrently. They
+ can even be configured to share host independent files across
+ hosts. Imake doesn't address these issues.
+
+ Imake templates are a form of standardization. The GNU coding
+ standards address the same issues without necessarily imposing the
+ same restrictions.
+
+ Here is some further explanation, written by Per Bothner:
+
+ One of the advantages of Imake is that it is easy to generate large
+ makefiles using the `#include' and macro mechanisms of `cpp'.
+ However, `cpp' is not programmable: it has limited conditional
+ facilities, and no looping. And `cpp' cannot inspect its
+ environment.
+
+ All of these problems are solved by using `sh' instead of `cpp'.
+ The shell is fully programmable, has macro substitution, can
+ execute (or source) other shell scripts, and can inspect its
+ environment.
+
+ Paul Eggert elaborates more:
+
+ With Autoconf, installers need not assume that Imake itself is
+ already installed and working well. This may not seem like much
+ of an advantage to people who are accustomed to Imake. But on
+ many hosts Imake is not installed or the default installation is
+ not working well, and requiring Imake to install a package hinders
+ the acceptance of that package on those hosts. For example, the
+ Imake template and configuration files might not be installed
+ properly on a host, or the Imake build procedure might wrongly
+ assume that all source files are in one big directory tree, or the
+ Imake configuration might assume one compiler whereas the package
+ or the installer needs to use another, or there might be a version
+ mismatch between the Imake expected by the package and the Imake
+ supported by the host. These problems are much rarer with
+ Autoconf, where each package comes with its own independent
+ configuration processor.
+
+ Also, Imake often suffers from unexpected interactions between
+ `make' and the installer's C preprocessor. The fundamental problem
+ here is that the C preprocessor was designed to preprocess C
+ programs, not makefiles. This is much less of a problem with
+ Autoconf, which uses the general-purpose preprocessor M4, and
+ where the package's author (rather than the installer) does the
+ preprocessing in a standard way.
+
+ Finally, Mark Eichin notes:
+
+ Imake isn't all that extensible, either. In order to add new
+ features to Imake, you need to provide your own project template,
+ and duplicate most of the features of the existing one. This
+ means that for a sophisticated project, using the vendor-provided
+ Imake templates fails to provide any leverage--since they don't
+ cover anything that your own project needs (unless it is an X11
+ program).
+
+ On the other side, though:
+
+ The one advantage that Imake has over `configure': `Imakefile'
+ files tend to be much shorter (likewise, less redundant) than
+ `Makefile.in' files. There is a fix to this, however--at least
+ for the Kerberos V5 tree, we've modified things to call in common
+ `post.in' and `pre.in' makefile fragments for the entire tree.
+ This means that a lot of common things don't have to be
+ duplicated, even though they normally are in `configure' setups.
+
+
+File: autoconf.info, Node: Defining Directories, Next: Autom4te Cache, Prev: Why Not Imake, Up: FAQ
+
+20.5 How Do I `#define' Installation Directories?
+=================================================
+
+ My program needs library files, installed in `datadir' and
+ similar. If I use
+ AC_DEFINE_UNQUOTED([DATADIR], [$datadir],
+ [Define to the read-only architecture-independent
+ data directory.])
+
+ I get
+ #define DATADIR "${prefix}/share"
+
+As already explained, this behavior is on purpose, mandated by the GNU
+Coding Standards, see *note Installation Directory Variables::. There
+are several means to achieve a similar goal:
+
+ - Do not use `AC_DEFINE' but use your makefile to pass the actual
+ value of `datadir' via compilation flags. *Note Installation
+ Directory Variables::, for the details.
+
+ - This solution can be simplified when compiling a program: you may
+ either extend the `CPPFLAGS':
+
+ CPPFLAGS = -DDATADIR='"$(datadir)"' @CPPFLAGS@
+
+ If you are using Automake, you should use `AM_CPPFLAGS' instead:
+
+ AM_CPPFLAGS = -DDATADIR='"$(datadir)"'
+
+ Alternatively, create a dedicated header file:
+
+ DISTCLEANFILES = myprog-paths.h
+ myprog-paths.h: Makefile
+ echo '#define DATADIR "$(datadir)"' >$@
+
+ The gnulib module `configmake' provides such a header with all the
+ standard directory variables defined, *note configmake:
+ (gnulib)configmake.
+
+ - Use `AC_DEFINE' but have `configure' compute the literal value of
+ `datadir' and others. Many people have wrapped macros to automate
+ this task; for an example, see the macro `AC_DEFINE_DIR' from the
+ Autoconf Macro Archive
+ (http://www.gnu.org/software/autoconf-archive/).
+
+ This solution does not conform to the GNU Coding Standards.
+
+ - Note that all the previous solutions hard wire the absolute name of
+ these directories in the executables, which is not a good
+ property. You may try to compute the names relative to `prefix',
+ and try to find `prefix' at runtime, this way your package is
+ relocatable.
+
+
+File: autoconf.info, Node: Autom4te Cache, Next: Present But Cannot Be Compiled, Prev: Defining Directories, Up: FAQ
+
+20.6 What is `autom4te.cache'?
+==============================
+
+ What is this directory `autom4te.cache'? Can I safely remove it?
+
+ In the GNU Build System, `configure.ac' plays a central role and is
+read by many tools: `autoconf' to create `configure', `autoheader' to
+create `config.h.in', `automake' to create `Makefile.in', `autoscan' to
+check the completeness of `configure.ac', `autoreconf' to check the GNU
+Build System components that are used. To "read `configure.ac'"
+actually means to compile it with M4, which can be a long process for
+complex `configure.ac'.
+
+ This is why all these tools, instead of running directly M4, invoke
+`autom4te' (*note autom4te Invocation::) which, while answering to a
+specific demand, stores additional information in `autom4te.cache' for
+future runs. For instance, if you run `autoconf', behind the scenes,
+`autom4te' also stores information for the other tools, so that when
+you invoke `autoheader' or `automake' etc., reprocessing `configure.ac'
+is not needed. The speed up is frequently 30%, and is increasing with
+the size of `configure.ac'.
+
+ But it is and remains being simply a cache: you can safely remove it.
+
+
+ Can I permanently get rid of it?
+
+ The creation of this cache can be disabled from `~/.autom4te.cfg',
+see *note Customizing autom4te::, for more details. You should be
+aware that disabling the cache slows down the Autoconf test suite by
+40%. The more GNU Build System components are used, the more the cache
+is useful; for instance running `autoreconf -f' on the Core Utilities
+is twice slower without the cache _although `--force' implies that the
+cache is not fully exploited_, and eight times slower than without
+`--force'.
+
+
+File: autoconf.info, Node: Present But Cannot Be Compiled, Next: Expanded Before Required, Prev: Autom4te Cache, Up: FAQ
+
+20.7 Header Present But Cannot Be Compiled
+==========================================
+
+The most important guideline to bear in mind when checking for features
+is to mimic as much as possible the intended use. Unfortunately, old
+versions of `AC_CHECK_HEADER' and `AC_CHECK_HEADERS' failed to follow
+this idea, and called the preprocessor, instead of the compiler, to
+check for headers. As a result, incompatibilities between headers went
+unnoticed during configuration, and maintainers finally had to deal
+with this issue elsewhere.
+
+ The transition began with Autoconf 2.56. As of Autoconf 2.64 both
+checks are performed, and `configure' complains loudly if the compiler
+and the preprocessor do not agree. However, only the compiler result
+is considered.
+
+ Consider the following example:
+
+ $ cat number.h
+ typedef int number;
+ $ cat pi.h
+ const number pi = 3;
+ $ cat configure.ac
+ AC_INIT([Example], [1.0], [bug-example@example.org])
+ AC_CHECK_HEADERS([pi.h])
+ $ autoconf -Wall
+ $ ./configure
+ checking for gcc... gcc
+ checking for C compiler default output file name... a.out
+ checking whether the C compiler works... yes
+ checking whether we are cross compiling... no
+ checking for suffix of executables...
+ checking for suffix of object files... o
+ checking whether we are using the GNU C compiler... yes
+ checking whether gcc accepts -g... yes
+ checking for gcc option to accept ISO C89... none needed
+ checking how to run the C preprocessor... gcc -E
+ checking for grep that handles long lines and -e... grep
+ checking for egrep... grep -E
+ checking for ANSI C header files... yes
+ checking for sys/types.h... yes
+ checking for sys/stat.h... yes
+ checking for stdlib.h... yes
+ checking for string.h... yes
+ checking for memory.h... yes
+ checking for strings.h... yes
+ checking for inttypes.h... yes
+ checking for stdint.h... yes
+ checking for unistd.h... yes
+ checking pi.h usability... no
+ checking pi.h presence... yes
+ configure: WARNING: pi.h: present but cannot be compiled
+ configure: WARNING: pi.h: check for missing prerequisite headers?
+ configure: WARNING: pi.h: see the Autoconf documentation
+ configure: WARNING: pi.h: section "Present But Cannot Be Compiled"
+ configure: WARNING: pi.h: proceeding with the compiler's result
+ configure: WARNING: ## -------------------------------------- ##
+ configure: WARNING: ## Report this to bug-example@example.org ##
+ configure: WARNING: ## -------------------------------------- ##
+ checking for pi.h... yes
+
+The proper way the handle this case is using the fourth argument (*note
+Generic Headers::):
+
+ $ cat configure.ac
+ AC_INIT([Example], [1.0], [bug-example@example.org])
+ AC_CHECK_HEADERS([number.h pi.h], [], [],
+ [[#ifdef HAVE_NUMBER_H
+ # include <number.h>
+ #endif
+ ]])
+ $ autoconf -Wall
+ $ ./configure
+ checking for gcc... gcc
+ checking for C compiler default output... a.out
+ checking whether the C compiler works... yes
+ checking whether we are cross compiling... no
+ checking for suffix of executables...
+ checking for suffix of object files... o
+ checking whether we are using the GNU C compiler... yes
+ checking whether gcc accepts -g... yes
+ checking for gcc option to accept ANSI C... none needed
+ checking for number.h... yes
+ checking for pi.h... yes
+
+ See *note Particular Headers::, for a list of headers with their
+prerequisites.
+
+
+File: autoconf.info, Node: Expanded Before Required, Next: Debugging, Prev: Present But Cannot Be Compiled, Up: FAQ
+
+20.8 Expanded Before Required
+=============================
+
+Older versions of Autoconf silently built files with incorrect ordering
+between dependent macros if an outer macro first expanded, then later
+indirectly required, an inner macro. Starting with Autoconf 2.64, this
+situation no longer generates out-of-order code, but results in
+duplicate output and a syntax warning:
+
+ $ cat configure.ac
+ =>AC_DEFUN([TESTA], [[echo in A
+ =>if test -n "$SEEN_A" ; then echo duplicate ; fi
+ =>SEEN_A=:]])
+ =>AC_DEFUN([TESTB], [AC_REQUIRE([TESTA])[echo in B
+ =>if test -z "$SEEN_A" ; then echo bug ; fi]])
+ =>AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]])
+ =>AC_DEFUN([OUTER], [[echo in OUTER]
+ =>TESTA
+ =>TESTC])
+ =>AC_INIT
+ =>OUTER
+ =>AC_OUTPUT
+ $ autoconf
+ =>configure.ac:11: warning: AC_REQUIRE:
+ => `TESTA' was expanded before it was required
+ =>configure.ac:4: TESTB is expanded from...
+ =>configure.ac:6: TESTC is expanded from...
+ =>configure.ac:7: OUTER is expanded from...
+ =>configure.ac:11: the top level
+
+To avoid this warning, decide what purpose the macro in question serves.
+If it only needs to be expanded once (for example, if it provides
+initialization text used by later macros), then the simplest fix is to
+change the macro to be declared with `AC_DEFUN_ONCE' (*note One-Shot
+Macros::), although this only works in Autoconf 2.64 and newer. A more
+portable fix is to change all instances of direct calls to instead go
+through `AC_REQUIRE' (*note Prerequisite Macros::). If, instead, the
+macro is parameterized by arguments or by the current definition of
+other macros in the m4 environment, then the macro should always be
+directly expanded instead of required.
+
+ For another case study, consider this example trimmed down from an
+actual package. Originally, the package contained shell code and
+multiple macro invocations at the top level of `configure.ac':
+
+ AC_DEFUN([FOO], [AC_COMPILE_IFELSE([...])])
+ foobar=
+ AC_PROG_CC
+ FOO
+
+but that was getting complex, so the author wanted to offload some of
+the text into a new macro in another file included via `aclocal.m4'.
+The nai"ve approach merely wraps the text in a new macro:
+
+ AC_DEFUN([FOO], [AC_COMPILE_IFELSE([...])])
+ AC_DEFUN([BAR], [
+ foobar=
+ AC_PROG_CC
+ FOO
+ ])
+ BAR
+
+With older versions of Autoconf, the setting of `foobar=' occurs before
+the single compiler check, as the author intended. But with Autoconf
+2.64, this issues the "expanded before it was required" warning for
+`AC_PROG_CC', and outputs two copies of the compiler check, one before
+`foobar=', and one after. To understand why this is happening,
+remember that the use of `AC_COMPILE_IFELSE' includes a call to
+`AC_REQUIRE([AC_PROG_CC])' under the hood. According to the documented
+semantics of `AC_REQUIRE', this means that `AC_PROG_CC' _must_ occur
+before the body of the outermost `AC_DEFUN', which in this case is
+`BAR', thus preceding the use of `foobar='. The older versions of
+Autoconf were broken with regards to the rules of `AC_REQUIRE', which
+explains why the code changed from one over to two copies of
+`AC_PROG_CC' when upgrading autoconf. In other words, the author was
+unknowingly relying on a bug exploit to get the desired results, and
+that exploit broke once the bug was fixed.
+
+ So, what recourse does the author have, to restore their intended
+semantics of setting `foobar=' prior to a single compiler check,
+regardless of whether Autoconf 2.63 or 2.64 is used? One idea is to
+remember that only `AC_DEFUN' is impacted by `AC_REQUIRE'; there is
+always the possibility of using the lower-level `m4_define':
+
+ AC_DEFUN([FOO], [AC_COMPILE_IFELSE([...])])
+ m4_define([BAR], [
+ foobar=
+ AC_PROG_CC
+ FOO
+ ])
+ BAR
+
+This works great if everything is in the same file. However, it does
+not help in the case where the author wants to have `aclocal' find the
+definition of `BAR' from its own file, since `aclocal' requires the use
+of `AC_DEFUN'. In this case, a better fix is to recognize that if
+`BAR' also uses `AC_REQUIRE', then there will no longer be direct
+expansion prior to a subsequent require. Then, by creating yet another
+helper macro, the author can once again guarantee a single invocation of
+`AC_PROG_CC', which will still occur after `foobar='. The author can
+also use `AC_BEFORE' to make sure no other macro appearing before `BAR'
+has triggered an unwanted expansion of `AC_PROG_CC'.
+
+ AC_DEFUN([FOO], [AC_COMPILE_IFELSE([...])])
+ AC_DEFUN([BEFORE_CC], [
+ foobar=
+ ])
+ AC_DEFUN([BAR], [
+ AC_BEFORE([$0], [AC_PROG_CC])dnl
+ AC_REQUIRE([BEFORE_CC])dnl
+ AC_REQUIRE([AC_PROG_CC])dnl
+ FOO
+ ])
+ BAR
+
+
+File: autoconf.info, Node: Debugging, Prev: Expanded Before Required, Up: FAQ
+
+20.9 Debugging `configure' scripts
+==================================
+
+While in general, `configure' scripts generated by Autoconf strive to
+be fairly portable to various systems, compilers, shells, and other
+tools, it may still be necessary to debug a failing test, broken script
+or makefile, or fix or override an incomplete, faulty, or erroneous
+test, especially during macro development. Failures can occur at all
+levels, in M4 syntax or semantics, shell script issues, or due to bugs
+in the test or the tools invoked by `configure'. Together with the
+rather arcane error message that `m4' and `make' may produce when their
+input contains syntax errors, this can make debugging rather painful.
+
+ Nevertheless, here is a list of hints and strategies that may help:
+
+ * When `autoconf' fails, common causes for error include:
+
+ * mismatched or unbalanced parentheses or braces (*note
+ Balancing Parentheses::),
+
+ * under- or overquoted macro arguments (*note Autoconf
+ Language::, *note Quoting and Parameters::, *note Quotation
+ and Nested Macros::),
+
+ * spaces between macro name and opening parenthesis (*note
+ Autoconf Language::).
+
+ Typically, it helps to go back to the last working version of the
+ input and compare the differences for each of these errors.
+ Another possibility is to sprinkle pairs of `m4_traceon' and
+ `m4_traceoff' judiciously in the code, either without a parameter
+ or listing some macro names and watch `m4' expand its input
+ verbosely (*note Debugging via autom4te::).
+
+ * Sometimes `autoconf' succeeds but the generated `configure' script
+ has invalid shell syntax. You can detect this case by running
+ `bash -n configure' or `sh -n configure'. If this command fails,
+ the same tips apply, as if `autoconf' had failed.
+
+ * Debugging `configure' script execution may be done by sprinkling
+ pairs of `set -x' and `set +x' into the shell script before and
+ after the region that contains a bug. Running the whole script
+ with `SHELL -vx ./configure 2>&1 | tee LOG-FILE' with a decent
+ SHELL may work, but produces lots of output. Here, it can help to
+ search for markers like `checking for' a particular test in the
+ LOG-FILE.
+
+ * Alternatively, you might use a shell with debugging capabilities
+ like bashdb (http://bashdb.sourceforge.net/).
+
+ * When `configure' tests produce invalid results for your system, it
+ may be necessary to override them:
+
+ * For programs, tools or libraries variables, preprocessor,
+ compiler, or linker flags, it is often sufficient to override
+ them at `make' run time with some care (*note Macros and
+ Submakes::). Since this normally won't cause `configure' to
+ be run again with these changed settings, it may fail if the
+ changed variable would have caused different test results
+ from `configure', so this may work only for simple
+ differences.
+
+ * Most tests which produce their result in a substituted
+ variable allow to override the test by setting the variable
+ on the `configure' command line (*note Compilers and
+ Options::, *note Defining Variables::, *note Particular
+ Systems::).
+
+ * Many tests store their result in a cache variable (*note
+ Caching Results::). This lets you override them either on the
+ `configure' command line as above, or through a primed cache
+ or site file (*note Cache Files::, *note Site Defaults::).
+ The name of a cache variable is documented with a test macro
+ or may be inferred from *note Cache Variable Names::; the
+ precise semantics of undocumented variables are often
+ internal details, subject to change.
+
+ * Alternatively, `configure' may produce invalid results because of
+ uncaught programming errors, in your package or in an upstream
+ library package. For example, when `AC_CHECK_LIB' fails to find a
+ library with a specified function, always check `config.log'. This
+ will reveal the exact error that produced the failing result: the
+ library linked by `AC_CHECK_LIB' probably has a fatal bug.
+
+ Conversely, as macro author, you can make it easier for users of your
+macro:
+
+ * by minimizing dependencies between tests and between test results
+ as far as possible,
+
+ * by using `make' variables to factorize and allow override of
+ settings at `make' run time,
+
+ * by honoring the GNU Coding Standards and not overriding flags
+ reserved for the user except temporarily during `configure' tests,
+
+ * by not requiring users of your macro to use the cache variables.
+ Instead, expose the result of the test via RUN-IF-TRUE and
+ RUN-IF-FALSE parameters. If the result is not a boolean, then
+ provide it through documented shell variables.
+
+
+File: autoconf.info, Node: History, Next: GNU Free Documentation License, Prev: FAQ, Up: Top
+
+21 History of Autoconf
+**********************
+
+_This chapter was written by the original author, David MacKenzie._
+
+ You may be wondering, Why was Autoconf originally written? How did
+it get into its present form? (Why does it look like gorilla spit?) If
+you're not wondering, then this chapter contains no information useful
+to you, and you might as well skip it. If you _are_ wondering, then
+let there be light...
+
+* Menu:
+
+* Genesis:: Prehistory and naming of `configure'
+* Exodus:: The plagues of M4 and Perl
+* Leviticus:: The priestly code of portability arrives
+* Numbers:: Growth and contributors
+* Deuteronomy:: Approaching the promises of easy configuration
+
+
+File: autoconf.info, Node: Genesis, Next: Exodus, Up: History
+
+21.1 Genesis
+============
+
+In June 1991 I was maintaining many of the GNU utilities for the Free
+Software Foundation. As they were ported to more platforms and more
+programs were added, the number of `-D' options that users had to
+select in the makefile (around 20) became burdensome. Especially for
+me--I had to test each new release on a bunch of different systems. So
+I wrote a little shell script to guess some of the correct settings for
+the fileutils package, and released it as part of fileutils 2.0. That
+`configure' script worked well enough that the next month I adapted it
+(by hand) to create similar `configure' scripts for several other GNU
+utilities packages. Brian Berliner also adapted one of my scripts for
+his CVS revision control system.
+
+ Later that summer, I learned that Richard Stallman and Richard Pixley
+were developing similar scripts to use in the GNU compiler tools; so I
+adapted my `configure' scripts to support their evolving interface:
+using the file name `Makefile.in' as the templates; adding `+srcdir',
+the first option (of many); and creating `config.status' files.
+
+
+File: autoconf.info, Node: Exodus, Next: Leviticus, Prev: Genesis, Up: History
+
+21.2 Exodus
+===========
+
+As I got feedback from users, I incorporated many improvements, using
+Emacs to search and replace, cut and paste, similar changes in each of
+the scripts. As I adapted more GNU utilities packages to use
+`configure' scripts, updating them all by hand became impractical.
+Rich Murphey, the maintainer of the GNU graphics utilities, sent me
+mail saying that the `configure' scripts were great, and asking if I
+had a tool for generating them that I could send him. No, I thought,
+but I should! So I started to work out how to generate them. And the
+journey from the slavery of hand-written `configure' scripts to the
+abundance and ease of Autoconf began.
+
+ Cygnus `configure', which was being developed at around that time,
+is table driven; it is meant to deal mainly with a discrete number of
+system types with a small number of mainly unguessable features (such as
+details of the object file format). The automatic configuration system
+that Brian Fox had developed for Bash takes a similar approach. For
+general use, it seems to me a hopeless cause to try to maintain an
+up-to-date database of which features each variant of each operating
+system has. It's easier and more reliable to check for most features on
+the fly--especially on hybrid systems that people have hacked on
+locally or that have patches from vendors installed.
+
+ I considered using an architecture similar to that of Cygnus
+`configure', where there is a single `configure' script that reads
+pieces of `configure.in' when run. But I didn't want to have to
+distribute all of the feature tests with every package, so I settled on
+having a different `configure' made from each `configure.in' by a
+preprocessor. That approach also offered more control and flexibility.
+
+ I looked briefly into using the Metaconfig package, by Larry Wall,
+Harlan Stenn, and Raphael Manfredi, but I decided not to for several
+reasons. The `Configure' scripts it produces are interactive, which I
+find quite inconvenient; I didn't like the ways it checked for some
+features (such as library functions); I didn't know that it was still
+being maintained, and the `Configure' scripts I had seen didn't work on
+many modern systems (such as System V R4 and NeXT); it wasn't flexible
+in what it could do in response to a feature's presence or absence; I
+found it confusing to learn; and it was too big and complex for my
+needs (I didn't realize then how much Autoconf would eventually have to
+grow).
+
+ I considered using Perl to generate my style of `configure' scripts,
+but decided that M4 was better suited to the job of simple textual
+substitutions: it gets in the way less, because output is implicit.
+Plus, everyone already has it. (Initially I didn't rely on the GNU
+extensions to M4.) Also, some of my friends at the University of
+Maryland had recently been putting M4 front ends on several programs,
+including `tvtwm', and I was interested in trying out a new language.
+
+
+File: autoconf.info, Node: Leviticus, Next: Numbers, Prev: Exodus, Up: History
+
+21.3 Leviticus
+==============
+
+Since my `configure' scripts determine the system's capabilities
+automatically, with no interactive user intervention, I decided to call
+the program that generates them Autoconfig. But with a version number
+tacked on, that name would be too long for old Unix file systems, so I
+shortened it to Autoconf.
+
+ In the fall of 1991 I called together a group of fellow questers
+after the Holy Grail of portability (er, that is, alpha testers) to
+give me feedback as I encapsulated pieces of my handwritten scripts in
+M4 macros and continued to add features and improve the techniques used
+in the checks. Prominent among the testers were Franc,ois Pinard, who
+came up with the idea of making an Autoconf shell script to run M4 and
+check for unresolved macro calls; Richard Pixley, who suggested running
+the compiler instead of searching the file system to find include files
+and symbols, for more accurate results; Karl Berry, who got Autoconf to
+configure TeX and added the macro index to the documentation; and Ian
+Lance Taylor, who added support for creating a C header file as an
+alternative to putting `-D' options in a makefile, so he could use
+Autoconf for his UUCP package. The alpha testers cheerfully adjusted
+their files again and again as the names and calling conventions of the
+Autoconf macros changed from release to release. They all contributed
+many specific checks, great ideas, and bug fixes.
+
+
+File: autoconf.info, Node: Numbers, Next: Deuteronomy, Prev: Leviticus, Up: History
+
+21.4 Numbers
+============
+
+In July 1992, after months of alpha testing, I released Autoconf 1.0,
+and converted many GNU packages to use it. I was surprised by how
+positive the reaction to it was. More people started using it than I
+could keep track of, including people working on software that wasn't
+part of the GNU Project (such as TCL, FSP, and Kerberos V5). Autoconf
+continued to improve rapidly, as many people using the `configure'
+scripts reported problems they encountered.
+
+ Autoconf turned out to be a good torture test for M4 implementations.
+Unix M4 started to dump core because of the length of the macros that
+Autoconf defined, and several bugs showed up in GNU M4 as well.
+Eventually, we realized that we needed to use some features that only
+GNU M4 has. 4.3BSD M4, in particular, has an impoverished set of
+builtin macros; the System V version is better, but still doesn't
+provide everything we need.
+
+ More development occurred as people put Autoconf under more stresses
+(and to uses I hadn't anticipated). Karl Berry added checks for X11.
+david zuhn contributed C++ support. Franc,ois Pinard made it diagnose
+invalid arguments. Jim Blandy bravely coerced it into configuring GNU
+Emacs, laying the groundwork for several later improvements. Roland
+McGrath got it to configure the GNU C Library, wrote the `autoheader'
+script to automate the creation of C header file templates, and added a
+`--verbose' option to `configure'. Noah Friedman added the
+`--autoconf-dir' option and `AC_MACRODIR' environment variable. (He
+also coined the term "autoconfiscate" to mean "adapt a software package
+to use Autoconf".) Roland and Noah improved the quoting protection in
+`AC_DEFINE' and fixed many bugs, especially when I got sick of dealing
+with portability problems from February through June, 1993.
+
+
+File: autoconf.info, Node: Deuteronomy, Prev: Numbers, Up: History
+
+21.5 Deuteronomy
+================
+
+A long wish list for major features had accumulated, and the effect of
+several years of patching by various people had left some residual
+cruft. In April 1994, while working for Cygnus Support, I began a major
+revision of Autoconf. I added most of the features of the Cygnus
+`configure' that Autoconf had lacked, largely by adapting the relevant
+parts of Cygnus `configure' with the help of david zuhn and Ken
+Raeburn. These features include support for using `config.sub',
+`config.guess', `--host', and `--target'; making links to files; and
+running `configure' scripts in subdirectories. Adding these features
+enabled Ken to convert GNU `as', and Rob Savoye to convert DejaGNU, to
+using Autoconf.
+
+ I added more features in response to other peoples' requests. Many
+people had asked for `configure' scripts to share the results of the
+checks between runs, because (particularly when configuring a large
+source tree, like Cygnus does) they were frustratingly slow. Mike
+Haertel suggested adding site-specific initialization scripts. People
+distributing software that had to unpack on MS-DOS asked for a way to
+override the `.in' extension on the file names, which produced file
+names like `config.h.in' containing two dots. Jim Avera did an
+extensive examination of the problems with quoting in `AC_DEFINE' and
+`AC_SUBST'; his insights led to significant improvements. Richard
+Stallman asked that compiler output be sent to `config.log' instead of
+`/dev/null', to help people debug the Emacs `configure' script.
+
+ I made some other changes because of my dissatisfaction with the
+quality of the program. I made the messages showing results of the
+checks less ambiguous, always printing a result. I regularized the
+names of the macros and cleaned up coding style inconsistencies. I
+added some auxiliary utilities that I had developed to help convert
+source code packages to use Autoconf. With the help of Franc,ois
+Pinard, I made the macros not interrupt each others' messages. (That
+feature revealed some performance bottlenecks in GNU M4, which he
+hastily corrected!) I reorganized the documentation around problems
+people want to solve. And I began a test suite, because experience had
+shown that Autoconf has a pronounced tendency to regress when we change
+it.
+
+ Again, several alpha testers gave invaluable feedback, especially
+Franc,ois Pinard, Jim Meyering, Karl Berry, Rob Savoye, Ken Raeburn,
+and Mark Eichin.
+
+ Finally, version 2.0 was ready. And there was much rejoicing. (And
+I have free time again. I think. Yeah, right.)
+
+
+File: autoconf.info, Node: GNU Free Documentation License, Next: Indices, Prev: History, Up: Top
+
+Appendix A GNU Free Documentation License
+*****************************************
+
+ Version 1.3, 3 November 2008
+
+ Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+ `http://fsf.org/'
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ 0. PREAMBLE
+
+ The purpose of this License is to make a manual, textbook, or other
+ functional and useful document "free" in the sense of freedom: to
+ assure everyone the effective freedom to copy and redistribute it,
+ with or without modifying it, either commercially or
+ noncommercially. Secondarily, this License preserves for the
+ author and publisher a way to get credit for their work, while not
+ being considered responsible for modifications made by others.
+
+ This License is a kind of "copyleft", which means that derivative
+ works of the document must themselves be free in the same sense.
+ It complements the GNU General Public License, which is a copyleft
+ license designed for free software.
+
+ We have designed this License in order to use it for manuals for
+ free software, because free software needs free documentation: a
+ free program should come with manuals providing the same freedoms
+ that the software does. But this License is not limited to
+ software manuals; it can be used for any textual work, regardless
+ of subject matter or whether it is published as a printed book.
+ We recommend this License principally for works whose purpose is
+ instruction or reference.
+
+ 1. APPLICABILITY AND DEFINITIONS
+
+ This License applies to any manual or other work, in any medium,
+ that contains a notice placed by the copyright holder saying it
+ can be distributed under the terms of this License. Such a notice
+ grants a world-wide, royalty-free license, unlimited in duration,
+ to use that work under the conditions stated herein. The
+ "Document", below, refers to any such manual or work. Any member
+ of the public is a licensee, and is addressed as "you". You
+ accept the license if you copy, modify or distribute the work in a
+ way requiring permission under copyright law.
+
+ A "Modified Version" of the Document means any work containing the
+ Document or a portion of it, either copied verbatim, or with
+ modifications and/or translated into another language.
+
+ A "Secondary Section" is a named appendix or a front-matter section
+ of the Document that deals exclusively with the relationship of the
+ publishers or authors of the Document to the Document's overall
+ subject (or to related matters) and contains nothing that could
+ fall directly within that overall subject. (Thus, if the Document
+ is in part a textbook of mathematics, a Secondary Section may not
+ explain any mathematics.) The relationship could be a matter of
+ historical connection with the subject or with related matters, or
+ of legal, commercial, philosophical, ethical or political position
+ regarding them.
+
+ The "Invariant Sections" are certain Secondary Sections whose
+ titles are designated, as being those of Invariant Sections, in
+ the notice that says that the Document is released under this
+ License. If a section does not fit the above definition of
+ Secondary then it is not allowed to be designated as Invariant.
+ The Document may contain zero Invariant Sections. If the Document
+ does not identify any Invariant Sections then there are none.
+
+ The "Cover Texts" are certain short passages of text that are
+ listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+ that says that the Document is released under this License. A
+ Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+ be at most 25 words.
+
+ A "Transparent" copy of the Document means a machine-readable copy,
+ represented in a format whose specification is available to the
+ general public, that is suitable for revising the document
+ straightforwardly with generic text editors or (for images
+ composed of pixels) generic paint programs or (for drawings) some
+ widely available drawing editor, and that is suitable for input to
+ text formatters or for automatic translation to a variety of
+ formats suitable for input to text formatters. A copy made in an
+ otherwise Transparent file format whose markup, or absence of
+ markup, has been arranged to thwart or discourage subsequent
+ modification by readers is not Transparent. An image format is
+ not Transparent if used for any substantial amount of text. A
+ copy that is not "Transparent" is called "Opaque".
+
+ Examples of suitable formats for Transparent copies include plain
+ ASCII without markup, Texinfo input format, LaTeX input format,
+ SGML or XML using a publicly available DTD, and
+ standard-conforming simple HTML, PostScript or PDF designed for
+ human modification. Examples of transparent image formats include
+ PNG, XCF and JPG. Opaque formats include proprietary formats that
+ can be read and edited only by proprietary word processors, SGML or
+ XML for which the DTD and/or processing tools are not generally
+ available, and the machine-generated HTML, PostScript or PDF
+ produced by some word processors for output purposes only.
+
+ The "Title Page" means, for a printed book, the title page itself,
+ plus such following pages as are needed to hold, legibly, the
+ material this License requires to appear in the title page. For
+ works in formats which do not have any title page as such, "Title
+ Page" means the text near the most prominent appearance of the
+ work's title, preceding the beginning of the body of the text.
+
+ The "publisher" means any person or entity that distributes copies
+ of the Document to the public.
+
+ A section "Entitled XYZ" means a named subunit of the Document
+ whose title either is precisely XYZ or contains XYZ in parentheses
+ following text that translates XYZ in another language. (Here XYZ
+ stands for a specific section name mentioned below, such as
+ "Acknowledgements", "Dedications", "Endorsements", or "History".)
+ To "Preserve the Title" of such a section when you modify the
+ Document means that it remains a section "Entitled XYZ" according
+ to this definition.
+
+ The Document may include Warranty Disclaimers next to the notice
+ which states that this License applies to the Document. These
+ Warranty Disclaimers are considered to be included by reference in
+ this License, but only as regards disclaiming warranties: any other
+ implication that these Warranty Disclaimers may have is void and
+ has no effect on the meaning of this License.
+
+ 2. VERBATIM COPYING
+
+ You may copy and distribute the Document in any medium, either
+ commercially or noncommercially, provided that this License, the
+ copyright notices, and the license notice saying this License
+ applies to the Document are reproduced in all copies, and that you
+ add no other conditions whatsoever to those of this License. You
+ may not use technical measures to obstruct or control the reading
+ or further copying of the copies you make or distribute. However,
+ you may accept compensation in exchange for copies. If you
+ distribute a large enough number of copies you must also follow
+ the conditions in section 3.
+
+ You may also lend copies, under the same conditions stated above,
+ and you may publicly display copies.
+
+ 3. COPYING IN QUANTITY
+
+ If you publish printed copies (or copies in media that commonly
+ have printed covers) of the Document, numbering more than 100, and
+ the Document's license notice requires Cover Texts, you must
+ enclose the copies in covers that carry, clearly and legibly, all
+ these Cover Texts: Front-Cover Texts on the front cover, and
+ Back-Cover Texts on the back cover. Both covers must also clearly
+ and legibly identify you as the publisher of these copies. The
+ front cover must present the full title with all words of the
+ title equally prominent and visible. You may add other material
+ on the covers in addition. Copying with changes limited to the
+ covers, as long as they preserve the title of the Document and
+ satisfy these conditions, can be treated as verbatim copying in
+ other respects.
+
+ If the required texts for either cover are too voluminous to fit
+ legibly, you should put the first ones listed (as many as fit
+ reasonably) on the actual cover, and continue the rest onto
+ adjacent pages.
+
+ If you publish or distribute Opaque copies of the Document
+ numbering more than 100, you must either include a
+ machine-readable Transparent copy along with each Opaque copy, or
+ state in or with each Opaque copy a computer-network location from
+ which the general network-using public has access to download
+ using public-standard network protocols a complete Transparent
+ copy of the Document, free of added material. If you use the
+ latter option, you must take reasonably prudent steps, when you
+ begin distribution of Opaque copies in quantity, to ensure that
+ this Transparent copy will remain thus accessible at the stated
+ location until at least one year after the last time you
+ distribute an Opaque copy (directly or through your agents or
+ retailers) of that edition to the public.
+
+ It is requested, but not required, that you contact the authors of
+ the Document well before redistributing any large number of
+ copies, to give them a chance to provide you with an updated
+ version of the Document.
+
+ 4. MODIFICATIONS
+
+ You may copy and distribute a Modified Version of the Document
+ under the conditions of sections 2 and 3 above, provided that you
+ release the Modified Version under precisely this License, with
+ the Modified Version filling the role of the Document, thus
+ licensing distribution and modification of the Modified Version to
+ whoever possesses a copy of it. In addition, you must do these
+ things in the Modified Version:
+
+ A. Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of
+ previous versions (which should, if there were any, be listed
+ in the History section of the Document). You may use the
+ same title as a previous version if the original publisher of
+ that version gives permission.
+
+ B. List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in
+ the Modified Version, together with at least five of the
+ principal authors of the Document (all of its principal
+ authors, if it has fewer than five), unless they release you
+ from this requirement.
+
+ C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+ D. Preserve all the copyright notices of the Document.
+
+ E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+ F. Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified
+ Version under the terms of this License, in the form shown in
+ the Addendum below.
+
+ G. Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document's
+ license notice.
+
+ H. Include an unaltered copy of this License.
+
+ I. Preserve the section Entitled "History", Preserve its Title,
+ and add to it an item stating at least the title, year, new
+ authors, and publisher of the Modified Version as given on
+ the Title Page. If there is no section Entitled "History" in
+ the Document, create one stating the title, year, authors,
+ and publisher of the Document as given on its Title Page,
+ then add an item describing the Modified Version as stated in
+ the previous sentence.
+
+ J. Preserve the network location, if any, given in the Document
+ for public access to a Transparent copy of the Document, and
+ likewise the network locations given in the Document for
+ previous versions it was based on. These may be placed in
+ the "History" section. You may omit a network location for a
+ work that was published at least four years before the
+ Document itself, or if the original publisher of the version
+ it refers to gives permission.
+
+ K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the
+ section all the substance and tone of each of the contributor
+ acknowledgements and/or dedications given therein.
+
+ L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section
+ titles.
+
+ M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+
+ N. Do not retitle any existing section to be Entitled
+ "Endorsements" or to conflict in title with any Invariant
+ Section.
+
+ O. Preserve any Warranty Disclaimers.
+
+ If the Modified Version includes new front-matter sections or
+ appendices that qualify as Secondary Sections and contain no
+ material copied from the Document, you may at your option
+ designate some or all of these sections as invariant. To do this,
+ add their titles to the list of Invariant Sections in the Modified
+ Version's license notice. These titles must be distinct from any
+ other section titles.
+
+ You may add a section Entitled "Endorsements", provided it contains
+ nothing but endorsements of your Modified Version by various
+ parties--for example, statements of peer review or that the text
+ has been approved by an organization as the authoritative
+ definition of a standard.
+
+ You may add a passage of up to five words as a Front-Cover Text,
+ and a passage of up to 25 words as a Back-Cover Text, to the end
+ of the list of Cover Texts in the Modified Version. Only one
+ passage of Front-Cover Text and one of Back-Cover Text may be
+ added by (or through arrangements made by) any one entity. If the
+ Document already includes a cover text for the same cover,
+ previously added by you or by arrangement made by the same entity
+ you are acting on behalf of, you may not add another; but you may
+ replace the old one, on explicit permission from the previous
+ publisher that added the old one.
+
+ The author(s) and publisher(s) of the Document do not by this
+ License give permission to use their names for publicity for or to
+ assert or imply endorsement of any Modified Version.
+
+ 5. COMBINING DOCUMENTS
+
+ You may combine the Document with other documents released under
+ this License, under the terms defined in section 4 above for
+ modified versions, provided that you include in the combination
+ all of the Invariant Sections of all of the original documents,
+ unmodified, and list them all as Invariant Sections of your
+ combined work in its license notice, and that you preserve all
+ their Warranty Disclaimers.
+
+ The combined work need only contain one copy of this License, and
+ multiple identical Invariant Sections may be replaced with a single
+ copy. If there are multiple Invariant Sections with the same name
+ but different contents, make the title of each such section unique
+ by adding at the end of it, in parentheses, the name of the
+ original author or publisher of that section if known, or else a
+ unique number. Make the same adjustment to the section titles in
+ the list of Invariant Sections in the license notice of the
+ combined work.
+
+ In the combination, you must combine any sections Entitled
+ "History" in the various original documents, forming one section
+ Entitled "History"; likewise combine any sections Entitled
+ "Acknowledgements", and any sections Entitled "Dedications". You
+ must delete all sections Entitled "Endorsements."
+
+ 6. COLLECTIONS OF DOCUMENTS
+
+ You may make a collection consisting of the Document and other
+ documents released under this License, and replace the individual
+ copies of this License in the various documents with a single copy
+ that is included in the collection, provided that you follow the
+ rules of this License for verbatim copying of each of the
+ documents in all other respects.
+
+ You may extract a single document from such a collection, and
+ distribute it individually under this License, provided you insert
+ a copy of this License into the extracted document, and follow
+ this License in all other respects regarding verbatim copying of
+ that document.
+
+ 7. AGGREGATION WITH INDEPENDENT WORKS
+
+ A compilation of the Document or its derivatives with other
+ separate and independent documents or works, in or on a volume of
+ a storage or distribution medium, is called an "aggregate" if the
+ copyright resulting from the compilation is not used to limit the
+ legal rights of the compilation's users beyond what the individual
+ works permit. When the Document is included in an aggregate, this
+ License does not apply to the other works in the aggregate which
+ are not themselves derivative works of the Document.
+
+ If the Cover Text requirement of section 3 is applicable to these
+ copies of the Document, then if the Document is less than one half
+ of the entire aggregate, the Document's Cover Texts may be placed
+ on covers that bracket the Document within the aggregate, or the
+ electronic equivalent of covers if the Document is in electronic
+ form. Otherwise they must appear on printed covers that bracket
+ the whole aggregate.
+
+ 8. TRANSLATION
+
+ Translation is considered a kind of modification, so you may
+ distribute translations of the Document under the terms of section
+ 4. Replacing Invariant Sections with translations requires special
+ permission from their copyright holders, but you may include
+ translations of some or all Invariant Sections in addition to the
+ original versions of these Invariant Sections. You may include a
+ translation of this License, and all the license notices in the
+ Document, and any Warranty Disclaimers, provided that you also
+ include the original English version of this License and the
+ original versions of those notices and disclaimers. In case of a
+ disagreement between the translation and the original version of
+ this License or a notice or disclaimer, the original version will
+ prevail.
+
+ If a section in the Document is Entitled "Acknowledgements",
+ "Dedications", or "History", the requirement (section 4) to
+ Preserve its Title (section 1) will typically require changing the
+ actual title.
+
+ 9. TERMINATION
+
+ You may not copy, modify, sublicense, or distribute the Document
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense, or distribute it is void,
+ and will automatically terminate your rights under this License.
+
+ However, if you cease all violation of this License, then your
+ license from a particular copyright holder is reinstated (a)
+ provisionally, unless and until the copyright holder explicitly
+ and finally terminates your license, and (b) permanently, if the
+ copyright holder fails to notify you of the violation by some
+ reasonable means prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+ reinstated permanently if the copyright holder notifies you of the
+ violation by some reasonable means, this is the first time you have
+ received notice of violation of this License (for any work) from
+ that copyright holder, and you cure the violation prior to 30 days
+ after your receipt of the notice.
+
+ Termination of your rights under this section does not terminate
+ the licenses of parties who have received copies or rights from
+ you under this License. If your rights have been terminated and
+ not permanently reinstated, receipt of a copy of some or all of
+ the same material does not give you any rights to use it.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+ The Free Software Foundation may publish new, revised versions of
+ the GNU Free Documentation License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns. See
+ `http://www.gnu.org/copyleft/'.
+
+ Each version of the License is given a distinguishing version
+ number. If the Document specifies that a particular numbered
+ version of this License "or any later version" applies to it, you
+ have the option of following the terms and conditions either of
+ that specified version or of any later version that has been
+ published (not as a draft) by the Free Software Foundation. If
+ the Document does not specify a version number of this License,
+ you may choose any version ever published (not as a draft) by the
+ Free Software Foundation. If the Document specifies that a proxy
+ can decide which future versions of this License can be used, that
+ proxy's public statement of acceptance of a version permanently
+ authorizes you to choose that version for the Document.
+
+ 11. RELICENSING
+
+ "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+ World Wide Web server that publishes copyrightable works and also
+ provides prominent facilities for anybody to edit those works. A
+ public wiki that anybody can edit is an example of such a server.
+ A "Massive Multiauthor Collaboration" (or "MMC") contained in the
+ site means any set of copyrightable works thus published on the MMC
+ site.
+
+ "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+ license published by Creative Commons Corporation, a not-for-profit
+ corporation with a principal place of business in San Francisco,
+ California, as well as future copyleft versions of that license
+ published by that same organization.
+
+ "Incorporate" means to publish or republish a Document, in whole or
+ in part, as part of another Document.
+
+ An MMC is "eligible for relicensing" if it is licensed under this
+ License, and if all works that were first published under this
+ License somewhere other than this MMC, and subsequently
+ incorporated in whole or in part into the MMC, (1) had no cover
+ texts or invariant sections, and (2) were thus incorporated prior
+ to November 1, 2008.
+
+ The operator of an MMC Site may republish an MMC contained in the
+ site under CC-BY-SA on the same site at any time before August 1,
+ 2009, provided the MMC is eligible for relicensing.
+
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+ Copyright (C) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+
+ If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with
+ the Front-Cover Texts being LIST, and with the Back-Cover Texts
+ being LIST.
+
+ If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+ If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+
+File: autoconf.info, Node: Indices, Prev: GNU Free Documentation License, Up: Top
+
+Appendix B Indices
+******************
+
+* Menu:
+
+* Environment Variable Index:: Index of environment variables used
+* Output Variable Index:: Index of variables set in output files
+* Preprocessor Symbol Index:: Index of C preprocessor symbols defined
+* Cache Variable Index:: Index of documented cache variables
+* Autoconf Macro Index:: Index of Autoconf macros
+* M4 Macro Index:: Index of M4, M4sugar, and M4sh macros
+* Autotest Macro Index:: Index of Autotest macros
+* Program & Function Index:: Index of those with portability problems
+* Concept Index:: General index
+
+
+File: autoconf.info, Node: Environment Variable Index, Next: Output Variable Index, Up: Indices
+
+B.1 Environment Variable Index
+==============================
+
+This is an alphabetical list of the environment variables that might
+influence Autoconf checks.
+
+
+* Menu:
+
+* _: Special Shell Variables.
+ (line 36)
+* BIN_SH: Special Shell Variables.
+ (line 40)
+* CC: C Compiler. (line 61)
+* CDPATH: Special Shell Variables.
+ (line 44)
+* CFLAGS <1>: C Compiler. (line 61)
+* CFLAGS: Preset Output Variables.
+ (line 23)
+* CLICOLOR_FORCE: Special Shell Variables.
+ (line 67)
+* CONFIG_COMMANDS: Obsolete config.status Use.
+ (line 11)
+* CONFIG_FILES: Obsolete config.status Use.
+ (line 15)
+* CONFIG_HEADERS: Obsolete config.status Use.
+ (line 20)
+* CONFIG_LINKS: Obsolete config.status Use.
+ (line 25)
+* CONFIG_SHELL: config.status Invocation.
+ (line 102)
+* CONFIG_SITE: Site Defaults. (line 10)
+* CONFIG_STATUS: config.status Invocation.
+ (line 108)
+* CPP: C Compiler. (line 113)
+* CPPFLAGS: Preset Output Variables.
+ (line 72)
+* CXX: C++ Compiler. (line 7)
+* CXXCPP: C++ Compiler. (line 35)
+* CXXFLAGS <1>: C++ Compiler. (line 7)
+* CXXFLAGS: Preset Output Variables.
+ (line 94)
+* CYGWIN: Obsolete Macros. (line 124)
+* DUALCASE: Special Shell Variables.
+ (line 74)
+* ENV: Special Shell Variables.
+ (line 84)
+* ERL: Erlang Compiler and Interpreter.
+ (line 29)
+* ERLC: Erlang Compiler and Interpreter.
+ (line 10)
+* ERLCFLAGS <1>: Erlang Compiler and Interpreter.
+ (line 10)
+* ERLCFLAGS: Preset Output Variables.
+ (line 120)
+* F77: Fortran Compiler. (line 19)
+* FC: Fortran Compiler. (line 44)
+* FCFLAGS <1>: Fortran Compiler. (line 44)
+* FCFLAGS: Preset Output Variables.
+ (line 126)
+* FFLAGS <1>: Fortran Compiler. (line 19)
+* FFLAGS: Preset Output Variables.
+ (line 133)
+* FPATH: Special Shell Variables.
+ (line 101)
+* GOFLAGS: Preset Output Variables.
+ (line 170)
+* GREP_OPTIONS: Special Shell Variables.
+ (line 108)
+* IFS: Special Shell Variables.
+ (line 116)
+* LANG: Special Shell Variables.
+ (line 160)
+* LANGUAGE: Special Shell Variables.
+ (line 167)
+* LC_ADDRESS: Special Shell Variables.
+ (line 177)
+* LC_ALL <1>: Special Shell Variables.
+ (line 160)
+* LC_ALL: Initialization Macros.
+ (line 14)
+* LC_COLLATE: Special Shell Variables.
+ (line 160)
+* LC_CTYPE: Special Shell Variables.
+ (line 160)
+* LC_IDENTIFICATION: Special Shell Variables.
+ (line 177)
+* LC_MEASUREMENT: Special Shell Variables.
+ (line 177)
+* LC_MESSAGES: Special Shell Variables.
+ (line 160)
+* LC_MONETARY: Special Shell Variables.
+ (line 160)
+* LC_NAME: Special Shell Variables.
+ (line 177)
+* LC_NUMERIC: Special Shell Variables.
+ (line 160)
+* LC_PAPER: Special Shell Variables.
+ (line 177)
+* LC_TELEPHONE: Special Shell Variables.
+ (line 177)
+* LC_TIME: Special Shell Variables.
+ (line 160)
+* LDFLAGS: Preset Output Variables.
+ (line 140)
+* LIBS: Preset Output Variables.
+ (line 154)
+* LINENO <1>: Special Shell Variables.
+ (line 182)
+* LINENO: Initialization Macros.
+ (line 67)
+* M4: autom4te Invocation. (line 10)
+* MAIL: Special Shell Variables.
+ (line 84)
+* MAILPATH: Special Shell Variables.
+ (line 84)
+* NULLCMD: Special Shell Variables.
+ (line 311)
+* OBJC: Objective C Compiler.
+ (line 7)
+* OBJCFLAGS <1>: Objective C Compiler.
+ (line 7)
+* OBJCFLAGS: Preset Output Variables.
+ (line 162)
+* OBJCPP: Objective C Compiler.
+ (line 26)
+* OBJCXX: Objective C++ Compiler.
+ (line 7)
+* OBJCXXCPP: Objective C++ Compiler.
+ (line 27)
+* OBJCXXFLAGS <1>: Objective C++ Compiler.
+ (line 7)
+* OBJCXXFLAGS: Preset Output Variables.
+ (line 166)
+* options: Special Shell Variables.
+ (line 318)
+* PATH_SEPARATOR: Special Shell Variables.
+ (line 322)
+* POSIXLY_CORRECT: Special Shell Variables.
+ (line 331)
+* PS1: Special Shell Variables.
+ (line 84)
+* PS2: Special Shell Variables.
+ (line 84)
+* PS4: Special Shell Variables.
+ (line 84)
+* PWD: Special Shell Variables.
+ (line 346)
+* RANDOM: Special Shell Variables.
+ (line 355)
+* SHELL: Initialization Macros.
+ (line 14)
+* SIMPLE_BACKUP_SUFFIX: autoupdate Invocation.
+ (line 16)
+* status: Special Shell Variables.
+ (line 363)
+* TMPDIR: Initialization Macros.
+ (line 77)
+* WARNINGS <1>: autom4te Invocation. (line 58)
+* WARNINGS <2>: autoheader Invocation.
+ (line 83)
+* WARNINGS <3>: autoreconf Invocation.
+ (line 97)
+* WARNINGS: autoconf Invocation. (line 62)
+* XMKMF: System Services. (line 10)
+* YACC: Particular Programs. (line 200)
+* YFLAGS: Particular Programs. (line 200)
+
+
+File: autoconf.info, Node: Output Variable Index, Next: Preprocessor Symbol Index, Prev: Environment Variable Index, Up: Indices
+
+B.2 Output Variable Index
+=========================
+
+This is an alphabetical list of the variables that Autoconf can
+substitute into files that it creates, typically one or more makefiles.
+*Note Setting Output Variables::, for more information on how this is
+done.
+
+
+* Menu:
+
+* abs_builddir: Preset Output Variables.
+ (line 177)
+* abs_srcdir: Preset Output Variables.
+ (line 199)
+* abs_top_builddir: Preset Output Variables.
+ (line 192)
+* abs_top_srcdir: Preset Output Variables.
+ (line 206)
+* ac_empty: Fortran Compiler. (line 465)
+* ALLOCA: Particular Functions.
+ (line 10)
+* AWK: Particular Programs. (line 10)
+* bindir: Installation Directory Variables.
+ (line 15)
+* build: Canonicalizing. (line 26)
+* build_alias: Canonicalizing. (line 9)
+* build_cpu: Canonicalizing. (line 26)
+* build_os: Canonicalizing. (line 26)
+* build_vendor: Canonicalizing. (line 26)
+* builddir: Preset Output Variables.
+ (line 174)
+* CC <1>: System Services. (line 49)
+* CC: C Compiler. (line 61)
+* CFLAGS <1>: C Compiler. (line 61)
+* CFLAGS: Preset Output Variables.
+ (line 23)
+* configure_input: Preset Output Variables.
+ (line 58)
+* CPP: C Compiler. (line 113)
+* CPPFLAGS: Preset Output Variables.
+ (line 72)
+* cross_compiling: Runtime. (line 71)
+* CXX: C++ Compiler. (line 7)
+* CXXCPP: C++ Compiler. (line 35)
+* CXXFLAGS <1>: C++ Compiler. (line 7)
+* CXXFLAGS: Preset Output Variables.
+ (line 94)
+* datadir: Installation Directory Variables.
+ (line 18)
+* datarootdir: Installation Directory Variables.
+ (line 22)
+* DEFS: Preset Output Variables.
+ (line 98)
+* docdir: Installation Directory Variables.
+ (line 26)
+* dvidir: Installation Directory Variables.
+ (line 30)
+* ECHO_C: Preset Output Variables.
+ (line 108)
+* ECHO_N: Preset Output Variables.
+ (line 108)
+* ECHO_T: Preset Output Variables.
+ (line 108)
+* EGREP: Particular Programs. (line 29)
+* ERL <1>: Running the Compiler.
+ (line 30)
+* ERL <2>: Language Choice. (line 40)
+* ERL: Erlang Compiler and Interpreter.
+ (line 29)
+* ERLANG_ERTS_VER: Erlang Libraries. (line 12)
+* ERLANG_INSTALL_LIB_DIR <1>: Erlang Libraries. (line 86)
+* ERLANG_INSTALL_LIB_DIR: Installation Directory Variables.
+ (line 201)
+* ERLANG_INSTALL_LIB_DIR_LIBRARY <1>: Erlang Libraries. (line 93)
+* ERLANG_INSTALL_LIB_DIR_LIBRARY: Installation Directory Variables.
+ (line 206)
+* ERLANG_LIB_DIR: Erlang Libraries. (line 28)
+* ERLANG_LIB_DIR_LIBRARY: Erlang Libraries. (line 36)
+* ERLANG_LIB_VER_LIBRARY: Erlang Libraries. (line 36)
+* ERLANG_ROOT_DIR: Erlang Libraries. (line 22)
+* ERLC <1>: Language Choice. (line 40)
+* ERLC: Erlang Compiler and Interpreter.
+ (line 10)
+* ERLCFLAGS <1>: Language Choice. (line 40)
+* ERLCFLAGS <2>: Erlang Compiler and Interpreter.
+ (line 10)
+* ERLCFLAGS: Preset Output Variables.
+ (line 120)
+* exec_prefix: Installation Directory Variables.
+ (line 33)
+* EXEEXT <1>: Obsolete Macros. (line 178)
+* EXEEXT: Compilers and Preprocessors.
+ (line 6)
+* F77: Fortran Compiler. (line 19)
+* FC: Fortran Compiler. (line 44)
+* FC_MODEXT: Fortran Compiler. (line 438)
+* FC_MODINC: Fortran Compiler. (line 465)
+* FC_MODOUT: Fortran Compiler. (line 501)
+* FCFLAGS <1>: Fortran Compiler. (line 44)
+* FCFLAGS: Preset Output Variables.
+ (line 126)
+* FCLIBS: Fortran Compiler. (line 92)
+* FFLAGS <1>: Fortran Compiler. (line 19)
+* FFLAGS: Preset Output Variables.
+ (line 133)
+* FGREP: Particular Programs. (line 36)
+* FLIBS: Fortran Compiler. (line 92)
+* GETGROUPS_LIBS: Particular Functions.
+ (line 155)
+* GETLOADAVG_LIBS: Particular Functions.
+ (line 161)
+* GOFLAGS: Preset Output Variables.
+ (line 170)
+* GREP: Particular Programs. (line 20)
+* host: Canonicalizing. (line 34)
+* host_alias: Canonicalizing. (line 9)
+* host_cpu: Canonicalizing. (line 34)
+* host_os: Canonicalizing. (line 34)
+* host_vendor: Canonicalizing. (line 34)
+* htmldir: Installation Directory Variables.
+ (line 40)
+* includedir: Installation Directory Variables.
+ (line 43)
+* infodir: Installation Directory Variables.
+ (line 46)
+* INSTALL: Particular Programs. (line 43)
+* INSTALL_DATA: Particular Programs. (line 43)
+* INSTALL_PROGRAM: Particular Programs. (line 43)
+* INSTALL_SCRIPT: Particular Programs. (line 43)
+* KMEM_GROUP: Particular Functions.
+ (line 161)
+* LDFLAGS: Preset Output Variables.
+ (line 140)
+* LEX: Particular Programs. (line 114)
+* LEX_OUTPUT_ROOT: Particular Programs. (line 114)
+* LEXLIB: Particular Programs. (line 114)
+* libdir: Installation Directory Variables.
+ (line 49)
+* libexecdir: Installation Directory Variables.
+ (line 52)
+* LIBOBJDIR: AC_LIBOBJ vs LIBOBJS.
+ (line 35)
+* LIBOBJS <1>: Particular Structures.
+ (line 26)
+* LIBOBJS <2>: Generic Functions. (line 56)
+* LIBOBJS: Particular Functions.
+ (line 161)
+* LIBS <1>: Obsolete Macros. (line 295)
+* LIBS: Preset Output Variables.
+ (line 154)
+* LN_S: Particular Programs. (line 168)
+* localedir: Installation Directory Variables.
+ (line 55)
+* localstatedir: Installation Directory Variables.
+ (line 60)
+* mandir: Installation Directory Variables.
+ (line 63)
+* MKDIR_P: Particular Programs. (line 80)
+* NEED_SETGID: Particular Functions.
+ (line 161)
+* OBJC: Objective C Compiler.
+ (line 7)
+* OBJCFLAGS <1>: Objective C Compiler.
+ (line 7)
+* OBJCFLAGS: Preset Output Variables.
+ (line 162)
+* OBJCPP: Objective C Compiler.
+ (line 26)
+* OBJCXX: Objective C++ Compiler.
+ (line 7)
+* OBJCXXCPP: Objective C++ Compiler.
+ (line 27)
+* OBJCXXFLAGS <1>: Objective C++ Compiler.
+ (line 7)
+* OBJCXXFLAGS: Preset Output Variables.
+ (line 166)
+* OBJEXT <1>: Obsolete Macros. (line 384)
+* OBJEXT: Compilers and Preprocessors.
+ (line 11)
+* oldincludedir: Installation Directory Variables.
+ (line 66)
+* OPENMP_CFLAGS: Generic Compiler Characteristics.
+ (line 64)
+* OPENMP_CXXFLAGS: Generic Compiler Characteristics.
+ (line 64)
+* OPENMP_FCFLAGS: Generic Compiler Characteristics.
+ (line 64)
+* OPENMP_FFLAGS: Generic Compiler Characteristics.
+ (line 64)
+* PACKAGE_BUGREPORT: Initializing configure.
+ (line 57)
+* PACKAGE_NAME: Initializing configure.
+ (line 45)
+* PACKAGE_STRING: Initializing configure.
+ (line 54)
+* PACKAGE_TARNAME: Initializing configure.
+ (line 48)
+* PACKAGE_URL: Initializing configure.
+ (line 61)
+* PACKAGE_VERSION: Initializing configure.
+ (line 51)
+* pdfdir: Installation Directory Variables.
+ (line 69)
+* POW_LIB: Particular Functions.
+ (line 408)
+* prefix: Installation Directory Variables.
+ (line 72)
+* program_transform_name: Transforming Names. (line 11)
+* psdir: Installation Directory Variables.
+ (line 77)
+* RANLIB: Particular Programs. (line 187)
+* sbindir: Installation Directory Variables.
+ (line 80)
+* SED: Particular Programs. (line 191)
+* SET_MAKE: Output. (line 45)
+* sharedstatedir: Installation Directory Variables.
+ (line 84)
+* srcdir: Preset Output Variables.
+ (line 195)
+* subdirs: Subdirectories. (line 12)
+* sysconfdir: Installation Directory Variables.
+ (line 88)
+* target: Canonicalizing. (line 41)
+* target_alias: Canonicalizing. (line 9)
+* target_cpu: Canonicalizing. (line 41)
+* target_os: Canonicalizing. (line 41)
+* target_vendor: Canonicalizing. (line 41)
+* tmp: Initialization Macros.
+ (line 77)
+* top_build_prefix: Preset Output Variables.
+ (line 184)
+* top_builddir: Preset Output Variables.
+ (line 180)
+* top_srcdir: Preset Output Variables.
+ (line 202)
+* X_CFLAGS: System Services. (line 30)
+* X_EXTRA_LIBS: System Services. (line 30)
+* X_LIBS: System Services. (line 30)
+* X_PRE_LIBS: System Services. (line 30)
+* YACC: Particular Programs. (line 200)
+
+
+File: autoconf.info, Node: Preprocessor Symbol Index, Next: Cache Variable Index, Prev: Output Variable Index, Up: Indices
+
+B.3 Preprocessor Symbol Index
+=============================
+
+This is an alphabetical list of the C preprocessor symbols that the
+Autoconf macros define. To work with Autoconf, C source code needs to
+use these names in `#if' or `#ifdef' directives.
+
+
+* Menu:
+
+* __CHAR_UNSIGNED__: C Compiler. (line 291)
+* __EXTENSIONS__: Posix Variants. (line 10)
+* __PROTOTYPES: C Compiler. (line 351)
+* _ALL_SOURCE <1>: Obsolete Macros. (line 20)
+* _ALL_SOURCE: Posix Variants. (line 10)
+* _FILE_OFFSET_BITS: System Services. (line 49)
+* _GNU_SOURCE <1>: Obsolete Macros. (line 234)
+* _GNU_SOURCE: Posix Variants. (line 10)
+* _LARGE_FILES: System Services. (line 49)
+* _LARGEFILE_SOURCE: Particular Functions.
+ (line 147)
+* _MINIX <1>: Obsolete Macros. (line 371)
+* _MINIX: Posix Variants. (line 10)
+* _OPENMP: Generic Compiler Characteristics.
+ (line 64)
+* _POSIX_1_SOURCE <1>: Obsolete Macros. (line 371)
+* _POSIX_1_SOURCE: Posix Variants. (line 10)
+* _POSIX_PTHREAD_SEMANTICS: Posix Variants. (line 10)
+* _POSIX_SOURCE <1>: Obsolete Macros. (line 371)
+* _POSIX_SOURCE: Posix Variants. (line 10)
+* _POSIX_VERSION: Particular Headers. (line 228)
+* _TANDEM_SOURCE: Posix Variants. (line 10)
+* ALIGNOF_TYPE: Generic Compiler Characteristics.
+ (line 30)
+* C_ALLOCA: Particular Functions.
+ (line 10)
+* C_GETLOADAVG: Particular Functions.
+ (line 161)
+* CLOSEDIR_VOID: Particular Functions.
+ (line 69)
+* const: C Compiler. (line 217)
+* CXX_NO_MINUS_C_MINUS_O: C++ Compiler. (line 48)
+* DGUX: Particular Functions.
+ (line 161)
+* DIRENT: Obsolete Macros. (line 158)
+* F77_DUMMY_MAIN: Fortran Compiler. (line 130)
+* F77_FUNC: Fortran Compiler. (line 202)
+* F77_FUNC_: Fortran Compiler. (line 202)
+* F77_MAIN: Fortran Compiler. (line 176)
+* F77_NO_MINUS_C_MINUS_O: Fortran Compiler. (line 76)
+* FC_DUMMY_MAIN: Fortran Compiler. (line 130)
+* FC_FUNC: Fortran Compiler. (line 202)
+* FC_FUNC_: Fortran Compiler. (line 202)
+* FC_MAIN: Fortran Compiler. (line 176)
+* FC_NO_MINUS_C_MINUS_O: Fortran Compiler. (line 76)
+* FLEXIBLE_ARRAY_MEMBER: C Compiler. (line 315)
+* GETGROUPS_T: Particular Types. (line 14)
+* GETLOADAVG_PRIVILEGED: Particular Functions.
+ (line 161)
+* GETPGRP_VOID: Particular Functions.
+ (line 205)
+* gid_t: Particular Types. (line 126)
+* GWINSZ_IN_SYS_IOCTL: Particular Headers. (line 270)
+* HAVE__BOOL: Particular Headers. (line 10)
+* HAVE_AGGREGATE_MEMBER: Generic Structures. (line 29)
+* HAVE_ALLOCA_H: Particular Functions.
+ (line 10)
+* HAVE_C_BACKSLASH_A: C Compiler. (line 176)
+* HAVE_C_VARARRAYS: C Compiler. (line 339)
+* HAVE_CHOWN: Particular Functions.
+ (line 63)
+* HAVE_CONFIG_H: Configuration Headers.
+ (line 33)
+* HAVE_DECL_STRERROR_R: Particular Functions.
+ (line 388)
+* HAVE_DECL_SYMBOL: Generic Declarations.
+ (line 34)
+* HAVE_DECL_TZNAME: Particular Structures.
+ (line 43)
+* HAVE_DIRENT_H: Particular Headers. (line 25)
+* HAVE_DOPRNT: Particular Functions.
+ (line 443)
+* HAVE_FSEEKO: Particular Functions.
+ (line 147)
+* HAVE_FUNCTION: Generic Functions. (line 27)
+* HAVE_GETGROUPS: Particular Functions.
+ (line 155)
+* HAVE_GETMNTENT: Particular Functions.
+ (line 195)
+* HAVE_HEADER: Generic Headers. (line 46)
+* HAVE_INT16_T: Particular Types. (line 40)
+* HAVE_INT32_T: Particular Types. (line 43)
+* HAVE_INT64_T: Particular Types. (line 46)
+* HAVE_INT8_T: Particular Types. (line 21)
+* HAVE_INTMAX_T: Particular Types. (line 49)
+* HAVE_INTPTR_T: Particular Types. (line 54)
+* HAVE_LONG_DOUBLE <1>: Obsolete Macros. (line 33)
+* HAVE_LONG_DOUBLE: Particular Types. (line 59)
+* HAVE_LONG_DOUBLE_WIDER: Particular Types. (line 70)
+* HAVE_LONG_FILE_NAMES: System Services. (line 71)
+* HAVE_LONG_LONG_INT: Particular Types. (line 78)
+* HAVE_LSTAT_EMPTY_STRING_BUG: Particular Functions.
+ (line 363)
+* HAVE_MALLOC: Particular Functions.
+ (line 247)
+* HAVE_MBRTOWC: Particular Functions.
+ (line 279)
+* HAVE_MMAP: Particular Functions.
+ (line 311)
+* HAVE_NDIR_H: Particular Headers. (line 25)
+* HAVE_NLIST_H: Particular Functions.
+ (line 161)
+* HAVE_OBSTACK: Particular Functions.
+ (line 319)
+* HAVE_REALLOC: Particular Functions.
+ (line 326)
+* HAVE_RESOLV_H: Particular Headers. (line 73)
+* HAVE_RESTARTABLE_SYSCALLS: Obsolete Macros. (line 548)
+* HAVE_ST_BLKSIZE: Obsolete Macros. (line 521)
+* HAVE_ST_BLOCKS: Particular Structures.
+ (line 26)
+* HAVE_ST_RDEV: Obsolete Macros. (line 530)
+* HAVE_STAT_EMPTY_STRING_BUG: Particular Functions.
+ (line 363)
+* HAVE_STDBOOL_H: Particular Headers. (line 101)
+* HAVE_STRCOLL: Particular Functions.
+ (line 379)
+* HAVE_STRERROR_R: Particular Functions.
+ (line 388)
+* HAVE_STRFTIME: Particular Functions.
+ (line 401)
+* HAVE_STRINGIZE: C Compiler. (line 305)
+* HAVE_STRNLEN: Particular Functions.
+ (line 426)
+* HAVE_STRTOLD: Particular Functions.
+ (line 420)
+* HAVE_STRUCT_DIRENT_D_INO: Particular Structures.
+ (line 9)
+* HAVE_STRUCT_DIRENT_D_TYPE: Particular Structures.
+ (line 21)
+* HAVE_STRUCT_STAT_ST_BLKSIZE: Obsolete Macros. (line 521)
+* HAVE_STRUCT_STAT_ST_BLOCKS: Particular Structures.
+ (line 26)
+* HAVE_STRUCT_STAT_ST_RDEV: Obsolete Macros. (line 530)
+* HAVE_STRUCT_TM_TM_ZONE: Particular Structures.
+ (line 43)
+* HAVE_SYS_DIR_H: Particular Headers. (line 25)
+* HAVE_SYS_NDIR_H: Particular Headers. (line 25)
+* HAVE_SYS_WAIT_H: Particular Headers. (line 204)
+* HAVE_TM_ZONE: Particular Structures.
+ (line 43)
+* HAVE_TYPE: Generic Types. (line 28)
+* HAVE_TYPEOF: C Compiler. (line 345)
+* HAVE_TZNAME: Particular Structures.
+ (line 43)
+* HAVE_UINT16_T: Particular Types. (line 138)
+* HAVE_UINT32_T: Particular Types. (line 141)
+* HAVE_UINT64_T: Particular Types. (line 144)
+* HAVE_UINT8_T: Particular Types. (line 132)
+* HAVE_UINTMAX_T: Particular Types. (line 147)
+* HAVE_UINTPTR_T: Particular Types. (line 152)
+* HAVE_UNSIGNED_LONG_LONG_INT: Particular Types. (line 157)
+* HAVE_UTIME_NULL: Particular Functions.
+ (line 433)
+* HAVE_VFORK_H: Particular Functions.
+ (line 120)
+* HAVE_VPRINTF: Particular Functions.
+ (line 443)
+* HAVE_WAIT3: Obsolete Macros. (line 216)
+* HAVE_WORKING_FORK: Particular Functions.
+ (line 120)
+* HAVE_WORKING_VFORK: Particular Functions.
+ (line 120)
+* inline: C Compiler. (line 286)
+* int16_t: Particular Types. (line 40)
+* int32_t: Particular Types. (line 43)
+* int64_t: Particular Types. (line 46)
+* int8_t: Particular Types. (line 21)
+* INT_16_BITS: Obsolete Macros. (line 275)
+* intmax_t: Particular Types. (line 49)
+* intptr_t: Particular Types. (line 54)
+* LONG_64_BITS: Obsolete Macros. (line 337)
+* LSTAT_FOLLOWS_SLASHED_SYMLINK: Particular Functions.
+ (line 228)
+* MAJOR_IN_MKDEV: Particular Headers. (line 68)
+* MAJOR_IN_SYSMACROS: Particular Headers. (line 68)
+* malloc: Particular Functions.
+ (line 247)
+* mbstate_t: Particular Types. (line 88)
+* mode_t: Particular Types. (line 96)
+* NDEBUG: Particular Headers. (line 20)
+* NDIR: Obsolete Macros. (line 158)
+* NEED_MEMORY_H: Obsolete Macros. (line 358)
+* NEED_SETGID: Particular Functions.
+ (line 161)
+* NLIST_NAME_UNION: Particular Functions.
+ (line 161)
+* NO_MINUS_C_MINUS_O: C Compiler. (line 102)
+* off_t: Particular Types. (line 102)
+* PACKAGE_BUGREPORT: Initializing configure.
+ (line 57)
+* PACKAGE_NAME: Initializing configure.
+ (line 45)
+* PACKAGE_STRING: Initializing configure.
+ (line 54)
+* PACKAGE_TARNAME: Initializing configure.
+ (line 48)
+* PACKAGE_URL: Initializing configure.
+ (line 61)
+* PACKAGE_VERSION: Initializing configure.
+ (line 51)
+* PARAMS: C Compiler. (line 351)
+* pid_t: Particular Types. (line 108)
+* PROTOTYPES: C Compiler. (line 351)
+* realloc: Particular Functions.
+ (line 326)
+* restrict: C Compiler. (line 247)
+* RETSIGTYPE: Obsolete Macros. (line 662)
+* SELECT_TYPE_ARG1: Particular Functions.
+ (line 337)
+* SELECT_TYPE_ARG234: Particular Functions.
+ (line 337)
+* SELECT_TYPE_ARG5: Particular Functions.
+ (line 337)
+* SETPGRP_VOID: Particular Functions.
+ (line 348)
+* SETVBUF_REVERSED: Obsolete Macros. (line 208)
+* size_t: Particular Types. (line 114)
+* SIZEOF_TYPE-OR-EXPR: Generic Compiler Characteristics.
+ (line 8)
+* ssize_t: Particular Types. (line 120)
+* STAT_MACROS_BROKEN: Particular Headers. (line 92)
+* STDC_HEADERS: Particular Headers. (line 135)
+* STRERROR_R_CHAR_P: Particular Functions.
+ (line 388)
+* SVR4: Particular Functions.
+ (line 161)
+* SYS_SIGLIST_DECLARED: Obsolete Macros. (line 141)
+* SYSDIR: Obsolete Macros. (line 158)
+* SYSNDIR: Obsolete Macros. (line 158)
+* TIME_WITH_SYS_TIME: Particular Headers. (line 244)
+* TM_IN_SYS_TIME: Particular Structures.
+ (line 35)
+* typeof: C Compiler. (line 345)
+* uid_t: Particular Types. (line 126)
+* uint16_t: Particular Types. (line 138)
+* uint32_t: Particular Types. (line 141)
+* uint64_t: Particular Types. (line 144)
+* uint8_t: Particular Types. (line 132)
+* uintmax_t: Particular Types. (line 147)
+* uintptr_t: Particular Types. (line 152)
+* UMAX: Particular Functions.
+ (line 161)
+* UMAX4_3: Particular Functions.
+ (line 161)
+* USG: Obsolete Macros. (line 685)
+* VARIABLE: Defining Symbols. (line 32)
+* vfork: Particular Functions.
+ (line 120)
+* volatile: C Compiler. (line 265)
+* WORDS_BIGENDIAN: C Compiler. (line 184)
+* X_DISPLAY_MISSING: System Services. (line 30)
+* YYTEXT_POINTER: Particular Programs. (line 114)
+
+
+File: autoconf.info, Node: Cache Variable Index, Next: Autoconf Macro Index, Prev: Preprocessor Symbol Index, Up: Indices
+
+B.4 Cache Variable Index
+========================
+
+This is an alphabetical list of documented cache variables used by
+macros defined in Autoconf. Autoconf macros may use additional cache
+variables internally.
+
+
+* Menu:
+
+* ac_cv_alignof_TYPE-OR-EXPR: Generic Compiler Characteristics.
+ (line 30)
+* ac_cv_c_const: C Compiler. (line 217)
+* ac_cv_c_int16_t: Particular Types. (line 40)
+* ac_cv_c_int32_t: Particular Types. (line 43)
+* ac_cv_c_int64_t: Particular Types. (line 46)
+* ac_cv_c_int8_t: Particular Types. (line 21)
+* ac_cv_c_restrict: C Compiler. (line 247)
+* ac_cv_c_uint16_t: Particular Types. (line 138)
+* ac_cv_c_uint32_t: Particular Types. (line 141)
+* ac_cv_c_uint64_t: Particular Types. (line 144)
+* ac_cv_c_uint8_t: Particular Types. (line 132)
+* ac_cv_f77_compiler_gnu: Fortran Compiler. (line 19)
+* ac_cv_f77_dummy_main: Fortran Compiler. (line 130)
+* ac_cv_f77_implicit_none: Fortran Compiler. (line 427)
+* ac_cv_f77_libs: Fortran Compiler. (line 92)
+* ac_cv_f77_main: Fortran Compiler. (line 176)
+* ac_cv_f77_mangling: Fortran Compiler. (line 202)
+* ac_cv_fc_check_bounds: Fortran Compiler. (line 413)
+* ac_cv_fc_compiler_gnu: Fortran Compiler. (line 44)
+* ac_cv_fc_dummy_main: Fortran Compiler. (line 130)
+* ac_cv_fc_fixedform: Fortran Compiler. (line 375)
+* ac_cv_fc_freeform: Fortran Compiler. (line 351)
+* ac_cv_fc_implicit_none: Fortran Compiler. (line 427)
+* ac_cv_fc_libs: Fortran Compiler. (line 92)
+* ac_cv_fc_line_length: Fortran Compiler. (line 396)
+* ac_cv_fc_main: Fortran Compiler. (line 176)
+* ac_cv_fc_mangling: Fortran Compiler. (line 202)
+* ac_cv_fc_module_ext: Fortran Compiler. (line 438)
+* ac_cv_fc_module_flag: Fortran Compiler. (line 465)
+* ac_cv_fc_module_output_flag: Fortran Compiler. (line 501)
+* ac_cv_fc_pp_define: Fortran Compiler. (line 336)
+* ac_cv_fc_pp_srcext_EXT: Fortran Compiler. (line 279)
+* ac_cv_fc_srcext_EXT: Fortran Compiler. (line 279)
+* ac_cv_file_FILE: Files. (line 13)
+* ac_cv_func_chown_works: Particular Functions.
+ (line 63)
+* ac_cv_func_closedir_void: Particular Functions.
+ (line 69)
+* ac_cv_func_fnmatch_gnu: Particular Functions.
+ (line 109)
+* ac_cv_func_fnmatch_works: Particular Functions.
+ (line 94)
+* ac_cv_func_FUNCTION: Generic Functions. (line 15)
+* ac_cv_func_getgroups_works: Particular Functions.
+ (line 155)
+* ac_cv_func_getpgrp_void: Particular Functions.
+ (line 205)
+* ac_cv_func_lstat_dereferences_slashed_symlink: Particular Functions.
+ (line 228)
+* ac_cv_func_lstat_empty_string_bug: Particular Functions.
+ (line 363)
+* ac_cv_func_malloc_0_nonnull: Particular Functions.
+ (line 247)
+* ac_cv_func_mbrtowc: Particular Functions.
+ (line 279)
+* ac_cv_func_memcmp_working: Particular Functions.
+ (line 286)
+* ac_cv_func_mmap_fixed_mapped: Particular Functions.
+ (line 311)
+* ac_cv_func_obstack: Particular Functions.
+ (line 319)
+* ac_cv_func_pow: Particular Functions.
+ (line 408)
+* ac_cv_func_realloc_0_nonnull: Particular Functions.
+ (line 326)
+* ac_cv_func_setpgrp_void: Particular Functions.
+ (line 348)
+* ac_cv_func_stat_empty_string_bug: Particular Functions.
+ (line 363)
+* ac_cv_func_strcoll_works: Particular Functions.
+ (line 379)
+* ac_cv_func_strerror_r_char_p: Particular Functions.
+ (line 388)
+* ac_cv_func_strnlen_working: Particular Functions.
+ (line 426)
+* ac_cv_func_strtod: Particular Functions.
+ (line 408)
+* ac_cv_func_strtold: Particular Functions.
+ (line 420)
+* ac_cv_func_utime_null: Particular Functions.
+ (line 433)
+* ac_cv_func_working_mktime: Particular Functions.
+ (line 299)
+* ac_cv_have_decl_SYMBOL: Generic Declarations.
+ (line 11)
+* ac_cv_header_HEADER-FILE: Generic Headers. (line 13)
+* ac_cv_header_stdbool_h: Particular Headers. (line 10)
+* ac_cv_header_stdc: Particular Headers. (line 135)
+* ac_cv_header_sys_wait_h: Particular Headers. (line 204)
+* ac_cv_header_time: Particular Headers. (line 244)
+* ac_cv_lib_error_at_line: Particular Functions.
+ (line 84)
+* ac_cv_lib_LIBRARY_FUNCTION: Libraries. (line 11)
+* ac_cv_member_AGGREGATE_MEMBER: Generic Structures. (line 11)
+* ac_cv_member_struct_stat_st_blocks: Particular Structures.
+ (line 26)
+* ac_cv_path_install: Particular Programs. (line 43)
+* ac_cv_path_mkdir: Particular Programs. (line 80)
+* ac_cv_path_SED: Particular Programs. (line 191)
+* ac_cv_path_VARIABLE: Generic Programs. (line 108)
+* ac_cv_prog_AWK: Particular Programs. (line 10)
+* ac_cv_prog_c_openmp: Generic Compiler Characteristics.
+ (line 64)
+* ac_cv_prog_cc_c89: C Compiler. (line 61)
+* ac_cv_prog_cc_c99: C Compiler. (line 161)
+* ac_cv_prog_cc_COMPILER_c_o: C Compiler. (line 102)
+* ac_cv_prog_cc_stdc: C Compiler. (line 137)
+* ac_cv_prog_cxx_openmp: Generic Compiler Characteristics.
+ (line 64)
+* ac_cv_prog_EGREP: Particular Programs. (line 29)
+* ac_cv_prog_f77_c_o: Fortran Compiler. (line 76)
+* ac_cv_prog_f77_g: Fortran Compiler. (line 19)
+* ac_cv_prog_f77_openmp: Generic Compiler Characteristics.
+ (line 64)
+* ac_cv_prog_f77_v: Fortran Compiler. (line 92)
+* ac_cv_prog_fc_c_o: Fortran Compiler. (line 76)
+* ac_cv_prog_fc_g: Fortran Compiler. (line 44)
+* ac_cv_prog_fc_openmp: Generic Compiler Characteristics.
+ (line 64)
+* ac_cv_prog_fc_v: Fortran Compiler. (line 92)
+* ac_cv_prog_FGREP: Particular Programs. (line 36)
+* ac_cv_prog_GREP: Particular Programs. (line 20)
+* ac_cv_prog_LEX: Particular Programs. (line 114)
+* ac_cv_prog_VARIABLE: Generic Programs. (line 24)
+* ac_cv_prog_YACC: Particular Programs. (line 200)
+* ac_cv_search_FUNCTION: Libraries. (line 52)
+* ac_cv_search_getmntent: Particular Functions.
+ (line 195)
+* ac_cv_sizeof_TYPE-OR-EXPR: Generic Compiler Characteristics.
+ (line 8)
+* ac_cv_sys_posix_termios: System Services. (line 75)
+* ac_cv_type_getgroups: Particular Types. (line 14)
+* ac_cv_type_long_double: Particular Types. (line 59)
+* ac_cv_type_long_double_wider: Particular Types. (line 70)
+* ac_cv_type_long_long_int: Particular Types. (line 78)
+* ac_cv_type_mbstate_t: Particular Types. (line 88)
+* ac_cv_type_mode_t: Particular Types. (line 96)
+* ac_cv_type_off_t: Particular Types. (line 102)
+* ac_cv_type_pid_t: Particular Types. (line 108)
+* ac_cv_type_size_t: Particular Types. (line 114)
+* ac_cv_type_ssize_t: Particular Types. (line 120)
+* ac_cv_type_TYPE: Generic Types. (line 11)
+* ac_cv_type_uid_t: Particular Types. (line 126)
+* ac_cv_type_unsigned_long_long_int: Particular Types. (line 157)
+
+
+File: autoconf.info, Node: Autoconf Macro Index, Next: M4 Macro Index, Prev: Cache Variable Index, Up: Indices
+
+B.5 Autoconf Macro Index
+========================
+
+This is an alphabetical list of the Autoconf macros.
+
+
+* Menu:
+
+* AC_ACT_IFELSE: AC_ACT_IFELSE vs AC_TRY_ACT.
+ (line 6)
+* AC_AIX: Obsolete Macros. (line 20)
+* AC_ALLOCA: Obsolete Macros. (line 24)
+* AC_ARG_ARRAY: Obsolete Macros. (line 27)
+* AC_ARG_ENABLE: Package Options. (line 35)
+* AC_ARG_PROGRAM: Transforming Names. (line 11)
+* AC_ARG_VAR: Setting Output Variables.
+ (line 79)
+* AC_ARG_WITH: External Software. (line 36)
+* AC_AUTOCONF_VERSION: Versioning. (line 21)
+* AC_BEFORE: Suggested Ordering. (line 28)
+* AC_C_BACKSLASH_A: C Compiler. (line 176)
+* AC_C_BIGENDIAN: C Compiler. (line 184)
+* AC_C_CHAR_UNSIGNED: C Compiler. (line 291)
+* AC_C_CONST: C Compiler. (line 217)
+* AC_C_CROSS: Obsolete Macros. (line 30)
+* AC_C_FLEXIBLE_ARRAY_MEMBER: C Compiler. (line 315)
+* AC_C_INLINE: C Compiler. (line 286)
+* AC_C_LONG_DOUBLE: Obsolete Macros. (line 33)
+* AC_C_PROTOTYPES: C Compiler. (line 351)
+* AC_C_RESTRICT: C Compiler. (line 247)
+* AC_C_STRINGIZE: C Compiler. (line 305)
+* AC_C_TYPEOF: C Compiler. (line 345)
+* AC_C_VARARRAYS: C Compiler. (line 339)
+* AC_C_VOLATILE: C Compiler. (line 265)
+* AC_CACHE_CHECK: Caching Results. (line 30)
+* AC_CACHE_LOAD: Cache Checkpointing. (line 13)
+* AC_CACHE_SAVE: Cache Checkpointing. (line 17)
+* AC_CACHE_VAL: Caching Results. (line 16)
+* AC_CANONICAL_BUILD: Canonicalizing. (line 26)
+* AC_CANONICAL_HOST: Canonicalizing. (line 34)
+* AC_CANONICAL_SYSTEM: Obsolete Macros. (line 41)
+* AC_CANONICAL_TARGET: Canonicalizing. (line 41)
+* AC_CHAR_UNSIGNED: Obsolete Macros. (line 51)
+* AC_CHECK_ALIGNOF: Generic Compiler Characteristics.
+ (line 30)
+* AC_CHECK_DECL: Generic Declarations.
+ (line 11)
+* AC_CHECK_DECLS: Generic Declarations.
+ (line 34)
+* AC_CHECK_DECLS_ONCE: Generic Declarations.
+ (line 79)
+* AC_CHECK_FILE: Files. (line 13)
+* AC_CHECK_FILES: Files. (line 21)
+* AC_CHECK_FUNC: Generic Functions. (line 15)
+* AC_CHECK_FUNCS: Generic Functions. (line 27)
+* AC_CHECK_FUNCS_ONCE: Generic Functions. (line 38)
+* AC_CHECK_HEADER: Generic Headers. (line 13)
+* AC_CHECK_HEADER_STDBOOL: Particular Headers. (line 10)
+* AC_CHECK_HEADERS: Generic Headers. (line 46)
+* AC_CHECK_HEADERS_ONCE: Generic Headers. (line 87)
+* AC_CHECK_LIB: Libraries. (line 11)
+* AC_CHECK_MEMBER: Generic Structures. (line 11)
+* AC_CHECK_MEMBERS: Generic Structures. (line 29)
+* AC_CHECK_PROG: Generic Programs. (line 24)
+* AC_CHECK_PROGS: Generic Programs. (line 36)
+* AC_CHECK_SIZEOF: Generic Compiler Characteristics.
+ (line 8)
+* AC_CHECK_TARGET_TOOL: Generic Programs. (line 48)
+* AC_CHECK_TARGET_TOOLS: Generic Programs. (line 79)
+* AC_CHECK_TOOL: Generic Programs. (line 64)
+* AC_CHECK_TOOLS: Generic Programs. (line 92)
+* AC_CHECK_TYPE <1>: Obsolete Macros. (line 54)
+* AC_CHECK_TYPE: Generic Types. (line 11)
+* AC_CHECK_TYPES: Generic Types. (line 28)
+* AC_CHECKING: Obsolete Macros. (line 101)
+* AC_COMPILE_CHECK: Obsolete Macros. (line 109)
+* AC_COMPILE_IFELSE: Running the Compiler.
+ (line 13)
+* AC_COMPUTE_INT: Generic Compiler Characteristics.
+ (line 42)
+* AC_CONFIG_AUX_DIR: Input. (line 20)
+* AC_CONFIG_COMMANDS: Configuration Commands.
+ (line 13)
+* AC_CONFIG_COMMANDS_POST: Configuration Commands.
+ (line 41)
+* AC_CONFIG_COMMANDS_PRE: Configuration Commands.
+ (line 35)
+* AC_CONFIG_FILES: Configuration Files. (line 9)
+* AC_CONFIG_HEADERS: Configuration Headers.
+ (line 33)
+* AC_CONFIG_ITEMS: Configuration Actions.
+ (line 12)
+* AC_CONFIG_LIBOBJ_DIR: Generic Functions. (line 97)
+* AC_CONFIG_LINKS: Configuration Links. (line 12)
+* AC_CONFIG_MACRO_DIR: Input. (line 48)
+* AC_CONFIG_SRCDIR: Input. (line 7)
+* AC_CONFIG_SUBDIRS: Subdirectories. (line 12)
+* AC_CONFIG_TESTDIR: Making testsuite Scripts.
+ (line 26)
+* AC_CONST: Obsolete Macros. (line 117)
+* AC_COPYRIGHT: Notices. (line 10)
+* AC_CROSS_CHECK: Obsolete Macros. (line 120)
+* AC_CYGWIN: Obsolete Macros. (line 124)
+* AC_DATAROOTDIR_CHECKED: Changed Directory Variables.
+ (line 58)
+* AC_DECL_SYS_SIGLIST: Obsolete Macros. (line 141)
+* AC_DECL_YYTEXT: Obsolete Macros. (line 154)
+* AC_DEFINE: Defining Symbols. (line 32)
+* AC_DEFINE_UNQUOTED: Defining Symbols. (line 74)
+* AC_DEFUN: Macro Definitions. (line 7)
+* AC_DEFUN_ONCE: One-Shot Macros. (line 14)
+* AC_DIAGNOSE: Reporting Messages. (line 18)
+* AC_DIR_HEADER: Obsolete Macros. (line 158)
+* AC_DISABLE_OPTION_CHECKING: Option Checking. (line 28)
+* AC_DYNIX_SEQ: Obsolete Macros. (line 170)
+* AC_EGREP_CPP: Running the Preprocessor.
+ (line 74)
+* AC_EGREP_HEADER: Running the Preprocessor.
+ (line 67)
+* AC_EMXOS2: Obsolete Macros. (line 183)
+* AC_ENABLE: Obsolete Macros. (line 189)
+* AC_ERLANG_CHECK_LIB: Erlang Libraries. (line 36)
+* AC_ERLANG_NEED_ERL: Erlang Compiler and Interpreter.
+ (line 41)
+* AC_ERLANG_NEED_ERLC: Erlang Compiler and Interpreter.
+ (line 24)
+* AC_ERLANG_PATH_ERL: Erlang Compiler and Interpreter.
+ (line 29)
+* AC_ERLANG_PATH_ERLC: Erlang Compiler and Interpreter.
+ (line 10)
+* AC_ERLANG_SUBST_ERTS_VER: Erlang Libraries. (line 12)
+* AC_ERLANG_SUBST_INSTALL_LIB_DIR <1>: Erlang Libraries. (line 86)
+* AC_ERLANG_SUBST_INSTALL_LIB_DIR: Installation Directory Variables.
+ (line 201)
+* AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR <1>: Erlang Libraries. (line 93)
+* AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR: Installation Directory Variables.
+ (line 206)
+* AC_ERLANG_SUBST_LIB_DIR: Erlang Libraries. (line 28)
+* AC_ERLANG_SUBST_ROOT_DIR: Erlang Libraries. (line 22)
+* AC_ERROR: Obsolete Macros. (line 193)
+* AC_EXEEXT: Obsolete Macros. (line 178)
+* AC_F77_DUMMY_MAIN: Fortran Compiler. (line 130)
+* AC_F77_FUNC: Fortran Compiler. (line 266)
+* AC_F77_IMPLICIT_NONE: Fortran Compiler. (line 427)
+* AC_F77_LIBRARY_LDFLAGS: Fortran Compiler. (line 92)
+* AC_F77_MAIN: Fortran Compiler. (line 176)
+* AC_F77_WRAPPERS: Fortran Compiler. (line 202)
+* AC_FATAL: Reporting Messages. (line 34)
+* AC_FC_CHECK_BOUNDS: Fortran Compiler. (line 413)
+* AC_FC_DUMMY_MAIN: Fortran Compiler. (line 130)
+* AC_FC_FIXEDFORM: Fortran Compiler. (line 375)
+* AC_FC_FREEFORM: Fortran Compiler. (line 351)
+* AC_FC_FUNC: Fortran Compiler. (line 266)
+* AC_FC_IMPLICIT_NONE: Fortran Compiler. (line 427)
+* AC_FC_LIBRARY_LDFLAGS: Fortran Compiler. (line 92)
+* AC_FC_LINE_LENGTH: Fortran Compiler. (line 396)
+* AC_FC_MAIN: Fortran Compiler. (line 176)
+* AC_FC_MODULE_EXTENSION: Fortran Compiler. (line 438)
+* AC_FC_MODULE_FLAG: Fortran Compiler. (line 465)
+* AC_FC_MODULE_OUTPUT_FLAG: Fortran Compiler. (line 501)
+* AC_FC_PP_DEFINE: Fortran Compiler. (line 336)
+* AC_FC_PP_SRCEXT: Fortran Compiler. (line 279)
+* AC_FC_SRCEXT: Fortran Compiler. (line 279)
+* AC_FC_WRAPPERS: Fortran Compiler. (line 202)
+* AC_FIND_X: Obsolete Macros. (line 196)
+* AC_FIND_XTRA: Obsolete Macros. (line 199)
+* AC_FOREACH: Obsolete Macros. (line 202)
+* AC_FUNC_ALLOCA: Particular Functions.
+ (line 10)
+* AC_FUNC_CHECK: Obsolete Macros. (line 205)
+* AC_FUNC_CHOWN: Particular Functions.
+ (line 63)
+* AC_FUNC_CLOSEDIR_VOID: Particular Functions.
+ (line 69)
+* AC_FUNC_ERROR_AT_LINE: Particular Functions.
+ (line 84)
+* AC_FUNC_FNMATCH: Particular Functions.
+ (line 94)
+* AC_FUNC_FNMATCH_GNU: Particular Functions.
+ (line 109)
+* AC_FUNC_FORK: Particular Functions.
+ (line 120)
+* AC_FUNC_FSEEKO: Particular Functions.
+ (line 147)
+* AC_FUNC_GETGROUPS: Particular Functions.
+ (line 155)
+* AC_FUNC_GETLOADAVG: Particular Functions.
+ (line 161)
+* AC_FUNC_GETMNTENT: Particular Functions.
+ (line 195)
+* AC_FUNC_GETPGRP: Particular Functions.
+ (line 205)
+* AC_FUNC_LSTAT: Particular Functions.
+ (line 363)
+* AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK: Particular Functions.
+ (line 228)
+* AC_FUNC_MALLOC: Particular Functions.
+ (line 247)
+* AC_FUNC_MBRTOWC: Particular Functions.
+ (line 279)
+* AC_FUNC_MEMCMP: Particular Functions.
+ (line 286)
+* AC_FUNC_MKTIME: Particular Functions.
+ (line 299)
+* AC_FUNC_MMAP: Particular Functions.
+ (line 311)
+* AC_FUNC_OBSTACK: Particular Functions.
+ (line 319)
+* AC_FUNC_REALLOC: Particular Functions.
+ (line 326)
+* AC_FUNC_SELECT_ARGTYPES: Particular Functions.
+ (line 337)
+* AC_FUNC_SETPGRP: Particular Functions.
+ (line 348)
+* AC_FUNC_SETVBUF_REVERSED: Obsolete Macros. (line 208)
+* AC_FUNC_STAT: Particular Functions.
+ (line 363)
+* AC_FUNC_STRCOLL: Particular Functions.
+ (line 379)
+* AC_FUNC_STRERROR_R: Particular Functions.
+ (line 388)
+* AC_FUNC_STRFTIME: Particular Functions.
+ (line 401)
+* AC_FUNC_STRNLEN: Particular Functions.
+ (line 426)
+* AC_FUNC_STRTOD: Particular Functions.
+ (line 408)
+* AC_FUNC_STRTOLD: Particular Functions.
+ (line 420)
+* AC_FUNC_UTIME_NULL: Particular Functions.
+ (line 433)
+* AC_FUNC_VPRINTF: Particular Functions.
+ (line 443)
+* AC_FUNC_WAIT3: Obsolete Macros. (line 216)
+* AC_GCC_TRADITIONAL: Obsolete Macros. (line 224)
+* AC_GETGROUPS_T: Obsolete Macros. (line 228)
+* AC_GETLOADAVG: Obsolete Macros. (line 231)
+* AC_GNU_SOURCE: Obsolete Macros. (line 234)
+* AC_HAVE_FUNCS: Obsolete Macros. (line 238)
+* AC_HAVE_HEADERS: Obsolete Macros. (line 241)
+* AC_HAVE_LIBRARY: Obsolete Macros. (line 245)
+* AC_HAVE_POUNDBANG: Obsolete Macros. (line 252)
+* AC_HEADER_ASSERT: Particular Headers. (line 20)
+* AC_HEADER_CHECK: Obsolete Macros. (line 255)
+* AC_HEADER_DIRENT: Particular Headers. (line 25)
+* AC_HEADER_EGREP: Obsolete Macros. (line 258)
+* AC_HEADER_MAJOR: Particular Headers. (line 68)
+* AC_HEADER_RESOLV: Particular Headers. (line 73)
+* AC_HEADER_STAT: Particular Headers. (line 92)
+* AC_HEADER_STDBOOL: Particular Headers. (line 101)
+* AC_HEADER_STDC: Particular Headers. (line 135)
+* AC_HEADER_SYS_WAIT: Particular Headers. (line 204)
+* AC_HEADER_TIME: Particular Headers. (line 244)
+* AC_HEADER_TIOCGWINSZ: Particular Headers. (line 270)
+* AC_HELP_STRING: Obsolete Macros. (line 261)
+* AC_INCLUDES_DEFAULT: Default Includes. (line 29)
+* AC_INIT <1>: Obsolete Macros. (line 264)
+* AC_INIT: Initializing configure.
+ (line 14)
+* AC_INLINE: Obsolete Macros. (line 272)
+* AC_INT_16_BITS: Obsolete Macros. (line 275)
+* AC_IRIX_SUN: Obsolete Macros. (line 279)
+* AC_ISC_POSIX: Obsolete Macros. (line 295)
+* AC_LANG: Language Choice. (line 14)
+* AC_LANG_ASSERT: Language Choice. (line 79)
+* AC_LANG_C: Obsolete Macros. (line 302)
+* AC_LANG_CALL: Generating Sources. (line 142)
+* AC_LANG_CONFTEST: Generating Sources. (line 12)
+* AC_LANG_CPLUSPLUS: Obsolete Macros. (line 305)
+* AC_LANG_DEFINES_PROVIDED: Generating Sources. (line 31)
+* AC_LANG_FORTRAN77: Obsolete Macros. (line 308)
+* AC_LANG_FUNC_LINK_TRY: Generating Sources. (line 154)
+* AC_LANG_POP: Language Choice. (line 66)
+* AC_LANG_PROGRAM: Generating Sources. (line 78)
+* AC_LANG_PUSH: Language Choice. (line 61)
+* AC_LANG_RESTORE: Obsolete Macros. (line 311)
+* AC_LANG_SAVE: Obsolete Macros. (line 317)
+* AC_LANG_SOURCE: Generating Sources. (line 40)
+* AC_LANG_WERROR: Generic Compiler Characteristics.
+ (line 54)
+* AC_LIBOBJ: Generic Functions. (line 56)
+* AC_LIBSOURCE: Generic Functions. (line 65)
+* AC_LIBSOURCES: Generic Functions. (line 89)
+* AC_LINK_FILES: Obsolete Macros. (line 322)
+* AC_LINK_IFELSE: Running the Linker. (line 24)
+* AC_LN_S: Obsolete Macros. (line 334)
+* AC_LONG_64_BITS: Obsolete Macros. (line 337)
+* AC_LONG_DOUBLE: Obsolete Macros. (line 342)
+* AC_LONG_FILE_NAMES: Obsolete Macros. (line 350)
+* AC_MAJOR_HEADER: Obsolete Macros. (line 355)
+* AC_MEMORY_H: Obsolete Macros. (line 358)
+* AC_MINGW32: Obsolete Macros. (line 365)
+* AC_MINIX: Obsolete Macros. (line 371)
+* AC_MINUS_C_MINUS_O: Obsolete Macros. (line 375)
+* AC_MMAP: Obsolete Macros. (line 378)
+* AC_MODE_T: Obsolete Macros. (line 381)
+* AC_MSG_CHECKING: Printing Messages. (line 24)
+* AC_MSG_ERROR: Printing Messages. (line 56)
+* AC_MSG_FAILURE: Printing Messages. (line 66)
+* AC_MSG_NOTICE: Printing Messages. (line 46)
+* AC_MSG_RESULT: Printing Messages. (line 35)
+* AC_MSG_WARN: Printing Messages. (line 72)
+* AC_OBJEXT: Obsolete Macros. (line 384)
+* AC_OBSOLETE: Obsolete Macros. (line 390)
+* AC_OFF_T: Obsolete Macros. (line 405)
+* AC_OPENMP: Generic Compiler Characteristics.
+ (line 64)
+* AC_OUTPUT <1>: Obsolete Macros. (line 408)
+* AC_OUTPUT: Output. (line 13)
+* AC_OUTPUT_COMMANDS: Obsolete Macros. (line 420)
+* AC_PACKAGE_BUGREPORT: Initializing configure.
+ (line 57)
+* AC_PACKAGE_NAME: Initializing configure.
+ (line 45)
+* AC_PACKAGE_STRING: Initializing configure.
+ (line 54)
+* AC_PACKAGE_TARNAME: Initializing configure.
+ (line 48)
+* AC_PACKAGE_URL: Initializing configure.
+ (line 61)
+* AC_PACKAGE_VERSION: Initializing configure.
+ (line 51)
+* AC_PATH_PROG: Generic Programs. (line 108)
+* AC_PATH_PROGS: Generic Programs. (line 115)
+* AC_PATH_PROGS_FEATURE_CHECK: Generic Programs. (line 123)
+* AC_PATH_TARGET_TOOL: Generic Programs. (line 159)
+* AC_PATH_TOOL: Generic Programs. (line 164)
+* AC_PATH_X: System Services. (line 10)
+* AC_PATH_XTRA: System Services. (line 30)
+* AC_PID_T: Obsolete Macros. (line 450)
+* AC_PREFIX: Obsolete Macros. (line 453)
+* AC_PREFIX_DEFAULT: Default Prefix. (line 16)
+* AC_PREFIX_PROGRAM: Default Prefix. (line 25)
+* AC_PREPROC_IFELSE: Running the Preprocessor.
+ (line 20)
+* AC_PREREQ: Versioning. (line 11)
+* AC_PRESERVE_HELP_ORDER: Help Formatting. (line 20)
+* AC_PROG_AWK: Particular Programs. (line 10)
+* AC_PROG_CC: C Compiler. (line 61)
+* AC_PROG_CC_C89: C Compiler. (line 147)
+* AC_PROG_CC_C99: C Compiler. (line 161)
+* AC_PROG_CC_C_O: C Compiler. (line 102)
+* AC_PROG_CC_STDC: C Compiler. (line 137)
+* AC_PROG_CPP: C Compiler. (line 113)
+* AC_PROG_CPP_WERROR: C Compiler. (line 126)
+* AC_PROG_CXX: C++ Compiler. (line 7)
+* AC_PROG_CXX_C_O: C++ Compiler. (line 48)
+* AC_PROG_CXXCPP: C++ Compiler. (line 35)
+* AC_PROG_EGREP: Particular Programs. (line 29)
+* AC_PROG_F77: Fortran Compiler. (line 19)
+* AC_PROG_F77_C_O: Fortran Compiler. (line 76)
+* AC_PROG_FC: Fortran Compiler. (line 44)
+* AC_PROG_FC_C_O: Fortran Compiler. (line 76)
+* AC_PROG_FGREP: Particular Programs. (line 36)
+* AC_PROG_GCC_TRADITIONAL: C Compiler. (line 361)
+* AC_PROG_GREP: Particular Programs. (line 20)
+* AC_PROG_INSTALL: Particular Programs. (line 43)
+* AC_PROG_LEX: Particular Programs. (line 114)
+* AC_PROG_LN_S: Particular Programs. (line 168)
+* AC_PROG_MAKE_SET: Output. (line 45)
+* AC_PROG_MKDIR_P: Particular Programs. (line 80)
+* AC_PROG_OBJC: Objective C Compiler.
+ (line 7)
+* AC_PROG_OBJCPP: Objective C Compiler.
+ (line 26)
+* AC_PROG_OBJCXX: Objective C++ Compiler.
+ (line 7)
+* AC_PROG_OBJCXXCPP: Objective C++ Compiler.
+ (line 27)
+* AC_PROG_RANLIB: Particular Programs. (line 187)
+* AC_PROG_SED: Particular Programs. (line 191)
+* AC_PROG_YACC: Particular Programs. (line 200)
+* AC_PROGRAM_CHECK: Obsolete Macros. (line 462)
+* AC_PROGRAM_EGREP: Obsolete Macros. (line 465)
+* AC_PROGRAM_PATH: Obsolete Macros. (line 468)
+* AC_PROGRAMS_CHECK: Obsolete Macros. (line 456)
+* AC_PROGRAMS_PATH: Obsolete Macros. (line 459)
+* AC_REMOTE_TAPE: Obsolete Macros. (line 471)
+* AC_REPLACE_FNMATCH: Particular Functions.
+ (line 452)
+* AC_REPLACE_FUNCS: Generic Functions. (line 117)
+* AC_REQUIRE: Prerequisite Macros. (line 17)
+* AC_REQUIRE_AUX_FILE: Input. (line 37)
+* AC_REQUIRE_CPP: Language Choice. (line 94)
+* AC_RESTARTABLE_SYSCALLS: Obsolete Macros. (line 474)
+* AC_RETSIGTYPE: Obsolete Macros. (line 482)
+* AC_REVISION: Notices. (line 18)
+* AC_RSH: Obsolete Macros. (line 486)
+* AC_RUN_IFELSE: Runtime. (line 20)
+* AC_SCO_INTL: Obsolete Macros. (line 489)
+* AC_SEARCH_LIBS: Libraries. (line 52)
+* AC_SET_MAKE: Obsolete Macros. (line 503)
+* AC_SETVBUF_REVERSED: Obsolete Macros. (line 498)
+* AC_SIZE_T: Obsolete Macros. (line 509)
+* AC_SIZEOF_TYPE: Obsolete Macros. (line 506)
+* AC_ST_BLKSIZE: Obsolete Macros. (line 539)
+* AC_ST_BLOCKS: Obsolete Macros. (line 542)
+* AC_ST_RDEV: Obsolete Macros. (line 545)
+* AC_STAT_MACROS_BROKEN: Obsolete Macros. (line 512)
+* AC_STDC_HEADERS: Obsolete Macros. (line 515)
+* AC_STRCOLL: Obsolete Macros. (line 518)
+* AC_STRUCT_DIRENT_D_INO: Particular Structures.
+ (line 9)
+* AC_STRUCT_DIRENT_D_TYPE: Particular Structures.
+ (line 21)
+* AC_STRUCT_ST_BLKSIZE: Obsolete Macros. (line 521)
+* AC_STRUCT_ST_BLOCKS: Particular Structures.
+ (line 26)
+* AC_STRUCT_ST_RDEV: Obsolete Macros. (line 530)
+* AC_STRUCT_TIMEZONE: Particular Structures.
+ (line 43)
+* AC_STRUCT_TM: Particular Structures.
+ (line 35)
+* AC_SUBST: Setting Output Variables.
+ (line 13)
+* AC_SUBST_FILE: Setting Output Variables.
+ (line 38)
+* AC_SYS_INTERPRETER: System Services. (line 42)
+* AC_SYS_LARGEFILE: System Services. (line 49)
+* AC_SYS_LONG_FILE_NAMES: System Services. (line 71)
+* AC_SYS_POSIX_TERMIOS: System Services. (line 75)
+* AC_SYS_RESTARTABLE_SYSCALLS: Obsolete Macros. (line 548)
+* AC_SYS_SIGLIST_DECLARED: Obsolete Macros. (line 563)
+* AC_TEST_CPP: Obsolete Macros. (line 568)
+* AC_TEST_PROGRAM: Obsolete Macros. (line 572)
+* AC_TIME_WITH_SYS_TIME: Obsolete Macros. (line 579)
+* AC_TIMEZONE: Obsolete Macros. (line 576)
+* AC_TRY_ACT: AC_ACT_IFELSE vs AC_TRY_ACT.
+ (line 6)
+* AC_TRY_COMPILE: Obsolete Macros. (line 583)
+* AC_TRY_CPP: Obsolete Macros. (line 602)
+* AC_TRY_LINK: Obsolete Macros. (line 615)
+* AC_TRY_LINK_FUNC: Obsolete Macros. (line 644)
+* AC_TRY_RUN: Obsolete Macros. (line 651)
+* AC_TYPE_GETGROUPS: Particular Types. (line 14)
+* AC_TYPE_INT16_T: Particular Types. (line 40)
+* AC_TYPE_INT32_T: Particular Types. (line 43)
+* AC_TYPE_INT64_T: Particular Types. (line 46)
+* AC_TYPE_INT8_T: Particular Types. (line 21)
+* AC_TYPE_INTMAX_T: Particular Types. (line 49)
+* AC_TYPE_INTPTR_T: Particular Types. (line 54)
+* AC_TYPE_LONG_DOUBLE: Particular Types. (line 59)
+* AC_TYPE_LONG_DOUBLE_WIDER: Particular Types. (line 70)
+* AC_TYPE_LONG_LONG_INT: Particular Types. (line 78)
+* AC_TYPE_MBSTATE_T: Particular Types. (line 88)
+* AC_TYPE_MODE_T: Particular Types. (line 96)
+* AC_TYPE_OFF_T: Particular Types. (line 102)
+* AC_TYPE_PID_T: Particular Types. (line 108)
+* AC_TYPE_SIGNAL: Obsolete Macros. (line 662)
+* AC_TYPE_SIZE_T: Particular Types. (line 114)
+* AC_TYPE_SSIZE_T: Particular Types. (line 120)
+* AC_TYPE_UID_T: Particular Types. (line 126)
+* AC_TYPE_UINT16_T: Particular Types. (line 138)
+* AC_TYPE_UINT32_T: Particular Types. (line 141)
+* AC_TYPE_UINT64_T: Particular Types. (line 144)
+* AC_TYPE_UINT8_T: Particular Types. (line 132)
+* AC_TYPE_UINTMAX_T: Particular Types. (line 147)
+* AC_TYPE_UINTPTR_T: Particular Types. (line 152)
+* AC_TYPE_UNSIGNED_LONG_LONG_INT: Particular Types. (line 157)
+* AC_UID_T: Obsolete Macros. (line 679)
+* AC_UNISTD_H: Obsolete Macros. (line 682)
+* AC_USE_SYSTEM_EXTENSIONS: Posix Variants. (line 10)
+* AC_USG: Obsolete Macros. (line 685)
+* AC_UTIME_NULL: Obsolete Macros. (line 690)
+* AC_VALIDATE_CACHED_SYSTEM_TUPLE: Obsolete Macros. (line 693)
+* AC_VERBOSE: Obsolete Macros. (line 698)
+* AC_VFORK: Obsolete Macros. (line 701)
+* AC_VPRINTF: Obsolete Macros. (line 704)
+* AC_WAIT3: Obsolete Macros. (line 707)
+* AC_WARN: Obsolete Macros. (line 712)
+* AC_WARNING: Reporting Messages. (line 26)
+* AC_WITH: Obsolete Macros. (line 715)
+* AC_WORDS_BIGENDIAN: Obsolete Macros. (line 719)
+* AC_XENIX_DIR: Obsolete Macros. (line 722)
+* AC_YYTEXT_POINTER: Obsolete Macros. (line 739)
+* AH_BOTTOM: Autoheader Macros. (line 50)
+* AH_HEADER: Configuration Headers.
+ (line 54)
+* AH_TEMPLATE: Autoheader Macros. (line 19)
+* AH_TOP: Autoheader Macros. (line 47)
+* AH_VERBATIM: Autoheader Macros. (line 40)
+* AU_ALIAS: Obsoleting Macros. (line 34)
+* AU_DEFUN: Obsoleting Macros. (line 18)
+
+
+File: autoconf.info, Node: M4 Macro Index, Next: Autotest Macro Index, Prev: Autoconf Macro Index, Up: Indices
+
+B.6 M4 Macro Index
+==================
+
+This is an alphabetical list of the M4, M4sugar, and M4sh macros.
+
+
+* Menu:
+
+* __file__: Redefined M4 Macros. (line 65)
+* __line__: Redefined M4 Macros. (line 65)
+* __oline__: Redefined M4 Macros. (line 69)
+* AS_BOURNE_COMPATIBLE: Initialization Macros.
+ (line 7)
+* AS_BOX: Common Shell Constructs.
+ (line 10)
+* AS_CASE: Common Shell Constructs.
+ (line 19)
+* AS_DIRNAME: Common Shell Constructs.
+ (line 26)
+* AS_ECHO: Common Shell Constructs.
+ (line 34)
+* AS_ECHO_N: Common Shell Constructs.
+ (line 42)
+* AS_ESCAPE: Common Shell Constructs.
+ (line 50)
+* AS_EXECUTABLE_P: Common Shell Constructs.
+ (line 90)
+* AS_EXIT: Common Shell Constructs.
+ (line 95)
+* AS_HELP_STRING: Pretty Help Strings. (line 15)
+* AS_IF: Common Shell Constructs.
+ (line 101)
+* AS_INIT: Initialization Macros.
+ (line 14)
+* AS_INIT_GENERATED: Initialization Macros.
+ (line 26)
+* AS_LINENO_PREPARE: Initialization Macros.
+ (line 67)
+* AS_LITERAL_IF: Polymorphic Variables.
+ (line 21)
+* AS_LITERAL_WORD_IF: Polymorphic Variables.
+ (line 21)
+* AS_ME_PREPARE: Initialization Macros.
+ (line 72)
+* AS_MESSAGE_FD: File Descriptor Macros.
+ (line 17)
+* AS_MESSAGE_LOG_FD: File Descriptor Macros.
+ (line 29)
+* AS_MKDIR_P: Common Shell Constructs.
+ (line 115)
+* AS_ORIGINAL_STDIN_FD: File Descriptor Macros.
+ (line 39)
+* AS_SET_CATFILE: Common Shell Constructs.
+ (line 155)
+* AS_SET_STATUS: Common Shell Constructs.
+ (line 127)
+* AS_SHELL_SANITIZE: Initialization Macros.
+ (line 101)
+* AS_TMPDIR: Initialization Macros.
+ (line 77)
+* AS_TR_CPP: Common Shell Constructs.
+ (line 135)
+* AS_TR_SH: Common Shell Constructs.
+ (line 144)
+* AS_UNSET: Common Shell Constructs.
+ (line 159)
+* AS_VAR_APPEND: Polymorphic Variables.
+ (line 63)
+* AS_VAR_ARITH: Polymorphic Variables.
+ (line 85)
+* AS_VAR_COPY: Polymorphic Variables.
+ (line 103)
+* AS_VAR_IF: Polymorphic Variables.
+ (line 122)
+* AS_VAR_POPDEF: Polymorphic Variables.
+ (line 131)
+* AS_VAR_PUSHDEF: Polymorphic Variables.
+ (line 131)
+* AS_VAR_SET: Polymorphic Variables.
+ (line 173)
+* AS_VAR_SET_IF: Polymorphic Variables.
+ (line 183)
+* AS_VAR_TEST_SET: Polymorphic Variables.
+ (line 188)
+* AS_VERSION_COMPARE: Common Shell Constructs.
+ (line 165)
+* dnl: Redefined M4 Macros. (line 76)
+* m4_append: Text processing Macros.
+ (line 16)
+* m4_append_uniq: Text processing Macros.
+ (line 16)
+* m4_append_uniq_w: Text processing Macros.
+ (line 69)
+* m4_apply: Evaluation Macros. (line 10)
+* m4_argn: Looping constructs. (line 29)
+* m4_assert: Diagnostic Macros. (line 11)
+* m4_bmatch: Conditional constructs.
+ (line 11)
+* m4_bpatsubst: Redefined M4 Macros. (line 79)
+* m4_bpatsubsts: Conditional constructs.
+ (line 18)
+* m4_bregexp: Redefined M4 Macros. (line 84)
+* m4_builtin: Redefined M4 Macros. (line 6)
+* m4_car: Looping constructs. (line 35)
+* m4_case: Conditional constructs.
+ (line 33)
+* m4_cdr: Looping constructs. (line 41)
+* m4_changecom: Redefined M4 Macros. (line 6)
+* m4_changequote: Redefined M4 Macros. (line 6)
+* m4_chomp: Text processing Macros.
+ (line 80)
+* m4_chomp_all: Text processing Macros.
+ (line 80)
+* m4_cleardivert: Diversion support. (line 125)
+* m4_cmp: Number processing Macros.
+ (line 11)
+* m4_combine: Text processing Macros.
+ (line 88)
+* m4_cond: Conditional constructs.
+ (line 42)
+* m4_copy: Redefined M4 Macros. (line 92)
+* m4_copy_force: Redefined M4 Macros. (line 92)
+* m4_count: Evaluation Macros. (line 26)
+* m4_curry: Evaluation Macros. (line 30)
+* m4_debugfile: Redefined M4 Macros. (line 6)
+* m4_debugmode: Redefined M4 Macros. (line 6)
+* m4_decr: Redefined M4 Macros. (line 6)
+* m4_default: Conditional constructs.
+ (line 73)
+* m4_default_nblank: Conditional constructs.
+ (line 73)
+* m4_default_nblank_quoted: Conditional constructs.
+ (line 73)
+* m4_default_quoted: Conditional constructs.
+ (line 73)
+* m4_define: Redefined M4 Macros. (line 6)
+* m4_define_default: Conditional constructs.
+ (line 122)
+* m4_defn: Redefined M4 Macros. (line 111)
+* m4_divert: Redefined M4 Macros. (line 119)
+* m4_divert_once: Diversion support. (line 128)
+* m4_divert_pop: Diversion support. (line 133)
+* m4_divert_push: Diversion support. (line 139)
+* m4_divert_text: Diversion support. (line 145)
+* m4_divnum: Redefined M4 Macros. (line 6)
+* m4_do: Evaluation Macros. (line 45)
+* m4_dquote: Evaluation Macros. (line 65)
+* m4_dquote_elt: Evaluation Macros. (line 70)
+* m4_dumpdef: Redefined M4 Macros. (line 131)
+* m4_dumpdefs: Redefined M4 Macros. (line 131)
+* m4_echo: Evaluation Macros. (line 75)
+* m4_errprint: Redefined M4 Macros. (line 6)
+* m4_errprintn: Diagnostic Macros. (line 16)
+* m4_escape: Text processing Macros.
+ (line 108)
+* m4_esyscmd: Redefined M4 Macros. (line 6)
+* m4_esyscmd_s: Redefined M4 Macros. (line 148)
+* m4_eval: Redefined M4 Macros. (line 6)
+* m4_exit: Redefined M4 Macros. (line 154)
+* m4_expand: Evaluation Macros. (line 79)
+* m4_fatal: Diagnostic Macros. (line 20)
+* m4_flatten: Text processing Macros.
+ (line 113)
+* m4_for: Looping constructs. (line 59)
+* m4_foreach: Looping constructs. (line 69)
+* m4_foreach_w: Looping constructs. (line 83)
+* m4_format: Redefined M4 Macros. (line 6)
+* m4_if: Redefined M4 Macros. (line 160)
+* m4_ifblank: Conditional constructs.
+ (line 127)
+* m4_ifdef: Redefined M4 Macros. (line 6)
+* m4_ifnblank: Conditional constructs.
+ (line 127)
+* m4_ifndef: Conditional constructs.
+ (line 135)
+* m4_ifset: Conditional constructs.
+ (line 139)
+* m4_ifval: Conditional constructs.
+ (line 145)
+* m4_ifvaln: Conditional constructs.
+ (line 150)
+* m4_ignore: Evaluation Macros. (line 129)
+* m4_include: Redefined M4 Macros. (line 167)
+* m4_incr: Redefined M4 Macros. (line 6)
+* m4_index: Redefined M4 Macros. (line 6)
+* m4_indir: Redefined M4 Macros. (line 6)
+* m4_init: Diversion support. (line 171)
+* m4_join: Text processing Macros.
+ (line 119)
+* m4_joinall: Text processing Macros.
+ (line 119)
+* m4_len: Redefined M4 Macros. (line 6)
+* m4_list_cmp: Number processing Macros.
+ (line 16)
+* m4_location: Diagnostic Macros. (line 24)
+* m4_make_list: Evaluation Macros. (line 142)
+* m4_maketemp: Redefined M4 Macros. (line 171)
+* m4_map: Looping constructs. (line 93)
+* m4_map_args: Looping constructs. (line 130)
+* m4_map_args_pair: Looping constructs. (line 166)
+* m4_map_args_sep: Looping constructs. (line 178)
+* m4_map_args_w: Looping constructs. (line 189)
+* m4_map_sep: Looping constructs. (line 93)
+* m4_mapall: Looping constructs. (line 93)
+* m4_mapall_sep: Looping constructs. (line 93)
+* m4_max: Number processing Macros.
+ (line 38)
+* m4_min: Number processing Macros.
+ (line 42)
+* m4_mkstemp: Redefined M4 Macros. (line 171)
+* m4_n: Conditional constructs.
+ (line 154)
+* m4_newline: Text processing Macros.
+ (line 134)
+* m4_normalize: Text processing Macros.
+ (line 140)
+* m4_pattern_allow: Forbidden Patterns. (line 30)
+* m4_pattern_forbid: Forbidden Patterns. (line 17)
+* m4_popdef: Redefined M4 Macros. (line 182)
+* m4_pushdef: Redefined M4 Macros. (line 6)
+* m4_quote: Evaluation Macros. (line 161)
+* m4_re_escape: Text processing Macros.
+ (line 148)
+* m4_rename: Redefined M4 Macros. (line 92)
+* m4_rename_force: Redefined M4 Macros. (line 92)
+* m4_reverse: Evaluation Macros. (line 167)
+* m4_set_add: Set manipulation Macros.
+ (line 19)
+* m4_set_add_all: Set manipulation Macros.
+ (line 25)
+* m4_set_contains: Set manipulation Macros.
+ (line 29)
+* m4_set_contents: Set manipulation Macros.
+ (line 49)
+* m4_set_delete: Set manipulation Macros.
+ (line 79)
+* m4_set_difference: Set manipulation Macros.
+ (line 86)
+* m4_set_dump: Set manipulation Macros.
+ (line 49)
+* m4_set_empty: Set manipulation Macros.
+ (line 109)
+* m4_set_foreach: Set manipulation Macros.
+ (line 115)
+* m4_set_intersection: Set manipulation Macros.
+ (line 86)
+* m4_set_list: Set manipulation Macros.
+ (line 136)
+* m4_set_listc: Set manipulation Macros.
+ (line 136)
+* m4_set_map: Set manipulation Macros.
+ (line 171)
+* m4_set_map_sep: Set manipulation Macros.
+ (line 184)
+* m4_set_remove: Set manipulation Macros.
+ (line 195)
+* m4_set_size: Set manipulation Macros.
+ (line 206)
+* m4_set_union: Set manipulation Macros.
+ (line 86)
+* m4_shift: Redefined M4 Macros. (line 6)
+* m4_shift2: Looping constructs. (line 199)
+* m4_shift3: Looping constructs. (line 199)
+* m4_shiftn: Looping constructs. (line 199)
+* m4_sign: Number processing Macros.
+ (line 46)
+* m4_sinclude: Redefined M4 Macros. (line 167)
+* m4_split: Text processing Macros.
+ (line 152)
+* m4_stack_foreach: Looping constructs. (line 208)
+* m4_stack_foreach_lifo: Looping constructs. (line 208)
+* m4_stack_foreach_sep: Looping constructs. (line 230)
+* m4_stack_foreach_sep_lifo: Looping constructs. (line 230)
+* m4_strip: Text processing Macros.
+ (line 158)
+* m4_substr: Redefined M4 Macros. (line 6)
+* m4_syscmd: Redefined M4 Macros. (line 6)
+* m4_sysval: Redefined M4 Macros. (line 6)
+* m4_text_box: Text processing Macros.
+ (line 167)
+* m4_text_wrap: Text processing Macros.
+ (line 182)
+* m4_tolower: Text processing Macros.
+ (line 213)
+* m4_toupper: Text processing Macros.
+ (line 213)
+* m4_traceoff: Redefined M4 Macros. (line 6)
+* m4_traceon: Redefined M4 Macros. (line 6)
+* m4_translit: Redefined M4 Macros. (line 6)
+* m4_undefine: Redefined M4 Macros. (line 186)
+* m4_undivert: Redefined M4 Macros. (line 194)
+* m4_unquote: Evaluation Macros. (line 176)
+* m4_version_compare: Number processing Macros.
+ (line 50)
+* m4_version_prereq: Number processing Macros.
+ (line 90)
+* m4_warn: Diagnostic Macros. (line 28)
+* m4_wrap: Redefined M4 Macros. (line 204)
+* m4_wrap_lifo: Redefined M4 Macros. (line 204)
+
+
+File: autoconf.info, Node: Autotest Macro Index, Next: Program & Function Index, Prev: M4 Macro Index, Up: Indices
+
+B.7 Autotest Macro Index
+========================
+
+This is an alphabetical list of the Autotest macros.
+
+
+* Menu:
+
+* AT_ARG_OPTION: Writing Testsuites. (line 50)
+* AT_ARG_OPTION_ARG: Writing Testsuites. (line 79)
+* AT_BANNER: Writing Testsuites. (line 124)
+* AT_CAPTURE_FILE: Writing Testsuites. (line 155)
+* AT_CHECK: Writing Testsuites. (line 212)
+* AT_CHECK_EUNIT: Writing Testsuites. (line 302)
+* AT_CHECK_UNQUOTED: Writing Testsuites. (line 212)
+* AT_CLEANUP: Writing Testsuites. (line 198)
+* AT_COLOR_TESTS: Writing Testsuites. (line 105)
+* AT_COPYRIGHT: Writing Testsuites. (line 41)
+* AT_DATA: Writing Testsuites. (line 202)
+* AT_FAIL_IF: Writing Testsuites. (line 160)
+* AT_INIT: Writing Testsuites. (line 31)
+* AT_KEYWORDS: Writing Testsuites. (line 142)
+* AT_PACKAGE_BUGREPORT: Making testsuite Scripts.
+ (line 12)
+* AT_PACKAGE_NAME: Making testsuite Scripts.
+ (line 12)
+* AT_PACKAGE_STRING: Making testsuite Scripts.
+ (line 12)
+* AT_PACKAGE_TARNAME: Making testsuite Scripts.
+ (line 12)
+* AT_PACKAGE_URL: Making testsuite Scripts.
+ (line 12)
+* AT_PACKAGE_VERSION: Making testsuite Scripts.
+ (line 12)
+* AT_SETUP: Writing Testsuites. (line 134)
+* AT_SKIP_IF: Writing Testsuites. (line 175)
+* AT_TESTED: Writing Testsuites. (line 109)
+* AT_XFAIL_IF: Writing Testsuites. (line 190)
+
+
+File: autoconf.info, Node: Program & Function Index, Next: Concept Index, Prev: Autotest Macro Index, Up: Indices
+
+B.8 Program and Function Index
+==============================
+
+This is an alphabetical list of the programs and functions whose
+portability is discussed in this document.
+
+
+* Menu:
+
+* !: Limitations of Builtins.
+ (line 41)
+* .: Limitations of Builtins.
+ (line 17)
+* /usr/bin/ksh on Solaris: Shellology. (line 63)
+* /usr/dt/bin/dtksh on Solaris: Shellology. (line 66)
+* /usr/xpg4/bin/sh on Solaris: Shellology. (line 64)
+* alloca: Particular Functions.
+ (line 10)
+* alloca.h: Particular Functions.
+ (line 10)
+* assert.h: Particular Headers. (line 20)
+* awk: Limitations of Usual Tools.
+ (line 10)
+* basename: Limitations of Usual Tools.
+ (line 142)
+* break: Limitations of Builtins.
+ (line 107)
+* case: Limitations of Builtins.
+ (line 110)
+* cat: Limitations of Usual Tools.
+ (line 146)
+* cc: Limitations of Usual Tools.
+ (line 149)
+* cd: Limitations of Builtins.
+ (line 203)
+* chgrp: Limitations of Usual Tools.
+ (line 183)
+* chmod: Limitations of Usual Tools.
+ (line 187)
+* chown <1>: Limitations of Usual Tools.
+ (line 183)
+* chown: Particular Functions.
+ (line 63)
+* closedir: Particular Functions.
+ (line 69)
+* cmp: Limitations of Usual Tools.
+ (line 197)
+* cp: Limitations of Usual Tools.
+ (line 204)
+* ctype.h: Particular Headers. (line 135)
+* date: Limitations of Usual Tools.
+ (line 264)
+* diff: Limitations of Usual Tools.
+ (line 274)
+* dirent.h: Particular Headers. (line 25)
+* dirname: Limitations of Usual Tools.
+ (line 280)
+* echo: Limitations of Builtins.
+ (line 233)
+* egrep: Limitations of Usual Tools.
+ (line 287)
+* error_at_line: Particular Functions.
+ (line 84)
+* eval: Limitations of Builtins.
+ (line 270)
+* exec: Limitations of Builtins.
+ (line 315)
+* exit <1>: Limitations of Builtins.
+ (line 355)
+* exit: Function Portability.
+ (line 17)
+* export: Limitations of Builtins.
+ (line 380)
+* expr: Limitations of Usual Tools.
+ (line 312)
+* expr (|): Limitations of Usual Tools.
+ (line 326)
+* false: Limitations of Builtins.
+ (line 428)
+* fgrep: Limitations of Usual Tools.
+ (line 435)
+* find: Limitations of Usual Tools.
+ (line 444)
+* float.h: Particular Headers. (line 135)
+* fnmatch: Particular Functions.
+ (line 94)
+* fnmatch.h: Particular Functions.
+ (line 452)
+* for: Limitations of Builtins.
+ (line 432)
+* fork: Particular Functions.
+ (line 120)
+* free: Function Portability.
+ (line 27)
+* fseeko: Particular Functions.
+ (line 147)
+* ftello: Particular Functions.
+ (line 147)
+* getgroups: Particular Functions.
+ (line 155)
+* getloadavg: Particular Functions.
+ (line 161)
+* getmntent: Particular Functions.
+ (line 195)
+* getpgid: Particular Functions.
+ (line 205)
+* getpgrp: Particular Functions.
+ (line 205)
+* grep: Limitations of Usual Tools.
+ (line 458)
+* if: Limitations of Builtins.
+ (line 477)
+* inttypes.h <1>: Particular Types. (line 6)
+* inttypes.h: Header Portability. (line 20)
+* isinf: Function Portability.
+ (line 32)
+* isnan: Function Portability.
+ (line 32)
+* join: Limitations of Usual Tools.
+ (line 526)
+* ksh: Shellology. (line 57)
+* ksh88: Shellology. (line 57)
+* ksh93: Shellology. (line 57)
+* linux/irda.h: Header Portability. (line 27)
+* linux/random.h: Header Portability. (line 30)
+* ln: Limitations of Usual Tools.
+ (line 543)
+* ls: Limitations of Usual Tools.
+ (line 555)
+* lstat: Particular Functions.
+ (line 228)
+* make: Portable Make. (line 6)
+* malloc <1>: Particular Functions.
+ (line 247)
+* malloc: Function Portability.
+ (line 82)
+* mbrtowc: Particular Functions.
+ (line 279)
+* memcmp: Particular Functions.
+ (line 286)
+* mkdir: Limitations of Usual Tools.
+ (line 577)
+* mkfifo: Limitations of Usual Tools.
+ (line 611)
+* mknod: Limitations of Usual Tools.
+ (line 611)
+* mktemp: Limitations of Usual Tools.
+ (line 621)
+* mktime: Particular Functions.
+ (line 299)
+* mmap: Particular Functions.
+ (line 311)
+* mv: Limitations of Usual Tools.
+ (line 646)
+* ndir.h: Particular Headers. (line 25)
+* net/if.h: Header Portability. (line 33)
+* netinet/if_ether.h: Header Portability. (line 53)
+* nlist.h: Particular Functions.
+ (line 178)
+* od: Limitations of Usual Tools.
+ (line 678)
+* pdksh: Shellology. (line 77)
+* printf: Limitations of Builtins.
+ (line 516)
+* putenv: Function Portability.
+ (line 89)
+* pwd: Limitations of Builtins.
+ (line 543)
+* read: Limitations of Builtins.
+ (line 574)
+* realloc <1>: Particular Functions.
+ (line 326)
+* realloc: Function Portability.
+ (line 105)
+* resolv.h: Particular Headers. (line 73)
+* rm: Limitations of Usual Tools.
+ (line 687)
+* rmdir: Limitations of Usual Tools.
+ (line 706)
+* sed: Limitations of Usual Tools.
+ (line 710)
+* sed (t): Limitations of Usual Tools.
+ (line 905)
+* select: Particular Functions.
+ (line 337)
+* set: Limitations of Builtins.
+ (line 580)
+* setpgrp: Particular Functions.
+ (line 348)
+* setvbuf: Obsolete Macros. (line 208)
+* shift: Limitations of Builtins.
+ (line 732)
+* sigaction: Function Portability.
+ (line 110)
+* signal: Function Portability.
+ (line 110)
+* signal.h: Obsolete Macros. (line 662)
+* sleep: Limitations of Usual Tools.
+ (line 965)
+* snprintf: Function Portability.
+ (line 124)
+* sort: Limitations of Usual Tools.
+ (line 971)
+* source: Limitations of Builtins.
+ (line 740)
+* sprintf: Function Portability.
+ (line 135)
+* sscanf: Function Portability.
+ (line 141)
+* stat: Particular Functions.
+ (line 363)
+* stdarg.h: Particular Headers. (line 135)
+* stdbool.h: Particular Headers. (line 10)
+* stdint.h <1>: Particular Types. (line 6)
+* stdint.h: Header Portability. (line 20)
+* stdlib.h <1>: Particular Types. (line 6)
+* stdlib.h <2>: Particular Headers. (line 135)
+* stdlib.h: Header Portability. (line 76)
+* strcoll: Particular Functions.
+ (line 379)
+* strerror_r <1>: Particular Functions.
+ (line 388)
+* strerror_r: Function Portability.
+ (line 149)
+* strftime: Particular Functions.
+ (line 401)
+* string.h: Particular Headers. (line 135)
+* strings.h: Particular Headers. (line 154)
+* strnlen <1>: Particular Functions.
+ (line 426)
+* strnlen: Function Portability.
+ (line 155)
+* strtod: Particular Functions.
+ (line 408)
+* strtold: Particular Functions.
+ (line 420)
+* sys/dir.h: Particular Headers. (line 25)
+* sys/ioctl.h: Particular Headers. (line 270)
+* sys/mkdev.h: Particular Headers. (line 68)
+* sys/mount.h: Header Portability. (line 79)
+* sys/ndir.h: Particular Headers. (line 25)
+* sys/ptem.h: Header Portability. (line 83)
+* sys/socket.h: Header Portability. (line 86)
+* sys/stat.h: Particular Headers. (line 92)
+* sys/sysmacros.h: Particular Headers. (line 68)
+* sys/time.h <1>: Particular Structures.
+ (line 35)
+* sys/time.h: Particular Headers. (line 244)
+* sys/types.h: Particular Types. (line 6)
+* sys/ucred.h: Header Portability. (line 89)
+* sys/wait.h: Particular Headers. (line 204)
+* sysconf: Function Portability.
+ (line 170)
+* tar: Limitations of Usual Tools.
+ (line 976)
+* termios.h: Particular Headers. (line 270)
+* test: Limitations of Builtins.
+ (line 744)
+* time.h <1>: Particular Structures.
+ (line 35)
+* time.h: Particular Headers. (line 244)
+* touch: Limitations of Usual Tools.
+ (line 981)
+* tr: Limitations of Usual Tools.
+ (line 994)
+* trap: Limitations of Builtins.
+ (line 856)
+* true: Limitations of Builtins.
+ (line 930)
+* unistd.h: Particular Headers. (line 228)
+* unlink: Function Portability.
+ (line 174)
+* unset: Limitations of Builtins.
+ (line 946)
+* unsetenv: Function Portability.
+ (line 180)
+* utime: Particular Functions.
+ (line 433)
+* va_copy: Function Portability.
+ (line 185)
+* va_list: Function Portability.
+ (line 192)
+* vfork: Particular Functions.
+ (line 120)
+* vfork.h: Particular Functions.
+ (line 120)
+* vprintf: Particular Functions.
+ (line 443)
+* vsnprintf: Function Portability.
+ (line 124)
+* vsprintf <1>: Particular Functions.
+ (line 443)
+* vsprintf: Function Portability.
+ (line 135)
+* wait: Limitations of Builtins.
+ (line 973)
+* wait3: Obsolete Macros. (line 216)
+* wchar.h: Particular Types. (line 88)
+* X11/extensions/scrnsaver.h: Header Portability. (line 92)
+* {...}: Limitations of Builtins.
+ (line 74)
+
+
+File: autoconf.info, Node: Concept Index, Prev: Program & Function Index, Up: Indices
+
+B.9 Concept Index
+=================
+
+This is an alphabetical list of the files, tools, and concepts
+introduced in this document.
+
+
+* Menu:
+
+* "$@": Shell Substitutions. (line 70)
+* $((EXPRESSION)): Shell Substitutions. (line 456)
+* $(COMMANDS): Shell Substitutions. (line 423)
+* $<, explicit rules, and VPATH: $< in Explicit Rules.
+ (line 6)
+* ${#VAR}: Shell Substitutions. (line 369)
+* ${VAR##WORD}: Shell Substitutions. (line 369)
+* ${VAR#WORD}: Shell Substitutions. (line 369)
+* ${VAR%%WORD}: Shell Substitutions. (line 369)
+* ${VAR%WORD}: Shell Substitutions. (line 369)
+* ${VAR+VALUE}: Shell Substitutions. (line 148)
+* ${VAR-VALUE}: Shell Substitutions. (line 140)
+* ${VAR=EXPANDED-VALUE}: Shell Substitutions. (line 319)
+* ${VAR=LITERAL}: Shell Substitutions. (line 295)
+* ${VAR=VALUE}: Shell Substitutions. (line 215)
+* 64-bit libraries: Site Defaults. (line 97)
+* @&t@: Quadrigraphs. (line 6)
+* @S|@: Quadrigraphs. (line 6)
+* ^ quoting: Shell Substitutions. (line 496)
+* _m4_divert_diversion: New Macros. (line 6)
+* `COMMANDS`: Shell Substitutions. (line 377)
+* abs_builddir: Preset Output Variables.
+ (line 177)
+* abs_srcdir: Preset Output Variables.
+ (line 199)
+* abs_top_builddir: Preset Output Variables.
+ (line 192)
+* abs_top_srcdir: Preset Output Variables.
+ (line 206)
+* absolute file names, detect: File System Conventions.
+ (line 52)
+* ac_objext: Generic Functions. (line 59)
+* ac_path_VARIABLE: Generic Programs. (line 123)
+* ac_path_VARIABLE_found: Generic Programs. (line 123)
+* ac_srcdir: Configuration Actions.
+ (line 85)
+* ac_top_build_prefix: Configuration Actions.
+ (line 80)
+* ac_top_srcdir: Configuration Actions.
+ (line 76)
+* acconfig.h: acconfig Header. (line 6)
+* aclocal.m4: Making configure Scripts.
+ (line 6)
+* Ash: Shellology. (line 16)
+* at_arg_OPTION: Writing Testsuites. (line 50)
+* at_optarg: Writing Testsuites. (line 62)
+* at_optarg_OPTION: Writing Testsuites. (line 62)
+* at_status: Writing Testsuites. (line 212)
+* autoconf: autoconf Invocation. (line 6)
+* Autoconf upgrading <1>: Autoconf 2.13. (line 6)
+* Autoconf upgrading: Autoconf 1. (line 6)
+* Autoconf version: Versioning. (line 6)
+* autoheader: autoheader Invocation.
+ (line 6)
+* Autoheader macros: Autoheader Macros. (line 6)
+* autom4te debugging tips: Debugging via autom4te.
+ (line 6)
+* Autom4te Library: autom4te Invocation. (line 225)
+* autom4te.cache: autom4te Invocation. (line 130)
+* autom4te.cfg: autom4te Invocation. (line 258)
+* Automake: Automake. (line 19)
+* Automatic remaking: Automatic Remaking. (line 6)
+* automatic rule rewriting and VPATH: Automatic Rule Rewriting.
+ (line 6)
+* autopoint: autoreconf Invocation.
+ (line 30)
+* autoreconf: autoreconf Invocation.
+ (line 6)
+* autoscan: autoscan Invocation. (line 6)
+* Autotest: Using Autotest. (line 6)
+* AUTOTEST_PATH: testsuite Invocation.
+ (line 60)
+* autoupdate: autoupdate Invocation.
+ (line 6)
+* Back trace <1>: autom4te Invocation. (line 86)
+* Back trace: autoconf Invocation. (line 86)
+* balancing parentheses: Balancing Parentheses.
+ (line 6)
+* Bash: Shellology. (line 43)
+* Bash 2.05 and later: Shellology. (line 49)
+* bindir: Installation Directory Variables.
+ (line 15)
+* Bootstrap: Bootstrapping. (line 6)
+* BSD make and obj/: obj/ and Make. (line 6)
+* buffer overruns: Buffer Overruns. (line 6)
+* Build directories: Build Directories. (line 6)
+* builddir: Preset Output Variables.
+ (line 174)
+* C function portability: Function Portability.
+ (line 6)
+* C types: Types. (line 6)
+* Cache: Caching Results. (line 6)
+* Cache variable: Cache Variable Names.
+ (line 6)
+* Cache, enabling: configure Invocation.
+ (line 25)
+* Canonical system type: Canonicalizing. (line 6)
+* carriage return, deleting: Limitations of Usual Tools.
+ (line 994)
+* CFLAGS: Preset Output Variables.
+ (line 23)
+* changequote: Changequote is Evil. (line 6)
+* Coding style: Coding Style. (line 6)
+* Command Substitution: Shell Substitutions. (line 377)
+* command-line, macros set on: Command-line Macros and whitespace.
+ (line 6)
+* Commands for configuration: Configuration Commands.
+ (line 6)
+* Comments in Makefile macros: Comments in Make Macros.
+ (line 6)
+* Comments in Makefile rules: Comments in Make Rules.
+ (line 6)
+* Common autoconf behavior: Common Behavior. (line 6)
+* Compilers: Compilers and Preprocessors.
+ (line 6)
+* composing variable names: Polymorphic Variables.
+ (line 131)
+* config.h: Configuration Headers.
+ (line 6)
+* config.h.bot: acconfig Header. (line 6)
+* config.h.in: Header Templates. (line 6)
+* config.h.top: acconfig Header. (line 6)
+* config.site: Site Defaults. (line 6)
+* config.status: config.status Invocation.
+ (line 6)
+* config.sub: Specifying Target Triplets.
+ (line 59)
+* CONFIG_COMMANDS: Obsolete config.status Use.
+ (line 11)
+* CONFIG_FILES: Obsolete config.status Use.
+ (line 15)
+* CONFIG_HEADERS: Obsolete config.status Use.
+ (line 20)
+* CONFIG_LINKS: Obsolete config.status Use.
+ (line 25)
+* CONFIG_SHELL: config.status Invocation.
+ (line 102)
+* CONFIG_STATUS: config.status Invocation.
+ (line 108)
+* Configuration actions: Configuration Actions.
+ (line 6)
+* Configuration commands: Configuration Commands.
+ (line 6)
+* Configuration file creation: Configuration Files. (line 6)
+* Configuration Header: Configuration Headers.
+ (line 6)
+* Configuration Header Template: Header Templates. (line 6)
+* Configuration links: Configuration Links. (line 6)
+* configure <1>: Running configure Scripts.
+ (line 6)
+* configure: Making configure Scripts.
+ (line 6)
+* Configure subdirectories: Subdirectories. (line 6)
+* configure.ac: Making configure Scripts.
+ (line 27)
+* configure.in: Making configure Scripts.
+ (line 27)
+* configure_input: Preset Output Variables.
+ (line 58)
+* Copyright Notice <1>: Writing Testsuites. (line 41)
+* Copyright Notice: Notices. (line 10)
+* CPPFLAGS: Preset Output Variables.
+ (line 72)
+* Creating configuration files: Configuration Files. (line 6)
+* Creating temporary files: Limitations of Usual Tools.
+ (line 621)
+* Cross compilation: Hosts and Cross-Compilation.
+ (line 6)
+* CXXFLAGS: Preset Output Variables.
+ (line 94)
+* Darwin: Systemology. (line 23)
+* Data structure, set: Set manipulation Macros.
+ (line 6)
+* datadir: Installation Directory Variables.
+ (line 18)
+* datarootdir <1>: Changed Directory Variables.
+ (line 6)
+* datarootdir: Installation Directory Variables.
+ (line 22)
+* debugging tips: Debugging via autom4te.
+ (line 6)
+* Declaration, checking: Declarations. (line 6)
+* Default includes: Default Includes. (line 6)
+* DEFS: Preset Output Variables.
+ (line 98)
+* deleting carriage return: Limitations of Usual Tools.
+ (line 994)
+* Dependencies between macros: Dependencies Between Macros.
+ (line 6)
+* Descriptors: File Descriptors. (line 6)
+* descriptors: File Descriptor Macros.
+ (line 6)
+* Directories, build: Build Directories. (line 6)
+* Directories, installation: Installation Directory Variables.
+ (line 6)
+* division, integer: Signed Integer Division.
+ (line 6)
+* dnl <1>: Coding Style. (line 42)
+* dnl: Macro Definitions. (line 51)
+* docdir: Installation Directory Variables.
+ (line 26)
+* double-colon rules and VPATH: VPATH and Double-colon.
+ (line 6)
+* dvidir: Installation Directory Variables.
+ (line 30)
+* ECHO_C: Preset Output Variables.
+ (line 106)
+* ECHO_N: Preset Output Variables.
+ (line 107)
+* ECHO_T: Preset Output Variables.
+ (line 108)
+* Endianness: C Compiler. (line 184)
+* environment, macros set from: Command-line Macros and whitespace.
+ (line 6)
+* Erlang: Erlang Compiler and Interpreter.
+ (line 6)
+* Erlang, Library, checking: Erlang Libraries. (line 6)
+* ERLANG_INSTALL_LIB_DIR: Installation Directory Variables.
+ (line 201)
+* ERLANG_INSTALL_LIB_DIR_: Installation Directory Variables.
+ (line 206)
+* ERLCFLAGS: Preset Output Variables.
+ (line 120)
+* exec_prefix: Installation Directory Variables.
+ (line 33)
+* exiting portably: Exiting Portably. (line 6)
+* expanded before required: Expanded Before Required.
+ (line 6)
+* explicit rules, $<, and VPATH: $< in Explicit Rules.
+ (line 6)
+* External software: External Software. (line 6)
+* F77: Fortran Compiler. (line 6)
+* FCFLAGS: Preset Output Variables.
+ (line 126)
+* FFLAGS: Preset Output Variables.
+ (line 133)
+* FHS: Site Defaults. (line 83)
+* File descriptors: File Descriptors. (line 6)
+* file descriptors: File Descriptor Macros.
+ (line 6)
+* File system conventions: File System Conventions.
+ (line 6)
+* File, checking: Files. (line 6)
+* Filesystem Hierarchy Standard: Site Defaults. (line 83)
+* floating point: Floating Point Portability.
+ (line 6)
+* Forbidden patterns: Forbidden Patterns. (line 6)
+* Fortran: Fortran Compiler. (line 6)
+* Function, checking: Particular Functions.
+ (line 6)
+* Gettext: autoreconf Invocation.
+ (line 30)
+* GNU build system: The GNU Build System.
+ (line 6)
+* Gnulib: Gnulib. (line 11)
+* Go: Go Compiler. (line 6)
+* GOFLAGS: Preset Output Variables.
+ (line 170)
+* Header portability: Header Portability. (line 6)
+* Header templates: Header Templates. (line 6)
+* Header, checking: Header Files. (line 6)
+* Help strings: Pretty Help Strings. (line 6)
+* Here-documents: Here-Documents. (line 6)
+* History of autoconf: History. (line 6)
+* htmldir: Installation Directory Variables.
+ (line 40)
+* ifnames: ifnames Invocation. (line 6)
+* Imake: Why Not Imake. (line 6)
+* includedir: Installation Directory Variables.
+ (line 43)
+* Includes, default: Default Includes. (line 6)
+* indirection, variable name: Polymorphic Variables.
+ (line 6)
+* infodir: Installation Directory Variables.
+ (line 46)
+* input: File Descriptor Macros.
+ (line 6)
+* Install prefix: Default Prefix. (line 6)
+* Installation directories: Installation Directory Variables.
+ (line 6)
+* Instantiation: Output. (line 13)
+* integer overflow <1>: Signed Overflow Advice.
+ (line 6)
+* integer overflow <2>: Signed Overflow Examples.
+ (line 6)
+* integer overflow <3>: Integer Overflow Basics.
+ (line 6)
+* integer overflow: Integer Overflow. (line 6)
+* Introduction: Introduction. (line 6)
+* invoking the shell: Invoking the Shell. (line 6)
+* Korn shell: Shellology. (line 57)
+* Ksh: Shellology. (line 57)
+* Language: Language Choice. (line 6)
+* Large file support: System Services. (line 49)
+* LDFLAGS: Preset Output Variables.
+ (line 140)
+* LFS: System Services. (line 49)
+* lib64: Site Defaults. (line 97)
+* libdir: Installation Directory Variables.
+ (line 49)
+* libexecdir: Installation Directory Variables.
+ (line 52)
+* Library, checking: Libraries. (line 6)
+* LIBS: Preset Output Variables.
+ (line 154)
+* Libtool: Libtool. (line 14)
+* License: Distributing. (line 6)
+* Limitations of make: Portable Make. (line 6)
+* Limitations of shell builtins: Limitations of Builtins.
+ (line 6)
+* Limitations of usual tools: Limitations of Usual Tools.
+ (line 6)
+* Links: Configuration Links. (line 12)
+* Links for configuration: Configuration Links. (line 6)
+* Listing directories: Limitations of Usual Tools.
+ (line 555)
+* localedir: Installation Directory Variables.
+ (line 55)
+* localstatedir: Installation Directory Variables.
+ (line 60)
+* loop induction: Optimization and Wraparound.
+ (line 6)
+* low-level output: File Descriptor Macros.
+ (line 6)
+* M4: Programming in M4. (line 6)
+* M4 quotation: M4 Quotation. (line 6)
+* M4sugar: Programming in M4sugar.
+ (line 6)
+* m4sugar debugging tips: Debugging via autom4te.
+ (line 6)
+* Macro invocation stack <1>: autom4te Invocation. (line 86)
+* Macro invocation stack: autoconf Invocation. (line 86)
+* Macros, called once: One-Shot Macros. (line 6)
+* Macros, obsoleting: Obsoleting Macros. (line 6)
+* Macros, ordering: Suggested Ordering. (line 6)
+* Macros, prerequisites: Prerequisite Macros. (line 6)
+* make -k: make -k Status. (line 6)
+* make and MAKEFLAGS: The Make Macro MAKEFLAGS.
+ (line 6)
+* make and SHELL: The Make Macro SHELL.
+ (line 6)
+* Makefile macros and comments: Comments in Make Macros.
+ (line 6)
+* Makefile macros and whitespace: Trailing whitespace in Make Macros.
+ (line 6)
+* Makefile rules and comments: Comments in Make Rules.
+ (line 6)
+* Makefile rules and newlines: Newlines in Make Rules.
+ (line 6)
+* Makefile substitutions: Makefile Substitutions.
+ (line 6)
+* MAKEFLAGS and make: The Make Macro MAKEFLAGS.
+ (line 6)
+* Making directories: Limitations of Usual Tools.
+ (line 577)
+* mandir: Installation Directory Variables.
+ (line 63)
+* Messages, from autoconf: Reporting Messages. (line 6)
+* Messages, from configure: Printing Messages. (line 6)
+* Messages, from M4sugar: Diagnostic Macros. (line 6)
+* Moving open files: Limitations of Usual Tools.
+ (line 646)
+* newline, deleting: Limitations of Usual Tools.
+ (line 994)
+* Newlines in Makefile rules: Newlines in Make Rules.
+ (line 6)
+* Notices in configure: Notices. (line 6)
+* null pointers: Null Pointers. (line 6)
+* obj/, subdirectory: obj/ and Make. (line 6)
+* OBJCFLAGS: Preset Output Variables.
+ (line 162)
+* OBJCXXFLAGS: Preset Output Variables.
+ (line 166)
+* Obsolete constructs: Obsolete Constructs. (line 6)
+* Obsoleting macros: Obsoleting Macros. (line 6)
+* obstack: Particular Functions.
+ (line 319)
+* oldincludedir: Installation Directory Variables.
+ (line 66)
+* One-shot macros: One-Shot Macros. (line 6)
+* Options, Package: Option Checking. (line 6)
+* Options, package: Package Options. (line 6)
+* Ordering macros: Suggested Ordering. (line 6)
+* Output variables <1>: Setting Output Variables.
+ (line 6)
+* Output variables: Preset Output Variables.
+ (line 6)
+* Output variables, special characters in: Special Chars in Variables.
+ (line 6)
+* output, low-level: File Descriptor Macros.
+ (line 6)
+* Outputting files: Output. (line 6)
+* overflow, signed integer <1>: Signed Overflow Advice.
+ (line 6)
+* overflow, signed integer <2>: Signed Overflow Examples.
+ (line 6)
+* overflow, signed integer <3>: Integer Overflow Basics.
+ (line 6)
+* overflow, signed integer: Integer Overflow. (line 6)
+* Package options: Package Options. (line 6)
+* package.m4: Making testsuite Scripts.
+ (line 12)
+* Parallel make: Parallel Make. (line 6)
+* parentheses, balancing: Balancing Parentheses.
+ (line 6)
+* Patterns, forbidden: Forbidden Patterns. (line 6)
+* pdfdir: Installation Directory Variables.
+ (line 69)
+* polymorphic variable name: Polymorphic Variables.
+ (line 6)
+* portability: Varieties of Unportability.
+ (line 6)
+* Portability of C functions: Function Portability.
+ (line 6)
+* Portability of headers: Header Portability. (line 6)
+* Portable C and C++ programming: Portable C and C++. (line 6)
+* Portable shell programming: Portable Shell. (line 6)
+* positional parameters: Shell Substitutions. (line 121)
+* Posix termios headers: System Services. (line 75)
+* Precious Variable: Setting Output Variables.
+ (line 65)
+* prefix: Installation Directory Variables.
+ (line 72)
+* Prefix for install: Default Prefix. (line 6)
+* preprocessor arithmetic: Preprocessor Arithmetic.
+ (line 6)
+* Preprocessors: Compilers and Preprocessors.
+ (line 6)
+* prerequisite directories and VPATH: Tru64 Directory Magic.
+ (line 6)
+* Prerequisite macros: Prerequisite Macros. (line 6)
+* Program names, transforming: Transforming Names. (line 6)
+* Programs, checking: Alternative Programs.
+ (line 6)
+* psdir: Installation Directory Variables.
+ (line 77)
+* QNX 4.25: Systemology. (line 37)
+* quadrigraphs: Quadrigraphs. (line 6)
+* quotation <1>: M4 Quotation. (line 6)
+* quotation: Autoconf Language. (line 6)
+* Remaking automatically: Automatic Remaking. (line 6)
+* Revision: Notices. (line 18)
+* Rule, Single Suffix Inference: Single Suffix Rules. (line 6)
+* sbindir: Installation Directory Variables.
+ (line 80)
+* Separated Dependencies: Single Suffix Rules. (line 9)
+* set -b: Limitations of Builtins.
+ (line 689)
+* set -e: Limitations of Builtins.
+ (line 605)
+* set -m: Limitations of Builtins.
+ (line 689)
+* set -n: Limitations of Builtins.
+ (line 713)
+* Set manipulation: Set manipulation Macros.
+ (line 6)
+* sharedstatedir: Installation Directory Variables.
+ (line 84)
+* SHELL and make: The Make Macro SHELL.
+ (line 6)
+* Shell assignments: Assignments. (line 6)
+* Shell builtins: Limitations of Builtins.
+ (line 6)
+* Shell file descriptors: File Descriptors. (line 6)
+* Shell Functions: Shell Functions. (line 6)
+* Shell here-documents: Here-Documents. (line 6)
+* shell invocation: Invoking the Shell. (line 6)
+* Shell parentheses: Parentheses. (line 6)
+* Shell pattern matching: Shell Pattern Matching.
+ (line 6)
+* Shell slashes: Slashes. (line 6)
+* Shell substitutions: Shell Substitutions. (line 6)
+* Shell variables: Special Shell Variables.
+ (line 6)
+* Shellology: Shellology. (line 6)
+* Signal handling in the shell: Signal Handling. (line 6)
+* Signals, shells and: Signal Handling. (line 6)
+* signed integer overflow <1>: Signed Overflow Advice.
+ (line 6)
+* signed integer overflow <2>: Signed Overflow Examples.
+ (line 6)
+* signed integer overflow <3>: Integer Overflow Basics.
+ (line 6)
+* signed integer overflow: Integer Overflow. (line 6)
+* Single Suffix Inference Rule: Single Suffix Rules. (line 6)
+* Site defaults: Site Defaults. (line 6)
+* Site details: Site Details. (line 6)
+* Special shell variables: Special Shell Variables.
+ (line 6)
+* srcdir <1>: Preset Output Variables.
+ (line 195)
+* srcdir: Configuration Actions.
+ (line 71)
+* standard input: File Descriptor Macros.
+ (line 6)
+* Standard symbols: Standard Symbols. (line 6)
+* Structure, checking: Structures. (line 6)
+* Subdirectory configure: Subdirectories. (line 6)
+* Substitutions in makefiles: Makefile Substitutions.
+ (line 6)
+* Symbolic links: Limitations of Usual Tools.
+ (line 543)
+* sysconfdir: Installation Directory Variables.
+ (line 88)
+* System type <1>: Canonicalizing. (line 6)
+* System type: Specifying Target Triplets.
+ (line 6)
+* Systemology: Systemology. (line 6)
+* Target triplet: Specifying Target Triplets.
+ (line 6)
+* termios Posix headers: System Services. (line 75)
+* test group: testsuite Scripts. (line 12)
+* testsuite <1>: testsuite Invocation.
+ (line 6)
+* testsuite: testsuite Scripts. (line 6)
+* timestamp resolution <1>: Timestamps and Make. (line 6)
+* timestamp resolution: Limitations of Usual Tools.
+ (line 226)
+* tmp: Configuration Actions.
+ (line 89)
+* top_build_prefix: Preset Output Variables.
+ (line 184)
+* top_builddir: Preset Output Variables.
+ (line 180)
+* top_srcdir: Preset Output Variables.
+ (line 202)
+* Transforming program names: Transforming Names. (line 6)
+* Tru64: Systemology. (line 44)
+* Types: Types. (line 6)
+* unbalanced parentheses, managing: Balancing Parentheses.
+ (line 6)
+* undefined macro: New Macros. (line 6)
+* Unix version 7: Systemology. (line 49)
+* Unordered set manipulation: Set manipulation Macros.
+ (line 6)
+* Upgrading autoconf <1>: Autoconf 2.13. (line 6)
+* Upgrading autoconf: Autoconf 1. (line 6)
+* V7: Systemology. (line 49)
+* variable name indirection: Polymorphic Variables.
+ (line 6)
+* variable names, composing: Polymorphic Variables.
+ (line 131)
+* Variable, Precious: Setting Output Variables.
+ (line 65)
+* variables and VPATH: Variables listed in VPATH.
+ (line 6)
+* Version: Versioning. (line 11)
+* version, Autoconf: Versioning. (line 6)
+* volatile objects: Volatile Objects. (line 6)
+* VPATH: VPATH and Make. (line 6)
+* VPATH and automatic rule rewriting: Automatic Rule Rewriting.
+ (line 6)
+* VPATH and double-colon rules: VPATH and Double-colon.
+ (line 6)
+* VPATH and prerequisite directories: Tru64 Directory Magic.
+ (line 6)
+* VPATH and variables: Variables listed in VPATH.
+ (line 6)
+* VPATH, explicit rules, and $<: $< in Explicit Rules.
+ (line 6)
+* VPATH, resolving target pathnames: Make Target Lookup. (line 6)
+* whitespace in command-line macros: Command-line Macros and whitespace.
+ (line 6)
+* whitespace in Makefile macros: Trailing whitespace in Make Macros.
+ (line 6)
+* wraparound arithmetic <1>: Signed Overflow Advice.
+ (line 6)
+* wraparound arithmetic <2>: Signed Overflow Examples.
+ (line 6)
+* wraparound arithmetic <3>: Integer Overflow Basics.
+ (line 6)
+* wraparound arithmetic: Integer Overflow. (line 6)
+* X Window System: System Services. (line 10)
+* Zsh: Shellology. (line 87)
+
+
+
+Tag Table:
+Node: Top1954
+Node: Introduction21371
+Node: The GNU Build System27935
+Node: Automake28914
+Node: Gnulib30863
+Node: Libtool32172
+Node: Pointers33594
+Ref: Pointers-Footnote-134895
+Node: Making configure Scripts35055
+Node: Writing Autoconf Input38404
+Node: Shell Script Compiler39867
+Node: Autoconf Language42228
+Node: Autoconf Input Layout49397
+Node: autoscan Invocation50805
+Node: ifnames Invocation53361
+Node: autoconf Invocation54561
+Node: autoreconf Invocation59846
+Node: Setup64607
+Node: Initializing configure65929
+Ref: AC_INIT66434
+Node: Versioning69318
+Node: Notices71179
+Node: Input72354
+Ref: AC_CONFIG_SRCDIR72495
+Node: Output75442
+Ref: AC_OUTPUT75877
+Ref: AC_PROG_MAKE_SET77495
+Node: Configuration Actions77920
+Node: Configuration Files83208
+Ref: AC_CONFIG_FILES83469
+Node: Makefile Substitutions84688
+Node: Preset Output Variables86431
+Node: Installation Directory Variables95945
+Node: Changed Directory Variables103793
+Node: Build Directories106387
+Node: Automatic Remaking108242
+Node: Configuration Headers110410
+Node: Header Templates113712
+Node: autoheader Invocation116447
+Node: Autoheader Macros120089
+Node: Configuration Commands122354
+Ref: AC_CONFIG_COMMANDS122866
+Node: Configuration Links124151
+Ref: AC_CONFIG_LINKS124602
+Node: Subdirectories125575
+Node: Default Prefix128055
+Ref: AC_PREFIX_PROGRAM128946
+Node: Existing Tests129477
+Node: Common Behavior131279
+Node: Standard Symbols131918
+Node: Default Includes132499
+Node: Alternative Programs134753
+Node: Particular Programs135439
+Ref: AC_PROG_LEX141187
+Ref: AC_PROG_LN_S143798
+Node: Generic Programs145416
+Ref: AC_CHECK_PROG146388
+Ref: AC_CHECK_PROGS147114
+Ref: AC_PATH_PROG151114
+Ref: AC_PATH_PROGS151488
+Node: Files154567
+Node: Libraries155767
+Ref: AC_CHECK_LIB156008
+Ref: AC_SEARCH_LIBS158267
+Node: Library Functions159451
+Node: Function Portability160074
+Node: Particular Functions169586
+Ref: AC_FUNC_ALLOCA169917
+Ref: AC_FUNC_CLOSEDIR_VOID172306
+Ref: AC_FUNC_FORK174296
+Ref: AC_FUNC_GETLOADAVG176338
+Ref: AC_FUNC_GETMNTENT177903
+Ref: AC_FUNC_MMAP182145
+Ref: AC_FUNC_STRCOLL185000
+Ref: AC_FUNC_STRFTIME185975
+Ref: AC_FUNC_UTIME_NULL187257
+Ref: AC_FUNC_VPRINTF187605
+Node: Generic Functions188821
+Ref: AC_CHECK_FUNC189347
+Ref: AC_CHECK_FUNCS189976
+Node: Header Files194602
+Node: Header Portability195235
+Node: Particular Headers198330
+Ref: AC_HEADER_DIRENT199369
+Ref: AC_HEADER_MAJOR200899
+Ref: AC_HEADER_STAT201683
+Ref: AC_HEADER_STDC203189
+Ref: AC_HEADER_TIME207928
+Node: Generic Headers209315
+Ref: AC_CHECK_HEADER209715
+Ref: AC_CHECK_HEADERS211588
+Node: Declarations214153
+Node: Particular Declarations214749
+Node: Generic Declarations214973
+Ref: AC_CHECK_DECLS216358
+Node: Structures218884
+Node: Particular Structures219499
+Ref: AC_STRUCT_ST_BLOCKS220568
+Ref: AC_STRUCT_TIMEZONE221264
+Node: Generic Structures221593
+Ref: AC_CHECK_MEMBERS222584
+Node: Types223417
+Node: Particular Types223937
+Ref: AC_TYPE_GETGROUPS224380
+Ref: AC_TYPE_MODE_T227416
+Ref: AC_TYPE_OFF_T227599
+Ref: AC_TYPE_PID_T227779
+Ref: AC_TYPE_SIZE_T227959
+Ref: AC_TYPE_UID_T228328
+Node: Generic Types229973
+Node: Compilers and Preprocessors232128
+Node: Specific Compiler Characteristics233402
+Node: Generic Compiler Characteristics234507
+Ref: AC_CHECK_SIZEOF234747
+Node: C Compiler239537
+Ref: AC_PROG_CC_C_O243988
+Ref: AC_C_BIGENDIAN247796
+Ref: AC_C_CONST249637
+Ref: AC_C_INLINE252955
+Ref: AC_C_CHAR_UNSIGNED253178
+Ref: AC_PROG_GCC_TRADITIONAL255800
+Node: C++ Compiler256212
+Node: Objective C Compiler258609
+Node: Objective C++ Compiler259983
+Node: Erlang Compiler and Interpreter261433
+Node: Fortran Compiler263478
+Node: Go Compiler288878
+Node: System Services289923
+Ref: AC_PATH_X290168
+Ref: AC_PATH_XTRA291161
+Ref: AC_SYS_INTERPRETER291738
+Ref: AC_SYS_LONG_FILE_NAMES293150
+Node: Posix Variants293527
+Ref: AC_USE_SYSTEM_EXTENSIONS293827
+Node: Erlang Libraries294903
+Node: Writing Tests299841
+Node: Language Choice301865
+Ref: AC_LANG302362
+Ref: AC_LANG_PUSH304161
+Ref: Language Choice-Footnote-1306034
+Node: Writing Test Programs306190
+Node: Guidelines306768
+Node: Test Functions309028
+Node: Generating Sources310426
+Node: Running the Preprocessor316510
+Ref: AC_PREPROC_IFELSE317242
+Ref: AC_EGREP_HEADER319172
+Ref: AC_EGREP_CPP319501
+Node: Running the Compiler319926
+Node: Running the Linker321681
+Ref: AC_LINK_IFELSE322821
+Node: Runtime323697
+Ref: AC_RUN_IFELSE324472
+Node: Systemology329322
+Node: Multiple Cases331671
+Node: Results333372
+Node: Defining Symbols334191
+Node: Setting Output Variables339082
+Node: Special Chars in Variables344973
+Node: Caching Results346233
+Node: Cache Variable Names349951
+Node: Cache Files351602
+Node: Cache Checkpointing353927
+Node: Printing Messages355301
+Ref: AC_MSG_RESULT356815
+Ref: AC_MSG_NOTICE357322
+Ref: AC_MSG_ERROR357686
+Ref: AC_MSG_WARN358519
+Node: Programming in M4358942
+Node: M4 Quotation359747
+Node: Active Characters360716
+Ref: Active Characters-Footnote-1362106
+Ref: Active Characters-Footnote-2362220
+Node: One Macro Call362242
+Node: Quoting and Parameters363798
+Node: Quotation and Nested Macros366134
+Node: Changequote is Evil369144
+Node: Quadrigraphs371674
+Node: Balancing Parentheses374356
+Node: Quotation Rule Of Thumb378450
+Node: Using autom4te381348
+Ref: Using autom4te-Footnote-1381999
+Node: autom4te Invocation382048
+Node: Customizing autom4te390550
+Node: Programming in M4sugar391831
+Node: Redefined M4 Macros393012
+Node: Diagnostic Macros401342
+Ref: m4_fatal402095
+Ref: m4_warn402334
+Node: Diversion support403102
+Node: Conditional constructs410888
+Node: Looping constructs417742
+Ref: m4_foreach_w421354
+Node: Evaluation Macros428706
+Node: Text processing Macros437395
+Node: Number processing Macros447105
+Ref: m4_version_compare449057
+Node: Set manipulation Macros451364
+Node: Forbidden Patterns460480
+Node: Debugging via autom4te461971
+Node: Programming in M4sh463790
+Node: Common Shell Constructs465163
+Node: Polymorphic Variables473136
+Node: Initialization Macros482725
+Node: File Descriptor Macros488314
+Ref: AS_MESSAGE_LOG_FD489466
+Node: Writing Autoconf Macros490968
+Node: Macro Definitions491773
+Node: Macro Names495452
+Node: Reporting Messages499213
+Node: Dependencies Between Macros501057
+Node: Prerequisite Macros501752
+Node: Suggested Ordering507827
+Node: One-Shot Macros509370
+Node: Obsoleting Macros510723
+Ref: AU_DEFUN511477
+Node: Coding Style512506
+Node: Portable Shell520313
+Node: Shellology524621
+Node: Invoking the Shell528792
+Node: Here-Documents529974
+Node: File Descriptors533594
+Node: Signal Handling540032
+Node: File System Conventions545240
+Node: Shell Pattern Matching551052
+Node: Shell Substitutions551616
+Node: Assignments569492
+Node: Parentheses571383
+Node: Slashes572340
+Node: Special Shell Variables573194
+Node: Shell Functions586526
+Node: Limitations of Builtins589933
+Ref: case593955
+Ref: echo599113
+Ref: export606087
+Ref: if609507
+Ref: set613318
+Ref: trap625040
+Ref: unset628851
+Node: Limitations of Usual Tools629946
+Ref: awk630245
+Ref: grep648349
+Ref: mkdir653981
+Ref: sed659801
+Ref: touch670932
+Node: Portable Make674207
+Node: $< in Ordinary Make Rules675869
+Node: Failure in Make Rules676335
+Node: Special Chars in Names677363
+Node: Backslash-Newline-Empty678335
+Node: Backslash-Newline Comments679367
+Node: Long Lines in Makefiles680256
+Node: Macros and Submakes680632
+Node: The Make Macro MAKEFLAGS683319
+Node: The Make Macro SHELL684204
+Node: Parallel Make686703
+Node: Comments in Make Rules690387
+Node: Newlines in Make Rules691557
+Node: Comments in Make Macros692602
+Node: Trailing whitespace in Make Macros693812
+Node: Command-line Macros and whitespace694563
+Node: obj/ and Make695233
+Node: make -k Status695884
+Node: VPATH and Make696506
+Node: Variables listed in VPATH697830
+Node: VPATH and Double-colon698369
+Node: $< in Explicit Rules698775
+Node: Automatic Rule Rewriting699242
+Node: Tru64 Directory Magic705924
+Node: Make Target Lookup706750
+Node: Single Suffix Rules711192
+Node: Timestamps and Make712538
+Node: Portable C and C++714223
+Node: Varieties of Unportability715864
+Node: Integer Overflow717961
+Node: Integer Overflow Basics718974
+Node: Signed Overflow Examples720722
+Node: Optimization and Wraparound724224
+Node: Signed Overflow Advice727186
+Node: Signed Integer Division729860
+Node: Preprocessor Arithmetic730471
+Node: Null Pointers731220
+Node: Buffer Overruns731854
+Node: Volatile Objects734643
+Node: Floating Point Portability740321
+Node: Exiting Portably740828
+Node: Manual Configuration742304
+Node: Specifying Target Triplets743137
+Ref: Specifying Names743310
+Node: Canonicalizing746185
+Node: Using System Type748448
+Node: Site Configuration751252
+Node: Help Formatting752224
+Node: External Software753168
+Ref: AC_ARG_WITH754714
+Node: Package Options759039
+Ref: AC_ARG_ENABLE760494
+Node: Pretty Help Strings761655
+Ref: AS_HELP_STRING762241
+Node: Option Checking764582
+Node: Site Details766310
+Node: Transforming Names767539
+Node: Transformation Options768621
+Node: Transformation Examples769098
+Node: Transformation Rules770819
+Node: Site Defaults772365
+Node: Running configure Scripts777706
+Node: Basic Installation778771
+Node: Compilers and Options782868
+Node: Multiple Architectures783522
+Node: Installation Names785102
+Node: Optional Features787997
+Node: Particular Systems789351
+Node: System Type790775
+Node: Sharing Defaults792103
+Node: Defining Variables792741
+Node: configure Invocation793639
+Node: config.status Invocation795345
+Ref: CONFIG_SHELL799092
+Node: Obsolete Constructs800258
+Node: Obsolete config.status Use801221
+Node: acconfig Header802999
+Node: autoupdate Invocation805021
+Node: Obsolete Macros806887
+Ref: AC_FUNC_SETVBUF_REVERSED814529
+Ref: AC_TYPE_SIGNAL831075
+Node: Autoconf 1834053
+Node: Changed File Names835119
+Node: Changed Makefiles835869
+Node: Changed Macros836957
+Node: Changed Results838211
+Node: Changed Macro Writing840335
+Node: Autoconf 2.13841615
+Node: Changed Quotation842823
+Node: New Macros844741
+Node: Hosts and Cross-Compilation846536
+Node: AC_LIBOBJ vs LIBOBJS850691
+Node: AC_ACT_IFELSE vs AC_TRY_ACT852306
+Ref: AC_FOO_IFELSE vs AC_TRY_FOO852495
+Node: Using Autotest854308
+Node: Using an Autotest Test Suite856712
+Node: testsuite Scripts857003
+Node: Autotest Logs861485
+Node: Writing Testsuites863826
+Node: testsuite Invocation880858
+Node: Making testsuite Scripts886205
+Node: FAQ891343
+Node: Distributing892203
+Node: Why GNU M4893252
+Node: Bootstrapping894121
+Node: Why Not Imake894731
+Node: Defining Directories899482
+Node: Autom4te Cache901640
+Node: Present But Cannot Be Compiled903478
+Node: Expanded Before Required907195
+Node: Debugging912093
+Node: History917116
+Node: Genesis917985
+Node: Exodus919163
+Node: Leviticus922208
+Node: Numbers923736
+Node: Deuteronomy925651
+Node: GNU Free Documentation License928322
+Node: Indices953487
+Node: Environment Variable Index954206
+Node: Output Variable Index965546
+Node: Preprocessor Symbol Index982426
+Node: Cache Variable Index1000695
+Node: Autoconf Macro Index1011383
+Node: M4 Macro Index1045712
+Node: Autotest Macro Index1066462
+Node: Program & Function Index1068865
+Node: Concept Index1089579
+
+End Tag Table
diff --git a/doc/autoconf.texi b/doc/autoconf.texi
new file mode 100644
index 0000000..34ca213
--- /dev/null
+++ b/doc/autoconf.texi
@@ -0,0 +1,26667 @@
+\input texinfo @c -*-texinfo-*-
+@comment ========================================================
+@comment %**start of header
+@setfilename autoconf.info
+@include version.texi
+@settitle Autoconf
+@setchapternewpage odd
+@ifnothtml
+@setcontentsaftertitlepage
+@end ifnothtml
+@finalout
+
+@c @ovar(ARG)
+@c ----------
+@c The ARG is an optional argument. To be used for macro arguments in
+@c their documentation (@defmac).
+@macro ovar{varname}
+@r{[}@var{\varname\}@r{]}@c
+@end macro
+
+@c @dvar(ARG, DEFAULT)
+@c -------------------
+@c The ARG is an optional argument, defaulting to DEFAULT. To be used
+@c for macro arguments in their documentation (@defmac).
+@macro dvar{varname, default}
+@r{[}@var{\varname\} = @samp{\default\}@r{]}@c
+@end macro
+
+@c Handling the indexes with Texinfo yields several different problems.
+@c
+@c Because we want to drop out the AC_ part of the macro names in the
+@c printed manual, but not in the other outputs, we need a layer above
+@c the usual @acindex{} etc. That's why we first define indexes such as
+@c acx meant to become the macro @acindex. First of all, using ``ac_''
+@c does not work with makeinfo, and using ``ac1'' doesn't work with TeX.
+@c So use something more regular ``acx''. Then you finish with a printed
+@c index saying ``index is not existent''. Of course: you ought to use
+@c two letters :( So you use capitals.
+@c
+@c Second, when defining a macro in the TeX world, following spaces are
+@c eaten. But then, since we embed @acxindex commands that use the end
+@c of line as an end marker, the whole things wrecks itself. So make
+@c sure you do *force* an additional end of line, add a ``@c''.
+@c
+@c Finally, you might want to get rid of TeX expansion, using --expand
+@c with texi2dvi. But then you wake up an old problem: we use macros
+@c in @defmac etc. where TeX does perform the expansion, but not makeinfo.
+
+@c Define an environment variable index, for variables users may set
+@c in their environment or on the configure command line.
+@defcodeindex ev
+@c Define an output variable index, for commonly AC_SUBST'ed variables.
+@defcodeindex ov
+@c Define a cache variable index, for variables matching *_cv_*.
+@defcodeindex CA
+@c Other shell variables not fitting the above categories should be
+@c listed in the predefined vrindex, which we merge in the concept index.
+@syncodeindex vr cp
+@c Define a CPP preprocessor macro index, for #define'd strings.
+@defcodeindex cv
+@c Define an Autoconf macro index that @defmac doesn't write to.
+@defcodeindex AC
+@c Define an Autotest macro index that @defmac doesn't write to.
+@defcodeindex AT
+@c Define an M4sugar macro index that @defmac doesn't write to.
+@defcodeindex MS
+@c Define an index for *foreign* programs: `mv' etc. Used for the
+@c portability sections and so on.
+@defindex pr
+
+@c shortindexflag
+@c --------------
+@c Shall we factor AC_ out of the Autoconf macro index etc.?
+@iftex
+@set shortindexflag
+@end iftex
+
+@c @acindex{MACRO}
+@c ---------------
+@c Registering an AC_\MACRO\.
+@ifset shortindexflag
+@macro acindex{macro}
+@ACindex \macro\
+@c
+@end macro
+@end ifset
+@ifclear shortindexflag
+@macro acindex{macro}
+@ACindex AC_\macro\
+@end macro
+@end ifclear
+
+@c @ahindex{MACRO}
+@c ---------------
+@c Registering an AH_\MACRO\.
+@macro ahindex{macro}
+@ACindex AH_\macro\
+@c
+@end macro
+
+@c @asindex{MACRO}
+@c ---------------
+@c Registering an AS_\MACRO\.
+@ifset shortindexflag
+@macro asindex{macro}
+@MSindex \macro\
+@c
+@end macro
+@end ifset
+@ifclear shortindexflag
+@macro asindex{macro}
+@MSindex AS_\macro\
+@end macro
+@end ifclear
+
+@c @atindex{MACRO}
+@c ---------------
+@c Registering an AT_\MACRO\.
+@ifset shortindexflag
+@macro atindex{macro}
+@ATindex \macro\
+@c
+@end macro
+@end ifset
+@ifclear shortindexflag
+@macro atindex{macro}
+@ATindex AT_\macro\
+@end macro
+@end ifclear
+
+@c @auindex{MACRO}
+@c ---------------
+@c Registering an AU_\MACRO\.
+@macro auindex{macro}
+@ACindex AU_\macro\
+@c
+@end macro
+
+@c @hdrindex{MACRO}
+@c ----------------
+@c Indexing a header.
+@macro hdrindex{macro}
+@prindex @file{\macro\}
+@c
+@end macro
+
+@c @msindex{MACRO}
+@c ---------------
+@c Registering an m4_\MACRO\.
+@ifset shortindexflag
+@macro msindex{macro}
+@MSindex \macro\
+@c
+@end macro
+@end ifset
+@ifclear shortindexflag
+@macro msindex{macro}
+@MSindex m4_\macro\
+@end macro
+@end ifclear
+
+
+@c @caindex{VARIABLE}
+@c ------------------
+@c Registering an ac_cv_\VARIABLE\ cache variable.
+@ifset shortindexflag
+@macro caindex{macro}
+@CAindex \macro\
+@end macro
+@end ifset
+@ifclear shortindexflag
+@macro caindex{macro}
+@CAindex ac_cv_\macro\
+@end macro
+@end ifclear
+
+@c Define an index for functions: `alloca' etc. Used for the
+@c portability sections and so on. We can't use `fn' (aka `fnindex),
+@c since `@defmac' goes into it => we'd get all the macros too.
+
+@c FIXME: Aaarg! It seems there are too many indices for TeX :(
+@c
+@c ! No room for a new @write .
+@c l.112 @defcodeindex fu
+@c
+@c so don't define yet another one :( Just put some tags before each
+@c @prindex which is actually a @funindex.
+@c
+@c @defcodeindex fu
+@c
+@c
+@c @c Put the programs and functions into their own index.
+@c @syncodeindex fu pr
+
+@comment %**end of header
+@comment ========================================================
+
+@copying
+
+This manual (@value{UPDATED}) is for GNU Autoconf
+(version @value{VERSION}),
+a package for creating scripts to configure source code packages using
+templates and an M4 macro package.
+
+Copyright @copyright{} 1992-1996, 1998-2012 Free Software Foundation,
+Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License,
+Version 1.3 or any later version published by the Free Software
+Foundation; with no Invariant Sections, no Front-Cover texts, and
+no Back-Cover Texts. A copy of the license is included in the section
+entitled ``GNU Free Documentation License.''
+@end quotation
+@end copying
+
+
+
+@dircategory Software development
+@direntry
+* Autoconf: (autoconf). Create source code configuration scripts.
+@end direntry
+
+@dircategory Individual utilities
+@direntry
+* autoscan: (autoconf)autoscan Invocation.
+ Semi-automatic @file{configure.ac} writing
+* ifnames: (autoconf)ifnames Invocation. Listing conditionals in source.
+* autoconf-invocation: (autoconf)autoconf Invocation.
+ How to create configuration scripts
+* autoreconf: (autoconf)autoreconf Invocation.
+ Remaking multiple @command{configure} scripts
+* autoheader: (autoconf)autoheader Invocation.
+ How to create configuration templates
+* autom4te: (autoconf)autom4te Invocation.
+ The Autoconf executables backbone
+* configure: (autoconf)configure Invocation. Configuring a package.
+* autoupdate: (autoconf)autoupdate Invocation.
+ Automatic update of @file{configure.ac}
+* config.status: (autoconf)config.status Invocation. Recreating configurations.
+* testsuite: (autoconf)testsuite Invocation. Running an Autotest test suite.
+@end direntry
+
+@titlepage
+@title Autoconf
+@subtitle Creating Automatic Configuration Scripts
+@subtitle for version @value{VERSION}, @value{UPDATED}
+@author David MacKenzie
+@author Ben Elliston
+@author Akim Demaille
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+
+@ifnottex
+@node Top
+@top Autoconf
+@insertcopying
+@end ifnottex
+
+@c The master menu, created with texinfo-master-menu, goes here.
+
+@menu
+* Introduction:: Autoconf's purpose, strengths, and weaknesses
+* The GNU Build System:: A set of tools for portable software packages
+* Making configure Scripts:: How to organize and produce Autoconf scripts
+* Setup:: Initialization and output
+* Existing Tests:: Macros that check for particular features
+* Writing Tests:: How to write new feature checks
+* Results:: What to do with results from feature checks
+* Programming in M4:: Layers on top of which Autoconf is written
+* Programming in M4sh:: Shell portability layer
+* Writing Autoconf Macros:: Adding new macros to Autoconf
+* Portable Shell:: Shell script portability pitfalls
+* Portable Make:: Makefile portability pitfalls
+* Portable C and C++:: C and C++ portability pitfalls
+* Manual Configuration:: Selecting features that can't be guessed
+* Site Configuration:: Local defaults for @command{configure}
+* Running configure Scripts:: How to use the Autoconf output
+* config.status Invocation:: Recreating a configuration
+* Obsolete Constructs:: Kept for backward compatibility
+* Using Autotest:: Creating portable test suites
+* FAQ:: Frequent Autoconf Questions, with answers
+* History:: History of Autoconf
+* GNU Free Documentation License:: License for copying this manual
+* Indices:: Indices of symbols, concepts, etc.
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+The GNU Build System
+
+* Automake:: Escaping makefile hell
+* Gnulib:: The GNU portability library
+* Libtool:: Building libraries portably
+* Pointers:: More info on the GNU build system
+
+Making @command{configure} Scripts
+
+* Writing Autoconf Input:: What to put in an Autoconf input file
+* autoscan Invocation:: Semi-automatic @file{configure.ac} writing
+* ifnames Invocation:: Listing the conditionals in source code
+* autoconf Invocation:: How to create configuration scripts
+* autoreconf Invocation:: Remaking multiple @command{configure} scripts
+
+Writing @file{configure.ac}
+
+* Shell Script Compiler:: Autoconf as solution of a problem
+* Autoconf Language:: Programming in Autoconf
+* Autoconf Input Layout:: Standard organization of @file{configure.ac}
+
+Initialization and Output Files
+
+* Initializing configure:: Option processing etc.
+* Versioning:: Dealing with Autoconf versions
+* Notices:: Copyright, version numbers in @command{configure}
+* Input:: Where Autoconf should find files
+* Output:: Outputting results from the configuration
+* Configuration Actions:: Preparing the output based on results
+* Configuration Files:: Creating output files
+* Makefile Substitutions:: Using output variables in makefiles
+* Configuration Headers:: Creating a configuration header file
+* Configuration Commands:: Running arbitrary instantiation commands
+* Configuration Links:: Links depending on the configuration
+* Subdirectories:: Configuring independent packages together
+* Default Prefix:: Changing the default installation prefix
+
+Substitutions in Makefiles
+
+* Preset Output Variables:: Output variables that are always set
+* Installation Directory Variables:: Other preset output variables
+* Changed Directory Variables:: Warnings about @file{datarootdir}
+* Build Directories:: Supporting multiple concurrent compiles
+* Automatic Remaking:: Makefile rules for configuring
+
+Configuration Header Files
+
+* Header Templates:: Input for the configuration headers
+* autoheader Invocation:: How to create configuration templates
+* Autoheader Macros:: How to specify CPP templates
+
+Existing Tests
+
+* Common Behavior:: Macros' standard schemes
+* Alternative Programs:: Selecting between alternative programs
+* Files:: Checking for the existence of files
+* Libraries:: Library archives that might be missing
+* Library Functions:: C library functions that might be missing
+* Header Files:: Header files that might be missing
+* Declarations:: Declarations that may be missing
+* Structures:: Structures or members that might be missing
+* Types:: Types that might be missing
+* Compilers and Preprocessors:: Checking for compiling programs
+* System Services:: Operating system services
+* Posix Variants:: Special kludges for specific Posix variants
+* Erlang Libraries:: Checking for the existence of Erlang libraries
+
+Common Behavior
+
+* Standard Symbols:: Symbols defined by the macros
+* Default Includes:: Includes used by the generic macros
+
+Alternative Programs
+
+* Particular Programs:: Special handling to find certain programs
+* Generic Programs:: How to find other programs
+
+Library Functions
+
+* Function Portability:: Pitfalls with usual functions
+* Particular Functions:: Special handling to find certain functions
+* Generic Functions:: How to find other functions
+
+Header Files
+
+* Header Portability:: Collected knowledge on common headers
+* Particular Headers:: Special handling to find certain headers
+* Generic Headers:: How to find other headers
+
+Declarations
+
+* Particular Declarations:: Macros to check for certain declarations
+* Generic Declarations:: How to find other declarations
+
+Structures
+
+* Particular Structures:: Macros to check for certain structure members
+* Generic Structures:: How to find other structure members
+
+Types
+
+* Particular Types:: Special handling to find certain types
+* Generic Types:: How to find other types
+
+Compilers and Preprocessors
+
+* Specific Compiler Characteristics:: Some portability issues
+* Generic Compiler Characteristics:: Language independent tests and features
+* C Compiler:: Checking its characteristics
+* C++ Compiler:: Likewise
+* Objective C Compiler:: Likewise
+* Objective C++ Compiler:: Likewise
+* Erlang Compiler and Interpreter:: Likewise
+* Fortran Compiler:: Likewise
+* Go Compiler:: Likewise
+
+Writing Tests
+
+* Language Choice:: Selecting which language to use for testing
+* Writing Test Programs:: Forging source files for compilers
+* Running the Preprocessor:: Detecting preprocessor symbols
+* Running the Compiler:: Detecting language or header features
+* Running the Linker:: Detecting library features
+* Runtime:: Testing for runtime features
+* Systemology:: A zoology of operating systems
+* Multiple Cases:: Tests for several possible values
+
+Writing Test Programs
+
+* Guidelines:: General rules for writing test programs
+* Test Functions:: Avoiding pitfalls in test programs
+* Generating Sources:: Source program boilerplate
+
+Results of Tests
+
+* Defining Symbols:: Defining C preprocessor symbols
+* Setting Output Variables:: Replacing variables in output files
+* Special Chars in Variables:: Characters to beware of in variables
+* Caching Results:: Speeding up subsequent @command{configure} runs
+* Printing Messages:: Notifying @command{configure} users
+
+Caching Results
+
+* Cache Variable Names:: Shell variables used in caches
+* Cache Files:: Files @command{configure} uses for caching
+* Cache Checkpointing:: Loading and saving the cache file
+
+Programming in M4
+
+* M4 Quotation:: Protecting macros from unwanted expansion
+* Using autom4te:: The Autoconf executables backbone
+* Programming in M4sugar:: Convenient pure M4 macros
+* Debugging via autom4te:: Figuring out what M4 was doing
+
+M4 Quotation
+
+* Active Characters:: Characters that change the behavior of M4
+* One Macro Call:: Quotation and one macro call
+* Quoting and Parameters:: M4 vs. shell parameters
+* Quotation and Nested Macros:: Macros calling macros
+* Changequote is Evil:: Worse than INTERCAL: M4 + changequote
+* Quadrigraphs:: Another way to escape special characters
+* Balancing Parentheses:: Dealing with unbalanced parentheses
+* Quotation Rule Of Thumb:: One parenthesis, one quote
+
+Using @command{autom4te}
+
+* autom4te Invocation:: A GNU M4 wrapper
+* Customizing autom4te:: Customizing the Autoconf package
+
+Programming in M4sugar
+
+* Redefined M4 Macros:: M4 builtins changed in M4sugar
+* Diagnostic Macros:: Diagnostic messages from M4sugar
+* Diversion support:: Diversions in M4sugar
+* Conditional constructs:: Conditions in M4
+* Looping constructs:: Iteration in M4
+* Evaluation Macros:: More quotation and evaluation control
+* Text processing Macros:: String manipulation in M4
+* Number processing Macros:: Arithmetic computation in M4
+* Set manipulation Macros:: Set manipulation in M4
+* Forbidden Patterns:: Catching unexpanded macros
+
+Programming in M4sh
+
+* Common Shell Constructs:: Portability layer for common shell constructs
+* Polymorphic Variables:: Support for indirect variable names
+* Initialization Macros:: Macros to establish a sane shell environment
+* File Descriptor Macros:: File descriptor macros for input and output
+
+Writing Autoconf Macros
+
+* Macro Definitions:: Basic format of an Autoconf macro
+* Macro Names:: What to call your new macros
+* Reporting Messages:: Notifying @command{autoconf} users
+* Dependencies Between Macros:: What to do when macros depend on other macros
+* Obsoleting Macros:: Warning about old ways of doing things
+* Coding Style:: Writing Autoconf macros @`a la Autoconf
+
+Dependencies Between Macros
+
+* Prerequisite Macros:: Ensuring required information
+* Suggested Ordering:: Warning about possible ordering problems
+* One-Shot Macros:: Ensuring a macro is called only once
+
+Portable Shell Programming
+
+* Shellology:: A zoology of shells
+* Invoking the Shell:: Invoking the shell as a command
+* Here-Documents:: Quirks and tricks
+* File Descriptors:: FDs and redirections
+* Signal Handling:: Shells, signals, and headaches
+* File System Conventions:: File names
+* Shell Pattern Matching:: Pattern matching
+* Shell Substitutions:: Variable and command expansions
+* Assignments:: Varying side effects of assignments
+* Parentheses:: Parentheses in shell scripts
+* Slashes:: Slashes in shell scripts
+* Special Shell Variables:: Variables you should not change
+* Shell Functions:: What to look out for if you use them
+* Limitations of Builtins:: Portable use of not so portable /bin/sh
+* Limitations of Usual Tools:: Portable use of portable tools
+
+Portable Make Programming
+
+* $< in Ordinary Make Rules:: $< in ordinary rules
+* Failure in Make Rules:: Failing portably in rules
+* Special Chars in Names:: Special Characters in Macro Names
+* Backslash-Newline-Empty:: Empty lines after backslash-newline
+* Backslash-Newline Comments:: Spanning comments across line boundaries
+* Long Lines in Makefiles:: Line length limitations
+* Macros and Submakes:: @code{make macro=value} and submakes
+* The Make Macro MAKEFLAGS:: @code{$(MAKEFLAGS)} portability issues
+* The Make Macro SHELL:: @code{$(SHELL)} portability issues
+* Parallel Make:: Parallel @command{make} quirks
+* Comments in Make Rules:: Other problems with Make comments
+* Newlines in Make Rules:: Using literal newlines in rules
+* Comments in Make Macros:: Other problems with Make comments in macros
+* Trailing whitespace in Make Macros:: Macro substitution problems
+* Command-line Macros and whitespace:: Whitespace trimming of values
+* obj/ and Make:: Don't name a subdirectory @file{obj}
+* make -k Status:: Exit status of @samp{make -k}
+* VPATH and Make:: @code{VPATH} woes
+* Single Suffix Rules:: Single suffix rules and separated dependencies
+* Timestamps and Make:: Subsecond timestamp resolution
+
+@code{VPATH} and Make
+
+* Variables listed in VPATH:: @code{VPATH} must be literal on ancient hosts
+* VPATH and Double-colon:: Problems with @samp{::} on ancient hosts
+* $< in Explicit Rules:: @code{$<} does not work in ordinary rules
+* Automatic Rule Rewriting:: @code{VPATH} goes wild on Solaris
+* Tru64 Directory Magic:: @command{mkdir} goes wild on Tru64
+* Make Target Lookup:: More details about @code{VPATH} lookup
+
+Portable C and C++ Programming
+
+* Varieties of Unportability:: How to make your programs unportable
+* Integer Overflow:: When integers get too large
+* Preprocessor Arithmetic:: @code{#if} expression problems
+* Null Pointers:: Properties of null pointers
+* Buffer Overruns:: Subscript errors and the like
+* Volatile Objects:: @code{volatile} and signals
+* Floating Point Portability:: Portable floating-point arithmetic
+* Exiting Portably:: Exiting and the exit status
+
+Integer Overflow
+
+* Integer Overflow Basics:: Why integer overflow is a problem
+* Signed Overflow Examples:: Examples of code assuming wraparound
+* Optimization and Wraparound:: Optimizations that break uses of wraparound
+* Signed Overflow Advice:: Practical advice for signed overflow issues
+* Signed Integer Division:: @code{INT_MIN / -1} and @code{INT_MIN % -1}
+
+Manual Configuration
+
+* Specifying Target Triplets:: Specifying target triplets
+* Canonicalizing:: Getting the canonical system type
+* Using System Type:: What to do with the system type
+
+Site Configuration
+
+* Help Formatting:: Customizing @samp{configure --help}
+* External Software:: Working with other optional software
+* Package Options:: Selecting optional features
+* Pretty Help Strings:: Formatting help string
+* Option Checking:: Controlling checking of @command{configure} options
+* Site Details:: Configuring site details
+* Transforming Names:: Changing program names when installing
+* Site Defaults:: Giving @command{configure} local defaults
+
+Transforming Program Names When Installing
+
+* Transformation Options:: @command{configure} options to transform names
+* Transformation Examples:: Sample uses of transforming names
+* Transformation Rules:: Makefile uses of transforming names
+
+Running @command{configure} Scripts
+
+* Basic Installation:: Instructions for typical cases
+* Compilers and Options:: Selecting compilers and optimization
+* Multiple Architectures:: Compiling for multiple architectures at once
+* Installation Names:: Installing in different directories
+* Optional Features:: Selecting optional features
+* Particular Systems:: Particular systems
+* System Type:: Specifying the system type
+* Sharing Defaults:: Setting site-wide defaults for @command{configure}
+* Defining Variables:: Specifying the compiler etc.
+* configure Invocation:: Changing how @command{configure} runs
+
+Obsolete Constructs
+
+* Obsolete config.status Use:: Obsolete convention for @command{config.status}
+* acconfig Header:: Additional entries in @file{config.h.in}
+* autoupdate Invocation:: Automatic update of @file{configure.ac}
+* Obsolete Macros:: Backward compatibility macros
+* Autoconf 1:: Tips for upgrading your files
+* Autoconf 2.13:: Some fresher tips
+
+Upgrading From Version 1
+
+* Changed File Names:: Files you might rename
+* Changed Makefiles:: New things to put in @file{Makefile.in}
+* Changed Macros:: Macro calls you might replace
+* Changed Results:: Changes in how to check test results
+* Changed Macro Writing:: Better ways to write your own macros
+
+Upgrading From Version 2.13
+
+* Changed Quotation:: Broken code which used to work
+* New Macros:: Interaction with foreign macros
+* Hosts and Cross-Compilation:: Bugward compatibility kludges
+* AC_LIBOBJ vs LIBOBJS:: LIBOBJS is a forbidden token
+* AC_ACT_IFELSE vs AC_TRY_ACT:: A more generic scheme for testing sources
+
+Generating Test Suites with Autotest
+
+* Using an Autotest Test Suite:: Autotest and the user
+* Writing Testsuites:: Autotest macros
+* testsuite Invocation:: Running @command{testsuite} scripts
+* Making testsuite Scripts:: Using autom4te to create @command{testsuite}
+
+Using an Autotest Test Suite
+
+* testsuite Scripts:: The concepts of Autotest
+* Autotest Logs:: Their contents
+
+Frequent Autoconf Questions, with answers
+
+* Distributing:: Distributing @command{configure} scripts
+* Why GNU M4:: Why not use the standard M4?
+* Bootstrapping:: Autoconf and GNU M4 require each other?
+* Why Not Imake:: Why GNU uses @command{configure} instead of Imake
+* Defining Directories:: Passing @code{datadir} to program
+* Autom4te Cache:: What is it? Can I remove it?
+* Present But Cannot Be Compiled:: Compiler and Preprocessor Disagree
+* Expanded Before Required:: Expanded Before Required
+* Debugging:: Debugging @command{configure} scripts
+
+History of Autoconf
+
+* Genesis:: Prehistory and naming of @command{configure}
+* Exodus:: The plagues of M4 and Perl
+* Leviticus:: The priestly code of portability arrives
+* Numbers:: Growth and contributors
+* Deuteronomy:: Approaching the promises of easy configuration
+
+Indices
+
+* Environment Variable Index:: Index of environment variables used
+* Output Variable Index:: Index of variables set in output files
+* Preprocessor Symbol Index:: Index of C preprocessor symbols defined
+* Cache Variable Index:: Index of documented cache variables
+* Autoconf Macro Index:: Index of Autoconf macros
+* M4 Macro Index:: Index of M4, M4sugar, and M4sh macros
+* Autotest Macro Index:: Index of Autotest macros
+* Program & Function Index:: Index of those with portability problems
+* Concept Index:: General index
+
+@end detailmenu
+@end menu
+
+@c ============================================================= Introduction.
+
+@node Introduction
+@chapter Introduction
+@cindex Introduction
+
+@flushright
+A physicist, an engineer, and a computer scientist were discussing the
+nature of God. ``Surely a Physicist,'' said the physicist, ``because
+early in the Creation, God made Light; and you know, Maxwell's
+equations, the dual nature of electromagnetic waves, the relativistic
+consequences@enddots{}'' ``An Engineer!,'' said the engineer, ``because
+before making Light, God split the Chaos into Land and Water; it takes a
+hell of an engineer to handle that big amount of mud, and orderly
+separation of solids from liquids@enddots{}'' The computer scientist
+shouted: ``And the Chaos, where do you think it was coming from, hmm?''
+
+---Anonymous
+@end flushright
+@c (via Franc,ois Pinard)
+
+Autoconf is a tool for producing shell scripts that automatically
+configure software source code packages to adapt to many kinds of
+Posix-like systems. The configuration scripts produced by Autoconf
+are independent of Autoconf when they are run, so their users do not
+need to have Autoconf.
+
+The configuration scripts produced by Autoconf require no manual user
+intervention when run; they do not normally even need an argument
+specifying the system type. Instead, they individually test for the
+presence of each feature that the software package they are for might need.
+(Before each check, they print a one-line message stating what they are
+checking for, so the user doesn't get too bored while waiting for the
+script to finish.) As a result, they deal well with systems that are
+hybrids or customized from the more common Posix variants. There is
+no need to maintain files that list the features supported by each
+release of each variant of Posix.
+
+For each software package that Autoconf is used with, it creates a
+configuration script from a template file that lists the system features
+that the package needs or can use. After the shell code to recognize
+and respond to a system feature has been written, Autoconf allows it to
+be shared by many software packages that can use (or need) that feature.
+If it later turns out that the shell code needs adjustment for some
+reason, it needs to be changed in only one place; all of the
+configuration scripts can be regenerated automatically to take advantage
+of the updated code.
+
+@c "Those who do not understand Unix are condemned to reinvent it, poorly."
+@c --Henry Spencer, 1987 (see http://en.wikipedia.org/wiki/Unix_philosophy)
+Those who do not understand Autoconf are condemned to reinvent it, poorly.
+The primary goal of Autoconf is making the @emph{user's} life easier;
+making the @emph{maintainer's} life easier is only a secondary goal.
+Put another way, the primary goal is not to make the generation of
+@file{configure} automatic for package maintainers (although patches
+along that front are welcome, since package maintainers form the user
+base of Autoconf); rather, the goal is to make @file{configure}
+painless, portable, and predictable for the end user of each
+@dfn{autoconfiscated} package. And to this degree, Autoconf is highly
+successful at its goal --- most complaints to the Autoconf list are
+about difficulties in writing Autoconf input, and not in the behavior of
+the resulting @file{configure}. Even packages that don't use Autoconf
+will generally provide a @file{configure} script, and the most common
+complaint about these alternative home-grown scripts is that they fail
+to meet one or more of the GNU Coding Standards (@pxref{Configuration, , ,
+standards, The GNU Coding Standards}) that users
+have come to expect from Autoconf-generated @file{configure} scripts.
+
+The Metaconfig package is similar in purpose to Autoconf, but the
+scripts it produces require manual user intervention, which is quite
+inconvenient when configuring large source trees. Unlike Metaconfig
+scripts, Autoconf scripts can support cross-compiling, if some care is
+taken in writing them.
+
+Autoconf does not solve all problems related to making portable
+software packages---for a more complete solution, it should be used in
+concert with other GNU build tools like Automake and
+Libtool. These other tools take on jobs like the creation of a
+portable, recursive makefile with all of the standard targets,
+linking of shared libraries, and so on. @xref{The GNU Build System},
+for more information.
+
+Autoconf imposes some restrictions on the names of macros used with
+@code{#if} in C programs (@pxref{Preprocessor Symbol Index}).
+
+Autoconf requires GNU M4 version 1.4.6 or later in order to
+generate the scripts. It uses features that some versions of M4,
+including GNU M4 1.3, do not have. Autoconf works better
+with GNU M4 version 1.4.14 or later, though this is not
+required.
+
+@xref{Autoconf 1}, for information about upgrading from version 1.
+@xref{History}, for the story of Autoconf's development. @xref{FAQ},
+for answers to some common questions about Autoconf.
+
+See the @uref{http://@/www.gnu.org/@/software/@/autoconf/,
+Autoconf web page} for up-to-date information, details on the mailing
+lists, pointers to a list of known bugs, etc.
+
+Mail suggestions to @email{autoconf@@gnu.org, the Autoconf mailing
+list}. Past suggestions are
+@uref{http://@/lists.gnu.org/@/archive/@/html/@/autoconf/, archived}.
+
+Mail bug reports to @email{bug-autoconf@@gnu.org, the
+Autoconf Bugs mailing list}. Past bug reports are
+@uref{http://@/lists.gnu.org/@/archive/@/html/@/bug-autoconf/, archived}.
+
+If possible, first check that your bug is
+not already solved in current development versions, and that it has not
+been reported yet. Be sure to include all the needed information and a
+short @file{configure.ac} that demonstrates the problem.
+
+Autoconf's development tree is accessible via @command{git}; see the
+@uref{http://@/savannah.gnu.org/@/projects/@/autoconf/, Autoconf
+Summary} for details, or view
+@uref{http://@/git.sv.gnu.org/@/gitweb/@/?p=autoconf.git, the actual
+repository}. Anonymous CVS access is also available, see
+@file{README} for more details. Patches relative to the
+current @command{git} version can be sent for review to the
+@email{autoconf-patches@@gnu.org, Autoconf Patches mailing list}, with
+discussion on prior patches
+@uref{http://@/lists.gnu.org/@/archive/@/html/@/autoconf-@/patches/,
+archived}; and all commits are posted in the read-only
+@email{autoconf-commit@@gnu.org, Autoconf Commit mailing list}, which is
+also @uref{http://@/lists.gnu.org/@/archive/@/html/@/autoconf-commit/,
+archived}.
+
+Because of its mission, the Autoconf package itself
+includes only a set of often-used
+macros that have already demonstrated their usefulness. Nevertheless,
+if you wish to share your macros, or find existing ones, see the
+@uref{http://@/www.gnu.org/@/software/@/autoconf-archive/, Autoconf Macro
+Archive}, which is kindly run by @email{simons@@cryp.to,
+Peter Simons}.
+
+
+@c ================================================= The GNU Build System
+
+@node The GNU Build System
+@chapter The GNU Build System
+@cindex GNU build system
+
+Autoconf solves an important problem---reliable discovery of
+system-specific build and runtime information---but this is only one
+piece of the puzzle for the development of portable software. To this
+end, the GNU project has developed a suite of integrated
+utilities to finish the job Autoconf started: the GNU build
+system, whose most important components are Autoconf, Automake, and
+Libtool. In this chapter, we introduce you to those tools, point you
+to sources of more information, and try to convince you to use the
+entire GNU build system for your software.
+
+@menu
+* Automake:: Escaping makefile hell
+* Gnulib:: The GNU portability library
+* Libtool:: Building libraries portably
+* Pointers:: More info on the GNU build system
+@end menu
+
+@node Automake
+@section Automake
+
+The ubiquity of @command{make} means that a makefile is almost the
+only viable way to distribute automatic build rules for software, but
+one quickly runs into its numerous limitations. Its lack of
+support for automatic dependency tracking, recursive builds in
+subdirectories, reliable timestamps (e.g., for network file systems), and
+so on, mean that developers must painfully (and often incorrectly)
+reinvent the wheel for each project. Portability is non-trivial, thanks
+to the quirks of @command{make} on many systems. On top of all this is the
+manual labor required to implement the many standard targets that users
+have come to expect (@code{make install}, @code{make distclean},
+@code{make uninstall}, etc.). Since you are, of course, using Autoconf,
+you also have to insert repetitive code in your @file{Makefile.in} to
+recognize @code{@@CC@@}, @code{@@CFLAGS@@}, and other substitutions
+provided by @command{configure}. Into this mess steps @dfn{Automake}.
+@cindex Automake
+
+Automake allows you to specify your build needs in a @file{Makefile.am}
+file with a vastly simpler and more powerful syntax than that of a plain
+makefile, and then generates a portable @file{Makefile.in} for
+use with Autoconf. For example, the @file{Makefile.am} to build and
+install a simple ``Hello world'' program might look like:
+
+@example
+bin_PROGRAMS = hello
+hello_SOURCES = hello.c
+@end example
+
+@noindent
+The resulting @file{Makefile.in} (~400 lines) automatically supports all
+the standard targets, the substitutions provided by Autoconf, automatic
+dependency tracking, @code{VPATH} building, and so on. @command{make}
+builds the @code{hello} program, and @code{make install} installs it
+in @file{/usr/local/bin} (or whatever prefix was given to
+@command{configure}, if not @file{/usr/local}).
+
+The benefits of Automake increase for larger packages (especially ones
+with subdirectories), but even for small programs the added convenience
+and portability can be substantial. And that's not all@enddots{}
+
+@node Gnulib
+@section Gnulib
+
+GNU software has a well-deserved reputation for running on
+many different types of systems. While our primary goal is to write
+software for the GNU system, many users and developers have
+been introduced to us through the systems that they were already using.
+
+@cindex Gnulib
+Gnulib is a central location for common GNU code, intended to
+be shared among free software packages. Its components are typically
+shared at the source level, rather than being a library that gets built,
+installed, and linked against. The idea is to copy files from Gnulib
+into your own source tree. There is no distribution tarball; developers
+should just grab source modules from the repository. The source files
+are available online, under various licenses, mostly GNU
+GPL or GNU LGPL.
+
+Gnulib modules typically contain C source code along with Autoconf
+macros used to configure the source code. For example, the Gnulib
+@code{stdbool} module implements a @file{stdbool.h} header that nearly
+conforms to C99, even on old-fashioned hosts that lack @file{stdbool.h}.
+This module contains a source file for the replacement header, along
+with an Autoconf macro that arranges to use the replacement header on
+old-fashioned systems.
+
+@node Libtool
+@section Libtool
+
+Often, one wants to build not only programs, but libraries, so that
+other programs can benefit from the fruits of your labor. Ideally, one
+would like to produce @emph{shared} (dynamically linked) libraries,
+which can be used by multiple programs without duplication on disk or in
+memory and can be updated independently of the linked programs.
+Producing shared libraries portably, however, is the stuff of
+nightmares---each system has its own incompatible tools, compiler flags,
+and magic incantations. Fortunately, GNU provides a solution:
+@dfn{Libtool}.
+@cindex Libtool
+
+Libtool handles all the requirements of building shared libraries for
+you, and at this time seems to be the @emph{only} way to do so with any
+portability. It also handles many other headaches, such as: the
+interaction of Make rules with the variable suffixes of
+shared libraries, linking reliably with shared libraries before they are
+installed by the superuser, and supplying a consistent versioning system
+(so that different versions of a library can be installed or upgraded
+without breaking binary compatibility). Although Libtool, like
+Autoconf, can be used without Automake, it is most simply utilized in
+conjunction with Automake---there, Libtool is used automatically
+whenever shared libraries are needed, and you need not know its syntax.
+
+@node Pointers
+@section Pointers
+
+Developers who are used to the simplicity of @command{make} for small
+projects on a single system might be daunted at the prospect of
+learning to use Automake and Autoconf. As your software is
+distributed to more and more users, however, you otherwise
+quickly find yourself putting lots of effort into reinventing the
+services that the GNU build tools provide, and making the
+same mistakes that they once made and overcame. (Besides, since
+you're already learning Autoconf, Automake is a piece of cake.)
+
+There are a number of places that you can go to for more information on
+the GNU build tools.
+
+@itemize @minus
+
+@item Web
+
+The project home pages for
+@uref{http://@/www@/.gnu@/.org/@/software/@/autoconf/, Autoconf},
+@uref{http://@/www@/.gnu@/.org/@/software/@/automake/, Automake},
+@uref{http://@/www@/.gnu@/.org/@/software/@/gnulib/, Gnulib}, and
+@uref{http://@/www@/.gnu@/.org/@/software/@/libtool/, Libtool}.
+
+@item Automake Manual
+
+@xref{Top, , Automake, automake, GNU Automake}, for more
+information on Automake.
+
+@item Books
+
+The book @cite{GNU Autoconf, Automake and
+Libtool}@footnote{@cite{GNU Autoconf, Automake and Libtool},
+by G. V. Vaughan, B. Elliston, T. Tromey, and I. L. Taylor. SAMS (originally
+New Riders), 2000, ISBN 1578701902.} describes the complete GNU
+build environment. You can also find
+@uref{http://@/sources.redhat.com/@/autobook/, the entire book on-line}.
+
+@end itemize
+
+@c ================================================= Making configure Scripts.
+
+@node Making configure Scripts
+@chapter Making @command{configure} Scripts
+@cindex @file{aclocal.m4}
+@cindex @command{configure}
+
+The configuration scripts that Autoconf produces are by convention
+called @command{configure}. When run, @command{configure} creates several
+files, replacing configuration parameters in them with appropriate
+values. The files that @command{configure} creates are:
+
+@itemize @minus
+@item
+one or more @file{Makefile} files, usually one in each subdirectory of the
+package (@pxref{Makefile Substitutions});
+
+@item
+optionally, a C header file, the name of which is configurable,
+containing @code{#define} directives (@pxref{Configuration Headers});
+
+@item
+a shell script called @file{config.status} that, when run, recreates
+the files listed above (@pxref{config.status Invocation});
+
+@item
+an optional shell script normally called @file{config.cache}
+(created when using @samp{configure --config-cache}) that
+saves the results of running many of the tests (@pxref{Cache Files});
+
+@item
+a file called @file{config.log} containing any messages produced by
+compilers, to help debugging if @command{configure} makes a mistake.
+@end itemize
+
+@cindex @file{configure.in}
+@cindex @file{configure.ac}
+To create a @command{configure} script with Autoconf, you need to write an
+Autoconf input file @file{configure.ac} (or @file{configure.in}) and run
+@command{autoconf} on it. If you write your own feature tests to
+supplement those that come with Autoconf, you might also write files
+called @file{aclocal.m4} and @file{acsite.m4}. If you use a C header
+file to contain @code{#define} directives, you might also run
+@command{autoheader}, and you can distribute the generated file
+@file{config.h.in} with the package.
+
+Here is a diagram showing how the files that can be used in
+configuration are produced. Programs that are executed are suffixed by
+@samp{*}. Optional files are enclosed in square brackets (@samp{[]}).
+@command{autoconf} and @command{autoheader} also read the installed Autoconf
+macro files (by reading @file{autoconf.m4}).
+
+@noindent
+Files used in preparing a software package for distribution, when using
+just Autoconf:
+@example
+your source files --> [autoscan*] --> [configure.scan] --> configure.ac
+
+@group
+configure.ac --.
+ | .------> autoconf* -----> configure
+[aclocal.m4] --+---+
+ | `-----> [autoheader*] --> [config.h.in]
+[acsite.m4] ---'
+@end group
+
+Makefile.in
+@end example
+
+@noindent
+Additionally, if you use Automake, the following additional productions
+come into play:
+
+@example
+@group
+[acinclude.m4] --.
+ |
+[local macros] --+--> aclocal* --> aclocal.m4
+ |
+configure.ac ----'
+@end group
+
+@group
+configure.ac --.
+ +--> automake* --> Makefile.in
+Makefile.am ---'
+@end group
+@end example
+
+@noindent
+Files used in configuring a software package:
+@example
+@group
+ .-------------> [config.cache]
+configure* ------------+-------------> config.log
+ |
+[config.h.in] -. v .-> [config.h] -.
+ +--> config.status* -+ +--> make*
+Makefile.in ---' `-> Makefile ---'
+@end group
+@end example
+
+@menu
+* Writing Autoconf Input:: What to put in an Autoconf input file
+* autoscan Invocation:: Semi-automatic @file{configure.ac} writing
+* ifnames Invocation:: Listing the conditionals in source code
+* autoconf Invocation:: How to create configuration scripts
+* autoreconf Invocation:: Remaking multiple @command{configure} scripts
+@end menu
+
+@node Writing Autoconf Input
+@section Writing @file{configure.ac}
+
+To produce a @command{configure} script for a software package, create a
+file called @file{configure.ac} that contains invocations of the
+Autoconf macros that test the system features your package needs or can
+use. Autoconf macros already exist to check for many features; see
+@ref{Existing Tests}, for their descriptions. For most other features,
+you can use Autoconf template macros to produce custom checks; see
+@ref{Writing Tests}, for information about them. For especially tricky
+or specialized features, @file{configure.ac} might need to contain some
+hand-crafted shell commands; see @ref{Portable Shell, , Portable Shell
+Programming}. The @command{autoscan} program can give you a good start
+in writing @file{configure.ac} (@pxref{autoscan Invocation}, for more
+information).
+
+Previous versions of Autoconf promoted the name @file{configure.in},
+which is somewhat ambiguous (the tool needed to process this file is not
+described by its extension), and introduces a slight confusion with
+@file{config.h.in} and so on (for which @samp{.in} means ``to be
+processed by @command{configure}''). Using @file{configure.ac} is now
+preferred.
+
+@menu
+* Shell Script Compiler:: Autoconf as solution of a problem
+* Autoconf Language:: Programming in Autoconf
+* Autoconf Input Layout:: Standard organization of @file{configure.ac}
+@end menu
+
+@node Shell Script Compiler
+@subsection A Shell Script Compiler
+
+Just as for any other computer language, in order to properly program
+@file{configure.ac} in Autoconf you must understand @emph{what} problem
+the language tries to address and @emph{how} it does so.
+
+The problem Autoconf addresses is that the world is a mess. After all,
+you are using Autoconf in order to have your package compile easily on
+all sorts of different systems, some of them being extremely hostile.
+Autoconf itself bears the price for these differences: @command{configure}
+must run on all those systems, and thus @command{configure} must limit itself
+to their lowest common denominator of features.
+
+Naturally, you might then think of shell scripts; who needs
+@command{autoconf}? A set of properly written shell functions is enough to
+make it easy to write @command{configure} scripts by hand. Sigh!
+Unfortunately, even in 2008, where shells without any function support are
+far and few between, there are pitfalls to avoid when making use of them.
+Also, finding a Bourne shell that accepts shell functions is not trivial,
+even though there is almost always one on interesting porting targets.
+
+So, what is really needed is some kind of compiler, @command{autoconf},
+that takes an Autoconf program, @file{configure.ac}, and transforms it
+into a portable shell script, @command{configure}.
+
+How does @command{autoconf} perform this task?
+
+There are two obvious possibilities: creating a brand new language or
+extending an existing one. The former option is attractive: all
+sorts of optimizations could easily be implemented in the compiler and
+many rigorous checks could be performed on the Autoconf program
+(e.g., rejecting any non-portable construct). Alternatively, you can
+extend an existing language, such as the @code{sh} (Bourne shell)
+language.
+
+Autoconf does the latter: it is a layer on top of @code{sh}. It was
+therefore most convenient to implement @command{autoconf} as a macro
+expander: a program that repeatedly performs @dfn{macro expansions} on
+text input, replacing macro calls with macro bodies and producing a pure
+@code{sh} script in the end. Instead of implementing a dedicated
+Autoconf macro expander, it is natural to use an existing
+general-purpose macro language, such as M4, and implement the extensions
+as a set of M4 macros.
+
+
+@node Autoconf Language
+@subsection The Autoconf Language
+@cindex quotation
+
+The Autoconf language differs from many other computer
+languages because it treats actual code the same as plain text. Whereas
+in C, for instance, data and instructions have different syntactic
+status, in Autoconf their status is rigorously the same. Therefore, we
+need a means to distinguish literal strings from text to be expanded:
+quotation.
+
+When calling macros that take arguments, there must not be any white
+space between the macro name and the open parenthesis.
+
+@example
+AC_INIT ([oops], [1.0]) # incorrect
+AC_INIT([hello], [1.0]) # good
+@end example
+
+Arguments should
+be enclosed within the quote characters @samp{[} and @samp{]}, and be
+separated by commas. Any leading blanks or newlines in arguments are ignored,
+unless they are quoted. You should always quote an argument that
+might contain a macro name, comma, parenthesis, or a leading blank or
+newline. This rule applies recursively for every macro
+call, including macros called from other macros. For more details on
+quoting rules, see @ref{Programming in M4}.
+
+For instance:
+
+@example
+AC_CHECK_HEADER([stdio.h],
+ [AC_DEFINE([HAVE_STDIO_H], [1],
+ [Define to 1 if you have <stdio.h>.])],
+ [AC_MSG_ERROR([sorry, can't do anything for you])])
+@end example
+
+@noindent
+is quoted properly. You may safely simplify its quotation to:
+
+@example
+AC_CHECK_HEADER([stdio.h],
+ [AC_DEFINE([HAVE_STDIO_H], 1,
+ [Define to 1 if you have <stdio.h>.])],
+ [AC_MSG_ERROR([sorry, can't do anything for you])])
+@end example
+
+@noindent
+because @samp{1} cannot contain a macro call. Here, the argument of
+@code{AC_MSG_ERROR} must be quoted; otherwise, its comma would be
+interpreted as an argument separator. Also, the second and third arguments
+of @samp{AC_CHECK_HEADER} must be quoted, since they contain
+macro calls. The three arguments @samp{HAVE_STDIO_H}, @samp{stdio.h},
+and @samp{Define to 1 if you have <stdio.h>.} do not need quoting, but
+if you unwisely defined a macro with a name like @samp{Define} or
+@samp{stdio} then they would need quoting. Cautious Autoconf users
+would keep the quotes, but many Autoconf users find such precautions
+annoying, and would rewrite the example as follows:
+
+@example
+AC_CHECK_HEADER(stdio.h,
+ [AC_DEFINE(HAVE_STDIO_H, 1,
+ [Define to 1 if you have <stdio.h>.])],
+ [AC_MSG_ERROR([sorry, can't do anything for you])])
+@end example
+
+@noindent
+This is safe, so long as you adopt good naming conventions and do not
+define macros with names like @samp{HAVE_STDIO_H}, @samp{stdio}, or
+@samp{h}. Though it is also safe here to omit the quotes around
+@samp{Define to 1 if you have <stdio.h>.} this is not recommended, as
+message strings are more likely to inadvertently contain commas.
+
+The following example is wrong and dangerous, as it is underquoted:
+
+@example
+AC_CHECK_HEADER(stdio.h,
+ AC_DEFINE(HAVE_STDIO_H, 1,
+ Define to 1 if you have <stdio.h>.),
+ AC_MSG_ERROR([sorry, can't do anything for you]))
+@end example
+
+In other cases, you may have to use text that also resembles a macro
+call. You must quote that text even when it is not passed as a macro
+argument. For example, these two approaches in @file{configure.ac}
+(quoting just the potential problems, or quoting the entire line) will
+protect your script in case autoconf ever adds a macro @code{AC_DC}:
+
+@example
+echo "Hard rock was here! --[AC_DC]"
+[echo "Hard rock was here! --AC_DC"]
+@end example
+
+@noindent
+which results in this text in @file{configure}:
+
+@example
+echo "Hard rock was here! --AC_DC"
+echo "Hard rock was here! --AC_DC"
+@end example
+
+@noindent
+When you use the same text in a macro argument, you must therefore have
+an extra quotation level (since one is stripped away by the macro
+substitution). In general, then, it is a good idea to @emph{use double
+quoting for all literal string arguments}, either around just the
+problematic portions, or over the entire argument:
+
+@example
+AC_MSG_WARN([[AC_DC] stinks --Iron Maiden])
+AC_MSG_WARN([[AC_DC stinks --Iron Maiden]])
+@end example
+
+However, the above example triggers a warning about a possibly
+unexpanded macro when running @command{autoconf}, because it collides
+with the namespace of macros reserved for the Autoconf language. To be
+really safe, you can use additional escaping (either a quadrigraph, or
+creative shell constructs) to silence that particular warning:
+
+@example
+echo "Hard rock was here! --AC""_DC"
+AC_MSG_WARN([[AC@@&t@@_DC stinks --Iron Maiden]])
+@end example
+
+You are now able to understand one of the constructs of Autoconf that
+has been continually misunderstood@enddots{} The rule of thumb is that
+@emph{whenever you expect macro expansion, expect quote expansion};
+i.e., expect one level of quotes to be lost. For instance:
+
+@example
+AC_COMPILE_IFELSE(AC_LANG_SOURCE([char b[10];]), [],
+ [AC_MSG_ERROR([you lose])])
+@end example
+
+@noindent
+is incorrect: here, the first argument of @code{AC_LANG_SOURCE} is
+@samp{char b[10];} and is expanded once, which results in
+@samp{char b10;}; and the @code{AC_LANG_SOURCE} is also expanded prior
+to being passed to @code{AC_COMPILE_IFELSE}. (There was an idiom common
+in Autoconf's past to
+address this issue via the M4 @code{changequote} primitive, but do not
+use it!) Let's take a closer look: the author meant the first argument
+to be understood as a literal, and therefore it must be quoted twice;
+likewise, the intermediate @code{AC_LANG_SOURCE} macro should be quoted
+once so that it is only expanded after the rest of the body of
+@code{AC_COMPILE_IFELSE} is in place:
+
+@example
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char b[10];]])], [],
+ [AC_MSG_ERROR([you lose])])
+@end example
+
+@noindent
+Voil@`a, you actually produce @samp{char b[10];} this time!
+
+On the other hand, descriptions (e.g., the last parameter of
+@code{AC_DEFINE} or @code{AS_HELP_STRING}) are not literals---they
+are subject to line breaking, for example---and should not be double quoted.
+Even if these descriptions are short and are not actually broken, double
+quoting them yields weird results.
+
+Some macros take optional arguments, which this documentation represents
+as @ovar{arg} (not to be confused with the quote characters). You may
+just leave them empty, or use @samp{[]} to make the emptiness of the
+argument explicit, or you may simply omit the trailing commas. The
+three lines below are equivalent:
+
+@example
+AC_CHECK_HEADERS([stdio.h], [], [], [])
+AC_CHECK_HEADERS([stdio.h],,,)
+AC_CHECK_HEADERS([stdio.h])
+@end example
+
+It is best to put each macro call on its own line in
+@file{configure.ac}. Most of the macros don't add extra newlines; they
+rely on the newline after the macro call to terminate the commands.
+This approach makes the generated @command{configure} script a little
+easier to read by not inserting lots of blank lines. It is generally
+safe to set shell variables on the same line as a macro call, because
+the shell allows assignments without intervening newlines.
+
+You can include comments in @file{configure.ac} files by starting them
+with the @samp{#}. For example, it is helpful to begin
+@file{configure.ac} files with a line like this:
+
+@example
+# Process this file with autoconf to produce a configure script.
+@end example
+
+@node Autoconf Input Layout
+@subsection Standard @file{configure.ac} Layout
+
+The order in which @file{configure.ac} calls the Autoconf macros is not
+important, with a few exceptions. Every @file{configure.ac} must
+contain a call to @code{AC_INIT} before the checks, and a call to
+@code{AC_OUTPUT} at the end (@pxref{Output}). Additionally, some macros
+rely on other macros having been called first, because they check
+previously set values of some variables to decide what to do. These
+macros are noted in the individual descriptions (@pxref{Existing
+Tests}), and they also warn you when @command{configure} is created if they
+are called out of order.
+
+To encourage consistency, here is a suggested order for calling the
+Autoconf macros. Generally speaking, the things near the end of this
+list are those that could depend on things earlier in it. For example,
+library functions could be affected by types and libraries.
+
+@display
+@group
+Autoconf requirements
+@code{AC_INIT(@var{package}, @var{version}, @var{bug-report-address})}
+information on the package
+checks for programs
+checks for libraries
+checks for header files
+checks for types
+checks for structures
+checks for compiler characteristics
+checks for library functions
+checks for system services
+@code{AC_CONFIG_FILES(@r{[}@var{file@dots{}}@r{]})}
+@code{AC_OUTPUT}
+@end group
+@end display
+
+
+@node autoscan Invocation
+@section Using @command{autoscan} to Create @file{configure.ac}
+@cindex @command{autoscan}
+
+The @command{autoscan} program can help you create and/or maintain a
+@file{configure.ac} file for a software package. @command{autoscan}
+examines source files in the directory tree rooted at a directory given
+as a command line argument, or the current directory if none is given.
+It searches the source files for common portability problems and creates
+a file @file{configure.scan} which is a preliminary @file{configure.ac}
+for that package, and checks a possibly existing @file{configure.ac} for
+completeness.
+
+When using @command{autoscan} to create a @file{configure.ac}, you
+should manually examine @file{configure.scan} before renaming it to
+@file{configure.ac}; it probably needs some adjustments.
+Occasionally, @command{autoscan} outputs a macro in the wrong order
+relative to another macro, so that @command{autoconf} produces a warning;
+you need to move such macros manually. Also, if you want the package to
+use a configuration header file, you must add a call to
+@code{AC_CONFIG_HEADERS} (@pxref{Configuration Headers}). You might
+also have to change or add some @code{#if} directives to your program in
+order to make it work with Autoconf (@pxref{ifnames Invocation}, for
+information about a program that can help with that job).
+
+When using @command{autoscan} to maintain a @file{configure.ac}, simply
+consider adding its suggestions. The file @file{autoscan.log}
+contains detailed information on why a macro is requested.
+
+@command{autoscan} uses several data files (installed along with Autoconf)
+to determine which macros to output when it finds particular symbols in
+a package's source files. These data files all have the same format:
+each line consists of a symbol, one or more blanks, and the Autoconf macro to
+output if that symbol is encountered. Lines starting with @samp{#} are
+comments.
+
+@command{autoscan} accepts the following options:
+
+@table @option
+@item --help
+@itemx -h
+Print a summary of the command line options and exit.
+
+@item --version
+@itemx -V
+Print the version number of Autoconf and exit.
+
+@item --verbose
+@itemx -v
+Print the names of the files it examines and the potentially interesting
+symbols it finds in them. This output can be voluminous.
+
+@item --debug
+@itemx -d
+Don't remove temporary files.
+
+@item --include=@var{dir}
+@itemx -I @var{dir}
+Append @var{dir} to the include path. Multiple invocations accumulate.
+
+@item --prepend-include=@var{dir}
+@itemx -B @var{dir}
+Prepend @var{dir} to the include path. Multiple invocations accumulate.
+@end table
+
+@node ifnames Invocation
+@section Using @command{ifnames} to List Conditionals
+@cindex @command{ifnames}
+
+@command{ifnames} can help you write @file{configure.ac} for a software
+package. It prints the identifiers that the package already uses in C
+preprocessor conditionals. If a package has already been set up to have
+some portability, @command{ifnames} can thus help you figure out what its
+@command{configure} needs to check for. It may help fill in some gaps in a
+@file{configure.ac} generated by @command{autoscan} (@pxref{autoscan
+Invocation}).
+
+@command{ifnames} scans all of the C source files named on the command line
+(or the standard input, if none are given) and writes to the standard
+output a sorted list of all the identifiers that appear in those files
+in @code{#if}, @code{#elif}, @code{#ifdef}, or @code{#ifndef}
+directives. It prints each identifier on a line, followed by a
+space-separated list of the files in which that identifier occurs.
+
+@noindent
+@command{ifnames} accepts the following options:
+
+@table @option
+@item --help
+@itemx -h
+Print a summary of the command line options and exit.
+
+@item --version
+@itemx -V
+Print the version number of Autoconf and exit.
+@end table
+
+@node autoconf Invocation
+@section Using @command{autoconf} to Create @command{configure}
+@cindex @command{autoconf}
+
+To create @command{configure} from @file{configure.ac}, run the
+@command{autoconf} program with no arguments. @command{autoconf} processes
+@file{configure.ac} with the M4 macro processor, using the
+Autoconf macros. If you give @command{autoconf} an argument, it reads that
+file instead of @file{configure.ac} and writes the configuration script
+to the standard output instead of to @command{configure}. If you give
+@command{autoconf} the argument @option{-}, it reads from the standard
+input instead of @file{configure.ac} and writes the configuration script
+to the standard output.
+
+The Autoconf macros are defined in several files. Some of the files are
+distributed with Autoconf; @command{autoconf} reads them first. Then it
+looks for the optional file @file{acsite.m4} in the directory that
+contains the distributed Autoconf macro files, and for the optional file
+@file{aclocal.m4} in the current directory. Those files can contain
+your site's or the package's own Autoconf macro definitions
+(@pxref{Writing Autoconf Macros}, for more information). If a macro is
+defined in more than one of the files that @command{autoconf} reads, the
+last definition it reads overrides the earlier ones.
+
+@command{autoconf} accepts the following options:
+
+@table @option
+@item --help
+@itemx -h
+Print a summary of the command line options and exit.
+
+@item --version
+@itemx -V
+Print the version number of Autoconf and exit.
+
+@item --verbose
+@itemx -v
+Report processing steps.
+
+@item --debug
+@itemx -d
+Don't remove the temporary files.
+
+@item --force
+@itemx -f
+Remake @file{configure} even if newer than its input files.
+
+@item --include=@var{dir}
+@itemx -I @var{dir}
+Append @var{dir} to the include path. Multiple invocations accumulate.
+
+@item --prepend-include=@var{dir}
+@itemx -B @var{dir}
+Prepend @var{dir} to the include path. Multiple invocations accumulate.
+
+@item --output=@var{file}
+@itemx -o @var{file}
+Save output (script or trace) to @var{file}. The file @option{-} stands
+for the standard output.
+
+@item --warnings=@var{category}
+@itemx -W @var{category}
+@evindex WARNINGS
+Report the warnings related to @var{category} (which can actually be a
+comma separated list). @xref{Reporting Messages}, macro
+@code{AC_DIAGNOSE}, for a comprehensive list of categories. Special
+values include:
+
+@table @samp
+@item all
+report all the warnings
+
+@item none
+report none
+
+@item error
+treats warnings as errors
+
+@item no-@var{category}
+disable warnings falling into @var{category}
+@end table
+
+Warnings about @samp{syntax} are enabled by default, and the environment
+variable @env{WARNINGS}, a comma separated list of categories, is
+honored as well. Passing @option{-W @var{category}} actually behaves as if
+you had passed @option{--warnings syntax,$WARNINGS,@var{category}}. To
+disable the defaults and @env{WARNINGS}, and then
+enable warnings about obsolete constructs, use @option{-W
+none,obsolete}.
+
+@cindex Back trace
+@cindex Macro invocation stack
+Because @command{autoconf} uses @command{autom4te} behind the scenes, it
+displays a back trace for errors, but not for warnings; if you want
+them, just pass @option{-W error}. @xref{autom4te Invocation}, for some
+examples.
+
+@item --trace=@var{macro}[:@var{format}]
+@itemx -t @var{macro}[:@var{format}]
+Do not create the @command{configure} script, but list the calls to
+@var{macro} according to the @var{format}. Multiple @option{--trace}
+arguments can be used to list several macros. Multiple @option{--trace}
+arguments for a single macro are not cumulative; instead, you should
+just make @var{format} as long as needed.
+
+The @var{format} is a regular string, with newlines if desired, and
+several special escape codes. It defaults to @samp{$f:$l:$n:$%}; see
+@ref{autom4te Invocation}, for details on the @var{format}.
+
+@item --initialization
+@itemx -i
+By default, @option{--trace} does not trace the initialization of the
+Autoconf macros (typically the @code{AC_DEFUN} definitions). This
+results in a noticeable speedup, but can be disabled by this option.
+@end table
+
+
+It is often necessary to check the content of a @file{configure.ac}
+file, but parsing it yourself is extremely fragile and error-prone. It
+is suggested that you rely upon @option{--trace} to scan
+@file{configure.ac}. For instance, to find the list of variables that
+are substituted, use:
+
+@example
+@group
+$ @kbd{autoconf -t AC_SUBST}
+configure.ac:2:AC_SUBST:ECHO_C
+configure.ac:2:AC_SUBST:ECHO_N
+configure.ac:2:AC_SUBST:ECHO_T
+@i{More traces deleted}
+@end group
+@end example
+
+@noindent
+The example below highlights the difference between @samp{$@@},
+@samp{$*}, and @samp{$%}.
+
+@example
+@group
+$ @kbd{cat configure.ac}
+AC_DEFINE(This, is, [an
+[example]])
+$ @kbd{autoconf -t 'AC_DEFINE:@@: $@@}
+*: $*
+%: $%'
+@@: [This],[is],[an
+[example]]
+*: This,is,an
+[example]
+%: This:is:an [example]
+@end group
+@end example
+
+@noindent
+The @var{format} gives you a lot of freedom:
+
+@example
+@group
+$ @kbd{autoconf -t 'AC_SUBST:$$ac_subst@{"$1"@} = "$f:$l";'}
+$ac_subst@{"ECHO_C"@} = "configure.ac:2";
+$ac_subst@{"ECHO_N"@} = "configure.ac:2";
+$ac_subst@{"ECHO_T"@} = "configure.ac:2";
+@i{More traces deleted}
+@end group
+@end example
+
+@noindent
+A long @var{separator} can be used to improve the readability of complex
+structures, and to ease their parsing (for instance when no single
+character is suitable as a separator):
+
+@example
+@group
+$ @kbd{autoconf -t 'AM_MISSING_PROG:$@{|:::::|@}*'}
+ACLOCAL|:::::|aclocal|:::::|$missing_dir
+AUTOCONF|:::::|autoconf|:::::|$missing_dir
+AUTOMAKE|:::::|automake|:::::|$missing_dir
+@i{More traces deleted}
+@end group
+@end example
+
+@node autoreconf Invocation
+@section Using @command{autoreconf} to Update @command{configure} Scripts
+@cindex @command{autoreconf}
+
+Installing the various components of the GNU Build System can be
+tedious: running @command{autopoint} for Gettext, @command{automake} for
+@file{Makefile.in} etc.@: in each directory. It may be needed either
+because some tools such as @command{automake} have been updated on your
+system, or because some of the sources such as @file{configure.ac} have
+been updated, or finally, simply in order to install the GNU Build
+System in a fresh tree.
+
+@command{autoreconf} runs @command{autoconf}, @command{autoheader},
+@command{aclocal}, @command{automake}, @command{libtoolize}, and
+@command{autopoint} (when appropriate) repeatedly to update the
+GNU Build System in the specified directories and their
+subdirectories (@pxref{Subdirectories}). By default, it only remakes
+those files that are older than their sources. The environment variables
+@env{AUTOM4TE}, @env{AUTOCONF}, @env{AUTOHEADER}, @env{AUTOMAKE},
+@env{ACLOCAL}, @env{AUTOPOINT}, @env{LIBTOOLIZE}, @env{M4}, and @env{MAKE}
+may be used to override the invocation of the respective tools.
+
+If you install a new version of some tool, you can make
+@command{autoreconf} remake @emph{all} of the files by giving it the
+@option{--force} option.
+
+@xref{Automatic Remaking}, for Make rules to automatically
+rebuild @command{configure} scripts when their source files change. That
+method handles the timestamps of configuration header templates
+properly, but does not pass @option{--autoconf-dir=@var{dir}} or
+@option{--localdir=@var{dir}}.
+
+@cindex Gettext
+@cindex @command{autopoint}
+Gettext supplies the @command{autopoint} command to add translation
+infrastructure to a source package. If you use @command{autopoint},
+your @file{configure.ac} should invoke both @code{AM_GNU_GETTEXT} and
+@code{AM_GNU_GETTEXT_VERSION(@var{gettext-version})}. @xref{autopoint
+Invocation, , Invoking the @code{autopoint} Program, gettext,
+GNU @code{gettext} utilities}, for further details.
+
+@noindent
+@command{autoreconf} accepts the following options:
+
+@table @option
+@item --help
+@itemx -h
+Print a summary of the command line options and exit.
+
+@item --version
+@itemx -V
+Print the version number of Autoconf and exit.
+
+@item --verbose
+@itemx -v
+Print the name of each directory @command{autoreconf} examines and the
+commands it runs. If given two or more times, pass @option{--verbose}
+to subordinate tools that support it.
+
+@item --debug
+@itemx -d
+Don't remove the temporary files.
+
+@item --force
+@itemx -f
+Remake even @file{configure} scripts and configuration headers that are
+newer than their input files (@file{configure.ac} and, if present,
+@file{aclocal.m4}).
+
+@item --install
+@itemx -i
+Install the missing auxiliary files in the package. By default, files
+are copied; this can be changed with @option{--symlink}.
+
+If deemed appropriate, this option triggers calls to
+@samp{automake --add-missing},
+@samp{libtoolize}, @samp{autopoint}, etc.
+
+@item --no-recursive
+Do not rebuild files in subdirectories to configure (see @ref{Subdirectories},
+macro @code{AC_CONFIG_SUBDIRS}).
+
+@item --symlink
+@itemx -s
+When used with @option{--install}, install symbolic links to the missing
+auxiliary files instead of copying them.
+
+@item --make
+@itemx -m
+When the directories were configured, update the configuration by
+running @samp{./config.status --recheck && ./config.status}, and then
+run @samp{make}.
+
+@item --include=@var{dir}
+@itemx -I @var{dir}
+Append @var{dir} to the include path. Multiple invocations accumulate.
+Passed on to @command{aclocal}, @command{autoconf} and
+@command{autoheader} internally.
+
+@item --prepend-include=@var{dir}
+@itemx -B @var{dir}
+Prepend @var{dir} to the include path. Multiple invocations accumulate.
+Passed on to @command{autoconf} and @command{autoheader} internally.
+
+@item --warnings=@var{category}
+@itemx -W @var{category}
+@evindex WARNINGS
+Report the warnings related to @var{category} (which can actually be a
+comma separated list).
+
+@table @samp
+@item cross
+related to cross compilation issues.
+
+@item obsolete
+report the uses of obsolete constructs.
+
+@item portability
+portability issues
+
+@item syntax
+dubious syntactic constructs.
+
+@item all
+report all the warnings
+
+@item none
+report none
+
+@item error
+treats warnings as errors
+
+@item no-@var{category}
+disable warnings falling into @var{category}
+@end table
+
+Warnings about @samp{syntax} are enabled by default, and the environment
+variable @env{WARNINGS}, a comma separated list of categories, is
+honored as well. Passing @option{-W @var{category}} actually behaves as if
+you had passed @option{--warnings syntax,$WARNINGS,@var{category}}. To
+disable the defaults and @env{WARNINGS}, and then
+enable warnings about obsolete constructs, use @option{-W
+none,obsolete}.
+@end table
+
+If you want @command{autoreconf} to pass flags that are not listed here
+on to @command{aclocal}, set @code{ACLOCAL_AMFLAGS} in your @file{Makefile.am}.
+Due to a limitation in the Autoconf implementation these flags currently
+must be set on a single line in @file{Makefile.am}, without any
+backslash-newlines.
+
+@c ========================================= Initialization and Output Files.
+
+@node Setup
+@chapter Initialization and Output Files
+
+Autoconf-generated @command{configure} scripts need some information about
+how to initialize, such as how to find the package's source files and
+about the output files to produce. The following sections describe the
+initialization and the creation of output files.
+
+@menu
+* Initializing configure:: Option processing etc.
+* Versioning:: Dealing with Autoconf versions
+* Notices:: Copyright, version numbers in @command{configure}
+* Input:: Where Autoconf should find files
+* Output:: Outputting results from the configuration
+* Configuration Actions:: Preparing the output based on results
+* Configuration Files:: Creating output files
+* Makefile Substitutions:: Using output variables in makefiles
+* Configuration Headers:: Creating a configuration header file
+* Configuration Commands:: Running arbitrary instantiation commands
+* Configuration Links:: Links depending on the configuration
+* Subdirectories:: Configuring independent packages together
+* Default Prefix:: Changing the default installation prefix
+@end menu
+
+@node Initializing configure
+@section Initializing @command{configure}
+
+Every @command{configure} script must call @code{AC_INIT} before doing
+anything else that produces output. Calls to silent macros, such as
+@code{AC_DEFUN}, may also occur prior to @code{AC_INIT}, although these
+are generally used via @file{aclocal.m4}, since that is implicitly
+included before the start of @file{configure.ac}. The only other
+required macro is @code{AC_OUTPUT} (@pxref{Output}).
+
+@anchor{AC_INIT}
+@defmac AC_INIT (@var{package}, @var{version}, @ovar{bug-report}, @
+ @ovar{tarname}, @ovar{url})
+@acindex{INIT}
+Process any command-line arguments and perform initialization
+and verification.
+
+Set the name of the @var{package} and its @var{version}. These are
+typically used in @option{--version} support, including that of
+@command{configure}. The optional argument @var{bug-report} should be
+the email to which users should send bug reports. The package
+@var{tarname} differs from @var{package}: the latter designates the full
+package name (e.g., @samp{GNU Autoconf}), while the former is meant for
+distribution tar ball names (e.g., @samp{autoconf}). It defaults to
+@var{package} with @samp{GNU } stripped, lower-cased, and all characters
+other than alphanumerics and underscores are changed to @samp{-}. If
+provided, @var{url} should be the home page for the package.
+
+The arguments of @code{AC_INIT} must be static, i.e., there should not
+be any shell computation, quotes, or newlines, but they can be computed
+by M4. This is because the package information strings are expanded at
+M4 time into several contexts, and must give the same text at shell time
+whether used in single-quoted strings, double-quoted strings, quoted
+here-documents, or unquoted here-documents. It is permissible to use
+@code{m4_esyscmd} or @code{m4_esyscmd_s} for computing a version string
+that changes with every commit to a version control system (in fact,
+Autoconf does just that, for all builds of the development tree made
+between releases).
+
+The following M4 macros (e.g., @code{AC_PACKAGE_NAME}), output variables
+(e.g., @code{PACKAGE_NAME}), and preprocessor symbols (e.g.,
+@code{PACKAGE_NAME}), are defined by @code{AC_INIT}:
+
+@table @asis
+@item @code{AC_PACKAGE_NAME}, @code{PACKAGE_NAME}
+@acindex{PACKAGE_NAME}
+@ovindex PACKAGE_NAME
+@cvindex PACKAGE_NAME
+Exactly @var{package}.
+
+@item @code{AC_PACKAGE_TARNAME}, @code{PACKAGE_TARNAME}
+@acindex{PACKAGE_TARNAME}
+@ovindex PACKAGE_TARNAME
+@cvindex PACKAGE_TARNAME
+Exactly @var{tarname}, possibly generated from @var{package}.
+
+@item @code{AC_PACKAGE_VERSION}, @code{PACKAGE_VERSION}
+@acindex{PACKAGE_VERSION}
+@ovindex PACKAGE_VERSION
+@cvindex PACKAGE_VERSION
+Exactly @var{version}.
+
+@item @code{AC_PACKAGE_STRING}, @code{PACKAGE_STRING}
+@acindex{PACKAGE_STRING}
+@ovindex PACKAGE_STRING
+@cvindex PACKAGE_STRING
+Exactly @samp{@var{package} @var{version}}.
+
+@item @code{AC_PACKAGE_BUGREPORT}, @code{PACKAGE_BUGREPORT}
+@acindex{PACKAGE_BUGREPORT}
+@ovindex PACKAGE_BUGREPORT
+@cvindex PACKAGE_BUGREPORT
+Exactly @var{bug-report}, if one was provided. Typically an email
+address, or URL to a bug management web page.
+
+@item @code{AC_PACKAGE_URL}, @code{PACKAGE_URL}
+@acindex{PACKAGE_URL}
+@ovindex PACKAGE_URL
+@cvindex PACKAGE_URL
+Exactly @var{url}, if one was provided. If @var{url} was empty, but
+@var{package} begins with @samp{GNU }, then this defaults to
+@samp{http://@/www.gnu.org/@/software/@/@var{tarname}/}, otherwise, no URL is
+assumed.
+@end table
+@end defmac
+
+If your @command{configure} script does its own option processing, it
+should inspect @samp{$@@} or @samp{$*} immediately after calling
+@code{AC_INIT}, because other Autoconf macros liberally use the
+@command{set} command to process strings, and this has the side effect
+of updating @samp{$@@} and @samp{$*}. However, we suggest that you use
+standard macros like @code{AC_ARG_ENABLE} instead of attempting to
+implement your own option processing. @xref{Site Configuration}.
+
+@node Versioning
+@section Dealing with Autoconf versions
+@cindex Autoconf version
+@cindex version, Autoconf
+
+The following optional macros can be used to help choose the minimum
+version of Autoconf that can successfully compile a given
+@file{configure.ac}.
+
+@defmac AC_PREREQ (@var{version})
+@acindex{PREREQ}
+@cindex Version
+Ensure that a recent enough version of Autoconf is being used. If the
+version of Autoconf being used to create @command{configure} is
+earlier than @var{version}, print an error message to the standard
+error output and exit with failure (exit status is 63). For example:
+
+@example
+AC_PREREQ([@value{VERSION}])
+@end example
+
+This macro may be used before @code{AC_INIT}.
+@end defmac
+
+@defmac AC_AUTOCONF_VERSION
+@acindex{AUTOCONF_VERSION}
+This macro was introduced in Autoconf 2.62. It identifies the version
+of Autoconf that is currently parsing the input file, in a format
+suitable for @code{m4_version_compare} (@pxref{m4_version_compare}); in
+other words, for this release of Autoconf, its value is
+@samp{@value{VERSION}}. One potential use of this macro is for writing
+conditional fallbacks based on when a feature was added to Autoconf,
+rather than using @code{AC_PREREQ} to require the newer version of
+Autoconf. However, remember that the Autoconf philosophy favors feature
+checks over version checks.
+
+You should not expand this macro directly; use
+@samp{m4_defn([AC_AUTOCONF_VERSION])} instead. This is because some
+users might
+have a beta version of Autoconf installed, with arbitrary letters
+included in its version string. This means it is possible for the
+version string to contain the name of a defined macro, such that
+expanding @code{AC_AUTOCONF_VERSION} would trigger the expansion of that
+macro during rescanning, and change the version string to be different
+than what you intended to check.
+@end defmac
+
+@node Notices
+@section Notices in @command{configure}
+@cindex Notices in @command{configure}
+
+The following macros manage version numbers for @command{configure}
+scripts. Using them is optional.
+
+@defmac AC_COPYRIGHT (@var{copyright-notice})
+@acindex{COPYRIGHT}
+@cindex Copyright Notice
+State that, in addition to the Free Software Foundation's copyright on
+the Autoconf macros, parts of your @command{configure} are covered by the
+@var{copyright-notice}.
+
+The @var{copyright-notice} shows up in both the head of
+@command{configure} and in @samp{configure --version}.
+@end defmac
+
+
+@defmac AC_REVISION (@var{revision-info})
+@acindex{REVISION}
+@cindex Revision
+Copy revision stamp @var{revision-info} into the @command{configure}
+script, with any dollar signs or double-quotes removed. This macro lets
+you put a revision stamp from @file{configure.ac} into @command{configure}
+without RCS or CVS changing it when you check in
+@command{configure}. That way, you can determine easily which revision of
+@file{configure.ac} a particular @command{configure} corresponds to.
+
+For example, this line in @file{configure.ac}:
+
+@c The @w prevents RCS from changing the example in the manual.
+@example
+AC_REVISION([@w{$}Revision: 1.30 $])
+@end example
+
+@noindent
+produces this in @command{configure}:
+
+@example
+#!/bin/sh
+# From configure.ac Revision: 1.30
+@end example
+@end defmac
+
+
+@node Input
+@section Finding @command{configure} Input
+
+@anchor{AC_CONFIG_SRCDIR}
+@defmac AC_CONFIG_SRCDIR (@var{unique-file-in-source-dir})
+@acindex{CONFIG_SRCDIR}
+@var{unique-file-in-source-dir} is some file that is in the package's
+source directory; @command{configure} checks for this file's existence to
+make sure that the directory that it is told contains the source code in
+fact does. Occasionally people accidentally specify the wrong directory
+with @option{--srcdir}; this is a safety check. @xref{configure
+Invocation}, for more information.
+@end defmac
+
+
+@c FIXME: Remove definitively once --install explained.
+@c
+@c Small packages may store all their macros in @code{aclocal.m4}. As the
+@c set of macros grows, or for maintenance reasons, a maintainer may prefer
+@c to split the macros in several files. In this case, Autoconf must be
+@c told which files to load, and in which order.
+@c
+@c @defmac AC_INCLUDE (@var{file}@dots{})
+@c @acindex{INCLUDE}
+@c @c FIXME: There is no longer shell globbing.
+@c Read the macro definitions that appear in the listed files. A list of
+@c space-separated file names or shell globbing patterns is expected. The
+@c files are read in the order they're listed.
+@c
+@c Because the order of definition of macros is important (only the last
+@c definition of a macro is used), beware that it is @code{AC_INIT} that
+@c loads @file{acsite.m4} and @file{aclocal.m4}. Note that
+@c @code{AC_INCLUDE}ing a file before @code{AC_INIT} or within
+@c @file{aclocal.m4} is different from doing so after @code{AC_INIT}: in
+@c the latter case, non-macro lines from included files may end up in the
+@c @file{configure} script, whereas in the former case, they'd be discarded
+@c just like any text that appear before @code{AC_INIT}.
+@c @end defmac
+
+Packages that do manual configuration or use the @command{install} program
+might need to tell @command{configure} where to find some other shell
+scripts by calling @code{AC_CONFIG_AUX_DIR}, though the default places
+it looks are correct for most cases.
+
+@defmac AC_CONFIG_AUX_DIR (@var{dir})
+@acindex{CONFIG_AUX_DIR}
+Use the auxiliary build tools (e.g., @file{install-sh},
+@file{config.sub}, @file{config.guess}, Cygnus @command{configure},
+Automake and Libtool scripts, etc.)@: that are in directory @var{dir}.
+These are auxiliary files used in configuration. @var{dir} can be
+either absolute or relative to @file{@var{srcdir}}. The default is
+@file{@var{srcdir}} or @file{@var{srcdir}/..} or
+@file{@var{srcdir}/../..}, whichever is the first that contains
+@file{install-sh}. The other files are not checked for, so that using
+@code{AC_PROG_INSTALL} does not automatically require distributing the
+other auxiliary files. It checks for @file{install.sh} also, but that
+name is obsolete because some @command{make} have a rule that creates
+@file{install} from it if there is no makefile.
+
+The auxiliary directory is commonly named @file{build-aux}.
+If you need portability to DOS variants, do not name the
+auxiliary directory @file{aux}. @xref{File System Conventions}.
+@end defmac
+
+@defmac AC_REQUIRE_AUX_FILE (@var{file})
+@acindex{REQUIRE_AUX_FILE}
+Declares that @var{file} is expected in the directory defined above. In
+Autoconf proper, this macro does nothing: its sole purpose is to be
+traced by third-party tools to produce a list of expected auxiliary
+files. For instance it is called by macros like @code{AC_PROG_INSTALL}
+(@pxref{Particular Programs}) or @code{AC_CANONICAL_BUILD}
+(@pxref{Canonicalizing}) to register the auxiliary files they need.
+@end defmac
+
+Similarly, packages that use @command{aclocal} should declare where
+local macros can be found using @code{AC_CONFIG_MACRO_DIR}.
+
+@defmac AC_CONFIG_MACRO_DIR (@var{dir})
+@acindex{CONFIG_MACRO_DIR}
+Specify @var{dir} as the location of additional local Autoconf macros.
+This macro is intended for use by future versions of commands like
+@command{autoreconf} that trace macro calls. It should be called
+directly from @file{configure.ac} so that tools that install macros for
+@command{aclocal} can find the macros' declarations.
+
+Note that if you use @command{aclocal} from Automake to generate
+@file{aclocal.m4}, you must also set @code{ACLOCAL_AMFLAGS = -I
+@var{dir}} in your top-level @file{Makefile.am}. Due to a limitation in
+the Autoconf implementation of @command{autoreconf}, these include
+directives currently must be set on a single line in @file{Makefile.am},
+without any backslash-newlines.
+@end defmac
+
+
+@node Output
+@section Outputting Files
+@cindex Outputting files
+
+Every Autoconf script, e.g., @file{configure.ac}, should finish by
+calling @code{AC_OUTPUT}. That is the macro that generates and runs
+@file{config.status}, which in turn creates the makefiles and any
+other files resulting from configuration. This is the only required
+macro besides @code{AC_INIT} (@pxref{Input}).
+
+@anchor{AC_OUTPUT}
+@defmac AC_OUTPUT
+@acindex{OUTPUT}
+@cindex Instantiation
+Generate @file{config.status} and launch it. Call this macro once, at
+the end of @file{configure.ac}.
+
+@file{config.status} performs all the configuration actions: all the
+output files (see @ref{Configuration Files}, macro
+@code{AC_CONFIG_FILES}), header files (see @ref{Configuration Headers},
+macro @code{AC_CONFIG_HEADERS}), commands (see @ref{Configuration
+Commands}, macro @code{AC_CONFIG_COMMANDS}), links (see
+@ref{Configuration Links}, macro @code{AC_CONFIG_LINKS}), subdirectories
+to configure (see @ref{Subdirectories}, macro @code{AC_CONFIG_SUBDIRS})
+are honored.
+
+The location of your @code{AC_OUTPUT} invocation is the exact point
+where configuration actions are taken: any code afterwards is
+executed by @command{configure} once @command{config.status} was run. If
+you want to bind actions to @command{config.status} itself
+(independently of whether @command{configure} is being run), see
+@ref{Configuration Commands, , Running Arbitrary Configuration
+Commands}.
+@end defmac
+
+Historically, the usage of @code{AC_OUTPUT} was somewhat different.
+@xref{Obsolete Macros}, for a description of the arguments that
+@code{AC_OUTPUT} used to support.
+
+
+If you run @command{make} in subdirectories, you should run it using the
+@command{make} variable @code{MAKE}. Most versions of @command{make} set
+@code{MAKE} to the name of the @command{make} program plus any options it
+was given. (But many do not include in it the values of any variables
+set on the command line, so those are not passed on automatically.)
+Some old versions of @command{make} do not set this variable. The
+following macro allows you to use it even with those versions.
+
+@anchor{AC_PROG_MAKE_SET}
+@defmac AC_PROG_MAKE_SET
+@acindex{PROG_MAKE_SET}
+@ovindex SET_MAKE
+If the Make command, @code{$MAKE} if set or else @samp{make}, predefines
+@code{$(MAKE)}, define output variable @code{SET_MAKE} to be empty.
+Otherwise, define @code{SET_MAKE} to a macro definition that sets
+@code{$(MAKE)}, such as @samp{MAKE=make}. Calls @code{AC_SUBST} for
+@code{SET_MAKE}.
+@end defmac
+
+If you use this macro, place a line like this in each @file{Makefile.in}
+that runs @command{MAKE} on other directories:
+
+@example
+@@SET_MAKE@@
+@end example
+
+
+
+@node Configuration Actions
+@section Performing Configuration Actions
+@cindex Configuration actions
+
+@file{configure} is designed so that it appears to do everything itself,
+but there is actually a hidden slave: @file{config.status}.
+@file{configure} is in charge of examining your system, but it is
+@file{config.status} that actually takes the proper actions based on the
+results of @file{configure}. The most typical task of
+@file{config.status} is to @emph{instantiate} files.
+
+@acindex{CONFIG_@var{ITEMS}}
+This section describes the common behavior of the four standard
+instantiating macros: @code{AC_CONFIG_FILES}, @code{AC_CONFIG_HEADERS},
+@code{AC_CONFIG_COMMANDS} and @code{AC_CONFIG_LINKS}. They all
+have this prototype:
+
+@c FIXME: Can't use @ovar here, Texinfo 4.0 goes lunatic and emits something
+@c awful.
+@example
+AC_CONFIG_@var{ITEMS}(@var{tag}@dots{}, @r{[}@var{commands}@r{]}, @r{[}@var{init-cmds}@r{]})
+@end example
+
+@noindent
+where the arguments are:
+
+@table @var
+@item tag@dots{}
+A blank-or-newline-separated list of tags, which are typically the names of
+the files to instantiate.
+
+You are encouraged to use literals as @var{tags}. In particular, you
+should avoid
+
+@example
+@dots{} && my_foos="$my_foos fooo"
+@dots{} && my_foos="$my_foos foooo"
+AC_CONFIG_@var{ITEMS}([$my_foos])
+@end example
+
+@noindent
+and use this instead:
+
+@example
+@dots{} && AC_CONFIG_@var{ITEMS}([fooo])
+@dots{} && AC_CONFIG_@var{ITEMS}([foooo])
+@end example
+
+The macros @code{AC_CONFIG_FILES} and @code{AC_CONFIG_HEADERS} use
+special @var{tag} values: they may have the form @samp{@var{output}} or
+@samp{@var{output}:@var{inputs}}. The file @var{output} is instantiated
+from its templates, @var{inputs} (defaulting to @samp{@var{output}.in}).
+
+@samp{AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk])},
+for example, asks for
+the creation of the file @file{Makefile} that contains the expansion of the
+output variables in the concatenation of @file{boiler/top.mk} and
+@file{boiler/bot.mk}.
+
+The special value @samp{-} might be used to denote the standard output
+when used in @var{output}, or the standard input when used in the
+@var{inputs}. You most probably don't need to use this in
+@file{configure.ac}, but it is convenient when using the command line
+interface of @file{./config.status}, see @ref{config.status Invocation},
+for more details.
+
+The @var{inputs} may be absolute or relative file names. In the latter
+case they are first looked for in the build tree, and then in the source
+tree. Input files should be text files, and a line length below 2000
+bytes should be safe.
+
+@item commands
+Shell commands output literally into @file{config.status}, and
+associated with a tag that the user can use to tell @file{config.status}
+which commands to run. The commands are run each time a @var{tag}
+request is given to @file{config.status}, typically each time the file
+@file{@var{tag}} is created.
+
+The variables set during the execution of @command{configure} are
+@emph{not} available here: you first need to set them via the
+@var{init-cmds}. Nonetheless the following variables are precomputed:
+
+@table @code
+@item srcdir
+@vrindex srcdir
+The name of the top source directory, assuming that the working
+directory is the top build directory. This
+is what the @command{configure} option @option{--srcdir} sets.
+
+@item ac_top_srcdir
+@vrindex ac_top_srcdir
+The name of the top source directory, assuming that the working
+directory is the current build directory.
+
+@item ac_top_build_prefix
+@vrindex ac_top_build_prefix
+The name of the top build directory, assuming that the working
+directory is the current build directory.
+It can be empty, or else ends with a slash, so that you may concatenate
+it.
+
+@item ac_srcdir
+@vrindex ac_srcdir
+The name of the corresponding source directory, assuming that the
+working directory is the current build directory.
+
+@item tmp
+@vrindex tmp
+The name of a temporary directory within the build tree, which you
+can use if you need to create additional temporary files. The
+directory is cleaned up when @command{config.status} is done or
+interrupted. Please use package-specific file name prefixes to
+avoid clashing with files that @command{config.status} may use
+internally.
+@end table
+
+@noindent
+The @dfn{current} directory refers to the directory (or
+pseudo-directory) containing the input part of @var{tags}. For
+instance, running
+
+@example
+AC_CONFIG_COMMANDS([deep/dir/out:in/in.in], [@dots{}], [@dots{}])
+@end example
+
+@noindent
+ with @option{--srcdir=../package} produces the following values:
+
+@example
+# Argument of --srcdir
+srcdir='../package'
+# Reversing deep/dir
+ac_top_build_prefix='../../'
+# Concatenation of $ac_top_build_prefix and srcdir
+ac_top_srcdir='../../../package'
+# Concatenation of $ac_top_srcdir and deep/dir
+ac_srcdir='../../../package/deep/dir'
+@end example
+
+@noindent
+independently of @samp{in/in.in}.
+
+@item init-cmds
+Shell commands output @emph{unquoted} near the beginning of
+@file{config.status}, and executed each time @file{config.status} runs
+(regardless of the tag). Because they are unquoted, for example,
+@samp{$var} is output as the value of @code{var}. @var{init-cmds}
+is typically used by @file{configure} to give @file{config.status} some
+variables it needs to run the @var{commands}.
+
+You should be extremely cautious in your variable names: all the
+@var{init-cmds} share the same name space and may overwrite each other
+in unpredictable ways. Sorry@enddots{}
+@end table
+
+All these macros can be called multiple times, with different
+@var{tag} values, of course!
+
+
+@node Configuration Files
+@section Creating Configuration Files
+@cindex Creating configuration files
+@cindex Configuration file creation
+
+Be sure to read the previous section, @ref{Configuration Actions}.
+
+@anchor{AC_CONFIG_FILES}
+@defmac AC_CONFIG_FILES (@var{file}@dots{}, @ovar{cmds}, @ovar{init-cmds})
+@acindex{CONFIG_FILES}
+Make @code{AC_OUTPUT} create each @file{@var{file}} by copying an input
+file (by default @file{@var{file}.in}), substituting the output variable
+values.
+@c Before we used to have this feature, which was later rejected
+@c because it complicates the writing of makefiles:
+@c If the file would be unchanged, it is left untouched, to preserve
+@c timestamp.
+This macro is one of the instantiating macros; see @ref{Configuration
+Actions}. @xref{Makefile Substitutions}, for more information on using
+output variables. @xref{Setting Output Variables}, for more information
+on creating them. This macro creates the directory that the file is in
+if it doesn't exist. Usually, makefiles are created this way,
+but other files, such as @file{.gdbinit}, can be specified as well.
+
+Typical calls to @code{AC_CONFIG_FILES} look like this:
+
+@example
+AC_CONFIG_FILES([Makefile src/Makefile man/Makefile X/Imakefile])
+AC_CONFIG_FILES([autoconf], [chmod +x autoconf])
+@end example
+
+You can override an input file name by appending to @var{file} a
+colon-separated list of input files. Examples:
+
+@example
+AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk]
+ [lib/Makefile:boiler/lib.mk])
+@end example
+
+@noindent
+Doing this allows you to keep your file names acceptable to
+DOS variants, or
+to prepend and/or append boilerplate to the file.
+@end defmac
+
+
+
+@node Makefile Substitutions
+@section Substitutions in Makefiles
+@cindex Substitutions in makefiles
+@cindex Makefile substitutions
+
+Each subdirectory in a distribution that contains something to be
+compiled or installed should come with a file @file{Makefile.in}, from
+which @command{configure} creates a file @file{Makefile} in that directory.
+To create @file{Makefile}, @command{configure} performs a simple variable
+substitution, replacing occurrences of @samp{@@@var{variable}@@} in
+@file{Makefile.in} with the value that @command{configure} has determined
+for that variable. Variables that are substituted into output files in
+this way are called @dfn{output variables}. They are ordinary shell
+variables that are set in @command{configure}. To make @command{configure}
+substitute a particular variable into the output files, the macro
+@code{AC_SUBST} must be called with that variable name as an argument.
+Any occurrences of @samp{@@@var{variable}@@} for other variables are
+left unchanged. @xref{Setting Output Variables}, for more information
+on creating output variables with @code{AC_SUBST}.
+
+A software package that uses a @command{configure} script should be
+distributed with a file @file{Makefile.in}, but no makefile; that
+way, the user has to properly configure the package for the local system
+before compiling it.
+
+@xref{Makefile Conventions, , Makefile Conventions, standards, The
+GNU Coding Standards}, for more information on what to put in
+makefiles.
+
+@menu
+* Preset Output Variables:: Output variables that are always set
+* Installation Directory Variables:: Other preset output variables
+* Changed Directory Variables:: Warnings about @file{datarootdir}
+* Build Directories:: Supporting multiple concurrent compiles
+* Automatic Remaking:: Makefile rules for configuring
+@end menu
+
+@node Preset Output Variables
+@subsection Preset Output Variables
+@cindex Output variables
+
+Some output variables are preset by the Autoconf macros. Some of the
+Autoconf macros set additional output variables, which are mentioned in
+the descriptions for those macros. @xref{Output Variable Index}, for a
+complete list of output variables. @xref{Installation Directory
+Variables}, for the list of the preset ones related to installation
+directories. Below are listed the other preset ones, many of which are
+precious variables (@pxref{Setting Output Variables},
+@code{AC_ARG_VAR}).
+
+The preset variables which are available during @file{config.status}
+(@pxref{Configuration Actions}) may also be used during
+@command{configure} tests. For example, it is permissible to reference
+@samp{$srcdir} when constructing a list of directories to pass via
+option @option{-I} during a compiler feature check. When used in this
+manner, coupled with the fact that @command{configure} is always run
+from the top build directory, it is sufficient to use just
+@samp{$srcdir} instead of @samp{$top_srcdir}.
+
+@c Just say no to ASCII sorting! We're humans, not computers.
+@c These variables are listed as they would be in a dictionary:
+@c actor
+@c Actress
+@c actress
+
+@defvar CFLAGS
+@evindex CFLAGS
+@ovindex CFLAGS
+Debugging and optimization options for the C compiler. If it is not set
+in the environment when @command{configure} runs, the default value is set
+when you call @code{AC_PROG_CC} (or empty if you don't). @command{configure}
+uses this variable when compiling or linking programs to test for C features.
+
+If a compiler option affects only the behavior of the preprocessor
+(e.g., @option{-D@var{name}}), it should be put into @code{CPPFLAGS}
+instead. If it affects only the linker (e.g., @option{-L@var{directory}}),
+it should be put into @code{LDFLAGS} instead. If it
+affects only the compiler proper, @code{CFLAGS} is the natural home for
+it. If an option affects multiple phases of the compiler, though,
+matters get tricky. One approach to put such options directly into
+@code{CC}, e.g., @code{CC='gcc -m64'}. Another is to put them into both
+@code{CPPFLAGS} and @code{LDFLAGS}, but not into @code{CFLAGS}.
+
+However, remember that some @file{Makefile} variables are reserved by
+the GNU Coding Standards for the use of the ``user''---the person
+building the package. For instance, @code{CFLAGS} is one such variable.
+
+Sometimes package developers are tempted to set user variables such as
+@code{CFLAGS} because it appears to make their job easier. However, the
+package itself should never set a user variable, particularly not to
+include switches that are required for proper compilation of the
+package. Since these variables are documented as being for the package
+builder, that person rightfully expects to be able to override any of
+these variables at build time. If the package developer needs to add
+switches without interfering with the user, the proper way to do that is
+to introduce an additional variable. Automake makes this easy by
+introducing @code{AM_CFLAGS} (@pxref{Flag Variables Ordering, , ,
+automake, GNU Automake}), but the concept is the same even if
+Automake is not used.
+@end defvar
+
+@defvar configure_input
+@ovindex configure_input
+A comment saying that the file was generated automatically by
+@command{configure} and giving the name of the input file.
+@code{AC_OUTPUT} adds a comment line containing this variable to the top
+of every makefile it creates. For other files, you should
+reference this variable in a comment at the top of each input file. For
+example, an input shell script should begin like this:
+
+@example
+#!/bin/sh
+# @@configure_input@@
+@end example
+
+@noindent
+The presence of that line also reminds people editing the file that it
+needs to be processed by @command{configure} in order to be used.
+@end defvar
+
+@defvar CPPFLAGS
+@evindex CPPFLAGS
+@ovindex CPPFLAGS
+Preprocessor options for the C, C++, Objective C, and Objective C++
+preprocessors and compilers. If
+it is not set in the environment when @command{configure} runs, the default
+value is empty. @command{configure} uses this variable when preprocessing
+or compiling programs to test for C, C++, Objective C, and Objective C++
+features.
+
+This variable's contents should contain options like @option{-I},
+@option{-D}, and @option{-U} that affect only the behavior of the
+preprocessor. Please see the explanation of @code{CFLAGS} for what you
+can do if an option affects other phases of the compiler as well.
+
+Currently, @command{configure} always links as part of a single
+invocation of the compiler that also preprocesses and compiles, so it
+uses this variable also when linking programs. However, it is unwise to
+depend on this behavior because the GNU Coding Standards do
+not require it and many packages do not use @code{CPPFLAGS} when linking
+programs.
+
+@xref{Special Chars in Variables}, for limitations that @code{CPPFLAGS}
+might run into.
+@end defvar
+
+@defvar CXXFLAGS
+@evindex CXXFLAGS
+@ovindex CXXFLAGS
+Debugging and optimization options for the C++ compiler. It acts like
+@code{CFLAGS}, but for C++ instead of C.
+@end defvar
+
+@defvar DEFS
+@ovindex DEFS
+@option{-D} options to pass to the C compiler. If @code{AC_CONFIG_HEADERS}
+is called, @command{configure} replaces @samp{@@DEFS@@} with
+@option{-DHAVE_CONFIG_H} instead (@pxref{Configuration Headers}). This
+variable is not defined while @command{configure} is performing its tests,
+only when creating the output files. @xref{Setting Output Variables}, for
+how to check the results of previous tests.
+@end defvar
+
+@defvar ECHO_C
+@defvarx ECHO_N
+@defvarx ECHO_T
+@ovindex ECHO_C
+@ovindex ECHO_N
+@ovindex ECHO_T
+How does one suppress the trailing newline from @command{echo} for
+question-answer message pairs? These variables provide a way:
+
+@example
+echo $ECHO_N "And the winner is... $ECHO_C"
+sleep 100000000000
+echo "$@{ECHO_T@}dead."
+@end example
+
+@noindent
+Some old and uncommon @command{echo} implementations offer no means to
+achieve this, in which case @code{ECHO_T} is set to tab. You might not
+want to use it.
+@end defvar
+
+@defvar ERLCFLAGS
+@evindex ERLCFLAGS
+@ovindex ERLCFLAGS
+Debugging and optimization options for the Erlang compiler. If it is not set
+in the environment when @command{configure} runs, the default value is empty.
+@command{configure} uses this variable when compiling
+programs to test for Erlang features.
+@end defvar
+
+@defvar FCFLAGS
+@evindex FCFLAGS
+@ovindex FCFLAGS
+Debugging and optimization options for the Fortran compiler. If it
+is not set in the environment when @command{configure} runs, the default
+value is set when you call @code{AC_PROG_FC} (or empty if you don't).
+@command{configure} uses this variable when compiling or linking
+programs to test for Fortran features.
+@end defvar
+
+@defvar FFLAGS
+@evindex FFLAGS
+@ovindex FFLAGS
+Debugging and optimization options for the Fortran 77 compiler. If it
+is not set in the environment when @command{configure} runs, the default
+value is set when you call @code{AC_PROG_F77} (or empty if you don't).
+@command{configure} uses this variable when compiling or linking
+programs to test for Fortran 77 features.
+@end defvar
+
+@defvar LDFLAGS
+@evindex LDFLAGS
+@ovindex LDFLAGS
+Options for the linker. If it is not set
+in the environment when @command{configure} runs, the default value is empty.
+@command{configure} uses this variable when linking programs to test for
+C, C++, Objective C, Objective C++, Fortran, and Go features.
+
+This variable's contents should contain options like @option{-s} and
+@option{-L} that affect only the behavior of the linker. Please see the
+explanation of @code{CFLAGS} for what you can do if an option also
+affects other phases of the compiler.
+
+Don't use this variable to pass library names
+(@option{-l}) to the linker; use @code{LIBS} instead.
+@end defvar
+
+@defvar LIBS
+@evindex LIBS
+@ovindex LIBS
+@option{-l} options to pass to the linker. The default value is empty,
+but some Autoconf macros may prepend extra libraries to this variable if
+those libraries are found and provide necessary functions, see
+@ref{Libraries}. @command{configure} uses this variable when linking
+programs to test for C, C++, Objective C, Objective C++, Fortran, and Go
+features.
+@end defvar
+
+@defvar OBJCFLAGS
+@evindex OBJCFLAGS
+@ovindex OBJCFLAGS
+Debugging and optimization options for the Objective C compiler. It
+acts like @code{CFLAGS}, but for Objective C instead of C.
+@end defvar
+
+@defvar OBJCXXFLAGS
+@evindex OBJCXXFLAGS
+@ovindex OBJCXXFLAGS
+Debugging and optimization options for the Objective C++ compiler. It
+acts like @code{CXXFLAGS}, but for Objective C++ instead of C++.
+@end defvar
+
+@defvar GOFLAGS
+@evindex GOFLAGS
+@ovindex GOFLAGS
+Debugging and optimization options for the Go compiler. It acts like
+@code{CFLAGS}, but for Go instead of C.
+@end defvar
+
+@defvar builddir
+@ovindex builddir
+Rigorously equal to @samp{.}. Added for symmetry only.
+@end defvar
+
+@defvar abs_builddir
+@ovindex abs_builddir
+Absolute name of @code{builddir}.
+@end defvar
+
+@defvar top_builddir
+@ovindex top_builddir
+The relative name of the top level of the current build tree. In the
+top-level directory, this is the same as @code{builddir}.
+@end defvar
+
+@defvar top_build_prefix
+@ovindex top_build_prefix
+The relative name of the top level of the current build tree with final
+slash if nonempty. This is the same as @code{top_builddir}, except that
+it contains zero or more runs of @code{../}, so it should not be
+appended with a slash for concatenation. This helps for @command{make}
+implementations that otherwise do not treat @file{./file} and @file{file}
+as equal in the toplevel build directory.
+@end defvar
+
+@defvar abs_top_builddir
+@ovindex abs_top_builddir
+Absolute name of @code{top_builddir}.
+@end defvar
+
+@defvar srcdir
+@ovindex srcdir
+The name of the directory that contains the source code for
+that makefile.
+@end defvar
+
+@defvar abs_srcdir
+@ovindex abs_srcdir
+Absolute name of @code{srcdir}.
+@end defvar
+
+@defvar top_srcdir
+@ovindex top_srcdir
+The name of the top-level source code directory for the
+package. In the top-level directory, this is the same as @code{srcdir}.
+@end defvar
+
+@defvar abs_top_srcdir
+@ovindex abs_top_srcdir
+Absolute name of @code{top_srcdir}.
+@end defvar
+
+@node Installation Directory Variables
+@subsection Installation Directory Variables
+@cindex Installation directories
+@cindex Directories, installation
+
+The following variables specify the directories for
+package installation, see @ref{Directory Variables, , Variables for
+Installation Directories, standards, The GNU Coding
+Standards}, for more information. Each variable corresponds to an
+argument of @command{configure}; trailing slashes are stripped so that
+expressions such as @samp{$@{prefix@}/lib} expand with only one slash
+between directory names. See the end of this section for
+details on when and how to use these variables.
+
+@defvar bindir
+@ovindex bindir
+The directory for installing executables that users run.
+@end defvar
+
+@defvar datadir
+@ovindex datadir
+The directory for installing idiosyncratic read-only
+architecture-independent data.
+@end defvar
+
+@defvar datarootdir
+@ovindex datarootdir
+The root of the directory tree for read-only architecture-independent
+data files.
+@end defvar
+
+@defvar docdir
+@ovindex docdir
+The directory for installing documentation files (other than Info and
+man).
+@end defvar
+
+@defvar dvidir
+@ovindex dvidir
+The directory for installing documentation files in DVI format.
+@end defvar
+
+@defvar exec_prefix
+@ovindex exec_prefix
+The installation prefix for architecture-dependent files. By default
+it's the same as @code{prefix}. You should avoid installing anything
+directly to @code{exec_prefix}. However, the default value for
+directories containing architecture-dependent files should be relative
+to @code{exec_prefix}.
+@end defvar
+
+@defvar htmldir
+@ovindex htmldir
+The directory for installing HTML documentation.
+@end defvar
+
+@defvar includedir
+@ovindex includedir
+The directory for installing C header files.
+@end defvar
+
+@defvar infodir
+@ovindex infodir
+The directory for installing documentation in Info format.
+@end defvar
+
+@defvar libdir
+@ovindex libdir
+The directory for installing object code libraries.
+@end defvar
+
+@defvar libexecdir
+@ovindex libexecdir
+The directory for installing executables that other programs run.
+@end defvar
+
+@defvar localedir
+@ovindex localedir
+The directory for installing locale-dependent but
+architecture-independent data, such as message catalogs. This directory
+usually has a subdirectory per locale.
+@end defvar
+
+@defvar localstatedir
+@ovindex localstatedir
+The directory for installing modifiable single-machine data.
+@end defvar
+
+@defvar mandir
+@ovindex mandir
+The top-level directory for installing documentation in man format.
+@end defvar
+
+@defvar oldincludedir
+@ovindex oldincludedir
+The directory for installing C header files for non-GCC compilers.
+@end defvar
+
+@defvar pdfdir
+@ovindex pdfdir
+The directory for installing PDF documentation.
+@end defvar
+
+@defvar prefix
+@ovindex prefix
+The common installation prefix for all files. If @code{exec_prefix}
+is defined to a different value, @code{prefix} is used only for
+architecture-independent files.
+@end defvar
+
+@defvar psdir
+@ovindex psdir
+The directory for installing PostScript documentation.
+@end defvar
+
+@defvar sbindir
+@ovindex sbindir
+The directory for installing executables that system
+administrators run.
+@end defvar
+
+@defvar sharedstatedir
+@ovindex sharedstatedir
+The directory for installing modifiable architecture-independent data.
+@end defvar
+
+@defvar sysconfdir
+@ovindex sysconfdir
+The directory for installing read-only single-machine data.
+@end defvar
+
+
+Most of these variables have values that rely on @code{prefix} or
+@code{exec_prefix}. It is deliberate that the directory output
+variables keep them unexpanded: typically @samp{@@datarootdir@@} is
+replaced by @samp{$@{prefix@}/share}, not @samp{/usr/local/share}, and
+@samp{@@datadir@@} is replaced by @samp{$@{datarootdir@}}.
+
+This behavior is mandated by the GNU Coding Standards, so that when
+the user runs:
+
+@table @samp
+@item make
+she can still specify a different prefix from the one specified to
+@command{configure}, in which case, if needed, the package should hard
+code dependencies corresponding to the make-specified prefix.
+
+@item make install
+she can specify a different installation location, in which case the
+package @emph{must} still depend on the location which was compiled in
+(i.e., never recompile when @samp{make install} is run). This is an
+extremely important feature, as many people may decide to install all
+the files of a package grouped together, and then install links from
+the final locations to there.
+@end table
+
+In order to support these features, it is essential that
+@code{datarootdir} remains defined as @samp{$@{prefix@}/share},
+so that its value can be expanded based
+on the current value of @code{prefix}.
+
+A corollary is that you should not use these variables except in
+makefiles. For instance, instead of trying to evaluate @code{datadir}
+in @file{configure} and hard-coding it in makefiles using
+e.g., @samp{AC_DEFINE_UNQUOTED([DATADIR], ["$datadir"], [Data directory.])},
+you should add
+@option{-DDATADIR='$(datadir)'} to your makefile's definition of
+@code{CPPFLAGS} (@code{AM_CPPFLAGS} if you are also using Automake).
+
+Similarly, you should not rely on @code{AC_CONFIG_FILES} to replace
+@code{bindir} and friends in your shell scripts and other files; instead,
+let @command{make} manage their replacement. For instance Autoconf
+ships templates of its shell scripts ending with @samp{.in}, and uses a
+makefile snippet similar to the following to build scripts like
+@command{autoheader} and @command{autom4te}:
+
+@example
+@group
+edit = sed \
+ -e 's|@@bindir[@@]|$(bindir)|g' \
+ -e 's|@@pkgdatadir[@@]|$(pkgdatadir)|g' \
+ -e 's|@@prefix[@@]|$(prefix)|g'
+@end group
+
+@group
+autoheader autom4te: Makefile
+ rm -f $@@ $@@.tmp
+ srcdir=''; \
+ test -f ./$@@.in || srcdir=$(srcdir)/; \
+ $(edit) $$@{srcdir@}$@@.in >$@@.tmp
+@c $$ restore font-lock
+ chmod +x $@@.tmp
+ chmod a-w $@@.tmp
+ mv $@@.tmp $@@
+@end group
+
+@group
+autoheader: $(srcdir)/autoheader.in
+autom4te: $(srcdir)/autom4te.in
+@end group
+@end example
+
+Some details are noteworthy:
+
+@table @asis
+@item @samp{@@bindir[@@]}
+The brackets prevent @command{configure} from replacing
+@samp{@@bindir@@} in the Sed expression itself.
+Brackets are preferable to a backslash here, since
+Posix says @samp{\@@} is not portable.
+
+@item @samp{$(bindir)}
+Don't use @samp{@@bindir@@}! Use the matching makefile variable
+instead.
+
+@item @samp{$(pkgdatadir)}
+The example takes advantage of the variable @samp{$(pkgdatadir)}
+provided by Automake; it is equivalent to @samp{$(datadir)/$(PACKAGE)}.
+
+@item @samp{/}
+Don't use @samp{/} in the Sed expressions that replace file names since
+most likely the
+variables you use, such as @samp{$(bindir)}, contain @samp{/}.
+Use a shell metacharacter instead, such as @samp{|}.
+
+@item special characters
+File names, file name components, and the value of @code{VPATH} should
+not contain shell metacharacters or white
+space. @xref{Special Chars in Variables}.
+
+@item dependency on @file{Makefile}
+Since @code{edit} uses values that depend on the configuration specific
+values (@code{prefix}, etc.)@: and not only on @code{VERSION} and so forth,
+the output depends on @file{Makefile}, not @file{configure.ac}.
+
+@item @samp{$@@}
+The main rule is generic, and uses @samp{$@@} extensively to
+avoid the need for multiple copies of the rule.
+
+@item Separated dependencies and single suffix rules
+You can't use them! The above snippet cannot be (portably) rewritten
+as:
+
+@example
+autoconf autoheader: Makefile
+@group
+.in:
+ rm -f $@@ $@@.tmp
+ $(edit) $< >$@@.tmp
+ chmod +x $@@.tmp
+ mv $@@.tmp $@@
+@end group
+@end example
+
+@xref{Single Suffix Rules}, for details.
+
+@item @samp{$(srcdir)}
+Be sure to specify the name of the source directory,
+otherwise the package won't support separated builds.
+@end table
+
+For the more specific installation of Erlang libraries, the following variables
+are defined:
+
+@defvar ERLANG_INSTALL_LIB_DIR
+@ovindex ERLANG_INSTALL_LIB_DIR
+@acindex{ERLANG_SUBST_INSTALL_LIB_DIR}
+The common parent directory of Erlang library installation directories.
+This variable is set by calling the @code{AC_ERLANG_SUBST_INSTALL_LIB_DIR}
+macro in @file{configure.ac}.
+@end defvar
+
+@defvar ERLANG_INSTALL_LIB_DIR_@var{library}
+@ovindex ERLANG_INSTALL_LIB_DIR_@var{library}
+@acindex{ERLANG_SUBST_INSTALL_LIB_SUBDIR}
+The installation directory for Erlang library @var{library}.
+This variable is set by using the
+@samp{AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR}
+macro in @file{configure.ac}.
+@end defvar
+
+@xref{Erlang Libraries}, for details.
+
+
+@node Changed Directory Variables
+@subsection Changed Directory Variables
+@cindex @file{datarootdir}
+
+In Autoconf 2.60, the set of directory variables has changed, and the
+defaults of some variables have been adjusted
+(@pxref{Installation Directory Variables}) to changes in the
+GNU Coding Standards. Notably, @file{datadir}, @file{infodir}, and
+@file{mandir} are now expressed in terms of @file{datarootdir}. If you are
+upgrading from an earlier Autoconf version, you may need to adjust your files
+to ensure that the directory variables are substituted correctly
+(@pxref{Defining Directories}), and that a definition of @file{datarootdir} is
+in place. For example, in a @file{Makefile.in}, adding
+
+@example
+datarootdir = @@datarootdir@@
+@end example
+
+@noindent
+is usually sufficient. If you use Automake to create @file{Makefile.in},
+it will add this for you.
+
+To help with the transition, Autoconf warns about files that seem to use
+@code{datarootdir} without defining it. In some cases, it then expands
+the value of @code{$datarootdir} in substitutions of the directory
+variables. The following example shows such a warning:
+
+@example
+$ @kbd{cat configure.ac}
+AC_INIT
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
+$ @kbd{cat Makefile.in}
+prefix = @@prefix@@
+datadir = @@datadir@@
+$ @kbd{autoconf}
+$ @kbd{configure}
+configure: creating ./config.status
+config.status: creating Makefile
+config.status: WARNING:
+ Makefile.in seems to ignore the --datarootdir setting
+$ @kbd{cat Makefile}
+prefix = /usr/local
+datadir = $@{prefix@}/share
+@end example
+
+Usually one can easily change the file to accommodate both older and newer
+Autoconf releases:
+
+@example
+$ @kbd{cat Makefile.in}
+prefix = @@prefix@@
+datarootdir = @@datarootdir@@
+datadir = @@datadir@@
+$ @kbd{configure}
+configure: creating ./config.status
+config.status: creating Makefile
+$ @kbd{cat Makefile}
+prefix = /usr/local
+datarootdir = $@{prefix@}/share
+datadir = $@{datarootdir@}
+@end example
+
+@acindex{DATAROOTDIR_CHECKED}
+In some cases, however, the checks may not be able to detect that a suitable
+initialization of @code{datarootdir} is in place, or they may fail to detect
+that such an initialization is necessary in the output file. If, after
+auditing your package, there are still spurious @file{configure} warnings about
+@code{datarootdir}, you may add the line
+
+@example
+AC_DEFUN([AC_DATAROOTDIR_CHECKED])
+@end example
+
+@noindent
+to your @file{configure.ac} to disable the warnings. This is an exception
+to the usual rule that you should not define a macro whose name begins with
+@code{AC_} (@pxref{Macro Names}).
+
+
+
+@node Build Directories
+@subsection Build Directories
+@cindex Build directories
+@cindex Directories, build
+
+You can support compiling a software package for several architectures
+simultaneously from the same copy of the source code. The object files
+for each architecture are kept in their own directory.
+
+To support doing this, @command{make} uses the @code{VPATH} variable to
+find the files that are in the source directory. GNU Make
+can do this. Most other recent @command{make} programs can do this as
+well, though they may have difficulties and it is often simpler to
+recommend GNU @command{make} (@pxref{VPATH and Make}). Older
+@command{make} programs do not support @code{VPATH}; when using them, the
+source code must be in the same directory as the object files.
+
+If you are using GNU Automake, the remaining details in this
+section are already covered for you, based on the contents of your
+@file{Makefile.am}. But if you are using Autoconf in isolation, then
+supporting @code{VPATH} requires the following in your
+@file{Makefile.in}:
+
+@example
+srcdir = @@srcdir@@
+VPATH = @@srcdir@@
+@end example
+
+Do not set @code{VPATH} to the value of another variable (@pxref{Variables
+listed in VPATH}.
+
+@command{configure} substitutes the correct value for @code{srcdir} when
+it produces @file{Makefile}.
+
+Do not use the @command{make} variable @code{$<}, which expands to the
+file name of the file in the source directory (found with @code{VPATH}),
+except in implicit rules. (An implicit rule is one such as @samp{.c.o},
+which tells how to create a @file{.o} file from a @file{.c} file.) Some
+versions of @command{make} do not set @code{$<} in explicit rules; they
+expand it to an empty value.
+
+Instead, Make command lines should always refer to source
+files by prefixing them with @samp{$(srcdir)/}. For example:
+
+@example
+time.info: time.texinfo
+ $(MAKEINFO) '$(srcdir)/time.texinfo'
+@end example
+
+@node Automatic Remaking
+@subsection Automatic Remaking
+@cindex Automatic remaking
+@cindex Remaking automatically
+
+You can put rules like the following in the top-level @file{Makefile.in}
+for a package to automatically update the configuration information when
+you change the configuration files. This example includes all of the
+optional files, such as @file{aclocal.m4} and those related to
+configuration header files. Omit from the @file{Makefile.in} rules for
+any of these files that your package does not use.
+
+The @samp{$(srcdir)/} prefix is included because of limitations in the
+@code{VPATH} mechanism.
+
+The @file{stamp-} files are necessary because the timestamps of
+@file{config.h.in} and @file{config.h} are not changed if remaking
+them does not change their contents. This feature avoids unnecessary
+recompilation. You should include the file @file{stamp-h.in} in your
+package's distribution, so that @command{make} considers
+@file{config.h.in} up to date. Don't use @command{touch}
+(@pxref{touch, , Limitations of Usual Tools}); instead, use
+@command{echo} (using
+@command{date} would cause needless differences, hence CVS
+conflicts, etc.).
+
+@example
+@group
+$(srcdir)/configure: configure.ac aclocal.m4
+ cd '$(srcdir)' && autoconf
+
+# autoheader might not change config.h.in, so touch a stamp file.
+$(srcdir)/config.h.in: stamp-h.in
+$(srcdir)/stamp-h.in: configure.ac aclocal.m4
+ cd '$(srcdir)' && autoheader
+ echo timestamp > '$(srcdir)/stamp-h.in'
+
+config.h: stamp-h
+stamp-h: config.h.in config.status
+ ./config.status
+
+Makefile: Makefile.in config.status
+ ./config.status
+
+config.status: configure
+ ./config.status --recheck
+@end group
+@end example
+
+@noindent
+(Be careful if you copy these lines directly into your makefile, as you
+need to convert the indented lines to start with the tab character.)
+
+In addition, you should use
+
+@example
+AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h])
+@end example
+
+@noindent
+so @file{config.status} ensures that @file{config.h} is considered up to
+date. @xref{Output}, for more information about @code{AC_OUTPUT}.
+
+@xref{config.status Invocation}, for more examples of handling
+configuration-related dependencies.
+
+@node Configuration Headers
+@section Configuration Header Files
+@cindex Configuration Header
+@cindex @file{config.h}
+
+When a package contains more than a few tests that define C preprocessor
+symbols, the command lines to pass @option{-D} options to the compiler
+can get quite long. This causes two problems. One is that the
+@command{make} output is hard to visually scan for errors. More
+seriously, the command lines can exceed the length limits of some
+operating systems. As an alternative to passing @option{-D} options to
+the compiler, @command{configure} scripts can create a C header file
+containing @samp{#define} directives. The @code{AC_CONFIG_HEADERS}
+macro selects this kind of output. Though it can be called anywhere
+between @code{AC_INIT} and @code{AC_OUTPUT}, it is customary to call
+it right after @code{AC_INIT}.
+
+The package should @samp{#include} the configuration header file before
+any other header files, to prevent inconsistencies in declarations (for
+example, if it redefines @code{const}).
+
+To provide for VPATH builds, remember to pass the C compiler a @option{-I.}
+option (or @option{-I..}; whichever directory contains @file{config.h}).
+Even if you use @samp{#include "config.h"}, the preprocessor searches only
+the directory of the currently read file, i.e., the source directory, not
+the build directory.
+
+With the appropriate @option{-I} option, you can use
+@samp{#include <config.h>}. Actually, it's a good habit to use it,
+because in the rare case when the source directory contains another
+@file{config.h}, the build directory should be searched first.
+
+
+@defmac AC_CONFIG_HEADERS (@var{header} @dots{}, @ovar{cmds}, @ovar{init-cmds})
+@acindex{CONFIG_HEADERS}
+@cvindex HAVE_CONFIG_H
+This macro is one of the instantiating macros; see @ref{Configuration
+Actions}. Make @code{AC_OUTPUT} create the file(s) in the
+blank-or-newline-separated list @var{header} containing C preprocessor
+@code{#define} statements, and replace @samp{@@DEFS@@} in generated
+files with @option{-DHAVE_CONFIG_H} instead of the value of @code{DEFS}.
+The usual name for @var{header} is @file{config.h}.
+
+If @var{header} already exists and its contents are identical to what
+@code{AC_OUTPUT} would put in it, it is left alone. Doing this allows
+making some changes in the configuration without needlessly causing
+object files that depend on the header file to be recompiled.
+
+Usually the input file is named @file{@var{header}.in}; however, you can
+override the input file name by appending to @var{header} a
+colon-separated list of input files. For example, you might need to make
+the input file name acceptable to DOS variants:
+
+@example
+AC_CONFIG_HEADERS([config.h:config.hin])
+@end example
+
+@end defmac
+
+@defmac AH_HEADER
+@ahindex{HEADER}
+This macro is defined as the name of the first declared config header
+and undefined if no config headers have been declared up to this point.
+A third-party macro may, for example, require use of a config header
+without invoking AC_CONFIG_HEADERS twice, like this:
+
+@example
+AC_CONFIG_COMMANDS_PRE(
+ [m4_ifndef([AH_HEADER], [AC_CONFIG_HEADERS([config.h])])])
+@end example
+
+@end defmac
+
+@xref{Configuration Actions}, for more details on @var{header}.
+
+@menu
+* Header Templates:: Input for the configuration headers
+* autoheader Invocation:: How to create configuration templates
+* Autoheader Macros:: How to specify CPP templates
+@end menu
+
+@node Header Templates
+@subsection Configuration Header Templates
+@cindex Configuration Header Template
+@cindex Header templates
+@cindex @file{config.h.in}
+
+Your distribution should contain a template file that looks as you want
+the final header file to look, including comments, with @code{#undef}
+statements which are used as hooks. For example, suppose your
+@file{configure.ac} makes these calls:
+
+@example
+AC_CONFIG_HEADERS([conf.h])
+AC_CHECK_HEADERS([unistd.h])
+@end example
+
+@noindent
+Then you could have code like the following in @file{conf.h.in}.
+The @file{conf.h} created by @command{configure} defines @samp{HAVE_UNISTD_H}
+to 1, if and only if the system has @file{unistd.h}.
+
+@example
+@group
+/* Define as 1 if you have unistd.h. */
+#undef HAVE_UNISTD_H
+@end group
+@end example
+
+The format of the template file is stricter than what the C preprocessor
+is required to accept. A directive line should contain only whitespace,
+@samp{#undef}, and @samp{HAVE_UNISTD_H}. The use of @samp{#define}
+instead of @samp{#undef}, or of comments on the same line as
+@samp{#undef}, is strongly discouraged. Each hook should only be listed
+once. Other preprocessor lines, such as @samp{#ifdef} or
+@samp{#include}, are copied verbatim from the template into the
+generated header.
+
+Since it is a tedious task to keep a template header up to date, you may
+use @command{autoheader} to generate it, see @ref{autoheader Invocation}.
+
+During the instantiation of the header, each @samp{#undef} line in the
+template file for each symbol defined by @samp{AC_DEFINE} is changed to an
+appropriate @samp{#define}. If the corresponding @samp{AC_DEFINE} has not
+been executed during the @command{configure} run, the @samp{#undef} line is
+commented out. (This is important, e.g., for @samp{_POSIX_SOURCE}:
+on many systems, it can be implicitly defined by the compiler, and
+undefining it in the header would then break compilation of subsequent
+headers.)
+
+Currently, @emph{all} remaining @samp{#undef} lines in the header
+template are commented out, whether or not there was a corresponding
+@samp{AC_DEFINE} for the macro name; but this behavior is not guaranteed
+for future releases of Autoconf.
+
+Generally speaking, since you should not use @samp{#define}, and you
+cannot guarantee whether a @samp{#undef} directive in the header
+template will be converted to a @samp{#define} or commented out in the
+generated header file, the template file cannot be used for conditional
+definition effects. Consequently, if you need to use the construct
+
+@example
+@group
+#ifdef THIS
+# define THAT
+#endif
+@end group
+@end example
+
+@noindent
+you must place it outside of the template.
+If you absolutely need to hook it to the config header itself, please put
+the directives to a separate file, and @samp{#include} that file from the
+config header template. If you are using @command{autoheader}, you would
+probably use @samp{AH_BOTTOM} to append the @samp{#include} directive.
+
+
+@node autoheader Invocation
+@subsection Using @command{autoheader} to Create @file{config.h.in}
+@cindex @command{autoheader}
+
+The @command{autoheader} program can create a template file of C
+@samp{#define} statements for @command{configure} to use.
+It searches for the first invocation of @code{AC_CONFIG_HEADERS} in
+@file{configure} sources to determine the name of the template.
+(If the first call of @code{AC_CONFIG_HEADERS} specifies more than one
+input file name, @command{autoheader} uses the first one.)
+
+It is recommended that only one input file is used. If you want to append
+a boilerplate code, it is preferable to use
+@samp{AH_BOTTOM([#include <conf_post.h>])}.
+File @file{conf_post.h} is not processed during the configuration then,
+which make things clearer. Analogically, @code{AH_TOP} can be used to
+prepend a boilerplate code.
+
+In order to do its job, @command{autoheader} needs you to document all
+of the symbols that you might use. Typically this is done via an
+@code{AC_DEFINE} or @code{AC_DEFINE_UNQUOTED} call whose first argument
+is a literal symbol and whose third argument describes the symbol
+(@pxref{Defining Symbols}). Alternatively, you can use
+@code{AH_TEMPLATE} (@pxref{Autoheader Macros}), or you can supply a
+suitable input file for a subsequent configuration header file.
+Symbols defined by Autoconf's builtin tests are already documented properly;
+you need to document only those that you
+define yourself.
+
+You might wonder why @command{autoheader} is needed: after all, why
+would @command{configure} need to ``patch'' a @file{config.h.in} to
+produce a @file{config.h} instead of just creating @file{config.h} from
+scratch? Well, when everything rocks, the answer is just that we are
+wasting our time maintaining @command{autoheader}: generating
+@file{config.h} directly is all that is needed. When things go wrong,
+however, you'll be thankful for the existence of @command{autoheader}.
+
+The fact that the symbols are documented is important in order to
+@emph{check} that @file{config.h} makes sense. The fact that there is a
+well-defined list of symbols that should be defined (or not) is
+also important for people who are porting packages to environments where
+@command{configure} cannot be run: they just have to @emph{fill in the
+blanks}.
+
+But let's come back to the point: the invocation of @command{autoheader}@dots{}
+
+If you give @command{autoheader} an argument, it uses that file instead
+of @file{configure.ac} and writes the header file to the standard output
+instead of to @file{config.h.in}. If you give @command{autoheader} an
+argument of @option{-}, it reads the standard input instead of
+@file{configure.ac} and writes the header file to the standard output.
+
+@command{autoheader} accepts the following options:
+
+@table @option
+@item --help
+@itemx -h
+Print a summary of the command line options and exit.
+
+@item --version
+@itemx -V
+Print the version number of Autoconf and exit.
+
+@item --verbose
+@itemx -v
+Report processing steps.
+
+@item --debug
+@itemx -d
+Don't remove the temporary files.
+
+@item --force
+@itemx -f
+Remake the template file even if newer than its input files.
+
+@item --include=@var{dir}
+@itemx -I @var{dir}
+Append @var{dir} to the include path. Multiple invocations accumulate.
+
+@item --prepend-include=@var{dir}
+@itemx -B @var{dir}
+Prepend @var{dir} to the include path. Multiple invocations accumulate.
+
+@item --warnings=@var{category}
+@itemx -W @var{category}
+@evindex WARNINGS
+Report the warnings related to @var{category} (which can actually be a
+comma separated list). Current categories include:
+
+@table @samp
+@item obsolete
+report the uses of obsolete constructs
+
+@item all
+report all the warnings
+
+@item none
+report none
+
+@item error
+treats warnings as errors
+
+@item no-@var{category}
+disable warnings falling into @var{category}
+@end table
+
+@end table
+
+
+
+@node Autoheader Macros
+@subsection Autoheader Macros
+@cindex Autoheader macros
+
+@command{autoheader} scans @file{configure.ac} and figures out which C
+preprocessor symbols it might define. It knows how to generate
+templates for symbols defined by @code{AC_CHECK_HEADERS},
+@code{AC_CHECK_FUNCS} etc., but if you @code{AC_DEFINE} any additional
+symbol, you must define a template for it. If there are missing
+templates, @command{autoheader} fails with an error message.
+
+The template for a @var{symbol} is created
+by @command{autoheader} from
+the @var{description} argument to an @code{AC_DEFINE};
+see @ref{Defining Symbols}.
+
+For special needs, you can use the following macros.
+
+
+@defmac AH_TEMPLATE (@var{key}, @var{description})
+@ahindex{TEMPLATE}
+Tell @command{autoheader} to generate a template for @var{key}. This macro
+generates standard templates just like @code{AC_DEFINE} when a
+@var{description} is given.
+
+For example:
+
+@example
+AH_TEMPLATE([CRAY_STACKSEG_END],
+ [Define to one of _getb67, GETB67, getb67
+ for Cray-2 and Cray-YMP systems. This
+ function is required for alloca.c support
+ on those systems.])
+@end example
+
+@noindent
+generates the following template, with the description properly
+justified.
+
+@example
+/* Define to one of _getb67, GETB67, getb67 for Cray-2 and
+ Cray-YMP systems. This function is required for alloca.c
+ support on those systems. */
+#undef CRAY_STACKSEG_END
+@end example
+@end defmac
+
+
+@defmac AH_VERBATIM (@var{key}, @var{template})
+@ahindex{VERBATIM}
+Tell @command{autoheader} to include the @var{template} as-is in the header
+template file. This @var{template} is associated with the @var{key},
+which is used to sort all the different templates and guarantee their
+uniqueness. It should be a symbol that can be defined via @code{AC_DEFINE}.
+@end defmac
+
+
+@defmac AH_TOP (@var{text})
+@ahindex{TOP}
+Include @var{text} at the top of the header template file.
+@end defmac
+
+
+@defmac AH_BOTTOM (@var{text})
+@ahindex{BOTTOM}
+Include @var{text} at the bottom of the header template file.
+@end defmac
+
+
+Please note that @var{text} gets included ``verbatim'' to the template file,
+not to the resulting config header, so it can easily get mangled when the
+template is processed. There is rarely a need for something other than
+
+@example
+AH_BOTTOM([#include <custom.h>])
+@end example
+
+
+
+@node Configuration Commands
+@section Running Arbitrary Configuration Commands
+@cindex Configuration commands
+@cindex Commands for configuration
+
+You can execute arbitrary commands before, during, and after
+@file{config.status} is run. The three following macros accumulate the
+commands to run when they are called multiple times.
+@code{AC_CONFIG_COMMANDS} replaces the obsolete macro
+@code{AC_OUTPUT_COMMANDS}; see @ref{Obsolete Macros}, for details.
+
+@anchor{AC_CONFIG_COMMANDS}
+@defmac AC_CONFIG_COMMANDS (@var{tag}@dots{}, @ovar{cmds}, @ovar{init-cmds})
+@acindex{CONFIG_COMMANDS}
+Specify additional shell commands to run at the end of
+@file{config.status}, and shell commands to initialize any variables
+from @command{configure}. Associate the commands with @var{tag}.
+Since typically the @var{cmds} create a file, @var{tag} should
+naturally be the name of that file. If needed, the directory hosting
+@var{tag} is created. This macro is one of the instantiating macros;
+see @ref{Configuration Actions}.
+
+Here is an unrealistic example:
+@example
+fubar=42
+AC_CONFIG_COMMANDS([fubar],
+ [echo this is extra $fubar, and so on.],
+ [fubar=$fubar])
+@end example
+
+Here is a better one:
+@example
+AC_CONFIG_COMMANDS([timestamp], [date >timestamp])
+@end example
+@end defmac
+
+The following two macros look similar, but in fact they are not of the same
+breed: they are executed directly by @file{configure}, so you cannot use
+@file{config.status} to rerun them.
+
+@c Yet it is good to leave them here. The user sees them together and
+@c decides which best fits their needs.
+
+@defmac AC_CONFIG_COMMANDS_PRE (@var{cmds})
+@acindex{CONFIG_COMMANDS_PRE}
+Execute the @var{cmds} right before creating @file{config.status}.
+
+This macro presents the last opportunity to call @code{AC_SUBST},
+@code{AC_DEFINE}, or @code{AC_CONFIG_@var{ITEMS}} macros.
+@end defmac
+
+@defmac AC_CONFIG_COMMANDS_POST (@var{cmds})
+@acindex{CONFIG_COMMANDS_POST}
+Execute the @var{cmds} right after creating @file{config.status}.
+@end defmac
+
+
+
+
+@node Configuration Links
+@section Creating Configuration Links
+@cindex Configuration links
+@cindex Links for configuration
+
+You may find it convenient to create links whose destinations depend upon
+results of tests. One can use @code{AC_CONFIG_COMMANDS} but the
+creation of relative symbolic links can be delicate when the package is
+built in a directory different from the source directory.
+
+@anchor{AC_CONFIG_LINKS}
+@defmac AC_CONFIG_LINKS (@var{dest}:@var{source}@dots{}, @ovar{cmds}, @
+ @ovar{init-cmds})
+@acindex{CONFIG_LINKS}
+@cindex Links
+Make @code{AC_OUTPUT} link each of the existing files @var{source} to
+the corresponding link name @var{dest}. Makes a symbolic link if
+possible, otherwise a hard link if possible, otherwise a copy. The
+@var{dest} and @var{source} names should be relative to the top level
+source or build directory. This macro is one of the instantiating
+macros; see @ref{Configuration Actions}.
+
+For example, this call:
+
+@example
+AC_CONFIG_LINKS([host.h:config/$machine.h
+ object.h:config/$obj_format.h])
+@end example
+
+@noindent
+creates in the current directory @file{host.h} as a link to
+@file{@var{srcdir}/config/$machine.h}, and @file{object.h} as a
+link to @file{@var{srcdir}/config/$obj_format.h}.
+
+The tempting value @samp{.} for @var{dest} is invalid: it makes it
+impossible for @samp{config.status} to guess the links to establish.
+
+One can then run:
+@example
+./config.status host.h object.h
+@end example
+@noindent
+to create the links.
+@end defmac
+
+
+
+@node Subdirectories
+@section Configuring Other Packages in Subdirectories
+@cindex Configure subdirectories
+@cindex Subdirectory configure
+
+In most situations, calling @code{AC_OUTPUT} is sufficient to produce
+makefiles in subdirectories. However, @command{configure} scripts
+that control more than one independent package can use
+@code{AC_CONFIG_SUBDIRS} to run @command{configure} scripts for other
+packages in subdirectories.
+
+@defmac AC_CONFIG_SUBDIRS (@var{dir} @dots{})
+@acindex{CONFIG_SUBDIRS}
+@ovindex subdirs
+Make @code{AC_OUTPUT} run @command{configure} in each subdirectory
+@var{dir} in the given blank-or-newline-separated list. Each @var{dir} should
+be a literal, i.e., please do not use:
+
+@example
+@c If you change this example, adjust tests/torture.at:Non-literal AC_CONFIG_SUBDIRS.
+if test "x$package_foo_enabled" = xyes; then
+ my_subdirs="$my_subdirs foo"
+fi
+AC_CONFIG_SUBDIRS([$my_subdirs])
+@end example
+
+@noindent
+because this prevents @samp{./configure --help=recursive} from
+displaying the options of the package @code{foo}. Instead, you should
+write:
+
+@example
+if test "x$package_foo_enabled" = xyes; then
+ AC_CONFIG_SUBDIRS([foo])
+fi
+@end example
+
+If a given @var{dir} is not found at @command{configure} run time, a
+warning is reported; if the subdirectory is optional, write:
+
+@example
+if test -d "$srcdir/foo"; then
+ AC_CONFIG_SUBDIRS([foo])
+fi
+@end example
+
+@c NB: Yes, below we mean configure.in, not configure.ac.
+If a given @var{dir} contains @command{configure.gnu}, it is run instead
+of @command{configure}. This is for packages that might use a
+non-Autoconf script @command{Configure}, which can't be called through a
+wrapper @command{configure} since it would be the same file on
+case-insensitive file systems. Likewise, if a @var{dir} contains
+@file{configure.in} but no @command{configure}, the Cygnus
+@command{configure} script found by @code{AC_CONFIG_AUX_DIR} is used.
+
+The subdirectory @command{configure} scripts are given the same command
+line options that were given to this @command{configure} script, with minor
+changes if needed, which include:
+
+@itemize @minus
+@item
+adjusting a relative name for the cache file;
+
+@item
+adjusting a relative name for the source directory;
+
+@item
+propagating the current value of @code{$prefix}, including if it was
+defaulted, and if the default values of the top level and of the subdirectory
+@file{configure} differ.
+@end itemize
+
+This macro also sets the output variable @code{subdirs} to the list of
+directories @samp{@var{dir} @dots{}}. Make rules can use
+this variable to determine which subdirectories to recurse into.
+
+This macro may be called multiple times.
+@end defmac
+
+@node Default Prefix
+@section Default Prefix
+@cindex Install prefix
+@cindex Prefix for install
+
+By default, @command{configure} sets the prefix for files it installs to
+@file{/usr/local}. The user of @command{configure} can select a different
+prefix using the @option{--prefix} and @option{--exec-prefix} options.
+There are two ways to change the default: when creating
+@command{configure}, and when running it.
+
+Some software packages might want to install in a directory other than
+@file{/usr/local} by default. To accomplish that, use the
+@code{AC_PREFIX_DEFAULT} macro.
+
+@defmac AC_PREFIX_DEFAULT (@var{prefix})
+@acindex{PREFIX_DEFAULT}
+Set the default installation prefix to @var{prefix} instead of
+@file{/usr/local}.
+@end defmac
+
+It may be convenient for users to have @command{configure} guess the
+installation prefix from the location of a related program that they
+have already installed. If you wish to do that, you can call
+@code{AC_PREFIX_PROGRAM}.
+
+@anchor{AC_PREFIX_PROGRAM}
+@defmac AC_PREFIX_PROGRAM (@var{program})
+@acindex{PREFIX_PROGRAM}
+If the user did not specify an installation prefix (using the
+@option{--prefix} option), guess a value for it by looking for
+@var{program} in @env{PATH}, the way the shell does. If @var{program}
+is found, set the prefix to the parent of the directory containing
+@var{program}, else default the prefix as described above
+(@file{/usr/local} or @code{AC_PREFIX_DEFAULT}). For example, if
+@var{program} is @code{gcc} and the @env{PATH} contains
+@file{/usr/local/gnu/bin/gcc}, set the prefix to @file{/usr/local/gnu}.
+@end defmac
+
+
+
+@c ======================================================== Existing tests
+
+@node Existing Tests
+@chapter Existing Tests
+
+These macros test for particular system features that packages might
+need or want to use. If you need to test for a kind of feature that
+none of these macros check for, you can probably do it by calling
+primitive test macros with appropriate arguments (@pxref{Writing
+Tests}).
+
+These tests print messages telling the user which feature they're
+checking for, and what they find. They cache their results for future
+@command{configure} runs (@pxref{Caching Results}).
+
+Some of these macros set output variables. @xref{Makefile
+Substitutions}, for how to get their values. The phrase ``define
+@var{name}'' is used below as a shorthand to mean ``define the C
+preprocessor symbol @var{name} to the value 1''. @xref{Defining
+Symbols}, for how to get those symbol definitions into your program.
+
+@menu
+* Common Behavior:: Macros' standard schemes
+* Alternative Programs:: Selecting between alternative programs
+* Files:: Checking for the existence of files
+* Libraries:: Library archives that might be missing
+* Library Functions:: C library functions that might be missing
+* Header Files:: Header files that might be missing
+* Declarations:: Declarations that may be missing
+* Structures:: Structures or members that might be missing
+* Types:: Types that might be missing
+* Compilers and Preprocessors:: Checking for compiling programs
+* System Services:: Operating system services
+* Posix Variants:: Special kludges for specific Posix variants
+* Erlang Libraries:: Checking for the existence of Erlang libraries
+@end menu
+
+@node Common Behavior
+@section Common Behavior
+@cindex Common autoconf behavior
+
+Much effort has been expended to make Autoconf easy to learn. The most
+obvious way to reach this goal is simply to enforce standard interfaces
+and behaviors, avoiding exceptions as much as possible. Because of
+history and inertia, unfortunately, there are still too many exceptions
+in Autoconf; nevertheless, this section describes some of the common
+rules.
+
+@menu
+* Standard Symbols:: Symbols defined by the macros
+* Default Includes:: Includes used by the generic macros
+@end menu
+
+@node Standard Symbols
+@subsection Standard Symbols
+@cindex Standard symbols
+
+All the generic macros that @code{AC_DEFINE} a symbol as a result of
+their test transform their @var{argument} values to a standard alphabet.
+First, @var{argument} is converted to upper case and any asterisks
+(@samp{*}) are each converted to @samp{P}. Any remaining characters
+that are not alphanumeric are converted to underscores.
+
+For instance,
+
+@example
+AC_CHECK_TYPES([struct $Expensive*])
+@end example
+
+@noindent
+defines the symbol @samp{HAVE_STRUCT__EXPENSIVEP} if the check
+succeeds.
+
+
+@node Default Includes
+@subsection Default Includes
+@cindex Default includes
+@cindex Includes, default
+
+Several tests depend upon a set of header files. Since these headers
+are not universally available, tests actually have to provide a set of
+protected includes, such as:
+
+@example
+@group
+#ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+@end group
+@end example
+
+@noindent
+Unless you know exactly what you are doing, you should avoid using
+unconditional includes, and check the existence of the headers you
+include beforehand (@pxref{Header Files}).
+
+Most generic macros use the following macro to provide the default set
+of includes:
+
+@defmac AC_INCLUDES_DEFAULT (@ovar{include-directives})
+@acindex{INCLUDES_DEFAULT}
+Expand to @var{include-directives} if defined, otherwise to:
+
+@example
+@group
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+@end group
+@end example
+
+If the default includes are used, then check for the presence of these
+headers and their compatibility, i.e., you don't need to run
+@code{AC_HEADER_STDC}, nor check for @file{stdlib.h} etc.
+
+These headers are checked for in the same order as they are included.
+For instance, on some systems @file{string.h} and @file{strings.h} both
+exist, but conflict. Then @code{HAVE_STRING_H} is defined, not
+@code{HAVE_STRINGS_H}.
+@end defmac
+
+@node Alternative Programs
+@section Alternative Programs
+@cindex Programs, checking
+
+These macros check for the presence or behavior of particular programs.
+They are used to choose between several alternative programs and to
+decide what to do once one has been chosen. If there is no macro
+specifically defined to check for a program you need, and you don't need
+to check for any special properties of it, then you can use one of the
+general program-check macros.
+
+@menu
+* Particular Programs:: Special handling to find certain programs
+* Generic Programs:: How to find other programs
+@end menu
+
+@node Particular Programs
+@subsection Particular Program Checks
+
+These macros check for particular programs---whether they exist, and
+in some cases whether they support certain features.
+
+@defmac AC_PROG_AWK
+@acindex{PROG_AWK}
+@ovindex AWK
+@caindex prog_AWK
+Check for @code{gawk}, @code{mawk}, @code{nawk}, and @code{awk}, in that
+order, and set output variable @code{AWK} to the first one that is found.
+It tries @code{gawk} first because that is reported to be the
+best implementation. The result can be overridden by setting the
+variable @code{AWK} or the cache variable @code{ac_cv_prog_AWK}.
+
+Using this macro is sufficient to avoid the pitfalls of traditional
+@command{awk} (@pxref{awk, , Limitations of Usual Tools}).
+@end defmac
+
+@defmac AC_PROG_GREP
+@acindex{PROG_GREP}
+@ovindex GREP
+@caindex prog_GREP
+Look for the best available @code{grep} or @code{ggrep} that accepts the
+longest input lines possible, and that supports multiple @option{-e} options.
+Set the output variable @code{GREP} to whatever is chosen.
+@xref{grep, , Limitations of Usual Tools}, for more information about
+portability problems with the @command{grep} command family. The result
+can be overridden by setting the @code{GREP} variable and is cached in the
+@code{ac_cv_path_GREP} variable.
+@end defmac
+
+@defmac AC_PROG_EGREP
+@acindex{PROG_EGREP}
+@ovindex EGREP
+@caindex prog_EGREP
+Check whether @code{$GREP -E} works, or else look for the best available
+@code{egrep} or @code{gegrep} that accepts the longest input lines possible.
+Set the output variable @code{EGREP} to whatever is chosen. The result
+can be overridden by setting the @code{EGREP} variable and is cached in the
+@code{ac_cv_path_EGREP} variable.
+@end defmac
+
+@defmac AC_PROG_FGREP
+@acindex{PROG_FGREP}
+@ovindex FGREP
+@caindex prog_FGREP
+Check whether @code{$GREP -F} works, or else look for the best available
+@code{fgrep} or @code{gfgrep} that accepts the longest input lines possible.
+Set the output variable @code{FGREP} to whatever is chosen. The result
+can be overridden by setting the @code{FGREP} variable and is cached in the
+@code{ac_cv_path_FGREP} variable.
+@end defmac
+
+@defmac AC_PROG_INSTALL
+@acindex{PROG_INSTALL}
+@ovindex INSTALL
+@ovindex INSTALL_PROGRAM
+@ovindex INSTALL_DATA
+@ovindex INSTALL_SCRIPT
+@caindex path_install
+Set output variable @code{INSTALL} to the name of a BSD-compatible
+@command{install} program, if one is found in the current @env{PATH}.
+Otherwise, set @code{INSTALL} to @samp{@var{dir}/install-sh -c},
+checking the directories specified to @code{AC_CONFIG_AUX_DIR} (or its
+default directories) to determine @var{dir} (@pxref{Output}). Also set
+the variables @code{INSTALL_PROGRAM} and @code{INSTALL_SCRIPT} to
+@samp{$@{INSTALL@}} and @code{INSTALL_DATA} to @samp{$@{INSTALL@} -m 644}.
+
+@samp{@@INSTALL@@} is special, as its value may vary for different
+configuration files.
+
+This macro screens out various instances of @command{install} known not to
+work. It prefers to find a C program rather than a shell script, for
+speed. Instead of @file{install-sh}, it can also use @file{install.sh},
+but that name is obsolete because some @command{make} programs have a rule
+that creates @file{install} from it if there is no makefile. Further, this
+macro requires @command{install} to be able to install multiple files into a
+target directory in a single invocation.
+
+Autoconf comes with a copy of @file{install-sh} that you can use. If
+you use @code{AC_PROG_INSTALL}, you must include either
+@file{install-sh} or @file{install.sh} in your distribution; otherwise
+@command{configure} produces an error message saying it can't find
+them---even if the system you're on has a good @command{install} program.
+This check is a safety measure to prevent you from accidentally leaving
+that file out, which would prevent your package from installing on
+systems that don't have a BSD-compatible @command{install} program.
+
+If you need to use your own installation program because it has features
+not found in standard @command{install} programs, there is no reason to use
+@code{AC_PROG_INSTALL}; just put the file name of your program into your
+@file{Makefile.in} files.
+
+The result of the test can be overridden by setting the variable
+@code{INSTALL} or the cache variable @code{ac_cv_path_install}.
+@end defmac
+
+@defmac AC_PROG_MKDIR_P
+@acindex{PROG_MKDIR_P}
+@ovindex MKDIR_P
+@caindex path_mkdir
+Set output variable @code{MKDIR_P} to a program that ensures that for
+each argument, a directory named by this argument exists, creating it
+and its parent directories if needed, and without race conditions when
+two instances of the program attempt to make the same directory at
+nearly the same time.
+
+This macro uses the @samp{mkdir -p} command if possible. Otherwise, it
+falls back on invoking @command{install-sh} with the @option{-d} option,
+so your package should
+contain @file{install-sh} as described under @code{AC_PROG_INSTALL}.
+An @file{install-sh} file that predates Autoconf 2.60 or Automake 1.10
+is vulnerable to race conditions, so if you want to support parallel
+installs from
+different packages into the same directory you need to make sure you
+have an up-to-date @file{install-sh}. In particular, be careful about
+using @samp{autoreconf -if} if your Automake predates Automake 1.10.
+
+This macro is related to the @code{AS_MKDIR_P} macro (@pxref{Programming
+in M4sh}), but it sets an output variable intended for use in other
+files, whereas @code{AS_MKDIR_P} is intended for use in scripts like
+@command{configure}. Also, @code{AS_MKDIR_P} does not accept options,
+but @code{MKDIR_P} supports the @option{-m} option, e.g., a makefile
+might invoke @code{$(MKDIR_P) -m 0 dir} to create an inaccessible
+directory, and conversely a makefile should use @code{$(MKDIR_P) --
+$(FOO)} if @var{FOO} might yield a value that begins with @samp{-}.
+Finally, @code{AS_MKDIR_P} does not check for race condition
+vulnerability, whereas @code{AC_PROG_MKDIR_P} does.
+
+@samp{@@MKDIR_P@@} is special, as its value may vary for different
+configuration files.
+
+The result of the test can be overridden by setting the variable
+@code{MKDIR_P} or the cache variable @code{ac_cv_path_mkdir}.
+@end defmac
+
+@anchor{AC_PROG_LEX}
+@defmac AC_PROG_LEX
+@acindex{PROG_LEX}
+@ovindex LEX
+@ovindex LEXLIB
+@cvindex YYTEXT_POINTER
+@ovindex LEX_OUTPUT_ROOT
+@caindex prog_LEX
+If @code{flex} is found, set output variable @code{LEX} to @samp{flex}
+and @code{LEXLIB} to @option{-lfl}, if that library is in a standard
+place. Otherwise set @code{LEX} to @samp{lex} and @code{LEXLIB} to
+@option{-ll}, if found. If neither variant is available, set @code{LEX}
+to @samp{:}; for packages that ship the generated @file{file.yy.c}
+alongside the source @file{file.l}, this default allows users without a
+lexer generator to still build the package even if the timestamp for
+@file{file.l} is inadvertently changed.
+
+Define @code{YYTEXT_POINTER} if @code{yytext} defaults to @samp{char *} instead
+of to @samp{char []}. Also set output variable @code{LEX_OUTPUT_ROOT} to
+the base of the file name that the lexer generates; usually
+@file{lex.yy}, but sometimes something else. These results vary
+according to whether @code{lex} or @code{flex} is being used.
+
+You are encouraged to use Flex in your sources, since it is both more
+pleasant to use than plain Lex and the C source it produces is portable.
+In order to ensure portability, however, you must either provide a
+function @code{yywrap} or, if you don't use it (e.g., your scanner has
+no @samp{#include}-like feature), simply include a @samp{%noyywrap}
+statement in the scanner's source. Once this done, the scanner is
+portable (unless @emph{you} felt free to use nonportable constructs) and
+does not depend on any library. In this case, and in this case only, it
+is suggested that you use this Autoconf snippet:
+
+@example
+AC_PROG_LEX
+if test "x$LEX" != xflex; then
+ LEX="$SHELL $missing_dir/missing flex"
+ AC_SUBST([LEX_OUTPUT_ROOT], [lex.yy])
+ AC_SUBST([LEXLIB], [''])
+fi
+@end example
+
+The shell script @command{missing} can be found in the Automake
+distribution.
+
+Remember that the user may have supplied an alternate location in
+@env{LEX}, so if Flex is required, it is better to check that the user
+provided something sufficient by parsing the output of @samp{$LEX
+--version} than by simply relying on @code{test "x$LEX" = xflex}.
+
+To ensure backward compatibility, Automake's @code{AM_PROG_LEX} invokes
+(indirectly) this macro twice, which causes an annoying but benign
+``@code{AC_PROG_LEX} invoked multiple times'' warning. Future versions
+of Automake will fix this issue; meanwhile, just ignore this message.
+
+As part of running the test, this macro may delete any file in the
+configuration directory named @file{lex.yy.c} or @file{lexyy.c}.
+
+The result of this test can be influenced by setting the variable
+@code{LEX} or the cache variable @code{ac_cv_prog_LEX}.
+@end defmac
+
+@anchor{AC_PROG_LN_S}
+@defmac AC_PROG_LN_S
+@acindex{PROG_LN_S}
+@ovindex LN_S
+If @samp{ln -s} works on the current file system (the operating system
+and file system support symbolic links), set the output variable
+@code{LN_S} to @samp{ln -s}; otherwise, if @samp{ln} works, set
+@code{LN_S} to @samp{ln}, and otherwise set it to @samp{cp -pR}.
+
+If you make a link in a directory other than the current directory, its
+meaning depends on whether @samp{ln} or @samp{ln -s} is used. To safely
+create links using @samp{$(LN_S)}, either find out which form is used
+and adjust the arguments, or always invoke @code{ln} in the directory
+where the link is to be created.
+
+In other words, it does not work to do:
+@example
+$(LN_S) foo /x/bar
+@end example
+
+Instead, do:
+
+@example
+(cd /x && $(LN_S) foo bar)
+@end example
+@end defmac
+
+@defmac AC_PROG_RANLIB
+@acindex{PROG_RANLIB}
+@ovindex RANLIB
+@c @caindex prog_RANLIB
+@c @caindex prog_ac_ct_RANLIB
+Set output variable @code{RANLIB} to @samp{ranlib} if @code{ranlib}
+is found, and otherwise to @samp{:} (do nothing).
+@end defmac
+
+@defmac AC_PROG_SED
+@acindex{PROG_SED}
+@ovindex SED
+@caindex path_SED
+Set output variable @code{SED} to a Sed implementation that conforms to
+Posix and does not have arbitrary length limits. Report an error if no
+acceptable Sed is found. @xref{sed, , Limitations of Usual Tools}, for more
+information about portability problems with Sed.
+
+The result of this test can be overridden by setting the @code{SED} variable
+and is cached in the @code{ac_cv_path_SED} variable.
+@end defmac
+
+@defmac AC_PROG_YACC
+@acindex{PROG_YACC}
+@evindex YACC
+@evindex YFLAGS
+@ovindex YACC
+@caindex prog_YACC
+If @code{bison} is found, set output variable @code{YACC} to @samp{bison
+-y}. Otherwise, if @code{byacc} is found, set @code{YACC} to
+@samp{byacc}. Otherwise set @code{YACC} to @samp{yacc}.
+The result of this test can be influenced by setting the variable
+@code{YACC} or the cache variable @code{ac_cv_prog_YACC}.
+@end defmac
+
+@node Generic Programs
+@subsection Generic Program and File Checks
+
+These macros are used to find programs not covered by the ``particular''
+test macros. If you need to check the behavior of a program as well as
+find out whether it is present, you have to write your own test for it
+(@pxref{Writing Tests}). By default, these macros use the environment
+variable @env{PATH}. If you need to check for a program that might not
+be in the user's @env{PATH}, you can pass a modified path to use
+instead, like this:
+
+@example
+AC_PATH_PROG([INETD], [inetd], [/usr/libexec/inetd],
+ [$PATH$PATH_SEPARATOR/usr/libexec$PATH_SEPARATOR]dnl
+[/usr/sbin$PATH_SEPARATOR/usr/etc$PATH_SEPARATOR/etc])
+@end example
+
+You are strongly encouraged to declare the @var{variable} passed to
+@code{AC_CHECK_PROG} etc.@: as precious. @xref{Setting Output Variables},
+@code{AC_ARG_VAR}, for more details.
+
+@anchor{AC_CHECK_PROG}
+@defmac AC_CHECK_PROG (@var{variable}, @var{prog-to-check-for}, @
+ @var{value-if-found}, @ovar{value-if-not-found}, @dvar{path, $PATH}, @
+ @ovar{reject})
+@acindex{CHECK_PROG}
+@caindex prog_@var{variable}
+Check whether program @var{prog-to-check-for} exists in @var{path}. If
+it is found, set @var{variable} to @var{value-if-found}, otherwise to
+@var{value-if-not-found}, if given. Always pass over @var{reject} (an
+absolute file name) even if it is the first found in the search path; in
+that case, set @var{variable} using the absolute file name of the
+@var{prog-to-check-for} found that is not @var{reject}. If
+@var{variable} was already set, do nothing. Calls @code{AC_SUBST} for
+@var{variable}. The result of this test can be overridden by setting the
+@var{variable} variable or the cache variable
+@code{ac_cv_prog_@var{variable}}.
+@end defmac
+
+@anchor{AC_CHECK_PROGS}
+@defmac AC_CHECK_PROGS (@var{variable}, @var{progs-to-check-for}, @
+ @ovar{value-if-not-found}, @dvar{path, $PATH})
+@acindex{CHECK_PROGS}
+@caindex prog_@var{variable}
+Check for each program in the blank-separated list
+@var{progs-to-check-for} existing in the @var{path}. If one is found, set
+@var{variable} to the name of that program. Otherwise, continue
+checking the next program in the list. If none of the programs in the
+list are found, set @var{variable} to @var{value-if-not-found}; if
+@var{value-if-not-found} is not specified, the value of @var{variable}
+is not changed. Calls @code{AC_SUBST} for @var{variable}. The result of
+this test can be overridden by setting the @var{variable} variable or the
+cache variable @code{ac_cv_prog_@var{variable}}.
+@end defmac
+
+@defmac AC_CHECK_TARGET_TOOL (@var{variable}, @var{prog-to-check-for}, @
+ @ovar{value-if-not-found}, @dvar{path, $PATH})
+@acindex{CHECK_TARGET_TOOL}
+Like @code{AC_CHECK_PROG}, but first looks for @var{prog-to-check-for}
+with a prefix of the target type as determined by
+@code{AC_CANONICAL_TARGET}, followed by a dash (@pxref{Canonicalizing}).
+If the tool cannot be found with a prefix, and if the build and target
+types are equal, then it is also searched for without a prefix.
+
+As noted in @ref{Specifying Target Triplets}, the
+target is rarely specified, because most of the time it is the same
+as the host: it is the type of system for which any compiler tool in
+the package produces code. What this macro looks for is,
+for example, @emph{a tool @r{(assembler, linker, etc.)}@: that the
+compiler driver @r{(@command{gcc} for the GNU C Compiler)}
+uses to produce objects, archives or executables}.
+@end defmac
+
+@defmac AC_CHECK_TOOL (@var{variable}, @var{prog-to-check-for}, @
+ @ovar{value-if-not-found}, @dvar{path, $PATH})
+@acindex{CHECK_TOOL}
+@c @caindex prog_@var{VARIABLE}
+@c @caindex prog_ac_ct_@var{VARIABLE}
+Like @code{AC_CHECK_PROG}, but first looks for @var{prog-to-check-for}
+with a prefix of the host type as specified by @option{--host}, followed by a
+dash. For example, if the user runs
+@samp{configure --build=x86_64-gnu --host=i386-gnu}, then this call:
+@example
+AC_CHECK_TOOL([RANLIB], [ranlib], [:])
+@end example
+@noindent
+sets @code{RANLIB} to @file{i386-gnu-ranlib} if that program exists in
+@var{path}, or otherwise to @samp{ranlib} if that program exists in
+@var{path}, or to @samp{:} if neither program exists.
+
+When cross-compiling, this macro will issue a warning if no program
+prefixed with the host type could be found.
+For more information, see @ref{Specifying Target Triplets}.
+@end defmac
+
+@defmac AC_CHECK_TARGET_TOOLS (@var{variable}, @var{progs-to-check-for}, @
+ @ovar{value-if-not-found}, @dvar{path, $PATH})
+@acindex{CHECK_TARGET_TOOLS}
+Like @code{AC_CHECK_TARGET_TOOL}, each of the tools in the list
+@var{progs-to-check-for} are checked with a prefix of the target type as
+determined by @code{AC_CANONICAL_TARGET}, followed by a dash
+(@pxref{Canonicalizing}). If none of the tools can be found with a
+prefix, and if the build and target types are equal, then the first one
+without a prefix is used. If a tool is found, set @var{variable} to
+the name of that program. If none of the tools in the list are found,
+set @var{variable} to @var{value-if-not-found}; if @var{value-if-not-found}
+is not specified, the value of @var{variable} is not changed. Calls
+@code{AC_SUBST} for @var{variable}.
+@end defmac
+
+@defmac AC_CHECK_TOOLS (@var{variable}, @var{progs-to-check-for}, @
+ @ovar{value-if-not-found}, @dvar{path, $PATH})
+@acindex{CHECK_TOOLS}
+Like @code{AC_CHECK_TOOL}, each of the tools in the list
+@var{progs-to-check-for} are checked with a prefix of the host type as
+determined by @code{AC_CANONICAL_HOST}, followed by a dash
+(@pxref{Canonicalizing}). If none of the tools can be found with a
+prefix, then the first one without a prefix is used. If a tool is found,
+set @var{variable} to the name of that program. If none of the tools in
+the list are found, set @var{variable} to @var{value-if-not-found}; if
+@var{value-if-not-found} is not specified, the value of @var{variable}
+is not changed. Calls @code{AC_SUBST} for @var{variable}.
+
+When cross-compiling, this macro will issue a warning if no program
+prefixed with the host type could be found.
+For more information, see @ref{Specifying Target Triplets}.
+@end defmac
+
+@anchor{AC_PATH_PROG}
+@defmac AC_PATH_PROG (@var{variable}, @var{prog-to-check-for}, @
+ @ovar{value-if-not-found}, @dvar{path, $PATH})
+@acindex{PATH_PROG}
+@caindex path_@var{variable}
+Like @code{AC_CHECK_PROG}, but set @var{variable} to the absolute
+name of @var{prog-to-check-for} if found. The result of this test
+can be overridden by setting the @var{variable} variable. A positive
+result of this test is cached in the @code{ac_cv_path_@var{variable}}
+variable.
+@end defmac
+
+@anchor{AC_PATH_PROGS}
+@defmac AC_PATH_PROGS (@var{variable}, @var{progs-to-check-for}, @
+ @ovar{value-if-not-found}, @dvar{path, $PATH})
+@acindex{PATH_PROGS}
+@caindex path_@var{variable}
+Like @code{AC_CHECK_PROGS}, but if any of @var{progs-to-check-for}
+are found, set @var{variable} to the absolute name of the program
+found. The result of this test can be overridden by setting the
+@var{variable} variable. A positive result of this test is cached in
+the @code{ac_cv_path_@var{variable}} variable.
+@end defmac
+
+@defmac AC_PATH_PROGS_FEATURE_CHECK (@var{variable}, @
+ @var{progs-to-check-for}, @var{feature-test}, @
+ @ovar{action-if-not-found}, @dvar{path, $PATH})
+@acindex{PATH_PROGS_FEATURE_CHECK}
+@caindex path_@var{variable}
+@vrindex ac_path_@var{variable}
+@vrindex ac_path_@var{variable}_found
+This macro was introduced in Autoconf 2.62. If @var{variable} is not
+empty, then set the cache variable @code{ac_cv_path_@var{variable}} to
+its value. Otherwise, check for each program in the blank-separated
+list @var{progs-to-check-for} existing in @var{path}. For each program
+found, execute @var{feature-test} with @code{ac_path_@var{variable}}
+set to the absolute name of the candidate program. If no invocation of
+@var{feature-test} sets the shell variable
+@code{ac_cv_path_@var{variable}}, then @var{action-if-not-found} is
+executed. @var{feature-test} will be run even when
+@code{ac_cv_path_@var{variable}} is set, to provide the ability to
+choose a better candidate found later in @var{path}; to accept the
+current setting and bypass all further checks, @var{feature-test} can
+execute @code{ac_path_@var{variable}_found=:}.
+
+Note that this macro has some subtle differences from
+@code{AC_CHECK_PROGS}. It is designed to be run inside
+@code{AC_CACHE_VAL}, therefore, it should have no side effects. In
+particular, @var{variable} is not set to the final value of
+@code{ac_cv_path_@var{variable}}, nor is @code{AC_SUBST} automatically
+run. Also, on failure, any action can be performed, whereas
+@code{AC_CHECK_PROGS} only performs
+@code{@var{variable}=@var{value-if-not-found}}.
+
+Here is an example, similar to what Autoconf uses in its own configure
+script. It will search for an implementation of @command{m4} that
+supports the @code{indir} builtin, even if it goes by the name
+@command{gm4} or is not the first implementation on @env{PATH}.
+
+@example
+AC_CACHE_CHECK([for m4 that supports indir], [ac_cv_path_M4],
+ [AC_PATH_PROGS_FEATURE_CHECK([M4], [m4 gm4],
+ [[m4out=`echo 'changequote([,])indir([divnum])' | $ac_path_M4`
+ test "x$m4out" = x0 \
+ && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:]],
+ [AC_MSG_ERROR([could not find m4 that supports indir])])])
+AC_SUBST([M4], [$ac_cv_path_M4])
+@end example
+@end defmac
+
+@defmac AC_PATH_TARGET_TOOL (@var{variable}, @var{prog-to-check-for}, @
+ @ovar{value-if-not-found}, @dvar{path, $PATH})
+@acindex{PATH_TARGET_TOOL}
+Like @code{AC_CHECK_TARGET_TOOL}, but set @var{variable} to the absolute
+name of the program if it is found.
+@end defmac
+
+@defmac AC_PATH_TOOL (@var{variable}, @var{prog-to-check-for}, @
+ @ovar{value-if-not-found}, @dvar{path, $PATH})
+@acindex{PATH_TOOL}
+Like @code{AC_CHECK_TOOL}, but set @var{variable} to the absolute
+name of the program if it is found.
+
+When cross-compiling, this macro will issue a warning if no program
+prefixed with the host type could be found.
+For more information, see @ref{Specifying Target Triplets}.
+@end defmac
+
+
+@node Files
+@section Files
+@cindex File, checking
+
+You might also need to check for the existence of files. Before using
+these macros, ask yourself whether a runtime test might not be a better
+solution. Be aware that, like most Autoconf macros, they test a feature
+of the host machine, and therefore, they die when cross-compiling.
+
+@defmac AC_CHECK_FILE (@var{file}, @ovar{action-if-found}, @
+ @ovar{action-if-not-found})
+@acindex{CHECK_FILE}
+@caindex file_@var{file}
+Check whether file @var{file} exists on the native system. If it is
+found, execute @var{action-if-found}, otherwise do
+@var{action-if-not-found}, if given. The result of this test is cached
+in the @code{ac_cv_file_@var{file}} variable, with characters not
+suitable for a variable name mapped to underscores.
+@end defmac
+
+@defmac AC_CHECK_FILES (@var{files}, @ovar{action-if-found}, @
+ @ovar{action-if-not-found})
+@acindex{CHECK_FILES}
+@caindex file_@var{file}
+Executes @code{AC_CHECK_FILE} once for each file listed in @var{files}.
+Additionally, defines @samp{HAVE_@var{file}} (@pxref{Standard Symbols})
+for each file found. The results of each test are cached in the
+@code{ac_cv_file_@var{file}} variable, with characters not suitable for
+a variable name mapped to underscores.
+@end defmac
+
+
+@node Libraries
+@section Library Files
+@cindex Library, checking
+
+The following macros check for the presence of certain C, C++, Fortran,
+or Go library archive files.
+
+@anchor{AC_CHECK_LIB}
+@defmac AC_CHECK_LIB (@var{library}, @var{function}, @
+ @ovar{action-if-found}, @ovar{action-if-not-found}, @ovar{other-libraries})
+@acindex{CHECK_LIB}
+@caindex lib_@var{library}_@var{function}
+Test whether the library @var{library} is available by trying to link
+a test program that calls function @var{function} with the library.
+@var{function} should be a function provided by the library.
+Use the base
+name of the library; e.g., to check for @option{-lmp}, use @samp{mp} as
+the @var{library} argument.
+
+@var{action-if-found} is a list of shell commands to run if the link
+with the library succeeds; @var{action-if-not-found} is a list of shell
+commands to run if the link fails. If @var{action-if-found} is not
+specified, the default action prepends @option{-l@var{library}} to
+@code{LIBS} and defines @samp{HAVE_LIB@var{library}} (in all
+capitals). This macro is intended to support building @code{LIBS} in
+a right-to-left (least-dependent to most-dependent) fashion such that
+library dependencies are satisfied as a natural side effect of
+consecutive tests. Linkers are sensitive to library ordering
+so the order in which @code{LIBS} is generated is important to reliable
+detection of libraries.
+
+If linking with @var{library} results in unresolved symbols that would
+be resolved by linking with additional libraries, give those libraries
+as the @var{other-libraries} argument, separated by spaces:
+e.g., @option{-lXt -lX11}. Otherwise, this macro may fail to detect
+that @var{library} is present, because linking the test program can
+fail with unresolved symbols. The @var{other-libraries} argument
+should be limited to cases where it is desirable to test for one library
+in the presence of another that is not already in @code{LIBS}.
+
+@code{AC_CHECK_LIB} requires some care in usage, and should be avoided
+in some common cases. Many standard functions like @code{gethostbyname}
+appear in the standard C library on some hosts, and in special libraries
+like @code{nsl} on other hosts. On some hosts the special libraries
+contain variant implementations that you may not want to use. These
+days it is normally better to use @code{AC_SEARCH_LIBS([gethostbyname],
+[nsl])} instead of @code{AC_CHECK_LIB([nsl], [gethostbyname])}.
+
+The result of this test is cached in the
+@code{ac_cv_lib_@var{library}_@var{function}} variable.
+@end defmac
+
+@anchor{AC_SEARCH_LIBS}
+@defmac AC_SEARCH_LIBS (@var{function}, @var{search-libs}, @
+ @ovar{action-if-found}, @ovar{action-if-not-found}, @ovar{other-libraries})
+@acindex{SEARCH_LIBS}
+@caindex search_@var{function}
+Search for a library defining @var{function} if it's not already
+available. This equates to calling
+@samp{AC_LINK_IFELSE([AC_LANG_CALL([], [@var{function}])])} first with
+no libraries, then for each library listed in @var{search-libs}.
+
+Prepend @option{-l@var{library}} to @code{LIBS} for the first library found
+to contain @var{function}, and run @var{action-if-found}. If the
+function is not found, run @var{action-if-not-found}.
+
+If linking with @var{library} results in unresolved symbols that would
+be resolved by linking with additional libraries, give those libraries
+as the @var{other-libraries} argument, separated by spaces:
+e.g., @option{-lXt -lX11}. Otherwise, this macro fails to detect
+that @var{function} is present, because linking the test program
+always fails with unresolved symbols.
+
+The result of this test is cached in the
+@code{ac_cv_search_@var{function}} variable as @samp{none required} if
+@var{function} is already available, as @samp{no} if no library
+containing @var{function} was found, otherwise as the
+@option{-l@var{library}} option that needs to be prepended to @code{LIBS}.
+@end defmac
+
+
+
+@node Library Functions
+@section Library Functions
+
+The following macros check for particular C library functions.
+If there is no macro specifically defined to check for a function you need,
+and you don't need to check for any special properties of
+it, then you can use one of the general function-check macros.
+
+@menu
+* Function Portability:: Pitfalls with usual functions
+* Particular Functions:: Special handling to find certain functions
+* Generic Functions:: How to find other functions
+@end menu
+
+@node Function Portability
+@subsection Portability of C Functions
+@cindex Portability of C functions
+@cindex C function portability
+
+Most usual functions can either be missing, or be buggy, or be limited
+on some architectures. This section tries to make an inventory of these
+portability issues. By definition, this list always requires
+additions. A much more complete list is maintained by the Gnulib
+project (@pxref{Gnulib}), covering @ref{Function Substitutes, ,
+Current Posix Functions, gnulib, GNU gnulib}, @ref{Legacy Function
+Substitutes, , Legacy Functions, gnulib, GNU gnulib}, and @ref{Glibc
+Function Substitutes, , Glibc Functions, gnulib, GNU gnulib}. Please
+help us keep the gnulib list as complete as possible.
+
+@table @asis
+@item @code{exit}
+@c @fuindex exit
+@prindex @code{exit}
+On ancient hosts, @code{exit} returned @code{int}.
+This is because @code{exit} predates @code{void}, and there was a long
+tradition of it returning @code{int}.
+
+On current hosts, the problem more likely is that @code{exit} is not
+declared, due to C++ problems of some sort or another. For this reason
+we suggest that test programs not invoke @code{exit}, but return from
+@code{main} instead.
+
+@item @code{free}
+@c @fuindex free
+@prindex @code{free}
+The C standard says a call @code{free (NULL)} does nothing, but
+some old systems don't support this (e.g., NextStep).
+
+@item @code{isinf}
+@itemx @code{isnan}
+@c @fuindex isinf
+@c @fuindex isnan
+@prindex @code{isinf}
+@prindex @code{isnan}
+The C99 standard says that @code{isinf} and @code{isnan} are
+macros. On some systems just macros are available
+(e.g., HP-UX and Solaris 10), on
+some systems both macros and functions (e.g., glibc 2.3.2), and on some
+systems only functions (e.g., IRIX 6 and Solaris 9). In some cases
+these functions are declared in nonstandard headers like
+@code{<sunmath.h>} and defined in non-default libraries like
+@option{-lm} or @option{-lsunmath}.
+
+The C99 @code{isinf} and @code{isnan} macros work correctly with
+@code{long double} arguments, but pre-C99 systems that use functions
+typically assume @code{double} arguments. On such a system,
+@code{isinf} incorrectly returns true for a finite @code{long double}
+argument that is outside the range of @code{double}.
+
+The best workaround for these issues is to use gnulib modules
+@code{isinf} and @code{isnan} (@pxref{Gnulib}). But a lighter weight
+solution involves code like the following.
+
+@smallexample
+#include <math.h>
+
+#ifndef isnan
+# define isnan(x) \
+ (sizeof (x) == sizeof (long double) ? isnan_ld (x) \
+ : sizeof (x) == sizeof (double) ? isnan_d (x) \
+ : isnan_f (x))
+static inline int isnan_f (float x) @{ return x != x; @}
+static inline int isnan_d (double x) @{ return x != x; @}
+static inline int isnan_ld (long double x) @{ return x != x; @}
+#endif
+
+#ifndef isinf
+# define isinf(x) \
+ (sizeof (x) == sizeof (long double) ? isinf_ld (x) \
+ : sizeof (x) == sizeof (double) ? isinf_d (x) \
+ : isinf_f (x))
+static inline int isinf_f (float x)
+@{ return !isnan (x) && isnan (x - x); @}
+static inline int isinf_d (double x)
+@{ return !isnan (x) && isnan (x - x); @}
+static inline int isinf_ld (long double x)
+@{ return !isnan (x) && isnan (x - x); @}
+#endif
+@end smallexample
+
+Use @code{AC_C_INLINE} (@pxref{C Compiler}) so that this code works on
+compilers that lack the @code{inline} keyword. Some optimizing
+compilers mishandle these definitions, but systems with that bug
+typically have many other floating point corner-case compliance problems
+anyway, so it's probably not worth worrying about.
+
+@item @code{malloc}
+@c @fuindex malloc
+@prindex @code{malloc}
+The C standard says a call @code{malloc (0)} is implementation
+dependent. It can return either @code{NULL} or a new non-null pointer.
+The latter is more common (e.g., the GNU C Library) but is by
+no means universal. @code{AC_FUNC_MALLOC}
+can be used to insist on non-@code{NULL} (@pxref{Particular Functions}).
+
+@item @code{putenv}
+@c @fuindex putenv
+@prindex @code{putenv}
+Posix prefers @code{setenv} to @code{putenv}; among other things,
+@code{putenv} is not required of all Posix implementations, but
+@code{setenv} is.
+
+Posix specifies that @code{putenv} puts the given string directly in
+@code{environ}, but some systems make a copy of it instead (e.g.,
+glibc 2.0, or BSD). And when a copy is made, @code{unsetenv} might
+not free it, causing a memory leak (e.g., FreeBSD 4).
+
+On some systems @code{putenv ("FOO")} removes @samp{FOO} from the
+environment, but this is not standard usage and it dumps core
+on some systems (e.g., AIX).
+
+On MinGW, a call @code{putenv ("FOO=")} removes @samp{FOO} from the
+environment, rather than inserting it with an empty value.
+
+@item @code{realloc}
+@c @fuindex realloc
+@prindex @code{realloc}
+The C standard says a call @code{realloc (NULL, size)} is equivalent
+to @code{malloc (size)}, but some old systems don't support this (e.g.,
+NextStep).
+
+@item @code{signal} handler
+@c @fuindex signal
+@prindex @code{signal}
+@prindex @code{sigaction}
+Normally @code{signal} takes a handler function with a return type of
+@code{void}, but some old systems required @code{int} instead. Any
+actual @code{int} value returned is not used; this is only a
+difference in the function prototype demanded.
+
+All systems we know of in current use return @code{void}. The
+@code{int} was to support K&R C, where of course @code{void} is not
+available. The obsolete macro @code{AC_TYPE_SIGNAL}
+(@pxref{AC_TYPE_SIGNAL}) can be used to establish the correct type in
+all cases.
+
+In most cases, it is more robust to use @code{sigaction} when it is
+available, rather than @code{signal}.
+
+@item @code{snprintf}
+@c @fuindex snprintf
+@prindex @code{snprintf}
+@c @fuindex vsnprintf
+@prindex @code{vsnprintf}
+The C99 standard says that if the output array isn't big enough
+and if no other errors occur, @code{snprintf} and @code{vsnprintf}
+truncate the output and return the number of bytes that ought to have
+been produced. Some older systems return the truncated length (e.g.,
+GNU C Library 2.0.x or IRIX 6.5), some a negative value
+(e.g., earlier GNU C Library versions), and some the buffer
+length without truncation (e.g., 32-bit Solaris 7). Also, some buggy
+older systems ignore the length and overrun the buffer (e.g., 64-bit
+Solaris 7).
+
+@item @code{sprintf}
+@c @fuindex sprintf
+@prindex @code{sprintf}
+@c @fuindex vsprintf
+@prindex @code{vsprintf}
+The C standard says @code{sprintf} and @code{vsprintf} return the
+number of bytes written. On some ancient systems (SunOS 4 for
+instance) they return the buffer pointer instead, but these no
+longer need to be worried about.
+
+@item @code{sscanf}
+@c @fuindex sscanf
+@prindex @code{sscanf}
+On various old systems, e.g., HP-UX 9, @code{sscanf} requires
+that its
+input string be writable (though it doesn't actually change it). This
+can be a problem when using @command{gcc} since it normally puts
+constant strings in read-only memory (@pxref{Incompatibilities,
+Incompatibilities of GCC, , gcc, Using and
+Porting the GNU Compiler Collection}). Apparently in some cases even
+having format strings read-only can be a problem.
+
+@item @code{strerror_r}
+@c @fuindex strerror_r
+@prindex @code{strerror_r}
+Posix specifies that @code{strerror_r} returns an @code{int}, but many
+systems (e.g., GNU C Library version 2.2.4) provide a
+different version returning a @code{char *}. @code{AC_FUNC_STRERROR_R}
+can detect which is in use (@pxref{Particular Functions}).
+
+@item @code{strnlen}
+@c @fuindex strnlen
+@prindex @code{strnlen}
+AIX 4.3 provides a broken version which produces the
+following results:
+
+@example
+strnlen ("foobar", 0) = 0
+strnlen ("foobar", 1) = 3
+strnlen ("foobar", 2) = 2
+strnlen ("foobar", 3) = 1
+strnlen ("foobar", 4) = 0
+strnlen ("foobar", 5) = 6
+strnlen ("foobar", 6) = 6
+strnlen ("foobar", 7) = 6
+strnlen ("foobar", 8) = 6
+strnlen ("foobar", 9) = 6
+@end example
+
+@item @code{sysconf}
+@c @fuindex sysconf
+@prindex @code{sysconf}
+@code{_SC_PAGESIZE} is standard, but some older systems (e.g., HP-UX
+9) have @code{_SC_PAGE_SIZE} instead. This can be tested with
+@code{#ifdef}.
+
+@item @code{unlink}
+@c @fuindex unlink
+@prindex @code{unlink}
+The Posix spec says that @code{unlink} causes the given file to be
+removed only after there are no more open file handles for it. Some
+non-Posix hosts have trouble with this requirement, though,
+and some DOS variants even corrupt the file system.
+
+@item @code{unsetenv}
+@c @fuindex unsetenv
+@prindex @code{unsetenv}
+On MinGW, @code{unsetenv} is not available, but a variable @samp{FOO}
+can be removed with a call @code{putenv ("FOO=")}, as described under
+@code{putenv} above.
+
+@item @code{va_copy}
+@c @fuindex va_copy
+@prindex @code{va_copy}
+The C99 standard provides @code{va_copy} for copying
+@code{va_list} variables. It may be available in older environments
+too, though possibly as @code{__va_copy} (e.g., @command{gcc} in strict
+pre-C99 mode). These can be tested with @code{#ifdef}. A fallback to
+@code{memcpy (&dst, &src, sizeof (va_list))} gives maximum
+portability.
+
+@item @code{va_list}
+@c @fuindex va_list
+@prindex @code{va_list}
+@code{va_list} is not necessarily just a pointer. It can be a
+@code{struct} (e.g., @command{gcc} on Alpha), which means @code{NULL} is
+not portable. Or it can be an array (e.g., @command{gcc} in some
+PowerPC configurations), which means as a function parameter it can be
+effectively call-by-reference and library routines might modify the
+value back in the caller (e.g., @code{vsnprintf} in the GNU C Library
+2.1).
+
+@item Signed @code{>>}
+Normally the C @code{>>} right shift of a signed type replicates the
+high bit, giving a so-called ``arithmetic'' shift. But care should be
+taken since Standard C doesn't require that behavior. On those
+few processors without a native arithmetic shift (for instance Cray
+vector systems) zero bits may be shifted in, the same as a shift of an
+unsigned type.
+
+@item Integer @code{/}
+C divides signed integers by truncating their quotient toward zero,
+yielding the same result as Fortran. However, before C99 the standard
+allowed C implementations to take the floor or ceiling of the quotient
+in some cases. Hardly any implementations took advantage of this
+freedom, though, and it's probably not worth worrying about this issue
+nowadays.
+@end table
+
+
+@node Particular Functions
+@subsection Particular Function Checks
+@cindex Function, checking
+
+These macros check for particular C functions---whether they exist, and
+in some cases how they respond when given certain arguments.
+
+@anchor{AC_FUNC_ALLOCA}
+@defmac AC_FUNC_ALLOCA
+@acindex{FUNC_ALLOCA}
+@cvindex C_ALLOCA
+@cvindex HAVE_ALLOCA_H
+@ovindex ALLOCA
+@c @fuindex alloca
+@prindex @code{alloca}
+@hdrindex{alloca.h}
+@c @caindex working_alloca_h
+Check how to get @code{alloca}. Tries to get a builtin version by
+checking for @file{alloca.h} or the predefined C preprocessor macros
+@code{__GNUC__} and @code{_AIX}. If this macro finds @file{alloca.h},
+it defines @code{HAVE_ALLOCA_H}.
+
+If those attempts fail, it looks for the function in the standard C
+library. If any of those methods succeed, it defines
+@code{HAVE_ALLOCA}. Otherwise, it sets the output variable
+@code{ALLOCA} to @samp{$@{LIBOBJDIR@}alloca.o} and defines
+@code{C_ALLOCA} (so programs can periodically call @samp{alloca (0)} to
+garbage collect). This variable is separate from @code{LIBOBJS} so
+multiple programs can share the value of @code{ALLOCA} without needing
+to create an actual library, in case only some of them use the code in
+@code{LIBOBJS}. The @samp{$@{LIBOBJDIR@}} prefix serves the same
+purpose as in @code{LIBOBJS} (@pxref{AC_LIBOBJ vs LIBOBJS}).
+
+This macro does not try to get @code{alloca} from the System V R3
+@file{libPW} or the System V R4 @file{libucb} because those libraries
+contain some incompatible functions that cause trouble. Some versions
+do not even contain @code{alloca} or contain a buggy version. If you
+still want to use their @code{alloca}, use @code{ar} to extract
+@file{alloca.o} from them instead of compiling @file{alloca.c}.
+
+Source files that use @code{alloca} should start with a piece of code
+like the following, to declare it properly.
+
+@example
+@group
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#elif !defined alloca
+# ifdef __GNUC__
+# define alloca __builtin_alloca
+# elif defined _AIX
+# define alloca __alloca
+# elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# elif !defined HAVE_ALLOCA
+# ifdef __cplusplus
+extern "C"
+# endif
+void *alloca (size_t);
+# endif
+#endif
+@end group
+@end example
+@end defmac
+
+@defmac AC_FUNC_CHOWN
+@acindex{FUNC_CHOWN}
+@cvindex HAVE_CHOWN
+@c @fuindex chown
+@prindex @code{chown}
+@caindex func_chown_works
+If the @code{chown} function is available and works (in particular, it
+should accept @option{-1} for @code{uid} and @code{gid}), define
+@code{HAVE_CHOWN}. The result of this macro is cached in the
+@code{ac_cv_func_chown_works} variable.
+@end defmac
+
+@anchor{AC_FUNC_CLOSEDIR_VOID}
+@defmac AC_FUNC_CLOSEDIR_VOID
+@acindex{FUNC_CLOSEDIR_VOID}
+@cvindex CLOSEDIR_VOID
+@c @fuindex closedir
+@prindex @code{closedir}
+@caindex func_closedir_void
+If the @code{closedir} function does not return a meaningful value,
+define @code{CLOSEDIR_VOID}. Otherwise, callers ought to check its
+return value for an error indicator.
+
+Currently this test is implemented by running a test program. When
+cross compiling the pessimistic assumption that @code{closedir} does not
+return a meaningful value is made.
+
+The result of this macro is cached in the @code{ac_cv_func_closedir_void}
+variable.
+
+This macro is obsolescent, as @code{closedir} returns a meaningful value
+on current systems. New programs need not use this macro.
+@end defmac
+
+@defmac AC_FUNC_ERROR_AT_LINE
+@acindex{FUNC_ERROR_AT_LINE}
+@c @fuindex error_at_line
+@prindex @code{error_at_line}
+@caindex lib_error_at_line
+If the @code{error_at_line} function is not found, require an
+@code{AC_LIBOBJ} replacement of @samp{error}.
+
+The result of this macro is cached in the @code{ac_cv_lib_error_at_line}
+variable.
+
+The @code{AC_FUNC_ERROR_AT_LINE} macro is obsolescent. New programs
+should use Gnulib's @code{error} module. @xref{Gnulib}.
+@end defmac
+
+@defmac AC_FUNC_FNMATCH
+@acindex{FUNC_FNMATCH}
+@c @fuindex fnmatch
+@prindex @code{fnmatch}
+@caindex func_fnmatch_works
+If the @code{fnmatch} function conforms to Posix, define
+@code{HAVE_FNMATCH}. Detect common implementation bugs, for example,
+the bugs in Solaris 2.4.
+
+Unlike the other specific
+@code{AC_FUNC} macros, @code{AC_FUNC_FNMATCH} does not replace a
+broken/missing @code{fnmatch}. This is for historical reasons.
+See @code{AC_REPLACE_FNMATCH} below.
+
+The result of this macro is cached in the @code{ac_cv_func_fnmatch_works}
+variable.
+
+This macro is obsolescent. New programs should use Gnulib's
+@code{fnmatch-posix} module. @xref{Gnulib}.
+@end defmac
+
+@defmac AC_FUNC_FNMATCH_GNU
+@acindex{FUNC_FNMATCH_GNU}
+@c @fuindex fnmatch
+@prindex @code{fnmatch}
+@caindex func_fnmatch_gnu
+Behave like @code{AC_REPLACE_FNMATCH} (@emph{replace}) but also test
+whether @code{fnmatch} supports GNU extensions. Detect common
+implementation bugs, for example, the bugs in the GNU C
+Library 2.1.
+
+The result of this macro is cached in the @code{ac_cv_func_fnmatch_gnu}
+variable.
+
+This macro is obsolescent. New programs should use Gnulib's
+@code{fnmatch-gnu} module. @xref{Gnulib}.
+@end defmac
+
+@anchor{AC_FUNC_FORK}
+@defmac AC_FUNC_FORK
+@acindex{FUNC_FORK}
+@cvindex HAVE_VFORK_H
+@cvindex HAVE_WORKING_FORK
+@cvindex HAVE_WORKING_VFORK
+@cvindex vfork
+@c @fuindex fork
+@prindex @code{fork}
+@c @fuindex vfork
+@prindex @code{vfork}
+@hdrindex{vfork.h}
+@c @caindex func_fork
+@c @caindex func_fork_works
+This macro checks for the @code{fork} and @code{vfork} functions. If a
+working @code{fork} is found, define @code{HAVE_WORKING_FORK}. This macro
+checks whether @code{fork} is just a stub by trying to run it.
+
+If @file{vfork.h} is found, define @code{HAVE_VFORK_H}. If a working
+@code{vfork} is found, define @code{HAVE_WORKING_VFORK}. Otherwise,
+define @code{vfork} to be @code{fork} for backward compatibility with
+previous versions of @command{autoconf}. This macro checks for several known
+errors in implementations of @code{vfork} and considers the system to not
+have a working @code{vfork} if it detects any of them. It is not considered
+to be an implementation error if a child's invocation of @code{signal}
+modifies the parent's signal handler, since child processes rarely change
+their signal handlers.
+
+Since this macro defines @code{vfork} only for backward compatibility with
+previous versions of @command{autoconf} you're encouraged to define it
+yourself in new code:
+@example
+@group
+#ifndef HAVE_WORKING_VFORK
+# define vfork fork
+#endif
+@end group
+@end example
+
+The results of this macro are cached in the @code{ac_cv_func_fork_works}
+and @code{ac_cv_func_vfork_works} variables. In order to override the
+test, you also need to set the @code{ac_cv_func_fork} and
+@code{ac_cv_func_vfork} variables.
+@end defmac
+
+@defmac AC_FUNC_FSEEKO
+@acindex{FUNC_FSEEKO}
+@cvindex _LARGEFILE_SOURCE
+@cvindex HAVE_FSEEKO
+@c @fuindex fseeko
+@prindex @code{fseeko}
+@c @fuindex ftello
+@prindex @code{ftello}
+@c @caindex sys_largefile_source
+If the @code{fseeko} function is available, define @code{HAVE_FSEEKO}.
+Define @code{_LARGEFILE_SOURCE} if necessary to make the prototype
+visible on some systems (e.g., glibc 2.2). Otherwise linkage problems
+may occur when compiling with @code{AC_SYS_LARGEFILE} on
+largefile-sensitive systems where @code{off_t} does not default to a
+64bit entity. All systems with @code{fseeko} also supply @code{ftello}.
+@end defmac
+
+@defmac AC_FUNC_GETGROUPS
+@acindex{FUNC_GETGROUPS}
+@cvindex HAVE_GETGROUPS
+@ovindex GETGROUPS_LIBS
+@c @fuindex getgroups
+@prindex @code{getgroups}
+@caindex func_getgroups_works
+If the @code{getgroups} function is available and works (unlike on
+Ultrix 4.3, where @samp{getgroups (0, 0)} always fails), define
+@code{HAVE_GETGROUPS}. Set @code{GETGROUPS_LIBS} to any libraries
+needed to get that function. This macro runs @code{AC_TYPE_GETGROUPS}.
+@end defmac
+
+@anchor{AC_FUNC_GETLOADAVG}
+@defmac AC_FUNC_GETLOADAVG
+@acindex{FUNC_GETLOADAVG}
+@cvindex SVR4
+@cvindex DGUX
+@cvindex UMAX
+@cvindex UMAX4_3
+@cvindex HAVE_NLIST_H
+@cvindex NLIST_NAME_UNION
+@cvindex GETLOADAVG_PRIVILEGED
+@cvindex NEED_SETGID
+@cvindex C_GETLOADAVG
+@ovindex LIBOBJS
+@ovindex NEED_SETGID
+@ovindex KMEM_GROUP
+@ovindex GETLOADAVG_LIBS
+@c @fuindex getloadavg
+@prindex @code{getloadavg}
+Check how to get the system load averages. To perform its tests
+properly, this macro needs the file @file{getloadavg.c}; therefore, be
+sure to set the @code{AC_LIBOBJ} replacement directory properly (see
+@ref{Generic Functions}, @code{AC_CONFIG_LIBOBJ_DIR}).
+
+If the system has the @code{getloadavg} function, define
+@code{HAVE_GETLOADAVG}, and set @code{GETLOADAVG_LIBS} to any libraries
+necessary to get that function. Also add @code{GETLOADAVG_LIBS} to
+@code{LIBS}. Otherwise, require an @code{AC_LIBOBJ} replacement for
+@samp{getloadavg} with source code in @file{@var{dir}/getloadavg.c}, and
+possibly define several other C preprocessor macros and output
+variables:
+
+@enumerate
+@item
+Define @code{C_GETLOADAVG}.
+
+@item
+Define @code{SVR4}, @code{DGUX}, @code{UMAX}, or @code{UMAX4_3} if on
+those systems.
+
+@item
+@hdrindex{nlist.h}
+If @file{nlist.h} is found, define @code{HAVE_NLIST_H}.
+
+@item
+If @samp{struct nlist} has an @samp{n_un.n_name} member, define
+@code{HAVE_STRUCT_NLIST_N_UN_N_NAME}. The obsolete symbol
+@code{NLIST_NAME_UNION} is still defined, but do not depend upon it.
+
+@item
+Programs may need to be installed set-group-ID (or set-user-ID) for
+@code{getloadavg} to work. In this case, define
+@code{GETLOADAVG_PRIVILEGED}, set the output variable @code{NEED_SETGID}
+to @samp{true} (and otherwise to @samp{false}), and set
+@code{KMEM_GROUP} to the name of the group that should own the installed
+program.
+@end enumerate
+
+The @code{AC_FUNC_GETLOADAVG} macro is obsolescent. New programs should
+use Gnulib's @code{getloadavg} module. @xref{Gnulib}.
+@end defmac
+
+@anchor{AC_FUNC_GETMNTENT}
+@defmac AC_FUNC_GETMNTENT
+@acindex{FUNC_GETMNTENT}
+@cvindex HAVE_GETMNTENT
+@c @fuindex getmntent
+@prindex @code{getmntent}
+@caindex search_getmntent
+Check for @code{getmntent} in the standard C library, and then in the
+@file{sun}, @file{seq}, and @file{gen} libraries, for UNICOS,
+IRIX 4, PTX, and UnixWare, respectively. Then, if
+@code{getmntent} is available, define @code{HAVE_GETMNTENT} and set
+@code{ac_cv_func_getmntent} to @code{yes}. Otherwise set
+@code{ac_cv_func_getmntent} to @code{no}.
+
+The result of this macro can be overridden by setting the cache variable
+@code{ac_cv_search_getmntent}.
+@end defmac
+
+@defmac AC_FUNC_GETPGRP
+@acindex{FUNC_GETPGRP}
+@cvindex GETPGRP_VOID
+@c @fuindex getpgid
+@c @fuindex getpgrp
+@prindex @code{getpgid}
+@prindex @code{getpgrp}
+@caindex func_getpgrp_void
+Define @code{GETPGRP_VOID} if it is an error to pass 0 to
+@code{getpgrp}; this is the Posix behavior. On older BSD
+systems, you must pass 0 to @code{getpgrp}, as it takes an argument and
+behaves like Posix's @code{getpgid}.
+
+@example
+#ifdef GETPGRP_VOID
+ pid = getpgrp ();
+#else
+ pid = getpgrp (0);
+#endif
+@end example
+
+This macro does not check whether
+@code{getpgrp} exists at all; if you need to work in that situation,
+first call @code{AC_CHECK_FUNC} for @code{getpgrp}.
+
+The result of this macro is cached in the @code{ac_cv_func_getpgrp_void}
+variable.
+
+This macro is obsolescent, as current systems have a @code{getpgrp}
+whose signature conforms to Posix. New programs need not use this macro.
+@end defmac
+
+@defmac AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
+@acindex{FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK}
+@cvindex LSTAT_FOLLOWS_SLASHED_SYMLINK
+@c @fuindex lstat
+@prindex @code{lstat}
+@caindex func_lstat_dereferences_slashed_symlink
+If @file{link} is a symbolic link, then @code{lstat} should treat
+@file{link/} the same as @file{link/.}. However, many older
+@code{lstat} implementations incorrectly ignore trailing slashes.
+
+It is safe to assume that if @code{lstat} incorrectly ignores
+trailing slashes, then other symbolic-link-aware functions like
+@code{unlink} also incorrectly ignore trailing slashes.
+
+If @code{lstat} behaves properly, define
+@code{LSTAT_FOLLOWS_SLASHED_SYMLINK}, otherwise require an
+@code{AC_LIBOBJ} replacement of @code{lstat}.
+
+The result of this macro is cached in the
+@code{ac_cv_func_lstat_dereferences_slashed_symlink} variable.
+
+The @code{AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK} macro is obsolescent.
+New programs should use Gnulib's @code{lstat} module. @xref{Gnulib}.
+@end defmac
+
+@defmac AC_FUNC_MALLOC
+@acindex{FUNC_MALLOC}
+@cvindex HAVE_MALLOC
+@cvindex malloc
+@c @fuindex malloc
+@prindex @code{malloc}
+@caindex func_malloc_0_nonnull
+If the @code{malloc} function is compatible with the GNU C
+library @code{malloc} (i.e., @samp{malloc (0)} returns a valid
+pointer), define @code{HAVE_MALLOC} to 1. Otherwise define
+@code{HAVE_MALLOC} to 0, ask for an @code{AC_LIBOBJ} replacement for
+@samp{malloc}, and define @code{malloc} to @code{rpl_malloc} so that the
+native @code{malloc} is not used in the main project.
+
+Typically, the replacement file @file{malloc.c} should look like (note
+the @samp{#undef malloc}):
+
+@verbatim
+#include <config.h>
+#undef malloc
+
+#include <sys/types.h>
+
+void *malloc ();
+
+/* Allocate an N-byte block of memory from the heap.
+ If N is zero, allocate a 1-byte block. */
+
+void *
+rpl_malloc (size_t n)
+{
+ if (n == 0)
+ n = 1;
+ return malloc (n);
+}
+@end verbatim
+
+The result of this macro is cached in the
+@code{ac_cv_func_malloc_0_nonnull} variable.
+@end defmac
+
+@defmac AC_FUNC_MBRTOWC
+@acindex{FUNC_MBRTOWC}
+@cvindex HAVE_MBRTOWC
+@c @fuindex mbrtowc
+@prindex @code{mbrtowc}
+@caindex func_mbrtowc
+Define @code{HAVE_MBRTOWC} to 1 if the function @code{mbrtowc} and the
+type @code{mbstate_t} are properly declared.
+
+The result of this macro is cached in the @code{ac_cv_func_mbrtowc}
+variable.
+@end defmac
+
+@defmac AC_FUNC_MEMCMP
+@acindex{FUNC_MEMCMP}
+@ovindex LIBOBJS
+@c @fuindex memcmp
+@prindex @code{memcmp}
+@caindex func_memcmp_working
+If the @code{memcmp} function is not available, or does not work on
+8-bit data (like the one on SunOS 4.1.3), or fails when comparing 16
+bytes or more and with at least one buffer not starting on a 4-byte
+boundary (such as the one on NeXT x86 OpenStep), require an
+@code{AC_LIBOBJ} replacement for @samp{memcmp}.
+
+The result of this macro is cached in the
+@code{ac_cv_func_memcmp_working} variable.
+
+This macro is obsolescent, as current systems have a working
+@code{memcmp}. New programs need not use this macro.
+@end defmac
+
+@defmac AC_FUNC_MKTIME
+@acindex{FUNC_MKTIME}
+@ovindex LIBOBJS
+@c @fuindex mktime
+@prindex @code{mktime}
+@caindex func_working_mktime
+If the @code{mktime} function is not available, or does not work
+correctly, require an @code{AC_LIBOBJ} replacement for @samp{mktime}.
+For the purposes of this test, @code{mktime} should conform to the
+Posix standard and should be the inverse of
+@code{localtime}.
+
+The result of this macro is cached in the
+@code{ac_cv_func_working_mktime} variable.
+
+The @code{AC_FUNC_MKTIME} macro is obsolescent. New programs should
+use Gnulib's @code{mktime} module. @xref{Gnulib}.
+@end defmac
+
+@anchor{AC_FUNC_MMAP}
+@defmac AC_FUNC_MMAP
+@acindex{FUNC_MMAP}
+@cvindex HAVE_MMAP
+@c @fuindex mmap
+@prindex @code{mmap}
+@caindex func_mmap_fixed_mapped
+If the @code{mmap} function exists and works correctly, define
+@code{HAVE_MMAP}. This checks only private fixed mapping of already-mapped
+memory.
+
+The result of this macro is cached in the
+@code{ac_cv_func_mmap_fixed_mapped} variable.
+@end defmac
+
+@defmac AC_FUNC_OBSTACK
+@acindex{FUNC_OBSTACK}
+@cvindex HAVE_OBSTACK
+@cindex obstack
+@caindex func_obstack
+If the obstacks are found, define @code{HAVE_OBSTACK}, else require an
+@code{AC_LIBOBJ} replacement for @samp{obstack}.
+
+The result of this macro is cached in the @code{ac_cv_func_obstack}
+variable.
+@end defmac
+
+@defmac AC_FUNC_REALLOC
+@acindex{FUNC_REALLOC}
+@cvindex HAVE_REALLOC
+@cvindex realloc
+@c @fuindex realloc
+@prindex @code{realloc}
+@caindex func_realloc_0_nonnull
+If the @code{realloc} function is compatible with the GNU C
+library @code{realloc} (i.e., @samp{realloc (NULL, 0)} returns a
+valid pointer), define @code{HAVE_REALLOC} to 1. Otherwise define
+@code{HAVE_REALLOC} to 0, ask for an @code{AC_LIBOBJ} replacement for
+@samp{realloc}, and define @code{realloc} to @code{rpl_realloc} so that
+the native @code{realloc} is not used in the main project. See
+@code{AC_FUNC_MALLOC} for details.
+
+The result of this macro is cached in the
+@code{ac_cv_func_realloc_0_nonnull} variable.
+@end defmac
+
+@defmac AC_FUNC_SELECT_ARGTYPES
+@acindex{FUNC_SELECT_ARGTYPES}
+@cvindex SELECT_TYPE_ARG1
+@cvindex SELECT_TYPE_ARG234
+@cvindex SELECT_TYPE_ARG5
+@c @fuindex select
+@prindex @code{select}
+@c @caindex func_select_args
+Determines the correct type to be passed for each of the
+@code{select} function's arguments, and defines those types
+in @code{SELECT_TYPE_ARG1}, @code{SELECT_TYPE_ARG234}, and
+@code{SELECT_TYPE_ARG5} respectively. @code{SELECT_TYPE_ARG1} defaults
+to @samp{int}, @code{SELECT_TYPE_ARG234} defaults to @samp{int *},
+and @code{SELECT_TYPE_ARG5} defaults to @samp{struct timeval *}.
+
+This macro is obsolescent, as current systems have a @code{select} whose
+signature conforms to Posix. New programs need not use this macro.
+@end defmac
+
+@defmac AC_FUNC_SETPGRP
+@acindex{FUNC_SETPGRP}
+@cvindex SETPGRP_VOID
+@c @fuindex setpgrp
+@prindex @code{setpgrp}
+@caindex func_setpgrp_void
+If @code{setpgrp} takes no argument (the Posix version), define
+@code{SETPGRP_VOID}. Otherwise, it is the BSD version, which takes
+two process IDs as arguments. This macro does not check whether
+@code{setpgrp} exists at all; if you need to work in that situation,
+first call @code{AC_CHECK_FUNC} for @code{setpgrp}.
+
+The result of this macro is cached in the @code{ac_cv_func_setpgrp_void}
+variable.
+
+This macro is obsolescent, as current systems have a @code{setpgrp}
+whose signature conforms to Posix. New programs need not use this macro.
+@end defmac
+
+@defmac AC_FUNC_STAT
+@defmacx AC_FUNC_LSTAT
+@acindex{FUNC_STAT}
+@acindex{FUNC_LSTAT}
+@cvindex HAVE_STAT_EMPTY_STRING_BUG
+@cvindex HAVE_LSTAT_EMPTY_STRING_BUG
+@c @fuindex stat
+@prindex @code{stat}
+@c @fuindex lstat
+@prindex @code{lstat}
+@caindex func_stat_empty_string_bug
+@caindex func_lstat_empty_string_bug
+Determine whether @code{stat} or @code{lstat} have the bug that it
+succeeds when given the zero-length file name as argument. The @code{stat}
+and @code{lstat} from SunOS 4.1.4 and the Hurd (as of 1998-11-01) do
+this.
+
+If it does, then define @code{HAVE_STAT_EMPTY_STRING_BUG} (or
+@code{HAVE_LSTAT_EMPTY_STRING_BUG}) and ask for an @code{AC_LIBOBJ}
+replacement of it.
+
+The results of these macros are cached in the
+@code{ac_cv_func_stat_empty_string_bug} and the
+@code{ac_cv_func_lstat_empty_string_bug} variables, respectively.
+
+These macros are obsolescent, as no current systems have the bug.
+New programs need not use these macros.
+@end defmac
+
+@anchor{AC_FUNC_STRCOLL}
+@defmac AC_FUNC_STRCOLL
+@acindex{FUNC_STRCOLL}
+@cvindex HAVE_STRCOLL
+@c @fuindex strcoll
+@prindex @code{strcoll}
+@caindex func_strcoll_works
+If the @code{strcoll} function exists and works correctly, define
+@code{HAVE_STRCOLL}. This does a bit more than
+@samp{AC_CHECK_FUNCS(strcoll)}, because some systems have incorrect
+definitions of @code{strcoll} that should not be used.
+
+The result of this macro is cached in the @code{ac_cv_func_strcoll_works}
+variable.
+@end defmac
+
+@defmac AC_FUNC_STRERROR_R
+@acindex{FUNC_STRERROR_R}
+@cvindex HAVE_STRERROR_R
+@cvindex HAVE_DECL_STRERROR_R
+@cvindex STRERROR_R_CHAR_P
+@c @fuindex strerror_r
+@caindex func_strerror_r_char_p
+@prindex @code{strerror_r}
+If @code{strerror_r} is available, define @code{HAVE_STRERROR_R}, and if
+it is declared, define @code{HAVE_DECL_STRERROR_R}. If it returns a
+@code{char *} message, define @code{STRERROR_R_CHAR_P}; otherwise it
+returns an @code{int} error number. The Thread-Safe Functions option of
+Posix requires @code{strerror_r} to return @code{int}, but
+many systems (including, for example, version 2.2.4 of the GNU C
+Library) return a @code{char *} value that is not necessarily equal to
+the buffer argument.
+
+The result of this macro is cached in the
+@code{ac_cv_func_strerror_r_char_p} variable.
+@end defmac
+
+@anchor{AC_FUNC_STRFTIME}
+@defmac AC_FUNC_STRFTIME
+@acindex{FUNC_STRFTIME}
+@cvindex HAVE_STRFTIME
+@c @fuindex strftime
+@prindex @code{strftime}
+Check for @code{strftime} in the @file{intl} library, for SCO Unix.
+Then, if @code{strftime} is available, define @code{HAVE_STRFTIME}.
+
+This macro is obsolescent, as no current systems require the @file{intl}
+library for @code{strftime}. New programs need not use this macro.
+@end defmac
+
+@defmac AC_FUNC_STRTOD
+@acindex{FUNC_STRTOD}
+@ovindex POW_LIB
+@c @fuindex strtod
+@prindex @code{strtod}
+@caindex func_strtod
+@caindex func_pow
+If the @code{strtod} function does not exist or doesn't work correctly,
+ask for an @code{AC_LIBOBJ} replacement of @samp{strtod}. In this case,
+because @file{strtod.c} is likely to need @samp{pow}, set the output
+variable @code{POW_LIB} to the extra library needed.
+
+This macro caches its result in the @code{ac_cv_func_strtod} variable
+and depends upon the result in the @code{ac_cv_func_pow} variable.
+
+The @code{AC_FUNC_STRTOD} macro is obsolescent. New programs should
+use Gnulib's @code{strtod} module. @xref{Gnulib}.
+@end defmac
+
+@defmac AC_FUNC_STRTOLD
+@acindex{FUNC_STRTOLD}
+@cvindex HAVE_STRTOLD
+@prindex @code{strtold}
+@caindex func_strtold
+If the @code{strtold} function exists and conforms to C99, define
+@code{HAVE_STRTOLD}.
+
+This macro caches its result in the @code{ac_cv_func_strtold} variable.
+@end defmac
+
+@defmac AC_FUNC_STRNLEN
+@acindex{FUNC_STRNLEN}
+@cvindex HAVE_STRNLEN
+@c @fuindex strnlen
+@prindex @code{strnlen}
+@caindex func_strnlen_working
+If the @code{strnlen} function is not available, or is buggy (like the one
+from AIX 4.3), require an @code{AC_LIBOBJ} replacement for it.
+
+This macro caches its result in the @code{ac_cv_func_strnlen_working}
+variable.
+@end defmac
+
+@anchor{AC_FUNC_UTIME_NULL}
+@defmac AC_FUNC_UTIME_NULL
+@acindex{FUNC_UTIME_NULL}
+@cvindex HAVE_UTIME_NULL
+@c @fuindex utime
+@prindex @code{utime}
+@caindex func_utime_null
+If @samp{utime (@var{file}, NULL)} sets @var{file}'s timestamp to
+the present, define @code{HAVE_UTIME_NULL}.
+
+This macro caches its result in the @code{ac_cv_func_utime_null}
+variable.
+
+This macro is obsolescent, as all current systems have a @code{utime}
+that behaves this way. New programs need not use this macro.
+@end defmac
+
+@anchor{AC_FUNC_VPRINTF}
+@defmac AC_FUNC_VPRINTF
+@acindex{FUNC_VPRINTF}
+@cvindex HAVE_VPRINTF
+@cvindex HAVE_DOPRNT
+@c @fuindex vprintf
+@prindex @code{vprintf}
+@c @fuindex vsprintf
+@prindex @code{vsprintf}
+If @code{vprintf} is found, define @code{HAVE_VPRINTF}. Otherwise, if
+@code{_doprnt} is found, define @code{HAVE_DOPRNT}. (If @code{vprintf}
+is available, you may assume that @code{vfprintf} and @code{vsprintf}
+are also available.)
+
+This macro is obsolescent, as all current systems have @code{vprintf}.
+New programs need not use this macro.
+@end defmac
+
+@defmac AC_REPLACE_FNMATCH
+@acindex{REPLACE_FNMATCH}
+@c @fuindex fnmatch
+@prindex @code{fnmatch}
+@hdrindex{fnmatch.h}
+@caindex func_fnmatch_works
+If the @code{fnmatch} function does not conform to Posix (see
+@code{AC_FUNC_FNMATCH}), ask for its @code{AC_LIBOBJ} replacement.
+
+The files @file{fnmatch.c}, @file{fnmatch_loop.c}, and @file{fnmatch_.h}
+in the @code{AC_LIBOBJ} replacement directory are assumed to contain a
+copy of the source code of GNU @code{fnmatch}. If necessary,
+this source code is compiled as an @code{AC_LIBOBJ} replacement, and the
+@file{fnmatch_.h} file is linked to @file{fnmatch.h} so that it can be
+included in place of the system @code{<fnmatch.h>}.
+
+This macro caches its result in the @code{ac_cv_func_fnmatch_works}
+variable.
+
+This macro is obsolescent, as it assumes the use of particular source
+files. New programs should use Gnulib's @code{fnmatch-posix} module,
+which provides this macro along with the source files. @xref{Gnulib}.
+@end defmac
+
+
+
+@node Generic Functions
+@subsection Generic Function Checks
+
+These macros are used to find functions not covered by the ``particular''
+test macros. If the functions might be in libraries other than the
+default C library, first call @code{AC_CHECK_LIB} for those libraries.
+If you need to check the behavior of a function as well as find out
+whether it is present, you have to write your own test for
+it (@pxref{Writing Tests}).
+
+@anchor{AC_CHECK_FUNC}
+@defmac AC_CHECK_FUNC (@var{function}, @ovar{action-if-found}, @
+ @ovar{action-if-not-found})
+@acindex{CHECK_FUNC}
+@caindex func_@var{function}
+If C function @var{function} is available, run shell commands
+@var{action-if-found}, otherwise @var{action-if-not-found}. If you just
+want to define a symbol if the function is available, consider using
+@code{AC_CHECK_FUNCS} instead. This macro checks for functions with C
+linkage even when @code{AC_LANG(C++)} has been called, since C is more
+standardized than C++. (@pxref{Language Choice}, for more information
+about selecting the language for checks.)
+
+This macro caches its result in the @code{ac_cv_func_@var{function}}
+variable.
+@end defmac
+
+@anchor{AC_CHECK_FUNCS}
+@defmac AC_CHECK_FUNCS (@var{function}@dots{}, @ovar{action-if-found}, @
+ @ovar{action-if-not-found})
+@acindex{CHECK_FUNCS}
+@cvindex HAVE_@var{function}
+For each @var{function} enumerated in the blank-or-newline-separated argument
+list, define @code{HAVE_@var{function}} (in all capitals) if it is available.
+If @var{action-if-found} is given, it is additional shell code to
+execute when one of the functions is found. You can give it a value of
+@samp{break} to break out of the loop on the first match. If
+@var{action-if-not-found} is given, it is executed when one of the
+functions is not found.
+
+Results are cached for each @var{function} as in @code{AC_CHECK_FUNC}.
+@end defmac
+
+@defmac AC_CHECK_FUNCS_ONCE (@var{function}@dots{})
+@acindex{CHECK_FUNCS_ONCE}
+@cvindex HAVE_@var{function}
+For each @var{function} enumerated in the blank-or-newline-separated argument
+list, define @code{HAVE_@var{function}} (in all capitals) if it is available.
+This is a once-only variant of @code{AC_CHECK_FUNCS}. It generates the
+checking code at most once, so that @command{configure} is smaller and
+faster; but the checks cannot be conditionalized and are always done once,
+early during the @command{configure} run.
+@end defmac
+
+@sp 1
+
+Autoconf follows a philosophy that was formed over the years by those
+who have struggled for portability: isolate the portability issues in
+specific files, and then program as if you were in a Posix
+environment. Some functions may be missing or unfixable, and your
+package must be ready to replace them.
+
+Suitable replacements for many such problem functions are available from
+Gnulib (@pxref{Gnulib}).
+
+@defmac AC_LIBOBJ (@var{function})
+@acindex{LIBOBJ}
+@ovindex LIBOBJS
+Specify that @samp{@var{function}.c} must be included in the executables
+to replace a missing or broken implementation of @var{function}.
+
+@vrindex ac_objext
+Technically, it adds @samp{@var{function}.$ac_objext} to the output
+variable @code{LIBOBJS} if it is not already in, and calls
+@code{AC_LIBSOURCE} for @samp{@var{function}.c}. You should not
+directly change @code{LIBOBJS}, since this is not traceable.
+@end defmac
+
+@defmac AC_LIBSOURCE (@var{file})
+@acindex{LIBSOURCE}
+Specify that @var{file} might be needed to compile the project. If you
+need to know what files might be needed by a @file{configure.ac}, you
+should trace @code{AC_LIBSOURCE}. @var{file} must be a literal.
+
+This macro is called automatically from @code{AC_LIBOBJ}, but you must
+call it explicitly if you pass a shell variable to @code{AC_LIBOBJ}. In
+that case, since shell variables cannot be traced statically, you must
+pass to @code{AC_LIBSOURCE} any possible files that the shell variable
+might cause @code{AC_LIBOBJ} to need. For example, if you want to pass
+a variable @code{$foo_or_bar} to @code{AC_LIBOBJ} that holds either
+@code{"foo"} or @code{"bar"}, you should do:
+
+@example
+AC_LIBSOURCE([foo.c])
+AC_LIBSOURCE([bar.c])
+AC_LIBOBJ([$foo_or_bar])
+@end example
+
+@noindent
+There is usually a way to avoid this, however, and you are encouraged to
+simply call @code{AC_LIBOBJ} with literal arguments.
+
+Note that this macro replaces the obsolete @code{AC_LIBOBJ_DECL}, with
+slightly different semantics: the old macro took the function name,
+e.g., @code{foo}, as its argument rather than the file name.
+@end defmac
+
+@defmac AC_LIBSOURCES (@var{files})
+@acindex{LIBSOURCES}
+Like @code{AC_LIBSOURCE}, but accepts one or more @var{files} in a
+comma-separated M4 list. Thus, the above example might be rewritten:
+
+@example
+AC_LIBSOURCES([foo.c, bar.c])
+AC_LIBOBJ([$foo_or_bar])
+@end example
+@end defmac
+
+@defmac AC_CONFIG_LIBOBJ_DIR (@var{directory})
+@acindex{CONFIG_LIBOBJ_DIR}
+Specify that @code{AC_LIBOBJ} replacement files are to be found in
+@var{directory}, a name relative to the top level of the
+source tree. The replacement directory defaults to @file{.}, the top
+level directory, and the most typical value is @file{lib}, corresponding
+to @samp{AC_CONFIG_LIBOBJ_DIR([lib])}.
+
+@command{configure} might need to know the replacement directory for the
+following reasons: (i) some checks use the replacement files, (ii) some
+macros bypass broken system headers by installing links to the
+replacement headers (iii) when used in conjunction with Automake,
+within each makefile, @var{directory} is used as a relative path
+from @code{$(top_srcdir)} to each object named in @code{LIBOBJS} and
+@code{LTLIBOBJS}, etc.
+@end defmac
+
+@sp 1
+
+It is common to merely check for the existence of a function, and ask
+for its @code{AC_LIBOBJ} replacement if missing. The following macro is
+a convenient shorthand.
+
+@defmac AC_REPLACE_FUNCS (@var{function}@dots{})
+@acindex{REPLACE_FUNCS}
+@cvindex HAVE_@var{function}
+@ovindex LIBOBJS
+Like @code{AC_CHECK_FUNCS}, but uses @samp{AC_LIBOBJ(@var{function})} as
+@var{action-if-not-found}. You can declare your replacement function by
+enclosing the prototype in @samp{#ifndef HAVE_@var{function}}. If the
+system has the function, it probably declares it in a header file you
+should be including, so you shouldn't redeclare it lest your declaration
+conflict.
+@end defmac
+
+@node Header Files
+@section Header Files
+@cindex Header, checking
+
+The following macros check for the presence of certain C header files.
+If there is no macro specifically defined to check for a header file you need,
+and you don't need to check for any special properties of
+it, then you can use one of the general header-file check macros.
+
+@menu
+* Header Portability:: Collected knowledge on common headers
+* Particular Headers:: Special handling to find certain headers
+* Generic Headers:: How to find other headers
+@end menu
+
+@node Header Portability
+@subsection Portability of Headers
+@cindex Portability of headers
+@cindex Header portability
+
+This section documents some collected knowledge about common headers,
+and the problems they cause. By definition, this list always requires
+additions. A much more complete list is maintained by the Gnulib
+project (@pxref{Gnulib}), covering @ref{Header File Substitutes, ,
+Posix Headers, gnulib, GNU gnulib} and @ref{Glibc Header File
+Substitutes, , Glibc Headers, gnulib, GNU gnulib}. Please help us keep
+the gnulib list as complete as possible.
+
+@table @asis
+
+@item @file{limits.h}
+C99 says that @file{limits.h} defines @code{LLONG_MIN},
+@code{LLONG_MAX}, and @code{ULLONG_MAX}, but many almost-C99
+environments (e.g., default GCC 4.0.2 + glibc 2.4) do not
+define them.
+
+@item @file{inttypes.h} vs.@: @file{stdint.h}
+@hdrindex{inttypes.h}
+@hdrindex{stdint.h}
+The C99 standard says that @file{inttypes.h} includes
+@file{stdint.h}, so there's no need to include @file{stdint.h}
+separately in a standard environment. Some implementations have
+@file{inttypes.h} but not @file{stdint.h} (e.g., Solaris 7), but we don't
+know of any implementation that has @file{stdint.h} but not
+@file{inttypes.h}.
+
+@item @file{linux/irda.h}
+@hdrindex{linux/irda.h}
+It requires @file{linux/types.h} and @file{sys/socket.h}.
+
+@item @file{linux/random.h}
+@hdrindex{linux/random.h}
+It requires @file{linux/types.h}.
+
+@item @file{net/if.h}
+@hdrindex{net/if.h}
+On Darwin, this file requires that @file{sys/socket.h} be included
+beforehand. One should run:
+
+@example
+AC_CHECK_HEADERS([sys/socket.h])
+AC_CHECK_HEADERS([net/if.h], [], [],
+[#include <stdio.h>
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+])
+@end example
+
+@item @file{netinet/if_ether.h}
+@hdrindex{netinet/if_ether.h}
+On Darwin, this file requires that @file{stdio.h} and
+@file{sys/socket.h} be included beforehand. One should run:
+
+@example
+AC_CHECK_HEADERS([sys/socket.h])
+AC_CHECK_HEADERS([netinet/if_ether.h], [], [],
+[#include <stdio.h>
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+])
+@end example
+
+@item @file{stdint.h}
+See above, item @file{inttypes.h} vs.@: @file{stdint.h}.
+
+@item @file{stdlib.h}
+@hdrindex{stdlib.h}
+On many systems (e.g., Darwin), @file{stdio.h} is a prerequisite.
+
+@item @file{sys/mount.h}
+@hdrindex{sys/mount.h}
+On FreeBSD 4.8 on ia32 and using gcc version 2.95.4,
+@file{sys/params.h} is a prerequisite.
+
+@item @file{sys/ptem.h}
+@hdrindex{sys/ptem.h}
+On Solaris 8, @file{sys/stream.h} is a prerequisite.
+
+@item @file{sys/socket.h}
+@hdrindex{sys/socket.h}
+On Darwin, @file{stdlib.h} is a prerequisite.
+
+@item @file{sys/ucred.h}
+@hdrindex{sys/ucred.h}
+On Tru64 5.1, @file{sys/types.h} is a prerequisite.
+
+@item @file{X11/extensions/scrnsaver.h}
+@hdrindex{X11/extensions/scrnsaver.h}
+Using XFree86, this header requires @file{X11/Xlib.h}, which is probably
+so required that you might not even consider looking for it.
+
+@example
+AC_CHECK_HEADERS([X11/extensions/scrnsaver.h], [], [],
+[[#include <X11/Xlib.h>
+]])
+@end example
+@end table
+
+
+@node Particular Headers
+@subsection Particular Header Checks
+
+These macros check for particular system header files---whether they
+exist, and in some cases whether they declare certain symbols.
+
+@defmac AC_CHECK_HEADER_STDBOOL
+@acindex{CHECK_HEADER_STDBOOL}
+@cvindex HAVE__BOOL
+@hdrindex{stdbool.h}
+@caindex header_stdbool_h
+Check whether @file{stdbool.h} exists and conforms to C99, and cache the
+result in the @code{ac_cv_header_stdbool_h} variable. If the type
+@code{_Bool} is defined, define @code{HAVE__BOOL} to 1.
+
+This macro is intended for use by Gnulib (@pxref{Gnulib}) and other
+packages that supply a substitute @file{stdbool.h} on platforms lacking
+a conforming one. The @code{AC_HEADER_STDBOOL} macro is better for code
+that explicitly checks for @file{stdbool.h}.
+@end defmac
+
+@defmac AC_HEADER_ASSERT
+@acindex{HEADER_ASSERT}
+@cvindex NDEBUG
+@hdrindex{assert.h}
+Check whether to enable assertions in the style of @file{assert.h}.
+Assertions are enabled by default, but the user can override this by
+invoking @command{configure} with the @option{--disable-assert} option.
+@end defmac
+
+@anchor{AC_HEADER_DIRENT}
+@defmac AC_HEADER_DIRENT
+@acindex{HEADER_DIRENT}
+@cvindex HAVE_DIRENT_H
+@cvindex HAVE_NDIR_H
+@cvindex HAVE_SYS_DIR_H
+@cvindex HAVE_SYS_NDIR_H
+@hdrindex{dirent.h}
+@hdrindex{sys/ndir.h}
+@hdrindex{sys/dir.h}
+@hdrindex{ndir.h}
+Check for the following header files. For the first one that is
+found and defines @samp{DIR}, define the listed C preprocessor macro:
+
+@multitable {@file{sys/ndir.h}} {@code{HAVE_SYS_NDIR_H}}
+@item @file{dirent.h} @tab @code{HAVE_DIRENT_H}
+@item @file{sys/ndir.h} @tab @code{HAVE_SYS_NDIR_H}
+@item @file{sys/dir.h} @tab @code{HAVE_SYS_DIR_H}
+@item @file{ndir.h} @tab @code{HAVE_NDIR_H}
+@end multitable
+
+The directory-library declarations in your source code should look
+something like the following:
+
+@example
+@group
+#include <sys/types.h>
+#ifdef HAVE_DIRENT_H
+# include <dirent.h>
+# define NAMLEN(dirent) strlen ((dirent)->d_name)
+#else
+# define dirent direct
+# define NAMLEN(dirent) ((dirent)->d_namlen)
+# ifdef HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif
+# ifdef HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif
+# ifdef HAVE_NDIR_H
+# include <ndir.h>
+# endif
+#endif
+@end group
+@end example
+
+Using the above declarations, the program would declare variables to be
+of type @code{struct dirent}, not @code{struct direct}, and would access
+the length of a directory entry name by passing a pointer to a
+@code{struct dirent} to the @code{NAMLEN} macro.
+
+This macro also checks for the SCO Xenix @file{dir} and @file{x} libraries.
+
+This macro is obsolescent, as all current systems with directory
+libraries have @code{<dirent.h>}. New programs need not use this macro.
+
+Also see @code{AC_STRUCT_DIRENT_D_INO} and
+@code{AC_STRUCT_DIRENT_D_TYPE} (@pxref{Particular Structures}).
+@end defmac
+
+@anchor{AC_HEADER_MAJOR}
+@defmac AC_HEADER_MAJOR
+@acindex{HEADER_MAJOR}
+@cvindex MAJOR_IN_MKDEV
+@cvindex MAJOR_IN_SYSMACROS
+@hdrindex{sys/mkdev.h}
+@hdrindex{sys/sysmacros.h}
+If @file{sys/types.h} does not define @code{major}, @code{minor}, and
+@code{makedev}, but @file{sys/mkdev.h} does, define
+@code{MAJOR_IN_MKDEV}; otherwise, if @file{sys/sysmacros.h} does, define
+@code{MAJOR_IN_SYSMACROS}.
+@end defmac
+
+@defmac AC_HEADER_RESOLV
+@acindex{HEADER_RESOLV}
+@cvindex HAVE_RESOLV_H
+@hdrindex{resolv.h}
+Checks for header @file{resolv.h}, checking for prerequisites first.
+To properly use @file{resolv.h}, your code should contain something like
+the following:
+
+@verbatim
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h> /* inet_ functions / structs */
+#endif
+#ifdef HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h> /* DNS HEADER struct */
+#endif
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+#include <resolv.h>
+@end verbatim
+@end defmac
+
+@anchor{AC_HEADER_STAT}
+@defmac AC_HEADER_STAT
+@acindex{HEADER_STAT}
+@cvindex STAT_MACROS_BROKEN
+@hdrindex{sys/stat.h}
+If the macros @code{S_ISDIR}, @code{S_ISREG}, etc.@: defined in
+@file{sys/stat.h} do not work properly (returning false positives),
+define @code{STAT_MACROS_BROKEN}. This is the case on Tektronix UTekV,
+Amdahl UTS and Motorola System V/88.
+
+This macro is obsolescent, as no current systems have the bug.
+New programs need not use this macro.
+@end defmac
+
+@defmac AC_HEADER_STDBOOL
+@acindex{HEADER_STDBOOL}
+@cvindex HAVE_STDBOOL_H
+@cvindex HAVE__BOOL
+@hdrindex{stdbool.h}
+@caindex header_stdbool_h
+If @file{stdbool.h} exists and conforms to C99, define
+@code{HAVE_STDBOOL_H} to 1; if the type @code{_Bool} is defined, define
+@code{HAVE__BOOL} to 1. To fulfill the C99 requirements, your
+program could contain the following code:
+
+@example
+@group
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# ifndef HAVE__BOOL
+# ifdef __cplusplus
+typedef bool _Bool;
+# else
+# define _Bool signed char
+# endif
+# endif
+# define bool _Bool
+# define false 0
+# define true 1
+# define __bool_true_false_are_defined 1
+#endif
+@end group
+@end example
+
+Alternatively you can use the @samp{stdbool} package of Gnulib
+(@pxref{Gnulib}). It simplifies your code so that it can say just
+@code{#include <stdbool.h>}, and it adds support for less-common
+platforms.
+
+This macro caches its result in the @code{ac_cv_header_stdbool_h}
+variable.
+
+This macro differs from @code{AC_CHECK_HEADER_STDBOOL} only in that it
+defines @code{HAVE_STDBOOL_H} whereas @code{AC_CHECK_HEADER_STDBOOL}
+does not.
+@end defmac
+
+@anchor{AC_HEADER_STDC}
+@defmac AC_HEADER_STDC
+@acindex{HEADER_STDC}
+@cvindex STDC_HEADERS
+@hdrindex{stdlib.h}
+@hdrindex{stdarg.h}
+@hdrindex{string.h}
+@hdrindex{float.h}
+@hdrindex{ctype.h}
+@caindex header_stdc
+Define @code{STDC_HEADERS} if the system has C header files
+conforming to ANSI C89 (ISO C90).
+Specifically, this macro checks for @file{stdlib.h}, @file{stdarg.h},
+@file{string.h}, and @file{float.h}; if the system has those, it
+probably has the rest of the C89 header files. This macro also
+checks whether @file{string.h} declares @code{memchr} (and thus
+presumably the other @code{mem} functions), whether @file{stdlib.h}
+declare @code{free} (and thus presumably @code{malloc} and other related
+functions), and whether the @file{ctype.h} macros work on characters
+with the high bit set, as the C standard requires.
+
+If you use this macro, your code can refer to @code{STDC_HEADERS} to
+determine whether the system has conforming header files (and probably C
+library functions).
+
+This macro caches its result in the @code{ac_cv_header_stdc} variable.
+
+This macro is obsolescent, as current systems have conforming header
+files. New programs need not use this macro.
+
+@hdrindex{string.h}
+@hdrindex{strings.h}
+Nowadays @file{string.h} is part of the C standard and declares functions like
+@code{strcpy}, and @file{strings.h} is standardized by Posix and declares
+BSD functions like @code{bcopy}; but
+historically, string functions were a major sticking point in this area.
+If you still want to worry about portability to ancient systems without
+standard headers, there is so much variation
+that it is probably easier to declare the functions you use than to
+figure out exactly what the system header files declare. Some ancient systems
+contained a mix of functions from the C standard and from BSD;
+some were mostly standard but lacked @samp{memmove}; some defined the
+BSD functions as macros in @file{string.h} or
+@file{strings.h}; some had only the BSD functions but
+@file{string.h}; some declared the memory functions in @file{memory.h},
+some in @file{string.h}; etc. It is probably sufficient to check for
+one string function and one memory function; if the library had the
+standard versions of those then it probably had most of the others.
+If you put the following in @file{configure.ac}:
+
+@example
+# This example is obsolescent.
+# Nowadays you can omit these macro calls.
+AC_HEADER_STDC
+AC_CHECK_FUNCS([strchr memcpy])
+@end example
+
+@noindent
+then, in your code, you can use declarations like this:
+
+@example
+@group
+/* This example is obsolescent.
+ Nowadays you can just #include <string.h>. */
+#ifdef STDC_HEADERS
+# include <string.h>
+#else
+# ifndef HAVE_STRCHR
+# define strchr index
+# define strrchr rindex
+# endif
+char *strchr (), *strrchr ();
+# ifndef HAVE_MEMCPY
+# define memcpy(d, s, n) bcopy ((s), (d), (n))
+# define memmove(d, s, n) bcopy ((s), (d), (n))
+# endif
+#endif
+@end group
+@end example
+
+@noindent
+If you use a function like @code{memchr}, @code{memset}, @code{strtok},
+or @code{strspn}, which have no BSD equivalent, then macros don't
+suffice to port to ancient hosts; you must provide an implementation of
+each function. An easy
+way to incorporate your implementations only when needed (since the ones
+in system C libraries may be hand optimized) is to, taking @code{memchr}
+for example, put it in @file{memchr.c} and use
+@samp{AC_REPLACE_FUNCS([memchr])}.
+@end defmac
+
+@defmac AC_HEADER_SYS_WAIT
+@acindex{HEADER_SYS_WAIT}
+@cvindex HAVE_SYS_WAIT_H
+@hdrindex{sys/wait.h}
+@caindex header_sys_wait_h
+If @file{sys/wait.h} exists and is compatible with Posix, define
+@code{HAVE_SYS_WAIT_H}. Incompatibility can occur if @file{sys/wait.h}
+does not exist, or if it uses the old BSD @code{union wait} instead
+of @code{int} to store a status value. If @file{sys/wait.h} is not
+Posix compatible, then instead of including it, define the
+Posix macros with their usual interpretations. Here is an
+example:
+
+@example
+@group
+#include <sys/types.h>
+#ifdef HAVE_SYS_WAIT_H
+# include <sys/wait.h>
+#endif
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+#endif
+@end group
+@end example
+
+@noindent
+This macro caches its result in the @code{ac_cv_header_sys_wait_h}
+variable.
+
+This macro is obsolescent, as current systems are compatible with Posix.
+New programs need not use this macro.
+@end defmac
+
+@cvindex _POSIX_VERSION
+@hdrindex{unistd.h}
+@code{_POSIX_VERSION} is defined when @file{unistd.h} is included on
+Posix systems. If there is no @file{unistd.h}, it is definitely
+not a Posix system. However, some non-Posix systems do
+have @file{unistd.h}.
+
+The way to check whether the system supports Posix is:
+
+@example
+@group
+#ifdef HAVE_UNISTD_H
+# include <sys/types.h>
+# include <unistd.h>
+#endif
+
+#ifdef _POSIX_VERSION
+/* Code for Posix systems. */
+#endif
+@end group
+@end example
+
+@anchor{AC_HEADER_TIME}
+@defmac AC_HEADER_TIME
+@acindex{HEADER_TIME}
+@cvindex TIME_WITH_SYS_TIME
+@hdrindex{time.h}
+@hdrindex{sys/time.h}
+@caindex header_time
+If a program may include both @file{time.h} and @file{sys/time.h},
+define @code{TIME_WITH_SYS_TIME}. On some ancient systems,
+@file{sys/time.h} included @file{time.h}, but @file{time.h} was not
+protected against multiple inclusion, so programs could not explicitly
+include both files. This macro is useful in programs that use, for
+example, @code{struct timeval} as well as
+@code{struct tm}. It is best used in conjunction with
+@code{HAVE_SYS_TIME_H}, which can be checked for using
+@code{AC_CHECK_HEADERS([sys/time.h])}.
+
+@example
+@group
+#ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+@end group
+@end example
+
+@noindent
+This macro caches its result in the @code{ac_cv_header_time} variable.
+
+This macro is obsolescent, as current systems can include both files
+when they exist. New programs need not use this macro.
+@end defmac
+
+
+@defmac AC_HEADER_TIOCGWINSZ
+@acindex{HEADER_TIOCGWINSZ}
+@cvindex GWINSZ_IN_SYS_IOCTL
+@hdrindex{sys/ioctl.h}
+@hdrindex{termios.h}
+@c FIXME: I need clarifications from Jim.
+If the use of @code{TIOCGWINSZ} requires @file{<sys/ioctl.h>}, then
+define @code{GWINSZ_IN_SYS_IOCTL}. Otherwise @code{TIOCGWINSZ} can be
+found in @file{<termios.h>}.
+
+Use:
+
+@example
+@group
+#ifdef HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+
+#ifdef GWINSZ_IN_SYS_IOCTL
+# include <sys/ioctl.h>
+#endif
+@end group
+@end example
+@end defmac
+
+@node Generic Headers
+@subsection Generic Header Checks
+
+These macros are used to find system header files not covered by the
+``particular'' test macros. If you need to check the contents of a header
+as well as find out whether it is present, you have to write your own
+test for it (@pxref{Writing Tests}).
+
+@anchor{AC_CHECK_HEADER}
+@defmac AC_CHECK_HEADER (@var{header-file}, @ovar{action-if-found}, @
+ @ovar{action-if-not-found}, @ovar{includes})
+@acindex{CHECK_HEADER}
+@caindex header_@var{header-file}
+If the system header file @var{header-file} is compilable, execute shell
+commands @var{action-if-found}, otherwise execute
+@var{action-if-not-found}. If you just want to define a symbol if the
+header file is available, consider using @code{AC_CHECK_HEADERS}
+instead.
+
+@var{includes} is decoded to determine the appropriate include
+directives. If omitted or empty, @file{configure} will check for both header
+existence (with the preprocessor) and usability (with the compiler),
+using @code{AC_INCLUDES_DEFAULT} for the compile test. If
+there is a discrepancy between the results, a warning is issued to the
+user, and the compiler results are favored (@pxref{Present But
+Cannot Be Compiled}). In general, favoring the compiler results means
+that a header will be treated as not found even though the file exists,
+because you did not provide enough prerequisites.
+
+Providing a non-empty @var{includes} argument allows the code to provide
+any prerequisites prior to including the header under test; it is common
+to use the argument @code{AC_INCLUDES_DEFAULT} (@pxref{Default
+Includes}). With an explicit fourth argument, no preprocessor test is
+needed. As a special case, an @var{includes} of exactly @samp{-}
+triggers the older preprocessor check, which merely determines existence
+of the file in the preprocessor search path; this should only be used as
+a last resort (it is safer to determine the actual prerequisites and
+perform a compiler check, or else use @code{AC_PREPROC_IFELSE} to make
+it obvious that only a preprocessor check is desired).
+
+This macro caches its result in the @code{ac_cv_header_@var{header-file}}
+variable, with characters not suitable for a variable name mapped to
+underscores.
+@end defmac
+
+@anchor{AC_CHECK_HEADERS}
+@defmac AC_CHECK_HEADERS (@var{header-file}@dots{}, @
+ @ovar{action-if-found}, @ovar{action-if-not-found}, @
+ @ovar{includes})
+@acindex{CHECK_HEADERS}
+@cvindex HAVE_@var{header}
+@caindex header_@var{header-file}
+For each given system header file @var{header-file} in the
+blank-separated argument list that exists, define
+@code{HAVE_@var{header-file}} (in all capitals). If @var{action-if-found}
+is given, it is additional shell code to execute when one of the header
+files is found. You can give it a value of @samp{break} to break out of
+the loop on the first match. If @var{action-if-not-found} is given, it
+is executed when one of the header files is not found.
+
+@var{includes} is interpreted as in @code{AC_CHECK_HEADER}, in order to
+choose the set of preprocessor directives supplied before the header
+under test.
+
+This macro caches its result in the @code{ac_cv_header_@var{header-file}}
+variable, with characters not suitable for a variable name mapped to
+underscores.
+@end defmac
+
+Previous versions of Autoconf merely checked whether the header was
+accepted by the preprocessor. This was changed because the old test was
+inappropriate for typical uses. Headers are typically used to compile,
+not merely to preprocess, and the old behavior sometimes accepted
+headers that clashed at compile-time (@pxref{Present But Cannot Be
+Compiled}). If you need to check whether a header is preprocessable,
+you can use @code{AC_PREPROC_IFELSE} (@pxref{Running the Preprocessor}).
+
+Actually requiring a header to compile improves the robustness of the
+test, but it also requires
+that you make sure that headers that must be included before the
+@var{header-file} be part of the @var{includes}, (@pxref{Default
+Includes}). If looking for @file{bar.h}, which requires that
+@file{foo.h} be included before if it exists, we suggest the following
+scheme:
+
+@verbatim
+AC_CHECK_HEADERS([foo.h])
+AC_CHECK_HEADERS([bar.h], [], [],
+[#ifdef HAVE_FOO_H
+# include <foo.h>
+#endif
+])
+@end verbatim
+
+The following variant generates smaller, faster @command{configure}
+files if you do not need the full power of @code{AC_CHECK_HEADERS}.
+
+@defmac AC_CHECK_HEADERS_ONCE (@var{header-file}@dots{})
+@acindex{CHECK_HEADERS_ONCE}
+@cvindex HAVE_@var{header}
+For each given system header file @var{header-file} in the
+blank-separated argument list that exists, define
+@code{HAVE_@var{header-file}} (in all capitals).
+This is a once-only variant of @code{AC_CHECK_HEADERS}. It generates the
+checking code at most once, so that @command{configure} is smaller and
+faster; but the checks cannot be conditionalized and are always done once,
+early during the @command{configure} run. Thus, this macro is only safe
+for checking headers that do not have prerequisites beyond what
+@code{AC_INCLUDES_DEFAULT} provides.
+@end defmac
+
+@node Declarations
+@section Declarations
+@cindex Declaration, checking
+
+The following macros check for the declaration of variables and
+functions. If there is no macro specifically defined to check for a
+symbol you need, then you can use the general macros (@pxref{Generic
+Declarations}) or, for more complex tests, you may use
+@code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}).
+
+@menu
+* Particular Declarations:: Macros to check for certain declarations
+* Generic Declarations:: How to find other declarations
+@end menu
+
+@node Particular Declarations
+@subsection Particular Declaration Checks
+
+There are no specific macros for declarations.
+
+@node Generic Declarations
+@subsection Generic Declaration Checks
+
+These macros are used to find declarations not covered by the ``particular''
+test macros.
+
+@defmac AC_CHECK_DECL (@var{symbol}, @ovar{action-if-found}, @
+ @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT})
+@acindex{CHECK_DECL}
+@caindex have_decl_@var{symbol}
+If @var{symbol} (a function, variable, or constant) is not declared in
+@var{includes} and a declaration is needed, run the shell commands
+@var{action-if-not-found}, otherwise @var{action-if-found}.
+@var{includes} is a series of include directives, defaulting to
+@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used
+prior to the declaration under test.
+
+This macro actually tests whether @var{symbol} is defined as a macro or
+can be used as an r-value, not whether it is really declared, because it
+is much safer to avoid introducing extra declarations when they are not
+needed. In order to facilitate use of C++ and overloaded function
+declarations, it is possible to specify function argument types in
+parentheses for types which can be zero-initialized:
+
+@example
+AC_CHECK_DECL([basename(char *)])
+@end example
+
+This macro caches its result in the @code{ac_cv_have_decl_@var{symbol}}
+variable, with characters not suitable for a variable name mapped to
+underscores.
+@end defmac
+
+@anchor{AC_CHECK_DECLS}
+@defmac AC_CHECK_DECLS (@var{symbols}, @ovar{action-if-found}, @
+ @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT})
+@acindex{CHECK_DECLS}
+@cvindex HAVE_DECL_@var{symbol}
+@caindex have_decl_@var{symbol}
+For each of the @var{symbols} (@emph{comma}-separated list with optional
+function argument types for C++ overloads), define
+@code{HAVE_DECL_@var{symbol}} (in all capitals) to @samp{1} if
+@var{symbol} is declared, otherwise to @samp{0}. If
+@var{action-if-not-found} is given, it is additional shell code to
+execute when one of the function declarations is needed, otherwise
+@var{action-if-found} is executed.
+
+@var{includes} is a series of include directives, defaulting to
+@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used
+prior to the declarations under test.
+
+This macro uses an M4 list as first argument:
+@example
+AC_CHECK_DECLS([strdup])
+AC_CHECK_DECLS([strlen])
+AC_CHECK_DECLS([malloc, realloc, calloc, free])
+AC_CHECK_DECLS([j0], [], [], [[#include <math.h>]])
+AC_CHECK_DECLS([[basename(char *)], [dirname(char *)]])
+@end example
+
+Unlike the other @samp{AC_CHECK_*S} macros, when a @var{symbol} is not
+declared, @code{HAVE_DECL_@var{symbol}} is defined to @samp{0} instead
+of leaving @code{HAVE_DECL_@var{symbol}} undeclared. When you are
+@emph{sure} that the check was performed, use
+@code{HAVE_DECL_@var{symbol}} in @code{#if}:
+
+@example
+#if !HAVE_DECL_SYMBOL
+extern char *symbol;
+#endif
+@end example
+
+@noindent
+If the test may have not been performed, however, because it is safer
+@emph{not} to declare a symbol than to use a declaration that conflicts
+with the system's one, you should use:
+
+@example
+#if defined HAVE_DECL_MALLOC && !HAVE_DECL_MALLOC
+void *malloc (size_t *s);
+#endif
+@end example
+
+@noindent
+You fall into the second category only in extreme situations: either
+your files may be used without being configured, or they are used during
+the configuration. In most cases the traditional approach is enough.
+
+This macro caches its results in @code{ac_cv_have_decl_@var{symbol}}
+variables, with characters not suitable for a variable name mapped to
+underscores.
+@end defmac
+
+@defmac AC_CHECK_DECLS_ONCE (@var{symbols})
+@acindex{CHECK_DECLS_ONCE}
+@cvindex HAVE_DECL_@var{symbol}
+For each of the @var{symbols} (@emph{comma}-separated list), define
+@code{HAVE_DECL_@var{symbol}} (in all capitals) to @samp{1} if
+@var{symbol} is declared in the default include files, otherwise to
+@samp{0}. This is a once-only variant of @code{AC_CHECK_DECLS}. It
+generates the checking code at most once, so that @command{configure} is
+smaller and faster; but the checks cannot be conditionalized and are
+always done once, early during the @command{configure} run.
+@end defmac
+
+
+@node Structures
+@section Structures
+@cindex Structure, checking
+
+The following macros check for the presence of certain members in C
+structures. If there is no macro specifically defined to check for a
+member you need, then you can use the general structure-member macros
+(@pxref{Generic Structures}) or, for more complex tests, you may use
+@code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}).
+
+@menu
+* Particular Structures:: Macros to check for certain structure members
+* Generic Structures:: How to find other structure members
+@end menu
+
+@node Particular Structures
+@subsection Particular Structure Checks
+
+The following macros check for certain structures or structure members.
+
+@defmac AC_STRUCT_DIRENT_D_INO
+@acindex{STRUCT_DIRENT_D_INO}
+@cvindex HAVE_STRUCT_DIRENT_D_INO
+@c @caindex header_dirent_dirent_h
+@c @caindex member_struct_dirent_d_ino
+Perform all the actions of @code{AC_HEADER_DIRENT} (@pxref{Particular
+Headers}). Then, if @code{struct dirent} contains a @code{d_ino}
+member, define @code{HAVE_STRUCT_DIRENT_D_INO}.
+
+@code{HAVE_STRUCT_DIRENT_D_INO} indicates only the presence of
+@code{d_ino}, not whether its contents are always reliable.
+Traditionally, a zero @code{d_ino} indicated a deleted directory entry,
+though current systems hide this detail from the user and never return
+zero @code{d_ino} values.
+Many current systems report an incorrect @code{d_ino} for a directory
+entry that is a mount point.
+@end defmac
+
+@defmac AC_STRUCT_DIRENT_D_TYPE
+@acindex{STRUCT_DIRENT_D_TYPE}
+@cvindex HAVE_STRUCT_DIRENT_D_TYPE
+@c @caindex header_dirent_dirent_h
+@c @caindex member_struct_dirent_d_type
+Perform all the actions of @code{AC_HEADER_DIRENT} (@pxref{Particular
+Headers}). Then, if @code{struct dirent} contains a @code{d_type}
+member, define @code{HAVE_STRUCT_DIRENT_D_TYPE}.
+@end defmac
+
+@anchor{AC_STRUCT_ST_BLOCKS}
+@defmac AC_STRUCT_ST_BLOCKS
+@acindex{STRUCT_ST_BLOCKS}
+@cvindex HAVE_STRUCT_STAT_ST_BLOCKS
+@cvindex HAVE_ST_BLOCKS
+@ovindex LIBOBJS
+@caindex member_struct_stat_st_blocks
+If @code{struct stat} contains an @code{st_blocks} member, define
+@code{HAVE_STRUCT_STAT_ST_BLOCKS}. Otherwise, require an
+@code{AC_LIBOBJ} replacement of @samp{fileblocks}. The former name,
+@code{HAVE_ST_BLOCKS} is to be avoided, as its support will cease in the
+future.
+
+This macro caches its result in the @code{ac_cv_member_struct_stat_st_blocks}
+variable.
+@end defmac
+
+@defmac AC_STRUCT_TM
+@acindex{STRUCT_TM}
+@cvindex TM_IN_SYS_TIME
+@hdrindex{time.h}
+@hdrindex{sys/time.h}
+If @file{time.h} does not define @code{struct tm}, define
+@code{TM_IN_SYS_TIME}, which means that including @file{sys/time.h}
+had better define @code{struct tm}.
+
+This macro is obsolescent, as @file{time.h} defines @code{struct tm} in
+current systems. New programs need not use this macro.
+@end defmac
+
+@anchor{AC_STRUCT_TIMEZONE}
+@defmac AC_STRUCT_TIMEZONE
+@acindex{STRUCT_TIMEZONE}
+@cvindex HAVE_DECL_TZNAME
+@cvindex HAVE_STRUCT_TM_TM_ZONE
+@cvindex HAVE_TM_ZONE
+@cvindex HAVE_TZNAME
+@c @caindex member_struct_tm_tm_zone
+@c @caindex struct_tm
+Figure out how to get the current timezone. If @code{struct tm} has a
+@code{tm_zone} member, define @code{HAVE_STRUCT_TM_TM_ZONE} (and the
+obsoleted @code{HAVE_TM_ZONE}). Otherwise, if the external array
+@code{tzname} is found, define @code{HAVE_TZNAME}; if it is declared,
+define @code{HAVE_DECL_TZNAME}.
+@end defmac
+
+@node Generic Structures
+@subsection Generic Structure Checks
+
+These macros are used to find structure members not covered by the
+``particular'' test macros.
+
+@defmac AC_CHECK_MEMBER (@var{aggregate}.@var{member}, @
+ @ovar{action-if-found}, @ovar{action-if-not-found}, @
+ @dvar{includes, AC_INCLUDES_DEFAULT})
+@acindex{CHECK_MEMBER}
+@caindex member_@var{aggregate}_@var{member}
+Check whether @var{member} is a member of the aggregate @var{aggregate}.
+If no @var{includes} are specified, the default includes are used
+(@pxref{Default Includes}).
+
+@example
+AC_CHECK_MEMBER([struct passwd.pw_gecos], [],
+ [AC_MSG_ERROR([we need `passwd.pw_gecos'])],
+ [[#include <pwd.h>]])
+@end example
+
+You can use this macro for submembers:
+
+@example
+AC_CHECK_MEMBER(struct top.middle.bot)
+@end example
+
+This macro caches its result in the
+@code{ac_cv_member_@var{aggregate}_@var{member}} variable, with
+characters not suitable for a variable name mapped to underscores.
+@end defmac
+
+@anchor{AC_CHECK_MEMBERS}
+@defmac AC_CHECK_MEMBERS (@var{members}, @ovar{action-if-found}, @
+ @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT})
+@acindex{CHECK_MEMBERS}
+@cvindex HAVE_@var{aggregate}_@var{member}
+Check for the existence of each @samp{@var{aggregate}.@var{member}} of
+@var{members} using the previous macro. When @var{member} belongs to
+@var{aggregate}, define @code{HAVE_@var{aggregate}_@var{member}} (in all
+capitals, with spaces and dots replaced by underscores). If
+@var{action-if-found} is given, it is executed for each of the found
+members. If @var{action-if-not-found} is given, it is executed for each
+of the members that could not be found.
+
+@var{includes} is a series of include directives, defaulting to
+@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used
+prior to the members under test.
+
+This macro uses M4 lists:
+@example
+AC_CHECK_MEMBERS([struct stat.st_rdev, struct stat.st_blksize])
+@end example
+@end defmac
+
+
+@node Types
+@section Types
+@cindex Types
+@cindex C types
+
+The following macros check for C types, either builtin or typedefs. If
+there is no macro specifically defined to check for a type you need, and
+you don't need to check for any special properties of it, then you can
+use a general type-check macro.
+
+@menu
+* Particular Types:: Special handling to find certain types
+* Generic Types:: How to find other types
+@end menu
+
+@node Particular Types
+@subsection Particular Type Checks
+
+@hdrindex{sys/types.h}
+@hdrindex{stdlib.h}
+@hdrindex{stdint.h}
+@hdrindex{inttypes.h}
+These macros check for particular C types in @file{sys/types.h},
+@file{stdlib.h}, @file{stdint.h}, @file{inttypes.h} and others, if they
+exist.
+
+The Gnulib @code{stdint} module is an alternate way to define many of
+these symbols; it is useful if you prefer your code to assume a
+C99-or-better environment. @xref{Gnulib}.
+
+@anchor{AC_TYPE_GETGROUPS}
+@defmac AC_TYPE_GETGROUPS
+@acindex{TYPE_GETGROUPS}
+@cvindex GETGROUPS_T
+@caindex type_getgroups
+Define @code{GETGROUPS_T} to be whichever of @code{gid_t} or @code{int}
+is the base type of the array argument to @code{getgroups}.
+
+This macro caches the base type in the @code{ac_cv_type_getgroups}
+variable.
+@end defmac
+
+@defmac AC_TYPE_INT8_T
+@acindex{TYPE_INT8_T}
+@cvindex HAVE_INT8_T
+@cvindex int8_t
+@caindex c_int8_t
+If @file{stdint.h} or @file{inttypes.h} does not define the type
+@code{int8_t}, define @code{int8_t} to a signed
+integer type that is exactly 8 bits wide and that uses two's complement
+representation, if such a type exists.
+If you are worried about porting to hosts that lack such a type, you can
+use the results of this macro in C89-or-later code as follows:
+
+@example
+#if HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#if defined INT8_MAX || defined int8_t
+ @emph{code using int8_t}
+#else
+ @emph{complicated alternative using >8-bit 'signed char'}
+#endif
+@end example
+
+This macro caches the type in the @code{ac_cv_c_int8_t} variable.
+@end defmac
+
+@defmac AC_TYPE_INT16_T
+@acindex{TYPE_INT16_T}
+@cvindex HAVE_INT16_T
+@cvindex int16_t
+@caindex c_int16_t
+This is like @code{AC_TYPE_INT8_T}, except for 16-bit integers.
+@end defmac
+
+@defmac AC_TYPE_INT32_T
+@acindex{TYPE_INT32_T}
+@cvindex HAVE_INT32_T
+@cvindex int32_t
+@caindex c_int32_t
+This is like @code{AC_TYPE_INT8_T}, except for 32-bit integers.
+@end defmac
+
+@defmac AC_TYPE_INT64_T
+@acindex{TYPE_INT64_T}
+@cvindex HAVE_INT64_T
+@cvindex int64_t
+@caindex c_int64_t
+This is like @code{AC_TYPE_INT8_T}, except for 64-bit integers.
+@end defmac
+
+@defmac AC_TYPE_INTMAX_T
+@acindex{TYPE_INTMAX_T}
+@cvindex HAVE_INTMAX_T
+@cvindex intmax_t
+@c @caindex type_intmax_t
+If @file{stdint.h} or @file{inttypes.h} defines the type @code{intmax_t},
+define @code{HAVE_INTMAX_T}. Otherwise, define @code{intmax_t} to the
+widest signed integer type.
+@end defmac
+
+@defmac AC_TYPE_INTPTR_T
+@acindex{TYPE_INTPTR_T}
+@cvindex HAVE_INTPTR_T
+@cvindex intptr_t
+@c @caindex type_intptr_t
+If @file{stdint.h} or @file{inttypes.h} defines the type @code{intptr_t},
+define @code{HAVE_INTPTR_T}. Otherwise, define @code{intptr_t} to a
+signed integer type wide enough to hold a pointer, if such a type
+exists.
+@end defmac
+
+@defmac AC_TYPE_LONG_DOUBLE
+@acindex{TYPE_LONG_DOUBLE}
+@cvindex HAVE_LONG_DOUBLE
+@caindex type_long_double
+If the C compiler supports a working @code{long double} type, define
+@code{HAVE_LONG_DOUBLE}. The @code{long double} type might have the
+same range and precision as @code{double}.
+
+This macro caches its result in the @code{ac_cv_type_long_double}
+variable.
+
+This macro is obsolescent, as current C compilers support @code{long
+double}. New programs need not use this macro.
+@end defmac
+
+@defmac AC_TYPE_LONG_DOUBLE_WIDER
+@acindex{TYPE_LONG_DOUBLE_WIDER}
+@cvindex HAVE_LONG_DOUBLE_WIDER
+@caindex type_long_double_wider
+If the C compiler supports a working @code{long double} type with more
+range or precision than the @code{double} type, define
+@code{HAVE_LONG_DOUBLE_WIDER}.
+
+This macro caches its result in the @code{ac_cv_type_long_double_wider}
+variable.
+@end defmac
+
+@defmac AC_TYPE_LONG_LONG_INT
+@acindex{TYPE_LONG_LONG_INT}
+@cvindex HAVE_LONG_LONG_INT
+@caindex type_long_long_int
+If the C compiler supports a working @code{long long int} type, define
+@code{HAVE_LONG_LONG_INT}. However, this test does not test
+@code{long long int} values in preprocessor @code{#if} expressions,
+because too many compilers mishandle such expressions.
+@xref{Preprocessor Arithmetic}.
+
+This macro caches its result in the @code{ac_cv_type_long_long_int}
+variable.
+@end defmac
+
+@defmac AC_TYPE_MBSTATE_T
+@acindex{TYPE_MBSTATE_T}
+@cvindex mbstate_t
+@hdrindex{wchar.h}
+@caindex type_mbstate_t
+Define @code{HAVE_MBSTATE_T} if @code{<wchar.h>} declares the
+@code{mbstate_t} type. Also, define @code{mbstate_t} to be a type if
+@code{<wchar.h>} does not declare it.
+
+This macro caches its result in the @code{ac_cv_type_mbstate_t}
+variable.
+@end defmac
+
+@anchor{AC_TYPE_MODE_T}
+@defmac AC_TYPE_MODE_T
+@acindex{TYPE_MODE_T}
+@cvindex mode_t
+@caindex type_mode_t
+Define @code{mode_t} to a suitable type, if standard headers do not
+define it.
+
+This macro caches its result in the @code{ac_cv_type_mode_t} variable.
+@end defmac
+
+@anchor{AC_TYPE_OFF_T}
+@defmac AC_TYPE_OFF_T
+@acindex{TYPE_OFF_T}
+@cvindex off_t
+@caindex type_off_t
+Define @code{off_t} to a suitable type, if standard headers do not
+define it.
+
+This macro caches its result in the @code{ac_cv_type_off_t} variable.
+@end defmac
+
+@anchor{AC_TYPE_PID_T}
+@defmac AC_TYPE_PID_T
+@acindex{TYPE_PID_T}
+@cvindex pid_t
+@caindex type_pid_t
+Define @code{pid_t} to a suitable type, if standard headers do not
+define it.
+
+This macro caches its result in the @code{ac_cv_type_pid_t} variable.
+@end defmac
+
+@anchor{AC_TYPE_SIZE_T}
+@defmac AC_TYPE_SIZE_T
+@acindex{TYPE_SIZE_T}
+@cvindex size_t
+@caindex type_size_t
+Define @code{size_t} to a suitable type, if standard headers do not
+define it.
+
+This macro caches its result in the @code{ac_cv_type_size_t} variable.
+@end defmac
+
+@defmac AC_TYPE_SSIZE_T
+@acindex{TYPE_SSIZE_T}
+@cvindex ssize_t
+@caindex type_ssize_t
+Define @code{ssize_t} to a suitable type, if standard headers do not
+define it.
+
+This macro caches its result in the @code{ac_cv_type_ssize_t} variable.
+@end defmac
+
+@anchor{AC_TYPE_UID_T}
+@defmac AC_TYPE_UID_T
+@acindex{TYPE_UID_T}
+@cvindex uid_t
+@cvindex gid_t
+@caindex type_uid_t
+Define @code{uid_t} and @code{gid_t} to suitable types, if standard
+headers do not define them.
+
+This macro caches its result in the @code{ac_cv_type_uid_t} variable.
+@end defmac
+
+@defmac AC_TYPE_UINT8_T
+@acindex{TYPE_UINT8_T}
+@cvindex HAVE_UINT8_T
+@cvindex uint8_t
+@caindex c_uint8_t
+If @file{stdint.h} or @file{inttypes.h} does not define the type
+@code{uint8_t}, define @code{uint8_t} to an
+unsigned integer type that is exactly 8 bits wide, if such a type
+exists.
+This is like @code{AC_TYPE_INT8_T}, except for unsigned integers.
+@end defmac
+
+@defmac AC_TYPE_UINT16_T
+@acindex{TYPE_UINT16_T}
+@cvindex HAVE_UINT16_T
+@cvindex uint16_t
+@caindex c_uint16_t
+This is like @code{AC_TYPE_UINT8_T}, except for 16-bit integers.
+@end defmac
+
+@defmac AC_TYPE_UINT32_T
+@acindex{TYPE_UINT32_T}
+@cvindex HAVE_UINT32_T
+@cvindex uint32_t
+@caindex c_uint32_t
+This is like @code{AC_TYPE_UINT8_T}, except for 32-bit integers.
+@end defmac
+
+@defmac AC_TYPE_UINT64_T
+@acindex{TYPE_UINT64_T}
+@cvindex HAVE_UINT64_T
+@cvindex uint64_t
+@caindex c_uint64_t
+This is like @code{AC_TYPE_UINT8_T}, except for 64-bit integers.
+@end defmac
+
+@defmac AC_TYPE_UINTMAX_T
+@acindex{TYPE_UINTMAX_T}
+@cvindex HAVE_UINTMAX_T
+@cvindex uintmax_t
+@c @caindex type_uintmax_t
+If @file{stdint.h} or @file{inttypes.h} defines the type @code{uintmax_t},
+define @code{HAVE_UINTMAX_T}. Otherwise, define @code{uintmax_t} to the
+widest unsigned integer type.
+@end defmac
+
+@defmac AC_TYPE_UINTPTR_T
+@acindex{TYPE_UINTPTR_T}
+@cvindex HAVE_UINTPTR_T
+@cvindex uintptr_t
+@c @caindex type_uintptr_t
+If @file{stdint.h} or @file{inttypes.h} defines the type @code{uintptr_t},
+define @code{HAVE_UINTPTR_T}. Otherwise, define @code{uintptr_t} to an
+unsigned integer type wide enough to hold a pointer, if such a type
+exists.
+@end defmac
+
+@defmac AC_TYPE_UNSIGNED_LONG_LONG_INT
+@acindex{TYPE_UNSIGNED_LONG_LONG_INT}
+@cvindex HAVE_UNSIGNED_LONG_LONG_INT
+@caindex type_unsigned_long_long_int
+If the C compiler supports a working @code{unsigned long long int} type,
+define @code{HAVE_UNSIGNED_LONG_LONG_INT}. However, this test does not test
+@code{unsigned long long int} values in preprocessor @code{#if} expressions,
+because too many compilers mishandle such expressions.
+@xref{Preprocessor Arithmetic}.
+
+This macro caches its result in the @code{ac_cv_type_unsigned_long_long_int}
+variable.
+@end defmac
+
+@node Generic Types
+@subsection Generic Type Checks
+
+These macros are used to check for types not covered by the ``particular''
+test macros.
+
+@defmac AC_CHECK_TYPE (@var{type}, @ovar{action-if-found}, @
+ @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT})
+@acindex{CHECK_TYPE}
+@caindex type_@var{type}
+Check whether @var{type} is defined. It may be a compiler builtin type
+or defined by the @var{includes}. @var{includes} is a series of include
+directives, defaulting to @code{AC_INCLUDES_DEFAULT} (@pxref{Default
+Includes}), which are used prior to the type under test.
+
+In C, @var{type} must be a type-name, so that the expression @samp{sizeof
+(@var{type})} is valid (but @samp{sizeof ((@var{type}))} is not). The
+same test is applied when compiling for C++, which means that in C++
+@var{type} should be a type-id and should not be an anonymous
+@samp{struct} or @samp{union}.
+
+This macro caches its result in the @code{ac_cv_type_@var{type}}
+variable, with @samp{*} mapped to @samp{p} and other characters not
+suitable for a variable name mapped to underscores.
+@end defmac
+
+
+@defmac AC_CHECK_TYPES (@var{types}, @ovar{action-if-found}, @
+ @ovar{action-if-not-found}, @dvar{includes, AC_INCLUDES_DEFAULT})
+@acindex{CHECK_TYPES}
+@cvindex HAVE_@var{type}
+For each @var{type} of the @var{types} that is defined, define
+@code{HAVE_@var{type}} (in all capitals). Each @var{type} must follow
+the rules of @code{AC_CHECK_TYPE}. If no @var{includes} are
+specified, the default includes are used (@pxref{Default Includes}). If
+@var{action-if-found} is given, it is additional shell code to execute
+when one of the types is found. If @var{action-if-not-found} is given,
+it is executed when one of the types is not found.
+
+This macro uses M4 lists:
+@example
+AC_CHECK_TYPES([ptrdiff_t])
+AC_CHECK_TYPES([unsigned long long int, uintmax_t])
+AC_CHECK_TYPES([float_t], [], [], [[#include <math.h>]])
+@end example
+
+@end defmac
+
+Autoconf, up to 2.13, used to provide to another version of
+@code{AC_CHECK_TYPE}, broken by design. In order to keep backward
+compatibility, a simple heuristic, quite safe but not totally, is
+implemented. In case of doubt, read the documentation of the former
+@code{AC_CHECK_TYPE}, see @ref{Obsolete Macros}.
+
+
+@node Compilers and Preprocessors
+@section Compilers and Preprocessors
+@cindex Compilers
+@cindex Preprocessors
+
+@ovindex EXEEXT
+All the tests for compilers (@code{AC_PROG_CC}, @code{AC_PROG_CXX},
+@code{AC_PROG_F77}) define the output variable @code{EXEEXT} based on
+the output of the compiler, typically to the empty string if
+Posix and @samp{.exe} if a DOS variant.
+
+@ovindex OBJEXT
+They also define the output variable @code{OBJEXT} based on the
+output of the compiler, after @file{.c} files have been excluded, typically
+to @samp{o} if Posix, @samp{obj} if a DOS variant.
+
+If the compiler being used does not produce executables, the tests fail. If
+the executables can't be run, and cross-compilation is not enabled, they
+fail too. @xref{Manual Configuration}, for more on support for cross
+compiling.
+
+@menu
+* Specific Compiler Characteristics:: Some portability issues
+* Generic Compiler Characteristics:: Language independent tests and features
+* C Compiler:: Checking its characteristics
+* C++ Compiler:: Likewise
+* Objective C Compiler:: Likewise
+* Objective C++ Compiler:: Likewise
+* Erlang Compiler and Interpreter:: Likewise
+* Fortran Compiler:: Likewise
+* Go Compiler:: Likewise
+@end menu
+
+@node Specific Compiler Characteristics
+@subsection Specific Compiler Characteristics
+
+Some compilers exhibit different behaviors.
+
+@table @asis
+@item Static/Dynamic Expressions
+Autoconf relies on a trick to extract one bit of information from the C
+compiler: using negative array sizes. For instance the following
+excerpt of a C source demonstrates how to test whether @samp{int} objects are 4
+bytes wide:
+
+@example
+static int test_array[sizeof (int) == 4 ? 1 : -1];
+@end example
+
+@noindent
+To our knowledge, there is a single compiler that does not support this
+trick: the HP C compilers (the real ones, not only the
+``bundled'') on HP-UX 11.00.
+They incorrectly reject the above program with the diagnostic
+``Variable-length arrays cannot have static storage.''
+This bug comes from HP compilers' mishandling of @code{sizeof (int)},
+not from the @code{? 1 : -1}, and
+Autoconf works around this problem by casting @code{sizeof (int)} to
+@code{long int} before comparing it.
+@end table
+
+@node Generic Compiler Characteristics
+@subsection Generic Compiler Characteristics
+
+@anchor{AC_CHECK_SIZEOF}
+@defmac AC_CHECK_SIZEOF (@var{type-or-expr}, @ovar{unused}, @
+ @dvar{includes, AC_INCLUDES_DEFAULT})
+@acindex{CHECK_SIZEOF}
+@cvindex SIZEOF_@var{type-or-expr}
+@caindex sizeof_@var{type-or-expr}
+Define @code{SIZEOF_@var{type-or-expr}} (@pxref{Standard Symbols}) to be
+the size in bytes of @var{type-or-expr}, which may be either a type or
+an expression returning a value that has a size. If the expression
+@samp{sizeof (@var{type-or-expr})} is invalid, the result is 0.
+@var{includes} is a series of include directives, defaulting to
+@code{AC_INCLUDES_DEFAULT} (@pxref{Default Includes}), which are used
+prior to the expression under test.
+
+This macro now works even when cross-compiling. The @var{unused}
+argument was used when cross-compiling.
+
+For example, the call
+
+@example
+@c If you change this example, adjust tests/semantics.at:AC_CHECK_SIZEOF struct.
+AC_CHECK_SIZEOF([int *])
+@end example
+
+@noindent
+defines @code{SIZEOF_INT_P} to be 8 on DEC Alpha AXP systems.
+
+This macro caches its result in the @code{ac_cv_sizeof_@var{type-or-expr}}
+variable, with @samp{*} mapped to @samp{p} and other characters not
+suitable for a variable name mapped to underscores.
+@end defmac
+
+@defmac AC_CHECK_ALIGNOF (@var{type}, @dvar{includes, AC_INCLUDES_DEFAULT})
+@acindex{CHECK_ALIGNOF}
+@cvindex ALIGNOF_@var{type}
+@caindex alignof_@var{type-or-expr}
+Define @code{ALIGNOF_@var{type}} (@pxref{Standard Symbols}) to be the
+alignment in bytes of @var{type}. @samp{@var{type} y;} must be valid as
+a structure member declaration. If @samp{type} is unknown, the result
+is 0. If no @var{includes} are specified, the default includes are used
+(@pxref{Default Includes}).
+
+This macro caches its result in the @code{ac_cv_alignof_@var{type-or-expr}}
+variable, with @samp{*} mapped to @samp{p} and other characters not
+suitable for a variable name mapped to underscores.
+@end defmac
+
+@defmac AC_COMPUTE_INT (@var{var}, @var{expression}, @
+ @dvar{includes, AC_INCLUDES_DEFAULT}, @ovar{action-if-fails})
+@acindex{COMPUTE_INT}
+Store into the shell variable @var{var} the value of the integer
+@var{expression}. The
+value should fit in an initializer in a C variable of type @code{signed
+long}. To support cross compilation (in which case, the macro only works on
+hosts that use twos-complement arithmetic), it should be possible to evaluate
+the expression at compile-time. If no @var{includes} are specified, the
+default includes are used (@pxref{Default Includes}).
+
+Execute @var{action-if-fails} if the value cannot be determined correctly.
+@end defmac
+
+@defmac AC_LANG_WERROR
+@acindex{LANG_WERROR}
+Normally Autoconf ignores warnings generated by the compiler, linker, and
+preprocessor. If this macro is used, warnings count as fatal
+errors for the current language. This macro is useful when the
+results of configuration are used where warnings are unacceptable; for
+instance, if parts of a program are built with the GCC
+@option{-Werror}
+option. If the whole program is built using @option{-Werror} it is
+often simpler to put @option{-Werror} in the compiler flags (@code{CFLAGS},
+etc.).
+@end defmac
+
+@defmac AC_OPENMP
+@acindex{OPENMP}
+@cvindex _OPENMP
+@ovindex OPENMP_CFLAGS
+@ovindex OPENMP_CXXFLAGS
+@ovindex OPENMP_FFLAGS
+@ovindex OPENMP_FCFLAGS
+@caindex prog_c_openmp
+@caindex prog_cxx_openmp
+@caindex prog_f77_openmp
+@caindex prog_fc_openmp
+@uref{http://@/www.openmp.org/, OpenMP} specifies extensions of C, C++,
+and Fortran that simplify optimization of shared memory parallelism,
+which is a common problem on multicore CPUs.
+
+If the current language is C, the macro @code{AC_OPENMP} sets the
+variable @code{OPENMP_CFLAGS} to the C compiler flags needed for
+supporting OpenMP@. @code{OPENMP_CFLAGS} is set to empty if the
+compiler already supports OpenMP, if it has no way to activate OpenMP
+support, or if the user rejects OpenMP support by invoking
+@samp{configure} with the @samp{--disable-openmp} option.
+
+@code{OPENMP_CFLAGS} needs to be used when compiling programs, when
+preprocessing program source, and when linking programs. Therefore you
+need to add @code{$(OPENMP_CFLAGS)} to the @code{CFLAGS} of C programs
+that use OpenMP@. If you preprocess OpenMP-specific C code, you also
+need to add @code{$(OPENMP_CFLAGS)} to @code{CPPFLAGS}. The presence of
+OpenMP support is revealed at compile time by the preprocessor macro
+@code{_OPENMP}.
+
+Linking a program with @code{OPENMP_CFLAGS} typically adds one more
+shared library to the program's dependencies, so its use is recommended
+only on programs that actually require OpenMP.
+
+If the current language is C++, @code{AC_OPENMP} sets the variable
+@code{OPENMP_CXXFLAGS}, suitably for the C++ compiler. The same remarks
+hold as for C.
+
+If the current language is Fortran 77 or Fortran, @code{AC_OPENMP} sets
+the variable @code{OPENMP_FFLAGS} or @code{OPENMP_FCFLAGS},
+respectively. Similar remarks as for C hold, except that
+@code{CPPFLAGS} is not used for Fortran, and no preprocessor macro
+signals OpenMP support.
+
+For portability, it is best to avoid spaces between @samp{#} and
+@samp{pragma omp}. That is, write @samp{#pragma omp}, not
+@samp{# pragma omp}. The Sun WorkShop 6.2 C compiler chokes on the
+latter.
+
+This macro caches its result in the @code{ac_cv_prog_c_openmp},
+@code{ac_cv_prog_cxx_openmp}, @code{ac_cv_prog_f77_openmp}, or
+@code{ac_cv_prog_fc_openmp} variable, depending on the current language.
+@end defmac
+
+@node C Compiler
+@subsection C Compiler Characteristics
+
+The following macros provide ways to find and exercise a C Compiler.
+There are a few constructs that ought to be avoided, but do not deserve
+being checked for, since they can easily be worked around.
+
+@table @asis
+@item Don't use lines containing solitary backslashes
+They tickle a bug in the HP-UX C compiler (checked on
+HP-UX 10.20,
+11.00, and 11i). When given the following source:
+
+@example
+#ifdef __STDC__
+/\
+* A comment with backslash-newlines in it. %@{ %@} *\
+\
+/
+char str[] = "\\
+" A string with backslash-newlines in it %@{ %@} \\
+"";
+char apostrophe = '\\
+\
+'\
+';
+#endif
+@end example
+
+@noindent
+the compiler incorrectly fails with the diagnostics ``Non-terminating
+comment at end of file'' and ``Missing @samp{#endif} at end of file.''
+Removing the lines with solitary backslashes solves the problem.
+
+@item Don't compile several files at once if output matters to you
+Some compilers, such as HP's, report names of files being
+compiled when given more than one file operand. For instance:
+
+@example
+$ @kbd{cc a.c b.c}
+a.c:
+b.c:
+@end example
+
+@noindent
+This can cause problems if you observe the output of the compiler to
+detect failures. Invoking @samp{cc -c a.c && cc -c b.c && cc -o c a.o
+b.o} solves the issue.
+
+@item Don't rely on @code{#error} failing
+The IRIX C compiler does not fail when #error is preprocessed; it
+simply emits a diagnostic and continues, exiting successfully. So,
+instead of an error directive like @code{#error "Unsupported word size"}
+it is more portable to use an invalid directive like @code{#Unsupported
+word size} in Autoconf tests. In ordinary source code, @code{#error} is
+OK, since installers with inadequate compilers like IRIX can simply
+examine these compilers' diagnostic output.
+
+@item Don't rely on correct @code{#line} support
+On Solaris, @command{c89} (at least Sun C 5.3 through 5.8)
+diagnoses @code{#line} directives whose line
+numbers are greater than 32767. Nothing in Posix
+makes this invalid. That is why Autoconf stopped issuing
+@code{#line} directives.
+@end table
+
+@defmac AC_PROG_CC (@ovar{compiler-search-list})
+@acindex{PROG_CC}
+@evindex CC
+@evindex CFLAGS
+@ovindex CC
+@ovindex CFLAGS
+@caindex prog_cc_c89
+Determine a C compiler to use. If @code{CC} is not already set in the
+environment, check for @code{gcc} and @code{cc}, then for other C
+compilers. Set output variable @code{CC} to the name of the compiler
+found.
+
+This macro may, however, be invoked with an optional first argument
+which, if specified, must be a blank-separated list of C compilers to
+search for. This just gives the user an opportunity to specify an
+alternative search list for the C compiler. For example, if you didn't
+like the default order, then you could invoke @code{AC_PROG_CC} like
+this:
+
+@example
+AC_PROG_CC([gcc cl cc])
+@end example
+
+If the C compiler does not handle function prototypes correctly by
+default, try to add an option to output variable @code{CC} to make it
+so. This macro tries various options that select standard-conformance
+modes on various systems.
+
+After calling this macro you can check whether the C compiler has been
+set to accept ANSI C89 (ISO C90); if not, the shell
+variable
+@code{ac_cv_prog_cc_c89} is set to @samp{no}. See also
+@code{AC_C_PROTOTYPES} below.
+
+If using the GNU C compiler, set shell variable @code{GCC} to
+@samp{yes}. If output variable @code{CFLAGS} was not already set, set
+it to @option{-g -O2} for the GNU C compiler (@option{-O2} on systems
+where GCC does not accept @option{-g}), or @option{-g} for
+other compilers. If your package does not like this default, then it is
+acceptable to insert the line @samp{: $@{CFLAGS=""@}} after @code{AC_INIT}
+and before @code{AC_PROG_CC} to select an empty default instead.
+
+Many Autoconf macros use a compiler, and thus call
+@samp{AC_REQUIRE([AC_PROG_CC])} to ensure that the compiler has been
+determined before the body of the outermost @code{AC_DEFUN} macro.
+Although @code{AC_PROG_CC} is safe to directly expand multiple times, it
+performs certain checks (such as the proper value of @env{EXEEXT}) only
+on the first invocation. Therefore, care must be used when invoking
+this macro from within another macro rather than at the top level
+(@pxref{Expanded Before Required}).
+@end defmac
+
+@anchor{AC_PROG_CC_C_O}
+@defmac AC_PROG_CC_C_O
+@acindex{PROG_CC_C_O}
+@cvindex NO_MINUS_C_MINUS_O
+@caindex prog_cc_@var{compiler}_c_o
+If the C compiler does not accept the @option{-c} and @option{-o} options
+simultaneously, define @code{NO_MINUS_C_MINUS_O}. This macro actually
+tests both the compiler found by @code{AC_PROG_CC}, and, if different,
+the first @code{cc} in the path. The test fails if one fails. This
+macro was created for GNU Make to choose the default C compilation
+rule.
+
+For the compiler @var{compiler}, this macro caches its result in the
+@code{ac_cv_prog_cc_@var{compiler}_c_o} variable.
+@end defmac
+
+
+@defmac AC_PROG_CPP
+@acindex{PROG_CPP}
+@evindex CPP
+@ovindex CPP
+Set output variable @code{CPP} to a command that runs the
+C preprocessor. If @samp{$CC -E} doesn't work, @file{/lib/cpp} is used.
+It is only portable to run @code{CPP} on files with a @file{.c}
+extension.
+
+Some preprocessors don't indicate missing include files by the error
+status. For such preprocessors an internal variable is set that causes
+other macros to check the standard error from the preprocessor and
+consider the test failed if any warnings have been reported.
+For most preprocessors, though, warnings do not cause include-file
+tests to fail unless @code{AC_PROG_CPP_WERROR} is also specified.
+@end defmac
+
+@defmac AC_PROG_CPP_WERROR
+@acindex{PROG_CPP_WERROR}
+@ovindex CPP
+This acts like @code{AC_PROG_CPP}, except it treats warnings from the
+preprocessor as errors even if the preprocessor exit status indicates
+success. This is useful for avoiding headers that generate mandatory
+warnings, such as deprecation notices.
+@end defmac
+
+
+The following macros check for C compiler or machine architecture
+features. To check for characteristics not listed here, use
+@code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}) or
+@code{AC_RUN_IFELSE} (@pxref{Runtime}).
+
+@defmac AC_PROG_CC_STDC
+@acindex{PROG_CC_STDC}
+@caindex prog_cc_stdc
+If the C compiler cannot compile ISO Standard C (currently
+C99), try to add an option to output variable @code{CC} to make it work.
+If the compiler does not support C99, fall back to supporting
+ANSI C89 (ISO C90).
+
+After calling this macro you can check whether the C compiler has been
+set to accept Standard C; if not, the shell variable
+@code{ac_cv_prog_cc_stdc} is set to @samp{no}.
+@end defmac
+
+@defmac AC_PROG_CC_C89
+@acindex{PROG_CC_C89}
+@caindex prog_cc_c89
+If the C compiler is not in ANSI C89 (ISO C90) mode by
+default, try to add an option to output variable @code{CC} to make it
+so. This macro tries various options that select ANSI C89 on
+some system or another, preferring extended functionality modes over
+strict conformance modes. It considers the compiler to be in
+ANSI C89 mode if it handles function prototypes correctly.
+
+After calling this macro you can check whether the C compiler has been
+set to accept ANSI C89; if not, the shell variable
+@code{ac_cv_prog_cc_c89} is set to @samp{no}.
+
+This macro is called automatically by @code{AC_PROG_CC}.
+@end defmac
+
+@defmac AC_PROG_CC_C99
+@acindex{PROG_CC_C99}
+@caindex prog_cc_c99
+If the C compiler is not in C99 mode by default, try to add an
+option to output variable @code{CC} to make it so. This macro tries
+various options that select C99 on some system or another, preferring
+extended functionality modes over strict conformance modes. It
+considers the compiler to be in C99 mode if it handles @code{_Bool},
+@code{//} comments, flexible array members, @code{inline}, signed and
+unsigned @code{long long int}, mixed code and declarations, named
+initialization of structs,
+@code{restrict}, @code{va_copy}, varargs macros, variable declarations
+in @code{for} loops, and variable length arrays.
+
+After calling this macro you can check whether the C compiler has been
+set to accept C99; if not, the shell variable
+@code{ac_cv_prog_cc_c99} is set to @samp{no}.
+@end defmac
+
+@defmac AC_C_BACKSLASH_A
+@acindex{C_BACKSLASH_A}
+@cvindex HAVE_C_BACKSLASH_A
+Define @samp{HAVE_C_BACKSLASH_A} to 1 if the C compiler understands
+@samp{\a}.
+
+This macro is obsolescent, as current C compilers understand @samp{\a}.
+New programs need not use this macro.
+@end defmac
+
+@anchor{AC_C_BIGENDIAN}
+@defmac AC_C_BIGENDIAN (@ovar{action-if-true}, @ovar{action-if-false}, @
+ @ovar{action-if-unknown}, @ovar{action-if-universal})
+@acindex{C_BIGENDIAN}
+@cvindex WORDS_BIGENDIAN
+@cindex Endianness
+If words are stored with the most significant byte first (like Motorola
+and SPARC CPUs), execute @var{action-if-true}. If words are stored with
+the least significant byte first (like Intel and VAX CPUs), execute
+@var{action-if-false}.
+
+This macro runs a test-case if endianness cannot be determined from the
+system header files. When cross-compiling, the test-case is not run but
+grep'ed for some magic values. @var{action-if-unknown} is executed if
+the latter case fails to determine the byte sex of the host system.
+
+In some cases a single run of a compiler can generate code for multiple
+architectures. This can happen, for example, when generating Mac OS X
+universal binary files, which work on both PowerPC and Intel
+architectures. In this case, the different variants might be for
+different architectures whose endiannesses differ. If
+@command{configure} detects this, it executes @var{action-if-universal}
+instead of @var{action-if-unknown}.
+
+The default for @var{action-if-true} is to define
+@samp{WORDS_BIGENDIAN}. The default for @var{action-if-false} is to do
+nothing. The default for @var{action-if-unknown} is to
+abort configure and tell the installer how to bypass this test.
+And finally, the default for @var{action-if-universal} is to ensure that
+@samp{WORDS_BIGENDIAN} is defined if and only if a universal build is
+detected and the current code is big-endian; this default works only if
+@command{autoheader} is used (@pxref{autoheader Invocation}).
+
+If you use this macro without specifying @var{action-if-universal}, you
+should also use @code{AC_CONFIG_HEADERS}; otherwise
+@samp{WORDS_BIGENDIAN} may be set incorrectly for Mac OS X universal
+binary files.
+@end defmac
+
+@anchor{AC_C_CONST}
+@defmac AC_C_CONST
+@acindex{C_CONST}
+@cvindex const
+@caindex c_const
+If the C compiler does not fully support the @code{const} keyword,
+define @code{const} to be empty. Some C compilers that do
+not define @code{__STDC__} do support @code{const}; some compilers that
+define @code{__STDC__} do not completely support @code{const}. Programs
+can simply use @code{const} as if every C compiler supported it; for
+those that don't, the makefile or configuration header file
+defines it as empty.
+
+Occasionally installers use a C++ compiler to compile C code, typically
+because they lack a C compiler. This causes problems with @code{const},
+because C and C++ treat @code{const} differently. For example:
+
+@example
+const int foo;
+@end example
+
+@noindent
+is valid in C but not in C++. These differences unfortunately cannot be
+papered over by defining @code{const} to be empty.
+
+If @command{autoconf} detects this situation, it leaves @code{const} alone,
+as this generally yields better results in practice. However, using a
+C++ compiler to compile C code is not recommended or supported, and
+installers who run into trouble in this area should get a C compiler
+like GCC to compile their C code.
+
+This macro caches its result in the @code{ac_cv_c_const} variable.
+
+This macro is obsolescent, as current C compilers support @code{const}.
+New programs need not use this macro.
+@end defmac
+
+@defmac AC_C_RESTRICT
+@acindex{C_RESTRICT}
+@cvindex restrict
+@caindex c_restrict
+If the C compiler recognizes a variant spelling for the @code{restrict}
+keyword (@code{__restrict}, @code{__restrict__}, or @code{_Restrict}),
+then define @code{restrict} to that; this is more likely to do the right
+thing with compilers that support language variants where plain
+@code{restrict} is not a keyword. Otherwise, if the C compiler
+recognizes the @code{restrict} keyword, don't do anything.
+Otherwise, define @code{restrict} to be empty.
+Thus, programs may simply use @code{restrict} as if every C compiler
+supported it; for those that do not, the makefile
+or configuration header defines it away.
+
+Although support in C++ for the @code{restrict} keyword is not
+required, several C++ compilers do accept the keyword.
+This macro works for them, too.
+
+This macro caches @samp{no} in the @code{ac_cv_c_restrict} variable
+if @code{restrict} is not supported, and a supported spelling otherwise.
+@end defmac
+
+@defmac AC_C_VOLATILE
+@acindex{C_VOLATILE}
+@cvindex volatile
+If the C compiler does not understand the keyword @code{volatile},
+define @code{volatile} to be empty. Programs can simply use
+@code{volatile} as if every C compiler supported it; for those that do
+not, the makefile or configuration header defines it as
+empty.
+
+If the correctness of your program depends on the semantics of
+@code{volatile}, simply defining it to be empty does, in a sense, break
+your code. However, given that the compiler does not support
+@code{volatile}, you are at its mercy anyway. At least your
+program compiles, when it wouldn't before.
+@xref{Volatile Objects}, for more about @code{volatile}.
+
+In general, the @code{volatile} keyword is a standard C feature, so
+you might expect that @code{volatile} is available only when
+@code{__STDC__} is defined. However, Ultrix 4.3's native compiler does
+support volatile, but does not define @code{__STDC__}.
+
+This macro is obsolescent, as current C compilers support @code{volatile}.
+New programs need not use this macro.
+@end defmac
+
+@anchor{AC_C_INLINE}
+@defmac AC_C_INLINE
+@acindex{C_INLINE}
+@cvindex inline
+If the C compiler supports the keyword @code{inline}, do nothing.
+Otherwise define @code{inline} to @code{__inline__} or @code{__inline}
+if it accepts one of those, otherwise define @code{inline} to be empty.
+@end defmac
+
+@anchor{AC_C_CHAR_UNSIGNED}
+@defmac AC_C_CHAR_UNSIGNED
+@acindex{C_CHAR_UNSIGNED}
+@cvindex __CHAR_UNSIGNED__
+If the C type @code{char} is unsigned, define @code{__CHAR_UNSIGNED__},
+unless the C compiler predefines it.
+
+These days, using this macro is not necessary. The same information can
+be determined by this portable alternative, thus avoiding the use of
+preprocessor macros in the namespace reserved for the implementation.
+
+@example
+#include <limits.h>
+#if CHAR_MIN == 0
+# define CHAR_UNSIGNED 1
+#endif
+@end example
+@end defmac
+
+@defmac AC_C_STRINGIZE
+@acindex{C_STRINGIZE}
+@cvindex HAVE_STRINGIZE
+If the C preprocessor supports the stringizing operator, define
+@code{HAVE_STRINGIZE}. The stringizing operator is @samp{#} and is
+found in macros such as this:
+
+@example
+#define x(y) #y
+@end example
+
+This macro is obsolescent, as current C compilers support the
+stringizing operator. New programs need not use this macro.
+@end defmac
+
+@defmac AC_C_FLEXIBLE_ARRAY_MEMBER
+@acindex{C_FLEXIBLE_ARRAY_MEMBER}
+@cvindex FLEXIBLE_ARRAY_MEMBER
+If the C compiler supports flexible array members, define
+@code{FLEXIBLE_ARRAY_MEMBER} to nothing; otherwise define it to 1.
+That way, a declaration like this:
+
+@example
+struct s
+ @{
+ size_t n_vals;
+ double val[FLEXIBLE_ARRAY_MEMBER];
+ @};
+@end example
+
+@noindent
+will let applications use the ``struct hack'' even with compilers that
+do not support flexible array members. To allocate and use such an
+object, you can use code like this:
+
+@example
+size_t i;
+size_t n = compute_value_count ();
+struct s *p =
+ malloc (offsetof (struct s, val)
+ + n * sizeof (double));
+p->n_vals = n;
+for (i = 0; i < n; i++)
+ p->val[i] = compute_value (i);
+@end example
+@end defmac
+
+@defmac AC_C_VARARRAYS
+@acindex{C_VARARRAYS}
+@cvindex HAVE_C_VARARRAYS
+If the C compiler supports variable-length arrays, define
+@code{HAVE_C_VARARRAYS}. A variable-length array is an array of automatic
+storage duration whose length is determined at run time, when the array
+is declared.
+@end defmac
+
+@defmac AC_C_TYPEOF
+@acindex{C_TYPEOF}
+@cvindex HAVE_TYPEOF
+@cvindex typeof
+If the C compiler supports GCC's @code{typeof} syntax either
+directly or
+through a different spelling of the keyword (e.g., @code{__typeof__}),
+define @code{HAVE_TYPEOF}. If the support is available only through a
+different spelling, define @code{typeof} to that spelling.
+@end defmac
+
+@defmac AC_C_PROTOTYPES
+@acindex{C_PROTOTYPES}
+@cvindex PROTOTYPES
+@cvindex __PROTOTYPES
+@cvindex PARAMS
+If function prototypes are understood by the compiler (as determined by
+@code{AC_PROG_CC}), define @code{PROTOTYPES} and @code{__PROTOTYPES}.
+Defining @code{__PROTOTYPES} is for the benefit of
+header files that cannot use macros that infringe on user name space.
+
+This macro is obsolescent, as current C compilers support prototypes.
+New programs need not use this macro.
+@end defmac
+
+@anchor{AC_PROG_GCC_TRADITIONAL}
+@defmac AC_PROG_GCC_TRADITIONAL
+@acindex{PROG_GCC_TRADITIONAL}
+@ovindex CC
+Add @option{-traditional} to output variable @code{CC} if using the
+GNU C compiler and @code{ioctl} does not work properly without
+@option{-traditional}. That usually happens when the fixed header files
+have not been installed on an old system.
+
+This macro is obsolescent, since current versions of the GNU C
+compiler fix the header files automatically when installed.
+@end defmac
+
+
+@node C++ Compiler
+@subsection C++ Compiler Characteristics
+
+
+@defmac AC_PROG_CXX (@ovar{compiler-search-list})
+@acindex{PROG_CXX}
+@evindex CXX
+@evindex CXXFLAGS
+@ovindex CXX
+@ovindex CXXFLAGS
+Determine a C++ compiler to use. Check whether the environment variable
+@code{CXX} or @code{CCC} (in that order) is set; if so, then set output
+variable @code{CXX} to its value.
+
+Otherwise, if the macro is invoked without an argument, then search for
+a C++ compiler under the likely names (first @code{g++} and @code{c++}
+then other names). If none of those checks succeed, then as a last
+resort set @code{CXX} to @code{g++}.
+
+This macro may, however, be invoked with an optional first argument
+which, if specified, must be a blank-separated list of C++ compilers to
+search for. This just gives the user an opportunity to specify an
+alternative search list for the C++ compiler. For example, if you
+didn't like the default order, then you could invoke @code{AC_PROG_CXX}
+like this:
+
+@example
+AC_PROG_CXX([gcc cl KCC CC cxx cc++ xlC aCC c++ g++])
+@end example
+
+If using the GNU C++ compiler, set shell variable @code{GXX} to
+@samp{yes}. If output variable @code{CXXFLAGS} was not already set, set
+it to @option{-g -O2} for the GNU C++ compiler (@option{-O2} on
+systems where G++ does not accept @option{-g}), or @option{-g} for other
+compilers. If your package does not like this default, then it is
+acceptable to insert the line @samp{: $@{CXXFLAGS=""@}} after @code{AC_INIT}
+and before @code{AC_PROG_CXX} to select an empty default instead.
+
+@end defmac
+
+@defmac AC_PROG_CXXCPP
+@acindex{PROG_CXXCPP}
+@evindex CXXCPP
+@ovindex CXXCPP
+Set output variable @code{CXXCPP} to a command that runs the C++
+preprocessor. If @samp{$CXX -E} doesn't work, @file{/lib/cpp} is used.
+It is portable to run @code{CXXCPP} only on files with a @file{.c},
+@file{.C}, @file{.cc}, or @file{.cpp} extension.
+
+Some preprocessors don't indicate missing include files by the error
+status. For such preprocessors an internal variable is set that causes
+other macros to check the standard error from the preprocessor and
+consider the test failed if any warnings have been reported. However,
+it is not known whether such broken preprocessors exist for C++.
+@end defmac
+
+@defmac AC_PROG_CXX_C_O
+@acindex{PROG_CXX_C_O}
+@cvindex CXX_NO_MINUS_C_MINUS_O
+Test whether the C++ compiler accepts the options @option{-c} and
+@option{-o} simultaneously, and define @code{CXX_NO_MINUS_C_MINUS_O},
+if it does not.
+@end defmac
+
+
+@node Objective C Compiler
+@subsection Objective C Compiler Characteristics
+
+
+@defmac AC_PROG_OBJC (@ovar{compiler-search-list})
+@acindex{PROG_OBJC}
+@evindex OBJC
+@evindex OBJCFLAGS
+@ovindex OBJC
+@ovindex OBJCFLAGS
+Determine an Objective C compiler to use. If @code{OBJC} is not already
+set in the environment, check for Objective C compilers. Set output
+variable @code{OBJC} to the name of the compiler found.
+
+This macro may, however, be invoked with an optional first argument
+which, if specified, must be a blank-separated list of Objective C compilers to
+search for. This just gives the user an opportunity to specify an
+alternative search list for the Objective C compiler. For example, if you
+didn't like the default order, then you could invoke @code{AC_PROG_OBJC}
+like this:
+
+@example
+AC_PROG_OBJC([gcc objcc objc])
+@end example
+
+If using the GNU Objective C compiler, set shell variable
+@code{GOBJC} to @samp{yes}. If output variable @code{OBJCFLAGS} was not
+already set, set it to @option{-g -O2} for the GNU Objective C
+compiler (@option{-O2} on systems where @command{gcc} does not accept
+@option{-g}), or @option{-g} for other compilers.
+@end defmac
+
+@defmac AC_PROG_OBJCPP
+@acindex{PROG_OBJCPP}
+@evindex OBJCPP
+@ovindex OBJCPP
+Set output variable @code{OBJCPP} to a command that runs the Objective C
+preprocessor. If @samp{$OBJC -E} doesn't work, @file{/lib/cpp} is used.
+@end defmac
+
+
+@node Objective C++ Compiler
+@subsection Objective C++ Compiler Characteristics
+
+
+@defmac AC_PROG_OBJCXX (@ovar{compiler-search-list})
+@acindex{PROG_OBJCXX}
+@evindex OBJCXX
+@evindex OBJCXXFLAGS
+@ovindex OBJCXX
+@ovindex OBJCXXFLAGS
+Determine an Objective C++ compiler to use. If @code{OBJCXX} is not already
+set in the environment, check for Objective C++ compilers. Set output
+variable @code{OBJCXX} to the name of the compiler found.
+
+This macro may, however, be invoked with an optional first argument
+which, if specified, must be a blank-separated list of Objective C++ compilers
+to search for. This just gives the user an opportunity to specify an
+alternative search list for the Objective C++ compiler. For example, if you
+didn't like the default order, then you could invoke @code{AC_PROG_OBJCXX}
+like this:
+
+@example
+AC_PROG_OBJCXX([gcc g++ objcc++ objcxx])
+@end example
+
+If using the GNU Objective C++ compiler, set shell variable
+@code{GOBJCXX} to @samp{yes}. If output variable @code{OBJCXXFLAGS} was not
+already set, set it to @option{-g -O2} for the GNU Objective C++
+compiler (@option{-O2} on systems where @command{gcc} does not accept
+@option{-g}), or @option{-g} for other compilers.
+@end defmac
+
+@defmac AC_PROG_OBJCXXCPP
+@acindex{PROG_OBJCXXCPP}
+@evindex OBJCXXCPP
+@ovindex OBJCXXCPP
+Set output variable @code{OBJCXXCPP} to a command that runs the Objective C++
+preprocessor. If @samp{$OBJCXX -E} doesn't work, @file{/lib/cpp} is used.
+@end defmac
+
+
+@node Erlang Compiler and Interpreter
+@subsection Erlang Compiler and Interpreter Characteristics
+@cindex Erlang
+
+Autoconf defines the following macros for determining paths to the essential
+Erlang/OTP programs:
+
+@defmac AC_ERLANG_PATH_ERLC (@ovar{value-if-not-found}, @dvar{path, $PATH})
+@acindex{ERLANG_PATH_ERLC}
+@evindex ERLC
+@evindex ERLCFLAGS
+@ovindex ERLC
+@ovindex ERLCFLAGS
+Determine an Erlang compiler to use. If @code{ERLC} is not already set in the
+environment, check for @command{erlc}. Set output variable @code{ERLC} to the
+complete path of the compiler command found. In addition, if @code{ERLCFLAGS}
+is not set in the environment, set it to an empty value.
+
+The two optional arguments have the same meaning as the two last arguments of
+macro @code{AC_PATH_PROG} for looking for the @command{erlc} program. For
+example, to look for @command{erlc} only in the @file{/usr/lib/erlang/bin}
+directory:
+
+@example
+AC_ERLANG_PATH_ERLC([not found], [/usr/lib/erlang/bin])
+@end example
+@end defmac
+
+@defmac AC_ERLANG_NEED_ERLC (@dvar{path, $PATH})
+@acindex{ERLANG_NEED_ERLC}
+A simplified variant of the @code{AC_ERLANG_PATH_ERLC} macro, that prints an
+error message and exits the @command{configure} script if the @command{erlc}
+program is not found.
+@end defmac
+
+@defmac AC_ERLANG_PATH_ERL (@ovar{value-if-not-found}, @dvar{path, $PATH})
+@acindex{ERLANG_PATH_ERL}
+@evindex ERL
+@ovindex ERL
+Determine an Erlang interpreter to use. If @code{ERL} is not already
+set in the
+environment, check for @command{erl}. Set output variable @code{ERL} to the
+complete path of the interpreter command found.
+
+The two optional arguments have the same meaning as the two last arguments of
+macro @code{AC_PATH_PROG} for looking for the @command{erl} program. For
+example, to look for @command{erl} only in the @file{/usr/lib/erlang/bin}
+directory:
+
+@example
+AC_ERLANG_PATH_ERL([not found], [/usr/lib/erlang/bin])
+@end example
+@end defmac
+
+@defmac AC_ERLANG_NEED_ERL (@dvar{path, $PATH})
+@acindex{ERLANG_NEED_ERL}
+A simplified variant of the @code{AC_ERLANG_PATH_ERL} macro, that prints an
+error message and exits the @command{configure} script if the @command{erl}
+program is not found.
+@end defmac
+
+
+@node Fortran Compiler
+@subsection Fortran Compiler Characteristics
+@cindex Fortran
+@cindex F77
+
+The Autoconf Fortran support is divided into two categories: legacy
+Fortran 77 macros (@code{F77}), and modern Fortran macros (@code{FC}).
+The former are intended for traditional Fortran 77 code, and have output
+variables like @code{F77}, @code{FFLAGS}, and @code{FLIBS}. The latter
+are for newer programs that can (or must) compile under the newer
+Fortran standards, and have output variables like @code{FC},
+@code{FCFLAGS}, and @code{FCLIBS}.
+
+Except for the macros @code{AC_FC_SRCEXT}, @code{AC_FC_FREEFORM},
+@code{AC_FC_FIXEDFORM}, and @code{AC_FC_LINE_LENGTH} (see below), the
+@code{FC} and @code{F77} macros behave almost identically, and so they
+are documented together in this section.
+
+
+@defmac AC_PROG_F77 (@ovar{compiler-search-list})
+@acindex{PROG_F77}
+@evindex F77
+@evindex FFLAGS
+@ovindex F77
+@ovindex FFLAGS
+@caindex f77_compiler_gnu
+@caindex prog_f77_g
+Determine a Fortran 77 compiler to use. If @code{F77} is not already
+set in the environment, then check for @code{g77} and @code{f77}, and
+then some other names. Set the output variable @code{F77} to the name
+of the compiler found.
+
+This macro may, however, be invoked with an optional first argument
+which, if specified, must be a blank-separated list of Fortran 77
+compilers to search for. This just gives the user an opportunity to
+specify an alternative search list for the Fortran 77 compiler. For
+example, if you didn't like the default order, then you could invoke
+@code{AC_PROG_F77} like this:
+
+@example
+AC_PROG_F77([fl32 f77 fort77 xlf g77 f90 xlf90])
+@end example
+
+If using @code{g77} (the GNU Fortran 77 compiler), then
+set the shell variable @code{G77} to @samp{yes}.
+If the output variable @code{FFLAGS} was not already set in the
+environment, then set it to @option{-g -02} for @code{g77} (or @option{-O2}
+where @code{g77} does not accept @option{-g}). Otherwise, set
+@code{FFLAGS} to @option{-g} for all other Fortran 77 compilers.
+
+The result of the GNU test is cached in the
+@code{ac_cv_f77_compiler_gnu} variable, acceptance of @option{-g} in the
+@code{ac_cv_prog_f77_g} variable.
+@end defmac
+
+@defmac AC_PROG_FC (@ovar{compiler-search-list}, @ovar{dialect})
+@acindex{PROG_FC}
+@evindex FC
+@evindex FCFLAGS
+@ovindex FC
+@ovindex FCFLAGS
+@caindex fc_compiler_gnu
+@caindex prog_fc_g
+Determine a Fortran compiler to use. If @code{FC} is not already set in
+the environment, then @code{dialect} is a hint to indicate what Fortran
+dialect to search for; the default is to search for the newest available
+dialect. Set the output variable @code{FC} to the name of the compiler
+found.
+
+By default, newer dialects are preferred over older dialects, but if
+@code{dialect} is specified then older dialects are preferred starting
+with the specified dialect. @code{dialect} can currently be one of
+Fortran 77, Fortran 90, or Fortran 95. However, this is only a hint of
+which compiler @emph{name} to prefer (e.g., @code{f90} or @code{f95}),
+and no attempt is made to guarantee that a particular language standard
+is actually supported. Thus, it is preferable that you avoid the
+@code{dialect} option, and use AC_PROG_FC only for code compatible with
+the latest Fortran standard.
+
+This macro may, alternatively, be invoked with an optional first argument
+which, if specified, must be a blank-separated list of Fortran
+compilers to search for, just as in @code{AC_PROG_F77}.
+
+If using @code{gfortran} or @code{g77} (the GNU Fortran compilers), then
+set the shell variable @code{GFC} to @samp{yes}.
+If the output variable @code{FCFLAGS} was not already set in the
+environment, then set it to @option{-g -02} for GNU @code{g77} (or
+@option{-O2} where @code{g77} does not accept @option{-g}). Otherwise,
+set @code{FCFLAGS} to @option{-g} for all other Fortran compilers.
+
+The result of the GNU test is cached in the @code{ac_cv_fc_compiler_gnu}
+variable, acceptance of @option{-g} in the @code{ac_cv_prog_fc_g}
+variable.
+@end defmac
+
+@defmac AC_PROG_F77_C_O
+@defmacx AC_PROG_FC_C_O
+@acindex{PROG_F77_C_O}
+@acindex{PROG_FC_C_O}
+@cvindex F77_NO_MINUS_C_MINUS_O
+@cvindex FC_NO_MINUS_C_MINUS_O
+@caindex prog_f77_c_o
+@caindex prog_fc_c_o
+Test whether the Fortran compiler accepts the options @option{-c} and
+@option{-o} simultaneously, and define @code{F77_NO_MINUS_C_MINUS_O} or
+@code{FC_NO_MINUS_C_MINUS_O}, respectively, if it does not.
+
+The result of the test is cached in the @code{ac_cv_prog_f77_c_o} or
+@code{ac_cv_prog_fc_c_o} variable, respectively.
+@end defmac
+
+The following macros check for Fortran compiler characteristics.
+To check for characteristics not listed here, use
+@code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}) or
+@code{AC_RUN_IFELSE} (@pxref{Runtime}), making sure to first set the
+current language to Fortran 77 or Fortran via @code{AC_LANG([Fortran 77])}
+or @code{AC_LANG(Fortran)} (@pxref{Language Choice}).
+
+
+@defmac AC_F77_LIBRARY_LDFLAGS
+@defmacx AC_FC_LIBRARY_LDFLAGS
+@acindex{F77_LIBRARY_LDFLAGS}
+@ovindex FLIBS
+@acindex{FC_LIBRARY_LDFLAGS}
+@ovindex FCLIBS
+@caindex prog_f77_v
+@caindex prog_fc_v
+@caindex f77_libs
+@caindex fc_libs
+Determine the linker flags (e.g., @option{-L} and @option{-l}) for the
+@dfn{Fortran intrinsic and runtime libraries} that are required to
+successfully link a Fortran program or shared library. The output
+variable @code{FLIBS} or @code{FCLIBS} is set to these flags (which
+should be included after @code{LIBS} when linking).
+
+This macro is intended to be used in those situations when it is
+necessary to mix, e.g., C++ and Fortran source code in a single
+program or shared library (@pxref{Mixing Fortran 77 With C and C++, , ,
+automake, GNU Automake}).
+
+For example, if object files from a C++ and Fortran compiler must be
+linked together, then the C++ compiler/linker must be used for linking
+(since special C++-ish things need to happen at link time like calling
+global constructors, instantiating templates, enabling exception
+support, etc.).
+
+However, the Fortran intrinsic and runtime libraries must be linked in
+as well, but the C++ compiler/linker doesn't know by default how to add
+these Fortran 77 libraries. Hence, this macro was created to determine
+these Fortran libraries.
+
+The macros @code{AC_F77_DUMMY_MAIN} and @code{AC_FC_DUMMY_MAIN} or
+@code{AC_F77_MAIN} and @code{AC_FC_MAIN} are probably also necessary to
+link C/C++ with Fortran; see below. Further, it is highly recommended
+that you use @code{AC_CONFIG_HEADERS} (@pxref{Configuration Headers})
+because the complex defines that the function wrapper macros create
+may not work with C/C++ compiler drivers.
+
+These macros internally compute the flag needed to verbose linking
+output and cache it in @code{ac_cv_prog_f77_v} or @code{ac_cv_prog_fc_v}
+variables, respectively. The computed linker flags are cached in
+@code{ac_cv_f77_libs} or @code{ac_cv_fc_libs}, respectively.
+@end defmac
+
+@defmac AC_F77_DUMMY_MAIN (@ovar{action-if-found}, @dvar{action-if-not-found, @
+ AC_MSG_FAILURE})
+@defmacx AC_FC_DUMMY_MAIN (@ovar{action-if-found}, @dvar{action-if-not-found, @
+ AC_MSG_FAILURE})
+@acindex{F77_DUMMY_MAIN}
+@cvindex F77_DUMMY_MAIN
+@acindex{FC_DUMMY_MAIN}
+@cvindex FC_DUMMY_MAIN
+@caindex f77_dummy_main
+@caindex fc_dummy_main
+With many compilers, the Fortran libraries detected by
+@code{AC_F77_LIBRARY_LDFLAGS} or @code{AC_FC_LIBRARY_LDFLAGS} provide
+their own @code{main} entry function that initializes things like
+Fortran I/O, and which then calls a user-provided entry function named
+(say) @code{MAIN__} to run the user's program. The
+@code{AC_F77_DUMMY_MAIN} and @code{AC_FC_DUMMY_MAIN} or
+@code{AC_F77_MAIN} and @code{AC_FC_MAIN} macros figure out how to deal with
+this interaction.
+
+When using Fortran for purely numerical functions (no I/O, etc.)@: often
+one prefers to provide one's own @code{main} and skip the Fortran
+library initializations. In this case, however, one may still need to
+provide a dummy @code{MAIN__} routine in order to prevent linking errors
+on some systems. @code{AC_F77_DUMMY_MAIN} or @code{AC_FC_DUMMY_MAIN}
+detects whether any such routine is @emph{required} for linking, and
+what its name is; the shell variable @code{F77_DUMMY_MAIN} or
+@code{FC_DUMMY_MAIN} holds this name, @code{unknown} when no solution
+was found, and @code{none} when no such dummy main is needed.
+
+By default, @var{action-if-found} defines @code{F77_DUMMY_MAIN} or
+@code{FC_DUMMY_MAIN} to the name of this routine (e.g., @code{MAIN__})
+@emph{if} it is required. @var{action-if-not-found} defaults to
+exiting with an error.
+
+In order to link with Fortran routines, the user's C/C++ program should
+then include the following code to define the dummy main if it is
+needed:
+
+@example
+@c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage.
+#ifdef F77_DUMMY_MAIN
+# ifdef __cplusplus
+ extern "C"
+# endif
+ int F77_DUMMY_MAIN () @{ return 1; @}
+#endif
+@end example
+
+(Replace @code{F77} with @code{FC} for Fortran instead of Fortran 77.)
+
+Note that this macro is called automatically from @code{AC_F77_WRAPPERS}
+or @code{AC_FC_WRAPPERS}; there is generally no need to call it
+explicitly unless one wants to change the default actions.
+
+The result of this macro is cached in the @code{ac_cv_f77_dummy_main} or
+@code{ac_cv_fc_dummy_main} variable, respectively.
+@end defmac
+
+@defmac AC_F77_MAIN
+@defmacx AC_FC_MAIN
+@acindex{F77_MAIN}
+@cvindex F77_MAIN
+@acindex{FC_MAIN}
+@cvindex FC_MAIN
+@caindex f77_main
+@caindex fc_main
+As discussed above, many Fortran libraries allow you to provide an entry
+point called (say) @code{MAIN__} instead of the usual @code{main}, which
+is then called by a @code{main} function in the Fortran libraries that
+initializes things like Fortran I/O@. The
+@code{AC_F77_MAIN} and @code{AC_FC_MAIN} macros detect whether it is
+@emph{possible} to utilize such an alternate main function, and defines
+@code{F77_MAIN} and @code{FC_MAIN} to the name of the function. (If no
+alternate main function name is found, @code{F77_MAIN} and @code{FC_MAIN} are
+simply defined to @code{main}.)
+
+Thus, when calling Fortran routines from C that perform things like I/O,
+one should use this macro and declare the "main" function like so:
+
+@example
+@c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage.
+#ifdef __cplusplus
+ extern "C"
+#endif
+int F77_MAIN (int argc, char *argv[]);
+@end example
+
+(Again, replace @code{F77} with @code{FC} for Fortran instead of Fortran 77.)
+
+The result of this macro is cached in the @code{ac_cv_f77_main} or
+@code{ac_cv_fc_main} variable, respectively.
+@end defmac
+
+@defmac AC_F77_WRAPPERS
+@defmacx AC_FC_WRAPPERS
+@acindex{F77_WRAPPERS}
+@cvindex F77_FUNC
+@cvindex F77_FUNC_
+@acindex{FC_WRAPPERS}
+@cvindex FC_FUNC
+@cvindex FC_FUNC_
+@caindex f77_mangling
+@caindex fc_mangling
+Defines C macros @code{F77_FUNC (name, NAME)}, @code{FC_FUNC (name, NAME)},
+@code{F77_FUNC_(name, NAME)}, and @code{FC_FUNC_(name, NAME)} to properly
+mangle the names of C/C++ identifiers, and identifiers with underscores,
+respectively, so that they match the name-mangling scheme used by the
+Fortran compiler.
+
+Fortran is case-insensitive, and in order to achieve this the Fortran
+compiler converts all identifiers into a canonical case and format. To
+call a Fortran subroutine from C or to write a C function that is
+callable from Fortran, the C program must explicitly use identifiers in
+the format expected by the Fortran compiler. In order to do this, one
+simply wraps all C identifiers in one of the macros provided by
+@code{AC_F77_WRAPPERS} or @code{AC_FC_WRAPPERS}. For example, suppose
+you have the following Fortran 77 subroutine:
+
+@example
+@c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage.
+ subroutine foobar (x, y)
+ double precision x, y
+ y = 3.14159 * x
+ return
+ end
+@end example
+
+You would then declare its prototype in C or C++ as:
+
+@example
+@c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage.
+#define FOOBAR_F77 F77_FUNC (foobar, FOOBAR)
+#ifdef __cplusplus
+extern "C" /* prevent C++ name mangling */
+#endif
+void FOOBAR_F77 (double *x, double *y);
+@end example
+
+Note that we pass both the lowercase and uppercase versions of the
+function name to @code{F77_FUNC} so that it can select the right one.
+Note also that all parameters to Fortran 77 routines are passed as
+pointers (@pxref{Mixing Fortran 77 With C and C++, , , automake, GNU
+Automake}).
+
+(Replace @code{F77} with @code{FC} for Fortran instead of Fortran 77.)
+
+Although Autoconf tries to be intelligent about detecting the
+name-mangling scheme of the Fortran compiler, there may be Fortran
+compilers that it doesn't support yet. In this case, the above code
+generates a compile-time error, but some other behavior
+(e.g., disabling Fortran-related features) can be induced by checking
+whether @code{F77_FUNC} or @code{FC_FUNC} is defined.
+
+Now, to call that routine from a C program, we would do something like:
+
+@example
+@c If you change this example, adjust tests/fortran.at:AC_F77_DUMMY_MAIN usage.
+@{
+ double x = 2.7183, y;
+ FOOBAR_F77 (&x, &y);
+@}
+@end example
+
+If the Fortran identifier contains an underscore (e.g., @code{foo_bar}),
+you should use @code{F77_FUNC_} or @code{FC_FUNC_} instead of
+@code{F77_FUNC} or @code{FC_FUNC} (with the same arguments). This is
+because some Fortran compilers mangle names differently if they contain
+an underscore.
+
+The name mangling scheme is encoded in the @code{ac_cv_f77_mangling} or
+@code{ac_cv_fc_mangling} cache variable, respectively, and also used for
+the @code{AC_F77_FUNC} and @code{AC_FC_FUNC} macros described below.
+@end defmac
+
+@defmac AC_F77_FUNC (@var{name}, @ovar{shellvar})
+@defmacx AC_FC_FUNC (@var{name}, @ovar{shellvar})
+@acindex{F77_FUNC}
+@acindex{FC_FUNC}
+Given an identifier @var{name}, set the shell variable @var{shellvar} to
+hold the mangled version @var{name} according to the rules of the
+Fortran linker (see also @code{AC_F77_WRAPPERS} or
+@code{AC_FC_WRAPPERS}). @var{shellvar} is optional; if it is not
+supplied, the shell variable is simply @var{name}. The purpose of
+this macro is to give the caller a way to access the name-mangling
+information other than through the C preprocessor as above, for example,
+to call Fortran routines from some language other than C/C++.
+@end defmac
+
+@defmac AC_FC_SRCEXT (@var{ext}, @ovar{action-if-success}, @
+ @dvar{action-if-failure, AC_MSG_FAILURE})
+@defmacx AC_FC_PP_SRCEXT (@var{ext}, @ovar{action-if-success}, @
+ @dvar{action-if-failure, AC_MSG_FAILURE})
+@acindex{FC_SRCEXT}
+@acindex{FC_PP_SRCEXT}
+@caindex fc_srcext_@var{ext}
+@caindex fc_pp_srcext_@var{ext}
+By default, the @code{FC} macros perform their tests using a @file{.f}
+extension for source-code files. Some compilers, however, only enable
+newer language features for appropriately named files, e.g., Fortran 90
+features only for @file{.f90} files, or preprocessing only with
+@file{.F} files or maybe other upper-case extensions. On the other
+hand, some other compilers expect all source files to end in @file{.f}
+and require special flags to support other file name extensions. The
+@code{AC_FC_SRCEXT} and @code{AC_FC_PP_SRCEXT} macros deal with these
+issues.
+
+The @code{AC_FC_SRCEXT} macro tries to get the @code{FC} compiler to
+accept files ending with the extension @file{.@var{ext}} (i.e.,
+@var{ext} does @emph{not} contain the dot). If any special compiler
+flags are needed for this, it stores them in the output variable
+@code{FCFLAGS_@var{ext}}. This extension and these flags are then used
+for all subsequent @code{FC} tests (until @code{AC_FC_SRCEXT} or
+@code{AC_FC_PP_SRCEXT} is called another time).
+
+For example, you would use @code{AC_FC_SRCEXT(f90)} to employ the
+@file{.f90} extension in future tests, and it would set the
+@code{FCFLAGS_f90} output variable with any extra flags that are needed
+to compile such files.
+
+Similarly, the @code{AC_FC_PP_SRCEXT} macro tries to get the @code{FC}
+compiler to preprocess and compile files with the extension
+@file{.@var{ext}}. When both @command{fpp} and @command{cpp} style
+preprocessing are provided, the former is preferred, as the latter may
+treat continuation lines, @code{//} tokens, and white space differently
+from what some Fortran dialects expect. Conversely, if you do not want
+files to be preprocessed, use only lower-case characters in the file
+name extension. Like with @code{AC_FC_SRCEXT(f90)}, any needed flags
+are stored in the @code{FCFLAGS_@var{ext}} variable.
+
+The @code{FCFLAGS_@var{ext}} flags can @emph{not} be simply absorbed
+into @code{FCFLAGS}, for two reasons based on the limitations of some
+compilers. First, only one @code{FCFLAGS_@var{ext}} can be used at a
+time, so files with different extensions must be compiled separately.
+Second, @code{FCFLAGS_@var{ext}} must appear @emph{immediately} before
+the source-code file name when compiling. So, continuing the example
+above, you might compile a @file{foo.f90} file in your makefile with the
+command:
+
+@example
+foo.o: foo.f90
+ $(FC) -c $(FCFLAGS) $(FCFLAGS_f90) '$(srcdir)/foo.f90'
+@end example
+
+If @code{AC_FC_SRCEXT} or @code{AC_FC_PP_SRCEXT} succeeds in compiling
+files with the @var{ext} extension, it calls @var{action-if-success}
+(defaults to nothing). If it fails, and cannot find a way to make the
+@code{FC} compiler accept such files, it calls @var{action-if-failure}
+(defaults to exiting with an error message).
+
+The @code{AC_FC_SRCEXT} and @code{AC_FC_PP_SRCEXT} macros cache their
+results in @code{ac_cv_fc_srcext_@var{ext}} and
+@code{ac_cv_fc_pp_srcext_@var{ext}} variables, respectively.
+@end defmac
+
+@defmac AC_FC_PP_DEFINE (@ovar{action-if-success}, @dvar{action-if-failure, @
+ AC_MSG_FAILURE})
+@acindex{FC_PP_DEFINE}
+@caindex fc_pp_define
+
+Find a flag to specify defines for preprocessed Fortran. Not all
+Fortran compilers use @option{-D}. Substitute @code{FC_DEFINE} with
+the result and call @var{action-if-success} (defaults to nothing) if
+successful, and @var{action-if-failure} (defaults to failing with an
+error message) if not.
+
+This macro calls @code{AC_FC_PP_SRCEXT([F])} in order to learn how to
+preprocess a @file{conftest.F} file, but restores a previously used
+Fortran source file extension afterwards again.
+
+The result of this test is cached in the @code{ac_cv_fc_pp_define}
+variable.
+@end defmac
+
+@defmac AC_FC_FREEFORM (@ovar{action-if-success}, @dvar{action-if-failure, @
+ AC_MSG_FAILURE})
+@acindex{FC_FREEFORM}
+@caindex fc_freeform
+
+Try to ensure that the Fortran compiler (@code{$FC}) allows free-format
+source code (as opposed to the older fixed-format style from Fortran
+77). If necessary, it may add some additional flags to @code{FCFLAGS}.
+
+This macro is most important if you are using the default @file{.f}
+extension, since many compilers interpret this extension as indicating
+fixed-format source unless an additional flag is supplied. If you
+specify a different extension with @code{AC_FC_SRCEXT}, such as
+@file{.f90}, then @code{AC_FC_FREEFORM} ordinarily succeeds without
+modifying @code{FCFLAGS}. For extensions which the compiler does not
+know about, the flag set by the @code{AC_FC_SRCEXT} macro might let
+the compiler assume Fortran 77 by default, however.
+
+If @code{AC_FC_FREEFORM} succeeds in compiling free-form source, it
+calls @var{action-if-success} (defaults to nothing). If it fails, it
+calls @var{action-if-failure} (defaults to exiting with an error
+message).
+
+The result of this test, or @samp{none} or @samp{unknown}, is cached in
+the @code{ac_cv_fc_freeform} variable.
+@end defmac
+
+@defmac AC_FC_FIXEDFORM (@ovar{action-if-success}, @dvar{action-if-failure, @
+ AC_MSG_FAILURE})
+@acindex{FC_FIXEDFORM}
+@caindex fc_fixedform
+
+Try to ensure that the Fortran compiler (@code{$FC}) allows the old
+fixed-format source code (as opposed to free-format style). If
+necessary, it may add some additional flags to @code{FCFLAGS}.
+
+This macro is needed for some compilers alias names like @command{xlf95}
+which assume free-form source code by default, and in case you want to
+use fixed-form source with an extension like @file{.f90} which many
+compilers interpret as free-form by default. If you specify a different
+extension with @code{AC_FC_SRCEXT}, such as @file{.f}, then
+@code{AC_FC_FIXEDFORM} ordinarily succeeds without modifying
+@code{FCFLAGS}.
+
+If @code{AC_FC_FIXEDFORM} succeeds in compiling fixed-form source, it
+calls @var{action-if-success} (defaults to nothing). If it fails, it
+calls @var{action-if-failure} (defaults to exiting with an error
+message).
+
+The result of this test, or @samp{none} or @samp{unknown}, is cached in
+the @code{ac_cv_fc_fixedform} variable.
+@end defmac
+
+@defmac AC_FC_LINE_LENGTH (@ovar{length}, @ovar{action-if-success}, @
+ @dvar{action-if-failure, AC_MSG_FAILURE})
+@acindex{FC_LINE_LENGTH}
+@caindex fc_line_length
+
+Try to ensure that the Fortran compiler (@code{$FC}) accepts long source
+code lines. The @var{length} argument may be given as 80, 132, or
+unlimited, and defaults to 132. Note that line lengths above 254
+columns are not portable, and some compilers do not accept more than 132
+columns at least for fixed format source. If necessary, it may add some
+additional flags to @code{FCFLAGS}.
+
+If @code{AC_FC_LINE_LENGTH} succeeds in compiling fixed-form source, it
+calls @var{action-if-success} (defaults to nothing). If it fails, it
+calls @var{action-if-failure} (defaults to exiting with an error
+message).
+
+The result of this test, or @samp{none} or @samp{unknown}, is cached in
+the @code{ac_cv_fc_line_length} variable.
+@end defmac
+
+@defmac AC_FC_CHECK_BOUNDS (@ovar{action-if-success}, @
+ @dvar{action-if-failure, AC_MSG_FAILURE})
+@acindex{FC_CHECK_BOUNDS}
+@caindex fc_check_bounds
+
+The @code{AC_FC_CHECK_BOUNDS} macro tries to enable array bounds checking
+in the Fortran compiler. If successful, the @var{action-if-success}
+is called and any needed flags are added to @code{FCFLAGS}. Otherwise,
+@var{action-if-failure} is called, which defaults to failing with an error
+message. The macro currently requires Fortran 90 or a newer dialect.
+
+The result of the macro is cached in the @code{ac_cv_fc_check_bounds}
+variable.
+@end defmac
+
+@defmac AC_F77_IMPLICIT_NONE (@ovar{action-if-success}, @
+ @dvar{action-if-failure, AC_MSG_FAILURE})
+@defmacx AC_FC_IMPLICIT_NONE (@ovar{action-if-success}, @
+ @dvar{action-if-failure, AC_MSG_FAILURE})
+@acindex{F77_IMPLICIT_NONE}
+@acindex{FC_IMPLICIT_NONE}
+@caindex f77_implicit_none
+@caindex fc_implicit_none
+
+Try to disallow implicit declarations in the Fortran compiler. If
+successful, @var{action-if-success} is called and any needed flags
+are added to @code{FFLAGS} or @code{FCFLAGS}, respectively. Otherwise,
+@var{action-if-failure} is called, which defaults to failing with an error
+message.
+
+The result of these macros are cached in the
+@code{ac_cv_f77_implicit_none} and @code{ac_cv_fc_implicit_none}
+variables, respectively.
+@end defmac
+
+@defmac AC_FC_MODULE_EXTENSION
+@acindex{FC_MODULE_EXTENSION}
+@caindex fc_module_ext
+@ovindex FC_MODEXT
+
+Find the Fortran 90 module file name extension. Most Fortran 90
+compilers store module information in files separate from the object
+files. The module files are usually named after the name of the module
+rather than the source file name, with characters possibly turned to
+upper case, plus an extension, often @file{.mod}.
+
+Not all compilers use module files at all, or by default. The Cray
+Fortran compiler requires @option{-e m} in order to store and search
+module information in @file{.mod} files rather than in object files.
+Likewise, the Fujitsu Fortran compilers uses the @option{-Am} option to
+indicate how module information is stored.
+
+The @code{AC_FC_MODULE_EXTENSION} macro computes the module extension
+without the leading dot, and stores that in the @code{FC_MODEXT}
+variable. If the compiler does not produce module files, or the
+extension cannot be determined, @code{FC_MODEXT} is empty. Typically,
+the result of this macro may be used in cleanup @command{make} rules as
+follows:
+
+@example
+clean-modules:
+ -test -z "$(FC_MODEXT)" || rm -f *.$(FC_MODEXT)
+@end example
+
+The extension, or @samp{unknown}, is cached in the
+@code{ac_cv_fc_module_ext} variable.
+@end defmac
+
+@defmac AC_FC_MODULE_FLAG (@ovar{action-if-success}, @
+ @dvar{action-if-failure, AC_MSG_FAILURE})
+@acindex{FC_MODULE_FLAG}
+@caindex fc_module_flag
+@ovindex FC_MODINC
+@ovindex ac_empty
+
+Find the compiler flag to include Fortran 90 module information from
+another directory, and store that in the @code{FC_MODINC} variable.
+Call @var{action-if-success} (defaults to nothing) if successful, and
+set @code{FC_MODINC} to empty and call @var{action-if-failure} (defaults
+to exiting with an error message) if not.
+
+Most Fortran 90 compilers provide a way to specify module directories.
+Some have separate flags for the directory to write module files to,
+and directories to search them in, whereas others only allow writing to
+the current directory or to the first directory specified in the include
+path. Further, with some compilers, the module search path and the
+preprocessor search path can only be modified with the same flag. Thus,
+for portability, write module files to the current directory only and
+list that as first directory in the search path.
+
+There may be no whitespace between @code{FC_MODINC} and the following
+directory name, but @code{FC_MODINC} may contain trailing white space.
+For example, if you use Automake and would like to search @file{../lib}
+for module files, you can use the following:
+
+@example
+AM_FCFLAGS = $(FC_MODINC). $(FC_MODINC)../lib
+@end example
+
+Inside @command{configure} tests, you can use:
+
+@example
+if test -n "$FC_MODINC"; then
+ FCFLAGS="$FCFLAGS $FC_MODINC. $FC_MODINC../lib"
+fi
+@end example
+
+The flag is cached in the @code{ac_cv_fc_module_flag} variable.
+The substituted value of @code{FC_MODINC} may refer to the
+@code{ac_empty} dummy placeholder empty variable, to avoid losing
+the significant trailing whitespace in a @file{Makefile}.
+@end defmac
+
+@defmac AC_FC_MODULE_OUTPUT_FLAG (@ovar{action-if-success}, @
+ @dvar{action-if-failure, AC_MSG_FAILURE})
+@acindex{FC_MODULE_OUTPUT_FLAG}
+@caindex fc_module_output_flag
+@ovindex FC_MODOUT
+
+Find the compiler flag to write Fortran 90 module information to
+another directory, and store that in the @code{FC_MODOUT} variable.
+Call @var{action-if-success} (defaults to nothing) if successful, and
+set @code{FC_MODOUT} to empty and call @var{action-if-failure} (defaults
+to exiting with an error message) if not.
+
+Not all Fortran 90 compilers write module files, and of those that do,
+not all allow writing to a directory other than the current one, nor
+do all have separate flags for writing and reading; see the description
+of @code{AC_FC_MODULE_FLAG} above. If you need to be able to write to
+another directory, for maximum portability use @code{FC_MODOUT} before
+any @code{FC_MODINC} and include both the current directory and the one
+you write to in the search path:
+
+@example
+AM_FCFLAGS = $(FC_MODOUT)../mod $(FC_MODINC)../mod $(FC_MODINC). @dots{}
+@end example
+
+The flag is cached in the @code{ac_cv_fc_module_output_flag} variable.
+The substituted value of @code{FC_MODOUT} may refer to the
+@code{ac_empty} dummy placeholder empty variable, to avoid losing
+the significant trailing whitespace in a @file{Makefile}.
+@end defmac
+
+
+@node Go Compiler
+@subsection Go Compiler Characteristics
+@cindex Go
+
+Autoconf provides basic support for the Go programming language when
+using the @code{gccgo} compiler (there is currently no support for the
+@code{6g} and @code{8g} compilers).
+
+@defmac AC_PROG_GO (@ovar{compiler-search-list})
+Find the Go compiler to use. Check whether the environment variable
+@code{GOC} is set; if so, then set output variable @code{GOC} to its
+value.
+
+Otherwise, if the macro is invoked without an argument, then search for
+a Go compiler named @code{gccgo}. If it is not found, then as a last
+resort set @code{GOC} to @code{gccgo}.
+
+This macro may be invoked with an optional first argument which, if
+specified, must be a blank-separated list of Go compilers to search for.
+
+If output variable @code{GOFLAGS} was not already set, set it to
+@option{-g -O2}. If your package does not like this default,
+@code{GOFLAGS} may be set before @code{AC_PROG_GO}.
+@end defmac
+
+
+@node System Services
+@section System Services
+
+The following macros check for operating system services or capabilities.
+
+@anchor{AC_PATH_X}
+@defmac AC_PATH_X
+@acindex{PATH_X}
+@evindex XMKMF
+@cindex X Window System
+Try to locate the X Window System include files and libraries. If the
+user gave the command line options @option{--x-includes=@var{dir}} and
+@option{--x-libraries=@var{dir}}, use those directories.
+
+If either or both were not given, get the missing values by running
+@code{xmkmf} (or an executable pointed to by the @code{XMKMF}
+environment variable) on a trivial @file{Imakefile} and examining the
+makefile that it produces. Setting @code{XMKMF} to @samp{false}
+disables this method.
+
+If this method fails to find the X Window System, @command{configure}
+looks for the files in several directories where they often reside.
+If either method is successful, set the shell variables
+@code{x_includes} and @code{x_libraries} to their locations, unless they
+are in directories the compiler searches by default.
+
+If both methods fail, or the user gave the command line option
+@option{--without-x}, set the shell variable @code{no_x} to @samp{yes};
+otherwise set it to the empty string.
+@end defmac
+
+@anchor{AC_PATH_XTRA}
+@defmac AC_PATH_XTRA
+@acindex{PATH_XTRA}
+@ovindex X_CFLAGS
+@ovindex X_LIBS
+@ovindex X_EXTRA_LIBS
+@ovindex X_PRE_LIBS
+@cvindex X_DISPLAY_MISSING
+An enhanced version of @code{AC_PATH_X}. It adds the C compiler flags
+that X needs to output variable @code{X_CFLAGS}, and the X linker flags
+to @code{X_LIBS}. Define @code{X_DISPLAY_MISSING} if X is not
+available.
+
+This macro also checks for special libraries that some systems need in
+order to compile X programs. It adds any that the system needs to
+output variable @code{X_EXTRA_LIBS}. And it checks for special X11R6
+libraries that need to be linked with before @option{-lX11}, and adds
+any found to the output variable @code{X_PRE_LIBS}.
+
+@c This is an incomplete kludge. Make a real way to do it.
+@c If you need to check for other X functions or libraries yourself, then
+@c after calling this macro, add the contents of @code{X_EXTRA_LIBS} to
+@c @code{LIBS} temporarily, like this: (FIXME - add example)
+@end defmac
+
+@anchor{AC_SYS_INTERPRETER}
+@defmac AC_SYS_INTERPRETER
+@acindex{SYS_INTERPRETER}
+Check whether the system supports starting scripts with a line of the
+form @samp{#!/bin/sh} to select the interpreter to use for the script.
+After running this macro, shell code in @file{configure.ac} can check
+the shell variable @code{interpval}; it is set to @samp{yes}
+if the system supports @samp{#!}, @samp{no} if not.
+@end defmac
+
+@defmac AC_SYS_LARGEFILE
+@acindex{SYS_LARGEFILE}
+@cvindex _FILE_OFFSET_BITS
+@cvindex _LARGE_FILES
+@ovindex CC
+@cindex Large file support
+@cindex LFS
+Arrange for 64-bit file offsets, known as
+@uref{http://@/www.unix-systems@/.org/@/version2/@/whatsnew/@/lfs20mar.html,
+large-file support}. On some hosts, one must use special compiler
+options to build programs that can access large files. Append any such
+options to the output variable @code{CC}. Define
+@code{_FILE_OFFSET_BITS} and @code{_LARGE_FILES} if necessary.
+
+Large-file support can be disabled by configuring with the
+@option{--disable-largefile} option.
+
+If you use this macro, check that your program works even when
+@code{off_t} is wider than @code{long int}, since this is common when
+large-file support is enabled. For example, it is not correct to print
+an arbitrary @code{off_t} value @code{X} with @code{printf ("%ld",
+(long int) X)}.
+
+The LFS introduced the @code{fseeko} and @code{ftello} functions to
+replace their C counterparts @code{fseek} and @code{ftell} that do not
+use @code{off_t}. Take care to use @code{AC_FUNC_FSEEKO} to make their
+prototypes available when using them and large-file support is
+enabled.
+@end defmac
+
+@anchor{AC_SYS_LONG_FILE_NAMES}
+@defmac AC_SYS_LONG_FILE_NAMES
+@acindex{SYS_LONG_FILE_NAMES}
+@cvindex HAVE_LONG_FILE_NAMES
+If the system supports file names longer than 14 characters, define
+@code{HAVE_LONG_FILE_NAMES}.
+@end defmac
+
+@defmac AC_SYS_POSIX_TERMIOS
+@acindex{SYS_POSIX_TERMIOS}
+@cindex Posix termios headers
+@cindex termios Posix headers
+@caindex sys_posix_termios
+Check to see if the Posix termios headers and functions are available on the
+system. If so, set the shell variable @code{ac_cv_sys_posix_termios} to
+@samp{yes}. If not, set the variable to @samp{no}.
+@end defmac
+
+@node Posix Variants
+@section Posix Variants
+
+The following macro makes it possible to use features of Posix that are
+extensions to C, as well as platform extensions not defined by Posix.
+
+@anchor{AC_USE_SYSTEM_EXTENSIONS}
+@defmac AC_USE_SYSTEM_EXTENSIONS
+@acindex{USE_SYSTEM_EXTENSIONS}
+@cvindex _ALL_SOURCE
+@cvindex _GNU_SOURCE
+@cvindex _MINIX
+@cvindex _POSIX_1_SOURCE
+@cvindex _POSIX_PTHREAD_SEMANTICS
+@cvindex _POSIX_SOURCE
+@cvindex _TANDEM_SOURCE
+@cvindex __EXTENSIONS__
+This macro was introduced in Autoconf 2.60. If possible, enable
+extensions to C or Posix on hosts that normally disable the extensions,
+typically due to standards-conformance namespace issues. This should be
+called before any macros that run the C compiler. The following
+preprocessor macros are defined where appropriate:
+
+@table @code
+@item _GNU_SOURCE
+Enable extensions on GNU/Linux.
+@item __EXTENSIONS__
+Enable general extensions on Solaris.
+@item _POSIX_PTHREAD_SEMANTICS
+Enable threading extensions on Solaris.
+@item _TANDEM_SOURCE
+Enable extensions for the HP NonStop platform.
+@item _ALL_SOURCE
+Enable extensions for AIX 3, and for Interix.
+@item _POSIX_SOURCE
+Enable Posix functions for Minix.
+@item _POSIX_1_SOURCE
+Enable additional Posix functions for Minix.
+@item _MINIX
+Identify Minix platform. This particular preprocessor macro is
+obsolescent, and may be removed in a future release of Autoconf.
+@end table
+@end defmac
+
+
+@node Erlang Libraries
+@section Erlang Libraries
+@cindex Erlang, Library, checking
+
+The following macros check for an installation of Erlang/OTP, and for the
+presence of certain Erlang libraries. All those macros require the
+configuration of an Erlang interpreter and an Erlang compiler
+(@pxref{Erlang Compiler and Interpreter}).
+
+@defmac AC_ERLANG_SUBST_ERTS_VER
+@acindex{ERLANG_SUBST_ERTS_VER}
+@ovindex ERLANG_ERTS_VER
+Set the output variable @code{ERLANG_ERTS_VER} to the version of the
+Erlang runtime system (as returned by Erlang's
+@code{erlang:system_info(version)} function). The result of this test
+is cached if caching is enabled when running @command{configure}. The
+@code{ERLANG_ERTS_VER} variable is not intended to be used for testing
+for features of specific ERTS versions, but to be used for substituting
+the ERTS version in Erlang/OTP release resource files (@code{.rel}
+files), as shown below.
+@end defmac
+
+@defmac AC_ERLANG_SUBST_ROOT_DIR
+@acindex{ERLANG_SUBST_ROOT_DIR}
+@ovindex ERLANG_ROOT_DIR
+Set the output variable @code{ERLANG_ROOT_DIR} to the path to the base
+directory in which Erlang/OTP is installed (as returned by Erlang's
+@code{code:root_dir/0} function). The result of this test is cached if
+caching is enabled when running @command{configure}.
+@end defmac
+
+@defmac AC_ERLANG_SUBST_LIB_DIR
+@acindex{ERLANG_SUBST_LIB_DIR}
+@ovindex ERLANG_LIB_DIR
+Set the output variable @code{ERLANG_LIB_DIR} to the path of the library
+directory of Erlang/OTP (as returned by Erlang's
+@code{code:lib_dir/0} function), which subdirectories each contain an installed
+Erlang/OTP library. The result of this test is cached if caching is enabled
+when running @command{configure}.
+@end defmac
+
+@defmac AC_ERLANG_CHECK_LIB (@var{library}, @ovar{action-if-found}, @
+ @ovar{action-if-not-found})
+@acindex{ERLANG_CHECK_LIB}
+@ovindex ERLANG_LIB_DIR_@var{library}
+@ovindex ERLANG_LIB_VER_@var{library}
+Test whether the Erlang/OTP library @var{library} is installed by
+calling Erlang's @code{code:lib_dir/1} function. The result of this
+test is cached if caching is enabled when running @command{configure}.
+@var{action-if-found} is a list of shell commands to run if the library
+is installed; @var{action-if-not-found} is a list of shell commands to
+run if it is not. Additionally, if the library is installed, the output
+variable @samp{ERLANG_LIB_DIR_@var{library}} is set to the path to the
+library installation directory, and the output variable
+@samp{ERLANG_LIB_VER_@var{library}} is set to the version number that is
+part of the subdirectory name, if it is in the standard form
+(@code{@var{library}-@var{version}}). If the directory name does not
+have a version part, @samp{ERLANG_LIB_VER_@var{library}} is set to the
+empty string. If the library is not installed,
+@samp{ERLANG_LIB_DIR_@var{library}} and
+@samp{ERLANG_LIB_VER_@var{library}} are set to @code{"not found"}. For
+example, to check if library @code{stdlib} is installed:
+
+@example
+AC_ERLANG_CHECK_LIB([stdlib],
+ [echo "stdlib version \"$ERLANG_LIB_VER_stdlib\""
+ echo "is installed in \"$ERLANG_LIB_DIR_stdlib\""],
+ [AC_MSG_ERROR([stdlib was not found!])])
+@end example
+
+The @samp{ERLANG_LIB_VER_@var{library}} variables (set by
+@code{AC_ERLANG_CHECK_LIB}) and the @code{ERLANG_ERTS_VER} variable (set
+by @code{AC_ERLANG_SUBST_ERTS_VER}) are not intended to be used for
+testing for features of specific versions of libraries or of the Erlang
+runtime system. Those variables are intended to be substituted in
+Erlang release resource files (@code{.rel} files). For instance, to
+generate a @file{example.rel} file for an application depending on the
+@code{stdlib} library, @file{configure.ac} could contain:
+
+@example
+AC_ERLANG_SUBST_ERTS_VER
+AC_ERLANG_CHECK_LIB([stdlib],
+ [],
+ [AC_MSG_ERROR([stdlib was not found!])])
+AC_CONFIG_FILES([example.rel])
+@end example
+
+@noindent
+The @file{example.rel.in} file used to generate @file{example.rel}
+should contain:
+
+@example
+@{release,
+ @{"@@PACKAGE@@", "@@VERSION@@"@},
+ @{erts, "@@ERLANG_ERTS_VER@@"@},
+ [@{stdlib, "@@ERLANG_LIB_VER_stdlib@@"@},
+ @{@@PACKAGE@@, "@@VERSION@@"@}]@}.
+@end example
+@end defmac
+
+In addition to the above macros, which test installed Erlang libraries, the
+following macros determine the paths to the directories into which newly built
+Erlang libraries are to be installed:
+
+@defmac AC_ERLANG_SUBST_INSTALL_LIB_DIR
+@acindex{ERLANG_SUBST_INSTALL_LIB_DIR}
+@ovindex ERLANG_INSTALL_LIB_DIR
+
+Set the @code{ERLANG_INSTALL_LIB_DIR} output variable to the directory into
+which every built Erlang library should be installed in a separate
+subdirectory.
+If this variable is not set in the environment when @command{configure} runs,
+its default value is @code{$@{libdir@}/erlang/lib}.
+@end defmac
+
+@defmac AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR (@var{library}, @var{version})
+@acindex{ERLANG_SUBST_INSTALL_LIB_SUBDIR}
+@ovindex ERLANG_INSTALL_LIB_DIR_@var{library}
+
+Set the @samp{ERLANG_INSTALL_LIB_DIR_@var{library}} output variable to the
+directory into which the built Erlang library @var{library} version
+@var{version} should be installed. If this variable is not set in the
+environment when @command{configure} runs, its default value is
+@samp{$ERLANG_INSTALL_LIB_DIR/@var{library}-@var{version}}, the value of the
+@code{ERLANG_INSTALL_LIB_DIR} variable being set by the
+@code{AC_ERLANG_SUBST_INSTALL_LIB_DIR} macro.
+@end defmac
+
+
+
+
+
+@c ========================================================= Writing Tests
+
+@node Writing Tests
+@chapter Writing Tests
+
+If the existing feature tests don't do something you need, you have to
+write new ones. These macros are the building blocks. They provide
+ways for other macros to check whether various kinds of features are
+available and report the results.
+
+This chapter contains some suggestions and some of the reasons why the
+existing tests are written the way they are. You can also learn a lot
+about how to write Autoconf tests by looking at the existing ones. If
+something goes wrong in one or more of the Autoconf tests, this
+information can help you understand the assumptions behind them, which
+might help you figure out how to best solve the problem.
+
+These macros check the output of the compiler system of the current
+language (@pxref{Language Choice}). They do not cache the results of
+their tests for future use (@pxref{Caching Results}), because they don't
+know enough about the information they are checking for to generate a
+cache variable name. They also do not print any messages, for the same
+reason. The checks for particular kinds of features call these macros
+and do cache their results and print messages about what they're
+checking for.
+
+When you write a feature test that could be applicable to more than one
+software package, the best thing to do is encapsulate it in a new macro.
+@xref{Writing Autoconf Macros}, for how to do that.
+
+@menu
+* Language Choice:: Selecting which language to use for testing
+* Writing Test Programs:: Forging source files for compilers
+* Running the Preprocessor:: Detecting preprocessor symbols
+* Running the Compiler:: Detecting language or header features
+* Running the Linker:: Detecting library features
+* Runtime:: Testing for runtime features
+* Systemology:: A zoology of operating systems
+* Multiple Cases:: Tests for several possible values
+@end menu
+
+@node Language Choice
+@section Language Choice
+@cindex Language
+
+Autoconf-generated @command{configure} scripts check for the C compiler and
+its features by default. Packages that use other programming languages
+(maybe more than one, e.g., C and C++) need to test features of the
+compilers for the respective languages. The following macros determine
+which programming language is used in the subsequent tests in
+@file{configure.ac}.
+
+@anchor{AC_LANG}
+@defmac AC_LANG (@var{language})
+@acindex{LANG}
+Do compilation tests using the compiler, preprocessor, and file
+extensions for the specified @var{language}.
+
+Supported languages are:
+
+@table @samp
+@item C
+Do compilation tests using @code{CC} and @code{CPP} and use extension
+@file{.c} for test programs. Use compilation flags: @code{CPPFLAGS} with
+@code{CPP}, and both @code{CPPFLAGS} and @code{CFLAGS} with @code{CC}.
+
+@item C++
+Do compilation tests using @code{CXX} and @code{CXXCPP} and use
+extension @file{.C} for test programs. Use compilation flags:
+@code{CPPFLAGS} with @code{CXXCPP}, and both @code{CPPFLAGS} and
+@code{CXXFLAGS} with @code{CXX}.
+
+@item Fortran 77
+Do compilation tests using @code{F77} and use extension @file{.f} for
+test programs. Use compilation flags: @code{FFLAGS}.
+
+@item Fortran
+Do compilation tests using @code{FC} and use extension @file{.f} (or
+whatever has been set by @code{AC_FC_SRCEXT}) for test programs. Use
+compilation flags: @code{FCFLAGS}.
+
+@item Erlang
+@ovindex ERLC
+@ovindex ERL
+@ovindex ERLCFLAGS
+Compile and execute tests using @code{ERLC} and @code{ERL} and use extension
+@file{.erl} for test Erlang modules. Use compilation flags: @code{ERLCFLAGS}.
+
+@item Objective C
+Do compilation tests using @code{OBJC} and @code{OBJCPP} and use
+extension @file{.m} for test programs. Use compilation flags:
+@code{CPPFLAGS} with @code{OBJCPP}, and both @code{CPPFLAGS} and
+@code{OBJCFLAGS} with @code{OBJC}.
+
+@item Objective C++
+Do compilation tests using @code{OBJCXX} and @code{OBJCXXCPP} and use
+extension @file{.mm} for test programs. Use compilation flags:
+@code{CPPFLAGS} with @code{OBJCXXCPP}, and both @code{CPPFLAGS} and
+@code{OBJCXXFLAGS} with @code{OBJCXX}.
+
+@item Go
+Do compilation tests using @code{GOC} and use extension @file{.go} for
+test programs. Use compilation flags @code{GOFLAGS}.
+@end table
+@end defmac
+
+@anchor{AC_LANG_PUSH}
+@defmac AC_LANG_PUSH (@var{language})
+@acindex{LANG_PUSH}
+Remember the current language (as set by @code{AC_LANG}) on a stack, and
+then select the @var{language}. Use this macro and @code{AC_LANG_POP}
+in macros that need to temporarily switch to a particular language.
+@end defmac
+
+@defmac AC_LANG_POP (@ovar{language})
+@acindex{LANG_POP}
+Select the language that is saved on the top of the stack, as set by
+@code{AC_LANG_PUSH}, and remove it from the stack.
+
+If given, @var{language} specifies the language we just @emph{quit}. It
+is a good idea to specify it when it's known (which should be the
+case@dots{}), since Autoconf detects inconsistencies.
+
+@example
+AC_LANG_PUSH([Fortran 77])
+# Perform some tests on Fortran 77.
+# @dots{}
+AC_LANG_POP([Fortran 77])
+@end example
+@end defmac
+
+@defmac AC_LANG_ASSERT (@var{language})
+@acindex{LANG_ASSERT}
+Check statically that the current language is @var{language}.
+You should use this in your language specific macros
+to avoid that they be called with an inappropriate language.
+
+This macro runs only at @command{autoconf} time, and incurs no cost at
+@command{configure} time. Sadly enough and because Autoconf is a two
+layer language @footnote{Because M4 is not aware of Sh code,
+especially conditionals, some optimizations that look nice statically
+may produce incorrect results at runtime.}, the macros
+@code{AC_LANG_PUSH} and @code{AC_LANG_POP} cannot be ``optimizing'',
+therefore as much as possible you ought to avoid using them to wrap
+your code, rather, require from the user to run the macro with a
+correct current language, and check it with @code{AC_LANG_ASSERT}.
+And anyway, that may help the user understand she is running a Fortran
+macro while expecting a result about her Fortran 77 compiler@enddots{}
+@end defmac
+
+
+@defmac AC_REQUIRE_CPP
+@acindex{REQUIRE_CPP}
+Ensure that whichever preprocessor would currently be used for tests has
+been found. Calls @code{AC_REQUIRE} (@pxref{Prerequisite Macros}) with an
+argument of either @code{AC_PROG_CPP} or @code{AC_PROG_CXXCPP},
+depending on which language is current.
+@end defmac
+
+
+@node Writing Test Programs
+@section Writing Test Programs
+
+Autoconf tests follow a common scheme: feed some program with some
+input, and most of the time, feed a compiler with some source file.
+This section is dedicated to these source samples.
+
+@menu
+* Guidelines:: General rules for writing test programs
+* Test Functions:: Avoiding pitfalls in test programs
+* Generating Sources:: Source program boilerplate
+@end menu
+
+@node Guidelines
+@subsection Guidelines for Test Programs
+
+The most important rule to follow when writing testing samples is:
+
+@center @emph{Look for realism.}
+
+This motto means that testing samples must be written with the same
+strictness as real programs are written. In particular, you should
+avoid ``shortcuts'' and simplifications.
+
+Don't just play with the preprocessor if you want to prepare a
+compilation. For instance, using @command{cpp} to check whether a header is
+functional might let your @command{configure} accept a header which
+causes some @emph{compiler} error. Do not hesitate to check a header with
+other headers included before, especially required headers.
+
+Make sure the symbols you use are properly defined, i.e., refrain from
+simply declaring a function yourself instead of including the proper
+header.
+
+Test programs should not write to standard output. They
+should exit with status 0 if the test succeeds, and with status 1
+otherwise, so that success
+can be distinguished easily from a core dump or other failure;
+segmentation violations and other failures produce a nonzero exit
+status. Unless you arrange for @code{exit} to be declared, test
+programs should @code{return}, not @code{exit}, from @code{main},
+because on many systems @code{exit} is not declared by default.
+
+Test programs can use @code{#if} or @code{#ifdef} to check the values of
+preprocessor macros defined by tests that have already run. For
+example, if you call @code{AC_HEADER_STDBOOL}, then later on in
+@file{configure.ac} you can have a test program that includes
+@file{stdbool.h} conditionally:
+
+@example
+@group
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#endif
+@end group
+@end example
+
+Both @code{#if HAVE_STDBOOL_H} and @code{#ifdef HAVE_STDBOOL_H} will
+work with any standard C compiler. Some developers prefer @code{#if}
+because it is easier to read, while others prefer @code{#ifdef} because
+it avoids diagnostics with picky compilers like GCC with the
+@option{-Wundef} option.
+
+If a test program needs to use or create a data file, give it a name
+that starts with @file{conftest}, such as @file{conftest.data}. The
+@command{configure} script cleans up by running @samp{rm -f -r conftest*}
+after running test programs and if the script is interrupted.
+
+@node Test Functions
+@subsection Test Functions
+
+These days it's safe to assume support for function prototypes
+(introduced in C89).
+
+Functions that test programs declare should also be conditionalized for
+C++, which requires @samp{extern "C"} prototypes. Make sure to not
+include any header files containing clashing prototypes.
+
+@example
+#ifdef __cplusplus
+extern "C"
+#endif
+void *valloc (size_t);
+@end example
+
+If a test program calls a function with invalid parameters (just to see
+whether it exists), organize the program to ensure that it never invokes
+that function. You can do this by calling it in another function that is
+never invoked. You can't do it by putting it after a call to
+@code{exit}, because GCC version 2 knows that @code{exit}
+never returns
+and optimizes out any code that follows it in the same block.
+
+If you include any header files, be sure to call the functions
+relevant to them with the correct number of arguments, even if they are
+just 0, to avoid compilation errors due to prototypes. GCC
+version 2
+has internal prototypes for several functions that it automatically
+inlines; for example, @code{memcpy}. To avoid errors when checking for
+them, either pass them the correct number of arguments or redeclare them
+with a different return type (such as @code{char}).
+
+
+@node Generating Sources
+@subsection Generating Sources
+
+Autoconf provides a set of macros that can be used to generate test
+source files. They are written to be language generic, i.e., they
+actually depend on the current language (@pxref{Language Choice}) to
+``format'' the output properly.
+
+
+@defmac AC_LANG_CONFTEST (@var{source})
+@acindex{LANG_CONFTEST}
+Save the @var{source} text in the current test source file:
+@file{conftest.@var{extension}} where the @var{extension} depends on the
+current language. As of Autoconf 2.63b, the source file also contains
+the results of all of the @code{AC_DEFINE} performed so far.
+
+Note that the @var{source} is evaluated exactly once, like regular
+Autoconf macro arguments, and therefore (i) you may pass a macro
+invocation, (ii) if not, be sure to double quote if needed.
+
+This macro issues a warning during @command{autoconf} processing if
+@var{source} does not include an expansion of the macro
+@code{AC_LANG_DEFINES_PROVIDED} (note that both @code{AC_LANG_SOURCE} and
+@code{AC_LANG_PROGRAM} call this macro, and thus avoid the warning).
+
+This macro is seldom called directly, but is used under the hood by more
+common macros such as @code{AC_COMPILE_IFELSE} and @code{AC_RUN_IFELSE}.
+@end defmac
+
+@defmac AC_LANG_DEFINES_PROVIDED
+@acindex{LANG_DEFINES_PROVIDED}
+This macro is called as a witness that the file
+@file{conftest.@var{extension}} appropriate for the current language is
+complete, including all previously determined results from
+@code{AC_DEFINE}. This macro is seldom called directly, but exists if
+you have a compelling reason to write a conftest file without using
+@code{AC_LANG_SOURCE}, yet still want to avoid a syntax warning from
+@code{AC_LANG_CONFTEST}.
+@end defmac
+
+@defmac AC_LANG_SOURCE (@var{source})
+@acindex{LANG_SOURCE}
+Expands into the @var{source}, with the definition of
+all the @code{AC_DEFINE} performed so far. This macro includes an
+expansion of @code{AC_LANG_DEFINES_PROVIDED}.
+
+In many cases, you may find it more convenient to use the wrapper
+@code{AC_LANG_PROGRAM}.
+@end defmac
+
+For instance, executing (observe the double quotation!):
+
+@example
+@c If you change this example, adjust tests/compile.at:AC_LANG_SOURCE example.
+AC_INIT([Hello], [1.0], [bug-hello@@example.org], [],
+ [http://www.example.org/])
+AC_DEFINE([HELLO_WORLD], ["Hello, World\n"],
+ [Greetings string.])
+AC_LANG([C])
+AC_LANG_CONFTEST(
+ [AC_LANG_SOURCE([[const char hw[] = "Hello, World\n";]])])
+gcc -E -dD conftest.c
+@end example
+
+@noindent
+on a system with @command{gcc} installed, results in:
+
+@example
+@c If you change this example, adjust tests/compile.at:AC_LANG_SOURCE example.
+@dots{}
+# 1 "conftest.c"
+
+#define PACKAGE_NAME "Hello"
+#define PACKAGE_TARNAME "hello"
+#define PACKAGE_VERSION "1.0"
+#define PACKAGE_STRING "Hello 1.0"
+#define PACKAGE_BUGREPORT "bug-hello@@example.org"
+#define PACKAGE_URL "http://www.example.org/"
+#define HELLO_WORLD "Hello, World\n"
+
+const char hw[] = "Hello, World\n";
+@end example
+
+When the test language is Fortran, Erlang, or Go, the @code{AC_DEFINE}
+definitions are not automatically translated into constants in the
+source code by this macro.
+
+@defmac AC_LANG_PROGRAM (@var{prologue}, @var{body})
+@acindex{LANG_PROGRAM}
+Expands into a source file which consists of the @var{prologue}, and
+then @var{body} as body of the main function (e.g., @code{main} in
+C). Since it uses @code{AC_LANG_SOURCE}, the features of the latter are
+available.
+@end defmac
+
+For instance:
+
+@example
+@c If you change this example, adjust tests/compile.at:AC_LANG_PROGRAM example.
+AC_INIT([Hello], [1.0], [bug-hello@@example.org], [],
+ [http://www.example.org/])
+AC_DEFINE([HELLO_WORLD], ["Hello, World\n"],
+ [Greetings string.])
+AC_LANG_CONFTEST(
+[AC_LANG_PROGRAM([[const char hw[] = "Hello, World\n";]],
+ [[fputs (hw, stdout);]])])
+gcc -E -dD conftest.c
+@end example
+
+@noindent
+on a system with @command{gcc} installed, results in:
+
+@example
+@c If you change this example, adjust tests/compile.at:AC_LANG_PROGRAM example.
+@dots{}
+# 1 "conftest.c"
+
+#define PACKAGE_NAME "Hello"
+#define PACKAGE_TARNAME "hello"
+#define PACKAGE_VERSION "1.0"
+#define PACKAGE_STRING "Hello 1.0"
+#define PACKAGE_BUGREPORT "bug-hello@@example.org"
+#define PACKAGE_URL "http://www.example.org/"
+#define HELLO_WORLD "Hello, World\n"
+
+const char hw[] = "Hello, World\n";
+int
+main ()
+@{
+fputs (hw, stdout);
+ ;
+ return 0;
+@}
+@end example
+
+In Erlang tests, the created source file is that of an Erlang module called
+@code{conftest} (@file{conftest.erl}). This module defines and exports
+at least
+one @code{start/0} function, which is called to perform the test. The
+@var{prologue} is optional code that is inserted between the module header and
+the @code{start/0} function definition. @var{body} is the body of the
+@code{start/0} function without the final period (@pxref{Runtime}, about
+constraints on this function's behavior).
+
+For instance:
+
+@example
+AC_INIT([Hello], [1.0], [bug-hello@@example.org])
+AC_LANG(Erlang)
+AC_LANG_CONFTEST(
+[AC_LANG_PROGRAM([[-define(HELLO_WORLD, "Hello, world!").]],
+ [[io:format("~s~n", [?HELLO_WORLD])]])])
+cat conftest.erl
+@end example
+
+@noindent
+results in:
+
+@example
+-module(conftest).
+-export([start/0]).
+-define(HELLO_WORLD, "Hello, world!").
+start() ->
+io:format("~s~n", [?HELLO_WORLD])
+.
+@end example
+
+@defmac AC_LANG_CALL (@var{prologue}, @var{function})
+@acindex{LANG_CALL}
+Expands into a source file which consists of the @var{prologue}, and
+then a call to the @var{function} as body of the main function (e.g.,
+@code{main} in C). Since it uses @code{AC_LANG_PROGRAM}, the feature
+of the latter are available.
+
+This function will probably be replaced in the future by a version
+which would enable specifying the arguments. The use of this macro is
+not encouraged, as it violates strongly the typing system.
+
+This macro cannot be used for Erlang tests.
+@end defmac
+
+@defmac AC_LANG_FUNC_LINK_TRY (@var{function})
+@acindex{LANG_FUNC_LINK_TRY}
+Expands into a source file which uses the @var{function} in the body of
+the main function (e.g., @code{main} in C). Since it uses
+@code{AC_LANG_PROGRAM}, the features of the latter are available.
+
+As @code{AC_LANG_CALL}, this macro is documented only for completeness.
+It is considered to be severely broken, and in the future will be
+removed in favor of actual function calls (with properly typed
+arguments).
+
+This macro cannot be used for Erlang tests.
+@end defmac
+
+@node Running the Preprocessor
+@section Running the Preprocessor
+
+Sometimes one might need to run the preprocessor on some source file.
+@emph{Usually it is a bad idea}, as you typically need to @emph{compile}
+your project, not merely run the preprocessor on it; therefore you
+certainly want to run the compiler, not the preprocessor. Resist the
+temptation of following the easiest path.
+
+Nevertheless, if you need to run the preprocessor, then use
+@code{AC_PREPROC_IFELSE}.
+
+The macros described in this section cannot be used for tests in Erlang,
+Fortran, or Go, since those languages require no preprocessor.
+
+@anchor{AC_PREPROC_IFELSE}
+@defmac AC_PREPROC_IFELSE (@var{input}, @ovar{action-if-true}, @
+ @ovar{action-if-false})
+@acindex{PREPROC_IFELSE}
+Run the preprocessor of the current language (@pxref{Language Choice})
+on the @var{input}, run the shell commands @var{action-if-true} on
+success, @var{action-if-false} otherwise. The @var{input} can be made
+by @code{AC_LANG_PROGRAM} and friends.
+
+This macro uses @code{CPPFLAGS}, but not @code{CFLAGS}, because
+@option{-g}, @option{-O}, etc.@: are not valid options to many C
+preprocessors.
+
+It is customary to report unexpected failures with
+@code{AC_MSG_FAILURE}. If needed, @var{action-if-true} can further access
+the preprocessed output in the file @file{conftest.i}.
+@end defmac
+
+For instance:
+
+@example
+AC_INIT([Hello], [1.0], [bug-hello@@example.org])
+AC_DEFINE([HELLO_WORLD], ["Hello, World\n"],
+ [Greetings string.])
+AC_PREPROC_IFELSE(
+ [AC_LANG_PROGRAM([[const char hw[] = "Hello, World\n";]],
+ [[fputs (hw, stdout);]])],
+ [AC_MSG_RESULT([OK])],
+ [AC_MSG_FAILURE([unexpected preprocessor failure])])
+@end example
+
+@noindent
+results in:
+
+@example
+checking for gcc... gcc
+checking for C compiler default output file name... a.out
+checking whether the C compiler works... yes
+checking whether we are cross compiling... no
+checking for suffix of executables...
+checking for suffix of object files... o
+checking whether we are using the GNU C compiler... yes
+checking whether gcc accepts -g... yes
+checking for gcc option to accept ISO C89... none needed
+checking how to run the C preprocessor... gcc -E
+OK
+@end example
+
+@sp 1
+
+The macro @code{AC_TRY_CPP} (@pxref{Obsolete Macros}) used to play the
+role of @code{AC_PREPROC_IFELSE}, but double quotes its argument, making
+it impossible to use it to elaborate sources. You are encouraged to
+get rid of your old use of the macro @code{AC_TRY_CPP} in favor of
+@code{AC_PREPROC_IFELSE}, but, in the first place, are you sure you need
+to run the @emph{preprocessor} and not the compiler?
+
+@anchor{AC_EGREP_HEADER}
+@defmac AC_EGREP_HEADER (@var{pattern}, @var{header-file}, @
+ @var{action-if-found}, @ovar{action-if-not-found})
+@acindex{EGREP_HEADER}
+If the output of running the preprocessor on the system header file
+@var{header-file} matches the extended regular expression
+@var{pattern}, execute shell commands @var{action-if-found}, otherwise
+execute @var{action-if-not-found}.
+@end defmac
+
+@anchor{AC_EGREP_CPP}
+@defmac AC_EGREP_CPP (@var{pattern}, @var{program}, @
+ @ovar{action-if-found}, @ovar{action-if-not-found})
+@acindex{EGREP_CPP}
+@var{program} is the text of a C or C++ program, on which shell
+variable, back quote, and backslash substitutions are performed. If the
+output of running the preprocessor on @var{program} matches the
+extended regular expression @var{pattern}, execute shell commands
+@var{action-if-found}, otherwise execute @var{action-if-not-found}.
+@end defmac
+
+
+
+@node Running the Compiler
+@section Running the Compiler
+
+To check for a syntax feature of the current language's (@pxref{Language
+Choice}) compiler, such as whether it recognizes a certain keyword, or
+simply to try some library feature, use @code{AC_COMPILE_IFELSE} to try
+to compile a small program that uses that feature.
+
+@defmac AC_COMPILE_IFELSE (@var{input}, @ovar{action-if-true}, @
+ @ovar{action-if-false})
+@acindex{COMPILE_IFELSE}
+Run the compiler and compilation flags of the current language
+(@pxref{Language Choice}) on the @var{input}, run the shell commands
+@var{action-if-true} on success, @var{action-if-false} otherwise. The
+@var{input} can be made by @code{AC_LANG_PROGRAM} and friends.
+
+It is customary to report unexpected failures with
+@code{AC_MSG_FAILURE}. This macro does not try to link; use
+@code{AC_LINK_IFELSE} if you need to do that (@pxref{Running the
+Linker}). If needed, @var{action-if-true} can further access the
+just-compiled object file @file{conftest.$OBJEXT}.
+
+This macro uses @code{AC_REQUIRE} for the compiler associated with the
+current language, which means that if the compiler has not yet been
+determined, the compiler determination will be made prior to the body of
+the outermost @code{AC_DEFUN} macro that triggered this macro to
+expand (@pxref{Expanded Before Required}).
+@end defmac
+
+@ovindex ERL
+For tests in Erlang, the @var{input} must be the source code of a module named
+@code{conftest}. @code{AC_COMPILE_IFELSE} generates a @file{conftest.beam}
+file that can be interpreted by the Erlang virtual machine (@code{ERL}). It is
+recommended to use @code{AC_LANG_PROGRAM} to specify the test program,
+to ensure that the Erlang module has the right name.
+
+@node Running the Linker
+@section Running the Linker
+
+To check for a library, a function, or a global variable, Autoconf
+@command{configure} scripts try to compile and link a small program that
+uses it. This is unlike Metaconfig, which by default uses @code{nm} or
+@code{ar} on the C library to try to figure out which functions are
+available. Trying to link with the function is usually a more reliable
+approach because it avoids dealing with the variations in the options
+and output formats of @code{nm} and @code{ar} and in the location of the
+standard libraries. It also allows configuring for cross-compilation or
+checking a function's runtime behavior if needed. On the other hand,
+it can be slower than scanning the libraries once, but accuracy is more
+important than speed.
+
+@code{AC_LINK_IFELSE} is used to compile test programs to test for
+functions and global variables. It is also used by @code{AC_CHECK_LIB}
+to check for libraries (@pxref{Libraries}), by adding the library being
+checked for to @code{LIBS} temporarily and trying to link a small
+program.
+
+@anchor{AC_LINK_IFELSE}
+@defmac AC_LINK_IFELSE (@var{input}, @ovar{action-if-true}, @
+ @ovar{action-if-false})
+@acindex{LINK_IFELSE}
+Run the compiler (and compilation flags) and the linker of the current
+language (@pxref{Language Choice}) on the @var{input}, run the shell
+commands @var{action-if-true} on success, @var{action-if-false}
+otherwise. The @var{input} can be made by @code{AC_LANG_PROGRAM} and
+friends. If needed, @var{action-if-true} can further access the
+just-linked program file @file{conftest$EXEEXT}.
+
+@code{LDFLAGS} and @code{LIBS} are used for linking, in addition to the
+current compilation flags.
+
+It is customary to report unexpected failures with
+@code{AC_MSG_FAILURE}. This macro does not try to execute the program;
+use @code{AC_RUN_IFELSE} if you need to do that (@pxref{Runtime}).
+@end defmac
+
+The @code{AC_LINK_IFELSE} macro cannot be used for Erlang tests, since Erlang
+programs are interpreted and do not require linking.
+
+
+
+@node Runtime
+@section Checking Runtime Behavior
+
+Sometimes you need to find out how a system performs at runtime, such
+as whether a given function has a certain capability or bug. If you
+can, make such checks when your program runs instead of when it is
+configured. You can check for things like the machine's endianness when
+your program initializes itself.
+
+If you really need to test for a runtime behavior while configuring,
+you can write a test program to determine the result, and compile and
+run it using @code{AC_RUN_IFELSE}. Avoid running test programs if
+possible, because this prevents people from configuring your package for
+cross-compiling.
+
+@anchor{AC_RUN_IFELSE}
+@defmac AC_RUN_IFELSE (@var{input}, @ovar{action-if-true}, @
+ @ovar{action-if-false}, @dvar{action-if-cross-compiling, AC_MSG_FAILURE})
+@acindex{RUN_IFELSE}
+Run the compiler (and compilation flags) and the linker of the current
+language (@pxref{Language Choice}) on the @var{input}, then execute the
+resulting program. If the program returns an exit
+status of 0 when executed, run shell commands @var{action-if-true}.
+Otherwise, run shell commands @var{action-if-false}.
+
+The @var{input} can be made by @code{AC_LANG_PROGRAM} and friends.
+@code{LDFLAGS} and @code{LIBS} are used for linking, in addition to the
+compilation flags of the current language (@pxref{Language Choice}).
+Additionally, @var{action-if-true} can run @command{./conftest$EXEEXT}
+for further testing.
+
+In the @var{action-if-false} section, the failing exit status is
+available in the shell variable @samp{$?}. This exit status might be
+that of a failed compilation, or it might be that of a failed program
+execution.
+
+If cross-compilation mode is enabled (this is the case if either the
+compiler being used does not produce executables that run on the system
+where @command{configure} is being run, or if the options @code{--build}
+and @code{--host} were both specified and their values are different),
+then the test program is
+not run. If the optional shell commands @var{action-if-cross-compiling}
+are given, those commands are run instead; typically these commands
+provide pessimistic defaults that allow cross-compilation to work even
+if the guess was wrong. If the fourth argument is empty or omitted, but
+cross-compilation is detected, then @command{configure} prints an error
+message and exits. If you want your package to be useful in a
+cross-compilation scenario, you @emph{should} provide a non-empty
+@var{action-if-cross-compiling} clause, as well as wrap the
+@code{AC_RUN_IFELSE} compilation inside an @code{AC_CACHE_CHECK}
+(@pxref{Caching Results}) which allows the user to override the
+pessimistic default if needed.
+
+It is customary to report unexpected failures with
+@code{AC_MSG_FAILURE}.
+@end defmac
+
+@command{autoconf} prints a warning message when creating
+@command{configure} each time it encounters a call to
+@code{AC_RUN_IFELSE} with no @var{action-if-cross-compiling} argument
+given. If you are not concerned about users configuring your package
+for cross-compilation, you may ignore the warning. A few of the macros
+distributed with Autoconf produce this warning message; but if this is a
+problem for you, please report it as a bug, along with an appropriate
+pessimistic guess to use instead.
+
+To configure for cross-compiling you can also choose a value for those
+parameters based on the canonical system name (@pxref{Manual
+Configuration}). Alternatively, set up a test results cache file with
+the correct values for the host system (@pxref{Caching Results}).
+
+@ovindex cross_compiling
+To provide a default for calls of @code{AC_RUN_IFELSE} that are embedded
+in other macros, including a few of the ones that come with Autoconf,
+you can test whether the shell variable @code{cross_compiling} is set to
+@samp{yes}, and then use an alternate method to get the results instead
+of calling the macros.
+
+It is also permissible to temporarily assign to @code{cross_compiling}
+in order to force tests to behave as though they are in a
+cross-compilation environment, particularly since this provides a way to
+test your @var{action-if-cross-compiling} even when you are not using a
+cross-compiler.
+
+@example
+# We temporarily set cross-compile mode to force AC_COMPUTE_INT
+# to use the slow link-only method
+save_cross_compiling=$cross_compiling
+cross_compiling=yes
+AC_COMPUTE_INT([@dots{}])
+cross_compiling=$save_cross_compiling
+@end example
+
+A C or C++ runtime test should be portable.
+@xref{Portable C and C++}.
+
+Erlang tests must exit themselves the Erlang VM by calling the @code{halt/1}
+function: the given status code is used to determine the success of the test
+(status is @code{0}) or its failure (status is different than @code{0}), as
+explained above. It must be noted that data output through the standard output
+(e.g., using @code{io:format/2}) may be truncated when halting the VM.
+Therefore, if a test must output configuration information, it is recommended
+to create and to output data into the temporary file named @file{conftest.out},
+using the functions of module @code{file}. The @code{conftest.out} file is
+automatically deleted by the @code{AC_RUN_IFELSE} macro. For instance, a
+simplified implementation of Autoconf's @code{AC_ERLANG_SUBST_LIB_DIR}
+macro is:
+
+@example
+AC_INIT([LibdirTest], [1.0], [bug-libdirtest@@example.org])
+AC_ERLANG_NEED_ERL
+AC_LANG(Erlang)
+AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([], [dnl
+ file:write_file("conftest.out", code:lib_dir()),
+ halt(0)])],
+ [echo "code:lib_dir() returned: `cat conftest.out`"],
+ [AC_MSG_FAILURE([test Erlang program execution failed])])
+@end example
+
+
+@node Systemology
+@section Systemology
+@cindex Systemology
+
+This section aims at presenting some systems and pointers to
+documentation. It may help you addressing particular problems reported
+by users.
+
+@uref{http://@/www.opengroup.org/@/susv3, Posix-conforming systems} are
+derived from the @uref{http://@/www.bell-labs.com/@/history/@/unix/, Unix
+operating system}.
+
+The @uref{http://@/bhami.com/@/rosetta.html, Rosetta Stone for Unix}
+contains a table correlating the features of various Posix-conforming
+systems. @uref{http://@/www.levenez.com/@/unix/, Unix History} is a
+simplified diagram of how many Unix systems were derived from each
+other.
+
+@uref{http://@/heirloom.sourceforge.net/, The Heirloom Project}
+provides some variants of traditional implementations of Unix utilities.
+
+@table @asis
+@item Darwin
+@cindex Darwin
+Darwin is also known as Mac OS X@. Beware that the file system @emph{can} be
+case-preserving, but case insensitive. This can cause nasty problems,
+since for instance the installation attempt for a package having an
+@file{INSTALL} file can result in @samp{make install} report that
+nothing was to be done!
+
+That's all dependent on whether the file system is a UFS (case
+sensitive) or HFS+ (case preserving). By default Apple wants you to
+install the OS on HFS+. Unfortunately, there are some pieces of
+software which really need to be built on UFS@. We may want to rebuild
+Darwin to have both UFS and HFS+ available (and put the /local/build
+tree on the UFS).
+
+@item QNX 4.25
+@cindex QNX 4.25
+@c FIXME: Please, if you feel like writing something more precise,
+@c it'd be great. In particular, I can't understand the difference with
+@c QNX Neutrino.
+QNX is a realtime operating system running on Intel architecture
+meant to be scalable from the small embedded systems to the hundred
+processor super-computer. It claims to be Posix certified. More
+information is available on the
+@uref{http://@/www.qnx.com/, QNX home page}.
+
+@item Tru64
+@cindex Tru64
+@uref{http://@/h30097.www3.hp.com/@/docs/,
+Documentation of several versions of Tru64} is available in different
+formats.
+
+@item Unix version 7
+@cindex Unix version 7
+@cindex V7
+Officially this was called the ``Seventh Edition'' of ``the UNIX
+time-sharing system'' but we use the more-common name ``Unix version 7''.
+Documentation is available in the
+@uref{http://@/plan9.bell-labs.com/@/7thEdMan/, Unix Seventh Edition Manual}.
+Previous versions of Unix are called ``Unix version 6'', etc., but
+they were not as widely used.
+@end table
+
+
+@node Multiple Cases
+@section Multiple Cases
+
+Some operations are accomplished in several possible ways, depending on
+the OS variant. Checking for them essentially requires a ``case
+statement''. Autoconf does not directly provide one; however, it is
+easy to simulate by using a shell variable to keep track of whether a
+way to perform the operation has been found yet.
+
+Here is an example that uses the shell variable @code{fstype} to keep
+track of whether the remaining cases need to be checked. Note that
+since the value of @code{fstype} is under our control, we don't have to
+use the longer @samp{test "x$fstype" = xno}.
+
+@example
+@group
+AC_MSG_CHECKING([how to get file system type])
+fstype=no
+# The order of these tests is important.
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statvfs.h>
+#include <sys/fstyp.h>]])],
+ [AC_DEFINE([FSTYPE_STATVFS], [1],
+ [Define if statvfs exists.])
+ fstype=SVR4])
+if test $fstype = no; then
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statfs.h>
+#include <sys/fstyp.h>]])],
+ [AC_DEFINE([FSTYPE_USG_STATFS], [1],
+ [Define if USG statfs.])
+ fstype=SVR3])
+fi
+if test $fstype = no; then
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/statfs.h>
+#include <sys/vmount.h>]])]),
+ [AC_DEFINE([FSTYPE_AIX_STATFS], [1],
+ [Define if AIX statfs.])
+ fstype=AIX])
+fi
+# (more cases omitted here)
+AC_MSG_RESULT([$fstype])
+@end group
+@end example
+
+@c ====================================================== Results of Tests.
+
+@node Results
+@chapter Results of Tests
+
+Once @command{configure} has determined whether a feature exists, what can
+it do to record that information? There are four sorts of things it can
+do: define a C preprocessor symbol, set a variable in the output files,
+save the result in a cache file for future @command{configure} runs, and
+print a message letting the user know the result of the test.
+
+@menu
+* Defining Symbols:: Defining C preprocessor symbols
+* Setting Output Variables:: Replacing variables in output files
+* Special Chars in Variables:: Characters to beware of in variables
+* Caching Results:: Speeding up subsequent @command{configure} runs
+* Printing Messages:: Notifying @command{configure} users
+@end menu
+
+@node Defining Symbols
+@section Defining C Preprocessor Symbols
+
+A common action to take in response to a feature test is to define a C
+preprocessor symbol indicating the results of the test. That is done by
+calling @code{AC_DEFINE} or @code{AC_DEFINE_UNQUOTED}.
+
+By default, @code{AC_OUTPUT} places the symbols defined by these macros
+into the output variable @code{DEFS}, which contains an option
+@option{-D@var{symbol}=@var{value}} for each symbol defined. Unlike in
+Autoconf version 1, there is no variable @code{DEFS} defined while
+@command{configure} is running. To check whether Autoconf macros have
+already defined a certain C preprocessor symbol, test the value of the
+appropriate cache variable, as in this example:
+
+@example
+AC_CHECK_FUNC([vprintf], [AC_DEFINE([HAVE_VPRINTF], [1],
+ [Define if vprintf exists.])])
+if test "x$ac_cv_func_vprintf" != xyes; then
+ AC_CHECK_FUNC([_doprnt], [AC_DEFINE([HAVE_DOPRNT], [1],
+ [Define if _doprnt exists.])])
+fi
+@end example
+
+If @code{AC_CONFIG_HEADERS} has been called, then instead of creating
+@code{DEFS}, @code{AC_OUTPUT} creates a header file by substituting the
+correct values into @code{#define} statements in a template file.
+@xref{Configuration Headers}, for more information about this kind of
+output.
+
+@defmac AC_DEFINE (@var{variable}, @var{value}, @ovar{description})
+@defmacx AC_DEFINE (@var{variable})
+@cvindex @var{variable}
+@acindex{DEFINE}
+Define @var{variable} to @var{value} (verbatim), by defining a C
+preprocessor macro for @var{variable}. @var{variable} should be a C
+identifier, optionally suffixed by a parenthesized argument list to
+define a C preprocessor macro with arguments. The macro argument list,
+if present, should be a comma-separated list of C identifiers, possibly
+terminated by an ellipsis @samp{...} if C99 syntax is employed.
+@var{variable} should not contain comments, white space, trigraphs,
+backslash-newlines, universal character names, or non-ASCII
+characters.
+
+@var{value} may contain backslash-escaped newlines, which will be
+preserved if you use @code{AC_CONFIG_HEADERS} but flattened if passed
+via @code{@@DEFS@@} (with no effect on the compilation, since the
+preprocessor sees only one line in the first place). @var{value} should
+not contain raw newlines. If you are not using
+@code{AC_CONFIG_HEADERS}, @var{value} should not contain any @samp{#}
+characters, as @command{make} tends to eat them. To use a shell
+variable, use @code{AC_DEFINE_UNQUOTED} instead.
+
+@var{description} is only useful if you are using
+@code{AC_CONFIG_HEADERS}. In this case, @var{description} is put into
+the generated @file{config.h.in} as the comment before the macro define.
+The following example defines the C preprocessor variable
+@code{EQUATION} to be the string constant @samp{"$a > $b"}:
+
+@example
+AC_DEFINE([EQUATION], ["$a > $b"],
+ [Equation string.])
+@end example
+
+If neither @var{value} nor @var{description} are given, then
+@var{value} defaults to 1 instead of to the empty string. This is for
+backwards compatibility with older versions of Autoconf, but this usage
+is obsolescent and may be withdrawn in future versions of Autoconf.
+
+If the @var{variable} is a literal string, it is passed to
+@code{m4_pattern_allow} (@pxref{Forbidden Patterns}).
+
+If multiple @code{AC_DEFINE} statements are executed for the same
+@var{variable} name (not counting any parenthesized argument list),
+the last one wins.
+@end defmac
+
+@defmac AC_DEFINE_UNQUOTED (@var{variable}, @var{value}, @ovar{description})
+@defmacx AC_DEFINE_UNQUOTED (@var{variable})
+@acindex{DEFINE_UNQUOTED}
+@cvindex @var{variable}
+Like @code{AC_DEFINE}, but three shell expansions are
+performed---once---on @var{variable} and @var{value}: variable expansion
+(@samp{$}), command substitution (@samp{`}), and backslash escaping
+(@samp{\}), as if in an unquoted here-document. Single and double quote
+characters in the value have no
+special meaning. Use this macro instead of @code{AC_DEFINE} when
+@var{variable} or @var{value} is a shell variable. Examples:
+
+@example
+AC_DEFINE_UNQUOTED([config_machfile], ["$machfile"],
+ [Configuration machine file.])
+AC_DEFINE_UNQUOTED([GETGROUPS_T], [$ac_cv_type_getgroups],
+ [getgroups return type.])
+AC_DEFINE_UNQUOTED([$ac_tr_hdr], [1],
+ [Translated header name.])
+@end example
+@end defmac
+
+Due to a syntactical bizarreness of the Bourne shell, do not use
+semicolons to separate @code{AC_DEFINE} or @code{AC_DEFINE_UNQUOTED}
+calls from other macro calls or shell code; that can cause syntax errors
+in the resulting @command{configure} script. Use either blanks or
+newlines. That is, do this:
+
+@example
+AC_CHECK_HEADER([elf.h],
+ [AC_DEFINE([SVR4], [1], [System V Release 4]) LIBS="-lelf $LIBS"])
+@end example
+
+@noindent
+or this:
+
+@example
+AC_CHECK_HEADER([elf.h],
+ [AC_DEFINE([SVR4], [1], [System V Release 4])
+ LIBS="-lelf $LIBS"])
+@end example
+
+@noindent
+instead of this:
+
+@example
+AC_CHECK_HEADER([elf.h],
+ [AC_DEFINE([SVR4], [1], [System V Release 4]); LIBS="-lelf $LIBS"])
+@end example
+
+@node Setting Output Variables
+@section Setting Output Variables
+@cindex Output variables
+
+Another way to record the results of tests is to set @dfn{output
+variables}, which are shell variables whose values are substituted into
+files that @command{configure} outputs. The two macros below create new
+output variables. @xref{Preset Output Variables}, for a list of output
+variables that are always available.
+
+@defmac AC_SUBST (@var{variable}, @ovar{value})
+@acindex{SUBST}
+Create an output variable from a shell variable. Make @code{AC_OUTPUT}
+substitute the variable @var{variable} into output files (typically one
+or more makefiles). This means that @code{AC_OUTPUT}
+replaces instances of @samp{@@@var{variable}@@} in input files with the
+value that the shell variable @var{variable} has when @code{AC_OUTPUT}
+is called. The value can contain any non-@code{NUL} character, including
+newline. If you are using Automake 1.11 or newer, for newlines in values
+you might want to consider using @code{AM_SUBST_NOTMAKE} to prevent
+@command{automake} from adding a line @code{@var{variable} =
+@@@var{variable}@@} to the @file{Makefile.in} files (@pxref{Optional, ,
+Automake, automake, Other things Automake recognizes}).
+
+Variable occurrences should not overlap: e.g., an input file should
+not contain @samp{@@@var{var1}@@@var{var2}@@} if @var{var1} and @var{var2}
+are variable names.
+The substituted value is not rescanned for more output variables;
+occurrences of @samp{@@@var{variable}@@} in the value are inserted
+literally into the output file. (The algorithm uses the special marker
+@code{|#_!!_#|} internally, so neither the substituted value nor the
+output file may contain @code{|#_!!_#|}.)
+
+If @var{value} is given, in addition assign it to @var{variable}.
+
+The string @var{variable} is passed to @code{m4_pattern_allow}
+(@pxref{Forbidden Patterns}).
+@end defmac
+
+@defmac AC_SUBST_FILE (@var{variable})
+@acindex{SUBST_FILE}
+Another way to create an output variable from a shell variable. Make
+@code{AC_OUTPUT} insert (without substitutions) the contents of the file
+named by shell variable @var{variable} into output files. This means
+that @code{AC_OUTPUT} replaces instances of
+@samp{@@@var{variable}@@} in output files (such as @file{Makefile.in})
+with the contents of the file that the shell variable @var{variable}
+names when @code{AC_OUTPUT} is called. Set the variable to
+@file{/dev/null} for cases that do not have a file to insert.
+This substitution occurs only when the @samp{@@@var{variable}@@} is on a
+line by itself, optionally surrounded by spaces and tabs. The
+substitution replaces the whole line, including the spaces, tabs, and
+the terminating newline.
+
+This macro is useful for inserting makefile fragments containing
+special dependencies or other @command{make} directives for particular host
+or target types into makefiles. For example, @file{configure.ac}
+could contain:
+
+@example
+AC_SUBST_FILE([host_frag])
+host_frag=$srcdir/conf/sun4.mh
+@end example
+
+@noindent
+and then a @file{Makefile.in} could contain:
+
+@example
+@@host_frag@@
+@end example
+
+The string @var{variable} is passed to @code{m4_pattern_allow}
+(@pxref{Forbidden Patterns}).
+@end defmac
+
+@cindex Precious Variable
+@cindex Variable, Precious
+Running @command{configure} in varying environments can be extremely
+dangerous. If for instance the user runs @samp{CC=bizarre-cc
+./configure}, then the cache, @file{config.h}, and many other output
+files depend upon @command{bizarre-cc} being the C compiler. If
+for some reason the user runs @command{./configure} again, or if it is
+run via @samp{./config.status --recheck}, (@xref{Automatic Remaking},
+and @pxref{config.status Invocation}), then the configuration can be
+inconsistent, composed of results depending upon two different
+compilers.
+
+Environment variables that affect this situation, such as @samp{CC}
+above, are called @dfn{precious variables}, and can be declared as such
+by @code{AC_ARG_VAR}.
+
+@defmac AC_ARG_VAR (@var{variable}, @var{description})
+@acindex{ARG_VAR}
+Declare @var{variable} is a precious variable, and include its
+@var{description} in the variable section of @samp{./configure --help}.
+
+Being precious means that
+@itemize @minus
+@item
+@var{variable} is substituted via @code{AC_SUBST}.
+
+@item
+The value of @var{variable} when @command{configure} was launched is
+saved in the cache, including if it was not specified on the command
+line but via the environment. Indeed, while @command{configure} can
+notice the definition of @code{CC} in @samp{./configure CC=bizarre-cc},
+it is impossible to notice it in @samp{CC=bizarre-cc ./configure},
+which, unfortunately, is what most users do.
+
+We emphasize that it is the @emph{initial} value of @var{variable} which
+is saved, not that found during the execution of @command{configure}.
+Indeed, specifying @samp{./configure FOO=foo} and letting
+@samp{./configure} guess that @code{FOO} is @code{foo} can be two
+different things.
+
+@item
+@var{variable} is checked for consistency between two
+@command{configure} runs. For instance:
+
+@example
+$ @kbd{./configure --silent --config-cache}
+$ @kbd{CC=cc ./configure --silent --config-cache}
+configure: error: `CC' was not set in the previous run
+configure: error: changes in the environment can compromise \
+the build
+configure: error: run `make distclean' and/or \
+`rm config.cache' and start over
+@end example
+
+@noindent
+and similarly if the variable is unset, or if its content is changed.
+If the content has white space changes only, then the error is degraded
+to a warning only, but the old value is reused.
+
+@item
+@var{variable} is kept during automatic reconfiguration
+(@pxref{config.status Invocation}) as if it had been passed as a command
+line argument, including when no cache is used:
+
+@example
+$ @kbd{CC=/usr/bin/cc ./configure var=raboof --silent}
+$ @kbd{./config.status --recheck}
+running CONFIG_SHELL=/bin/sh /bin/sh ./configure var=raboof \
+ CC=/usr/bin/cc --no-create --no-recursion
+@end example
+@end itemize
+@end defmac
+
+@node Special Chars in Variables
+@section Special Characters in Output Variables
+@cindex Output variables, special characters in
+
+Many output variables are intended to be evaluated both by
+@command{make} and by the shell. Some characters are expanded
+differently in these two contexts, so to avoid confusion these
+variables' values should not contain any of the following characters:
+
+@example
+" # $ & ' ( ) * ; < > ? [ \ ^ ` |
+@end example
+
+Also, these variables' values should neither contain newlines, nor start
+with @samp{~}, nor contain white space or @samp{:} immediately followed
+by @samp{~}. The values can contain nonempty sequences of white space
+characters like tabs and spaces, but each such sequence might
+arbitrarily be replaced by a single space during substitution.
+
+These restrictions apply both to the values that @command{configure}
+computes, and to the values set directly by the user. For example, the
+following invocations of @command{configure} are problematic, since they
+attempt to use special characters within @code{CPPFLAGS} and white space
+within @code{$(srcdir)}:
+
+@example
+CPPFLAGS='-DOUCH="&\"#$*?"' '../My Source/ouch-1.0/configure'
+
+'../My Source/ouch-1.0/configure' CPPFLAGS='-DOUCH="&\"#$*?"'
+@end example
+
+@node Caching Results
+@section Caching Results
+@cindex Cache
+
+To avoid checking for the same features repeatedly in various
+@command{configure} scripts (or in repeated runs of one script),
+@command{configure} can optionally save the results of many checks in a
+@dfn{cache file} (@pxref{Cache Files}). If a @command{configure} script
+runs with caching enabled and finds a cache file, it reads the results
+of previous runs from the cache and avoids rerunning those checks. As a
+result, @command{configure} can then run much faster than if it had to
+perform all of the checks every time.
+
+@defmac AC_CACHE_VAL (@var{cache-id}, @var{commands-to-set-it})
+@acindex{CACHE_VAL}
+Ensure that the results of the check identified by @var{cache-id} are
+available. If the results of the check were in the cache file that was
+read, and @command{configure} was not given the @option{--quiet} or
+@option{--silent} option, print a message saying that the result was
+cached; otherwise, run the shell commands @var{commands-to-set-it}. If
+the shell commands are run to determine the value, the value is
+saved in the cache file just before @command{configure} creates its output
+files. @xref{Cache Variable Names}, for how to choose the name of the
+@var{cache-id} variable.
+
+The @var{commands-to-set-it} @emph{must have no side effects} except for
+setting the variable @var{cache-id}, see below.
+@end defmac
+
+@defmac AC_CACHE_CHECK (@var{message}, @var{cache-id}, @
+ @var{commands-to-set-it})
+@acindex{CACHE_CHECK}
+A wrapper for @code{AC_CACHE_VAL} that takes care of printing the
+messages. This macro provides a convenient shorthand for the most
+common way to use these macros. It calls @code{AC_MSG_CHECKING} for
+@var{message}, then @code{AC_CACHE_VAL} with the @var{cache-id} and
+@var{commands} arguments, and @code{AC_MSG_RESULT} with @var{cache-id}.
+
+The @var{commands-to-set-it} @emph{must have no side effects} except for
+setting the variable @var{cache-id}, see below.
+@end defmac
+
+It is common to find buggy macros using @code{AC_CACHE_VAL} or
+@code{AC_CACHE_CHECK}, because people are tempted to call
+@code{AC_DEFINE} in the @var{commands-to-set-it}. Instead, the code that
+@emph{follows} the call to @code{AC_CACHE_VAL} should call
+@code{AC_DEFINE}, by examining the value of the cache variable. For
+instance, the following macro is broken:
+
+@example
+@c If you change this example, adjust tests/base.at:AC_CACHE_CHECK.
+@group
+AC_DEFUN([AC_SHELL_TRUE],
+[AC_CACHE_CHECK([whether true(1) works], [my_cv_shell_true_works],
+ [my_cv_shell_true_works=no
+ (true) 2>/dev/null && my_cv_shell_true_works=yes
+ if test "x$my_cv_shell_true_works" = xyes; then
+ AC_DEFINE([TRUE_WORKS], [1],
+ [Define if `true(1)' works properly.])
+ fi])
+])
+@end group
+@end example
+
+@noindent
+This fails if the cache is enabled: the second time this macro is run,
+@code{TRUE_WORKS} @emph{will not be defined}. The proper implementation
+is:
+
+@example
+@c If you change this example, adjust tests/base.at:AC_CACHE_CHECK.
+@group
+AC_DEFUN([AC_SHELL_TRUE],
+[AC_CACHE_CHECK([whether true(1) works], [my_cv_shell_true_works],
+ [my_cv_shell_true_works=no
+ (true) 2>/dev/null && my_cv_shell_true_works=yes])
+ if test "x$my_cv_shell_true_works" = xyes; then
+ AC_DEFINE([TRUE_WORKS], [1],
+ [Define if `true(1)' works properly.])
+ fi
+])
+@end group
+@end example
+
+Also, @var{commands-to-set-it} should not print any messages, for
+example with @code{AC_MSG_CHECKING}; do that before calling
+@code{AC_CACHE_VAL}, so the messages are printed regardless of whether
+the results of the check are retrieved from the cache or determined by
+running the shell commands.
+
+@menu
+* Cache Variable Names:: Shell variables used in caches
+* Cache Files:: Files @command{configure} uses for caching
+* Cache Checkpointing:: Loading and saving the cache file
+@end menu
+
+@node Cache Variable Names
+@subsection Cache Variable Names
+@cindex Cache variable
+
+The names of cache variables should have the following format:
+
+@example
+@var{package-prefix}_cv_@var{value-type}_@var{specific-value}_@ovar{additional-options}
+@end example
+
+@noindent
+for example, @samp{ac_cv_header_stat_broken} or
+@samp{ac_cv_prog_gcc_traditional}. The parts of the variable name are:
+
+@table @asis
+@item @var{package-prefix}
+An abbreviation for your package or organization; the same prefix you
+begin local Autoconf macros with, except lowercase by convention.
+For cache values used by the distributed Autoconf macros, this value is
+@samp{ac}.
+
+@item @code{_cv_}
+Indicates that this shell variable is a cache value. This string
+@emph{must} be present in the variable name, including the leading
+underscore.
+
+@item @var{value-type}
+A convention for classifying cache values, to produce a rational naming
+system. The values used in Autoconf are listed in @ref{Macro Names}.
+
+@item @var{specific-value}
+Which member of the class of cache values this test applies to.
+For example, which function (@samp{alloca}), program (@samp{gcc}), or
+output variable (@samp{INSTALL}).
+
+@item @var{additional-options}
+Any particular behavior of the specific member that this test applies to.
+For example, @samp{broken} or @samp{set}. This part of the name may
+be omitted if it does not apply.
+@end table
+
+The values assigned to cache variables may not contain newlines.
+Usually, their values are Boolean (@samp{yes} or @samp{no}) or the
+names of files or functions; so this is not an important restriction.
+@ref{Cache Variable Index} for an index of cache variables with
+documented semantics.
+
+
+@node Cache Files
+@subsection Cache Files
+
+A cache file is a shell script that caches the results of configure
+tests run on one system so they can be shared between configure scripts
+and configure runs. It is not useful on other systems. If its contents
+are invalid for some reason, the user may delete or edit it, or override
+documented cache variables on the @command{configure} command line.
+
+By default, @command{configure} uses no cache file,
+to avoid problems caused by accidental
+use of stale cache files.
+
+To enable caching, @command{configure} accepts @option{--config-cache} (or
+@option{-C}) to cache results in the file @file{config.cache}.
+Alternatively, @option{--cache-file=@var{file}} specifies that
+@var{file} be the cache file. The cache file is created if it does not
+exist already. When @command{configure} calls @command{configure} scripts in
+subdirectories, it uses the @option{--cache-file} argument so that they
+share the same cache. @xref{Subdirectories}, for information on
+configuring subdirectories with the @code{AC_CONFIG_SUBDIRS} macro.
+
+@file{config.status} only pays attention to the cache file if it is
+given the @option{--recheck} option, which makes it rerun
+@command{configure}.
+
+It is wrong to try to distribute cache files for particular system types.
+There is too much room for error in doing that, and too much
+administrative overhead in maintaining them. For any features that
+can't be guessed automatically, use the standard method of the canonical
+system type and linking files (@pxref{Manual Configuration}).
+
+The site initialization script can specify a site-wide cache file to
+use, instead of the usual per-program cache. In this case, the cache
+file gradually accumulates information whenever someone runs a new
+@command{configure} script. (Running @command{configure} merges the new cache
+results with the existing cache file.) This may cause problems,
+however, if the system configuration (e.g., the installed libraries or
+compilers) changes and the stale cache file is not deleted.
+
+If @command{configure} is interrupted at the right time when it updates
+a cache file outside of the build directory where the @command{configure}
+script is run, it may leave behind a temporary file named after the
+cache file with digits following it. You may safely delete such a file.
+
+
+@node Cache Checkpointing
+@subsection Cache Checkpointing
+
+If your configure script, or a macro called from @file{configure.ac}, happens
+to abort the configure process, it may be useful to checkpoint the cache
+a few times at key points using @code{AC_CACHE_SAVE}. Doing so
+reduces the amount of time it takes to rerun the configure script with
+(hopefully) the error that caused the previous abort corrected.
+
+@c FIXME: Do we really want to document this guy?
+@defmac AC_CACHE_LOAD
+@acindex{CACHE_LOAD}
+Loads values from existing cache file, or creates a new cache file if a
+cache file is not found. Called automatically from @code{AC_INIT}.
+@end defmac
+
+@defmac AC_CACHE_SAVE
+@acindex{CACHE_SAVE}
+Flushes all cached values to the cache file. Called automatically from
+@code{AC_OUTPUT}, but it can be quite useful to call
+@code{AC_CACHE_SAVE} at key points in @file{configure.ac}.
+@end defmac
+
+For instance:
+
+@example
+@r{ @dots{} AC_INIT, etc. @dots{}}
+@group
+# Checks for programs.
+AC_PROG_CC
+AC_PROG_AWK
+@r{ @dots{} more program checks @dots{}}
+AC_CACHE_SAVE
+@end group
+
+@group
+# Checks for libraries.
+AC_CHECK_LIB([nsl], [gethostbyname])
+AC_CHECK_LIB([socket], [connect])
+@r{ @dots{} more lib checks @dots{}}
+AC_CACHE_SAVE
+@end group
+
+@group
+# Might abort@dots{}
+AM_PATH_GTK([1.0.2], [], [AC_MSG_ERROR([GTK not in path])])
+AM_PATH_GTKMM([0.9.5], [], [AC_MSG_ERROR([GTK not in path])])
+@end group
+@r{ @dots{} AC_OUTPUT, etc. @dots{}}
+@end example
+
+@node Printing Messages
+@section Printing Messages
+@cindex Messages, from @command{configure}
+
+@command{configure} scripts need to give users running them several kinds
+of information. The following macros print messages in ways appropriate
+for each kind. The arguments to all of them get enclosed in shell
+double quotes, so the shell performs variable and back-quote
+substitution on them.
+
+These macros are all wrappers around the @command{echo} shell command.
+They direct output to the appropriate file descriptor (@pxref{File
+Descriptor Macros}).
+@command{configure} scripts should rarely need to run @command{echo} directly
+to print messages for the user. Using these macros makes it easy to
+change how and when each kind of message is printed; such changes need
+only be made to the macro definitions and all the callers change
+automatically.
+
+To diagnose static issues, i.e., when @command{autoconf} is run, see
+@ref{Diagnostic Macros}.
+
+@defmac AC_MSG_CHECKING (@var{feature-description})
+@acindex{MSG_CHECKING}
+Notify the user that @command{configure} is checking for a particular
+feature. This macro prints a message that starts with @samp{checking }
+and ends with @samp{...} and no newline. It must be followed by a call
+to @code{AC_MSG_RESULT} to print the result of the check and the
+newline. The @var{feature-description} should be something like
+@samp{whether the Fortran compiler accepts C++ comments} or @samp{for
+c89}.
+
+This macro prints nothing if @command{configure} is run with the
+@option{--quiet} or @option{--silent} option.
+@end defmac
+
+@anchor{AC_MSG_RESULT}
+@defmac AC_MSG_RESULT (@var{result-description})
+@acindex{MSG_RESULT}
+Notify the user of the results of a check. @var{result-description} is
+almost always the value of the cache variable for the check, typically
+@samp{yes}, @samp{no}, or a file name. This macro should follow a call
+to @code{AC_MSG_CHECKING}, and the @var{result-description} should be
+the completion of the message printed by the call to
+@code{AC_MSG_CHECKING}.
+
+This macro prints nothing if @command{configure} is run with the
+@option{--quiet} or @option{--silent} option.
+@end defmac
+
+@anchor{AC_MSG_NOTICE}
+@defmac AC_MSG_NOTICE (@var{message})
+@acindex{MSG_NOTICE}
+Deliver the @var{message} to the user. It is useful mainly to print a
+general description of the overall purpose of a group of feature checks,
+e.g.,
+
+@example
+AC_MSG_NOTICE([checking if stack overflow is detectable])
+@end example
+
+This macro prints nothing if @command{configure} is run with the
+@option{--quiet} or @option{--silent} option.
+@end defmac
+
+@anchor{AC_MSG_ERROR}
+@defmac AC_MSG_ERROR (@var{error-description}, @dvar{exit-status, $?/1})
+@acindex{MSG_ERROR}
+Notify the user of an error that prevents @command{configure} from
+completing. This macro prints an error message to the standard error
+output and exits @command{configure} with @var{exit-status} (@samp{$?}
+by default, except that @samp{0} is converted to @samp{1}).
+@var{error-description} should be something like @samp{invalid value
+$HOME for \$HOME}.
+
+The @var{error-description} should start with a lower-case letter, and
+``cannot'' is preferred to ``can't''.
+@end defmac
+
+@defmac AC_MSG_FAILURE (@var{error-description}, @ovar{exit-status})
+@acindex{MSG_FAILURE}
+This @code{AC_MSG_ERROR} wrapper notifies the user of an error that
+prevents @command{configure} from completing @emph{and} that additional
+details are provided in @file{config.log}. This is typically used when
+abnormal results are found during a compilation.
+@end defmac
+
+@anchor{AC_MSG_WARN}
+@defmac AC_MSG_WARN (@var{problem-description})
+@acindex{MSG_WARN}
+Notify the @command{configure} user of a possible problem. This macro
+prints the message to the standard error output; @command{configure}
+continues running afterward, so macros that call @code{AC_MSG_WARN} should
+provide a default (back-up) behavior for the situations they warn about.
+@var{problem-description} should be something like @samp{ln -s seems to
+make hard links}.
+@end defmac
+
+
+
+@c ====================================================== Programming in M4.
+
+@node Programming in M4
+@chapter Programming in M4
+@cindex M4
+
+Autoconf is written on top of two layers: @dfn{M4sugar}, which provides
+convenient macros for pure M4 programming, and @dfn{M4sh}, which
+provides macros dedicated to shell script generation.
+
+As of this version of Autoconf, these two layers still contain
+experimental macros, whose interface might change in the future. As a
+matter of fact, @emph{anything that is not documented must not be used}.
+
+@menu
+* M4 Quotation:: Protecting macros from unwanted expansion
+* Using autom4te:: The Autoconf executables backbone
+* Programming in M4sugar:: Convenient pure M4 macros
+* Debugging via autom4te:: Figuring out what M4 was doing
+@end menu
+
+@node M4 Quotation
+@section M4 Quotation
+@cindex M4 quotation
+@cindex quotation
+
+The most common problem with existing macros is an improper quotation.
+This section, which users of Autoconf can skip, but which macro writers
+@emph{must} read, first justifies the quotation scheme that was chosen
+for Autoconf and then ends with a rule of thumb. Understanding the
+former helps one to follow the latter.
+
+@menu
+* Active Characters:: Characters that change the behavior of M4
+* One Macro Call:: Quotation and one macro call
+* Quoting and Parameters:: M4 vs. shell parameters
+* Quotation and Nested Macros:: Macros calling macros
+* Changequote is Evil:: Worse than INTERCAL: M4 + changequote
+* Quadrigraphs:: Another way to escape special characters
+* Balancing Parentheses:: Dealing with unbalanced parentheses
+* Quotation Rule Of Thumb:: One parenthesis, one quote
+@end menu
+
+@node Active Characters
+@subsection Active Characters
+
+To fully understand where proper quotation is important, you first need
+to know what the special characters are in Autoconf: @samp{#} introduces
+a comment inside which no macro expansion is performed, @samp{,}
+separates arguments, @samp{[} and @samp{]} are the quotes
+themselves@footnote{By itself, M4 uses @samp{`} and @samp{'}; it is the
+M4sugar layer that sets up the preferred quotes of @samp{[} and @samp{]}.},
+@samp{(} and @samp{)} (which M4 tries to match by pairs), and finally
+@samp{$} inside a macro definition.
+
+In order to understand the delicate case of macro calls, we first have
+to present some obvious failures. Below they are ``obvious-ified'',
+but when you find them in real life, they are usually in disguise.
+
+Comments, introduced by a hash and running up to the newline, are opaque
+tokens to the top level: active characters are turned off, and there is
+no macro expansion:
+
+@example
+# define([def], ine)
+@result{}# define([def], ine)
+@end example
+
+Each time there can be a macro expansion, there is a quotation
+expansion, i.e., one level of quotes is stripped:
+
+@example
+int tab[10];
+@result{}int tab10;
+[int tab[10];]
+@result{}int tab[10];
+@end example
+
+Without this in mind, the reader might try hopelessly to use her macro
+@code{array}:
+
+@example
+define([array], [int tab[10];])
+array
+@result{}int tab10;
+[array]
+@result{}array
+@end example
+
+@noindent
+How can you correctly output the intended results@footnote{Using
+@code{defn}.}?
+
+
+@node One Macro Call
+@subsection One Macro Call
+
+Let's proceed on the interaction between active characters and macros
+with this small macro, which just returns its first argument:
+
+@example
+define([car], [$1])
+@end example
+
+@noindent
+The two pairs of quotes above are not part of the arguments of
+@code{define}; rather, they are understood by the top level when it
+tries to find the arguments of @code{define}. Therefore, assuming
+@code{car} is not already defined, it is equivalent to write:
+
+@example
+define(car, $1)
+@end example
+
+@noindent
+But, while it is acceptable for a @file{configure.ac} to avoid unnecessary
+quotes, it is bad practice for Autoconf macros which must both be more
+robust and also advocate perfect style.
+
+At the top level, there are only two possibilities: either you
+quote or you don't:
+
+@example
+car(foo, bar, baz)
+@result{}foo
+[car(foo, bar, baz)]
+@result{}car(foo, bar, baz)
+@end example
+
+Let's pay attention to the special characters:
+
+@example
+car(#)
+@error{}EOF in argument list
+@end example
+
+The closing parenthesis is hidden in the comment; with a hypothetical
+quoting, the top level understood it this way:
+
+@example
+car([#)]
+@end example
+
+@noindent
+Proper quotation, of course, fixes the problem:
+
+@example
+car([#])
+@result{}#
+@end example
+
+Here are more examples:
+
+@example
+car(foo, bar)
+@result{}foo
+car([foo, bar])
+@result{}foo, bar
+car((foo, bar))
+@result{}(foo, bar)
+car([(foo], [bar)])
+@result{}(foo
+define([a], [b])
+@result{}
+car(a)
+@result{}b
+car([a])
+@result{}b
+car([[a]])
+@result{}a
+car([[[a]]])
+@result{}[a]
+@end example
+
+@node Quoting and Parameters
+@subsection Quoting and Parameters
+
+When M4 encounters @samp{$} within a macro definition, followed
+immediately by a character it recognizes (@samp{0}@dots{}@samp{9},
+@samp{#}, @samp{@@}, or @samp{*}), it will perform M4 parameter
+expansion. This happens regardless of how many layers of quotes the
+parameter expansion is nested within, or even if it occurs in text that
+will be rescanned as a comment.
+
+@example
+define([none], [$1])
+@result{}
+define([one], [[$1]])
+@result{}
+define([two], [[[$1]]])
+@result{}
+define([comment], [# $1])
+@result{}
+define([active], [ACTIVE])
+@result{}
+none([active])
+@result{}ACTIVE
+one([active])
+@result{}active
+two([active])
+@result{}[active]
+comment([active])
+@result{}# active
+@end example
+
+On the other hand, since autoconf generates shell code, you often want
+to output shell variable expansion, rather than performing M4 parameter
+expansion. To do this, you must use M4 quoting to separate the @samp{$}
+from the next character in the definition of your macro. If the macro
+definition occurs in single-quoted text, then insert another level of
+quoting; if the usage is already inside a double-quoted string, then
+split it into concatenated strings.
+
+@example
+define([single], [a single-quoted $[]1 definition])
+@result{}
+define([double], [[a double-quoted $][1 definition]])
+@result{}
+single
+@result{}a single-quoted $1 definition
+double
+@result{}a double-quoted $1 definition
+@end example
+
+Posix states that M4 implementations are free to provide implementation
+extensions when @samp{$@{} is encountered in a macro definition.
+Autoconf reserves the longer sequence @samp{$@{@{} for use with planned
+extensions that will be available in the future GNU M4 2.0,
+but guarantees that all other instances of @samp{$@{} will be output
+literally. Therefore, this idiom can also be used to output shell code
+parameter references:
+
+@example
+define([first], [$@{1@}])first
+@result{}$@{1@}
+@end example
+
+Posix also states that @samp{$11} should expand to the first parameter
+concatenated with a literal @samp{1}, although some versions of
+GNU M4 expand the eleventh parameter instead. For
+portability, you should only use single-digit M4 parameter expansion.
+
+With this in mind, we can explore the cases where macros invoke
+macros@enddots{}
+
+@node Quotation and Nested Macros
+@subsection Quotation and Nested Macros
+
+The examples below use the following macros:
+
+@example
+define([car], [$1])
+define([active], [ACT, IVE])
+define([array], [int tab[10]])
+@end example
+
+Each additional embedded macro call introduces other possible
+interesting quotations:
+
+@example
+car(active)
+@result{}ACT
+car([active])
+@result{}ACT, IVE
+car([[active]])
+@result{}active
+@end example
+
+In the first case, the top level looks for the arguments of @code{car},
+and finds @samp{active}. Because M4 evaluates its arguments
+before applying the macro, @samp{active} is expanded, which results in:
+
+@example
+car(ACT, IVE)
+@result{}ACT
+@end example
+
+@noindent
+In the second case, the top level gives @samp{active} as first and only
+argument of @code{car}, which results in:
+
+@example
+active
+@result{}ACT, IVE
+@end example
+
+@noindent
+i.e., the argument is evaluated @emph{after} the macro that invokes it.
+In the third case, @code{car} receives @samp{[active]}, which results in:
+
+@example
+[active]
+@result{}active
+@end example
+
+@noindent
+exactly as we already saw above.
+
+The example above, applied to a more realistic example, gives:
+
+@example
+car(int tab[10];)
+@result{}int tab10;
+car([int tab[10];])
+@result{}int tab10;
+car([[int tab[10];]])
+@result{}int tab[10];
+@end example
+
+@noindent
+Huh? The first case is easily understood, but why is the second wrong,
+and the third right? To understand that, you must know that after
+M4 expands a macro, the resulting text is immediately subjected
+to macro expansion and quote removal. This means that the quote removal
+occurs twice---first before the argument is passed to the @code{car}
+macro, and second after the @code{car} macro expands to the first
+argument.
+
+As the author of the Autoconf macro @code{car}, you then consider it to
+be incorrect that your users have to double-quote the arguments of
+@code{car}, so you ``fix'' your macro. Let's call it @code{qar} for
+quoted car:
+
+@example
+define([qar], [[$1]])
+@end example
+
+@noindent
+and check that @code{qar} is properly fixed:
+
+@example
+qar([int tab[10];])
+@result{}int tab[10];
+@end example
+
+@noindent
+Ahhh! That's much better.
+
+But note what you've done: now that the result of @code{qar} is always
+a literal string, the only time a user can use nested macros is if she
+relies on an @emph{unquoted} macro call:
+
+@example
+qar(active)
+@result{}ACT
+qar([active])
+@result{}active
+@end example
+
+@noindent
+leaving no way for her to reproduce what she used to do with @code{car}:
+
+@example
+car([active])
+@result{}ACT, IVE
+@end example
+
+@noindent
+Worse yet: she wants to use a macro that produces a set of @code{cpp}
+macros:
+
+@example
+define([my_includes], [#include <stdio.h>])
+car([my_includes])
+@result{}#include <stdio.h>
+qar(my_includes)
+@error{}EOF in argument list
+@end example
+
+This macro, @code{qar}, because it double quotes its arguments, forces
+its users to leave their macro calls unquoted, which is dangerous.
+Commas and other active symbols are interpreted by M4 before
+they are given to the macro, often not in the way the users expect.
+Also, because @code{qar} behaves differently from the other macros,
+it's an exception that should be avoided in Autoconf.
+
+@node Changequote is Evil
+@subsection @code{changequote} is Evil
+@cindex @code{changequote}
+
+The temptation is often high to bypass proper quotation, in particular
+when it's late at night. Then, many experienced Autoconf hackers
+finally surrender to the dark side of the force and use the ultimate
+weapon: @code{changequote}.
+
+The M4 builtin @code{changequote} belongs to a set of primitives that
+allow one to adjust the syntax of the language to adjust it to one's
+needs. For instance, by default M4 uses @samp{`} and @samp{'} as
+quotes, but in the context of shell programming (and actually of most
+programming languages), that's about the worst choice one can make:
+because of strings and back-quoted expressions in shell code (such as
+@samp{'this'} and @samp{`that`}), and because of literal characters in usual
+programming languages (as in @samp{'0'}), there are many unbalanced
+@samp{`} and @samp{'}. Proper M4 quotation then becomes a nightmare, if
+not impossible. In order to make M4 useful in such a context, its
+designers have equipped it with @code{changequote}, which makes it
+possible to choose another pair of quotes. M4sugar, M4sh, Autoconf, and
+Autotest all have chosen to use @samp{[} and @samp{]}. Not especially
+because they are unlikely characters, but @emph{because they are
+characters unlikely to be unbalanced}.
+
+There are other magic primitives, such as @code{changecom} to specify
+what syntactic forms are comments (it is common to see
+@samp{changecom(<!--, -->)} when M4 is used to produce HTML pages),
+@code{changeword} and @code{changesyntax} to change other syntactic
+details (such as the character to denote the @var{n}th argument, @samp{$} by
+default, the parentheses around arguments, etc.).
+
+These primitives are really meant to make M4 more useful for specific
+domains: they should be considered like command line options:
+@option{--quotes}, @option{--comments}, @option{--words}, and
+@option{--syntax}. Nevertheless, they are implemented as M4 builtins, as
+it makes M4 libraries self contained (no need for additional options).
+
+There lies the problem@enddots{}
+
+@sp 1
+
+The problem is that it is then tempting to use them in the middle of an
+M4 script, as opposed to its initialization. This, if not carefully
+thought out, can lead to disastrous effects: @emph{you are changing the
+language in the middle of the execution}. Changing and restoring the
+syntax is often not enough: if you happened to invoke macros in between,
+these macros are lost, as the current syntax is probably not
+the one they were implemented with.
+
+@c FIXME: I've been looking for a short, real case example, but I
+@c lost them all :(
+
+
+@node Quadrigraphs
+@subsection Quadrigraphs
+@cindex quadrigraphs
+@cindex @samp{@@S|@@}
+@cindex @samp{@@&t@@}
+@c Info cannot handle `:' in index entries.
+@ifnotinfo
+@cindex @samp{@@<:@@}
+@cindex @samp{@@:>@@}
+@cindex @samp{@@%:@@}
+@cindex @samp{@@@{:@@}
+@cindex @samp{@@:@}@@}
+@end ifnotinfo
+
+When writing an Autoconf macro you may occasionally need to generate
+special characters that are difficult to express with the standard
+Autoconf quoting rules. For example, you may need to output the regular
+expression @samp{[^[]}, which matches any character other than @samp{[}.
+This expression contains unbalanced brackets so it cannot be put easily
+into an M4 macro.
+
+Additionally, there are a few m4sugar macros (such as @code{m4_split}
+and @code{m4_expand}) which internally use special markers in addition
+to the regular quoting characters. If the arguments to these macros
+contain the literal strings @samp{-=<@{(} or @samp{)@}>=-}, the macros
+might behave incorrectly.
+
+You can work around these problems by using one of the following
+@dfn{quadrigraphs}:
+
+@table @samp
+@item @@<:@@
+@samp{[}
+@item @@:>@@
+@samp{]}
+@item @@S|@@
+@samp{$}
+@item @@%:@@
+@samp{#}
+@item @@@{:@@
+@samp{(}
+@item @@:@}@@
+@samp{)}
+@item @@&t@@
+Expands to nothing.
+@end table
+
+Quadrigraphs are replaced at a late stage of the translation process,
+after @command{m4} is run, so they do not get in the way of M4 quoting.
+For example, the string @samp{^@@<:@@}, independently of its quotation,
+appears as @samp{^[} in the output.
+
+The empty quadrigraph can be used:
+
+@itemize @minus
+@item to mark trailing spaces explicitly
+
+Trailing spaces are smashed by @command{autom4te}. This is a feature.
+
+@item to produce quadrigraphs and other strings reserved by m4sugar
+
+For instance @samp{@@<@@&t@@:@@} produces @samp{@@<:@@}. For a more
+contrived example:
+
+@example
+m4_define([a], [A])m4_define([b], [B])m4_define([c], [C])dnl
+m4_split([a )@}>=- b -=<@{( c])
+@result{}[a], [], [B], [], [c]
+m4_split([a )@}@@&t@@>=- b -=<@@&t@@@{( c])
+@result{}[a], [)@}>=-], [b], [-=<@{(], [c]
+@end example
+
+@item to escape @emph{occurrences} of forbidden patterns
+
+For instance you might want to mention @code{AC_FOO} in a comment, while
+still being sure that @command{autom4te} still catches unexpanded
+@samp{AC_*}. Then write @samp{AC@@&t@@_FOO}.
+@end itemize
+
+The name @samp{@@&t@@} was suggested by Paul Eggert:
+
+@quotation
+I should give some credit to the @samp{@@&t@@} pun. The @samp{&} is my
+own invention, but the @samp{t} came from the source code of the
+ALGOL68C compiler, written by Steve Bourne (of Bourne shell fame),
+and which used @samp{mt} to denote the empty string. In C, it would
+have looked like something like:
+
+@example
+char const mt[] = "";
+@end example
+
+@noindent
+but of course the source code was written in Algol 68.
+
+I don't know where he got @samp{mt} from: it could have been his own
+invention, and I suppose it could have been a common pun around the
+Cambridge University computer lab at the time.
+@end quotation
+
+
+@node Balancing Parentheses
+@subsection Dealing with unbalanced parentheses
+@cindex balancing parentheses
+@cindex parentheses, balancing
+@cindex unbalanced parentheses, managing
+
+One of the pitfalls of portable shell programming is that @command{case}
+statements require unbalanced parentheses (@pxref{case, , Limitations of
+Shell Builtins}). With syntax highlighting
+editors, the presence of unbalanced @samp{)} can interfere with editors
+that perform syntax highlighting of macro contents based on finding the
+matching @samp{(}. Another concern is how much editing must be done
+when transferring code snippets between shell scripts and macro
+definitions. But most importantly, the presence of unbalanced
+parentheses can introduce expansion bugs.
+
+For an example, here is an underquoted attempt to use the macro
+@code{my_case}, which happens to expand to a portable @command{case}
+statement:
+
+@example
+AC_DEFUN([my_case],
+[case $file_name in
+ *.c) echo "C source code";;
+esac])
+AS_IF(:, my_case)
+@end example
+
+@noindent
+In the above example, the @code{AS_IF} call underquotes its arguments.
+As a result, the unbalanced @samp{)} generated by the premature
+expansion of @code{my_case} results in expanding @code{AS_IF} with a
+truncated parameter, and the expansion is syntactically invalid:
+
+@example
+if :; then
+ case $file_name in
+ *.c
+fi echo "C source code";;
+esac)
+@end example
+
+If nothing else, this should emphasize the importance of the quoting
+arguments to macro calls. On the other hand, there are several
+variations for defining @code{my_case} to be more robust, even when used
+without proper quoting, each with some benefits and some drawbacks.
+
+@itemize @w{}
+@item Creative literal shell comment
+@example
+AC_DEFUN([my_case],
+[case $file_name in #(
+ *.c) echo "C source code";;
+esac])
+@end example
+@noindent
+This version provides balanced parentheses to several editors, and can
+be copied and pasted into a terminal as is. Unfortunately, it is still
+unbalanced as an Autoconf argument, since @samp{#(} is an M4 comment
+that masks the normal properties of @samp{(}.
+
+@item Quadrigraph shell comment
+@example
+AC_DEFUN([my_case],
+[case $file_name in @@%:@@(
+ *.c) echo "C source code";;
+esac])
+@end example
+@noindent
+This version provides balanced parentheses to even more editors, and can
+be used as a balanced Autoconf argument. Unfortunately, it requires
+some editing before it can be copied and pasted into a terminal, and the
+use of the quadrigraph @samp{@@%:@@} for @samp{#} reduces readability.
+
+@item Quoting just the parenthesis
+@example
+AC_DEFUN([my_case],
+[case $file_name in
+ *.c[)] echo "C source code";;
+esac])
+@end example
+@noindent
+This version quotes the @samp{)}, so that it can be used as a balanced
+Autoconf argument. As written, this is not balanced to an editor, but
+it can be coupled with @samp{[#(]} to meet that need, too. However, it
+still requires some edits before it can be copied and pasted into a
+terminal.
+
+@item Double-quoting the entire statement
+@example
+AC_DEFUN([my_case],
+[[case $file_name in #(
+ *.c) echo "C source code";;
+esac]])
+@end example
+@noindent
+Since the entire macro is double-quoted, there is no problem with using
+this as an Autoconf argument; and since the double-quoting is over the
+entire statement, this code can be easily copied and pasted into a
+terminal. However, the double quoting prevents the expansion of any
+macros inside the case statement, which may cause its own set of
+problems.
+
+@item Using @code{AS_CASE}
+@example
+AC_DEFUN([my_case],
+[AS_CASE([$file_name],
+ [*.c], [echo "C source code"])])
+@end example
+@noindent
+This version avoids the balancing issue altogether, by relying on
+@code{AS_CASE} (@pxref{Common Shell Constructs}); it also allows for the
+expansion of @code{AC_REQUIRE} to occur prior to the entire case
+statement, rather than within a branch of the case statement that might
+not be taken. However, the abstraction comes with a penalty that it is
+no longer a quick copy, paste, and edit to get back to shell code.
+@end itemize
+
+
+@node Quotation Rule Of Thumb
+@subsection Quotation Rule Of Thumb
+
+To conclude, the quotation rule of thumb is:
+
+@center @emph{One pair of quotes per pair of parentheses.}
+
+Never over-quote, never under-quote, in particular in the definition of
+macros. In the few places where the macros need to use brackets
+(usually in C program text or regular expressions), properly quote
+@emph{the arguments}!
+
+It is common to read Autoconf programs with snippets like:
+
+@example
+AC_TRY_LINK(
+changequote(<<, >>)dnl
+<<#include <time.h>
+#ifndef tzname /* For SGI. */
+extern char *tzname[]; /* RS6000 and others reject char **tzname. */
+#endif>>,
+changequote([, ])dnl
+[atoi (*tzname);], ac_cv_var_tzname=yes, ac_cv_var_tzname=no)
+@end example
+
+@noindent
+which is incredibly useless since @code{AC_TRY_LINK} is @emph{already}
+double quoting, so you just need:
+
+@example
+AC_TRY_LINK(
+[#include <time.h>
+#ifndef tzname /* For SGI. */
+extern char *tzname[]; /* RS6000 and others reject char **tzname. */
+#endif],
+ [atoi (*tzname);],
+ [ac_cv_var_tzname=yes],
+ [ac_cv_var_tzname=no])
+@end example
+
+@noindent
+The M4-fluent reader might note that these two examples are rigorously
+equivalent, since M4 swallows both the @samp{changequote(<<, >>)}
+and @samp{<<} @samp{>>} when it @dfn{collects} the arguments: these
+quotes are not part of the arguments!
+
+Simplified, the example above is just doing this:
+
+@example
+changequote(<<, >>)dnl
+<<[]>>
+changequote([, ])dnl
+@end example
+
+@noindent
+instead of simply:
+
+@example
+[[]]
+@end example
+
+With macros that do not double quote their arguments (which is the
+rule), double-quote the (risky) literals:
+
+@example
+AC_LINK_IFELSE([AC_LANG_PROGRAM(
+[[#include <time.h>
+#ifndef tzname /* For SGI. */
+extern char *tzname[]; /* RS6000 and others reject char **tzname. */
+#endif]],
+ [atoi (*tzname);])],
+ [ac_cv_var_tzname=yes],
+ [ac_cv_var_tzname=no])
+@end example
+
+Please note that the macro @code{AC_TRY_LINK} is obsolete, so you really
+should be using @code{AC_LINK_IFELSE} instead.
+
+@xref{Quadrigraphs}, for what to do if you run into a hopeless case
+where quoting does not suffice.
+
+When you create a @command{configure} script using newly written macros,
+examine it carefully to check whether you need to add more quotes in
+your macros. If one or more words have disappeared in the M4
+output, you need more quotes. When in doubt, quote.
+
+However, it's also possible to put on too many layers of quotes. If
+this happens, the resulting @command{configure} script may contain
+unexpanded macros. The @command{autoconf} program checks for this problem
+by looking for the string @samp{AC_} in @file{configure}. However, this
+heuristic does not work in general: for example, it does not catch
+overquoting in @code{AC_DEFINE} descriptions.
+
+
+@c ---------------------------------------- Using autom4te
+
+@node Using autom4te
+@section Using @command{autom4te}
+
+The Autoconf suite, including M4sugar, M4sh, and Autotest, in addition
+to Autoconf per se, heavily rely on M4. All these different uses
+revealed common needs factored into a layer over M4:
+@command{autom4te}@footnote{
+@c
+Yet another great name from Lars J. Aas.
+@c
+}.
+
+@command{autom4te} is a preprocessor that is like @command{m4}.
+It supports M4 extensions designed for use in tools like Autoconf.
+
+@menu
+* autom4te Invocation:: A GNU M4 wrapper
+* Customizing autom4te:: Customizing the Autoconf package
+@end menu
+
+@node autom4te Invocation
+@subsection Invoking @command{autom4te}
+
+The command line arguments are modeled after M4's:
+
+@example
+autom4te @var{options} @var{files}
+@end example
+
+@noindent
+@evindex M4
+where the @var{files} are directly passed to @command{m4}. By default,
+GNU M4 is found during configuration, but the environment
+variable
+@env{M4} can be set to tell @command{autom4te} where to look. In addition
+to the regular expansion, it handles the replacement of the quadrigraphs
+(@pxref{Quadrigraphs}), and of @samp{__oline__}, the current line in the
+output. It supports an extended syntax for the @var{files}:
+
+@table @file
+@item @var{file}.m4f
+This file is an M4 frozen file. Note that @emph{all the previous files
+are ignored}. See the option @option{--melt} for the rationale.
+
+@item @var{file}?
+If found in the library path, the @var{file} is included for expansion,
+otherwise it is ignored instead of triggering a failure.
+@end table
+
+@sp 1
+
+Of course, it supports the Autoconf common subset of options:
+
+@table @option
+@item --help
+@itemx -h
+Print a summary of the command line options and exit.
+
+@item --version
+@itemx -V
+Print the version number of Autoconf and exit.
+
+@item --verbose
+@itemx -v
+Report processing steps.
+
+@item --debug
+@itemx -d
+Don't remove the temporary files and be even more verbose.
+
+@item --include=@var{dir}
+@itemx -I @var{dir}
+Also look for input files in @var{dir}. Multiple invocations
+accumulate.
+
+@item --output=@var{file}
+@itemx -o @var{file}
+Save output (script or trace) to @var{file}. The file @option{-} stands
+for the standard output.
+@end table
+
+@sp 1
+
+As an extension of @command{m4}, it includes the following options:
+
+@table @option
+@item --warnings=@var{category}
+@itemx -W @var{category}
+@evindex WARNINGS
+@c FIXME: Point to the M4sugar macros, not Autoconf's.
+Report the warnings related to @var{category} (which can actually be a
+comma separated list). @xref{Reporting Messages}, macro
+@code{AC_DIAGNOSE}, for a comprehensive list of categories. Special
+values include:
+
+@table @samp
+@item all
+report all the warnings
+
+@item none
+report none
+
+@item error
+treats warnings as errors
+
+@item no-@var{category}
+disable warnings falling into @var{category}
+@end table
+
+Warnings about @samp{syntax} are enabled by default, and the environment
+variable @env{WARNINGS}, a comma separated list of categories, is
+honored. @samp{autom4te -W @var{category}} actually
+behaves as if you had run:
+
+@example
+autom4te --warnings=syntax,$WARNINGS,@var{category}
+@end example
+
+@noindent
+For example, if you want to disable defaults and @env{WARNINGS}
+of @command{autom4te}, but enable the warnings about obsolete
+constructs, you would use @option{-W none,obsolete}.
+
+@cindex Back trace
+@cindex Macro invocation stack
+@command{autom4te} displays a back trace for errors, but not for
+warnings; if you want them, just pass @option{-W error}.
+
+@item --melt
+@itemx -M
+Do not use frozen files. Any argument @code{@var{file}.m4f} is
+replaced by @code{@var{file}.m4}. This helps tracing the macros which
+are executed only when the files are frozen, typically
+@code{m4_define}. For instance, running:
+
+@example
+autom4te --melt 1.m4 2.m4f 3.m4 4.m4f input.m4
+@end example
+
+@noindent
+is roughly equivalent to running:
+
+@example
+m4 1.m4 2.m4 3.m4 4.m4 input.m4
+@end example
+
+@noindent
+while
+
+@example
+autom4te 1.m4 2.m4f 3.m4 4.m4f input.m4
+@end example
+
+@noindent
+is equivalent to:
+
+@example
+m4 --reload-state=4.m4f input.m4
+@end example
+
+@item --freeze
+@itemx -F
+Produce a frozen state file. @command{autom4te} freezing is stricter
+than M4's: it must produce no warnings, and no output other than empty
+lines (a line with white space is @emph{not} empty) and comments
+(starting with @samp{#}). Unlike @command{m4}'s similarly-named option,
+this option takes no argument:
+
+@example
+autom4te 1.m4 2.m4 3.m4 --freeze --output=3.m4f
+@end example
+
+@noindent
+corresponds to
+
+@example
+m4 1.m4 2.m4 3.m4 --freeze-state=3.m4f
+@end example
+
+@item --mode=@var{octal-mode}
+@itemx -m @var{octal-mode}
+Set the mode of the non-traces output to @var{octal-mode}; by default
+@samp{0666}.
+@end table
+
+@sp 1
+
+@cindex @file{autom4te.cache}
+As another additional feature over @command{m4}, @command{autom4te}
+caches its results. GNU M4 is able to produce a regular
+output and traces at the same time. Traces are heavily used in the
+GNU Build System: @command{autoheader} uses them to build
+@file{config.h.in}, @command{autoreconf} to determine what
+GNU Build System components are used, @command{automake} to
+``parse'' @file{configure.ac} etc. To avoid recomputation,
+traces are cached while performing regular expansion,
+and conversely. This cache is (actually, the caches are) stored in
+the directory @file{autom4te.cache}. @emph{It can safely be removed}
+at any moment (especially if for some reason @command{autom4te}
+considers it trashed).
+
+@table @option
+@item --cache=@var{directory}
+@itemx -C @var{directory}
+Specify the name of the directory where the result should be cached.
+Passing an empty value disables caching. Be sure to pass a relative
+file name, as for the time being, global caches are not supported.
+
+@item --no-cache
+Don't cache the results.
+
+@item --force
+@itemx -f
+If a cache is used, consider it obsolete (but update it anyway).
+@end table
+
+@sp 1
+
+Because traces are so important to the GNU Build System,
+@command{autom4te} provides high level tracing features as compared to
+M4, and helps exploiting the cache:
+
+@table @option
+@item --trace=@var{macro}[:@var{format}]
+@itemx -t @var{macro}[:@var{format}]
+Trace the invocations of @var{macro} according to the @var{format}.
+Multiple @option{--trace} arguments can be used to list several macros.
+Multiple @option{--trace} arguments for a single macro are not
+cumulative; instead, you should just make @var{format} as long as
+needed.
+
+The @var{format} is a regular string, with newlines if desired, and
+several special escape codes. It defaults to @samp{$f:$l:$n:$%}. It can
+use the following special escapes:
+
+@table @samp
+@item $$
+@c $$ restore font-lock
+The character @samp{$}.
+
+@item $f
+The file name from which @var{macro} is called.
+
+@item $l
+The line number from which @var{macro} is called.
+
+@item $d
+The depth of the @var{macro} call. This is an M4 technical detail that
+you probably don't want to know about.
+
+@item $n
+The name of the @var{macro}.
+
+@item $@var{num}
+The @var{num}th argument of the call to @var{macro}.
+
+@item $@@
+@itemx $@var{sep}@@
+@itemx $@{@var{separator}@}@@
+All the arguments passed to @var{macro}, separated by the character
+@var{sep} or the string @var{separator} (@samp{,} by default). Each
+argument is quoted, i.e., enclosed in a pair of square brackets.
+
+@item $*
+@itemx $@var{sep}*
+@itemx $@{@var{separator}@}*
+As above, but the arguments are not quoted.
+
+@item $%
+@itemx $@var{sep}%
+@itemx $@{@var{separator}@}%
+As above, but the arguments are not quoted, all new line characters in
+the arguments are smashed, and the default separator is @samp{:}.
+
+The escape @samp{$%} produces single-line trace outputs (unless you put
+newlines in the @samp{separator}), while @samp{$@@} and @samp{$*} do
+not.
+@end table
+
+@xref{autoconf Invocation}, for examples of trace uses.
+
+@item --preselect=@var{macro}
+@itemx -p @var{macro}
+Cache the traces of @var{macro}, but do not enable traces. This is
+especially important to save CPU cycles in the future. For instance,
+when invoked, @command{autoconf} preselects all the macros that
+@command{autoheader}, @command{automake}, @command{autoreconf}, etc.,
+trace, so that running @command{m4} is not needed to trace them: the
+cache suffices. This results in a huge speed-up.
+@end table
+
+@sp 1
+
+@cindex Autom4te Library
+Finally, @command{autom4te} introduces the concept of @dfn{Autom4te
+libraries}. They consists in a powerful yet extremely simple feature:
+sets of combined command line arguments:
+
+@table @option
+@item --language=@var{language}
+@itemx -l @var{language}
+Use the @var{language} Autom4te library. Current languages include:
+
+@table @code
+@item M4sugar
+create M4sugar output.
+
+@item M4sh
+create M4sh executable shell scripts.
+
+@item Autotest
+create Autotest executable test suites.
+
+@item Autoconf-without-aclocal-m4
+create Autoconf executable configure scripts without
+reading @file{aclocal.m4}.
+
+@item Autoconf
+create Autoconf executable configure scripts. This language inherits
+all the characteristics of @code{Autoconf-without-aclocal-m4} and
+additionally reads @file{aclocal.m4}.
+@end table
+
+@item --prepend-include=@var{dir}
+@itemx -B @var{dir}
+Prepend directory @var{dir} to the search path. This is used to include
+the language-specific files before any third-party macros.
+
+@end table
+
+@cindex @file{autom4te.cfg}
+As an example, if Autoconf is installed in its default location,
+@file{/usr/local}, the command @samp{autom4te -l m4sugar foo.m4} is
+strictly equivalent to the command:
+
+@example
+autom4te --prepend-include /usr/local/share/autoconf \
+ m4sugar/m4sugar.m4f --warnings syntax foo.m4
+@end example
+
+@noindent
+Recursive expansion applies here: the command @samp{autom4te -l m4sh foo.m4}
+is the same as @samp{autom4te --language M4sugar m4sugar/m4sh.m4f
+foo.m4}, i.e.:
+
+@example
+autom4te --prepend-include /usr/local/share/autoconf \
+ m4sugar/m4sugar.m4f m4sugar/m4sh.m4f --mode 777 foo.m4
+@end example
+
+@noindent
+The definition of the languages is stored in @file{autom4te.cfg}.
+
+@node Customizing autom4te
+@subsection Customizing @command{autom4te}
+
+One can customize @command{autom4te} via @file{~/.autom4te.cfg} (i.e.,
+as found in the user home directory), and @file{./.autom4te.cfg} (i.e.,
+as found in the directory from which @command{autom4te} is run). The
+order is first reading @file{autom4te.cfg}, then @file{~/.autom4te.cfg},
+then @file{./.autom4te.cfg}, and finally the command line arguments.
+
+In these text files, comments are introduced with @code{#}, and empty
+lines are ignored. Customization is performed on a per-language basis,
+wrapped in between a @samp{begin-language: "@var{language}"},
+@samp{end-language: "@var{language}"} pair.
+
+Customizing a language stands for appending options (@pxref{autom4te
+Invocation}) to the current definition of the language. Options, and
+more generally arguments, are introduced by @samp{args:
+@var{arguments}}. You may use the traditional shell syntax to quote the
+@var{arguments}.
+
+As an example, to disable Autoconf caches (@file{autom4te.cache})
+globally, include the following lines in @file{~/.autom4te.cfg}:
+
+@verbatim
+## ------------------ ##
+## User Preferences. ##
+## ------------------ ##
+
+begin-language: "Autoconf-without-aclocal-m4"
+args: --no-cache
+end-language: "Autoconf-without-aclocal-m4"
+@end verbatim
+
+
+@node Programming in M4sugar
+@section Programming in M4sugar
+
+@cindex M4sugar
+M4 by itself provides only a small, but sufficient, set of all-purpose
+macros. M4sugar introduces additional generic macros. Its name was
+coined by Lars J. Aas: ``Readability And Greater Understanding Stands 4
+M4sugar''.
+
+M4sugar reserves the macro namespace @samp{^_m4_} for internal use, and
+the macro namespace @samp{^m4_} for M4sugar macros. You should not
+define your own macros into these namespaces.
+
+@menu
+* Redefined M4 Macros:: M4 builtins changed in M4sugar
+* Diagnostic Macros:: Diagnostic messages from M4sugar
+* Diversion support:: Diversions in M4sugar
+* Conditional constructs:: Conditions in M4
+* Looping constructs:: Iteration in M4
+* Evaluation Macros:: More quotation and evaluation control
+* Text processing Macros:: String manipulation in M4
+* Number processing Macros:: Arithmetic computation in M4
+* Set manipulation Macros:: Set manipulation in M4
+* Forbidden Patterns:: Catching unexpanded macros
+@end menu
+
+@node Redefined M4 Macros
+@subsection Redefined M4 Macros
+
+@msindex{builtin}
+@msindex{changecom}
+@msindex{changequote}
+@msindex{debugfile}
+@msindex{debugmode}
+@msindex{decr}
+@msindex{define}
+@msindex{divnum}
+@msindex{errprint}
+@msindex{esyscmd}
+@msindex{eval}
+@msindex{format}
+@msindex{ifdef}
+@msindex{incr}
+@msindex{index}
+@msindex{indir}
+@msindex{len}
+@msindex{pushdef}
+@msindex{shift}
+@msindex{substr}
+@msindex{syscmd}
+@msindex{sysval}
+@msindex{traceoff}
+@msindex{traceon}
+@msindex{translit}
+With a few exceptions, all the M4 native macros are moved in the
+@samp{m4_} pseudo-namespace, e.g., M4sugar renames @code{define} as
+@code{m4_define} etc.
+
+The list of macros unchanged from M4, except for their name, is:
+@itemize @minus
+@item m4_builtin
+@item m4_changecom
+@item m4_changequote
+@item m4_debugfile
+@item m4_debugmode
+@item m4_decr
+@item m4_define
+@item m4_divnum
+@item m4_errprint
+@item m4_esyscmd
+@item m4_eval
+@item m4_format
+@item m4_ifdef
+@item m4_incr
+@item m4_index
+@item m4_indir
+@item m4_len
+@item m4_pushdef
+@item m4_shift
+@item m4_substr
+@item m4_syscmd
+@item m4_sysval
+@item m4_traceoff
+@item m4_traceon
+@item m4_translit
+@end itemize
+
+Some M4 macros are redefined, and are slightly incompatible with their
+native equivalent.
+
+@defmac __file__
+@defmacx __line__
+@MSindex __file__
+@MSindex __line__
+All M4 macros starting with @samp{__} retain their original name: for
+example, no @code{m4__file__} is defined.
+@end defmac
+
+@defmac __oline__
+@MSindex __oline__
+This is not technically a macro, but a feature of Autom4te. The
+sequence @code{__oline__} can be used similarly to the other m4sugar
+location macros, but rather than expanding to the location of the input
+file, it is translated to the line number where it appears in the output
+file after all other M4 expansions.
+@end defmac
+
+@defmac dnl
+@MSindex dnl
+This macro kept its original name: no @code{m4_dnl} is defined.
+@end defmac
+
+@defmac m4_bpatsubst (@var{string}, @var{regexp}, @ovar{replacement})
+@msindex{bpatsubst}
+This macro corresponds to @code{patsubst}. The name @code{m4_patsubst}
+is kept for future versions of M4sugar, once GNU M4 2.0 is
+released and supports extended regular expression syntax.
+@end defmac
+
+@defmac m4_bregexp (@var{string}, @var{regexp}, @ovar{replacement})
+@msindex{bregexp}
+This macro corresponds to @code{regexp}. The name @code{m4_regexp}
+is kept for future versions of M4sugar, once GNU M4 2.0 is
+released and supports extended regular expression syntax.
+@end defmac
+
+@defmac m4_copy (@var{source}, @var{dest})
+@defmacx m4_copy_force (@var{source}, @var{dest})
+@defmacx m4_rename (@var{source}, @var{dest})
+@defmacx m4_rename_force (@var{source}, @var{dest})
+@msindex{copy}
+@msindex{copy_force}
+@msindex{rename}
+@msindex{rename_force}
+These macros aren't directly builtins, but are closely related to
+@code{m4_pushdef} and @code{m4_defn}. @code{m4_copy} and
+@code{m4_rename} ensure that @var{dest} is undefined, while
+@code{m4_copy_force} and @code{m4_rename_force} overwrite any existing
+definition. All four macros then proceed to copy the entire pushdef
+stack of definitions of @var{source} over to @var{dest}. @code{m4_copy}
+and @code{m4_copy_force} preserve the source (including in the special
+case where @var{source} is undefined), while @code{m4_rename} and
+@code{m4_rename_force} undefine the original macro name (making it an
+error to rename an undefined @var{source}).
+
+Note that attempting to invoke a renamed macro might not work, since the
+macro may have a dependence on helper macros accessed via composition of
+@samp{$0} but that were not also renamed; likewise, other macros may
+have a hard-coded dependence on @var{source} and could break if
+@var{source} has been deleted. On the other hand, it is always safe to
+rename a macro to temporarily move it out of the way, then rename it
+back later to restore original semantics.
+@end defmac
+
+@defmac m4_defn (@var{macro}@dots{})
+@msindex{defn}
+This macro fails if @var{macro} is not defined, even when using older
+versions of M4 that did not warn. See @code{m4_undefine}.
+Unfortunately, in order to support these older versions of M4, there are
+some situations involving unbalanced quotes where concatenating multiple
+macros together will work in newer M4 but not in m4sugar; use
+quadrigraphs to work around this.
+@end defmac
+
+@defmac m4_divert (@var{diversion})
+@msindex{divert}
+M4sugar relies heavily on diversions, so rather than behaving as a
+primitive, @code{m4_divert} behaves like:
+@example
+m4_divert_pop()m4_divert_push([@var{diversion}])
+@end example
+@noindent
+@xref{Diversion support}, for more details about the use of the
+diversion stack. In particular, this implies that @var{diversion}
+should be a named diversion rather than a raw number. But be aware that
+it is seldom necessary to explicitly change the diversion stack, and
+that when done incorrectly, it can lead to syntactically invalid
+scripts.
+@end defmac
+
+@defmac m4_dumpdef (@var{name}@dots{})
+@defmacx m4_dumpdefs (@var{name}@dots{})
+@msindex{dumpdef}
+@msindex{dumpdefs}
+@code{m4_dumpdef} is like the M4 builtin, except that this version
+requires at least one argument, output always goes to standard error
+rather than the current debug file, no sorting is done on multiple
+arguments, and an error is issued if any
+@var{name} is undefined. @code{m4_dumpdefs} is a convenience macro that
+calls @code{m4_dumpdef} for all of the
+@code{m4_pushdef} stack of definitions, starting with the current, and
+silently does nothing if @var{name} is undefined.
+
+Unfortunately, due to a limitation in M4 1.4.x, any macro defined as a
+builtin is output as the empty string. This behavior is rectified by
+using M4 1.6 or newer. However, this behavior difference means that
+@code{m4_dumpdef} should only be used while developing m4sugar macros,
+and never in the final published form of a macro.
+@end defmac
+
+@defmac m4_esyscmd_s (@var{command})
+@msindex{esyscmd_s}
+Like @code{m4_esyscmd}, this macro expands to the result of running
+@var{command} in a shell. The difference is that any trailing newlines
+are removed, so that the output behaves more like shell command
+substitution.
+@end defmac
+
+@defmac m4_exit (@var{exit-status})
+@msindex{exit}
+This macro corresponds to @code{m4exit}.
+@end defmac
+
+@defmac m4_if (@var{comment})
+@defmacx m4_if (@var{string-1}, @var{string-2}, @var{equal}, @ovar{not-equal})
+@defmacx m4_if (@var{string-1}, @var{string-2}, @var{equal-1}, @
+ @var{string-3}, @var{string-4}, @var{equal-2}, @dots{}, @ovar{not-equal})
+@msindex{if}
+This macro corresponds to @code{ifelse}. @var{string-1} and
+@var{string-2} are compared literally, so usually one of the two
+arguments is passed unquoted. @xref{Conditional constructs}, for more
+conditional idioms.
+@end defmac
+
+@defmac m4_include (@var{file})
+@defmacx m4_sinclude (@var{file})
+@msindex{include}
+@msindex{sinclude}
+Like the M4 builtins, but warn against multiple inclusions of @var{file}.
+@end defmac
+
+@defmac m4_mkstemp (@var{template})
+@defmacx m4_maketemp (@var{template})
+@msindex{maketemp}
+@msindex{mkstemp}
+Posix requires @code{maketemp} to replace the trailing @samp{X}
+characters in @var{template} with the process id, without regards to the
+existence of a file by that name, but this a security hole. When this
+was pointed out to the Posix folks, they agreed to invent a new macro
+@code{mkstemp} that always creates a uniquely named file, but not all
+versions of GNU M4 support the new macro. In M4sugar,
+@code{m4_maketemp} and @code{m4_mkstemp} are synonyms for each other,
+and both have the secure semantics regardless of which macro the
+underlying M4 provides.
+@end defmac
+
+@defmac m4_popdef (@var{macro}@dots{})
+@msindex{popdef}
+This macro fails if @var{macro} is not defined, even when using older
+versions of M4 that did not warn. See @code{m4_undefine}.
+@end defmac
+
+@defmac m4_undefine (@var{macro}@dots{})
+@msindex{undefine}
+This macro fails if @var{macro} is not defined, even when using older
+versions of M4 that did not warn. Use
+
+@example
+m4_ifdef([@var{macro}], [m4_undefine([@var{macro}])])
+@end example
+
+@noindent
+if you are not sure whether @var{macro} is defined.
+@end defmac
+
+@defmac m4_undivert (@var{diversion}@dots{})
+@msindex{undivert}
+Unlike the M4 builtin, at least one @var{diversion} must be specified.
+Also, since the M4sugar diversion stack prefers named
+diversions, the use of @code{m4_undivert} to include files is risky.
+@xref{Diversion support}, for more details about the use of the
+diversion stack. But be aware that it is seldom necessary to explicitly
+change the diversion stack, and that when done incorrectly, it can lead
+to syntactically invalid scripts.
+@end defmac
+
+@defmac m4_wrap (@var{text})
+@defmacx m4_wrap_lifo (@var{text})
+@msindex{wrap}
+@msindex{wrap_lifo}
+These macros correspond to @code{m4wrap}. Posix requires arguments of
+multiple wrap calls to be reprocessed at EOF in the same order
+as the original calls (first-in, first-out). GNU M4 versions
+through 1.4.10, however, reprocess them in reverse order (last-in,
+first-out). Both orders are useful, therefore, you can rely on
+@code{m4_wrap} to provide FIFO semantics and @code{m4_wrap_lifo} for
+LIFO semantics, regardless of the underlying GNU M4 version.
+
+Unlike the GNU M4 builtin, these macros only recognize one
+argument, and avoid token pasting between consecutive invocations. On
+the other hand, nested calls to @code{m4_wrap} from within wrapped text
+work just as in the builtin.
+@end defmac
+
+
+@node Diagnostic Macros
+@subsection Diagnostic messages from M4sugar
+@cindex Messages, from @command{M4sugar}
+
+When macros statically diagnose abnormal situations, benign or fatal,
+they should report them using these macros. For issuing dynamic issues,
+i.e., when @command{configure} is run, see @ref{Printing Messages}.
+
+@defmac m4_assert (@var{expression}, @dvar{exit-status, 1})
+@msindex{assert}
+Assert that the arithmetic @var{expression} evaluates to non-zero.
+Otherwise, issue a fatal error, and exit @command{autom4te} with
+@var{exit-status}.
+@end defmac
+
+@defmac m4_errprintn (@var{message})
+@msindex{errprintn}
+Similar to the builtin @code{m4_errprint}, except that a newline is
+guaranteed after @var{message}.
+@end defmac
+
+@anchor{m4_fatal}
+@defmac m4_fatal (@var{message})
+@msindex{fatal}
+Report a severe error @var{message} prefixed with the current location,
+and have @command{autom4te} die.
+@end defmac
+
+@defmac m4_location
+@msindex{location}
+Useful as a prefix in a message line. Short for:
+@example
+__file__:__line__
+@end example
+@end defmac
+
+@anchor{m4_warn}
+@defmac m4_warn (@var{category}, @var{message})
+@msindex{warn}
+Report @var{message} as a warning (or as an error if requested by the
+user) if warnings of the @var{category} are turned on. If the message
+is emitted, it is prefixed with the current location, and followed by a
+call trace of all macros defined via @code{AC_DEFUN} used to get to the
+current expansion. You are encouraged to use standard categories, which
+currently include:
+
+@table @samp
+@item all
+messages that don't fall into one of the following categories. Use of an
+empty @var{category} is equivalent.
+
+@item cross
+related to cross compilation issues.
+
+@item obsolete
+use of an obsolete construct.
+
+@item syntax
+dubious syntactic constructs, incorrectly ordered macro calls.
+@end table
+@end defmac
+
+
+@node Diversion support
+@subsection Diversion support
+
+M4sugar makes heavy use of diversions under the hood, because it is
+often the case that
+text that must appear early in the output is not discovered until late
+in the input. Additionally, some of the topological sorting algorithms
+used in resolving macro dependencies use diversions. However, most
+macros should not need to change diversions directly, but rather rely on
+higher-level M4sugar macros to manage diversions transparently. If you
+change diversions improperly, you risk generating a syntactically
+invalid script, because an incorrect diversion will violate assumptions
+made by many macros about whether prerequisite text has been previously
+output. In short, if you manually change the diversion, you should not
+expect any macros provided by the Autoconf package to work until you
+have restored the diversion stack back to its original state.
+
+In the rare case that it is necessary to write a macro that explicitly
+outputs text to a different diversion, it is important to be aware of an
+M4 limitation regarding diversions: text only goes to a diversion if it
+is not part of argument collection. Therefore, any macro that changes
+the current diversion cannot be used as an unquoted argument to another
+macro, but must be expanded at the top level. The macro
+@code{m4_expand} will diagnose any attempt to change diversions, since
+it is generally useful only as an argument to another macro. The
+following example shows what happens when diversion manipulation is
+attempted within macro arguments:
+
+@example
+m4_do([normal text]
+m4_divert_push([KILL])unwanted[]m4_divert_pop([KILL])
+[m4_divert_push([KILL])discarded[]m4_divert_pop([KILL])])dnl
+@result{}normal text
+@result{}unwanted
+@end example
+
+@noindent
+Notice that the unquoted text @code{unwanted} is output, even though it
+was processed while the current diversion was @code{KILL}, because it
+was collected as part of the argument to @code{m4_do}. However, the
+text @code{discarded} disappeared as desired, because the diversion
+changes were single-quoted, and were not expanded until the top-level
+rescan of the output of @code{m4_do}.
+
+To make diversion management easier, M4sugar uses the concept of named
+diversions. Rather than using diversion numbers directly, it is nicer
+to associate a name with each diversion. The diversion number associated
+with a particular diversion name is an implementation detail, and a
+syntax warning is issued if a diversion number is used instead of a
+name. In general, you should not output text
+to a named diversion until after calling the appropriate initialization
+routine for your language (@code{m4_init}, @code{AS_INIT},
+@code{AT_INIT}, @dots{}), although there are some exceptions documented
+below.
+
+M4sugar defines two named diversions.
+@table @code
+@item KILL
+Text written to this diversion is discarded. This is the default
+diversion once M4sugar is initialized.
+@item GROW
+This diversion is used behind the scenes by topological sorting macros,
+such as @code{AC_REQUIRE}.
+@end table
+
+M4sh adds several more named diversions.
+@table @code
+@item BINSH
+This diversion is reserved for the @samp{#!} interpreter line.
+@item HEADER-REVISION
+This diversion holds text from @code{AC_REVISION}.
+@item HEADER-COMMENT
+This diversion holds comments about the purpose of a file.
+@item HEADER-COPYRIGHT
+This diversion is managed by @code{AC_COPYRIGHT}.
+@item M4SH-SANITIZE
+This diversion contains M4sh sanitization code, used to ensure M4sh is
+executing in a reasonable shell environment.
+@item M4SH-INIT
+This diversion contains M4sh initialization code, initializing variables
+that are required by other M4sh macros.
+@item BODY
+This diversion contains the body of the shell code, and is the default
+diversion once M4sh is initialized.
+@end table
+
+Autotest inherits diversions from M4sh, and changes the default
+diversion from @code{BODY} back to @code{KILL}. It also adds several
+more named diversions, with the following subset designed for developer
+use.
+@table @code
+@item PREPARE_TESTS
+This diversion contains initialization sequences which are executed
+after @file{atconfig} and @file{atlocal}, and after all command line
+arguments have been parsed, but prior to running any tests. It can be
+used to set up state that is required across all tests. This diversion
+will work even before @code{AT_INIT}.
+@end table
+
+Autoconf inherits diversions from M4sh, and adds the following named
+diversions which developers can utilize.
+@table @code
+@item DEFAULTS
+This diversion contains shell variable assignments to set defaults that
+must be in place before arguments are parsed. This diversion is placed
+early enough in @file{configure} that it is unsafe to expand any
+autoconf macros into this diversion.
+@item HELP_ENABLE
+If @code{AC_PRESERVE_HELP_ORDER} was used, then text placed in this
+diversion will be included as part of a quoted here-doc providing all of
+the @option{--help} output of @file{configure} related to options
+created by @code{AC_ARG_WITH} and @code{AC_ARG_ENABLE}.
+@item INIT_PREPARE
+This diversion occurs after all command line options have been parsed,
+but prior to the main body of the @file{configure} script. This
+diversion is the last chance to insert shell code such as variable
+assignments or shell function declarations that will used by the
+expansion of other macros.
+@end table
+
+For now, the remaining named diversions of Autoconf, Autoheader, and
+Autotest are not documented. In other words,
+intentionally outputting text into an undocumented diversion is subject
+to breakage in a future release of Autoconf.
+
+@defmac m4_cleardivert (@var{diversion}@dots{})
+@msindex{cleardivert}
+Permanently discard any text that has been diverted into
+@var{diversion}.
+@end defmac
+
+@defmac m4_divert_once (@var{diversion}, @ovar{content})
+@msindex{divert_once}
+Similar to @code{m4_divert_text}, except that @var{content} is only
+output to @var{diversion} if this is the first time that
+@code{m4_divert_once} has been called with its particular arguments.
+@end defmac
+
+@defmac m4_divert_pop (@ovar{diversion})
+@msindex{divert_pop}
+If provided, check that the current diversion is indeed @var{diversion}.
+Then change to the diversion located earlier on the stack, giving an
+error if an attempt is made to pop beyond the initial m4sugar diversion
+of @code{KILL}.
+@end defmac
+
+@defmac m4_divert_push (@var{diversion})
+@msindex{divert_push}
+Remember the former diversion on the diversion stack, and output
+subsequent text into @var{diversion}. M4sugar maintains a diversion
+stack, and issues an error if there is not a matching pop for every
+push.
+@end defmac
+
+@defmac m4_divert_text (@var{diversion}, @ovar{content})
+@msindex{divert_text}
+Output @var{content} and a newline into @var{diversion}, without
+affecting the current diversion. Shorthand for:
+@example
+m4_divert_push([@var{diversion}])@var{content}
+m4_divert_pop([@var{diversion}])dnl
+@end example
+
+One use of @code{m4_divert_text} is to develop two related macros, where
+macro @samp{MY_A} does the work, but adjusts what work is performed
+based on whether the optional macro @samp{MY_B} has also been expanded.
+Of course, it is possible to use @code{AC_BEFORE} within @code{MY_A} to
+require that @samp{MY_B} occurs first, if it occurs at all. But this
+imposes an ordering restriction on the user; it would be nicer if macros
+@samp{MY_A} and @samp{MY_B} can be invoked in either order. The trick
+is to let @samp{MY_B} leave a breadcrumb in an early diversion, which
+@samp{MY_A} can then use to determine whether @samp{MY_B} has been
+expanded.
+
+@example
+AC_DEFUN([MY_A],
+[# various actions
+if test -n "$b_was_used"; then
+ # extra action
+fi])
+AC_DEFUN([MY_B],
+[AC_REQUIRE([MY_A])dnl
+m4_divert_text([INIT_PREPARE], [b_was_used=true])])
+@end example
+
+@end defmac
+
+@defmac m4_init
+@msindex{init}
+Initialize the M4sugar environment, setting up the default named
+diversion to be @code{KILL}.
+@end defmac
+
+@node Conditional constructs
+@subsection Conditional constructs
+
+The following macros provide additional conditional constructs as
+convenience wrappers around @code{m4_if}.
+
+@defmac m4_bmatch (@var{string}, @var{regex-1}, @var{value-1}, @
+ @ovar{regex-2}, @ovar{value-2}, @dots{}, @ovar{default})
+@msindex{bmatch}
+The string @var{string} is repeatedly compared against a series of
+@var{regex} arguments; if a match is found, the expansion is the
+corresponding @var{value}, otherwise, the macro moves on to the next
+@var{regex}. If no @var{regex} match, then the result is the optional
+@var{default}, or nothing.
+@end defmac
+
+@defmac m4_bpatsubsts (@var{string}, @var{regex-1}, @var{subst-1}, @
+ @ovar{regex-2}, @ovar{subst-2}, @dots{})
+@msindex{bpatsubsts}
+The string @var{string} is altered by @var{regex-1} and @var{subst-1},
+as if by:
+@example
+m4_bpatsubst([[@var{string}]], [@var{regex}], [@var{subst}])
+@end example
+
+@noindent
+The result of the substitution is then passed through the next set of
+@var{regex} and @var{subst}, and so forth. An empty @var{subst} implies
+deletion of any matched portions in the current string. Note that this
+macro over-quotes @var{string}; this behavior is intentional, so that
+the result of each step of the recursion remains as a quoted string.
+However, it means that anchors (@samp{^} and @samp{$} in the @var{regex}
+will line up with the extra quotations, and not the characters of the
+original string. The overquoting is removed after the final
+substitution.
+@end defmac
+
+@defmac m4_case (@var{string}, @var{value-1}, @var{if-value-1}, @
+ @ovar{value-2}, @ovar{if-value-2}, @dots{}, @ovar{default})
+@msindex{case}
+Test @var{string} against multiple @var{value} possibilities, resulting
+in the first @var{if-value} for a match, or in the optional
+@var{default}. This is shorthand for:
+@example
+m4_if([@var{string}], [@var{value-1}], [@var{if-value-1}],
+ [@var{string}], [@var{value-2}], [@var{if-value-2}], @dots{},
+ [@var{default}])
+@end example
+@end defmac
+
+@defmac m4_cond (@var{test-1}, @var{value-1}, @var{if-value-1}, @
+ @ovar{test-2}, @ovar{value-2}, @ovar{if-value-2}, @dots{}, @ovar{default})
+@msindex{cond}
+This macro was introduced in Autoconf 2.62. Similar to @code{m4_if},
+except that each @var{test} is expanded only when it is encountered.
+This is useful for short-circuiting expensive tests; while @code{m4_if}
+requires all its strings to be expanded up front before doing
+comparisons, @code{m4_cond} only expands a @var{test} when all earlier
+tests have failed.
+
+For an example, these two sequences give the same result, but in the
+case where @samp{$1} does not contain a backslash, the @code{m4_cond}
+version only expands @code{m4_index} once, instead of five times, for
+faster computation if this is a common case for @samp{$1}. Notice that
+every third argument is unquoted for @code{m4_if}, and quoted for
+@code{m4_cond}:
+
+@example
+m4_if(m4_index([$1], [\]), [-1], [$2],
+ m4_eval(m4_index([$1], [\\]) >= 0), [1], [$2],
+ m4_eval(m4_index([$1], [\$]) >= 0), [1], [$2],
+ m4_eval(m4_index([$1], [\`]) >= 0), [1], [$3],
+ m4_eval(m4_index([$1], [\"]) >= 0), [1], [$3],
+ [$2])
+m4_cond([m4_index([$1], [\])], [-1], [$2],
+ [m4_eval(m4_index([$1], [\\]) >= 0)], [1], [$2],
+ [m4_eval(m4_index([$1], [\$]) >= 0)], [1], [$2],
+ [m4_eval(m4_index([$1], [\`]) >= 0)], [1], [$3],
+ [m4_eval(m4_index([$1], [\"]) >= 0)], [1], [$3],
+ [$2])
+@end example
+@end defmac
+
+@defmac m4_default (@var{expr-1}, @var{expr-2})
+@defmacx m4_default_quoted (@var{expr-1}, @var{expr-2})
+@defmacx m4_default_nblank (@var{expr-1}, @ovar{expr-2})
+@defmacx m4_default_nblank_quoted (@var{expr-1}, @ovar{expr-2})
+@msindex{default}
+@msindex{default_quoted}
+@msindex{default_nblank}
+@msindex{default_nblank_quoted}
+If @var{expr-1} contains text, use it. Otherwise, select @var{expr-2}.
+@code{m4_default} expands the result, while @code{m4_default_quoted}
+does not. Useful for providing a fixed default if the expression that
+results in @var{expr-1} would otherwise be empty. The difference
+between @code{m4_default} and @code{m4_default_nblank} is whether an
+argument consisting of just blanks (space, tab, newline) is
+significant. When using the expanding versions, note that an argument
+may contain text but still expand to an empty string.
+
+@example
+m4_define([active], [ACTIVE])dnl
+m4_define([empty], [])dnl
+m4_define([demo1], [m4_default([$1], [$2])])dnl
+m4_define([demo2], [m4_default_quoted([$1], [$2])])dnl
+m4_define([demo3], [m4_default_nblank([$1], [$2])])dnl
+m4_define([demo4], [m4_default_nblank_quoted([$1], [$2])])dnl
+demo1([active], [default])
+@result{}ACTIVE
+demo1([], [active])
+@result{}ACTIVE
+demo1([empty], [text])
+@result{}
+-demo1([ ], [active])-
+@result{}- -
+demo2([active], [default])
+@result{}active
+demo2([], [active])
+@result{}active
+demo2([empty], [text])
+@result{}empty
+-demo2([ ], [active])-
+@result{}- -
+demo3([active], [default])
+@result{}ACTIVE
+demo3([], [active])
+@result{}ACTIVE
+demo3([empty], [text])
+@result{}
+-demo3([ ], [active])-
+@result{}-ACTIVE-
+demo4([active], [default])
+@result{}active
+demo4([], [active])
+@result{}active
+demo4([empty], [text])
+@result{}empty
+-demo4([ ], [active])-
+@result{}-active-
+@end example
+@end defmac
+
+@defmac m4_define_default (@var{macro}, @ovar{default-definition})
+@msindex{define_default}
+If @var{macro} does not already have a definition, then define it to
+@var{default-definition}.
+@end defmac
+
+@defmac m4_ifblank (@var{cond}, @ovar{if-blank}, @ovar{if-text})
+@defmacx m4_ifnblank (@var{cond}, @ovar{if-text}, @ovar{if-blank})
+@msindex{ifblank}
+@msindex{ifnblank}
+If @var{cond} is empty or consists only of blanks (space, tab, newline),
+then expand @var{if-blank}; otherwise, expand @var{if-text}. Two
+variants exist, in order to make it easier to select the correct logical
+sense when using only two parameters. Note that this is more efficient
+than the equivalent behavior of:
+@example
+m4_ifval(m4_normalize([@var{cond}]), @var{if-text}, @var{if-blank})
+@end example
+@end defmac
+
+@defmac m4_ifndef (@var{macro}, @var{if-not-defined}, @ovar{if-defined})
+@msindex{ifndef}
+This is shorthand for:
+@example
+m4_ifdef([@var{macro}], [@var{if-defined}], [@var{if-not-defined}])
+@end example
+@end defmac
+
+@defmac m4_ifset (@var{macro}, @ovar{if-true}, @ovar{if-false})
+@msindex{ifset}
+If @var{macro} is undefined, or is defined as the empty string, expand
+to @var{if-false}. Otherwise, expands to @var{if-true}. Similar to:
+@example
+m4_ifval(m4_defn([@var{macro}]), [@var{if-true}], [@var{if-false}])
+@end example
+@noindent
+except that it is not an error if @var{macro} is undefined.
+@end defmac
+
+@defmac m4_ifval (@var{cond}, @ovar{if-true}, @ovar{if-false})
+@msindex{ifval}
+Expands to @var{if-true} if @var{cond} is not empty, otherwise to
+@var{if-false}. This is shorthand for:
+@example
+m4_if([@var{cond}], [], [@var{if-false}], [@var{if-true}])
+@end example
+@end defmac
+
+@defmac m4_ifvaln (@var{cond}, @ovar{if-true}, @ovar{if-false})
+@msindex{ifvaln}
+Similar to @code{m4_ifval}, except guarantee that a newline is present
+after any non-empty expansion. Often followed by @code{dnl}.
+@end defmac
+
+@defmac m4_n (@var{text})
+@msindex{n}
+Expand to @var{text}, and add a newline if @var{text} is not empty.
+Often followed by @code{dnl}.
+@end defmac
+
+
+@node Looping constructs
+@subsection Looping constructs
+
+The following macros are useful in implementing recursive algorithms in
+M4, including loop operations. An M4 list is formed by quoting a list
+of quoted elements; generally the lists are comma-separated, although
+@code{m4_foreach_w} is whitespace-separated. For example, the list
+@samp{[[a], [b,c]]} contains two elements: @samp{[a]} and @samp{[b,c]}.
+It is common to see lists with unquoted elements when those elements are
+not likely to be macro names, as in @samp{[fputc_unlocked,
+fgetc_unlocked]}.
+
+Although not generally recommended, it is possible for quoted lists to
+have side effects; all side effects are expanded only once, and prior to
+visiting any list element. On the other hand, the fact that unquoted
+macros are expanded exactly once means that macros without side effects
+can be used to generate lists. For example,
+
+@example
+m4_foreach([i], [[1], [2], [3]m4_errprintn([hi])], [i])
+@error{}hi
+@result{}123
+m4_define([list], [[1], [2], [3]])
+@result{}
+m4_foreach([i], [list], [i])
+@result{}123
+@end example
+
+@defmac m4_argn (@var{n}, @ovar{arg}@dots{})
+@msindex{argn}
+Extracts argument @var{n} (larger than 0) from the remaining arguments.
+If there are too few arguments, the empty string is used. For any
+@var{n} besides 1, this is more efficient than the similar
+@samp{m4_car(m4_shiftn([@var{n}], [], [@var{arg}@dots{}]))}.
+@end defmac
+
+@defmac m4_car (@var{arg}@dots{})
+@msindex{car}
+Expands to the quoted first @var{arg}. Can be used with @code{m4_cdr}
+to recursively iterate
+through a list. Generally, when using quoted lists of quoted elements,
+@code{m4_car} should be called without any extra quotes.
+@end defmac
+
+@defmac m4_cdr (@var{arg}@dots{})
+@msindex{cdr}
+Expands to a quoted list of all but the first @var{arg}, or the empty
+string if there was only one argument. Generally, when using quoted
+lists of quoted elements, @code{m4_cdr} should be called without any
+extra quotes.
+
+For example, this is a simple implementation of @code{m4_map}; note how
+each iteration checks for the end of recursion, then merely applies the
+first argument to the first element of the list, then repeats with the
+rest of the list. (The actual implementation in M4sugar is a bit more
+involved, to gain some speed and share code with @code{m4_map_sep}, and
+also to avoid expanding side effects in @samp{$2} twice).
+@example
+m4_define([m4_map], [m4_ifval([$2],
+ [m4_apply([$1], m4_car($2))[]$0([$1], m4_cdr($2))])])dnl
+m4_map([ m4_eval], [[[1]], [[1+1]], [[10],[16]]])
+@result{} 1 2 a
+@end example
+@end defmac
+
+@defmac m4_for (@var{var}, @var{first}, @var{last}, @ovar{step}, @
+ @var{expression})
+@msindex{for}
+Loop over the numeric values between @var{first} and @var{last}
+including bounds by increments of @var{step}. For each iteration,
+expand @var{expression} with the numeric value assigned to @var{var}.
+If @var{step} is omitted, it defaults to @samp{1} or @samp{-1} depending
+on the order of the limits. If given, @var{step} has to match this
+order. The number of iterations is determined independently from
+definition of @var{var}; iteration cannot be short-circuited or
+lengthened by modifying @var{var} from within @var{expression}.
+@end defmac
+
+@defmac m4_foreach (@var{var}, @var{list}, @var{expression})
+@msindex{foreach}
+Loop over the comma-separated M4 list @var{list}, assigning each value
+to @var{var}, and expand @var{expression}. The following example
+outputs two lines:
+
+@example
+m4_foreach([myvar], [[foo], [bar, baz]],
+ [echo myvar
+])dnl
+@result{}echo foo
+@result{}echo bar, baz
+@end example
+
+Note that for some forms of @var{expression}, it may be faster to use
+@code{m4_map_args}.
+@end defmac
+
+@anchor{m4_foreach_w}
+@defmac m4_foreach_w (@var{var}, @var{list}, @var{expression})
+@msindex{foreach_w}
+Loop over the white-space-separated list @var{list}, assigning each value
+to @var{var}, and expand @var{expression}. If @var{var} is only
+referenced once in @var{expression}, it is more efficient to use
+@code{m4_map_args_w}.
+
+The deprecated macro @code{AC_FOREACH} is an alias of
+@code{m4_foreach_w}.
+@end defmac
+
+@defmac m4_map (@var{macro}, @var{list})
+@defmacx m4_mapall (@var{macro}, @var{list})
+@defmacx m4_map_sep (@var{macro}, @var{separator}, @var{list})
+@defmacx m4_mapall_sep (@var{macro}, @var{separator}, @var{list})
+@msindex{map}
+@msindex{mapall}
+@msindex{map_sep}
+@msindex{mapall_sep}
+Loop over the comma separated quoted list of argument descriptions in
+@var{list}, and invoke @var{macro} with the arguments. An argument
+description is in turn a comma-separated quoted list of quoted elements,
+suitable for @code{m4_apply}. The macros @code{m4_map} and
+@code{m4_map_sep} ignore empty argument descriptions, while
+@code{m4_mapall} and @code{m4_mapall_sep} invoke @var{macro} with no
+arguments. The macros @code{m4_map_sep} and @code{m4_mapall_sep}
+additionally expand @var{separator} between invocations of @var{macro}.
+
+Note that @var{separator} is expanded, unlike in @code{m4_join}. When
+separating output with commas, this means that the map result can be
+used as a series of arguments, by using a single-quoted comma as
+@var{separator}, or as a single string, by using a double-quoted comma.
+
+@example
+m4_map([m4_count], [])
+@result{}
+m4_map([ m4_count], [[],
+ [[1]],
+ [[1], [2]]])
+@result{} 1 2
+m4_mapall([ m4_count], [[],
+ [[1]],
+ [[1], [2]]])
+@result{} 0 1 2
+m4_map_sep([m4_eval], [,], [[[1+2]],
+ [[10], [16]]])
+@result{}3,a
+m4_map_sep([m4_echo], [,], [[[a]], [[b]]])
+@result{}a,b
+m4_count(m4_map_sep([m4_echo], [,], [[[a]], [[b]]]))
+@result{}2
+m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]])
+@result{}a,b
+m4_count(m4_map_sep([m4_echo], [[,]], [[[a]], [[b]]]))
+@result{}1
+@end example
+@end defmac
+
+@defmac m4_map_args (@var{macro}, @var{arg}@dots{})
+@msindex{map_args}
+Repeatedly invoke @var{macro} with each successive @var{arg} as its only
+argument. In the following example, three solutions are presented with
+the same expansion; the solution using @code{m4_map_args} is the most
+efficient.
+@example
+m4_define([active], [ACTIVE])dnl
+m4_foreach([var], [[plain], [active]], [ m4_echo(m4_defn([var]))])
+@result{} plain active
+m4_map([ m4_echo], [[[plain]], [[active]]])
+@result{} plain active
+m4_map_args([ m4_echo], [plain], [active])
+@result{} plain active
+@end example
+
+In cases where it is useful to operate on additional parameters besides
+the list elements, the macro @code{m4_curry} can be used in @var{macro}
+to supply the argument currying necessary to generate the desired
+argument list. In the following example, @code{list_add_n} is more
+efficient than @code{list_add_x}. On the other hand, using
+@code{m4_map_args_sep} can be even more efficient.
+
+@example
+m4_define([list], [[1], [2], [3]])dnl
+m4_define([add], [m4_eval(([$1]) + ([$2]))])dnl
+dnl list_add_n(N, ARG...)
+dnl Output a list consisting of each ARG added to N
+m4_define([list_add_n],
+[m4_shift(m4_map_args([,m4_curry([add], [$1])], m4_shift($@@)))])dnl
+list_add_n([1], list)
+@result{}2,3,4
+list_add_n([2], list)
+@result{}3,4,5
+m4_define([list_add_x],
+[m4_shift(m4_foreach([var], m4_dquote(m4_shift($@@)),
+ [,add([$1],m4_defn([var]))]))])dnl
+list_add_x([1], list)
+@result{}2,3,4
+@end example
+@end defmac
+
+@defmac m4_map_args_pair (@var{macro}, @dvar{macro-end, macro}, @
+ @var{arg}@dots{})
+@msindex{map_args_pair}
+For every pair of arguments @var{arg}, invoke @var{macro} with two
+arguments. If there is an odd number of arguments, invoke
+@var{macro-end}, which defaults to @var{macro}, with the remaining
+argument.
+
+@example
+m4_map_args_pair([, m4_reverse], [], [1], [2], [3])
+@result{}, 2, 1, 3
+m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3])
+@result{}, 2, 1, [3]
+m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3], [4])
+@result{}, 2, 1, 4, 3
+@end example
+@end defmac
+
+@defmac m4_map_args_sep (@ovar{pre}, @ovar{post}, @ovar{sep}, @var{arg}@dots{})
+@msindex{map_args_sep}
+Expand the sequence @code{@var{pre}[@var{arg}]@var{post}} for each
+argument, additionally expanding @var{sep} between arguments. One
+common use of this macro is constructing a macro call, where the opening
+and closing parentheses are split between @var{pre} and @var{post}; in
+particular, @code{m4_map_args([@var{macro}], [@var{arg}])} is equivalent
+to @code{m4_map_args_sep([@var{macro}(], [)], [], [@var{arg}])}. This
+macro provides the most efficient means for iterating over an arbitrary
+list of arguments, particularly when repeatedly constructing a macro
+call with more arguments than @var{arg}.
+@end defmac
+
+@defmac m4_map_args_w (@var{string}, @ovar{pre}, @ovar{post}, @ovar{sep})
+@msindex{map_args_w}
+Expand the sequence @code{@var{pre}[word]@var{post}} for each word in
+the whitespace-separated @var{string}, additionally expanding @var{sep}
+between words. This macro provides the most efficient means for
+iterating over a whitespace-separated string. In particular,
+@code{m4_map_args_w([@var{string}], [@var{action}(], [)])} is more
+efficient than @code{m4_foreach_w([var], [@var{string}],
+[@var{action}(m4_defn([var]))])}.
+@end defmac
+
+@defmac m4_shiftn (@var{count}, @dots{})
+@defmacx m4_shift2 (@dots{})
+@defmacx m4_shift3 (@dots{})
+@msindex{shift2}
+@msindex{shift3}
+@msindex{shiftn}
+@code{m4_shiftn} performs @var{count} iterations of @code{m4_shift},
+along with validation that enough arguments were passed in to match the
+shift count, and that the count is positive. @code{m4_shift2} and
+@code{m4_shift3} are specializations
+of @code{m4_shiftn}, introduced in Autoconf 2.62, and are more efficient
+for two and three shifts, respectively.
+@end defmac
+
+@defmac m4_stack_foreach (@var{macro}, @var{action})
+@defmacx m4_stack_foreach_lifo (@var{macro}, @var{action})
+@msindex{stack_foreach}
+@msindex{stack_foreach_lifo}
+For each of the @code{m4_pushdef} definitions of @var{macro}, expand
+@var{action} with the single argument of a definition of @var{macro}.
+@code{m4_stack_foreach} starts with the oldest definition, while
+@code{m4_stack_foreach_lifo} starts with the current definition.
+@var{action} should not push or pop definitions of @var{macro}, nor is
+there any guarantee that the current definition of @var{macro} matches
+the argument that was passed to @var{action}. The macro @code{m4_curry}
+can be used if @var{action} needs more than one argument, although in
+that case it is more efficient to use @var{m4_stack_foreach_sep}.
+
+Due to technical limitations, there are a few low-level m4sugar
+functions, such as @code{m4_pushdef}, that cannot be used as the
+@var{macro} argument.
+
+@example
+m4_pushdef([a], [1])m4_pushdef([a], [2])dnl
+m4_stack_foreach([a], [ m4_incr])
+@result{} 2 3
+m4_stack_foreach_lifo([a], [ m4_curry([m4_substr], [abcd])])
+@result{} cd bcd
+@end example
+@end defmac
+
+@defmac m4_stack_foreach_sep (@var{macro}, @ovar{pre}, @ovar{post}, @ovar{sep})
+@defmacx m4_stack_foreach_sep_lifo (@var{macro}, @ovar{pre}, @ovar{post}, @
+ @ovar{sep})
+@msindex{stack_foreach_sep}
+@msindex{stack_foreach_sep_lifo}
+Expand the sequence @code{@var{pre}[definition]@var{post}} for each
+@code{m4_pushdef} definition of @var{macro}, additionally expanding
+@var{sep} between definitions. @code{m4_stack_foreach_sep} visits the
+oldest definition first, while @code{m4_stack_foreach_sep_lifo} visits
+the current definition first. This macro provides the most efficient
+means for iterating over a pushdef stack. In particular,
+@code{m4_stack_foreach([@var{macro}], [@var{action}])} is short for
+@code{m4_stack_foreach_sep([@var{macro}], [@var{action}(], [)])}.
+@end defmac
+
+@node Evaluation Macros
+@subsection Evaluation Macros
+
+The following macros give some control over the order of the evaluation
+by adding or removing levels of quotes.
+
+@defmac m4_apply (@var{macro}, @var{list})
+@msindex{apply}
+Apply the elements of the quoted, comma-separated @var{list} as the
+arguments to @var{macro}. If @var{list} is empty, invoke @var{macro}
+without arguments. Note the difference between @code{m4_indir}, which
+expects its first argument to be a macro name but can use names that are
+otherwise invalid, and @code{m4_apply}, where @var{macro} can contain
+other text, but must end in a valid macro name.
+@example
+m4_apply([m4_count], [])
+@result{}0
+m4_apply([m4_count], [[]])
+@result{}1
+m4_apply([m4_count], [[1], [2]])
+@result{}2
+m4_apply([m4_join], [[|], [1], [2]])
+@result{}1|2
+@end example
+@end defmac
+
+@defmac m4_count (@var{arg}, @dots{})
+@msindex{count}
+This macro returns the decimal count of the number of arguments it was
+passed.
+@end defmac
+
+@defmac m4_curry (@var{macro}, @var{arg}@dots{})
+@msindex{curry}
+This macro performs argument currying. The expansion of this macro is
+another macro name that expects exactly one argument; that argument is
+then appended to the @var{arg} list, and then @var{macro} is expanded
+with the resulting argument list.
+
+@example
+m4_curry([m4_curry], [m4_reverse], [1])([2])([3])
+@result{}3, 2, 1
+@end example
+
+Unfortunately, due to a limitation in M4 1.4.x, it is not possible to
+pass the definition of a builtin macro as the argument to the output of
+@code{m4_curry}; the empty string is used instead of the builtin token.
+This behavior is rectified by using M4 1.6 or newer.
+@end defmac
+
+@defmac m4_do (@var{arg}, @dots{})
+@msindex{do}
+This macro loops over its arguments and expands each @var{arg} in
+sequence. Its main use is for readability; it allows the use of
+indentation and fewer @code{dnl} to result in the same expansion. This
+macro guarantees that no expansion will be concatenated with subsequent
+text; to achieve full concatenation, use @code{m4_unquote(m4_join([],
+@var{arg@dots{}}))}.
+
+@example
+m4_define([ab],[1])m4_define([bc],[2])m4_define([abc],[3])dnl
+m4_do([a],[b])c
+@result{}abc
+m4_unquote(m4_join([],[a],[b]))c
+@result{}3
+m4_define([a],[A])m4_define([b],[B])m4_define([c],[C])dnl
+m4_define([AB],[4])m4_define([BC],[5])m4_define([ABC],[6])dnl
+m4_do([a],[b])c
+@result{}ABC
+m4_unquote(m4_join([],[a],[b]))c
+@result{}3
+@end example
+@end defmac
+
+@defmac m4_dquote (@var{arg}, @dots{})
+@msindex{dquote}
+Return the arguments as a quoted list of quoted arguments.
+Conveniently, if there is just one @var{arg}, this effectively adds a
+level of quoting.
+@end defmac
+
+@defmac m4_dquote_elt (@var{arg}, @dots{})
+@msindex{dquote_elt}
+Return the arguments as a series of double-quoted arguments. Whereas
+@code{m4_dquote} returns a single argument, @code{m4_dquote_elt} returns
+as many arguments as it was passed.
+@end defmac
+
+@defmac m4_echo (@var{arg}, @dots{})
+@msindex{echo}
+Return the arguments, with the same level of quoting. Other than
+discarding whitespace after unquoted commas, this macro is a no-op.
+@end defmac
+
+@defmac m4_expand (@var{arg})
+@msindex{expand}
+Return the expansion of @var{arg} as a quoted string. Whereas
+@code{m4_quote} is designed to collect expanded text into a single
+argument, @code{m4_expand} is designed to perform one level of expansion
+on quoted text. One distinction is in the treatment of whitespace
+following a comma in the original @var{arg}. Any time multiple
+arguments are collected into one with @code{m4_quote}, the M4 argument
+collection rules discard the whitespace. However, with @code{m4_expand},
+whitespace is preserved, even after the expansion of macros contained in
+@var{arg}. Additionally, @code{m4_expand} is able to expand text that
+would involve an unterminated comment, whereas expanding that same text
+as the argument to @code{m4_quote} runs into difficulty in finding the
+end of the argument. Since manipulating diversions during argument
+collection is inherently unsafe, @code{m4_expand} issues an error if
+@var{arg} attempts to change the current diversion (@pxref{Diversion
+support}).
+
+@example
+m4_define([active], [ACT, IVE])dnl
+m4_define([active2], [[ACT, IVE]])dnl
+m4_quote(active, active)
+@result{}ACT,IVE,ACT,IVE
+m4_expand([active, active])
+@result{}ACT, IVE, ACT, IVE
+m4_quote(active2, active2)
+@result{}ACT, IVE,ACT, IVE
+m4_expand([active2, active2])
+@result{}ACT, IVE, ACT, IVE
+m4_expand([# m4_echo])
+@result{}# m4_echo
+m4_quote(# m4_echo)
+)
+@result{}# m4_echo)
+@result{}
+@end example
+
+Note that @code{m4_expand} cannot handle an @var{arg} that expands to
+literal unbalanced quotes, but that quadrigraphs can be used when
+unbalanced output is necessary. Likewise, unbalanced parentheses should
+be supplied with double quoting or a quadrigraph.
+
+@example
+m4_define([pattern], [[!@@<:@@]])dnl
+m4_define([bar], [BAR])dnl
+m4_expand([case $foo in
+ m4_defn([pattern])@@:@}@@ bar ;;
+ *[)] blah ;;
+esac])
+@result{}case $foo in
+@result{} [![]) BAR ;;
+@result{} *) blah ;;
+@result{}esac
+@end example
+@end defmac
+
+@defmac m4_ignore (@dots{})
+@msindex{ignore}
+This macro was introduced in Autoconf 2.62. Expands to nothing,
+ignoring all of its arguments. By itself, this isn't very useful.
+However, it can be used to conditionally ignore an arbitrary number of
+arguments, by deciding which macro name to apply to a list of arguments.
+@example
+dnl foo outputs a message only if [debug] is defined.
+m4_define([foo],
+[m4_ifdef([debug],[AC_MSG_NOTICE],[m4_ignore])([debug message])])
+@end example
+
+Note that for earlier versions of Autoconf, the macro @code{__gnu__} can
+serve the same purpose, although it is less readable.
+@end defmac
+
+@defmac m4_make_list (@var{arg}, @dots{})
+@msindex{make_list}
+This macro exists to aid debugging of M4sugar algorithms. Its net
+effect is similar to @code{m4_dquote}---it produces a quoted list of
+quoted arguments, for each @var{arg}. The difference is that this
+version uses a comma-newline separator instead of just comma, to improve
+readability of the list; with the result that it is less efficient than
+@code{m4_dquote}.
+@example
+m4_define([zero],[0])m4_define([one],[1])m4_define([two],[2])dnl
+m4_dquote(zero, [one], [[two]])
+@result{}[0],[one],[[two]]
+m4_make_list(zero, [one], [[two]])
+@result{}[0],
+@result{}[one],
+@result{}[[two]]
+m4_foreach([number], m4_dquote(zero, [one], [[two]]), [ number])
+@result{} 0 1 two
+m4_foreach([number], m4_make_list(zero, [one], [[two]]), [ number])
+@result{} 0 1 two
+@end example
+@end defmac
+
+@c m4_noquote is too dangerous to document - it invokes macros that
+@c probably rely on @samp{[]} nested quoting for proper operation. The
+@c user should generally prefer m4_unquote instead.
+
+@defmac m4_quote (@var{arg}, @dots{})
+@msindex{quote}
+Return the arguments as a single entity, i.e., wrap them into a pair of
+quotes. This effectively collapses multiple arguments into one,
+although it loses whitespace after unquoted commas in the process.
+@end defmac
+
+@defmac m4_reverse (@var{arg}, @dots{})
+@msindex{reverse}
+Outputs each argument with the same level of quoting, but in reverse
+order, and with space following each comma for readability.
+
+@example
+m4_define([active], [ACT,IVE])
+@result{}
+m4_reverse(active, [active])
+@result{}active, IVE, ACT
+@end example
+@end defmac
+
+@defmac m4_unquote (@var{arg}, @dots{})
+@msindex{unquote}
+This macro was introduced in Autoconf 2.62. Expand each argument,
+separated by commas. For a single @var{arg}, this effectively removes a
+layer of quoting, and @code{m4_unquote([@var{arg}])} is more efficient
+than the equivalent @code{m4_do([@var{arg}])}. For multiple arguments,
+this results in an unquoted list of expansions. This is commonly used
+with @code{m4_split}, in order to convert a single quoted list into a
+series of quoted elements.
+@end defmac
+
+The following example aims at emphasizing the difference between several
+scenarios: not using these macros, using @code{m4_defn}, using
+@code{m4_quote}, using @code{m4_dquote}, and using @code{m4_expand}.
+
+@example
+$ @kbd{cat example.m4}
+dnl Overquote, so that quotes are visible.
+m4_define([show], [$[]1 = [$1], $[]@@ = [$@@]])
+m4_define([a], [A])
+m4_define([mkargs], [1, 2[,] 3])
+m4_define([arg1], [[$1]])
+m4_divert([0])dnl
+show(a, b)
+show([a, b])
+show(m4_quote(a, b))
+show(m4_dquote(a, b))
+show(m4_expand([a, b]))
+
+arg1(mkargs)
+arg1([mkargs])
+arg1(m4_defn([mkargs]))
+arg1(m4_quote(mkargs))
+arg1(m4_dquote(mkargs))
+arg1(m4_expand([mkargs]))
+$ @kbd{autom4te -l m4sugar example.m4}
+$1 = A, $@@ = [A],[b]
+$1 = a, b, $@@ = [a, b]
+$1 = A,b, $@@ = [A,b]
+$1 = [A],[b], $@@ = [[A],[b]]
+$1 = A, b, $@@ = [A, b]
+
+1
+mkargs
+1, 2[,] 3
+1,2, 3
+[1],[2, 3]
+1, 2, 3
+@end example
+
+
+@node Text processing Macros
+@subsection String manipulation in M4
+
+The following macros may be used to manipulate strings in M4. Many of
+the macros in this section intentionally result in quoted strings as
+output, rather than subjecting the arguments to further expansions. As
+a result, if you are manipulating text that contains active M4
+characters, the arguments are passed with single quoting rather than
+double.
+
+@defmac m4_append (@var{macro-name}, @var{string}, @ovar{separator})
+@defmacx m4_append_uniq (@var{macro-name}, @var{string}, @ovar{separator} @
+ @ovar{if-uniq}, @ovar{if-duplicate})
+@msindex{append}
+@msindex{append_uniq}
+Redefine @var{macro-name} to its former contents with @var{separator}
+and @var{string} added at the end. If @var{macro-name} was undefined
+before (but not if it was defined but empty), then no @var{separator} is
+added. As of Autoconf 2.62, neither @var{string} nor @var{separator}
+are expanded during this macro; instead, they are expanded when
+@var{macro-name} is invoked.
+
+@code{m4_append} can be used to grow strings, and @code{m4_append_uniq}
+to grow strings without duplicating substrings. Additionally,
+@code{m4_append_uniq} takes two optional parameters as of Autoconf 2.62;
+@var{if-uniq} is expanded if @var{string} was appended, and
+@var{if-duplicate} is expanded if @var{string} was already present.
+Also, @code{m4_append_uniq} warns if @var{separator} is not empty, but
+occurs within @var{string}, since that can lead to duplicates.
+
+Note that @code{m4_append} can scale linearly in the length of the final
+string, depending on the quality of the underlying M4 implementation,
+while @code{m4_append_uniq} has an inherent quadratic scaling factor.
+If an algorithm can tolerate duplicates in the final string, use the
+former for speed. If duplicates must be avoided, consider using
+@code{m4_set_add} instead (@pxref{Set manipulation Macros}).
+
+@example
+m4_define([active], [ACTIVE])dnl
+m4_append([sentence], [This is an])dnl
+m4_append([sentence], [ active ])dnl
+m4_append([sentence], [symbol.])dnl
+sentence
+@result{}This is an ACTIVE symbol.
+m4_undefine([active])dnl
+@result{}This is an active symbol.
+m4_append_uniq([list], [one], [, ], [new], [existing])
+@result{}new
+m4_append_uniq([list], [one], [, ], [new], [existing])
+@result{}existing
+m4_append_uniq([list], [two], [, ], [new], [existing])
+@result{}new
+m4_append_uniq([list], [three], [, ], [new], [existing])
+@result{}new
+m4_append_uniq([list], [two], [, ], [new], [existing])
+@result{}existing
+list
+@result{}one, two, three
+m4_dquote(list)
+@result{}[one],[two],[three]
+m4_append([list2], [one], [[, ]])dnl
+m4_append_uniq([list2], [two], [[, ]])dnl
+m4_append([list2], [three], [[, ]])dnl
+list2
+@result{}one, two, three
+m4_dquote(list2)
+@result{}[one, two, three]
+@end example
+@end defmac
+
+@defmac m4_append_uniq_w (@var{macro-name}, @var{strings})
+@msindex{append_uniq_w}
+This macro was introduced in Autoconf 2.62. It is similar to
+@code{m4_append_uniq}, but treats @var{strings} as a whitespace
+separated list of words to append, and only appends unique words.
+@var{macro-name} is updated with a single space between new words.
+@example
+m4_append_uniq_w([numbers], [1 1 2])dnl
+m4_append_uniq_w([numbers], [ 2 3 ])dnl
+numbers
+@result{}1 2 3
+@end example
+@end defmac
+
+@defmac m4_chomp (@var{string})
+@defmacx m4_chomp_all (@var{string})
+@msindex{chomp}
+@msindex{chomp_all}
+Output @var{string} in quotes, but without a trailing newline. The
+macro @code{m4_chomp} is slightly faster, and removes at most one
+newline; the macro @code{m4_chomp_all} removes all consecutive trailing
+newlines. Unlike @code{m4_flatten}, embedded newlines are left intact,
+and backslash does not influence the result.
+@end defmac
+
+@defmac m4_combine (@ovar{separator}, @var{prefix-list}, @ovar{infix}, @
+ @var{suffix-1}, @ovar{suffix-2}, @dots{})
+@msindex{combine}
+This macro produces a quoted string containing the pairwise combination
+of every element of the quoted, comma-separated @var{prefix-list}, and
+every element from the @var{suffix} arguments. Each pairwise
+combination is joined with @var{infix} in the middle, and successive
+pairs are joined by @var{separator}. No expansion occurs on any of the
+arguments. No output occurs if either the @var{prefix} or @var{suffix}
+list is empty, but the lists can contain empty elements.
+@example
+m4_define([a], [oops])dnl
+m4_combine([, ], [[a], [b], [c]], [-], [1], [2], [3])
+@result{}a-1, a-2, a-3, b-1, b-2, b-3, c-1, c-2, c-3
+m4_combine([, ], [[a], [b]], [-])
+@result{}
+m4_combine([, ], [[a], [b]], [-], [])
+@result{}a-, b-
+m4_combine([, ], [], [-], [1], [2])
+@result{}
+m4_combine([, ], [[]], [-], [1], [2])
+@result{}-1, -2
+@end example
+@end defmac
+
+@defmac m4_escape (@var{string})
+@msindex{escape}
+Convert all instances of @samp{[}, @samp{]}, @samp{#}, and @samp{$}
+within @var{string} into their respective quadrigraphs. The result is
+still a quoted string.
+@end defmac
+
+@defmac m4_flatten (@var{string})
+@msindex{flatten}
+Flatten @var{string} into a single line. Delete all backslash-newline
+pairs, and replace all remaining newlines with a space. The result is
+still a quoted string.
+@end defmac
+
+@defmac m4_join (@ovar{separator}, @var{args}@dots{})
+@defmacx m4_joinall (@ovar{separator}, @var{args}@dots{})
+@msindex{join}
+@msindex{joinall}
+Concatenate each @var{arg}, separated by @var{separator}.
+@code{joinall} uses every argument, while @code{join} omits empty
+arguments so that there are no back-to-back separators in the output.
+The result is a quoted string.
+@example
+m4_define([active], [ACTIVE])dnl
+m4_join([|], [one], [], [active], [two])
+@result{}one|active|two
+m4_joinall([|], [one], [], [active], [two])
+@result{}one||active|two
+@end example
+
+Note that if all you intend to do is join @var{args} with commas between
+them, to form a quoted list suitable for @code{m4_foreach}, it is more
+efficient to use @code{m4_dquote}.
+@end defmac
+
+@defmac m4_newline (@ovar{text})
+@msindex{newline}
+This macro was introduced in Autoconf 2.62, and expands to a newline,
+followed by any @var{text}.
+It is primarily useful for maintaining macro formatting, and ensuring
+that M4 does not discard leading whitespace during argument collection.
+@end defmac
+
+@defmac m4_normalize (@var{string})
+@msindex{normalize}
+Remove leading and trailing spaces and tabs, sequences of
+backslash-then-newline, and replace multiple spaces, tabs, and newlines
+with a single space. This is a combination of @code{m4_flatten} and
+@code{m4_strip}. To determine if @var{string} consists only of bytes
+that would be removed by @code{m4_normalize}, you can use
+@code{m4_ifblank}.
+@end defmac
+
+@defmac m4_re_escape (@var{string})
+@msindex{re_escape}
+Backslash-escape all characters in @var{string} that are active in
+regexps.
+@end defmac
+
+@c We cannot use @dvar because the macro expansion mistreats backslashes.
+@defmac m4_split (@var{string}, @r{[}@var{regexp} = @samp{[\t ]+}@r{]})
+@msindex{split}
+Split @var{string} into an M4 list of elements quoted by @samp{[} and
+@samp{]}, while keeping white space at the beginning and at the end.
+If @var{regexp} is given, use it instead of @samp{[\t ]+} for splitting.
+If @var{string} is empty, the result is an empty list.
+@end defmac
+
+@defmac m4_strip (@var{string})
+@msindex{strip}
+Strip whitespace from @var{string}. Sequences of spaces and tabs are
+reduced to a single space, then leading and trailing spaces are removed.
+The result is still a quoted string. Note that this does not interfere
+with newlines; if you want newlines stripped as well, consider
+@code{m4_flatten}, or do it all at once with @code{m4_normalize}. To
+quickly test if @var{string} has only whitespace, use @code{m4_ifblank}.
+@end defmac
+
+@defmac m4_text_box (@var{message}, @dvar{frame, -})
+@msindex{text_box}
+Add a text box around @var{message}, using @var{frame} as the border
+character above and below the message. The @var{frame} argument must be
+a single byte, and does not support quadrigraphs.
+The frame correctly accounts for
+the subsequent expansion of @var{message}. For example:
+@example
+m4_define([macro], [abc])dnl
+m4_text_box([macro])
+@result{}## --- ##
+@result{}## abc ##
+@result{}## --- ##
+@end example
+
+The @var{message} must contain balanced quotes and parentheses, although
+quadrigraphs can be used to work around this.
+@end defmac
+
+@defmac m4_text_wrap (@var{string}, @ovar{prefix}, @
+ @dvar{prefix1, @var{prefix}}, @dvar{width, 79})
+@msindex{text_wrap}
+Break @var{string} into a series of whitespace-separated words, then
+output those words separated by spaces, and wrapping lines any time the
+output would exceed @var{width} columns. If given, @var{prefix1} begins
+the first line, and @var{prefix} begins all wrapped lines. If
+@var{prefix1} is longer than @var{prefix}, then the first line consists
+of just @var{prefix1}. If @var{prefix} is longer than @var{prefix1},
+padding is inserted so that the first word of @var{string} begins at the
+same indentation as all wrapped lines. Note that using literal tab
+characters in any of the arguments will interfere with the calculation
+of width. No expansions occur on @var{prefix}, @var{prefix1}, or the
+words of @var{string}, although quadrigraphs are recognized.
+
+For some examples:
+@example
+m4_text_wrap([Short string */], [ ], [/* ], [20])
+@result{}/* Short string */
+m4_text_wrap([Much longer string */], [ ], [/* ], [20])
+@result{}/* Much longer
+@result{} string */
+m4_text_wrap([Short doc.], [ ], [ --short ], [30])
+@result{} --short Short doc.
+m4_text_wrap([Short doc.], [ ], [ --too-wide ], [30])
+@result{} --too-wide
+@result{} Short doc.
+m4_text_wrap([Super long documentation.], [ ],
+ [ --too-wide ], 30)
+@result{} --too-wide
+@result{} Super long
+@result{} documentation.
+@end example
+@end defmac
+
+@defmac m4_tolower (@var{string})
+@defmacx m4_toupper (@var{string})
+@msindex{tolower}
+@msindex{toupper}
+Return @var{string} with letters converted to upper or lower case,
+respectively.
+@end defmac
+
+@node Number processing Macros
+@subsection Arithmetic computation in M4
+
+The following macros facilitate integer arithmetic operations.
+Where a parameter is documented as taking an arithmetic expression, you
+can use anything that can be parsed by @code{m4_eval}.
+
+@defmac m4_cmp (@var{expr-1}, @var{expr-2})
+@msindex{cmp}
+Compare the arithmetic expressions @var{expr-1} and @var{expr-2}, and
+expand to @samp{-1} if @var{expr-1} is smaller, @samp{0} if they are
+equal, and @samp{1} if @var{expr-1} is larger.
+@end defmac
+
+@defmac m4_list_cmp (@var{list-1}, @var{list-2})
+@msindex{list_cmp}
+Compare the two M4 lists consisting of comma-separated arithmetic
+expressions, left to right. Expand to @samp{-1} for the first element
+pairing where the value from @var{list-1} is smaller, @samp{1} where the
+value from @var{list-2} is smaller, or @samp{0} if both lists have the
+same values. If one list is shorter than the other, the remaining
+elements of the longer list are compared against zero.
+@example
+m4_list_cmp([1, 0], [1])
+@result{}0
+m4_list_cmp([1, [1 * 0]], [1, 0])
+@result{}0
+m4_list_cmp([1, 2], [1, 0])
+@result{}1
+m4_list_cmp([1, [1+1], 3],[1, 2])
+@result{}1
+m4_list_cmp([1, 2, -3], [1, 2])
+@result{}-1
+m4_list_cmp([1, 0], [1, 2])
+@result{}-1
+m4_list_cmp([1], [1, 2])
+@result{}-1
+@end example
+@end defmac
+
+@defmac m4_max (@var{arg}, @dots{})
+@msindex{max}
+This macro was introduced in Autoconf 2.62. Expand to the decimal value
+of the maximum arithmetic expression among all the arguments.
+@end defmac
+
+@defmac m4_min (@var{arg}, @dots{})
+@msindex{min}
+This macro was introduced in Autoconf 2.62. Expand to the decimal value
+of the minimum arithmetic expression among all the arguments.
+@end defmac
+
+@defmac m4_sign (@var{expr})
+@msindex{sign}
+Expand to @samp{-1} if the arithmetic expression @var{expr} is negative,
+@samp{1} if it is positive, and @samp{0} if it is zero.
+@end defmac
+
+@anchor{m4_version_compare}
+@defmac m4_version_compare (@var{version-1}, @var{version-2})
+@msindex{version_compare}
+This macro was introduced in Autoconf 2.53, but had a number of
+usability limitations that were not lifted until Autoconf 2.62. Compare
+the version strings @var{version-1} and @var{version-2}, and expand to
+@samp{-1} if @var{version-1} is smaller, @samp{0} if they are the same,
+or @samp{1} @var{version-2} is smaller. Version strings must be a list
+of elements separated by @samp{.}, @samp{,} or @samp{-}, where each
+element is a number along with optional case-insensitive letters
+designating beta releases. The comparison stops at the leftmost element
+that contains a difference, although a 0 element compares equal to a
+missing element.
+
+It is permissible to include commit identifiers in @var{version}, such
+as an abbreviated SHA1 of the commit, provided there is still a
+monotonically increasing prefix to allow for accurate version-based
+comparisons. For example, this paragraph was written when the
+development snapshot of autoconf claimed to be at version
+@samp{2.61a-248-dc51}, or 248 commits after the 2.61a release, with an
+abbreviated commit identification of @samp{dc51}.
+
+@example
+m4_version_compare([1.1], [2.0])
+@result{}-1
+m4_version_compare([2.0b], [2.0a])
+@result{}1
+m4_version_compare([1.1.1], [1.1.1a])
+@result{}-1
+m4_version_compare([1.2], [1.1.1a])
+@result{}1
+m4_version_compare([1.0], [1])
+@result{}0
+m4_version_compare([1.1pre], [1.1PRE])
+@result{}0
+m4_version_compare([1.1a], [1,10])
+@result{}-1
+m4_version_compare([2.61a], [2.61a-248-dc51])
+@result{}-1
+m4_version_compare([2.61b], [2.61a-248-dc51])
+@result{}1
+@end example
+@end defmac
+
+@defmac m4_version_prereq (@var{version}, @ovar{if-new-enough}, @
+ @dvar{if-old, m4_fatal})
+@msindex{version_prereq}
+Compares @var{version} against the version of Autoconf currently
+running. If the running version is at @var{version} or newer, expand
+@var{if-new-enough}, but if @var{version} is larger than the version
+currently executing, expand @var{if-old}, which defaults to printing an
+error message and exiting m4sugar with status 63. When given only one
+argument, this behaves like @code{AC_PREREQ} (@pxref{Versioning}).
+Remember that the autoconf philosophy favors feature checks over version
+checks.
+@end defmac
+
+@node Set manipulation Macros
+@subsection Set manipulation in M4
+@cindex Set manipulation
+@cindex Data structure, set
+@cindex Unordered set manipulation
+
+Sometimes, it is necessary to track a set of data, where the order does
+not matter and where there are no duplicates in the set. The following
+macros facilitate set manipulations. Each set is an opaque object,
+which can only be accessed via these basic operations. The underlying
+implementation guarantees linear scaling for set creation, which is more
+efficient than using the quadratic @code{m4_append_uniq}. Both set
+names and values can be arbitrary strings, except for unbalanced quotes.
+This implementation ties up memory for removed elements until the next
+operation that must traverse all the elements of a set; and although
+that may slow down some operations until the memory for removed elements
+is pruned, it still guarantees linear performance.
+
+@defmac m4_set_add (@var{set}, @var{value}, @ovar{if-uniq}, @ovar{if-dup})
+@msindex{set_add}
+Adds the string @var{value} as a member of set @var{set}. Expand
+@var{if-uniq} if the element was added, or @var{if-dup} if it was
+previously in the set. Operates in amortized constant time, so that set
+creation scales linearly.
+@end defmac
+
+@defmac m4_set_add_all (@var{set}, @var{value}@dots{})
+@msindex{set_add_all}
+Adds each @var{value} to the set @var{set}. This is slightly more
+efficient than repeatedly invoking @code{m4_set_add}.
+@end defmac
+
+@defmac m4_set_contains (@var{set}, @var{value}, @ovar{if-present}, @
+ @ovar{if-absent})
+@msindex{set_contains}
+Expands @var{if-present} if the string @var{value} is a member of
+@var{set}, otherwise @var{if-absent}.
+
+@example
+m4_set_contains([a], [1], [yes], [no])
+@result{}no
+m4_set_add([a], [1], [added], [dup])
+@result{}added
+m4_set_add([a], [1], [added], [dup])
+@result{}dup
+m4_set_contains([a], [1], [yes], [no])
+@result{}yes
+m4_set_remove([a], [1], [removed], [missing])
+@result{}removed
+m4_set_contains([a], [1], [yes], [no])
+@result{}no
+m4_set_remove([a], [1], [removed], [missing])
+@result{}missing
+@end example
+@end defmac
+
+@defmac m4_set_contents (@var{set}, @ovar{sep})
+@defmacx m4_set_dump (@var{set}, @ovar{sep})
+@msindex{set_contents}
+@msindex{set_dump}
+Expands to a single string consisting of all the members of the set
+@var{set}, each separated by @var{sep}, which is not expanded.
+@code{m4_set_contents} leaves the elements in @var{set} but reclaims any
+memory occupied by removed elements, while @code{m4_set_dump} is a
+faster one-shot action that also deletes the set. No provision is made
+for disambiguating members that contain a non-empty @var{sep} as a
+substring; use @code{m4_set_empty} to distinguish between an empty set
+and the set containing only the empty string. The order of the output
+is unspecified; in the current implementation, part of the speed of
+@code{m4_set_dump} results from using a different output order than
+@code{m4_set_contents}. These macros scale linearly in the size of the
+set before memory pruning, and @code{m4_set_contents([@var{set}],
+[@var{sep}])} is faster than
+@code{m4_joinall([@var{sep}]m4_set_listc([@var{set}]))}.
+
+@example
+m4_set_add_all([a], [1], [2], [3])
+@result{}
+m4_set_contents([a], [-])
+@result{}1-2-3
+m4_joinall([-]m4_set_listc([a]))
+@result{}1-2-3
+m4_set_dump([a], [-])
+@result{}3-2-1
+m4_set_contents([a])
+@result{}
+m4_set_add([a], [])
+@result{}
+m4_set_contents([a], [-])
+@result{}
+@end example
+@end defmac
+
+@defmac m4_set_delete (@var{set})
+@msindex{set_delete}
+Delete all elements and memory associated with @var{set}. This is
+linear in the set size, and faster than removing one element at a time.
+@end defmac
+
+@defmac m4_set_difference (@var{seta}, @var{setb})
+@defmacx m4_set_intersection (@var{seta}, @var{setb})
+@defmacx m4_set_union (@var{seta}, @var{setb})
+@msindex{set_difference}
+@msindex{set_intersection}
+@msindex{set_union}
+Compute the relation between @var{seta} and @var{setb}, and output the
+result as a list of quoted arguments without duplicates and with a
+leading comma. Set difference selects the elements in @var{seta} but
+not @var{setb}, intersection selects only elements in both sets, and
+union selects elements in either set. These actions are linear in the
+sum of the set sizes. The leading comma is necessary to distinguish
+between no elements and the empty string as the only element.
+
+@example
+m4_set_add_all([a], [1], [2], [3])
+@result{}
+m4_set_add_all([b], [3], [], [4])
+@result{}
+m4_set_difference([a], [b])
+@result{},1,2
+m4_set_difference([b], [a])
+@result{},,4
+m4_set_intersection([a], [b])
+@result{},3
+m4_set_union([a], [b])
+@result{},1,2,3,,4
+@end example
+@end defmac
+
+@defmac m4_set_empty (@var{set}, @ovar{if-empty}, @ovar{if-elements})
+@msindex{set_empty}
+Expand @var{if-empty} if the set @var{set} has no elements, otherwise
+expand @var{if-elements}. This macro operates in constant time. Using
+this macro can help disambiguate output from @code{m4_set_contents} or
+@code{m4_set_list}.
+@end defmac
+
+@defmac m4_set_foreach (@var{set}, @var{variable}, @var{action})
+@msindex{set_foreach}
+For each element in the set @var{set}, expand @var{action} with the
+macro @var{variable} defined as the set element. Behavior is
+unspecified if @var{action} recursively lists the contents of @var{set}
+(although listing other sets is acceptable), or if it modifies the set
+in any way other than removing the element currently contained in
+@var{variable}. This macro is faster than the corresponding
+@code{m4_foreach([@var{variable}],
+m4_indir([m4_dquote]m4_set_listc([@var{set}])), [@var{action}])},
+although @code{m4_set_map} might be faster still.
+
+@example
+m4_set_add_all([a]m4_for([i], [1], [5], [], [,i]))
+@result{}
+m4_set_contents([a])
+@result{}12345
+m4_set_foreach([a], [i],
+ [m4_if(m4_eval(i&1), [0], [m4_set_remove([a], i, [i])])])
+@result{}24
+m4_set_contents([a])
+@result{}135
+@end example
+@end defmac
+
+@defmac m4_set_list (@var{set})
+@defmacx m4_set_listc (@var{set})
+@msindex{set_list}
+@msindex{set_listc}
+Produce a list of arguments, where each argument is a quoted element
+from the set @var{set}. The variant @code{m4_set_listc} is unambiguous,
+by adding a leading comma if there are any set elements, whereas the
+variant @code{m4_set_list} cannot distinguish between an empty set and a
+set containing only the empty string. These can be directly used in
+macros that take multiple arguments, such as @code{m4_join} or
+@code{m4_set_add_all}, or wrapped by @code{m4_dquote} for macros that
+take a quoted list, such as @code{m4_map} or @code{m4_foreach}. Any
+memory occupied by removed elements is reclaimed during these macros.
+
+@example
+m4_set_add_all([a], [1], [2], [3])
+@result{}
+m4_set_list([a])
+@result{}1,2,3
+m4_set_list([b])
+@result{}
+m4_set_listc([b])
+@result{}
+m4_count(m4_set_list([b]))
+@result{}1
+m4_set_empty([b], [0], [m4_count(m4_set_list([b]))])
+@result{}0
+m4_set_add([b], [])
+@result{}
+m4_set_list([b])
+@result{}
+m4_set_listc([b])
+@result{},
+m4_count(m4_set_list([b]))
+@result{}1
+m4_set_empty([b], [0], [m4_count(m4_set_list([b]))])
+@result{}1
+@end example
+@end defmac
+
+@defmac m4_set_map (@var{set}, @var{action})
+@msindex{set_map}
+For each element in the set @var{set}, expand @var{action} with a single
+argument of the set element. Behavior is unspecified if @var{action}
+recursively lists the contents of @var{set} (although listing other sets
+is acceptable), or if it modifies the set in any way other than removing
+the element passed as an argument. This macro is faster than either
+corresponding counterpart of
+@code{m4_map_args([@var{action}]m4_set_listc([@var{set}]))} or
+@code{m4_set_foreach([@var{set}], [var],
+[@var{action}(m4_defn([var]))])}. It is possible to use @code{m4_curry}
+if more than one argument is needed for @var{action}, although it is
+more efficient to use @code{m4_set_map_sep} in that case.
+@end defmac
+
+@defmac m4_set_map_sep (@var{set}, @ovar{pre}, @ovar{post}, @ovar{sep})
+@msindex{set_map_sep}
+For each element in the set @var{set}, expand
+@code{@var{pre}[element]@var{post}}, additionally expanding @var{sep}
+between elements. Behavior is unspecified if the expansion recursively
+lists the contents of @var{set} (although listing other sets
+is acceptable), or if it modifies the set in any way other than removing
+the element visited by the expansion. This macro provides the most
+efficient means for non-destructively visiting the elements of a set; in
+particular, @code{m4_set_map([@var{set}], [@var{action}])} is equivalent
+to @code{m4_set_map_sep([@var{set}], [@var{action}(], [)])}.
+@end defmac
+
+@defmac m4_set_remove (@var{set}, @var{value}, @ovar{if-present}, @
+ @ovar{if-absent})
+@msindex{set_remove}
+If @var{value} is an element in the set @var{set}, then remove it and
+expand @var{if-present}. Otherwise expand @var{if-absent}. This macro
+operates in constant time so that multiple removals will scale linearly
+rather than quadratically; but when used outside of
+@code{m4_set_foreach} or @code{m4_set_map}, it leaves memory occupied
+until the set is later
+compacted by @code{m4_set_contents} or @code{m4_set_list}. Several
+other set operations are then less efficient between the time of element
+removal and subsequent memory compaction, but still maintain their
+guaranteed scaling performance.
+@end defmac
+
+@defmac m4_set_size (@var{set})
+@msindex{set_size}
+Expand to the size of the set @var{set}. This implementation operates
+in constant time, and is thus more efficient than
+@code{m4_eval(m4_count(m4_set_listc([set])) - 1)}.
+@end defmac
+
+
+@node Forbidden Patterns
+@subsection Forbidden Patterns
+@cindex Forbidden patterns
+@cindex Patterns, forbidden
+
+M4sugar provides a means to define suspicious patterns, patterns
+describing tokens which should not be found in the output. For
+instance, if an Autoconf @file{configure} script includes tokens such as
+@samp{AC_DEFINE}, or @samp{dnl}, then most probably something went
+wrong (typically a macro was not evaluated because of overquotation).
+
+M4sugar forbids all the tokens matching @samp{^_?m4_} and @samp{^dnl$}.
+Additional layers, such as M4sh and Autoconf, add additional forbidden
+patterns to the list.
+
+@defmac m4_pattern_forbid (@var{pattern})
+@msindex{pattern_forbid}
+Declare that no token matching @var{pattern} must be found in the output.
+Comments are not checked; this can be a problem if, for instance, you
+have some macro left unexpanded after an @samp{#include}. No consensus
+is currently found in the Autoconf community, as some people consider it
+should be valid to name macros in comments (which doesn't make sense to
+the authors of this documentation: input, such as macros, should be
+documented by @samp{dnl} comments; reserving @samp{#}-comments to
+document the output).
+@end defmac
+
+Of course, you might encounter exceptions to these generic rules, for
+instance you might have to refer to @samp{$m4_flags}.
+
+@defmac m4_pattern_allow (@var{pattern})
+@msindex{pattern_allow}
+Any token matching @var{pattern} is allowed, including if it matches an
+@code{m4_pattern_forbid} pattern.
+@end defmac
+
+@node Debugging via autom4te
+@section Debugging via autom4te
+@cindex debugging tips
+@cindex autom4te debugging tips
+@cindex m4sugar debugging tips
+At times, it is desirable to see what was happening inside m4, to see
+why output was not matching expectations. However, post-processing done
+by @command{autom4te} means that directly using the m4 builtin
+@code{m4_traceon} is likely to interfere with operation. Also, frequent
+diversion changes and the concept of forbidden tokens make it difficult
+to use @code{m4_defn} to generate inline comments in the final output.
+
+There are a couple of tools to help with this. One is the use of the
+@option{--trace} option provided by @command{autom4te} (as well as each
+of the programs that wrap @command{autom4te}, such as
+@command{autoconf}), in order to inspect when a macro is called and with
+which arguments. For example, when this paragraph was written, the
+autoconf version could be found by:
+
+@example
+$ @kbd{autoconf --trace=AC_INIT}
+configure.ac:23:AC_INIT:GNU Autoconf:2.63b.95-3963:bug-autoconf@@gnu.org
+$ @kbd{autoconf --trace='AC_INIT:version is $2'}
+version is 2.63b.95-3963
+@end example
+
+Another trick is to print out the expansion of various m4 expressions to
+standard error or to an independent file, with no further m4 expansion,
+and without interfering with diversion changes or the post-processing
+done to standard output. @code{m4_errprintn} shows a given expression
+on standard error. For example, if you want to see the expansion of an
+autoconf primitive or of one of your autoconf macros, you can do it like
+this:
+
+@example
+$ @kbd{cat <<\EOF > configure.ac}
+AC_INIT
+m4_errprintn([The definition of AC_DEFINE_UNQUOTED:])
+m4_errprintn(m4_defn([AC_DEFINE_UNQUOTED]))
+AC_OUTPUT
+EOF
+$ @kbd{autoconf}
+@error{}The definition of AC_DEFINE_UNQUOTED:
+@error{}_AC_DEFINE_Q([], $@@)
+@end example
+
+@node Programming in M4sh
+@chapter Programming in M4sh
+
+M4sh, pronounced ``mash'', is aiming at producing portable Bourne shell
+scripts. This name was coined by Lars J. Aas, who notes that,
+according to the Webster's Revised Unabridged Dictionary (1913):
+
+@quotation
+Mash \Mash\, n. [Akin to G. meisch, maisch, meische, maische, mash,
+wash, and prob.@: to AS. miscian to mix. See ``Mix''.]
+
+@enumerate 1
+@item
+A mass of mixed ingredients reduced to a soft pulpy state by beating or
+pressure@enddots{}
+
+@item
+A mixture of meal or bran and water fed to animals.
+
+@item
+A mess; trouble. [Obs.] --Beau.@: & Fl.
+@end enumerate
+@end quotation
+
+M4sh reserves the M4 macro namespace @samp{^_AS_} for internal use, and
+the namespace @samp{^AS_} for M4sh macros. It also reserves the shell
+and environment variable namespace @samp{^as_}, and the here-document
+delimiter namespace @samp{^_AS[A-Z]} in the output file. You should not
+define your own macros or output shell code that conflicts with these
+namespaces.
+
+@menu
+* Common Shell Constructs:: Portability layer for common shell constructs
+* Polymorphic Variables:: Support for indirect variable names
+* Initialization Macros:: Macros to establish a sane shell environment
+* File Descriptor Macros:: File descriptor macros for input and output
+@end menu
+
+@node Common Shell Constructs
+@section Common Shell Constructs
+
+M4sh provides portable alternatives for some common shell constructs
+that unfortunately are not portable in practice.
+
+@c Deprecated, to be replaced by a better API
+@ignore
+@defmac AS_BASENAME (@var{file-name})
+@asindex{BASENAME}
+Output the non-directory portion of @var{file-name}. For example,
+if @code{$file} is @samp{/one/two/three}, the command
+@code{base=`AS_BASENAME(["$file"])`} sets @code{base} to @samp{three}.
+@end defmac
+@end ignore
+
+@defmac AS_BOX (@var{text}, @dvar{char, -})
+@asindex{BOX}
+Expand into shell code that will output @var{text} surrounded by a box
+with @var{char} in the top and bottom border. @var{text} should not
+contain a newline, but may contain shell expansions valid for unquoted
+here-documents. @var{char} defaults to @samp{-}, but can be any
+character except @samp{/}, @samp{'}, @samp{"}, @samp{\},
+@samp{&}, or @samp{`}. This is useful for outputting a comment box into
+log files to separate distinct phases of script operation.
+@end defmac
+
+@defmac AS_CASE (@var{word}, @ovar{pattern1}, @ovar{if-matched1}, @
+ @dots{}, @ovar{default})
+@asindex{CASE}
+Expand into a shell @samp{case} statement, where @var{word} is matched
+against one or more patterns. @var{if-matched} is run if the
+corresponding pattern matched @var{word}, else @var{default} is run.
+Avoids several portability issues (@pxref{case, , Limitations of Shell
+Builtins}).
+@end defmac
+
+@c Deprecated, to be replaced by a better API
+@defmac AS_DIRNAME (@var{file-name})
+@asindex{DIRNAME}
+Output the directory portion of @var{file-name}. For example,
+if @code{$file} is @samp{/one/two/three}, the command
+@code{dir=`AS_DIRNAME(["$file"])`} sets @code{dir} to @samp{/one/two}.
+
+This interface may be improved in the future to avoid forks and losing
+trailing newlines.
+@end defmac
+
+@defmac AS_ECHO (@var{word})
+@asindex{ECHO}
+Emits @var{word} to the standard output, followed by a newline. @var{word}
+must be a single shell word (typically a quoted string). The bytes of
+@var{word} are output as-is, even if it starts with "-" or contains "\".
+Redirections can be placed outside the macro invocation. This is much
+more portable than using @command{echo} (@pxref{echo, , Limitations of
+Shell Builtins}).
+@end defmac
+
+@defmac AS_ECHO_N (@var{word})
+@asindex{ECHO_N}
+Emits @var{word} to the standard output, without a following newline.
+@var{word} must be a single shell word (typically a quoted string) and,
+for portability, should not include more than one newline. The bytes of
+@var{word} are output as-is, even if it starts with "-" or contains "\".
+Redirections can be placed outside the macro invocation.
+@end defmac
+
+@c We cannot use @dvar because the macro expansion mistreats backslashes.
+@defmac AS_ESCAPE (@var{string}, @r{[}@var{chars} = @samp{`\"$}@r{]})
+@asindex{ESCAPE}
+Expands to @var{string}, with any characters in @var{chars} escaped with
+a backslash (@samp{\}). @var{chars} should be at most four bytes long,
+and only contain characters from the set @samp{`\"$}; however,
+characters may be safely listed more than once in @var{chars} for the
+sake of syntax highlighting editors. The current implementation expands
+@var{string} after adding escapes; if @var{string} contains macro calls
+that in turn expand to text needing shell quoting, you can use
+@code{AS_ESCAPE(m4_dquote(m4_expand([string])))}.
+
+The default for @var{chars} (@samp{\"$`}) is the set of characters
+needing escapes when @var{string} will be used literally within double
+quotes. One common variant is the set of characters to protect when
+@var{string} will be used literally within back-ticks or an unquoted
+here-document (@samp{\$`}). Another common variant is @samp{""}, which can
+be used to form a double-quoted string containing the same expansions
+that would have occurred if @var{string} were expanded in an unquoted
+here-document; however, when using this variant, care must be taken that
+@var{string} does not use double quotes within complex variable
+expansions (such as @samp{$@{foo-`echo "hi"`@}}) that would be broken
+with improper escapes.
+
+This macro is often used with @code{AS_ECHO}. For an example, observe
+the output generated by the shell code generated from this snippet:
+
+@example
+foo=bar
+AS_ECHO(["AS_ESCAPE(["$foo" = ])AS_ESCAPE(["$foo"], [""])"])
+@result{}"$foo" = "bar"
+m4_define([macro], [a, [\b]])
+AS_ECHO(["AS_ESCAPE([[macro]])"])
+@result{}macro
+AS_ECHO(["AS_ESCAPE([macro])"])
+@result{}a, b
+AS_ECHO(["AS_ESCAPE(m4_dquote(m4_expand([macro])))"])
+@result{}a, \b
+@end example
+
+@comment Should we add AS_ESCAPE_SINGLE? If we do, we can optimize in
+@comment the case of @var{string} that does not contain '.
+To escape a string that will be placed within single quotes, use:
+
+@example
+m4_bpatsubst([[@var{string}]], ['], ['\\''])
+@end example
+@end defmac
+
+@defmac AS_EXECUTABLE_P (@var{file})
+@asindex{EXECUTABLE_P}
+Emit code to probe whether @var{file} is a regular file with executable
+permissions (and not a directory with search permissions). The caller
+is responsible for quoting @var{file}.
+@end defmac
+
+@defmac AS_EXIT (@dvar{status, $?})
+@asindex{EXIT}
+Emit code to exit the shell with @var{status}, defaulting to @samp{$?}.
+This macro
+works around shells that see the exit status of the command prior to
+@code{exit} inside a @samp{trap 0} handler (@pxref{trap, , Limitations
+of Shell Builtins}).
+@end defmac
+
+@defmac AS_IF (@var{test1}, @ovar{run-if-true1}, @dots{}, @ovar{run-if-false})
+@asindex{IF}
+Run shell code @var{test1}. If @var{test1} exits with a zero status then
+run shell code @var{run-if-true1}, else examine further tests. If no test
+exits with a zero status, run shell code @var{run-if-false}, with
+simplifications if either @var{run-if-true1} or @var{run-if-false}
+is empty. For example,
+
+@example
+AS_IF([test "x$foo" = xyes], [HANDLE_FOO([yes])],
+ [test "x$foo" != xno], [HANDLE_FOO([maybe])],
+ [echo foo not specified])
+@end example
+
+@noindent
+ensures any required macros of @code{HANDLE_FOO}
+are expanded before the first test.
+@end defmac
+
+@defmac AS_MKDIR_P (@var{file-name})
+@asindex{MKDIR_P}
+Make the directory @var{file-name}, including intervening directories
+as necessary. This is equivalent to @samp{mkdir -p -- @var{file-name}},
+except that it is portable to older versions of @command{mkdir} that
+lack support for the @option{-p} option or for the @option{--}
+delimiter (@pxref{mkdir, , Limitations of Usual Tools}). Also,
+@code{AS_MKDIR_P}
+succeeds if @var{file-name} is a symbolic link to an existing directory,
+even though Posix is unclear whether @samp{mkdir -p} should
+succeed in that case. If creation of @var{file-name} fails, exit the
+script.
+
+Also see the @code{AC_PROG_MKDIR_P} macro (@pxref{Particular Programs}).
+@end defmac
+
+@defmac AS_SET_STATUS (@var{status})
+@asindex{SET_STATUS}
+Emit shell code to set the value of @samp{$?} to @var{status}, as
+efficiently as possible. However, this is not guaranteed to abort a
+shell running with @code{set -e} (@pxref{set, , Limitations of Shell
+Builtins}). This should also be used at the end of a complex shell
+function instead of @samp{return} (@pxref{Shell Functions}) to avoid
+a DJGPP shell bug.
+@end defmac
+
+@defmac AS_TR_CPP (@var{expression})
+@asindex{TR_CPP}
+Transform @var{expression} into a valid right-hand side for a C @code{#define}.
+For example:
+
+@example
+# This outputs "#define HAVE_CHAR_P 1".
+# Notice the m4 quoting around #, to prevent an m4 comment
+type="char *"
+echo "[#]define AS_TR_CPP([HAVE_$type]) 1"
+@end example
+@end defmac
+
+@defmac AS_TR_SH (@var{expression})
+@asindex{TR_SH}
+Transform @var{expression} into shell code that generates a valid shell
+variable name. The result is literal when possible at m4 time, but must
+be used with @code{eval} if @var{expression} causes shell indirections.
+For example:
+
+@example
+# This outputs "Have it!".
+header="sys/some file.h"
+eval AS_TR_SH([HAVE_$header])=yes
+if test "x$HAVE_sys_some_file_h" = xyes; then echo "Have it!"; fi
+@end example
+@end defmac
+
+@defmac AS_SET_CATFILE (@var{var}, @var{dir}, @var{file})
+@asindex{SET_CATFILE}
+Set the polymorphic shell variable @var{var} to @var{dir}/@var{file},
+but optimizing the common cases (@var{dir} or @var{file} is @samp{.},
+@var{file} is absolute, etc.).
+@end defmac
+
+@defmac AS_UNSET (@var{var})
+@asindex{UNSET}
+Unsets the shell variable @var{var}, working around bugs in older
+shells (@pxref{unset, , Limitations of Shell
+Builtins}). @var{var} can be a literal or indirect variable name.
+@end defmac
+
+@defmac AS_VERSION_COMPARE (@var{version-1}, @var{version-2}, @
+ @ovar{action-if-less}, @ovar{action-if-equal}, @ovar{action-if-greater})
+@asindex{VERSION_COMPARE}
+Compare two strings @var{version-1} and @var{version-2}, possibly
+containing shell variables, as version strings, and expand
+@var{action-if-less}, @var{action-if-equal}, or @var{action-if-greater}
+depending upon the result.
+The algorithm to compare is similar to the one used by strverscmp in
+glibc (@pxref{String/Array Comparison, , String/Array Comparison, libc,
+The GNU C Library}).
+@end defmac
+
+@node Polymorphic Variables
+@section Support for indirect variable names
+@cindex variable name indirection
+@cindex polymorphic variable name
+@cindex indirection, variable name
+
+Often, it is convenient to write a macro that will emit shell code
+operating on a shell variable. The simplest case is when the variable
+name is known. But a more powerful idiom is writing shell code that can
+work through an indirection, where another variable or command
+substitution produces the name of the variable to actually manipulate.
+M4sh supports the notion of polymorphic shell variables, making it easy
+to write a macro that can deal with either literal or indirect variable
+names and output shell code appropriate for both use cases. Behavior is
+undefined if expansion of an indirect variable does not result in a
+literal variable name.
+
+@defmac AS_LITERAL_IF (@var{expression}, @ovar{if-literal}, @ovar{if-not}, @
+ @dvar{if-simple-ref, @var{if-not}})
+@defmacx AS_LITERAL_WORD_IF (@var{expression}, @ovar{if-literal}, @
+ @ovar{if-not}, @dvar{if-simple-ref, @var{if-not}})
+@asindex{LITERAL_IF}
+@asindex{LITERAL_WORD_IF}
+If the expansion of @var{expression} is definitely a shell literal,
+expand @var{if-literal}. If the expansion of @var{expression} looks
+like it might contain shell indirections (such as @code{$var} or
+@code{`expr`}), then @var{if-not} is expanded. Sometimes, it is
+possible to output optimized code if @var{expression} consists only of
+shell variable expansions (such as @code{$@{var@}}), in which case
+@var{if-simple-ref} can be provided; but defaulting to @var{if-not}
+should always be safe. @code{AS_LITERAL_WORD_IF} only expands
+@var{if-literal} if @var{expression} looks like a single shell word,
+containing no whitespace; while @code{AS_LITERAL_IF} allows whitespace
+in @var{expression}.
+
+In order to reduce the time spent recognizing whether an
+@var{expression} qualifies as a literal or a simple indirection, the
+implementation is somewhat conservative: @var{expression} must be a
+single shell word (possibly after stripping whitespace), consisting only
+of bytes that would have the same meaning whether unquoted or enclosed
+in double quotes (for example, @samp{a.b} results in @var{if-literal},
+even though it is not a valid shell variable name; while both @samp{'a'}
+and @samp{[$]} result in @var{if-not}, because they behave differently
+than @samp{"'a'"} and @samp{"[$]"}). This macro can be used in contexts
+for recognizing portable file names (such as in the implementation of
+@code{AC_LIBSOURCE}), or coupled with some transliterations for forming
+valid variable names (such as in the implementation of @code{AS_TR_SH},
+which uses an additional @code{m4_translit} to convert @samp{.} to
+@samp{_}).
+
+This example shows how to read the contents of the shell variable
+@code{bar}, exercising all three arguments to @code{AS_LITERAL_IF}. It
+results in a script that will output the line @samp{hello} three times.
+
+@example
+AC_DEFUN([MY_ACTION],
+[AS_LITERAL_IF([$1],
+ [echo "$$1"],
+@c $$
+ [AS_VAR_COPY([var], [$1])
+ echo "$var"],
+ [eval 'echo "$'"$1"\"])])
+foo=bar bar=hello
+MY_ACTION([bar])
+MY_ACTION([`echo bar`])
+MY_ACTION([$foo])
+@end example
+@end defmac
+
+@defmac AS_VAR_APPEND (@var{var}, @var{text})
+@asindex{VAR_APPEND}
+Emit shell code to append the shell expansion of @var{text} to the end
+of the current contents of the polymorphic shell variable @var{var},
+taking advantage of shells that provide the @samp{+=} extension for more
+efficient scaling.
+
+For situations where the final contents of @var{var} are relatively
+short (less than 256 bytes), it is more efficient to use the simpler
+code sequence of @code{@var{var}=$@{@var{var}@}@var{text}} (or its
+polymorphic equivalent of @code{AS_VAR_COPY([t], [@var{var}])} and
+@code{AS_VAR_SET([@var{var}], ["$t"@var{text}])}). But in the case
+when the script will be repeatedly appending text into @code{var},
+issues of scaling start to become apparent. A naive implementation
+requires execution time linear to the length of the current contents of
+@var{var} as well as the length of @var{text} for a single append, for
+an overall quadratic scaling with multiple appends. This macro takes
+advantage of shells which provide the extension
+@code{@var{var}+=@var{text}}, which can provide amortized constant time
+for a single append, for an overall linear scaling with multiple
+appends. Note that unlike @code{AS_VAR_SET}, this macro requires that
+@var{text} be quoted properly to avoid field splitting and file name
+expansion.
+@end defmac
+
+@defmac AS_VAR_ARITH (@var{var}, @var{expression})
+@asindex{VAR_ARITH}
+Emit shell code to compute the arithmetic expansion of @var{expression},
+assigning the result as the contents of the polymorphic shell variable
+@var{var}. The code takes advantage of shells that provide @samp{$(())}
+for fewer forks, but uses @command{expr} as a fallback. Therefore, the
+syntax for a valid @var{expression} is rather limited: all operators
+must occur as separate shell arguments and with proper quoting, there is
+no portable equality operator, all variables containing numeric values
+must be expanded prior to the computation, all numeric values must be
+provided in decimal without leading zeroes, and the first shell argument
+should not be a negative number. In the following example, this snippet
+will print @samp{(2+3)*4 == 20}.
+
+@example
+bar=3
+AS_VAR_ARITH([foo], [\( 2 + $bar \) \* 4])
+echo "(2+$bar)*4 == $foo"
+@end example
+@end defmac
+
+@defmac AS_VAR_COPY (@var{dest}, @var{source})
+@asindex{VAR_COPY}
+Emit shell code to assign the contents of the polymorphic shell variable
+@var{source} to the polymorphic shell variable @var{dest}. For example,
+executing this M4sh snippet will output @samp{bar hi}:
+
+@example
+foo=bar bar=hi
+AS_VAR_COPY([a], [foo])
+AS_VAR_COPY([b], [$foo])
+echo "$a $b"
+@end example
+
+When it is necessary to access the contents of an indirect variable
+inside a shell double-quoted context, the recommended idiom is to first
+copy the contents into a temporary literal shell variable.
+
+@smallexample
+for header in stdint_h inttypes_h ; do
+ AS_VAR_COPY([var], [ac_cv_header_$header])
+ echo "$header detected: $var"
+done
+@end smallexample
+@end defmac
+
+@comment AS_VAR_GET is intentionally undocumented; it can't handle
+@comment trailing newlines uniformly, and forks too much.
+
+@defmac AS_VAR_IF (@var{var}, @ovar{word}, @ovar{if-equal}, @
+ @ovar{if-not-equal})
+@asindex{VAR_IF}
+Output a shell conditional statement. If the contents of the
+polymorphic shell variable @var{var} match the string @var{word},
+execute @var{if-equal}; otherwise execute @var{if-not-equal}. @var{word}
+must be a single shell word (typically a quoted string). Avoids
+shell bugs if an interrupt signal arrives while a command substitution
+in @var{var} is being expanded.
+@end defmac
+
+@defmac AS_VAR_PUSHDEF (@var{m4-name}, @var{value})
+@defmacx AS_VAR_POPDEF (@var{m4-name})
+@asindex{VAR_PUSHDEF}
+@asindex{VAR_POPDEF}
+@cindex composing variable names
+@cindex variable names, composing
+A common M4sh idiom involves composing shell variable names from an m4
+argument (for example, writing a macro that uses a cache variable).
+@var{value} can be an arbitrary string, which will be transliterated
+into a valid shell name by @code{AS_TR_SH}. In order to access the
+composed variable name based on @var{value}, it is easier to declare a
+temporary m4 macro @var{m4-name} with @code{AS_VAR_PUSHDEF}, then use
+that macro as the argument to subsequent @code{AS_VAR} macros as a
+polymorphic variable name, and finally free the temporary macro with
+@code{AS_VAR_POPDEF}. These macros are often followed with @code{dnl},
+to avoid excess newlines in the output.
+
+Here is an involved example, that shows the power of writing macros that
+can handle composed shell variable names:
+
+@example
+m4_define([MY_CHECK_HEADER],
+[AS_VAR_PUSHDEF([my_Header], [ac_cv_header_$1])dnl
+AS_VAR_IF([my_Header], [yes], [echo "header $1 detected"])dnl
+AS_VAR_POPDEF([my_Header])dnl
+])
+MY_CHECK_HEADER([stdint.h])
+for header in inttypes.h stdlib.h ; do
+ MY_CHECK_HEADER([$header])
+done
+@end example
+
+@noindent
+In the above example, @code{MY_CHECK_HEADER} can operate on polymorphic
+variable names. In the first invocation, the m4 argument is
+@code{stdint.h}, which transliterates into a literal @code{stdint_h}.
+As a result, the temporary macro @code{my_Header} expands to the literal
+shell name @samp{ac_cv_header_stdint_h}. In the second invocation, the
+m4 argument to @code{MY_CHECK_HEADER} is @code{$header}, and the
+temporary macro @code{my_Header} expands to the indirect shell name
+@samp{$as_my_Header}. During the shell execution of the for loop, when
+@samp{$header} contains @samp{inttypes.h}, then @samp{$as_my_Header}
+contains @samp{ac_cv_header_inttypes_h}. If this script is then run on a
+platform where all three headers have been previously detected, the
+output of the script will include:
+
+@smallexample
+header stdint.h detected
+header inttypes.h detected
+header stdlib.h detected
+@end smallexample
+@end defmac
+
+@defmac AS_VAR_SET (@var{var}, @ovar{value})
+@asindex{VAR_SET}
+Emit shell code to assign the contents of the polymorphic shell variable
+@var{var} to the shell expansion of @var{value}. @var{value} is not
+subject to field splitting or file name expansion, so if command
+substitution is used, it may be done with @samp{`""`} rather than using
+an intermediate variable (@pxref{Shell Substitutions}). However,
+@var{value} does undergo rescanning for additional macro names; behavior
+is unspecified if late expansion results in any shell meta-characters.
+@end defmac
+
+@defmac AS_VAR_SET_IF (@var{var}, @ovar{if-set}, @ovar{if-undef})
+@asindex{VAR_SET_IF}
+Emit a shell conditional statement, which executes @var{if-set} if the
+polymorphic shell variable @code{var} is set to any value, and
+@var{if-undef} otherwise.
+@end defmac
+
+@defmac AS_VAR_TEST_SET (@var{var})
+@asindex{VAR_TEST_SET}
+Emit a shell statement that results in a successful exit status only if
+the polymorphic shell variable @code{var} is set.
+@end defmac
+
+@node Initialization Macros
+@section Initialization Macros
+
+@defmac AS_BOURNE_COMPATIBLE
+@asindex{BOURNE_COMPATIBLE}
+Set up the shell to be more compatible with the Bourne shell as
+standardized by Posix, if possible. This may involve setting
+environment variables, or setting options, or similar
+implementation-specific actions. This macro is deprecated, since
+@code{AS_INIT} already invokes it.
+@end defmac
+
+@defmac AS_INIT
+@asindex{INIT}
+@evindex LC_ALL
+@evindex SHELL
+Initialize the M4sh environment. This macro calls @code{m4_init}, then
+outputs the @code{#! /bin/sh} line, a notice about where the output was
+generated from, and code to sanitize the environment for the rest of the
+script. Among other initializations, this sets @env{SHELL} to the shell
+chosen to run the script (@pxref{CONFIG_SHELL}), and @env{LC_ALL} to
+ensure the C locale. Finally, it changes the current diversion to
+@code{BODY}. @code{AS_INIT} is called automatically by @code{AC_INIT}
+and @code{AT_INIT}, so shell code in @file{configure},
+@file{config.status}, and @file{testsuite} all benefit from a sanitized
+shell environment.
+@end defmac
+
+@defmac AS_INIT_GENERATED (@var{file}, @ovar{comment})
+@asindex{INIT_GENERATED}
+Emit shell code to start the creation of a subsidiary shell script in
+@var{file}, including changing @var{file} to be executable. This macro
+populates the child script with information learned from the parent
+(thus, the emitted code is equivalent in effect, but more efficient,
+than the code output by @code{AS_INIT}, @code{AS_BOURNE_COMPATIBLE}, and
+@code{AS_SHELL_SANITIZE}). If present, @var{comment} is output near the
+beginning of the child, prior to the shell initialization code, and is
+subject to parameter expansion, command substitution, and backslash
+quote removal. The
+parent script should check the exit status after this macro, in case
+@var{file} could not be properly created (for example, if the disk was
+full). If successfully created, the parent script can then proceed to
+append additional M4sh constructs into the child script.
+
+Note that the child script starts life without a log file open, so if
+the parent script uses logging (@pxref{AS_MESSAGE_LOG_FD}), you
+must temporarily disable any attempts to use the log file until after
+emitting code to open a log within the child. On the other hand, if the
+parent script has @code{AS_MESSAGE_FD} redirected somewhere besides
+@samp{1}, then the child script already has code that copies stdout to
+that descriptor. Currently, the suggested
+idiom for writing a M4sh shell script from within another script is:
+
+@example
+AS_INIT_GENERATED([@var{file}], [[# My child script.
+]]) || @{ AS_ECHO(["Failed to create child script"]); AS_EXIT; @}
+m4_pushdef([AS_MESSAGE_LOG_FD])dnl
+cat >> "@var{file}" <<\__EOF__
+# Code to initialize AS_MESSAGE_LOG_FD
+m4_popdef([AS_MESSAGE_LOG_FD])dnl
+# Additional code
+__EOF__
+@end example
+
+This, however, may change in the future as the M4sh interface is
+stabilized further.
+
+Also, be aware that use of @env{LINENO} within the child script may
+report line numbers relative to their location in the parent script,
+even when using @code{AS_LINENO_PREPARE}, if the parent script was
+unable to locate a shell with working @env{LINENO} support.
+@end defmac
+
+@defmac AS_LINENO_PREPARE
+@asindex{LINENO_PREPARE}
+@evindex LINENO
+Find a shell that supports the special variable @env{LINENO}, which
+contains the number of the currently executing line. This macro is
+automatically invoked by @code{AC_INIT} in configure scripts.
+@end defmac
+
+@defmac AS_ME_PREPARE
+@asindex{ME_PREPARE}
+Set up variable @env{as_me} to be the basename of the currently executing
+script. This macro is automatically invoked by @code{AC_INIT} in
+configure scripts.
+@end defmac
+
+@defmac AS_TMPDIR (@var{prefix}, @dvar{dir, $@{TMPDIR:=/tmp@}})
+@asindex{TMPDIR}
+@evindex TMPDIR
+@ovindex tmp
+Create, as safely as possible, a temporary sub-directory within
+@var{dir} with a name starting with @var{prefix}. @var{prefix} should
+be 2-4 characters, to make it slightly easier to identify the owner of
+the directory. If @var{dir} is omitted, then the value of @env{TMPDIR}
+will be used (defaulting to @samp{/tmp}). On success, the name of the
+newly created directory is stored in the shell variable @code{tmp}. On
+error, the script is aborted.
+
+Typically, this macro is coupled with some exit traps to delete the created
+directory and its contents on exit or interrupt. However, there is a
+slight window between when the directory is created and when the name is
+actually known to the shell, so an interrupt at the right moment might
+leave the temporary directory behind. Hence it is important to use a
+@var{prefix} that makes it easier to determine if a leftover temporary
+directory from an interrupted script is safe to delete.
+
+The use of the output variable @samp{$tmp} rather than something in the
+@samp{as_} namespace is historical; it has the unfortunate consequence
+that reusing this otherwise common name for any other purpose inside
+your script has the potential to break any cleanup traps designed to
+remove the temporary directory.
+@end defmac
+
+@defmac AS_SHELL_SANITIZE
+@asindex{SHELL_SANITIZE}
+Initialize the shell suitably for @command{configure} scripts. This has
+the effect of @code{AS_BOURNE_COMPATIBLE}, and sets some other
+environment variables for predictable results from configuration tests.
+For example, it sets @env{LC_ALL} to change to the default C locale.
+@xref{Special Shell Variables}. This macro is deprecated, since
+@code{AS_INIT} already invokes it.
+@end defmac
+
+
+@node File Descriptor Macros
+@section File Descriptor Macros
+@cindex input
+@cindex standard input
+@cindex file descriptors
+@cindex descriptors
+@cindex low-level output
+@cindex output, low-level
+
+The following macros define file descriptors used to output messages
+(or input values) from @file{configure} scripts.
+For example:
+
+@example
+echo "$wombats found" >&AS_MESSAGE_LOG_FD
+echo 'Enter desired kangaroo count:' >&AS_MESSAGE_FD
+read kangaroos <&AS_ORIGINAL_STDIN_FD`
+@end example
+
+@noindent
+However doing so is seldom needed, because Autoconf provides higher
+level macros as described below.
+
+@defmac AS_MESSAGE_FD
+@asindex{MESSAGE_FD}
+The file descriptor for @samp{checking for...} messages and results.
+By default, @code{AS_INIT} sets this to @samp{1} for standalone M4sh
+clients. However, @code{AC_INIT} shuffles things around to another file
+descriptor, in order to allow the @option{-q} option of
+@command{configure} to choose whether messages should go to the script's
+standard output or be discarded.
+
+If you want to display some messages, consider using one of the printing
+macros (@pxref{Printing Messages}) instead. Copies of messages output
+via these macros are also recorded in @file{config.log}.
+@end defmac
+
+@anchor{AS_MESSAGE_LOG_FD}
+@defmac AS_MESSAGE_LOG_FD
+@asindex{MESSAGE_LOG_FD}
+This must either be empty, or expand to a file descriptor for log
+messages. By default, @code{AS_INIT} sets this macro to the empty
+string for standalone M4sh clients, thus disabling logging. However,
+@code{AC_INIT} shuffles things around so that both @command{configure}
+and @command{config.status} use @file{config.log} for log messages.
+Macros that run tools, like @code{AC_COMPILE_IFELSE} (@pxref{Running the
+Compiler}), redirect all output to this descriptor. You may want to do
+so if you develop such a low-level macro.
+@end defmac
+
+@defmac AS_ORIGINAL_STDIN_FD
+@asindex{ORIGINAL_STDIN_FD}
+This must expand to a file descriptor for the original standard input.
+By default, @code{AS_INIT} sets this macro to @samp{0} for standalone
+M4sh clients. However, @code{AC_INIT} shuffles things around for
+safety.
+
+When @command{configure} runs, it may accidentally execute an
+interactive command that has the same name as the non-interactive meant
+to be used or checked. If the standard input was the terminal, such
+interactive programs would cause @command{configure} to stop, pending
+some user input. Therefore @command{configure} redirects its standard
+input from @file{/dev/null} during its initialization. This is not
+normally a problem, since @command{configure} normally does not need
+user input.
+
+In the extreme case where your @file{configure} script really needs to
+obtain some values from the original standard input, you can read them
+explicitly from @code{AS_ORIGINAL_STDIN_FD}.
+@end defmac
+
+
+@c =================================================== Writing Autoconf Macros.
+
+@node Writing Autoconf Macros
+@chapter Writing Autoconf Macros
+
+When you write a feature test that could be applicable to more than one
+software package, the best thing to do is encapsulate it in a new macro.
+Here are some instructions and guidelines for writing Autoconf macros.
+
+@menu
+* Macro Definitions:: Basic format of an Autoconf macro
+* Macro Names:: What to call your new macros
+* Reporting Messages:: Notifying @command{autoconf} users
+* Dependencies Between Macros:: What to do when macros depend on other macros
+* Obsoleting Macros:: Warning about old ways of doing things
+* Coding Style:: Writing Autoconf macros @`a la Autoconf
+@end menu
+
+@node Macro Definitions
+@section Macro Definitions
+
+@defmac AC_DEFUN (@var{name}, @ovar{body})
+@acindex{DEFUN}
+Autoconf macros are defined using the @code{AC_DEFUN} macro, which is
+similar to the M4 builtin @code{m4_define} macro; this creates a macro
+named @var{name} and with @var{body} as its expansion. In addition to
+defining a macro, @code{AC_DEFUN} adds to it some code that is used to
+constrain the order in which macros are called, while avoiding redundant
+output (@pxref{Prerequisite Macros}).
+@end defmac
+
+An Autoconf macro definition looks like this:
+
+@example
+AC_DEFUN(@var{macro-name}, @var{macro-body})
+@end example
+
+You can refer to any arguments passed to the macro as @samp{$1},
+@samp{$2}, etc. @xref{Definitions, , How to define new macros, m4.info,
+GNU M4}, for more complete information on writing M4 macros.
+
+Most macros fall in one of two general categories. The first category
+includes macros which take arguments, in order to generate output
+parameterized by those arguments. Macros in this category are designed
+to be directly expanded, often multiple times, and should not be used as
+the argument to @code{AC_REQUIRE}. The other category includes macros
+which are shorthand for a fixed block of text, and therefore do not take
+arguments. For this category of macros, directly expanding the macro
+multiple times results in redundant output, so it is more common to use
+the macro as the argument to @code{AC_REQUIRE}, or to declare the macro
+with @code{AC_DEFUN_ONCE} (@pxref{One-Shot Macros}).
+
+Be sure to properly quote both the @var{macro-body} @emph{and} the
+@var{macro-name} to avoid any problems if the macro happens to have
+been previously defined.
+
+Each macro should have a header comment that gives its prototype, and a
+brief description. When arguments have default values, display them in
+the prototype. For example:
+
+@example
+# AC_MSG_ERROR(ERROR, [EXIT-STATUS = 1])
+# --------------------------------------
+m4_define([AC_MSG_ERROR],
+ [@{ AS_MESSAGE([error: $1], [2])
+ exit m4_default([$2], [1]); @}])
+@end example
+
+Comments about the macro should be left in the header comment. Most
+other comments make their way into @file{configure}, so just keep
+using @samp{#} to introduce comments.
+
+@cindex @code{dnl}
+If you have some special comments about pure M4 code, comments
+that make no sense in @file{configure} and in the header comment, then
+use the builtin @code{dnl}: it causes M4 to discard the text
+through the next newline.
+
+Keep in mind that @code{dnl} is rarely needed to introduce comments;
+@code{dnl} is more useful to get rid of the newlines following macros
+that produce no output, such as @code{AC_REQUIRE}.
+
+Public third-party macros need to use @code{AC_DEFUN}, and not
+@code{m4_define}, in order to be found by @command{aclocal}
+(@pxref{Extending aclocal,,, automake, GNU Automake}).
+Additionally, if it is ever determined that a macro should be made
+obsolete, it is easy to convert from @code{AC_DEFUN} to @code{AU_DEFUN}
+in order to have @command{autoupdate} assist the user in choosing a
+better alternative, but there is no corresponding way to make
+@code{m4_define} issue an upgrade notice (@pxref{AU_DEFUN}).
+
+There is another subtle, but important, difference between using
+@code{m4_define} and @code{AC_DEFUN}: only the former is unaffected by
+@code{AC_REQUIRE}. When writing a file, it is always safe to replace a
+block of text with a @code{m4_define} macro that will expand to the same
+text. But replacing a block of text with an @code{AC_DEFUN} macro with
+the same content does not necessarily give the same results, because it
+changes the location where any embedded but unsatisfied
+@code{AC_REQUIRE} invocations within the block will be expanded. For an
+example of this, see @ref{Expanded Before Required}.
+
+@node Macro Names
+@section Macro Names
+
+All of the public Autoconf macros have all-uppercase names in the
+namespace @samp{^AC_} to prevent them from accidentally conflicting with
+other text; Autoconf also reserves the namespace @samp{^_AC_} for
+internal macros. All shell variables that they use for internal
+purposes have mostly-lowercase names starting with @samp{ac_}. Autoconf
+also uses here-document delimiters in the namespace @samp{^_AC[A-Z]}. During
+@command{configure}, files produced by Autoconf make heavy use of the
+file system namespace @samp{^conf}.
+
+Since Autoconf is built on top of M4sugar (@pxref{Programming in
+M4sugar}) and M4sh (@pxref{Programming in M4sh}), you must also be aware
+of those namespaces (@samp{^_?\(m4\|AS\)_}). And since
+@file{configure.ac} is also designed to be scanned by Autoheader,
+Autoscan, Autoupdate, and Automake, you should be aware of the
+@samp{^_?A[HNUM]_} namespaces. In general, you @emph{should not use}
+the namespace of a package that does not own the macro or shell code you
+are writing.
+
+To ensure that your macros don't conflict with present or future
+Autoconf macros, you should prefix your own macro names and any shell
+variables they use with some other sequence. Possibilities include your
+initials, or an abbreviation for the name of your organization or
+software package. Historically, people have not always followed the
+rule of using a namespace appropriate for their package, and this has
+made it difficult for determining the origin of a macro (and where to
+report bugs about that macro), as well as difficult for the true
+namespace owner to add new macros without interference from pre-existing
+uses of third-party macros. Perhaps the best example of this confusion
+is the @code{AM_GNU_GETTEXT} macro, which belongs, not to Automake, but
+to Gettext.
+
+Most of the Autoconf macros' names follow a structured naming convention
+that indicates the kind of feature check by the name. The macro names
+consist of several words, separated by underscores, going from most
+general to most specific. The names of their cache variables use the
+same convention (@pxref{Cache Variable Names}, for more information on
+them).
+
+The first word of the name after the namespace initials (such as
+@samp{AC_}) usually tells the category
+of the feature being tested. Here are the categories used in Autoconf for
+specific test macros, the kind of macro that you are more likely to
+write. They are also used for cache variables, in all-lowercase. Use
+them where applicable; where they're not, invent your own categories.
+
+@table @code
+@item C
+C language builtin features.
+@item DECL
+Declarations of C variables in header files.
+@item FUNC
+Functions in libraries.
+@item GROUP
+Posix group owners of files.
+@item HEADER
+Header files.
+@item LIB
+C libraries.
+@item PROG
+The base names of programs.
+@item MEMBER
+Members of aggregates.
+@item SYS
+Operating system features.
+@item TYPE
+C builtin or declared types.
+@item VAR
+C variables in libraries.
+@end table
+
+After the category comes the name of the particular feature being
+tested. Any further words in the macro name indicate particular aspects
+of the feature. For example, @code{AC_PROG_CC_STDC} checks whether the
+C compiler supports ISO Standard C.
+
+An internal macro should have a name that starts with an underscore;
+Autoconf internals should therefore start with @samp{_AC_}.
+Additionally, a macro that is an internal subroutine of another macro
+should have a name that starts with an underscore and the name of that
+other macro, followed by one or more words saying what the internal
+macro does. For example, @code{AC_PATH_X} has internal macros
+@code{_AC_PATH_X_XMKMF} and @code{_AC_PATH_X_DIRECT}.
+
+@node Reporting Messages
+@section Reporting Messages
+@cindex Messages, from @command{autoconf}
+
+When macros statically diagnose abnormal situations, benign or fatal, it
+is possible to make @command{autoconf} detect the problem, and refuse to
+create @file{configure} in the case of an error. The macros in this
+section are considered obsolescent, and new code should use M4sugar
+macros for this purpose, see @ref{Diagnostic Macros}.
+
+On the other hand, it is possible to want to detect errors when
+@command{configure} is run, which are dependent on the environment of
+the user rather than the maintainer. For dynamic diagnostics, see
+@ref{Printing Messages}.
+
+@defmac AC_DIAGNOSE (@var{category}, @var{message})
+@acindex{DIAGNOSE}
+Report @var{message} as a warning (or as an error if requested by the
+user) if warnings of the @var{category} are turned on. This macro is
+obsolescent; you are encouraged to use:
+@example
+m4_warn([@var{category}], [@var{message}])
+@end example
+@noindent
+instead. @xref{m4_warn}, for more details, including valid
+@var{category} names.
+@end defmac
+
+@defmac AC_WARNING (@var{message})
+@acindex{WARNING}
+Report @var{message} as a syntax warning. This macro is obsolescent;
+you are encouraged to use:
+@example
+m4_warn([syntax], [@var{message}])
+@end example
+@noindent
+instead. @xref{m4_warn}, for more details, as well as better
+finer-grained categories of warnings (not all problems have to do with
+syntax).
+@end defmac
+
+@defmac AC_FATAL (@var{message})
+@acindex{FATAL}
+Report a severe error @var{message}, and have @command{autoconf} die.
+This macro is obsolescent; you are encouraged to use:
+@example
+m4_fatal([@var{message}])
+@end example
+@noindent
+instead. @xref{m4_fatal}, for more details.
+@end defmac
+
+When the user runs @samp{autoconf -W error}, warnings from
+@code{m4_warn} (including those issued through @code{AC_DIAGNOSE} and
+@code{AC_WARNING}) are reported as errors, see @ref{autoconf Invocation}.
+
+@node Dependencies Between Macros
+@section Dependencies Between Macros
+@cindex Dependencies between macros
+
+Some Autoconf macros depend on other macros having been called first in
+order to work correctly. Autoconf provides a way to ensure that certain
+macros are called if needed and a way to warn the user if macros are
+called in an order that might cause incorrect operation.
+
+@menu
+* Prerequisite Macros:: Ensuring required information
+* Suggested Ordering:: Warning about possible ordering problems
+* One-Shot Macros:: Ensuring a macro is called only once
+@end menu
+
+@node Prerequisite Macros
+@subsection Prerequisite Macros
+@cindex Prerequisite macros
+@cindex Macros, prerequisites
+
+A macro that you write might need to use values that have previously
+been computed by other macros. For example, @code{AC_DECL_YYTEXT}
+examines the output of @code{flex} or @code{lex}, so it depends on
+@code{AC_PROG_LEX} having been called first to set the shell variable
+@code{LEX}.
+
+Rather than forcing the user of the macros to keep track of the
+dependencies between them, you can use the @code{AC_REQUIRE} macro to do
+it automatically. @code{AC_REQUIRE} can ensure that a macro is only
+called if it is needed, and only called once.
+
+@defmac AC_REQUIRE (@var{macro-name})
+@acindex{REQUIRE}
+If the M4 macro @var{macro-name} has not already been called, call it
+(without any arguments). Make sure to quote @var{macro-name} with
+square brackets. @var{macro-name} must have been defined using
+@code{AC_DEFUN} or else contain a call to @code{AC_PROVIDE} to indicate
+that it has been called.
+
+@code{AC_REQUIRE} must be used inside a macro defined by @code{AC_DEFUN}; it
+must not be called from the top level. Also, it does not make sense to
+require a macro that takes parameters.
+@end defmac
+
+@code{AC_REQUIRE} is often misunderstood. It really implements
+dependencies between macros in the sense that if one macro depends upon
+another, the latter is expanded @emph{before} the body of the
+former. To be more precise, the required macro is expanded before
+the outermost defined macro in the current expansion stack.
+In particular, @samp{AC_REQUIRE([FOO])} is not replaced with the body of
+@code{FOO}. For instance, this definition of macros:
+
+@example
+@group
+AC_DEFUN([TRAVOLTA],
+[test "$body_temperature_in_celsius" -gt "38" &&
+ dance_floor=occupied])
+AC_DEFUN([NEWTON_JOHN],
+[test "x$hair_style" = xcurly &&
+ dance_floor=occupied])
+@end group
+
+@group
+AC_DEFUN([RESERVE_DANCE_FLOOR],
+[if date | grep '^Sat.*pm' >/dev/null 2>&1; then
+ AC_REQUIRE([TRAVOLTA])
+ AC_REQUIRE([NEWTON_JOHN])
+fi])
+@end group
+@end example
+
+@noindent
+with this @file{configure.ac}
+
+@example
+AC_INIT([Dance Manager], [1.0], [bug-dance@@example.org])
+RESERVE_DANCE_FLOOR
+if test "x$dance_floor" = xoccupied; then
+ AC_MSG_ERROR([cannot pick up here, let's move])
+fi
+@end example
+
+@noindent
+does not leave you with a better chance to meet a kindred soul at
+other times than Saturday night since it expands into:
+
+@example
+@group
+test "$body_temperature_in_Celsius" -gt "38" &&
+ dance_floor=occupied
+test "x$hair_style" = xcurly &&
+ dance_floor=occupied
+fi
+if date | grep '^Sat.*pm' >/dev/null 2>&1; then
+
+
+fi
+@end group
+@end example
+
+This behavior was chosen on purpose: (i) it prevents messages in
+required macros from interrupting the messages in the requiring macros;
+(ii) it avoids bad surprises when shell conditionals are used, as in:
+
+@example
+@group
+if @dots{}; then
+ AC_REQUIRE([SOME_CHECK])
+fi
+@dots{}
+SOME_CHECK
+@end group
+@end example
+
+However, this implementation can lead to another class of problems.
+Consider the case where an outer macro first expands, then indirectly
+requires, an inner macro:
+
+@example
+AC_DEFUN([TESTA], [[echo in A
+if test -n "$SEEN_A" ; then echo duplicate ; fi
+SEEN_A=:]])
+AC_DEFUN([TESTB], [AC_REQUIRE([TESTA])[echo in B
+if test -z "$SEEN_A" ; then echo bug ; fi]])
+AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]])
+AC_DEFUN([OUTER], [[echo in OUTER]
+TESTA
+TESTC])
+OUTER
+@end example
+
+@noindent
+Prior to Autoconf 2.64, the implementation of @code{AC_REQUIRE}
+recognized that @code{TESTB} needed to be hoisted prior to the expansion
+of @code{OUTER}, but because @code{TESTA} had already been directly
+expanded, it failed to hoist @code{TESTA}. Therefore, the expansion of
+@code{TESTB} occurs prior to its prerequisites, leading to the following
+output:
+
+@example
+in B
+bug
+in OUTER
+in A
+in C
+@end example
+
+@noindent
+Newer Autoconf is smart enough to recognize this situation, and hoists
+@code{TESTA} even though it has already been expanded, but issues a
+syntax warning in the process. This is because the hoisted expansion of
+@code{TESTA} defeats the purpose of using @code{AC_REQUIRE} to avoid
+redundant code, and causes its own set of problems if the hoisted macro
+is not idempotent:
+
+@example
+in A
+in B
+in OUTER
+in A
+duplicate
+in C
+@end example
+
+The bug is not in Autoconf, but in the macro definitions. If you ever
+pass a particular macro name to @code{AC_REQUIRE}, then you are implying
+that the macro only needs to be expanded once. But to enforce this,
+either the macro must be declared with @code{AC_DEFUN_ONCE} (although
+this only helps in Autoconf 2.64 or newer), or all
+uses of that macro should be through @code{AC_REQUIRE}; directly
+expanding the macro defeats the point of using @code{AC_REQUIRE} to
+eliminate redundant expansion. In the example, this rule of thumb was
+violated because @code{TESTB} requires @code{TESTA} while @code{OUTER}
+directly expands it. One way of fixing the bug is to factor
+@code{TESTA} into two macros, the portion designed for direct and
+repeated use (here, named @code{TESTA}), and the portion designed for
+one-shot output and used only inside @code{AC_REQUIRE} (here, named
+@code{TESTA_PREREQ}). Then, by fixing all clients to use the correct
+calling convention according to their needs:
+
+@example
+AC_DEFUN([TESTA], [AC_REQUIRE([TESTA_PREREQ])[echo in A]])
+AC_DEFUN([TESTA_PREREQ], [[echo in A_PREREQ
+if test -n "$SEEN_A" ; then echo duplicate ; fi
+SEEN_A=:]])
+AC_DEFUN([TESTB], [AC_REQUIRE([TESTA_PREREQ])[echo in B
+if test -z "$SEEN_A" ; then echo bug ; fi]])
+AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]])
+AC_DEFUN([OUTER], [[echo in OUTER]
+TESTA
+TESTC])
+OUTER
+@end example
+
+@noindent
+the resulting output will then obey all dependency rules and avoid any
+syntax warnings, whether the script is built with old or new Autoconf
+versions:
+
+@example
+in A_PREREQ
+in B
+in OUTER
+in A
+in C
+@end example
+
+The helper macros @code{AS_IF} and @code{AS_CASE} may be used to
+enforce expansion of required macros outside of shell conditional
+constructs. You are furthermore encouraged, although not required, to
+put all @code{AC_REQUIRE} calls
+at the beginning of a macro. You can use @code{dnl} to avoid the empty
+lines they leave.
+
+@node Suggested Ordering
+@subsection Suggested Ordering
+@cindex Macros, ordering
+@cindex Ordering macros
+
+Some macros should be run before another macro if both are called, but
+neither @emph{requires} that the other be called. For example, a macro
+that changes the behavior of the C compiler should be called before any
+macros that run the C compiler. Many of these dependencies are noted in
+the documentation.
+
+Autoconf provides the @code{AC_BEFORE} macro to warn users when macros
+with this kind of dependency appear out of order in a
+@file{configure.ac} file. The warning occurs when creating
+@command{configure} from @file{configure.ac}, not when running
+@command{configure}.
+
+For example, @code{AC_PROG_CPP} checks whether the C compiler
+can run the C preprocessor when given the @option{-E} option. It should
+therefore be called after any macros that change which C compiler is
+being used, such as @code{AC_PROG_CC}. So @code{AC_PROG_CC} contains:
+
+@example
+AC_BEFORE([$0], [AC_PROG_CPP])dnl
+@end example
+
+@noindent
+This warns the user if a call to @code{AC_PROG_CPP} has already occurred
+when @code{AC_PROG_CC} is called.
+
+@defmac AC_BEFORE (@var{this-macro-name}, @var{called-macro-name})
+@acindex{BEFORE}
+Make M4 print a warning message to the standard error output if
+@var{called-macro-name} has already been called. @var{this-macro-name}
+should be the name of the macro that is calling @code{AC_BEFORE}. The
+macro @var{called-macro-name} must have been defined using
+@code{AC_DEFUN} or else contain a call to @code{AC_PROVIDE} to indicate
+that it has been called.
+@end defmac
+
+@node One-Shot Macros
+@subsection One-Shot Macros
+@cindex One-shot macros
+@cindex Macros, called once
+
+Some macros should be called only once, either because calling them
+multiple time is unsafe, or because it is bad style. For instance
+Autoconf ensures that @code{AC_CANONICAL_BUILD} and cousins
+(@pxref{Canonicalizing}) are evaluated only once, because it makes no
+sense to run these expensive checks more than once. Such one-shot
+macros can be defined using @code{AC_DEFUN_ONCE}.
+
+@defmac AC_DEFUN_ONCE (@var{macro-name}, @var{macro-body})
+@acindex{DEFUN_ONCE}
+Declare macro @var{macro-name} like @code{AC_DEFUN} would (@pxref{Macro
+Definitions}), but add additional logic that guarantees that only the
+first use of the macro (whether by direct expansion or
+@code{AC_REQUIRE}) causes an expansion of @var{macro-body}; the
+expansion will occur before the start of any enclosing macro defined by
+@code{AC_DEFUN}. Subsequent expansions are silently ignored.
+Generally, it does not make sense for @var{macro-body} to use parameters
+such as @code{$1}.
+@end defmac
+
+Prior to Autoconf 2.64, a macro defined by @code{AC_DEFUN_ONCE} would
+emit a warning if it was directly expanded a second time, so for
+portability, it is better to use @code{AC_REQUIRE} than direct
+invocation of @var{macro-name} inside a macro defined by @code{AC_DEFUN}
+(@pxref{Prerequisite Macros}).
+
+@node Obsoleting Macros
+@section Obsoleting Macros
+@cindex Obsoleting macros
+@cindex Macros, obsoleting
+
+Configuration and portability technology has evolved over the years.
+Often better ways of solving a particular problem are developed, or
+ad-hoc approaches are systematized. This process has occurred in many
+parts of Autoconf. One result is that some of the macros are now
+considered @dfn{obsolete}; they still work, but are no longer considered
+the best thing to do, hence they should be replaced with more modern
+macros. Ideally, @command{autoupdate} should replace the old macro calls
+with their modern implementation.
+
+Autoconf provides a simple means to obsolete a macro.
+
+@anchor{AU_DEFUN}
+@defmac AU_DEFUN (@var{old-macro}, @var{implementation}, @ovar{message})
+@auindex{DEFUN}
+Define @var{old-macro} as @var{implementation}. The only difference
+with @code{AC_DEFUN} is that the user is warned that
+@var{old-macro} is now obsolete.
+
+If she then uses @command{autoupdate}, the call to @var{old-macro} is
+replaced by the modern @var{implementation}. @var{message} should
+include information on what to do after running @command{autoupdate};
+@command{autoupdate} prints it as a warning, and includes it
+in the updated @file{configure.ac} file.
+
+The details of this macro are hairy: if @command{autoconf} encounters an
+@code{AU_DEFUN}ed macro, all macros inside its second argument are expanded
+as usual. However, when @command{autoupdate} is run, only M4 and M4sugar
+macros are expanded here, while all other macros are disabled and
+appear literally in the updated @file{configure.ac}.
+@end defmac
+
+@defmac AU_ALIAS (@var{old-name}, @var{new-name})
+@auindex{ALIAS}
+Used if the @var{old-name} is to be replaced by a call to @var{new-macro}
+with the same parameters. This happens for example if the macro was renamed.
+@end defmac
+
+@node Coding Style
+@section Coding Style
+@cindex Coding style
+
+The Autoconf macros follow a strict coding style. You are encouraged to
+follow this style, especially if you intend to distribute your macro,
+either by contributing it to Autoconf itself or the
+@uref{http://@/www.gnu.org/@/software/@/autoconf-archive/, Autoconf Macro
+Archive}, or by other means.
+
+The first requirement is to pay great attention to the quotation. For
+more details, see @ref{Autoconf Language}, and @ref{M4 Quotation}.
+
+Do not try to invent new interfaces. It is likely that there is a macro
+in Autoconf that resembles the macro you are defining: try to stick to
+this existing interface (order of arguments, default values, etc.). We
+@emph{are} conscious that some of these interfaces are not perfect;
+nevertheless, when harmless, homogeneity should be preferred over
+creativity.
+
+Be careful about clashes both between M4 symbols and between shell
+variables.
+
+If you stick to the suggested M4 naming scheme (@pxref{Macro Names}),
+you are unlikely to generate conflicts. Nevertheless, when you need to
+set a special value, @emph{avoid using a regular macro name}; rather,
+use an ``impossible'' name. For instance, up to version 2.13, the macro
+@code{AC_SUBST} used to remember what @var{symbol} macros were already defined
+by setting @code{AC_SUBST_@var{symbol}}, which is a regular macro name.
+But since there is a macro named @code{AC_SUBST_FILE}, it was just
+impossible to @samp{AC_SUBST(FILE)}! In this case,
+@code{AC_SUBST(@var{symbol})} or @code{_AC_SUBST(@var{symbol})} should
+have been used (yes, with the parentheses).
+@c or better yet, high-level macros such as @code{m4_expand_once}
+
+No Autoconf macro should ever enter the user-variable name space; i.e.,
+except for the variables that are the actual result of running the
+macro, all shell variables should start with @code{ac_}. In
+addition, small macros or any macro that is likely to be embedded in
+other macros should be careful not to use obvious names.
+
+@cindex @code{dnl}
+Do not use @code{dnl} to introduce comments: most of the comments you
+are likely to write are either header comments which are not output
+anyway, or comments that should make their way into @file{configure}.
+There are exceptional cases where you do want to comment special M4
+constructs, in which case @code{dnl} is right, but keep in mind that it
+is unlikely.
+
+M4 ignores the leading blanks and newlines before each argument.
+Use this feature to
+indent in such a way that arguments are (more or less) aligned with the
+opening parenthesis of the macro being called. For instance, instead of
+
+@example
+AC_CACHE_CHECK(for EMX OS/2 environment,
+ac_cv_emxos2,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [return __EMX__;])],
+[ac_cv_emxos2=yes], [ac_cv_emxos2=no])])
+@end example
+
+@noindent
+write
+
+@example
+AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2],
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])],
+ [ac_cv_emxos2=yes],
+ [ac_cv_emxos2=no])])
+@end example
+
+@noindent
+or even
+
+@example
+AC_CACHE_CHECK([for EMX OS/2 environment],
+ [ac_cv_emxos2],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
+ [return __EMX__;])],
+ [ac_cv_emxos2=yes],
+ [ac_cv_emxos2=no])])
+@end example
+
+When using @code{AC_RUN_IFELSE} or any macro that cannot work when
+cross-compiling, provide a pessimistic value (typically @samp{no}).
+
+Feel free to use various tricks to prevent auxiliary tools, such as
+syntax-highlighting editors, from behaving improperly. For instance,
+instead of:
+
+@example
+m4_bpatsubst([$1], [$"])
+@end example
+
+@noindent
+use
+
+@example
+m4_bpatsubst([$1], [$""])
+@end example
+
+@noindent
+so that Emacsen do not open an endless ``string'' at the first quote.
+For the same reasons, avoid:
+
+@example
+test $[#] != 0
+@end example
+
+@noindent
+and use:
+
+@example
+test $[@@%:@@] != 0
+@end example
+
+@noindent
+Otherwise, the closing bracket would be hidden inside a @samp{#}-comment,
+breaking the bracket-matching highlighting from Emacsen. Note the
+preferred style to escape from M4: @samp{$[1]}, @samp{$[@@]}, etc. Do
+not escape when it is unnecessary. Common examples of useless quotation
+are @samp{[$]$1} (write @samp{$$1}), @samp{[$]var} (use @samp{$var}),
+etc. If you add portability issues to the picture, you'll prefer
+@samp{$@{1+"$[@@]"@}} to @samp{"[$]@@"}, and you'll prefer do something
+better than hacking Autoconf @code{:-)}.
+
+When using @command{sed}, don't use @option{-e} except for indenting
+purposes. With the @code{s} and @code{y} commands, the preferred
+separator is @samp{/} unless @samp{/} itself might appear in the pattern
+or replacement, in which case you should use @samp{|}, or optionally
+@samp{,} if you know the pattern and replacement cannot contain a file
+name. If none of these characters will do, choose a printable character
+that cannot appear in the pattern or replacement. Characters from the
+set @samp{"#$&'()*;<=>?`|~} are good choices if the pattern or
+replacement might contain a file name, since they have special meaning
+to the shell and are less likely to occur in file names.
+
+@xref{Macro Definitions}, for details on how to define a macro. If a
+macro doesn't use @code{AC_REQUIRE}, is expected to never be the object
+of an @code{AC_REQUIRE} directive, and macros required by other macros
+inside arguments do not need to be expanded before this macro, then
+use @code{m4_define}. In case of doubt, use @code{AC_DEFUN}.
+Also take into account that public third-party macros need to use
+@code{AC_DEFUN} in order to be found by @command{aclocal}
+(@pxref{Extending aclocal,,, automake, GNU Automake}).
+All the @code{AC_REQUIRE} statements should be at the beginning of the
+macro, and each statement should be followed by @code{dnl}.
+
+You should not rely on the number of arguments: instead of checking
+whether an argument is missing, test that it is not empty. It provides
+both a simpler and a more predictable interface to the user, and saves
+room for further arguments.
+
+Unless the macro is short, try to leave the closing @samp{])} at the
+beginning of a line, followed by a comment that repeats the name of the
+macro being defined. This introduces an additional newline in
+@command{configure}; normally, that is not a problem, but if you want to
+remove it you can use @samp{[]dnl} on the last line. You can similarly
+use @samp{[]dnl} after a macro call to remove its newline. @samp{[]dnl}
+is recommended instead of @samp{dnl} to ensure that M4 does not
+interpret the @samp{dnl} as being attached to the preceding text or
+macro output. For example, instead of:
+
+@example
+AC_DEFUN([AC_PATH_X],
+[AC_MSG_CHECKING([for X])
+AC_REQUIRE_CPP()
+@r{# @dots{}omitted@dots{}}
+ AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
+fi])
+@end example
+
+@noindent
+you would write:
+
+@example
+AC_DEFUN([AC_PATH_X],
+[AC_REQUIRE_CPP()[]dnl
+AC_MSG_CHECKING([for X])
+@r{# @dots{}omitted@dots{}}
+ AC_MSG_RESULT([libraries $x_libraries, headers $x_includes])
+fi[]dnl
+])# AC_PATH_X
+@end example
+
+If the macro is long, try to split it into logical chunks. Typically,
+macros that check for a bug in a function and prepare its
+@code{AC_LIBOBJ} replacement should have an auxiliary macro to perform
+this setup. Do not hesitate to introduce auxiliary macros to factor
+your code.
+
+In order to highlight the recommended coding style, here is a macro
+written the old way:
+
+@example
+dnl Check for EMX on OS/2.
+dnl _AC_EMXOS2
+AC_DEFUN(_AC_EMXOS2,
+[AC_CACHE_CHECK(for EMX OS/2 environment, ac_cv_emxos2,
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, return __EMX__;)],
+ac_cv_emxos2=yes, ac_cv_emxos2=no)])
+test "x$ac_cv_emxos2" = xyes && EMXOS2=yes])
+@end example
+
+@noindent
+and the new way:
+
+@example
+# _AC_EMXOS2
+# ----------
+# Check for EMX on OS/2.
+m4_define([_AC_EMXOS2],
+[AC_CACHE_CHECK([for EMX OS/2 environment], [ac_cv_emxos2],
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [return __EMX__;])],
+ [ac_cv_emxos2=yes],
+ [ac_cv_emxos2=no])])
+test "x$ac_cv_emxos2" = xyes && EMXOS2=yes[]dnl
+])# _AC_EMXOS2
+@end example
+
+
+
+
+@c ============================================= Portable Shell Programming
+
+@node Portable Shell
+@chapter Portable Shell Programming
+@cindex Portable shell programming
+
+When writing your own checks, there are some shell-script programming
+techniques you should avoid in order to make your code portable. The
+Bourne shell and upward-compatible shells like the Korn shell and Bash
+have evolved over the years, and many features added to the original
+System7 shell are now supported on all interesting porting targets.
+However, the following discussion between Russ Allbery and Robert Lipe
+is worth reading:
+
+@noindent
+Russ Allbery:
+
+@quotation
+The GNU assumption that @command{/bin/sh} is the one and only shell
+leads to a permanent deadlock. Vendors don't want to break users'
+existing shell scripts, and there are some corner cases in the Bourne
+shell that are not completely compatible with a Posix shell. Thus,
+vendors who have taken this route will @emph{never} (OK@dots{}``never say
+never'') replace the Bourne shell (as @command{/bin/sh}) with a
+Posix shell.
+@end quotation
+
+@noindent
+Robert Lipe:
+
+@quotation
+This is exactly the problem. While most (at least most System V's) do
+have a Bourne shell that accepts shell functions most vendor
+@command{/bin/sh} programs are not the Posix shell.
+
+So while most modern systems do have a shell @emph{somewhere} that meets the
+Posix standard, the challenge is to find it.
+@end quotation
+
+For this reason, part of the job of M4sh (@pxref{Programming in M4sh})
+is to find such a shell. But to prevent trouble, if you're not using
+M4sh you should not take advantage of features that were added after Unix
+version 7, circa 1977 (@pxref{Systemology}); you should not use aliases,
+negated character classes, or even @command{unset}. @code{#} comments,
+while not in Unix version 7, were retrofitted in the original Bourne
+shell and can be assumed to be part of the least common denominator.
+
+On the other hand, if you're using M4sh you can assume that the shell
+has the features that were added in SVR2 (circa 1984), including shell
+functions,
+@command{return}, @command{unset}, and I/O redirection for builtins. For
+more information, refer to @uref{http://@/www.in-ulm.de/@/~mascheck/@/bourne/}.
+However, some pitfalls have to be avoided for portable use of these
+constructs; these will be documented in the rest of this chapter.
+See in particular @ref{Shell Functions} and @ref{Limitations of
+Builtins, , Limitations of Shell Builtins}.
+
+Some ancient systems have quite
+small limits on the length of the @samp{#!} line; for instance, 32
+bytes (not including the newline) on SunOS 4.
+However, these ancient systems are no longer of practical concern.
+
+The set of external programs you should run in a @command{configure} script
+is fairly small. @xref{Utilities in Makefiles, , Utilities in
+Makefiles, standards, The GNU Coding Standards}, for the list. This
+restriction allows users to start out with a fairly small set of
+programs and build the rest, avoiding too many interdependencies between
+packages.
+
+Some of these external utilities have a portable subset of features; see
+@ref{Limitations of Usual Tools}.
+
+There are other sources of documentation about shells. The
+specification for the Posix
+@uref{http://@/www.opengroup.org/@/susv3/@/utilities/@/xcu_chap02@/.html, Shell
+Command Language}, though more generous than the restrictive shell
+subset described above, is fairly portable nowadays. Also please see
+@uref{http://@/www.faqs.org/@/faqs/@/unix-faq/@/shell/, the Shell FAQs}.
+
+@menu
+* Shellology:: A zoology of shells
+* Invoking the Shell:: Invoking the shell as a command
+* Here-Documents:: Quirks and tricks
+* File Descriptors:: FDs and redirections
+* Signal Handling:: Shells, signals, and headaches
+* File System Conventions:: File names
+* Shell Pattern Matching:: Pattern matching
+* Shell Substitutions:: Variable and command expansions
+* Assignments:: Varying side effects of assignments
+* Parentheses:: Parentheses in shell scripts
+* Slashes:: Slashes in shell scripts
+* Special Shell Variables:: Variables you should not change
+* Shell Functions:: What to look out for if you use them
+* Limitations of Builtins:: Portable use of not so portable /bin/sh
+* Limitations of Usual Tools:: Portable use of portable tools
+@end menu
+
+@node Shellology
+@section Shellology
+@cindex Shellology
+
+There are several families of shells, most prominently the Bourne family
+and the C shell family which are deeply incompatible. If you want to
+write portable shell scripts, avoid members of the C shell family. The
+@uref{http://@/www.faqs.org/@/faqs/@/unix-faq/@/shell/@/shell-differences/, the
+Shell difference FAQ} includes a small history of Posix shells, and a
+comparison between several of them.
+
+Below we describe some of the members of the Bourne shell family.
+
+@table @asis
+@item Ash
+@cindex Ash
+Ash is often used on GNU/Linux and BSD
+systems as a light-weight Bourne-compatible shell. Ash 0.2 has some
+bugs that are fixed in the 0.3.x series, but portable shell scripts
+should work around them, since version 0.2 is still shipped with many
+GNU/Linux distributions.
+
+To be compatible with Ash 0.2:
+
+@itemize @minus
+@item
+don't use @samp{$?} after expanding empty or unset variables,
+or at the start of an @command{eval}:
+
+@example
+foo=
+false
+$foo
+echo "Do not use it: $?"
+false
+eval 'echo "Do not use it: $?"'
+@end example
+
+@item
+don't use command substitution within variable expansion:
+
+@example
+cat $@{FOO=`bar`@}
+@end example
+
+@item
+beware that single builtin substitutions are not performed by a
+subshell, hence their effect applies to the current shell! @xref{Shell
+Substitutions}, item ``Command Substitution''.
+@end itemize
+
+@item Bash
+@cindex Bash
+To detect whether you are running Bash, test whether
+@code{BASH_VERSION} is set. To require
+Posix compatibility, run @samp{set -o posix}. @xref{Bash POSIX
+Mode, , Bash Posix Mode, bash, The GNU Bash Reference
+Manual}, for details.
+
+@item Bash 2.05 and later
+@cindex Bash 2.05 and later
+Versions 2.05 and later of Bash use a different format for the
+output of the @command{set} builtin, designed to make evaluating its
+output easier. However, this output is not compatible with earlier
+versions of Bash (or with many other shells, probably). So if
+you use Bash 2.05 or higher to execute @command{configure},
+you'll need to use Bash 2.05 for all other build tasks as well.
+
+@item Ksh
+@cindex Ksh
+@cindex Korn shell
+@prindex @samp{ksh}
+@prindex @samp{ksh88}
+@prindex @samp{ksh93}
+The Korn shell is compatible with the Bourne family and it mostly
+conforms to Posix. It has two major variants commonly
+called @samp{ksh88} and @samp{ksh93}, named after the years of initial
+release. It is usually called @command{ksh}, but is called @command{sh}
+on some hosts if you set your path appropriately.
+
+Solaris systems have three variants:
+@prindex @command{/usr/bin/ksh} on Solaris
+@command{/usr/bin/ksh} is @samp{ksh88}; it is
+standard on Solaris 2.0 and later.
+@prindex @command{/usr/xpg4/bin/sh} on Solaris
+@command{/usr/xpg4/bin/sh} is a Posix-compliant variant of
+@samp{ksh88}; it is standard on Solaris 9 and later.
+@prindex @command{/usr/dt/bin/dtksh} on Solaris
+@command{/usr/dt/bin/dtksh} is @samp{ksh93}.
+Variants that are not standard may be parts of optional
+packages. There is no extra charge for these packages, but they are
+not part of a minimal OS install and therefore some installations may
+not have it.
+
+Starting with Tru64 Version 4.0, the Korn shell @command{/usr/bin/ksh}
+is also available as @command{/usr/bin/posix/sh}. If the environment
+variable @env{BIN_SH} is set to @code{xpg4}, subsidiary invocations of
+the standard shell conform to Posix.
+
+@item Pdksh
+@prindex @samp{pdksh}
+A public-domain clone of the Korn shell called @command{pdksh} is widely
+available: it has most of the @samp{ksh88} features along with a few of
+its own. It usually sets @code{KSH_VERSION}, except if invoked as
+@command{/bin/sh} on OpenBSD, and similarly to Bash you can require
+Posix compatibility by running @samp{set -o posix}. Unfortunately, with
+@command{pdksh} 5.2.14 (the latest stable version as of January 2007)
+Posix mode is buggy and causes @command{pdksh} to depart from Posix in
+at least one respect, see @ref{Shell Substitutions}.
+
+@item Zsh
+@cindex Zsh
+To detect whether you are running @command{zsh}, test whether
+@code{ZSH_VERSION} is set. By default @command{zsh} is @emph{not}
+compatible with the Bourne shell: you must execute @samp{emulate sh},
+and for @command{zsh} versions before 3.1.6-dev-18 you must also
+set @code{NULLCMD} to @samp{:}. @xref{Compatibility, , Compatibility,
+zsh, The Z Shell Manual}, for details.
+
+The default Mac OS X @command{sh} was originally Zsh; it was changed to
+Bash in Mac OS X 10.2.
+@end table
+
+@node Invoking the Shell
+@section Invoking the Shell
+@cindex invoking the shell
+@cindex shell invocation
+
+The Korn shell (up to at least version M-12/28/93d) has a bug when
+invoked on a file whose name does not contain a slash. It first
+searches for the file's name in @env{PATH}, and if found it executes
+that rather than the original file. For example, assuming there is a
+binary executable @file{/usr/bin/script} in your @env{PATH}, the last
+command in the following example fails because the Korn shell finds
+@file{/usr/bin/script} and refuses to execute it as a shell script:
+
+@example
+$ @kbd{touch xxyzzyz script}
+$ @kbd{ksh xxyzzyz}
+$ @kbd{ksh ./script}
+$ @kbd{ksh script}
+ksh: script: cannot execute
+@end example
+
+Bash 2.03 has a bug when invoked with the @option{-c} option: if the
+option-argument ends in backslash-newline, Bash incorrectly reports a
+syntax error. The problem does not occur if a character follows the
+backslash:
+
+@example
+$ @kbd{$ bash -c 'echo foo \}
+> @kbd{'}
+bash: -c: line 2: syntax error: unexpected end of file
+$ @kbd{bash -c 'echo foo \}
+> @kbd{ '}
+foo
+@end example
+
+@noindent
+@xref{Backslash-Newline-Empty}, for how this can cause problems in makefiles.
+
+@node Here-Documents
+@section Here-Documents
+@cindex Here-documents
+@cindex Shell here-documents
+
+Don't rely on @samp{\} being preserved just because it has no special
+meaning together with the next symbol. In the native @command{sh}
+on OpenBSD 2.7 @samp{\"} expands to @samp{"} in here-documents with
+unquoted delimiter. As a general rule, if @samp{\\} expands to @samp{\}
+use @samp{\\} to get @samp{\}.
+
+With OpenBSD 2.7's @command{sh}
+
+@example
+@group
+$ @kbd{cat <<EOF
+> \" \\
+> EOF}
+" \
+@end group
+@end example
+
+@noindent
+and with Bash:
+
+@example
+@group
+bash-2.04$ @kbd{cat <<EOF
+> \" \\
+> EOF}
+\" \
+@end group
+@end example
+
+Using command substitutions in a here-document that is fed to a shell
+function is not portable. For example, with Solaris 10 @command{/bin/sh}:
+
+@example
+$ @kbd{kitty () @{ cat; @}}
+$ @kbd{kitty <<EOF
+> `echo ok`
+> EOF}
+/tmp/sh199886: cannot open
+$ @kbd{echo $?}
+1
+@end example
+
+Some shells mishandle large here-documents: for example,
+Solaris 10 @command{dtksh} and the UnixWare 7.1.1 Posix shell, which are
+derived from Korn shell version M-12/28/93d, mishandle braced variable
+expansion that crosses a 1024- or 4096-byte buffer boundary
+within a here-document. Only the part of the variable name after the boundary
+is used. For example, @code{$@{variable@}} could be replaced by the expansion
+of @code{$@{ble@}}. If the end of the variable name is aligned with the block
+boundary, the shell reports an error, as if you used @code{$@{@}}.
+Instead of @code{$@{variable-default@}}, the shell may expand
+@code{$@{riable-default@}}, or even @code{$@{fault@}}. This bug can often
+be worked around by omitting the braces: @code{$variable}. The bug was
+fixed in
+@samp{ksh93g} (1998-04-30) but as of 2006 many operating systems were
+still shipping older versions with the bug.
+
+Empty here-documents are not portable either; with the following code,
+@command{zsh} up to at least version 4.3.10 creates a file with a single
+newline, whereas other shells create an empty file:
+
+@example
+cat >file <<EOF
+EOF
+@end example
+
+Many shells (including the Bourne shell) implement here-documents
+inefficiently. In particular, some shells can be extremely inefficient when
+a single statement contains many here-documents. For instance if your
+@file{configure.ac} includes something like:
+
+@example
+@group
+if <cross_compiling>; then
+ assume this and that
+else
+ check this
+ check that
+ check something else
+ @dots{}
+ on and on forever
+ @dots{}
+fi
+@end group
+@end example
+
+A shell parses the whole @code{if}/@code{fi} construct, creating
+temporary files for each here-document in it. Some shells create links
+for such here-documents on every @code{fork}, so that the clean-up code
+they had installed correctly removes them. It is creating the links
+that can take the shell forever.
+
+Moving the tests out of the @code{if}/@code{fi}, or creating multiple
+@code{if}/@code{fi} constructs, would improve the performance
+significantly. Anyway, this kind of construct is not exactly the
+typical use of Autoconf. In fact, it's even not recommended, because M4
+macros can't look into shell conditionals, so we may fail to expand a
+macro when it was expanded before in a conditional path, and the
+condition turned out to be false at runtime, and we end up not
+executing the macro at all.
+
+Be careful with the use of @samp{<<-} to unindent here-documents. The
+behavior is only portable for stripping leading @key{TAB}s, and things
+can silently break if an overzealous editor converts to using leading
+spaces (not all shells are nice enough to warn about unterminated
+here-documents).
+
+@example
+$ @kbd{printf 'cat <<-x\n\t1\n\t 2\n\tx\n' | bash && echo done}
+1
+ 2
+done
+$ @kbd{printf 'cat <<-x\n 1\n 2\n x\n' | bash-3.2 && echo done}
+ 1
+ 2
+ x
+done
+@end example
+
+@node File Descriptors
+@section File Descriptors
+@cindex Descriptors
+@cindex File descriptors
+@cindex Shell file descriptors
+
+Most shells, if not all (including Bash, Zsh, Ash), output traces on
+stderr, even for subshells. This might result in undesirable content
+if you meant to capture the standard-error output of the inner command:
+
+@example
+$ @kbd{ash -x -c '(eval "echo foo >&2") 2>stderr'}
+$ @kbd{cat stderr}
++ eval echo foo >&2
++ echo foo
+foo
+$ @kbd{bash -x -c '(eval "echo foo >&2") 2>stderr'}
+$ @kbd{cat stderr}
++ eval 'echo foo >&2'
+++ echo foo
+foo
+$ @kbd{zsh -x -c '(eval "echo foo >&2") 2>stderr'}
+@i{# Traces on startup files deleted here.}
+$ @kbd{cat stderr}
++zsh:1> eval echo foo >&2
++zsh:1> echo foo
+foo
+@end example
+
+@noindent
+One workaround is to grep out uninteresting lines, hoping not to remove
+good ones.
+
+If you intend to redirect both standard error and standard output,
+redirect standard output first. This works better with HP-UX,
+since its shell mishandles tracing if standard error is redirected
+first:
+
+@example
+$ @kbd{sh -x -c ': 2>err >out'}
++ :
++ 2> err $ @kbd{cat err}
+1> out
+@end example
+
+Don't try to redirect the standard error of a command substitution. It
+must be done @emph{inside} the command substitution. When running
+@samp{: `cd /zorglub` 2>/dev/null} expect the error message to
+escape, while @samp{: `cd /zorglub 2>/dev/null`} works properly.
+
+On the other hand, some shells, such as Solaris or FreeBSD
+@command{/bin/sh}, warn about missing programs before performing
+redirections. Therefore, to silently check whether a program exists, it
+is necessary to perform redirections on a subshell or brace group:
+@example
+$ @kbd{/bin/sh -c 'nosuch 2>/dev/null'}
+nosuch: not found
+$ @kbd{/bin/sh -c '(nosuch) 2>/dev/null'}
+$ @kbd{/bin/sh -c '@{ nosuch; @} 2>/dev/null'}
+$ @kbd{bash -c 'nosuch 2>/dev/null'}
+@end example
+
+FreeBSD 6.2 sh may mix the trace output lines from the statements in a
+shell pipeline.
+
+It is worth noting that Zsh (but not Ash nor Bash) makes it possible
+in assignments though: @samp{foo=`cd /zorglub` 2>/dev/null}.
+
+Some shells, like @command{ash}, don't recognize bi-directional
+redirection (@samp{<>}). And even on shells that recognize it, it is
+not portable to use on fifos: Posix does not require read-write support
+for named pipes, and Cygwin does not support it:
+
+@example
+$ @kbd{mkfifo fifo}
+$ @kbd{exec 5<>fifo}
+$ @kbd{echo hi >&5}
+bash: echo: write error: Communication error on send
+@end example
+
+@noindent
+Furthermore, versions of @command{dash} before 0.5.6 mistakenly truncate
+regular files when using @samp{<>}:
+
+@example
+$ @kbd{echo a > file}
+$ @kbd{bash -c ': 1<>file'; cat file}
+a
+$ @kbd{dash -c ': 1<>file'; cat file}
+$ rm a
+@end example
+
+When catering to old systems, don't redirect the same file descriptor
+several times, as you are doomed to failure under Ultrix.
+
+@example
+ULTRIX V4.4 (Rev. 69) System #31: Thu Aug 10 19:42:23 GMT 1995
+UWS V4.4 (Rev. 11)
+$ @kbd{eval 'echo matter >fullness' >void}
+illegal io
+$ @kbd{eval '(echo matter >fullness)' >void}
+illegal io
+$ @kbd{(eval '(echo matter >fullness)') >void}
+Ambiguous output redirect.
+@end example
+
+@noindent
+In each case the expected result is of course @file{fullness} containing
+@samp{matter} and @file{void} being empty. However, this bug is
+probably not of practical concern to modern platforms.
+
+Solaris 10 @command{sh} will try to optimize away a @command{:} command
+(even if it is redirected) in a loop after the first iteration, or in a
+shell function after the first call:
+
+@example
+$ @kbd{for i in 1 2 3 ; do : >x$i; done}
+$ @kbd{ls x*}
+x1
+$ @kbd{f () @{ : >$1; @}; f y1; f y2; f y3;}
+$ @kbd{ls y*}
+y1
+@end example
+
+@noindent
+As a workaround, @command{echo} or @command{eval} can be used.
+
+Don't rely on file descriptors 0, 1, and 2 remaining closed in a
+subsidiary program. If any of these descriptors is closed, the
+operating system may open an unspecified file for the descriptor in the
+new process image. Posix 2008 says this may be done only if the
+subsidiary program is set-user-ID or set-group-ID, but HP-UX 11.23 does
+it even for ordinary programs, and the next version of Posix will allow
+HP-UX behavior.
+
+If you want a file descriptor above 2 to be inherited into a child
+process, then you must use redirections specific to that command or a
+containing subshell or command group, rather than relying on
+@command{exec} in the shell. In @command{ksh} as well as HP-UX
+@command{sh}, file descriptors above 2 which are opened using
+@samp{exec @var{n}>file} are closed by a subsequent @samp{exec} (such as
+that involved in the fork-and-exec which runs a program or script):
+
+@example
+$ @kbd{echo 'echo hello >&5' >k}
+$ @kbd{/bin/sh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t}
+hello
+$ @kbd{bash -c 'exec 5>t; ksh ./k; exec 5>&-; cat t}
+hello
+$ @kbd{ksh -c 'exec 5>t; ksh ./k; exec 5>&-; cat t}
+./k[1]: 5: cannot open [Bad file number]
+$ @kbd{ksh -c '(ksh ./k) 5>t; cat t'}
+hello
+$ @kbd{ksh -c '@{ ksh ./k; @} 5>t; cat t'}
+hello
+$ @kbd{ksh -c '5>t ksh ./k; cat t}
+hello
+@end example
+
+Don't rely on duplicating a closed file descriptor to cause an
+error. With Solaris @command{/bin/sh}, failed duplication is silently
+ignored, which can cause unintended leaks to the original file
+descriptor. In this example, observe the leak to standard output:
+
+@example
+$ @kbd{bash -c 'echo hi >&3' 3>&-; echo $?}
+bash: 3: Bad file descriptor
+1
+$ @kbd{/bin/sh -c 'echo hi >&3' 3>&-; echo $?}
+hi
+0
+@end example
+
+Fortunately, an attempt to close an already closed file descriptor will
+portably succeed. Likewise, it is safe to use either style of
+@samp{@var{n}<&-} or @samp{@var{n}>&-} for closing a file descriptor,
+even if it doesn't match the read/write mode that the file descriptor
+was opened with.
+
+DOS variants cannot rename or remove open files, such as in
+@samp{mv foo bar >foo} or @samp{rm foo >foo}, even though this is
+perfectly portable among Posix hosts.
+
+A few ancient systems reserved some file descriptors. By convention,
+file descriptor 3 was opened to @file{/dev/tty} when you logged into
+Eighth Edition (1985) through Tenth Edition Unix (1989). File
+descriptor 4 had a special use on the Stardent/Kubota Titan (circa
+1990), though we don't now remember what it was. Both these systems are
+obsolete, so it's now safe to treat file descriptors 3 and 4 like any
+other file descriptors.
+
+On the other hand, you can't portably use multi-digit file descriptors.
+Solaris @command{ksh} doesn't understand any file descriptor larger than
+@samp{9}:
+
+@example
+$ @kbd{bash -c 'exec 10>&-'; echo $?}
+0
+$ @kbd{ksh -c 'exec 9>&-'; echo $?}
+0
+$ @kbd{ksh -c 'exec 10>&-'; echo $?}
+ksh[1]: exec: 10: not found
+127
+@end example
+
+@c <http://lists.gnu.org/archive/html/bug-autoconf/2011-09/msg00004.html>
+@node Signal Handling
+@section Signal Handling
+@cindex Signal handling in the shell
+@cindex Signals, shells and
+
+Portable handling of signals within the shell is another major source of
+headaches. This is worsened by the fact that various different, mutually
+incompatible approaches are possible in this area, each with its
+distinctive merits and demerits. A detailed description of these possible
+approaches, as well as of their pros and cons, can be found in
+@uref{http://www.cons.org/cracauer/sigint.html, this article}.
+
+Solaris 10 @command{/bin/sh} automatically traps most signals by default;
+@c See: <http://dbaspot.com/shell/396118-bourne-shell-exit-code-term.html>
+the shell still exits with error upon termination by one of those signals,
+but in such a case the exit status might be somewhat unexpected (even if
+allowed by POSIX, strictly speaking):
+
+@example
+$ @kbd{bash -c 'kill -1 $$'; echo $?} # Will exit 128 + (signal number).
+Hangup
+129
+$ @kbd{/bin/ksh -c 'kill -15 $$'; echo $?} # Likewise.
+Terminated
+143
+$ @kbd{for sig in 1 2 3 15; do}
+> @kbd{ echo $sig:}
+> @kbd{ /bin/sh -c "kill -$s \$\$"; echo $?}
+> @kbd{done}
+signal 1:
+Hangup
+129
+signal 2:
+208
+signal 3:
+208
+signal 15:
+208
+@end example
+
+This gets even worse if one is using the POSIX `wait' interface to get
+details about the shell process terminations: it will result in the shell
+having exited normally, rather than by receiving a signal.
+
+@example
+$ @kbd{cat > foo.c <<'END'}
+#include <stdio.h> /* for printf */
+#include <stdlib.h> /* for system */
+#include <sys/wait.h> /* for WIF* macros */
+int main(void)
+@{
+ int status = system ("kill -15 $$");
+ printf ("Terminated by signal: %s\n",
+ WIFSIGNALED (status) ? "yes" : "no");
+ printf ("Exited normally: %s\n",
+ WIFEXITED (status) ? "yes" : "no");
+ return 0;
+@}
+END
+@c $$ font-lock
+$ @kbd{cc -o foo foo.c}
+$ @kbd{./a.out} # On GNU/Linux
+Terminated by signal: no
+Exited normally: yes
+$ @kbd{./a.out} # On Solaris 10
+Terminated by signal: yes
+Exited normally: no
+@end example
+
+Various shells seem to handle @code{SIGQUIT} specially: they ignore it even
+if it is not blocked, and even if the shell is not running interactively
+(in fact, even if the shell has no attached tty); among these shells
+are at least Bash (from version 2 onwards), Zsh 4.3.12, Solaris 10
+@code{/bin/ksh} and @code{/usr/xpg4/bin/sh}, and AT&T @code{ksh93} (2011).
+Still, @code{SIGQUIT} seems to be trappable quite portably within all
+these shells. OTOH, some other shells doesn't special-case the handling
+of @code{SIGQUIT}; among these shells are at least @code{pdksh} 5.2.14,
+Solaris 10 and NetBSD 5.1 @code{/bin/sh}, and the Almquist Shell 0.5.5.1.
+
+@c See: <http://mail.opensolaris.org/pipermail/ksh93-integration-discuss/2009-February/004121.html>
+Some shells (especially Korn shells and derivatives) might try to
+propagate to themselves a signal that has killed a child process; this is
+not a bug, but a conscious design choice (although its overall value might
+be debatable). The exact details of how this is attained vary from shell
+to shell. For example, upon running @code{perl -e 'kill 2, $$'}, after
+the perl process has been interrupted AT&T @code{ksh93} (2011) will
+proceed to send itself a @code{SIGINT}, while Solaris 10 @code{/bin/ksh}
+and @code{/usr/xpg4/bin/sh} will proceed to exit with status 130 (i.e.,
+128 + 2). In any case, if there is an active trap associated with
+@code{SIGINT}, those shells will correctly execute it.
+
+@c See: <http://www.austingroupbugs.net/view.php?id=51>
+Some Korn shells, when a child process die due receiving a signal with
+signal number @var{n}, can leave in @samp{$?} an exit status of
+256+@var{n} instead of the more common 128+@var{n}. Observe the
+difference between AT&T @code{ksh93} (2011) and @code{bash} 4.1.5 on
+Debian:
+
+@example
+$ @kbd{/bin/ksh -c 'sh -c "kill -1 \$\$"; echo $?'}
+/bin/ksh: line 1: 7837: Hangup
+257
+$ @kbd{/bin/bash -c 'sh -c "kill -1 \$\$"; echo $?'}
+/bin/bash: line 1: 7861 Hangup (sh -c "kill -1 \$\$")
+129
+@end example
+
+@noindent
+This @command{ksh} behavior is allowed by POSIX, if implemented with
+due care; see this @uref{http://www.austingroupbugs.net/view.php?id=51,
+Austin Group discussion} for more background. However, if it is not
+implemented with proper care, such a behavior might cause problems
+in some corner cases. To see why, assume we have a ``wrapper'' script
+like this:
+
+@example
+#!/bin/sh
+# Ignore some signals in the shell only, not in its child processes.
+trap : 1 2 13 15
+wrapped_command "$@@"
+ret=$?
+other_command
+exit $ret
+@end example
+
+@noindent
+If @command{wrapped_command} is interrupted by a @code{SIGHUP} (which
+has signal number 1), @code{ret} will be set to 257. Unless the
+@command{exit} shell builtin is smart enough to understand that such
+a value can only have originated from a signal, and adjust the final
+wait status of the shell appropriately, the value 257 will just get
+truncated to 1 by the closing @code{exit} call, so that a caller of
+the script will have no way to determine that termination by a signal
+was involved. Observe the different behavior of AT&T @code{ksh93}
+(2011) and @code{bash} 4.1.5 on Debian:
+
+@example
+$ @kbd{cat foo.sh}
+#!/bin/sh
+sh -c 'kill -1 $$'
+ret=$?
+echo $ret
+exit $ret
+$ @kbd{/bin/ksh foo.sh; echo $?}
+foo.sh: line 2: 12479: Hangup
+257
+1
+$ @kbd{/bin/bash foo.sh; echo $?}
+foo.sh: line 2: 12487 Hangup (sh -c 'kill -1 $$')
+129
+129
+@end example
+
+@node File System Conventions
+@section File System Conventions
+@cindex File system conventions
+
+Autoconf uses shell-script processing extensively, so the file names
+that it processes should not contain characters that are special to the
+shell. Special characters include space, tab, newline, NUL, and
+the following:
+
+@example
+" # $ & ' ( ) * ; < = > ? [ \ ` |
+@end example
+
+Also, file names should not begin with @samp{~} or @samp{-}, and should
+contain neither @samp{-} immediately after @samp{/} nor @samp{~}
+immediately after @samp{:}. On Posix-like platforms, directory names
+should not contain @samp{:}, as this runs afoul of @samp{:} used as the
+path separator.
+
+These restrictions apply not only to the files that you distribute, but
+also to the absolute file names of your source, build, and destination
+directories.
+
+On some Posix-like platforms, @samp{!} and @samp{^} are special too, so
+they should be avoided.
+
+Posix lets implementations treat leading @file{//} specially, but
+requires leading @file{///} and beyond to be equivalent to @file{/}.
+Most Unix variants treat @file{//} like @file{/}. However, some treat
+@file{//} as a ``super-root'' that can provide access to files that are
+not otherwise reachable from @file{/}. The super-root tradition began
+with Apollo Domain/OS, which died out long ago, but unfortunately Cygwin
+has revived it.
+
+While @command{autoconf} and friends are usually run on some Posix
+variety, they can be used on other systems, most notably DOS
+variants. This impacts several assumptions regarding file names.
+
+@noindent
+For example, the following code:
+
+@example
+case $foo_dir in
+ /*) # Absolute
+ ;;
+ *)
+ foo_dir=$dots$foo_dir ;;
+esac
+@end example
+
+@noindent
+fails to properly detect absolute file names on those systems, because
+they can use a drivespec, and usually use a backslash as directory
+separator. If you want to be portable to DOS variants (at the
+price of rejecting valid but oddball Posix file names like @file{a:\b}),
+you can check for absolute file names like this:
+
+@cindex absolute file names, detect
+@example
+case $foo_dir in
+ [\\/]* | ?:[\\/]* ) # Absolute
+ ;;
+ *)
+ foo_dir=$dots$foo_dir ;;
+esac
+@end example
+
+@noindent
+Make sure you quote the brackets if appropriate and keep the backslash as
+first character (@pxref{case, , Limitations of Shell Builtins}).
+
+Also, because the colon is used as part of a drivespec, these systems don't
+use it as path separator. When creating or accessing paths, you can use the
+@code{PATH_SEPARATOR} output variable instead. @command{configure} sets this
+to the appropriate value for the build system (@samp{:} or @samp{;}) when it
+starts up.
+
+File names need extra care as well. While DOS variants
+that are Posixy enough to run @command{autoconf} (such as DJGPP)
+are usually able to handle long file names properly, there are still
+limitations that can seriously break packages. Several of these issues
+can be easily detected by the
+@uref{ftp://@/ftp.gnu.org/@/gnu/@/non-gnu/@/doschk/@/doschk-1.1.tar.gz, doschk}
+package.
+
+A short overview follows; problems are marked with SFN/LFN to
+indicate where they apply: SFN means the issues are only relevant to
+plain DOS, not to DOS under Microsoft Windows
+variants, while LFN identifies problems that exist even under
+Microsoft Windows variants.
+
+@table @asis
+@item No multiple dots (SFN)
+DOS cannot handle multiple dots in file names. This is an especially
+important thing to remember when building a portable configure script,
+as @command{autoconf} uses a .in suffix for template files.
+
+This is perfectly OK on Posix variants:
+
+@example
+AC_CONFIG_HEADERS([config.h])
+AC_CONFIG_FILES([source.c foo.bar])
+AC_OUTPUT
+@end example
+
+@noindent
+but it causes problems on DOS, as it requires @samp{config.h.in},
+@samp{source.c.in} and @samp{foo.bar.in}. To make your package more portable
+to DOS-based environments, you should use this instead:
+
+@example
+AC_CONFIG_HEADERS([config.h:config.hin])
+AC_CONFIG_FILES([source.c:source.cin foo.bar:foobar.in])
+AC_OUTPUT
+@end example
+
+@item No leading dot (SFN)
+DOS cannot handle file names that start with a dot. This is usually
+not important for @command{autoconf}.
+
+@item Case insensitivity (LFN)
+DOS is case insensitive, so you cannot, for example, have both a
+file called @samp{INSTALL} and a directory called @samp{install}. This
+also affects @command{make}; if there's a file called @samp{INSTALL} in
+the directory, @samp{make install} does nothing (unless the
+@samp{install} target is marked as PHONY).
+
+@item The 8+3 limit (SFN)
+Because the DOS file system only stores the first 8 characters of
+the file name and the first 3 of the extension, those must be unique.
+That means that @file{foobar-part1.c}, @file{foobar-part2.c} and
+@file{foobar-prettybird.c} all resolve to the same file name
+(@file{FOOBAR-P.C}). The same goes for @file{foo.bar} and
+@file{foo.bartender}.
+
+The 8+3 limit is not usually a problem under Microsoft Windows, as it
+uses numeric
+tails in the short version of file names to make them unique. However, a
+registry setting can turn this behavior off. While this makes it
+possible to share file trees containing long file names between SFN
+and LFN environments, it also means the above problem applies there
+as well.
+
+@item Invalid characters (LFN)
+Some characters are invalid in DOS file names, and should therefore
+be avoided. In a LFN environment, these are @samp{/}, @samp{\},
+@samp{?}, @samp{*}, @samp{:}, @samp{<}, @samp{>}, @samp{|} and @samp{"}.
+In a SFN environment, other characters are also invalid. These
+include @samp{+}, @samp{,}, @samp{[} and @samp{]}.
+
+@item Invalid names (LFN)
+Some DOS file names are reserved, and cause problems if you
+try to use files with those names. These names include @file{CON},
+@file{AUX}, @file{COM1}, @file{COM2}, @file{COM3}, @file{COM4},
+@file{LPT1}, @file{LPT2}, @file{LPT3}, @file{NUL}, and @file{PRN}.
+File names are case insensitive, so even names like
+@file{aux/config.guess} are disallowed.
+
+@end table
+
+@node Shell Pattern Matching
+@section Shell Pattern Matching
+@cindex Shell pattern matching
+
+Nowadays portable patterns can use negated character classes like
+@samp{[!-aeiou]}. The older syntax @samp{[^-aeiou]} is supported by
+some shells but not others; hence portable scripts should never use
+@samp{^} as the first character of a bracket pattern.
+
+Outside the C locale, patterns like @samp{[a-z]} are problematic since
+they may match characters that are not lower-case letters.
+
+@node Shell Substitutions
+@section Shell Substitutions
+@cindex Shell substitutions
+
+Contrary to a persistent urban legend, the Bourne shell does not
+systematically split variables and back-quoted expressions, in particular
+on the right-hand side of assignments and in the argument of @code{case}.
+For instance, the following code:
+
+@example
+case "$given_srcdir" in
+.) top_srcdir="`echo "$dots" | sed 's|/$||'`" ;;
+*) top_srcdir="$dots$given_srcdir" ;;
+esac
+@end example
+
+@noindent
+is more readable when written as:
+
+@example
+case $given_srcdir in
+.) top_srcdir=`echo "$dots" | sed 's|/$||'` ;;
+*) top_srcdir=$dots$given_srcdir ;;
+esac
+@end example
+
+@noindent
+and in fact it is even @emph{more} portable: in the first case of the
+first attempt, the computation of @code{top_srcdir} is not portable,
+since not all shells properly understand @code{"`@dots{}"@dots{}"@dots{}`"},
+for example Solaris 10 ksh:
+
+@example
+$ @kbd{foo="`echo " bar" | sed 's, ,,'`"}
+ksh: : cannot execute
+ksh: bar | sed 's, ,,': cannot execute
+@end example
+
+@noindent
+Posix does not specify behavior for this sequence. On the other hand,
+behavior for @code{"`@dots{}\"@dots{}\"@dots{}`"} is specified by Posix,
+but in practice, not all shells understand it the same way: pdksh 5.2.14
+prints spurious quotes when in Posix mode:
+
+@example
+$ @kbd{echo "`echo \"hello\"`"}
+hello
+$ @kbd{set -o posix}
+$ @kbd{echo "`echo \"hello\"`"}
+"hello"
+@end example
+
+@noindent
+There is just no portable way to use double-quoted strings inside
+double-quoted back-quoted expressions (pfew!).
+
+Bash 4.1 has a bug where quoted empty strings adjacent to unquoted
+parameter expansions are elided during word splitting. Meanwhile, zsh
+does not perform word splitting except when in Bourne compatibility
+mode. In the example below, the correct behavior is to have five
+arguments to the function, and exactly two spaces on either side of the
+middle @samp{-}, since word splitting collapses multiple spaces in
+@samp{$f} but leaves empty arguments intact.
+
+@example
+$ @kbd{bash -c 'n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'}
+3- - -
+$ @kbd{ksh -c 'n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'}
+5- - -
+$ @kbd{zsh -c 'n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'}
+3- - -
+$ @kbd{zsh -c 'emulate sh;}
+> @kbd{n() @{ echo "$#$@@"; @}; f=" - "; n - ""$f"" -'}
+5- - -
+@end example
+
+@noindent
+You can work around this by doing manual word splitting, such as using
+@samp{"$str" $list} rather than @samp{"$str"$list}.
+
+There are also portability pitfalls with particular expansions:
+
+@table @code
+@item $@@
+@cindex @code{"$@@"}
+One of the most famous shell-portability issues is related to
+@samp{"$@@"}. When there are no positional arguments, Posix says
+that @samp{"$@@"} is supposed to be equivalent to nothing, but the
+original Unix version 7 Bourne shell treated it as equivalent to
+@samp{""} instead, and this behavior survives in later implementations
+like Digital Unix 5.0.
+
+The traditional way to work around this portability problem is to use
+@samp{$@{1+"$@@"@}}. Unfortunately this method does not work with
+Zsh (3.x and 4.x), which is used on Mac OS X@. When emulating
+the Bourne shell, Zsh performs word splitting on @samp{$@{1+"$@@"@}}:
+
+@example
+zsh $ @kbd{emulate sh}
+zsh $ @kbd{for i in "$@@"; do echo $i; done}
+Hello World
+!
+zsh $ @kbd{for i in $@{1+"$@@"@}; do echo $i; done}
+Hello
+World
+!
+@end example
+
+@noindent
+Zsh handles plain @samp{"$@@"} properly, but we can't use plain
+@samp{"$@@"} because of the portability problems mentioned above.
+One workaround relies on Zsh's ``global aliases'' to convert
+@samp{$@{1+"$@@"@}} into @samp{"$@@"} by itself:
+
+@example
+test "$@{ZSH_VERSION+set@}" = set && alias -g '$@{1+"$@@"@}'='"$@@"'
+@end example
+
+Zsh only recognizes this alias when a shell word matches it exactly;
+@samp{"foo"$@{1+"$@@"@}} remains subject to word splitting. Since this
+case always yields at least one shell word, use plain @samp{"$@@"}.
+
+A more conservative workaround is to avoid @samp{"$@@"} if it is
+possible that there may be no positional arguments. For example,
+instead of:
+
+@example
+cat conftest.c "$@@"
+@end example
+
+you can use this instead:
+
+@example
+case $# in
+0) cat conftest.c;;
+*) cat conftest.c "$@@";;
+esac
+@end example
+
+Autoconf macros often use the @command{set} command to update
+@samp{$@@}, so if you are writing shell code intended for
+@command{configure} you should not assume that the value of @samp{$@@}
+persists for any length of time.
+
+
+@item $@{10@}
+@cindex positional parameters
+The 10th, 11th, @dots{} positional parameters can be accessed only after
+a @code{shift}. The 7th Edition shell reported an error if given
+@code{$@{10@}}, and
+Solaris 10 @command{/bin/sh} still acts that way:
+
+@example
+$ @kbd{set 1 2 3 4 5 6 7 8 9 10}
+$ @kbd{echo $@{10@}}
+bad substitution
+@end example
+
+Conversely, not all shells obey the Posix rule that when braces are
+omitted, multiple digits beyond a @samp{$} imply the single-digit
+positional parameter expansion concatenated with the remaining literal
+digits. To work around the issue, you must use braces.
+
+@example
+$ @kbd{bash -c 'set a b c d e f g h i j; echo $10 $@{1@}0'}
+a0 a0
+$ @kbd{dash -c 'set a b c d e f g h i j; echo $10 $@{1@}0'}
+j a0
+@end example
+
+@item $@{@var{var}:-@var{value}@}
+@c Info cannot handle `:' in index entries.
+@ifnotinfo
+@cindex @code{$@{@var{var}:-@var{value}@}}
+@end ifnotinfo
+@cindex @code{$@{@var{var}-@var{value}@}}
+Old BSD shells, including the Ultrix @code{sh}, don't accept the
+colon for any shell substitution, and complain and die.
+Similarly for $@{@var{var}:=@var{value}@}, $@{@var{var}:?@var{value}@}, etc.
+However, all shells that support functions allow the use of colon in
+shell substitution, and since m4sh requires functions, you can portably
+use null variable substitution patterns in configure scripts.
+
+@item $@{@var{var}+@var{value}@}
+@cindex @code{$@{@var{var}+@var{value}@}}
+When using @samp{$@{@var{var}-@var{value}@}} or
+@samp{$@{@var{var}-@var{value}@}} for providing alternate substitutions,
+@var{value} must either be a single shell word, quoted, or in the
+context of an unquoted here-document. Solaris
+@command{/bin/sh} complains otherwise.
+
+@example
+$ @kbd{/bin/sh -c 'echo $@{a-b c@}'}
+/bin/sh: bad substitution
+$ @kbd{/bin/sh -c 'echo $@{a-'\''b c'\''@}'}
+b c
+$ @kbd{/bin/sh -c 'echo "$@{a-b c@}"'}
+b c
+$ @kbd{/bin/sh -c 'cat <<EOF
+$@{a-b c@}
+EOF}
+b c
+@end example
+
+According to Posix, if an expansion occurs inside double quotes, then
+the use of unquoted double quotes within @var{value} is unspecified, and
+any single quotes become literal characters; in that case, escaping must
+be done with backslash. Likewise, the use of unquoted here-documents is
+a case where double quotes have unspecified results:
+
+@example
+$ @kbd{/bin/sh -c 'echo "$@{a-"b c"@}"'}
+/bin/sh: bad substitution
+$ @kbd{ksh -c 'echo "$@{a-"b c"@}"'}
+b c
+$ @kbd{bash -c 'echo "$@{a-"b c"@}"'}
+b c
+$ @kbd{/bin/sh -c 'a=; echo $@{a+'\''b c'\''@}'}
+b c
+$ @kbd{/bin/sh -c 'a=; echo "$@{a+'\''b c'\''@}"'}
+'b c'
+$ @kbd{/bin/sh -c 'a=; echo "$@{a+\"b c\"@}"'}
+"b c"
+$ @kbd{/bin/sh -c 'a=; echo "$@{a+b c@}"'}
+b c
+$ @kbd{/bin/sh -c 'cat <<EOF
+$@{a-"b c"@}
+EOF'}
+"b c"
+$ @kbd{/bin/sh -c 'cat <<EOF
+$@{a-'b c'@}
+EOF'}
+'b c'
+$ @kbd{bash -c 'cat <<EOF
+$@{a-"b c"@}
+EOF'}
+b c
+$ @kbd{bash -c 'cat <<EOF
+$@{a-'b c'@}
+EOF'}
+'b c'
+@end example
+
+Perhaps the easiest way to work around quoting issues in a manner
+portable to all shells is to place the results in a temporary variable,
+then use @samp{$t} as the @var{value}, rather than trying to inline
+the expression needing quoting.
+
+@example
+$ @kbd{/bin/sh -c 't="b c\"'\''@}\\"; echo "$@{a-$t@}"'}
+b c"'@}\
+$ @kbd{ksh -c 't="b c\"'\''@}\\"; echo "$@{a-$t@}"'}
+b c"'@}\
+$ @kbd{bash -c 't="b c\"'\''@}\\"; echo "$@{a-$t@}"'}
+b c"'@}\
+@end example
+
+@item $@{@var{var}=@var{value}@}
+@cindex @code{$@{@var{var}=@var{value}@}}
+When using @samp{$@{@var{var}=@var{value}@}} to assign a default value
+to @var{var}, remember that even though the assignment to @var{var} does
+not undergo file name expansion, the result of the variable expansion
+does unless the expansion occurred within double quotes. In particular,
+when using @command{:} followed by unquoted variable expansion for the
+side effect of setting a default value, if the final value of
+@samp{$var} contains any globbing characters (either from @var{value} or
+from prior contents), the shell has to spend time performing file name
+expansion and field splitting even though those results will not be
+used. Therefore, it is a good idea to consider double quotes when performing
+default initialization; while remembering how this impacts any quoting
+characters appearing in @var{value}.
+
+@example
+$ @kbd{time bash -c ': "$@{a=/usr/bin/*@}"; echo "$a"'}
+/usr/bin/*
+
+real 0m0.005s
+user 0m0.002s
+sys 0m0.003s
+$ @kbd{time bash -c ': $@{a=/usr/bin/*@}; echo "$a"'}
+/usr/bin/*
+
+real 0m0.039s
+user 0m0.026s
+sys 0m0.009s
+$ @kbd{time bash -c 'a=/usr/bin/*; : $@{a=noglob@}; echo "$a"'}
+/usr/bin/*
+
+real 0m0.031s
+user 0m0.020s
+sys 0m0.010s
+
+$ @kbd{time bash -c 'a=/usr/bin/*; : "$@{a=noglob@}"; echo "$a"'}
+/usr/bin/*
+
+real 0m0.006s
+user 0m0.002s
+sys 0m0.003s
+@end example
+
+As with @samp{+} and @samp{-}, you must use quotes when using @samp{=}
+if the @var{value} contains more than one shell word; either single
+quotes for just the @var{value}, or double quotes around the entire
+expansion:
+
+@example
+$ @kbd{: $@{var1='Some words'@}}
+$ @kbd{: "$@{var2=like this@}"}
+$ @kbd{echo $var1 $var2}
+Some words like this
+@end example
+
+@noindent
+otherwise some shells, such as Solaris @command{/bin/sh} or on Digital
+Unix V 5.0, die because of a ``bad substitution''. Meanwhile, Posix
+requires that with @samp{=}, quote removal happens prior to the
+assignment, and the expansion be the final contents of @var{var} without
+quoting (and thus subject to field splitting), in contrast to the
+behavior with @samp{-} passing the quoting through to the final
+expansion. However, @command{bash} 4.1 does not obey this rule.
+
+@example
+$ @kbd{ksh -c 'echo $@{var-a\ \ b@}'}
+a b
+$ @kbd{ksh -c 'echo $@{var=a\ \ b@}'}
+a b
+$ @kbd{bash -c 'echo $@{var=a\ \ b@}'}
+a b
+@end example
+
+Finally, Posix states that when mixing @samp{$@{a=b@}} with regular
+commands, it is unspecified whether the assignments affect the parent
+shell environment. It is best to perform assignments independently from
+commands, to avoid the problems demonstrated in this example:
+
+@example
+$ @kbd{bash -c 'x= y=$@{x:=b@} sh -c "echo +\$x+\$y+";echo -$x-'}
++b+b+
+-b-
+$ @kbd{/bin/sh -c 'x= y=$@{x:=b@} sh -c "echo +\$x+\$y+";echo -$x-'}
+++b+
+--
+$ @kbd{ksh -c 'x= y=$@{x:=b@} sh -c "echo +\$x+\$y+";echo -$x-'}
++b+b+
+--
+@end example
+
+@item $@{@var{var}=@var{value}@}
+@cindex @code{$@{@var{var}=@var{literal}@}}
+Solaris @command{/bin/sh} has a frightening bug in its handling of
+literal assignments. Imagine you need set a variable to a string containing
+@samp{@}}. This @samp{@}} character confuses Solaris @command{/bin/sh}
+when the affected variable was already set. This bug can be exercised
+by running:
+
+@example
+$ @kbd{unset foo}
+$ @kbd{foo=$@{foo='@}'@}}
+$ @kbd{echo $foo}
+@}
+$ @kbd{foo=$@{foo='@}' # no error; this hints to what the bug is}
+$ @kbd{echo $foo}
+@}
+$ @kbd{foo=$@{foo='@}'@}}
+$ @kbd{echo $foo}
+@}@}
+ ^ ugh!
+@end example
+
+It seems that @samp{@}} is interpreted as matching @samp{$@{}, even
+though it is enclosed in single quotes. The problem doesn't happen
+using double quotes, or when using a temporary variable holding the
+problematic string.
+
+@item $@{@var{var}=@var{expanded-value}@}
+@cindex @code{$@{@var{var}=@var{expanded-value}@}}
+On Ultrix,
+running
+
+@example
+default="yu,yaa"
+: $@{var="$default"@}
+@end example
+
+@noindent
+sets @var{var} to @samp{M-yM-uM-,M-yM-aM-a}, i.e., the 8th bit of
+each char is set. You don't observe the phenomenon using a simple
+@samp{echo $var} since apparently the shell resets the 8th bit when it
+expands $var. Here are two means to make this shell confess its sins:
+
+@example
+$ @kbd{cat -v <<EOF
+$var
+EOF}
+@end example
+
+@noindent
+and
+
+@example
+$ @kbd{set | grep '^var=' | cat -v}
+@end example
+
+One classic incarnation of this bug is:
+
+@example
+default="a b c"
+: $@{list="$default"@}
+for c in $list; do
+ echo $c
+done
+@end example
+
+@noindent
+You'll get @samp{a b c} on a single line. Why? Because there are no
+spaces in @samp{$list}: there are @samp{M- }, i.e., spaces with the 8th
+bit set, hence no IFS splitting is performed!!!
+
+One piece of good news is that Ultrix works fine with @samp{:
+$@{list=$default@}}; i.e., if you @emph{don't} quote. The bad news is
+then that QNX 4.25 then sets @var{list} to the @emph{last} item of
+@var{default}!
+
+The portable way out consists in using a double assignment, to switch
+the 8th bit twice on Ultrix:
+
+@example
+list=$@{list="$default"@}
+@end example
+
+@noindent
+@dots{}but beware of the @samp{@}} bug from Solaris (see above). For safety,
+use:
+
+@example
+test "$@{var+set@}" = set || var=@var{@{value@}}
+@end example
+
+@item $@{#@var{var}@}
+@itemx $@{@var{var}%@var{word}@}
+@itemx $@{@var{var}%%@var{word}@}
+@itemx $@{@var{var}#@var{word}@}
+@itemx $@{@var{var}##@var{word}@}
+@cindex @code{$@{#@var{var}@}}
+@cindex @code{$@{@var{var}%@var{word}@}}
+@cindex @code{$@{@var{var}%%@var{word}@}}
+@cindex @code{$@{@var{var}#@var{word}@}}
+@cindex @code{$@{@var{var}##@var{word}@}}
+Posix requires support for these usages, but they do not work with many
+traditional shells, e.g., Solaris 10 @command{/bin/sh}.
+
+Also, @command{pdksh} 5.2.14 mishandles some @var{word} forms. For
+example if @samp{$1} is @samp{a/b} and @samp{$2} is @samp{a}, then
+@samp{$@{1#$2@}} should yield @samp{/b}, but with @command{pdksh} it
+yields the empty string.
+
+
+@item `@var{commands}`
+@cindex @code{`@var{commands}`}
+@cindex Command Substitution
+Posix requires shells to trim all trailing newlines from command
+output before substituting it, so assignments like
+@samp{dir=`echo "$file" | tr a A`} do not work as expected if
+@samp{$file} ends in a newline.
+
+While in general it makes no sense, do not substitute a single builtin
+with side effects, because Ash 0.2, trying to optimize, does not fork a
+subshell to perform the command.
+
+For instance, if you wanted to check that @command{cd} is silent, do not
+use @samp{test -z "`cd /`"} because the following can happen:
+
+@example
+$ @kbd{pwd}
+/tmp
+$ @kbd{test -z "`cd /`" && pwd}
+/
+@end example
+
+@noindent
+The result of @samp{foo=`exit 1`} is left as an exercise to the reader.
+
+The MSYS shell leaves a stray byte in the expansion of a double-quoted
+command substitution of a native program, if the end of the substitution
+is not aligned with the end of the double quote. This may be worked
+around by inserting another pair of quotes:
+
+@example
+$ @kbd{echo "`printf 'foo\r\n'` bar" > broken}
+$ @kbd{echo "`printf 'foo\r\n'`"" bar" | cmp - broken}
+- broken differ: char 4, line 1
+@end example
+
+Upon interrupt or SIGTERM, some shells may abort a command substitution,
+replace it with a null string, and wrongly evaluate the enclosing
+command before entering the trap or ending the script. This can lead to
+spurious errors:
+
+@example
+$ @kbd{sh -c 'if test `sleep 5; echo hi` = hi; then echo yes; fi'}
+$ @kbd{^C}
+sh: test: hi: unexpected operator/operand
+@end example
+
+@noindent
+You can avoid this by assigning the command substitution to a temporary
+variable:
+
+@example
+$ @kbd{sh -c 'res=`sleep 5; echo hi`
+ if test "x$res" = xhi; then echo yes; fi'}
+$ @kbd{^C}
+@end example
+
+@item $(@var{commands})
+@cindex @code{$(@var{commands})}
+This construct is meant to replace @samp{`@var{commands}`},
+and it has most of the problems listed under @code{`@var{commands}`}.
+
+This construct can be
+nested while this is impossible to do portably with back quotes.
+Unfortunately it is not yet universally supported. Most notably, even recent
+releases of Solaris don't support it:
+
+@example
+$ @kbd{showrev -c /bin/sh | grep version}
+Command version: SunOS 5.10 Generic 121005-03 Oct 2006
+$ @kbd{echo $(echo blah)}
+syntax error: `(' unexpected
+@end example
+
+@noindent
+nor does IRIX 6.5's Bourne shell:
+@example
+$ @kbd{uname -a}
+IRIX firebird-image 6.5 07151432 IP22
+$ @kbd{echo $(echo blah)}
+$(echo blah)
+@end example
+
+If you do use @samp{$(@var{commands})}, make sure that the commands
+do not start with a parenthesis, as that would cause confusion with
+a different notation @samp{$((@var{expression}))} that in modern
+shells is an arithmetic expression not a command. To avoid the
+confusion, insert a space between the two opening parentheses.
+
+Avoid @var{commands} that contain unbalanced parentheses in
+here-documents, comments, or case statement patterns, as many shells
+mishandle them. For example, Bash 3.1, @samp{ksh88}, @command{pdksh}
+5.2.14, and Zsh 4.2.6 all mishandle the following valid command:
+
+@example
+echo $(case x in x) echo hello;; esac)
+@end example
+
+
+@item $((@var{expression}))
+@cindex @code{$((@var{expression}))}
+Arithmetic expansion is not portable as some shells (most
+notably Solaris 10 @command{/bin/sh}) don't support it.
+
+Among shells that do support @samp{$(( ))}, not all of them obey the
+Posix rule that octal and hexadecimal constants must be recognized:
+
+@example
+$ @kbd{bash -c 'echo $(( 010 + 0x10 ))'}
+24
+$ @kbd{zsh -c 'echo $(( 010 + 0x10 ))'}
+26
+$ @kbd{zsh -c 'emulate sh; echo $(( 010 + 0x10 ))'}
+24
+$ @kbd{pdksh -c 'echo $(( 010 + 0x10 ))'}
+pdksh: 010 + 0x10 : bad number `0x10'
+$ @kbd{pdksh -c 'echo $(( 010 ))'}
+10
+@end example
+
+When it is available, using arithmetic expansion provides a noticeable
+speedup in script execution; but testing for support requires
+@command{eval} to avoid syntax errors. The following construct is used
+by @code{AS_VAR_ARITH} to provide arithmetic computation when all
+arguments are provided in decimal and without a leading zero, and all
+operators are properly quoted and appear as distinct arguments:
+
+@example
+if ( eval 'test $(( 1 + 1 )) = 2' ) 2>/dev/null; then
+ eval 'func_arith ()
+ @{
+ func_arith_result=$(( $* ))
+ @}'
+else
+ func_arith ()
+ @{
+ func_arith_result=`expr "$@@"`
+ @}
+fi
+func_arith 1 + 1
+foo=$func_arith_result
+@end example
+
+
+@item ^
+@cindex @code{^} quoting
+Always quote @samp{^}, otherwise traditional shells such as
+@command{/bin/sh} on Solaris 10 treat this like @samp{|}.
+
+@end table
+
+
+@node Assignments
+@section Assignments
+@cindex Shell assignments
+
+When setting several variables in a row, be aware that the order of the
+evaluation is undefined. For instance @samp{foo=1 foo=2; echo $foo}
+gives @samp{1} with Solaris @command{/bin/sh}, but @samp{2} with Bash.
+You must use
+@samp{;} to enforce the order: @samp{foo=1; foo=2; echo $foo}.
+
+Don't rely on the following to find @file{subdir/program}:
+
+@example
+PATH=subdir$PATH_SEPARATOR$PATH program
+@end example
+
+@noindent
+as this does not work with Zsh 3.0.6. Use something like this
+instead:
+
+@example
+(PATH=subdir$PATH_SEPARATOR$PATH; export PATH; exec program)
+@end example
+
+Don't rely on the exit status of an assignment: Ash 0.2 does not change
+the status and propagates that of the last statement:
+
+@example
+$ @kbd{false || foo=bar; echo $?}
+1
+$ @kbd{false || foo=`:`; echo $?}
+0
+@end example
+
+@noindent
+and to make things even worse, QNX 4.25 just sets the exit status
+to 0 in any case:
+
+@example
+$ @kbd{foo=`exit 1`; echo $?}
+0
+@end example
+
+To assign default values, follow this algorithm:
+
+@enumerate
+@item
+If the default value is a literal and does not contain any closing
+brace, use:
+
+@example
+: "$@{var='my literal'@}"
+@end example
+
+@item
+If the default value contains no closing brace, has to be expanded, and
+the variable being initialized is not intended to be IFS-split
+(i.e., it's not a list), then use:
+
+@example
+: $@{var="$default"@}
+@end example
+
+@item
+If the default value contains no closing brace, has to be expanded, and
+the variable being initialized is intended to be IFS-split (i.e., it's a list),
+then use:
+
+@example
+var=$@{var="$default"@}
+@end example
+
+@item
+If the default value contains a closing brace, then use:
+
+@example
+test "$@{var+set@}" = set || var="has a '@}'"
+@end example
+@end enumerate
+
+In most cases @samp{var=$@{var="$default"@}} is fine, but in case of
+doubt, just use the last form. @xref{Shell Substitutions}, items
+@samp{$@{@var{var}:-@var{value}@}} and @samp{$@{@var{var}=@var{value}@}}
+for the rationale.
+
+@node Parentheses
+@section Parentheses in Shell Scripts
+@cindex Shell parentheses
+
+Beware of two opening parentheses in a row, as many shell
+implementations treat them specially, and Posix says that a portable
+script cannot use @samp{((} outside the @samp{$((} form used for shell
+arithmetic. In traditional shells, @samp{((cat))} behaves like
+@samp{(cat)}; but many shells, including
+Bash and the Korn shell, treat @samp{((cat))} as an arithmetic
+expression equivalent to @samp{let "cat"}, and may or may not report an
+error when they detect that @samp{cat} is not a number. As another
+example, @samp{pdksh} 5.2.14 does not treat the following code
+as a traditional shell would:
+
+@example
+if ((true) || false); then
+ echo ok
+fi
+@end example
+
+@noindent
+To work around this problem, insert a space between the two opening
+parentheses. There is a similar problem and workaround with
+@samp{$((}; see @ref{Shell Substitutions}.
+
+@node Slashes
+@section Slashes in Shell Scripts
+@cindex Shell slashes
+
+Unpatched Tru64 5.1 @command{sh} omits the last slash of command-line
+arguments that contain two trailing slashes:
+
+@example
+$ @kbd{echo / // /// //// .// //.}
+/ / // /// ./ //.
+$ @kbd{x=//}
+$ @kbd{eval "echo \$x"}
+/
+$ @kbd{set -x}
+$ @kbd{echo abc | tr -t ab //}
++ echo abc
++ tr -t ab /
+/bc
+@end example
+
+Unpatched Tru64 4.0 @command{sh} adds a slash after @samp{"$var"} if the
+variable is empty and the second double-quote is followed by a word that
+begins and ends with slash:
+
+@example
+$ @kbd{sh -xc 'p=; echo "$p"/ouch/'}
+p=
++ echo //ouch/
+//ouch/
+@end example
+
+However, our understanding is that patches are available, so perhaps
+it's not worth worrying about working around these horrendous bugs.
+
+@node Special Shell Variables
+@section Special Shell Variables
+@cindex Shell variables
+@cindex Special shell variables
+
+Some shell variables should not be used, since they can have a deep
+influence on the behavior of the shell. In order to recover a sane
+behavior from the shell, some variables should be unset; M4sh takes
+care of this and provides fallback values, whenever needed, to cater
+for a very old @file{/bin/sh} that does not support @command{unset}.
+(@pxref{Portable Shell, , Portable Shell Programming}).
+
+As a general rule, shell variable names containing a lower-case letter
+are safe; you can define and use these variables without worrying about
+their effect on the underlying system, and without worrying about
+whether the shell changes them unexpectedly. (The exception is the
+shell variable @code{status}, as described below.)
+
+Here is a list of names that are known to cause trouble. This list is
+not exhaustive, but you should be safe if you avoid the name
+@code{status} and names containing only upper-case letters and
+underscores.
+
+@c Alphabetical order, case insensitive, `A' before `a'.
+@table @code
+@item ?
+Not all shells correctly reset @samp{$?} after conditionals (@pxref{if,
+, Limitations of Shell Builtins}). Not all shells manage @samp{$?}
+correctly in shell functions (@pxref{Shell Functions}) or in traps
+(@pxref{trap, , Limitations of Shell Builtins}). Not all shells reset
+@samp{$?} to zero after an empty command.
+
+@example
+$ @kbd{bash -c 'false; $empty; echo $?'}
+0
+$ @kbd{zsh -c 'false; $empty; echo $?'}
+1
+@end example
+
+@item _
+@evindex _
+Many shells reserve @samp{$_} for various purposes, e.g., the name of
+the last command executed.
+
+@item BIN_SH
+@evindex BIN_SH
+In Tru64, if @env{BIN_SH} is set to @code{xpg4}, subsidiary invocations of
+the standard shell conform to Posix.
+
+@item CDPATH
+@evindex CDPATH
+When this variable is set it specifies a list of directories to search
+when invoking @code{cd} with a relative file name that did not start
+with @samp{./} or @samp{../}. Posix
+1003.1-2001 says that if a nonempty directory name from @env{CDPATH}
+is used successfully, @code{cd} prints the resulting absolute
+file name. Unfortunately this output can break idioms like
+@samp{abs=`cd src && pwd`} because @code{abs} receives the name twice.
+Also, many shells do not conform to this part of Posix; for
+example, @command{zsh} prints the result only if a directory name
+other than @file{.} was chosen from @env{CDPATH}.
+
+In practice the shells that have this problem also support
+@command{unset}, so you can work around the problem as follows:
+
+@example
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+@end example
+
+You can also avoid output by ensuring that your directory name is
+absolute or anchored at @samp{./}, as in @samp{abs=`cd ./src && pwd`}.
+
+Configure scripts use M4sh, which automatically unsets @env{CDPATH} if
+possible, so you need not worry about this problem in those scripts.
+
+@item CLICOLOR_FORCE
+@evindex CLICOLOR_FORCE
+When this variable is set, some implementations of tools like
+@command{ls} attempt to add color to their output via terminal escape
+sequences, even when the output is not directed to a terminal, and can
+thus cause spurious failures in scripts. Configure scripts use M4sh,
+which automatically unsets this variable.
+
+@item DUALCASE
+@evindex DUALCASE
+In the MKS shell, case statements and file name generation are
+case-insensitive unless @env{DUALCASE} is nonzero.
+Autoconf-generated scripts export this variable when they start up.
+
+@item ENV
+@itemx MAIL
+@itemx MAILPATH
+@itemx PS1
+@itemx PS2
+@itemx PS4
+@evindex ENV
+@evindex MAIL
+@evindex MAILPATH
+@evindex PS1
+@evindex PS2
+@evindex PS4
+These variables should not matter for shell scripts, since they are
+supposed to affect only interactive shells. However, at least one
+shell (the pre-3.0 UWIN Korn shell) gets confused about
+whether it is interactive, which means that (for example) a @env{PS1}
+with a side effect can unexpectedly modify @samp{$?}. To work around
+this bug, M4sh scripts (including @file{configure} scripts) do something
+like this:
+
+@example
+(unset ENV) >/dev/null 2>&1 && unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+@end example
+
+@noindent
+(actually, there is some complication due to bugs in @command{unset};
+@pxref{unset, , Limitations of Shell Builtins}).
+
+@item FPATH
+@evindex FPATH
+The Korn shell uses @env{FPATH} to find shell functions, so avoid
+@env{FPATH} in portable scripts. @env{FPATH} is consulted after
+@env{PATH}, but you still need to be wary of tests that use @env{PATH}
+to find whether a command exists, since they might report the wrong
+result if @env{FPATH} is also set.
+
+@item GREP_OPTIONS
+@evindex GREP_OPTIONS
+When this variable is set, some implementations of @command{grep} honor
+these options, even if the options include direction to enable colored
+output via terminal escape sequences, and the result can cause spurious
+failures when the output is not directed to a terminal. Configure
+scripts use M4sh, which automatically unsets this variable.
+
+@item IFS
+@evindex IFS
+Long ago, shell scripts inherited @env{IFS} from the environment,
+but this caused many problems so modern shells ignore any environment
+settings for @env{IFS}.
+
+Don't set the first character of @env{IFS} to backslash. Indeed,
+Bourne shells use the first character (backslash) when joining the
+components in @samp{"$@@"} and some shells then reinterpret (!)@: the
+backslash escapes, so you can end up with backspace and other strange
+characters.
+
+The proper value for @env{IFS} (in regular code, not when performing
+splits) is @samp{@key{SPC}@key{TAB}@key{RET}}. The first character is
+especially important, as it is used to join the arguments in @samp{$*};
+however, note that traditional shells, but also bash-2.04, fail to adhere
+to this and join with a space anyway.
+
+M4sh guarantees that @env{IFS} will have the default value at the
+beginning of a script, and many macros within autoconf rely on this
+setting. It is okay to use blocks of shell code that temporarily change
+the value of @env{IFS} in order to split on another character, but
+remember to restore it before expanding further macros.
+
+Unsetting @code{IFS} instead of resetting it to the default sequence
+is not suggested, since code that tries to save and restore the
+variable's value will incorrectly reset it to an empty value, thus
+disabling field splitting:
+
+@example
+unset IFS
+# default separators used for field splitting
+
+save_IFS=$IFS
+IFS=:
+# ...
+IFS=$save_IFS
+# no field splitting performed
+@end example
+
+@item LANG
+@itemx LC_ALL
+@itemx LC_COLLATE
+@itemx LC_CTYPE
+@itemx LC_MESSAGES
+@itemx LC_MONETARY
+@itemx LC_NUMERIC
+@itemx LC_TIME
+@evindex LANG
+@evindex LC_ALL
+@evindex LC_COLLATE
+@evindex LC_CTYPE
+@evindex LC_MESSAGES
+@evindex LC_MONETARY
+@evindex LC_NUMERIC
+@evindex LC_TIME
+
+You should set all these variables to @samp{C} because so much
+configuration code assumes the C locale and Posix requires that locale
+environment variables be set to @samp{C} if the C locale is desired;
+@file{configure} scripts and M4sh do that for you.
+Export these variables after setting them.
+
+@c However, some older, nonstandard
+@c systems (notably SCO) break if locale environment variables
+@c are set to @samp{C}, so when running on these systems
+@c Autoconf-generated scripts unset the variables instead.
+
+@item LANGUAGE
+@evindex LANGUAGE
+
+@env{LANGUAGE} is not specified by Posix, but it is a GNU
+extension that overrides @env{LC_ALL} in some cases, so you (or M4sh)
+should set it too.
+
+@item LC_ADDRESS
+@itemx LC_IDENTIFICATION
+@itemx LC_MEASUREMENT
+@itemx LC_NAME
+@itemx LC_PAPER
+@itemx LC_TELEPHONE
+@evindex LC_ADDRESS
+@evindex LC_IDENTIFICATION
+@evindex LC_MEASUREMENT
+@evindex LC_NAME
+@evindex LC_PAPER
+@evindex LC_TELEPHONE
+
+These locale environment variables are GNU extensions. They
+are treated like their Posix brethren (@env{LC_COLLATE},
+etc.)@: as described above.
+
+@item LINENO
+@evindex LINENO
+Most modern shells provide the current line number in @code{LINENO}.
+Its value is the line number of the beginning of the current command.
+M4sh, and hence Autoconf, attempts to execute @command{configure} with
+a shell that supports @code{LINENO}. If no such shell is available, it
+attempts to implement @code{LINENO} with a Sed prepass that replaces each
+instance of the string @code{$LINENO} (not followed by an alphanumeric
+character) with the line's number. In M4sh scripts you should execute
+@code{AS_LINENO_PREPARE} so that these workarounds are included in
+your script; configure scripts do this automatically in @code{AC_INIT}.
+
+You should not rely on @code{LINENO} within @command{eval} or shell
+functions, as the behavior differs in practice. The presence of a
+quoted newline within simple commands can alter which line number is
+used as the starting point for @code{$LINENO} substitutions within that
+command. Also, the possibility of the Sed prepass means that you should
+not rely on @code{$LINENO} when quoted, when in here-documents, or when
+line continuations are used. Subshells should be OK, though. In the
+following example, lines 1, 9, and 14 are portable, but the other
+instances of @code{$LINENO} do not have deterministic values:
+
+@example
+@group
+$ @kbd{cat lineno}
+echo 1. $LINENO
+echo "2. $LINENO
+3. $LINENO"
+cat <<EOF
+5. $LINENO
+6. $LINENO
+7. \$LINENO
+EOF
+( echo 9. $LINENO )
+eval 'echo 10. $LINENO'
+eval 'echo 11. $LINENO
+echo 12. $LINENO'
+echo 13. '$LINENO'
+echo 14. $LINENO '
+15.' $LINENO
+f () @{ echo $1 $LINENO;
+echo $1 $LINENO @}
+f 18.
+echo 19. \
+$LINENO
+@end group
+@group
+$ @kbd{bash-3.2 ./lineno}
+1. 1
+2. 3
+3. 3
+5. 4
+6. 4
+7. $LINENO
+9. 9
+10. 10
+11. 12
+12. 13
+13. $LINENO
+14. 14
+15. 14
+18. 16
+18. 17
+19. 19
+@end group
+@group
+$ @kbd{zsh-4.3.4 ./lineno}
+1. 1
+2. 2
+3. 2
+5. 4
+6. 4
+7. $LINENO
+9. 9
+10. 1
+11. 1
+12. 2
+13. $LINENO
+14. 14
+15. 14
+18. 0
+18. 1
+19. 19
+@end group
+@group
+$ @kbd{pdksh-5.2.14 ./lineno}
+1. 1
+2. 2
+3. 2
+5. 4
+6. 4
+7. $LINENO
+9. 9
+10. 0
+11. 0
+12. 0
+13. $LINENO
+14. 14
+15. 14
+18. 16
+18. 17
+19. 19
+@end group
+@group
+$ @kbd{sed '=' <lineno |}
+> @kbd{ sed '}
+> @kbd{ N}
+> @kbd{ s,$,-,}
+> @kbd{ t loop}
+> @kbd{ :loop}
+> @kbd{ s,^\([0-9]*\)\(.*\)[$]LINENO\([^a-zA-Z0-9_]\),\1\2\1\3,}
+> @kbd{ t loop}
+> @kbd{ s,-$,,}
+> @kbd{ s,^[0-9]*\n,,}
+> @kbd{ ' |}
+> @kbd{ sh}
+1. 1
+2. 2
+3. 3
+5. 5
+6. 6
+7. \7
+9. 9
+10. 10
+11. 11
+12. 12
+13. 13
+14. 14
+15. 15
+18. 16
+18. 17
+19. 20
+@end group
+@end example
+
+In particular, note that @file{config.status} (and any other subsidiary
+script created by @code{AS_INIT_GENERATED}) might report line numbers
+relative to the parent script as a result of the potential Sed pass.
+
+@item NULLCMD
+@evindex NULLCMD
+When executing the command @samp{>foo}, @command{zsh} executes
+@samp{$NULLCMD >foo} unless it is operating in Bourne shell
+compatibility mode and the @command{zsh} version is newer
+than 3.1.6-dev-18. If you are using an older @command{zsh}
+and forget to set @env{NULLCMD},
+your script might be suspended waiting for data on its standard input.
+
+@item options
+@evindex options
+For @command{zsh} 4.3.10, @env{options} is treated as an associative
+array even after @code{emulate sh}, so it should not be used.
+
+@item PATH_SEPARATOR
+@evindex PATH_SEPARATOR
+On DJGPP systems, the @env{PATH_SEPARATOR} environment
+variable can be set to either @samp{:} or @samp{;} to control the path
+separator Bash uses to set up certain environment variables (such as
+@env{PATH}). You can set this variable to @samp{;} if you want
+@command{configure} to use @samp{;} as a separator; this might be useful
+if you plan to use non-Posix shells to execute files. @xref{File System
+Conventions}, for more information about @code{PATH_SEPARATOR}.
+
+@item POSIXLY_CORRECT
+@evindex POSIXLY_CORRECT
+In the GNU environment, exporting @env{POSIXLY_CORRECT} with any value
+(even empty) causes programs to try harder to conform to Posix.
+Autoconf does not directly manipulate this variable, but @command{bash}
+ties the shell variable @env{POSIXLY_CORRECT} to whether the script is
+running in Posix mode. Therefore, take care when exporting or unsetting
+this variable, so as not to change whether @command{bash} is in Posix
+mode.
+
+@example
+$ @kbd{bash --posix -c 'set -o | grep posix}
+> @kbd{unset POSIXLY_CORRECT}
+> @kbd{set -o | grep posix'}
+posix on
+posix off
+@end example
+
+@item PWD
+@evindex PWD
+Posix 1003.1-2001 requires that @command{cd} and
+@command{pwd} must update the @env{PWD} environment variable to point
+to the logical name of the current directory, but traditional shells
+do not support this. This can cause confusion if one shell instance
+maintains @env{PWD} but a subsidiary and different shell does not know
+about @env{PWD} and executes @command{cd}; in this case @env{PWD}
+points to the wrong directory. Use @samp{`pwd`} rather than
+@samp{$PWD}.
+
+@item RANDOM
+@evindex RANDOM
+Many shells provide @code{RANDOM}, a variable that returns a different
+integer each time it is used. Most of the time, its value does not
+change when it is not used, but on IRIX 6.5 the value changes all
+the time. This can be observed by using @command{set}. It is common
+practice to use @code{$RANDOM} as part of a file name, but code
+shouldn't rely on @code{$RANDOM} expanding to a nonempty string.
+
+@item status
+@evindex status
+This variable is an alias to @samp{$?} for @code{zsh} (at least 3.1.6),
+hence read-only. Do not use it.
+@end table
+
+@node Shell Functions
+@section Shell Functions
+@cindex Shell Functions
+
+Nowadays, it is difficult to find a shell that does not support
+shell functions at all. However, some differences should be expected.
+
+When declaring a shell function, you must include whitespace between the
+@samp{)} after the function name and the start of the compound
+expression, to avoid upsetting @command{ksh}. While it is possible to
+use any compound command, most scripts use @samp{@{@dots{}@}}.
+
+@example
+$ @kbd{/bin/sh -c 'a()@{ echo hi;@}; a'}
+hi
+$ @kbd{ksh -c 'a()@{ echo hi;@}; a'}
+ksh: syntax error at line 1: `@}' unexpected
+$ @kbd{ksh -c 'a() @{ echo hi;@}; a'}
+hi
+@end example
+
+Inside a shell function, you should not rely on the error status of a
+subshell if the last command of that subshell was @code{exit} or
+@code{trap}, as this triggers bugs in zsh 4.x; while Autoconf tries to
+find a shell that does not exhibit the bug, zsh might be the only shell
+present on the user's machine.
+
+Likewise, the state of @samp{$?} is not reliable when entering a shell
+function. This has the effect that using a function as the first
+command in a @command{trap} handler can cause problems.
+
+@example
+$ @kbd{bash -c 'foo() @{ echo $?; @}; trap foo 0; (exit 2); exit 2'; echo $?}
+2
+2
+$ @kbd{ash -c 'foo() @{ echo $?; @}; trap foo 0; (exit 2); exit 2'; echo $?}
+0
+2
+@end example
+
+DJGPP bash 2.04 has a bug in that @command{return} from a
+shell function which also used a command substitution causes a
+segmentation fault. To work around the issue, you can use
+@command{return} from a subshell, or @samp{AS_SET_STATUS} as last command
+in the execution flow of the function (@pxref{Common Shell Constructs}).
+
+Not all shells treat shell functions as simple commands impacted by
+@samp{set -e}, for example with Solaris 10 @command{/bin/sh}:
+
+@example
+$ @kbd{bash -c 'f() @{ return 1; @}; set -e; f; echo oops'}
+$ @kbd{/bin/sh -c 'f() @{ return 1; @}; set -e; f; echo oops'}
+oops
+@end example
+
+Shell variables and functions may share the same namespace, for example
+with Solaris 10 @command{/bin/sh}:
+
+@example
+$ @kbd{f () @{ :; @}; f=; f}
+f: not found
+@end example
+
+@noindent
+For this reason, Autoconf (actually M4sh, @pxref{Programming in M4sh})
+uses the prefix @samp{as_fn_} for its functions.
+
+Handling of positional parameters and shell options varies among shells.
+For example, Korn shells reset and restore trace output (@samp{set -x})
+and other options upon function entry and exit. Inside a function,
+IRIX sh sets @samp{$0} to the function name.
+
+It is not portable to pass temporary environment variables to shell
+functions. Solaris @command{/bin/sh} does not see the variable.
+Meanwhile, not all shells follow the Posix rule that the assignment must
+affect the current environment in the same manner as special built-ins.
+
+@example
+$ @kbd{/bin/sh -c 'func() @{ echo $a;@}; a=1 func; echo $a'}
+@result{}
+@result{}
+$ @kbd{ash -c 'func() @{ echo $a;@}; a=1 func; echo $a'}
+@result{}1
+@result{}
+$ @kbd{bash -c 'set -o posix; func() @{ echo $a;@}; a=1 func; echo $a'}
+@result{}1
+@result{}1
+@end example
+
+Some ancient Bourne shell variants with function support did not reset
+@samp{$@var{i}, @var{i} >= 0}, upon function exit, so effectively the
+arguments of the script were lost after the first function invocation.
+It is probably not worth worrying about these shells any more.
+
+With AIX sh, a @command{trap} on 0 installed in a shell function
+triggers at function exit rather than at script exit. @xref{trap, ,
+Limitations of Shell Builtins}.
+
+@node Limitations of Builtins
+@section Limitations of Shell Builtins
+@cindex Shell builtins
+@cindex Limitations of shell builtins
+
+No, no, we are serious: some shells do have limitations! :)
+
+You should always keep in mind that any builtin or command may support
+options, and therefore differ in behavior with arguments
+starting with a dash. For instance, even the innocent @samp{echo "$word"}
+can give unexpected results when @code{word} starts with a dash. It is
+often possible to avoid this problem using @samp{echo "x$word"}, taking
+the @samp{x} into account later in the pipe. Many of these limitations
+can be worked around using M4sh (@pxref{Programming in M4sh}).
+
+@c This table includes things like `@command{test} (files)', so we can't
+@c use @table @command.
+@table @asis
+@item @command{.}
+@c --------------
+@prindex @command{.}
+Use @command{.} only with regular files (use @samp{test -f}). Bash
+2.03, for instance, chokes on @samp{. /dev/null}. Remember that
+@command{.} uses @env{PATH} if its argument contains no slashes. Also,
+some shells, including bash 3.2, implicitly append the current directory
+to this @env{PATH} search, even though Posix forbids it. So if you want
+to use @command{.} on a file @file{foo} in the current directory, you
+must use @samp{. ./foo}.
+
+Not all shells gracefully handle syntax errors within a sourced file.
+On one extreme, some non-interactive shells abort the entire script. On
+the other, @command{zsh} 4.3.10 has a bug where it fails to react to the
+syntax error.
+
+@example
+$ @kbd{echo 'fi' > syntax}
+$ @kbd{bash -c '. ./syntax; echo $?'}
+./syntax: line 1: syntax error near unexpected token `fi'
+./syntax: line 1: `fi'
+1
+$ @kbd{ash -c '. ./syntax; echo $?'}
+./syntax: 1: Syntax error: "fi" unexpected
+$ @kbd{zsh -c '. ./syntax; echo $?'}
+./syntax:1: parse error near `fi'
+0
+@end example
+
+@item @command{!}
+@c --------------
+@prindex @command{!}
+The Unix version 7 shell did not support
+negating the exit status of commands with @command{!}, and this feature
+is still absent from some shells (e.g., Solaris @command{/bin/sh}).
+Other shells, such as FreeBSD @command{/bin/sh} or @command{ash}, have
+bugs when using @command{!}:
+
+@example
+$ @kbd{sh -c '! : | :'; echo $?}
+1
+$ @kbd{ash -c '! : | :'; echo $?}
+0
+$ @kbd{sh -c '! @{ :; @}'; echo $?}
+1
+$ @kbd{ash -c '! @{ :; @}'; echo $?}
+@{: not found
+Syntax error: "@}" unexpected
+2
+@end example
+
+Shell code like this:
+
+@example
+if ! cmp file1 file2 >/dev/null 2>&1; then
+ echo files differ or trouble
+fi
+@end example
+
+is therefore not portable in practice. Typically it is easy to rewrite
+such code, e.g.:
+
+@example
+cmp file1 file2 >/dev/null 2>&1 ||
+ echo files differ or trouble
+@end example
+
+More generally, one can always rewrite @samp{! @var{command}} as:
+
+@example
+if @var{command}; then (exit 1); else :; fi
+@end example
+
+
+@item @command{@{...@}}
+@c --------------------
+@prindex @command{@{...@}}
+Bash 3.2 (and earlier versions) sometimes does not properly set
+@samp{$?} when failing to write redirected output of a compound command.
+This problem is most commonly observed with @samp{@{@dots{}@}}; it does
+not occur with @samp{(@dots{})}. For example:
+
+@example
+$ @kbd{bash -c '@{ echo foo; @} >/bad; echo $?'}
+bash: line 1: /bad: Permission denied
+0
+$ @kbd{bash -c 'while :; do echo; done >/bad; echo $?'}
+bash: line 1: /bad: Permission denied
+0
+@end example
+
+To work around the bug, prepend @samp{:;}:
+
+@example
+$ @kbd{bash -c ':;@{ echo foo; @} >/bad; echo $?'}
+bash: line 1: /bad: Permission denied
+1
+@end example
+
+Posix requires a syntax error if a brace list has no contents. However,
+not all shells obey this rule; and on shells where empty lists are
+permitted, the effect on @samp{$?} is inconsistent. To avoid problems,
+ensure that a brace list is never empty.
+
+@example
+$ @kbd{bash -c 'false; @{ @}; echo $?' || echo $?}
+bash: line 1: syntax error near unexpected token `@}'
+bash: line 1: `false; @{ @}; echo $?'
+2
+$ @kbd{zsh -c 'false; @{ @}; echo $?' || echo $?}
+1
+$ @kbd{pdksh -c 'false; @{ @}; echo $?' || echo $?}
+0
+@end example
+
+
+@item @command{break}
+@c ------------------
+@prindex @command{break}
+The use of @samp{break 2} etc.@: is safe.
+
+
+@anchor{case}
+@item @command{case}
+@c -----------------
+@prindex @command{case}
+You don't need to quote the argument; no splitting is performed.
+
+You don't need the final @samp{;;}, but you should use it.
+
+Posix requires support for @code{case} patterns with opening
+parentheses like this:
+
+@example
+case $file_name in
+ (*.c) echo "C source code";;
+esac
+@end example
+
+@noindent
+but the @code{(} in this example is not portable to many Bourne
+shell implementations, which is a pity for those of us using tools that
+rely on balanced parentheses. For instance, with Solaris
+@command{/bin/sh}:
+
+@example
+$ @kbd{case foo in (foo) echo foo;; esac}
+@error{}syntax error: `(' unexpected
+@end example
+
+@noindent
+The leading @samp{(} can be omitted safely. Unfortunately, there are
+contexts where unbalanced parentheses cause other problems, such as when
+using a syntax-highlighting editor that searches for the balancing
+counterpart, or more importantly, when using a case statement as an
+underquoted argument to an Autoconf macro. @xref{Balancing
+Parentheses}, for tradeoffs involved in various styles of dealing with
+unbalanced @samp{)}.
+
+Zsh handles pattern fragments derived from parameter expansions or
+command substitutions as though quoted:
+
+@example
+$ pat=\?; case aa in ?$pat) echo match;; esac
+$ pat=\?; case a? in ?$pat) echo match;; esac
+match
+@end example
+
+@noindent
+Because of a bug in its @code{fnmatch}, Bash fails to properly
+handle backslashes in character classes:
+
+@example
+bash-2.02$ @kbd{case /tmp in [/\\]*) echo OK;; esac}
+bash-2.02$
+@end example
+
+@noindent
+This is extremely unfortunate, since you are likely to use this code to
+handle Posix or MS-DOS absolute file names. To work around this
+bug, always put the backslash first:
+
+@example
+bash-2.02$ @kbd{case '\TMP' in [\\/]*) echo OK;; esac}
+OK
+bash-2.02$ @kbd{case /tmp in [\\/]*) echo OK;; esac}
+OK
+@end example
+
+Many Bourne shells cannot handle closing brackets in character classes
+correctly.
+
+Some shells also have problems with backslash escaping in case you do not want
+to match the backslash: both a backslash and the escaped character match this
+pattern. To work around this, specify the character class in a variable, so
+that quote removal does not apply afterwards, and the special characters don't
+have to be backslash-escaped:
+
+@example
+$ @kbd{case '\' in [\<]) echo OK;; esac}
+OK
+$ @kbd{scanset='[<]'; case '\' in $scanset) echo OK;; esac}
+$
+@end example
+
+Even with this, Solaris @command{ksh} matches a backslash if the set
+contains any
+of the characters @samp{|}, @samp{&}, @samp{(}, or @samp{)}.
+
+Conversely, Tru64 @command{ksh} (circa 2003) erroneously always matches
+a closing parenthesis if not specified in a character class:
+
+@example
+$ @kbd{case foo in *\)*) echo fail ;; esac}
+fail
+$ @kbd{case foo in *')'*) echo fail ;; esac}
+fail
+@end example
+
+Some shells, such as Ash 0.3.8, are confused by an empty
+@code{case}/@code{esac}:
+
+@example
+ash-0.3.8 $ @kbd{case foo in esac;}
+@error{}Syntax error: ";" unexpected (expecting ")")
+@end example
+
+Posix requires @command{case} to give an exit status of 0 if no cases
+match. However, @command{/bin/sh} in Solaris 10 does not obey this
+rule. Meanwhile, it is unclear whether a case that matches, but
+contains no statements, must also change the exit status to 0. The M4sh
+macro @code{AS_CASE} works around these inconsistencies.
+
+@example
+$ @kbd{bash -c 'case `false` in ?) ;; esac; echo $?'}
+0
+$ @kbd{/bin/sh -c 'case `false` in ?) ;; esac; echo $?'}
+255
+@end example
+
+
+@item @command{cd}
+@c ---------------
+@prindex @command{cd}
+Posix 1003.1-2001 requires that @command{cd} must support
+the @option{-L} (``logical'') and @option{-P} (``physical'') options,
+with @option{-L} being the default. However, traditional shells do
+not support these options, and their @command{cd} command has the
+@option{-P} behavior.
+
+Portable scripts should assume neither option is supported, and should
+assume neither behavior is the default. This can be a bit tricky,
+since the Posix default behavior means that, for example,
+@samp{ls ..} and @samp{cd ..} may refer to different directories if
+the current logical directory is a symbolic link. It is safe to use
+@code{cd @var{dir}} if @var{dir} contains no @file{..} components.
+Also, Autoconf-generated scripts check for this problem when computing
+variables like @code{ac_top_srcdir} (@pxref{Configuration Actions}),
+so it is safe to @command{cd} to these variables.
+
+Posix states that behavior is undefined if @command{cd} is given an
+explicit empty argument. Some shells do nothing, some change to the
+first entry in @env{CDPATH}, some change to @env{HOME}, and some exit
+the shell rather than returning an error. Unfortunately, this means
+that if @samp{$var} is empty, then @samp{cd "$var"} is less predictable
+than @samp{cd $var} (at least the latter is well-behaved in all shells
+at changing to @env{HOME}, although this is probably not what you wanted
+in a script). You should check that a directory name was supplied
+before trying to change locations.
+
+@xref{Special Shell Variables}, for portability problems involving
+@command{cd} and the @env{CDPATH} environment variable.
+Also please see the discussion of the @command{pwd} command.
+
+
+@anchor{echo}
+@item @command{echo}
+@c -----------------
+@prindex @command{echo}
+The simple @command{echo} is probably the most surprising source of
+portability troubles. It is not possible to use @samp{echo} portably
+unless both options and escape sequences are omitted. Don't expect any
+option.
+
+Do not use backslashes in the arguments, as there is no consensus on
+their handling. For @samp{echo '\n' | wc -l}, the @command{sh} of
+Solaris outputs 2, but Bash and Zsh (in @command{sh} emulation mode) output 1.
+The problem is truly @command{echo}: all the shells
+understand @samp{'\n'} as the string composed of a backslash and an
+@samp{n}. Within a command substitution, @samp{echo 'string\c'} will
+mess up the internal state of ksh88 on AIX 6.1 so that it will print
+the first character @samp{s} only, followed by a newline, and then
+entirely drop the output of the next echo in a command substitution.
+
+Because of these problems, do not pass a string containing arbitrary
+characters to @command{echo}. For example, @samp{echo "$foo"} is safe
+only if you know that @var{foo}'s value cannot contain backslashes and
+cannot start with @samp{-}.
+
+If this may not be true, @command{printf} is in general safer and
+easier to use than @command{echo} and @command{echo -n}. Thus, scripts
+where portability is not a major concern should use @command{printf
+'%s\n'} whenever @command{echo} could fail, and similarly use
+@command{printf %s} instead of @command{echo -n}. For portable shell
+scripts, instead, it is suggested to use a here-document like this:
+
+@example
+cat <<EOF
+$foo
+EOF
+@end example
+
+Alternatively, M4sh provides @code{AS_ECHO} and @code{AS_ECHO_N} macros
+which choose between various portable implementations: @samp{echo}
+or @samp{print} where they work, @command{printf} if it is available,
+or else other creative tricks in order to work around the above problems.
+
+
+@item @command{eval}
+@c -----------------
+@prindex @command{eval}
+The @command{eval} command is useful in limited circumstances, e.g.,
+using commands like @samp{eval table_$key=\$value} and @samp{eval
+value=table_$key} to simulate a hash table when the key is known to be
+alphanumeric.
+
+You should also be wary of common bugs in @command{eval} implementations.
+In some shell implementations (e.g., older @command{ash}, OpenBSD 3.8
+@command{sh}, @command{pdksh} v5.2.14 99/07/13.2, and @command{zsh}
+4.2.5), the arguments of @samp{eval} are evaluated in a context where
+@samp{$?} is 0, so they exhibit behavior like this:
+
+@example
+$ @kbd{false; eval 'echo $?'}
+0
+@end example
+
+The correct behavior here is to output a nonzero value,
+but portable scripts should not rely on this.
+
+You should not rely on @code{LINENO} within @command{eval}.
+@xref{Special Shell Variables}.
+
+Note that, even though these bugs are easily avoided,
+@command{eval} is tricky to use on arbitrary arguments.
+It is obviously unwise to use @samp{eval $cmd} if the string value of
+@samp{cmd} was derived from an untrustworthy source. But even if the
+string value is valid, @samp{eval $cmd} might not work as intended,
+since it causes field splitting and file name expansion to occur twice,
+once for the @command{eval} and once for the command itself. It is
+therefore safer to use @samp{eval "$cmd"}. For example, if @var{cmd}
+has the value @samp{cat test?.c}, @samp{eval $cmd} might expand to the
+equivalent of @samp{cat test;.c} if there happens to be a file named
+@file{test;.c} in the current directory; and this in turn
+mistakenly attempts to invoke @command{cat} on the file @file{test} and
+then execute the command @command{.c}. To avoid this problem, use
+@samp{eval "$cmd"} rather than @samp{eval $cmd}.
+
+However, suppose that you want to output the text of the evaluated
+command just before executing it. Assuming the previous example,
+@samp{echo "Executing: $cmd"} outputs @samp{Executing: cat test?.c}, but
+this output doesn't show the user that @samp{test;.c} is the actual name
+of the copied file. Conversely, @samp{eval "echo Executing: $cmd"}
+works on this example, but it fails with @samp{cmd='cat foo >bar'},
+since it mistakenly replaces the contents of @file{bar} by the
+string @samp{cat foo}. No simple, general, and portable solution to
+this problem is known.
+
+@item @command{exec}
+@c -----------------
+@prindex @command{exec}
+Posix describes several categories of shell built-ins. Special
+built-ins (such as @command{exit}) must impact the environment of the
+current shell, and need not be available through @command{exec}. All
+other built-ins are regular, and must not propagate variable assignments
+to the environment of the current shell. However, the group of regular
+built-ins is further distinguished by commands that do not require a
+@env{PATH} search (such as @command{cd}), in contrast to built-ins that
+are offered as a more efficient version of something that must still be
+found in a @env{PATH} search (such as @command{echo}). Posix is not
+clear on whether @command{exec} must work with the list of 17 utilities
+that are invoked without a @env{PATH} search, and many platforms lack an
+executable for some of those built-ins:
+
+@example
+$ @kbd{sh -c 'exec cd /tmp'}
+sh: line 0: exec: cd: not found
+@end example
+
+All other built-ins that provide utilities specified by Posix must have
+a counterpart executable that exists on @env{PATH}, although Posix
+allows @command{exec} to use the built-in instead of the executable.
+For example, contrast @command{bash} 3.2 and @command{pdksh} 5.2.14:
+
+@example
+$ @kbd{bash -c 'pwd --version' | head -n1}
+bash: line 0: pwd: --: invalid option
+pwd: usage: pwd [-LP]
+$ @kbd{bash -c 'exec pwd --version' | head -n1}
+pwd (GNU coreutils) 6.10
+$ @kbd{pdksh -c 'exec pwd --version' | head -n1}
+pdksh: pwd: --: unknown option
+@end example
+
+When it is desired to avoid a regular shell built-in, the workaround is
+to use some other forwarding command, such as @command{env} or
+@command{nice}, that will ensure a path search:
+
+@example
+$ @kbd{pdksh -c 'exec true --version' | head -n1}
+$ @kbd{pdksh -c 'nice true --version' | head -n1}
+true (GNU coreutils) 6.10
+$ @kbd{pdksh -c 'env true --version' | head -n1}
+true (GNU coreutils) 6.10
+@end example
+
+@item @command{exit}
+@c -----------------
+@prindex @command{exit}
+The default value of @command{exit} is supposed to be @code{$?};
+unfortunately, some shells, such as the DJGPP port of Bash 2.04, just
+perform @samp{exit 0}.
+
+@example
+bash-2.04$ @kbd{foo=`exit 1` || echo fail}
+fail
+bash-2.04$ @kbd{foo=`(exit 1)` || echo fail}
+fail
+bash-2.04$ @kbd{foo=`(exit 1); exit` || echo fail}
+bash-2.04$
+@end example
+
+Using @samp{exit $?} restores the expected behavior.
+
+Some shell scripts, such as those generated by @command{autoconf}, use a
+trap to clean up before exiting. If the last shell command exited with
+nonzero status, the trap also exits with nonzero status so that the
+invoker can tell that an error occurred.
+
+Unfortunately, in some shells, such as Solaris @command{/bin/sh}, an exit
+trap ignores the @code{exit} command's argument. In these shells, a trap
+cannot determine whether it was invoked by plain @code{exit} or by
+@code{exit 1}. Instead of calling @code{exit} directly, use the
+@code{AC_MSG_ERROR} macro that has a workaround for this problem.
+
+
+@anchor{export}
+@item @command{export}
+@c -------------------
+@prindex @command{export}
+The builtin @command{export} dubs a shell variable @dfn{environment
+variable}. Each update of exported variables corresponds to an update
+of the environment variables. Conversely, each environment variable
+received by the shell when it is launched should be imported as a shell
+variable marked as exported.
+
+Alas, many shells, such as Solaris @command{/bin/sh},
+IRIX 6.3, IRIX 5.2,
+AIX 4.1.5, and Digital Unix 4.0, forget to
+@command{export} the environment variables they receive. As a result,
+two variables coexist: the environment variable and the shell
+variable. The following code demonstrates this failure:
+
+@example
+#!/bin/sh
+echo $FOO
+FOO=bar
+echo $FOO
+exec /bin/sh $0
+@end example
+
+@noindent
+when run with @samp{FOO=foo} in the environment, these shells print
+alternately @samp{foo} and @samp{bar}, although they should print only
+@samp{foo} and then a sequence of @samp{bar}s.
+
+Therefore you should @command{export} again each environment variable
+that you update; the export can occur before or after the assignment.
+
+Posix is not clear on whether the @command{export} of an undefined
+variable causes the variable to be defined with the value of an empty
+string, or merely marks any future definition of a variable by that name
+for export. Various shells behave differently in this regard:
+
+@example
+$ @kbd{sh -c 'export foo; env | grep foo'}
+$ @kbd{ash -c 'export foo; env | grep foo'}
+foo=
+@end example
+
+Posix requires @command{export} to honor assignments made as arguments,
+but older shells do not support this, including @command{/bin/sh} in
+Solaris 10. Portable scripts should separate assignments and exports
+into different statements.
+
+@example
+$ @kbd{bash -c 'export foo=bar; echo $foo'}
+bar
+$ @kbd{/bin/sh -c 'export foo=bar; echo $foo'}
+/bin/sh: foo=bar: is not an identifier
+$ @kbd{/bin/sh -c 'export foo; foo=bar; echo $foo'}
+bar
+@end example
+
+@item @command{false}
+@c ------------------
+@prindex @command{false}
+Don't expect @command{false} to exit with status 1: in native
+Solaris @file{/bin/false} exits with status 255.
+
+
+@item @command{for}
+@c ----------------
+@prindex @command{for}
+To loop over positional arguments, use:
+
+@example
+for arg
+do
+ echo "$arg"
+done
+@end example
+
+@noindent
+You may @emph{not} leave the @code{do} on the same line as @code{for},
+since some shells improperly grok:
+
+@example
+for arg; do
+ echo "$arg"
+done
+@end example
+
+If you want to explicitly refer to the positional arguments, given the
+@samp{$@@} bug (@pxref{Shell Substitutions}), use:
+
+@example
+for arg in $@{1+"$@@"@}; do
+ echo "$arg"
+done
+@end example
+
+@noindent
+But keep in mind that Zsh, even in Bourne shell emulation mode, performs
+word splitting on @samp{$@{1+"$@@"@}}; see @ref{Shell Substitutions},
+item @samp{$@@}, for more.
+
+In Solaris @command{/bin/sh}, when the list of arguments of a
+@command{for} loop starts with @emph{unquoted} tokens looking like
+variable assignments, the loop is not executed on those tokens:
+
+@example
+$ @kbd{/bin/sh -c 'for v in a=b c=d x e=f; do echo $v; done'}
+x
+e=f
+@end example
+
+@noindent
+Thankfully, quoting the assignment-like tokens, or starting the list
+with other tokens (including unquoted variable expansion that results in
+an assignment-like result), avoids the problem, so it is easy to work
+around:
+
+@example
+$ @kbd{/bin/sh -c 'for v in "a=b"; do echo $v; done'}
+a=b
+$ @kbd{/bin/sh -c 'x=a=b; for v in $x c=d; do echo $v; done'}
+a=b
+c=d
+@end example
+
+@anchor{if}
+@item @command{if}
+@c ---------------
+@prindex @command{if}
+Using @samp{!} is not portable. Instead of:
+
+@example
+if ! cmp -s file file.new; then
+ mv file.new file
+fi
+@end example
+
+@noindent
+use:
+
+@example
+if cmp -s file file.new; then :; else
+ mv file.new file
+fi
+@end example
+
+@noindent
+Or, especially if the @dfn{else} branch is short, you can use @code{||}.
+In M4sh, the @code{AS_IF} macro provides an easy way to write these kinds
+of conditionals:
+
+@example
+AS_IF([cmp -s file file.new], [], [mv file.new file])
+@end example
+
+This is especially useful in other M4 macros, where the @dfn{then} and
+@dfn{else} branches might be macro arguments.
+
+Some very old shells did not reset the exit status from an @command{if}
+with no @command{else}:
+
+@example
+$ @kbd{if (exit 42); then true; fi; echo $?}
+42
+@end example
+
+@noindent
+whereas a proper shell should have printed @samp{0}. But this is no
+longer a portability problem; any shell that supports functions gets it
+correct. However, it explains why some makefiles have lengthy
+constructs:
+
+@example
+if test -f "$file"; then
+ install "$file" "$dest"
+else
+ :
+fi
+@end example
+
+
+@item @command{printf}
+@c ------------------
+@prindex @command{printf}
+A format string starting with a @samp{-} can cause problems.
+Bash interprets it as an option and
+gives an error. And @samp{--} to mark the end of options is not good
+in the NetBSD Almquist shell (e.g., 0.4.6) which takes that
+literally as the format string. Putting the @samp{-} in a @samp{%c}
+or @samp{%s} is probably easiest:
+
+@example
+printf %s -foo
+@end example
+
+Bash 2.03 mishandles an escape sequence that happens to evaluate to @samp{%}:
+
+@example
+$ @kbd{printf '\045'}
+bash: printf: `%': missing format character
+@end example
+
+Large outputs may cause trouble. On Solaris 2.5.1 through 10, for
+example, @file{/usr/bin/printf} is buggy, so when using
+@command{/bin/sh} the command @samp{printf %010000x 123} normally dumps
+core.
+
+Since @command{printf} is not always a shell builtin, there is a
+potential speed penalty for using @code{printf '%s\n'} as a replacement
+for an @command{echo} that does not interpret @samp{\} or leading
+@samp{-}. With Solaris @command{ksh}, it is possible to use @code{print
+-r --} for this role instead.
+
+@xref{echo, , Limitations of Shell Builtins} for a discussion of
+portable alternatives to both @command{printf} and @command{echo}.
+
+
+@item @command{pwd}
+@c ----------------
+@prindex @command{pwd}
+With modern shells, plain @command{pwd} outputs a ``logical''
+directory name, some of whose components may be symbolic links. These
+directory names are in contrast to ``physical'' directory names, whose
+components are all directories.
+
+Posix 1003.1-2001 requires that @command{pwd} must support
+the @option{-L} (``logical'') and @option{-P} (``physical'') options,
+with @option{-L} being the default. However, traditional shells do
+not support these options, and their @command{pwd} command has the
+@option{-P} behavior.
+
+Portable scripts should assume neither option is supported, and should
+assume neither behavior is the default. Also, on many hosts
+@samp{/bin/pwd} is equivalent to @samp{pwd -P}, but Posix
+does not require this behavior and portable scripts should not rely on
+it.
+
+Typically it's best to use plain @command{pwd}. On modern hosts this
+outputs logical directory names, which have the following advantages:
+
+@itemize @bullet
+@item
+Logical names are what the user specified.
+@item
+Physical names may not be portable from one installation
+host to another due to network file system gymnastics.
+@item
+On modern hosts @samp{pwd -P} may fail due to lack of permissions to
+some parent directory, but plain @command{pwd} cannot fail for this
+reason.
+@end itemize
+
+Also please see the discussion of the @command{cd} command.
+
+
+@item @command{read}
+@c -----------------
+@prindex @command{read}
+No options are portable, not even support @option{-r} (Solaris
+@command{/bin/sh} for example). Tru64/OSF 5.1 @command{sh} treats
+@command{read} as a special built-in, so it may exit if input is
+redirected from a non-existent or unreadable file.
+
+
+@anchor{set}
+@item @command{set}
+@c ----------------
+@prindex @command{set}
+With the FreeBSD 6.0 shell, the @command{set} command (without
+any options) does not sort its output.
+
+The @command{set} builtin faces the usual problem with arguments
+starting with a
+dash. Modern shells such as Bash or Zsh understand @option{--} to specify
+the end of the options (any argument after @option{--} is a parameter,
+even @samp{-x} for instance), but many traditional shells (e.g., Solaris
+10 @command{/bin/sh}) simply stop option
+processing as soon as a non-option argument is found. Therefore, use
+@samp{dummy} or simply @samp{x} to end the option processing, and use
+@command{shift} to pop it out:
+
+@example
+set x $my_list; shift
+@end example
+
+Avoid @samp{set -}, e.g., @samp{set - $my_list}. Posix no
+longer requires support for this command, and in traditional shells
+@samp{set - $my_list} resets the @option{-v} and @option{-x} options, which
+makes scripts harder to debug.
+
+Some nonstandard shells do not recognize more than one option
+(e.g., @samp{set -e -x} assigns @samp{-x} to the command line). It is
+better to combine them:
+
+@example
+set -ex
+@end example
+
+@cindex @command{set -e}
+The option @option{-e} has historically been underspecified, with enough
+ambiguities to cause numerous differences across various shell
+implementations; see for example
+@uref{http://www.in-ulm.de/@/~mascheck/@/various/@/set-e/, this overview},
+or @uref{http://www.austingroupbugs.net/@/view.php?id=52, this link},
+documenting a change to Posix 2008 to match @command{ksh88} behavior.
+Note that mixing @code{set -e} and shell functions is asking for surprises:
+
+@example
+set -e
+doit()
+@{
+ rm file
+ echo one
+@}
+doit || echo two
+@end example
+
+@noindent
+According to the recommendation, @samp{one} should always be output
+regardless of whether the @command{rm} failed, because it occurs within
+the body of the shell function @samp{doit} invoked on the left side of
+@samp{||}, where the effects of @samp{set -e} are not enforced.
+Likewise, @samp{two} should never be printed, since the failure of
+@command{rm} does not abort the function, such that the status of
+@samp{doit} is 0.
+
+The BSD shell has had several problems with the @option{-e}
+option. Older versions of the BSD
+shell (circa 1990) mishandled @samp{&&}, @samp{||}, @samp{if}, and
+@samp{case} when @option{-e} was in effect, causing the shell to exit
+unexpectedly in some cases. This was particularly a problem with
+makefiles, and led to circumlocutions like @samp{sh -c 'test -f file ||
+touch file'}, where the seemingly-unnecessary @samp{sh -c '@dots{}'}
+wrapper works around the bug (@pxref{Failure in Make Rules}).
+
+Even relatively-recent versions of the BSD shell (e.g., OpenBSD 3.4)
+wrongly exit with @option{-e} if the last command within a compound
+statement fails and is guarded by an @samp{&&} only. For example:
+
+@example
+#! /bin/sh
+set -e
+foo=''
+test -n "$foo" && exit 1
+echo one
+if :; then
+ test -n "$foo" && exit 1
+ echo two
+ test -n "$foo" && exit 1
+fi
+echo three
+@end example
+
+@noindent
+does not print @samp{three}. One workaround is to change the last
+instance of @samp{test -n "$foo" && exit 1} to be @samp{if test -n
+"$foo"; then exit 1; fi} instead. Another possibility is to warn BSD
+users not to use @samp{sh -e}.
+
+When @samp{set -e} is in effect, a failed command substitution in
+Solaris @command{/bin/sh} cannot be ignored, even with @samp{||}.
+
+@example
+$ @kbd{/bin/sh -c 'set -e; foo=`false` || echo foo; echo bar'}
+$ @kbd{bash -c 'set -e; foo=`false` || echo foo; echo bar'}
+foo
+bar
+@end example
+
+@noindent
+Moreover, a command substitution, successful or not, causes this shell to
+exit from a failing outer command even in presence of an @samp{&&} list:
+
+@example
+$ @kbd{bash -c 'set -e; false `true` && echo notreached; echo ok'}
+ok
+$ @kbd{sh -c 'set -e; false `true` && echo notreached; echo ok'}
+$
+@end example
+
+Portable scripts should not use @samp{set -e} if @command{trap} is used
+to install an exit handler. This is because Tru64/OSF 5.1 @command{sh}
+sometimes enters the trap handler with the exit status of the command
+prior to the one that triggered the errexit handler:
+
+@example
+$ @kbd{sh -ec 'trap '\''echo $?'\'' 0; false'}
+0
+$ @kbd{sh -c 'set -e; trap '\''echo $?'\'' 0; false'}
+1
+@end example
+
+@noindent
+Thus, when writing a script in M4sh, rather than trying to rely on
+@samp{set -e}, it is better to append @samp{|| AS_EXIT} to any
+statement where it is desirable to abort on failure.
+
+@cindex @command{set -b}
+@cindex @command{set -m}
+Job control is not provided by all shells, so the use of @samp{set -m}
+or @samp{set -b} must be done with care. When using @command{zsh} in
+native mode, asynchronous notification (@samp{set -b}) is enabled by
+default, and using @samp{emulate sh} to switch to Posix mode does not
+clear this setting (although asynchronous notification has no impact
+unless job monitoring is also enabled). Also, @command{zsh} 4.3.10 and
+earlier have a bug where job control can be manipulated in interactive
+shells, but not in subshells or scripts. Furthermore, some shells, like
+@command{pdksh}, fail to treat subshells as interactive, even though the
+parent shell was.
+
+@example
+$ @kbd{echo $ZSH_VERSION}
+4.3.10
+$ @kbd{set -m; echo $?}
+0
+$ @kbd{zsh -c 'set -m; echo $?'}
+set: can't change option: -m
+$ @kbd{(set -m); echo $?}
+set: can't change option: -m
+1
+$ @kbd{pdksh -ci 'echo $-; (echo $-)'}
+cim
+c
+@end example
+
+@cindex @command{set -n}
+Use of @command{set -n} (typically via @command{sh -n script}) to
+validate a script is not foolproof. Modern @command{ksh93} tries to be
+helpful by informing you about better syntax, but switching the script
+to use the suggested syntax in order to silence the warnings would
+render the script no longer portable to older shells:
+
+@example
+$ @kbd{ksh -nc '``'}
+ksh: warning: line 1: `...` obsolete, use $(...)
+0
+@end example
+
+Furthermore, on ancient hosts, such as SunOS 4, @command{sh -n} could go
+into an infinite loop; even with that bug fixed, Solaris 8
+@command{/bin/sh} takes extremely long to parse large scripts. Autoconf
+itself uses @command{sh -n} within its testsuite to check that correct
+scripts were generated, but only after first probing for other shell
+features (such as @code{test -n "$@{BASH_VERSION+set@}"}) that indicate
+a reasonably fast and working implementation.
+
+@item @command{shift}
+@c ------------------
+@prindex @command{shift}
+Not only is @command{shift}ing a bad idea when there is nothing left to
+shift, but in addition it is not portable: the shell of MIPS
+RISC/OS 4.52 refuses to do it.
+
+Don't use @samp{shift 2} etc.; while it in the SVR1 shell (1983),
+it is also absent in many pre-Posix shells.
+
+
+@item @command{source}
+@c -------------------
+@prindex @command{source}
+This command is not portable, as Posix does not require it; use
+@command{.} instead.
+
+
+@item @command{test}
+@c -----------------
+@prindex @command{test}
+The @code{test} program is the way to perform many file and string
+tests. It is often invoked by the alternate name @samp{[}, but using
+that name in Autoconf code is asking for trouble since it is an M4 quote
+character.
+
+The @option{-a}, @option{-o}, @samp{(}, and @samp{)} operands are not
+present in all implementations, and have been marked obsolete by Posix
+2008. This is because there are inherent ambiguities in using them.
+For example, @samp{test "$1" -a "$2"} looks like a binary operator to
+check whether two strings are both non-empty, but if @samp{$1} is the
+literal @samp{!}, then some implementations of @command{test} treat it
+as a negation of the unary operator @option{-a}.
+
+Thus, portable uses of @command{test} should never have more than four
+arguments, and scripts should use shell constructs like @samp{&&} and
+@samp{||} instead. If you combine @samp{&&} and @samp{||} in the same
+statement, keep in mind that they have equal precedence, so it is often
+better to parenthesize even when this is redundant. For example:
+
+@smallexample
+# Not portable:
+test "X$a" = "X$b" -a \
+ '(' "X$c" != "X$d" -o "X$e" = "X$f" ')'
+
+# Portable:
+test "X$a" = "X$b" &&
+ @{ test "X$c" != "X$d" || test "X$e" = "X$f"; @}
+@end smallexample
+
+@command{test} does not process options like most other commands do; for
+example, it does not recognize the @option{--} argument as marking the
+end of options.
+
+It is safe to use @samp{!} as a @command{test} operator. For example,
+@samp{if test ! -d foo; @dots{}} is portable even though @samp{if ! test
+-d foo; @dots{}} is not.
+
+
+@item @command{test} (files)
+@c -------------------------
+To enable @command{configure} scripts to support cross-compilation, they
+shouldn't do anything that tests features of the build system instead of
+the host system. But occasionally you may find it necessary to check
+whether some arbitrary file exists. To do so, use @samp{test -f},
+@samp{test -r}, or @samp{test -x}. Do not use @samp{test -e}, because
+Solaris 10 @command{/bin/sh}
+lacks it. To test for symbolic links on systems that have them, use
+@samp{test -h} rather than @samp{test -L}; either form conforms to
+Posix 1003.1-2001, but older shells like Solaris 8
+@code{/bin/sh} support only @option{-h}.
+
+For historical reasons, Posix reluctantly allows implementations of
+@samp{test -x} that will succeed for the root user, even if no execute
+permissions are present. Furthermore, shells do not all agree on
+whether Access Control Lists should affect @samp{test -r}, @samp{test
+-w}, and @samp{test -x}; some shells base test results strictly on the
+current user id compared to file owner and mode, as if by
+@code{stat(2)}; while other shells base test results on whether the
+current user has the given right, even if that right is only granted by
+an ACL, as if by @code{faccessat(2)}. Furthermore, there is a classic
+time of check to time of use race between any use of @command{test}
+followed by operating on the just-checked file. Therefore, it is a good
+idea to write scripts that actually attempt an operation, and are
+prepared for the resulting failure if permission is denied, rather than
+trying to avoid an operation based solely on whether @command{test}
+guessed that it might not be permitted.
+
+@item @command{test} (strings)
+@c ---------------------------
+Posix says that @samp{test "@var{string}"} succeeds if @var{string} is
+not null, but this usage is not portable to traditional platforms like
+Solaris 10 @command{/bin/sh}, which mishandle strings like @samp{!} and
+@samp{-n}.
+
+Posix also says that @samp{test ! "@var{string}"},
+@samp{test -n "@var{string}"} and
+@samp{test -z "@var{string}"} work with any string, but many
+shells (such as Solaris, AIX 3.2, UNICOS 10.0.0.6,
+Digital Unix 4, etc.)@: get confused if
+@var{string} looks like an operator:
+
+@example
+$ @kbd{test -n =}
+test: argument expected
+$ @kbd{test ! -n}
+test: argument expected
+$ @kbd{test -z ")"; echo $?}
+0
+@end example
+
+Similarly, Posix says that both @samp{test "@var{string1}" = "@var{string2"}}
+and @samp{test "@var{string1}" != "@var{string2"}} work for any pairs of
+strings, but in practice this is not true for troublesome strings that
+look like operators or parentheses, or that begin with @samp{-}.
+
+It is best to protect such strings with a leading @samp{X}, e.g.,
+@samp{test "X@var{string}" != X} rather than @samp{test -n
+"@var{string}"} or @samp{test ! "@var{string}"}.
+
+It is common to find variations of the following idiom:
+
+@example
+test -n "`echo $ac_feature | sed 's/[-a-zA-Z0-9_]//g'`" &&
+ @var{action}
+@end example
+
+@noindent
+to take an action when a token matches a given pattern. Such constructs
+should be avoided by using:
+
+@example
+case $ac_feature in
+ *[!-a-zA-Z0-9_]*) @var{action};;
+esac
+@end example
+
+If the pattern is a complicated regular expression that cannot be
+expressed as a shell pattern, use something like this instead:
+
+@example
+expr "X$ac_feature" : 'X.*[^-a-zA-Z0-9_]' >/dev/null &&
+ @var{action}
+@end example
+
+@samp{expr "X@var{foo}" : "X@var{bar}"} is more robust than @samp{echo
+"X@var{foo}" | grep "^X@var{bar}"}, because it avoids problems when
+@samp{@var{foo}} contains backslashes.
+
+
+@anchor{trap}
+@item @command{trap}
+@c -----------------
+@prindex @command{trap}
+It is safe to trap at least the signals 1, 2, 13, and 15. You can also
+trap 0, i.e., have the @command{trap} run when the script ends (either via an
+explicit @command{exit}, or the end of the script). The trap for 0 should be
+installed outside of a shell function, or AIX 5.3 @command{/bin/sh}
+will invoke the trap at the end of this function.
+
+Posix says that @samp{trap - 1 2 13 15} resets the traps for the
+specified signals to their default values, but many common shells (e.g.,
+Solaris @command{/bin/sh}) misinterpret this and attempt to execute a
+``command'' named @command{-} when the specified conditions arise.
+Posix 2008 also added a requirement to support @samp{trap 1 2 13 15} to
+reset traps, as this is supported by a larger set of shells, but there
+are still shells like @command{dash} that mistakenly try to execute
+@command{1} instead of resetting the traps. Therefore, there is no
+portable workaround, except for @samp{trap - 0}, for which
+@samp{trap '' 0} is a portable substitute.
+
+Although Posix is not absolutely clear on this point, it is widely
+admitted that when entering the trap @samp{$?} should be set to the exit
+status of the last command run before the trap. The ambiguity can be
+summarized as: ``when the trap is launched by an @command{exit}, what is
+the @emph{last} command run: that before @command{exit}, or
+@command{exit} itself?''
+
+Bash considers @command{exit} to be the last command, while Zsh and
+Solaris @command{/bin/sh} consider that when the trap is run it is
+@emph{still} in the @command{exit}, hence it is the previous exit status
+that the trap receives:
+
+@example
+$ @kbd{cat trap.sh}
+trap 'echo $?' 0
+(exit 42); exit 0
+$ @kbd{zsh trap.sh}
+42
+$ @kbd{bash trap.sh}
+0
+@end example
+
+The portable solution is then simple: when you want to @samp{exit 42},
+run @samp{(exit 42); exit 42}, the first @command{exit} being used to
+set the exit status to 42 for Zsh, and the second to trigger the trap
+and pass 42 as exit status for Bash. In M4sh, this is covered by using
+@code{AS_EXIT}.
+
+The shell in FreeBSD 4.0 has the following bug: @samp{$?} is
+reset to 0 by empty lines if the code is inside @command{trap}.
+
+@example
+$ @kbd{trap 'false}
+
+echo $?' 0
+$ @kbd{exit}
+0
+@end example
+
+@noindent
+Fortunately, this bug only affects @command{trap}.
+
+Several shells fail to execute an exit trap that is defined inside a
+subshell, when the last command of that subshell is not a builtin. A
+workaround is to use @samp{exit $?} as the shell builtin.
+
+@example
+$ @kbd{bash -c '(trap "echo hi" 0; /bin/true)'}
+hi
+$ @kbd{/bin/sh -c '(trap "echo hi" 0; /bin/true)'}
+$ @kbd{/bin/sh -c '(trap "echo hi" 0; /bin/true; exit $?)'}
+hi
+@end example
+
+@noindent
+Likewise, older implementations of @command{bash} failed to preserve
+@samp{$?} across an exit trap consisting of a single cleanup command.
+
+@example
+$ @kbd{bash -c 'trap "/bin/true" 0; exit 2'; echo $?}
+2
+$ @kbd{bash-2.05b -c 'trap "/bin/true" 0; exit 2'; echo $?}
+0
+$ @kbd{bash-2.05b -c 'trap ":; /bin/true" 0; exit 2'; echo $?}
+2
+@end example
+
+@item @command{true}
+@c -----------------
+@prindex @command{true}
+@c Info cannot handle `:' in index entries.
+@c @prindex @command{:}
+Don't worry: as far as we know @command{true} is portable.
+Nevertheless, it's not always a builtin (e.g., Bash 1.x), and the
+portable shell community tends to prefer using @command{:}. This has a
+funny side effect: when asked whether @command{false} is more portable
+than @command{true} Alexandre Oliva answered:
+
+@quotation
+In a sense, yes, because if it doesn't exist, the shell will produce an
+exit status of failure, which is correct for @command{false}, but not
+for @command{true}.
+@end quotation
+
+Remember that even though @samp{:} ignores its arguments, it still takes
+time to compute those arguments. It is a good idea to use double quotes
+around any arguments to @samp{:} to avoid time spent in field splitting
+and file name expansion.
+
+
+@anchor{unset}
+@item @command{unset}
+@c ------------------
+@prindex @command{unset}
+In some nonconforming shells (e.g., Solaris 10 @command{/bin/ksh} and
+@command{/usr/xpg4/bin/sh}, NetBSD 5.99.43 sh, or Bash 2.05a),
+@code{unset FOO} fails when @code{FOO} is not set. This can interfere
+with @code{set -e} operation. You can use
+
+@smallexample
+FOO=; unset FOO
+@end smallexample
+
+@noindent
+if you are not sure that @code{FOO} is set.
+
+A few ancient shells lack @command{unset} entirely. For some variables
+such as @code{PS1}, you can use a neutralizing value instead:
+
+@smallexample
+PS1='$ '
+@end smallexample
+
+Usually, shells that do not support @command{unset} need less effort to
+make the environment sane, so for example is not a problem if you cannot
+unset @command{CDPATH} on those shells. However, Bash 2.01 mishandles
+@code{unset MAIL} and @code{unset MAILPATH} in some cases and dumps core.
+So, you should do something like
+
+@smallexample
+( (unset MAIL) || exit 1) >/dev/null 2>&1 && unset MAIL || :
+@end smallexample
+
+@noindent
+@xref{Special Shell Variables}, for some neutralizing values. Also, see
+@ref{export, , Limitations of Builtins}, for
+the case of environment variables.
+
+@item @command{wait}
+@c -----------------
+@prindex @command{wait}
+The exit status of @command{wait} is not always reliable.
+@end table
+
+@node Limitations of Usual Tools
+@section Limitations of Usual Tools
+@cindex Limitations of usual tools
+
+The small set of tools you can expect to find on any machine can still
+include some limitations you should be aware of.
+
+@comment Between this list and the list of builtins above, we should
+@comment mention all the tools in GNU Coding Standards ``Utilities in
+@comment Makefiles''.
+
+@c This table includes things like `@command{expr} (|)', so we can't
+@c use @table @command.
+@table @asis
+@anchor{awk}
+@item @command{awk}
+@c ----------------
+@prindex @command{awk}
+Don't leave white space before the opening parenthesis in a user function call.
+Posix does not allow this and GNU Awk rejects it:
+
+@example
+$ @kbd{gawk 'function die () @{ print "Aaaaarg!" @}
+ BEGIN @{ die () @}'}
+gawk: cmd. line:2: BEGIN @{ die () @}
+gawk: cmd. line:2: ^ parse error
+$ @kbd{gawk 'function die () @{ print "Aaaaarg!" @}
+ BEGIN @{ die() @}'}
+Aaaaarg!
+@end example
+
+Posix says that if a program contains only @samp{BEGIN} actions, and
+contains no instances of @code{getline}, then the program merely
+executes the actions without reading input. However, traditional Awk
+implementations (such as Solaris 10 @command{awk}) read and discard
+input in this case. Portable scripts can redirect input from
+@file{/dev/null} to work around the problem. For example:
+
+@example
+awk 'BEGIN @{print "hello world"@}' </dev/null
+@end example
+
+Posix says that in an @samp{END} action, @samp{$NF} (and presumably,
+@samp{$1}) retain their value from the last record read, if no
+intervening @samp{getline} occurred. However, some implementations
+(such as Solaris 10 @samp{/usr/bin/awk}, @samp{nawk}, or Darwin
+@samp{awk}) reset these variables. A workaround is to use an
+intermediate variable prior to the @samp{END} block. For example:
+
+@example
+$ @kbd{cat end.awk}
+@{ tmp = $1 @}
+END @{ print "a", $1, $NF, "b", tmp @}
+$ @kbd{echo 1 | awk -f end.awk}
+a b 1
+$ @kbd{echo 1 | gawk -f end.awk}
+a 1 1 b 1
+@end example
+
+If you want your program to be deterministic, don't depend on @code{for}
+on arrays:
+
+@example
+$ @kbd{cat for.awk}
+END @{
+ arr["foo"] = 1
+ arr["bar"] = 1
+ for (i in arr)
+ print i
+@}
+$ @kbd{gawk -f for.awk </dev/null}
+foo
+bar
+$ @kbd{nawk -f for.awk </dev/null}
+bar
+foo
+@end example
+
+Some Awk implementations, such as HP-UX 11.0's native one,
+mishandle anchors:
+
+@example
+$ @kbd{echo xfoo | $AWK '/foo|^bar/ @{ print @}'}
+$ @kbd{echo bar | $AWK '/foo|^bar/ @{ print @}'}
+bar
+$ @kbd{echo xfoo | $AWK '/^bar|foo/ @{ print @}'}
+xfoo
+$ @kbd{echo bar | $AWK '/^bar|foo/ @{ print @}'}
+bar
+@end example
+
+@noindent
+Either do not depend on such patterns (i.e., use @samp{/^(.*foo|bar)/},
+or use a simple test to reject such implementations.
+
+On @samp{ia64-hp-hpux11.23}, Awk mishandles @code{printf} conversions
+after @code{%u}:
+
+@example
+$ @kbd{awk 'BEGIN @{ printf "%u %d\n", 0, -1 @}'}
+0 0
+@end example
+
+AIX version 5.2 has an arbitrary limit of 399 on the
+length of regular expressions and literal strings in an Awk program.
+
+Traditional Awk implementations derived from Unix version 7, such as
+Solaris @command{/bin/awk}, have many limitations and do not
+conform to Posix. Nowadays @code{AC_PROG_AWK} (@pxref{Particular
+Programs}) finds you an Awk that doesn't have these problems, but if
+for some reason you prefer not to use @code{AC_PROG_AWK} you may need to
+address them. For more detailed descriptions, see @ref{Language
+History, , @command{awk} language history, gawk, GNU Awk User's Guide}.
+
+Traditional Awk does not support multidimensional arrays or user-defined
+functions.
+
+Traditional Awk does not support the @option{-v} option. You can use
+assignments after the program instead, e.g., @code{$AWK '@{print v
+$1@}' v=x}; however, don't forget that such assignments are not
+evaluated until they are encountered (e.g., after any @code{BEGIN}
+action).
+
+Traditional Awk does not support the keywords @code{delete} or @code{do}.
+
+Traditional Awk does not support the expressions
+@code{@var{a}?@var{b}:@var{c}}, @code{!@var{a}}, @code{@var{a}^@var{b}},
+or @code{@var{a}^=@var{b}}.
+
+Traditional Awk does not support the predefined @code{CONVFMT} or
+@code{ENVIRON} variables.
+
+Traditional Awk supports only the predefined functions @code{exp}, @code{index},
+@code{int}, @code{length}, @code{log}, @code{split}, @code{sprintf},
+@code{sqrt}, and @code{substr}.
+
+Traditional Awk @code{getline} is not at all compatible with Posix;
+avoid it.
+
+Traditional Awk has @code{for (i in a) @dots{}} but no other uses of the
+@code{in} keyword. For example, it lacks @code{if (i in a) @dots{}}.
+
+In code portable to both traditional and modern Awk, @code{FS} must be a
+string containing just one ordinary character, and similarly for the
+field-separator argument to @code{split}.
+
+Traditional Awk has a limit of 99 fields in a record. Since some Awk
+implementations, like Tru64's, split the input even if you don't refer
+to any field in the script, to circumvent this problem, set @samp{FS}
+to an unusual character and use @code{split}.
+
+Traditional Awk has a limit of at most 99 bytes in a number formatted by
+@code{OFMT}; for example, @code{OFMT="%.300e"; print 0.1;} typically
+dumps core.
+
+The original version of Awk had a limit of at most 99 bytes per
+@code{split} field, 99 bytes per @code{substr} substring, and 99 bytes
+per run of non-special characters in a @code{printf} format, but these
+bugs have been fixed on all practical hosts that we know of.
+
+HP-UX 11.00 and IRIX 6.5 Awk require that input files have a line length
+of at most 3070 bytes.
+
+@item @command{basename}
+@c ---------------------
+@prindex @command{basename}
+Not all hosts have a working @command{basename}.
+You can use @command{expr} instead.
+
+@c AS_BASENAME is to be replaced by a better API.
+@ignore
+Not all hosts have a working @command{basename}, and you should instead
+use @code{AS_BASENAME} (@pxref{Programming in M4sh}), followed by
+@command{expr} if you need to strip a suffix. For example:
+
+@example
+a=`basename "$aname"` # This is not portable.
+a=`AS_BASENAME(["$aname"])` # This is more portable.
+
+# This is not portable.
+c=`basename "$cname" .c`
+
+# This is more portable.
+c=`AS_BASENAME(["$cname"])`
+case $c in
+?*.c) c=`expr "X$c" : 'X\(.*\)\.c'`;;
+esac
+@end example
+@end ignore
+
+
+@item @command{cat}
+@c ----------------
+@prindex @command{cat}
+Don't rely on any option.
+
+
+@item @command{cc}
+@c ---------------
+@prindex @command{cc}
+The command @samp{cc -c foo.c} traditionally produces an object file
+named @file{foo.o}. Most compilers allow @option{-c} to be combined
+with @option{-o} to specify a different object file name, but
+Posix does not require this combination and a few compilers
+lack support for it. @xref{C Compiler}, for how GNU Make
+tests for this feature with @code{AC_PROG_CC_C_O}.
+
+When a compilation such as @samp{cc -o foo foo.c} fails, some compilers
+(such as CDS on Reliant Unix) leave a @file{foo.o}.
+
+HP-UX @command{cc} doesn't accept @file{.S} files to preprocess and
+assemble. @samp{cc -c foo.S} appears to succeed, but in fact does
+nothing.
+
+The default executable, produced by @samp{cc foo.c}, can be
+
+@itemize
+@item @file{a.out} --- usual Posix convention.
+@item @file{b.out} --- i960 compilers (including @command{gcc}).
+@item @file{a.exe} --- DJGPP port of @command{gcc}.
+@item @file{a_out.exe} --- GNV @command{cc} wrapper for DEC C on OpenVMS.
+@item @file{foo.exe} --- various MS-DOS compilers.
+@end itemize
+
+The C compiler's traditional name is @command{cc}, but other names like
+@command{gcc} are common. Posix 1003.1-2001 specifies the
+name @command{c99}, but older Posix editions specified
+@command{c89} and anyway these standard names are rarely used in
+practice. Typically the C compiler is invoked from makefiles that use
+@samp{$(CC)}, so the value of the @samp{CC} make variable selects the
+compiler name.
+
+@item @command{chgrp}
+@itemx @command{chown}
+@c -------------------
+@prindex @command{chgrp}
+@prindex @command{chown}
+It is not portable to change a file's group to a group that the owner
+does not belong to.
+
+@item @command{chmod}
+@c ------------------
+@prindex @command{chmod}
+Avoid usages like @samp{chmod -w file}; use @samp{chmod a-w file}
+instead, for two reasons. First, plain @option{-w} does not necessarily
+make the file unwritable, since it does not affect mode bits that
+correspond to bits in the file mode creation mask. Second,
+Posix says that the @option{-w} might be interpreted as an
+implementation-specific option, not as a mode; Posix suggests
+using @samp{chmod -- -w file} to avoid this confusion, but unfortunately
+@samp{--} does not work on some older hosts.
+
+
+@item @command{cmp}
+@c ----------------
+@prindex @command{cmp}
+@command{cmp} performs a raw data comparison of two files, while
+@command{diff} compares two text files. Therefore, if you might compare
+DOS files, even if only checking whether two files are different, use
+@command{diff} to avoid spurious differences due to differences of
+newline encoding.
+
+
+@item @command{cp}
+@c ---------------
+@prindex @command{cp}
+Avoid the @option{-r} option, since Posix 1003.1-2004 marks it as
+obsolescent and its behavior on special files is implementation-defined.
+Use @option{-R} instead. On GNU hosts the two options
+are equivalent, but on Solaris hosts (for example) @code{cp -r}
+reads from pipes instead of replicating them. AIX 5.3 @code{cp -R} may
+corrupt its own memory with some directory hierarchies and error out or
+dump core:
+
+@example
+@kbd{mkdir -p 12345678/12345678/12345678/12345678}
+@kbd{touch 12345678/12345678/x}
+@kbd{cp -R 12345678 t}
+cp: 0653-440 12345678/12345678/: name too long.
+@end example
+
+Some @command{cp} implementations (e.g., BSD/OS 4.2) do not allow
+trailing slashes at the end of nonexistent destination directories. To
+avoid this problem, omit the trailing slashes. For example, use
+@samp{cp -R source /tmp/newdir} rather than @samp{cp -R source
+/tmp/newdir/} if @file{/tmp/newdir} does not exist.
+
+@c This is thanks to Ian.
+The ancient SunOS 4 @command{cp} does not support @option{-f}, although
+its @command{mv} does.
+
+@cindex timestamp resolution
+Traditionally, file timestamps had 1-second resolution, and @samp{cp
+-p} copied the timestamps exactly. However, many modern file systems
+have timestamps with 1-nanosecond resolution. Unfortunately, some older
+@samp{cp -p} implementations truncate timestamps when copying files,
+which can cause the destination file to appear to be older than the
+source. The exact amount of truncation depends on the resolution of
+the system calls that @command{cp} uses. Traditionally this was
+@code{utime}, which has 1-second resolution. Less-ancient @command{cp}
+implementations such as GNU Core Utilities 5.0.91 (2003) use
+@code{utimes}, which has 1-microsecond resolution. Modern
+implementations such as GNU Core Utilities 6.12 (2008) can set timestamps to
+the full nanosecond resolution, using the modern system calls
+@code{futimens} and @code{utimensat} when they are available. As of
+2011, though, many platforms do not yet fully support these new system
+calls.
+
+Bob Proulx notes that @samp{cp -p} always @emph{tries} to copy
+ownerships. But whether it actually does copy ownerships or not is a
+system dependent policy decision implemented by the kernel. If the
+kernel allows it then it happens. If the kernel does not allow it then
+it does not happen. It is not something @command{cp} itself has control
+over.
+
+In Unix System V any user can chown files to any other user, and System
+V also has a non-sticky @file{/tmp}. That probably derives from the
+heritage of System V in a business environment without hostile users.
+BSD changed this
+to be a more secure model where only root can @command{chown} files and
+a sticky @file{/tmp} is used. That undoubtedly derives from the heritage
+of BSD in a campus environment.
+
+GNU/Linux and Solaris by default follow BSD, but
+can be configured to allow a System V style @command{chown}. On the
+other hand, HP-UX follows System V, but can
+be configured to use the modern security model and disallow
+@command{chown}. Since it is an administrator-configurable parameter
+you can't use the name of the kernel as an indicator of the behavior.
+
+
+
+@item @command{date}
+@c -----------------
+@prindex @command{date}
+Some versions of @command{date} do not recognize special @samp{%} directives,
+and unfortunately, instead of complaining, they just pass them through,
+and exit with success:
+
+@example
+$ @kbd{uname -a}
+OSF1 medusa.sis.pasteur.fr V5.1 732 alpha
+$ @kbd{date "+%s"}
+%s
+@end example
+
+
+@item @command{diff}
+@c -----------------
+@prindex @command{diff}
+Option @option{-u} is nonportable.
+
+Some implementations, such as Tru64's, fail when comparing to
+@file{/dev/null}. Use an empty file instead.
+
+
+@item @command{dirname}
+@c --------------------
+@prindex @command{dirname}
+Not all hosts have a working @command{dirname}, and you should instead
+use @code{AS_DIRNAME} (@pxref{Programming in M4sh}). For example:
+
+@example
+dir=`dirname "$file"` # This is not portable.
+dir=`AS_DIRNAME(["$file"])` # This is more portable.
+@end example
+
+
+@item @command{egrep}
+@c ------------------
+@prindex @command{egrep}
+Posix 1003.1-2001 no longer requires @command{egrep},
+but many hosts do not yet support the Posix
+replacement @code{grep -E}. Also, some traditional implementations do
+not work on long input lines. To work around these problems, invoke
+@code{AC_PROG_EGREP} and then use @code{$EGREP}.
+
+Portable extended regular expressions should use @samp{\} only to escape
+characters in the string @samp{$()*+.?[\^@{|}. For example, @samp{\@}}
+is not portable, even though it typically matches @samp{@}}.
+
+The empty alternative is not portable. Use @samp{?} instead. For
+instance with Digital Unix v5.0:
+
+@example
+> printf "foo\n|foo\n" | $EGREP '^(|foo|bar)$'
+|foo
+> printf "bar\nbar|\n" | $EGREP '^(foo|bar|)$'
+bar|
+> printf "foo\nfoo|\n|bar\nbar\n" | $EGREP '^(foo||bar)$'
+foo
+|bar
+@end example
+
+@command{$EGREP} also suffers the limitations of @command{grep}
+(@pxref{grep, , Limitations of Usual Tools}).
+
+@item @command{expr}
+@c -----------------
+@prindex @command{expr}
+Not all implementations obey the Posix rule that @samp{--} separates
+options from arguments; likewise, not all implementations provide the
+extension to Posix that the first argument can be treated as part of a
+valid expression rather than an invalid option if it begins with
+@samp{-}. When performing arithmetic, use @samp{expr 0 + $var} if
+@samp{$var} might be a negative number, to keep @command{expr} from
+interpreting it as an option.
+
+No @command{expr} keyword starts with @samp{X}, so use @samp{expr
+X"@var{word}" : 'X@var{regex}'} to keep @command{expr} from
+misinterpreting @var{word}.
+
+Don't use @code{length}, @code{substr}, @code{match} and @code{index}.
+
+@item @command{expr} (@samp{|})
+@prindex @command{expr} (@samp{|})
+You can use @samp{|}. Although Posix does require that @samp{expr
+''} return the empty string, it does not specify the result when you
+@samp{|} together the empty string (or zero) with the empty string. For
+example:
+
+@example
+expr '' \| ''
+@end example
+
+Posix 1003.2-1992 returns the empty string
+for this case, but traditional Unix returns @samp{0} (Solaris is
+one such example). In Posix 1003.1-2001, the specification was
+changed to match traditional Unix's behavior (which is
+bizarre, but it's too late to fix this). Please note that the same
+problem does arise when the empty string results from a computation,
+as in:
+
+@example
+expr bar : foo \| foo : bar
+@end example
+
+@noindent
+Avoid this portability problem by avoiding the empty string.
+
+
+@item @command{expr} (@samp{:})
+@c ----------------------------
+@prindex @command{expr}
+Portable @command{expr} regular expressions should use @samp{\} to
+escape only characters in the string @samp{$()*.0123456789[\^n@{@}}.
+For example, alternation, @samp{\|}, is common but Posix does not
+require its support, so it should be avoided in portable scripts.
+Similarly, @samp{\+} and @samp{\?} should be avoided.
+
+Portable @command{expr} regular expressions should not begin with
+@samp{^}. Patterns are automatically anchored so leading @samp{^} is
+not needed anyway.
+
+On the other hand, the behavior of the @samp{$} anchor is not portable
+on multi-line strings. Posix is ambiguous whether the anchor applies to
+each line, as was done in older versions of the GNU Core Utilities, or
+whether it applies only to the end of the overall string, as in
+Coreutils 6.0 and most other implementations.
+
+@example
+$ @kbd{baz='foo}
+> @kbd{bar'}
+$ @kbd{expr "X$baz" : 'X\(foo\)$'}
+
+$ @kbd{expr-5.97 "X$baz" : 'X\(foo\)$'}
+foo
+@end example
+
+The Posix standard is ambiguous as to whether
+@samp{expr 'a' : '\(b\)'} outputs @samp{0} or the empty string.
+In practice, it outputs the empty string on most platforms, but portable
+scripts should not assume this. For instance, the QNX 4.25 native
+@command{expr} returns @samp{0}.
+
+One might think that a way to get a uniform behavior would be to use
+the empty string as a default value:
+
+@example
+expr a : '\(b\)' \| ''
+@end example
+
+@noindent
+Unfortunately this behaves exactly as the original expression; see the
+@command{expr} (@samp{|}) entry for more information.
+
+Some ancient @command{expr} implementations (e.g., SunOS 4 @command{expr} and
+Solaris 8 @command{/usr/ucb/expr}) have a silly length limit that causes
+@command{expr} to fail if the matched substring is longer than 120
+bytes. In this case, you might want to fall back on @samp{echo|sed} if
+@command{expr} fails. Nowadays this is of practical importance only for
+the rare installer who mistakenly puts @file{/usr/ucb} before
+@file{/usr/bin} in @env{PATH}.
+
+On Mac OS X 10.4, @command{expr} mishandles the pattern @samp{[^-]} in
+some cases. For example, the command
+@example
+expr Xpowerpc-apple-darwin8.1.0 : 'X[^-]*-[^-]*-\(.*\)'
+@end example
+
+@noindent
+outputs @samp{apple-darwin8.1.0} rather than the correct @samp{darwin8.1.0}.
+This particular case can be worked around by substituting @samp{[^--]}
+for @samp{[^-]}.
+
+Don't leave, there is some more!
+
+The QNX 4.25 @command{expr}, in addition of preferring @samp{0} to
+the empty string, has a funny behavior in its exit status: it's always 1
+when parentheses are used!
+
+@example
+$ @kbd{val=`expr 'a' : 'a'`; echo "$?: $val"}
+0: 1
+$ @kbd{val=`expr 'a' : 'b'`; echo "$?: $val"}
+1: 0
+
+$ @kbd{val=`expr 'a' : '\(a\)'`; echo "?: $val"}
+1: a
+$ @kbd{val=`expr 'a' : '\(b\)'`; echo "?: $val"}
+1: 0
+@end example
+
+@noindent
+In practice this can be a big problem if you are ready to catch failures
+of @command{expr} programs with some other method (such as using
+@command{sed}), since you may get twice the result. For instance
+
+@example
+$ @kbd{expr 'a' : '\(a\)' || echo 'a' | sed 's/^\(a\)$/\1/'}
+@end example
+
+@noindent
+outputs @samp{a} on most hosts, but @samp{aa} on QNX 4.25. A
+simple workaround consists of testing @command{expr} and using a variable
+set to @command{expr} or to @command{false} according to the result.
+
+Tru64 @command{expr} incorrectly treats the result as a number, if it
+can be interpreted that way:
+
+@example
+$ @kbd{expr 00001 : '.*\(...\)'}
+1
+@end example
+
+On HP-UX 11, @command{expr} only supports a single
+sub-expression.
+
+@example
+$ @kbd{expr 'Xfoo' : 'X\(f\(oo\)*\)$'}
+expr: More than one '\(' was used.
+@end example
+
+
+@item @command{fgrep}
+@c ------------------
+@prindex @command{fgrep}
+Posix 1003.1-2001 no longer requires @command{fgrep},
+but many hosts do not yet support the Posix
+replacement @code{grep -F}. Also, some traditional implementations do
+not work on long input lines. To work around these problems, invoke
+@code{AC_PROG_FGREP} and then use @code{$FGREP}.
+
+Tru64/OSF 5.1 @command{fgrep} does not match an empty pattern.
+
+
+@item @command{find}
+@c -----------------
+@prindex @command{find}
+The option @option{-maxdepth} seems to be GNU specific.
+Tru64 v5.1, NetBSD 1.5 and Solaris @command{find}
+commands do not understand it.
+
+The replacement of @samp{@{@}} is guaranteed only if the argument is
+exactly @emph{@{@}}, not if it's only a part of an argument. For
+instance on DU, and HP-UX 10.20 and HP-UX 11:
+
+@example
+$ @kbd{touch foo}
+$ @kbd{find . -name foo -exec echo "@{@}-@{@}" \;}
+@{@}-@{@}
+@end example
+
+@noindent
+while GNU @command{find} reports @samp{./foo-./foo}.
+
+
+@anchor{grep}
+@item @command{grep}
+@c -----------------
+@prindex @command{grep}
+Portable scripts can rely on the @command{grep} options @option{-c},
+@option{-l}, @option{-n}, and @option{-v}, but should avoid other
+options. For example, don't use @option{-w}, as Posix does not require
+it and Irix 6.5.16m's @command{grep} does not support it. Also,
+portable scripts should not combine @option{-c} with @option{-l},
+as Posix does not allow this.
+
+Some of the options required by Posix are not portable in practice.
+Don't use @samp{grep -q} to suppress output, because many @command{grep}
+implementations (e.g., Solaris) do not support @option{-q}.
+Don't use @samp{grep -s} to suppress output either, because Posix
+says @option{-s} does not suppress output, only some error messages;
+also, the @option{-s} option of traditional @command{grep} behaved
+like @option{-q} does in most modern implementations. Instead,
+redirect the standard output and standard error (in case the file
+doesn't exist) of @code{grep} to @file{/dev/null}. Check the exit
+status of @code{grep} to determine whether it found a match.
+
+The QNX4 implementation fails to count lines with @code{grep -c '$'},
+but works with @code{grep -c '^'}. Other alternatives for counting
+lines are to use @code{sed -n '$='} or @code{wc -l}.
+
+Some traditional @command{grep} implementations do not work on long
+input lines. On AIX the default @code{grep} silently truncates long
+lines on the input before matching.
+
+Also, many implementations do not support multiple regexps
+with @option{-e}: they either reject @option{-e} entirely (e.g., Solaris)
+or honor only the last pattern (e.g., IRIX 6.5 and NeXT). To
+work around these problems, invoke @code{AC_PROG_GREP} and then use
+@code{$GREP}.
+
+Another possible workaround for the multiple @option{-e} problem is to
+separate the patterns by newlines, for example:
+
+@example
+grep 'foo
+bar' in.txt
+@end example
+
+@noindent
+except that this fails with traditional @command{grep}
+implementations and with OpenBSD 3.8 @command{grep}.
+
+Traditional @command{grep} implementations (e.g., Solaris) do not
+support the @option{-E} or @option{-F} options. To work around these
+problems, invoke @code{AC_PROG_EGREP} and then use @code{$EGREP}, and
+similarly for @code{AC_PROG_FGREP} and @code{$FGREP}. Even if you are
+willing to require support for Posix @command{grep}, your script should
+not use both @option{-E} and @option{-F}, since Posix does not allow
+this combination.
+
+Portable @command{grep} regular expressions should use @samp{\} only to
+escape characters in the string @samp{$()*.0123456789[\^@{@}}. For example,
+alternation, @samp{\|}, is common but Posix does not require its
+support in basic regular expressions, so it should be avoided in
+portable scripts. Solaris and HP-UX @command{grep} do not support it.
+Similarly, the following escape sequences should also be avoided:
+@samp{\<}, @samp{\>}, @samp{\+}, @samp{\?}, @samp{\`}, @samp{\'},
+@samp{\B}, @samp{\b}, @samp{\S}, @samp{\s}, @samp{\W}, and @samp{\w}.
+
+Posix does not specify the behavior of @command{grep} on binary files.
+An example where this matters is using BSD @command{grep} to
+search text that includes embedded ANSI escape sequences for
+colored output to terminals (@samp{\033[m} is the sequence to restore
+normal output); the behavior depends on whether input is seekable:
+
+@example
+$ @kbd{printf 'esc\033[mape\n' > sample}
+$ @kbd{grep . sample}
+Binary file sample matches
+$ @kbd{cat sample | grep .}
+escape
+@end example
+
+
+@item @command{join}
+@c -----------------
+@prindex @command{join}
+Solaris 8 @command{join} has bugs when the second operand is standard
+input, and when standard input is a pipe. For example, the following
+shell script causes Solaris 8 @command{join} to loop forever:
+
+@example
+cat >file <<'EOF'
+1 x
+2 y
+EOF
+cat file | join file -
+@end example
+
+Use @samp{join - file} instead.
+
+On NetBSD, @command{join -a 1 file1 file2} mistakenly behaves like
+@command{join -a 1 -a 2 1 file1 file2}, resulting in a usage warning;
+the workaround is to use @command{join -a1 file1 file2} instead.
+
+@item @command{ln}
+@c ---------------
+@prindex @command{ln}
+@cindex Symbolic links
+Don't rely on @command{ln} having a @option{-f} option. Symbolic links
+are not available on old systems; use @samp{$(LN_S)} as a portable substitute.
+
+For versions of the DJGPP before 2.04,
+@command{ln} emulates symbolic links
+to executables by generating a stub that in turn calls the real
+program. This feature also works with nonexistent files like in the
+Posix spec. So @samp{ln -s file link} generates @file{link.exe},
+which attempts to call @file{file.exe} if run. But this feature only
+works for executables, so @samp{cp -p} is used instead for these
+systems. DJGPP versions 2.04 and later have full support
+for symbolic links.
+
+
+@item @command{ls}
+@c ---------------
+@prindex @command{ls}
+@cindex Listing directories
+The portable options are @option{-acdilrtu}. Current practice is for
+@option{-l} to output both owner and group, even though ancient versions
+of @command{ls} omitted the group.
+
+On ancient hosts, @samp{ls foo} sent the diagnostic @samp{foo not found}
+to standard output if @file{foo} did not exist. Hence a shell command
+like @samp{sources=`ls *.c 2>/dev/null`} did not always work, since it
+was equivalent to @samp{sources='*.c not found'} in the absence of
+@samp{.c} files. This is no longer a practical problem, since current
+@command{ls} implementations send diagnostics to standard error.
+
+The behavior of @command{ls} on a directory that is being concurrently
+modified is not always predictable, because of a data race where cached
+information returned by @code{readdir} does not match the current
+directory state. In fact, MacOS 10.5 has an intermittent bug where
+@code{readdir}, and thus @command{ls}, sometimes lists a file more than
+once if other files were added or removed from the directory immediately
+prior to the @command{ls} call. Since @command{ls} already sorts its
+output, the duplicate entries can be avoided by piping the results
+through @code{uniq}.
+
+@anchor{mkdir}
+@item @command{mkdir}
+@c ------------------
+@prindex @command{mkdir}
+@cindex Making directories
+No @command{mkdir} option is portable to older systems. Instead of
+@samp{mkdir -p @var{file-name}}, you should use
+@code{AS_MKDIR_P(@var{file-name})} (@pxref{Programming in M4sh})
+or @code{AC_PROG_MKDIR_P} (@pxref{Particular Programs}).
+
+Combining the @option{-m} and @option{-p} options, as in @samp{mkdir -m
+go-w -p @var{dir}}, often leads to trouble. FreeBSD
+@command{mkdir} incorrectly attempts to change the permissions of
+@var{dir} even if it already exists. HP-UX 11.23 and
+IRIX 6.5 @command{mkdir} often assign the wrong permissions to
+any newly-created parents of @var{dir}.
+
+Posix does not clearly specify whether @samp{mkdir -p foo}
+should succeed when @file{foo} is a symbolic link to an already-existing
+directory. The GNU Core Utilities 5.1.0 @command{mkdir}
+succeeds, but Solaris @command{mkdir} fails.
+
+Traditional @code{mkdir -p} implementations suffer from race conditions.
+For example, if you invoke @code{mkdir -p a/b} and @code{mkdir -p a/c}
+at the same time, both processes might detect that @file{a} is missing,
+one might create @file{a}, then the other might try to create @file{a}
+and fail with a @code{File exists} diagnostic. The GNU Core
+Utilities (@samp{fileutils} version 4.1), FreeBSD 5.0,
+NetBSD 2.0.2, and OpenBSD 2.4 are known to be
+race-free when two processes invoke @code{mkdir -p} simultaneously, but
+earlier versions are vulnerable. Solaris @command{mkdir} is still
+vulnerable as of Solaris 10, and other traditional Unix systems are
+probably vulnerable too. This possible race is harmful in parallel
+builds when several Make rules call @code{mkdir -p} to
+construct directories. You may use
+@code{install-sh -d} as a safe replacement, provided this script is
+recent enough; the copy shipped with Autoconf 2.60 and Automake 1.10 is
+OK, but copies from older versions are vulnerable.
+
+
+@item @command{mkfifo}
+@itemx @command{mknod}
+@c -------------------
+@prindex @command{mkfifo}
+@prindex @command{mknod}
+The GNU Coding Standards state that @command{mknod} is safe to use on
+platforms where it has been tested to exist; but it is generally portable
+only for creating named FIFOs, since device numbers are
+platform-specific. Autotest uses @command{mkfifo} to implement parallel
+testsuites. Posix states that behavior is unspecified when opening a
+named FIFO for both reading and writing; on at least Cygwin, this
+results in failure on any attempt to read or write to that file
+descriptor.
+
+@item @command{mktemp}
+@c -------------------
+@prindex @command{mktemp}
+@cindex Creating temporary files
+Shell scripts can use temporary files safely with @command{mktemp}, but
+it does not exist on all systems. A portable way to create a safe
+temporary file name is to create a temporary directory with mode 700 and
+use a file inside this directory. Both methods prevent attackers from
+gaining control, though @command{mktemp} is far less likely to fail
+gratuitously under attack.
+
+Here is sample code to create a new temporary directory @samp{$dir} safely:
+
+@example
+# Create a temporary directory $dir in $TMPDIR (default /tmp).
+# Use mktemp if possible; otherwise fall back on mkdir,
+# with $RANDOM to make collisions less likely.
+: "$@{TMPDIR:=/tmp@}"
+@{
+ dir=`
+ (umask 077 && mktemp -d "$TMPDIR/fooXXXXXX") 2>/dev/null
+ ` &&
+ test -d "$dir"
+@} || @{
+ dir=$TMPDIR/foo$$-$RANDOM
+@c $$ restore font-lock
+ (umask 077 && mkdir "$dir")
+@} || exit $?
+@end example
+
+
+@item @command{mv}
+@c ---------------
+@prindex @command{mv}
+@cindex Moving open files
+The only portable options are @option{-f} and @option{-i}.
+
+Moving individual files between file systems is portable (it was in Unix
+version 6),
+but it is not always atomic: when doing @samp{mv new existing}, there's
+a critical section where neither the old nor the new version of
+@file{existing} actually exists.
+
+On some systems moving files from @file{/tmp} can sometimes cause
+undesirable (but perfectly valid) warnings, even if you created these
+files. This is because @file{/tmp} belongs to a group that ordinary
+users are not members of, and files created in @file{/tmp} inherit
+the group of @file{/tmp}. When the file is copied, @command{mv} issues
+a diagnostic without failing:
+
+@smallexample
+$ @kbd{touch /tmp/foo}
+$ @kbd{mv /tmp/foo .}
+@error{}mv: ./foo: set owner/group (was: 100/0): Operation not permitted
+$ @kbd{echo $?}
+0
+$ @kbd{ls foo}
+foo
+@end smallexample
+
+@noindent
+This annoying behavior conforms to Posix, unfortunately.
+
+Moving directories across mount points is not portable, use @command{cp}
+and @command{rm}.
+
+DOS variants cannot rename or remove open files, and do not
+support commands like @samp{mv foo bar >foo}, even though this is
+perfectly portable among Posix hosts.
+
+
+@item @command{od}
+@c ---------------
+@prindex @command{od}
+
+In Mac OS X 10.3, @command{od} does not support the
+standard Posix options @option{-A}, @option{-j}, @option{-N}, or
+@option{-t}, or the XSI option @option{-s}. The only
+supported Posix option is @option{-v}, and the only supported
+XSI options are those in @option{-bcdox}. The BSD
+@command{hexdump} program can be used instead.
+
+This problem no longer exists in Mac OS X 10.4.3.
+
+
+@item @command{rm}
+@c ---------------
+@prindex @command{rm}
+The @option{-f} and @option{-r} options are portable.
+
+It is not portable to invoke @command{rm} without options or operands.
+On the other hand, Posix now requires @command{rm -f} to silently
+succeed when there are no operands (useful for constructs like
+@command{rm -rf $filelist} without first checking if @samp{$filelist}
+was empty). But this was not always portable; at least NetBSD
+@command{rm} built before 2008 would fail with a diagnostic.
+
+A file might not be removed even if its parent directory is writable
+and searchable. Many Posix hosts cannot remove a mount point, a named
+stream, a working directory, or a last link to a file that is being
+executed.
+
+DOS variants cannot rename or remove open files, and do not
+support commands like @samp{rm foo >foo}, even though this is
+perfectly portable among Posix hosts.
+
+@item @command{rmdir}
+@c ------------------
+@prindex @command{rmdir}
+Just as with @command{rm}, some platforms refuse to remove a working
+directory.
+
+@anchor{sed}
+@item @command{sed}
+@c ----------------
+@prindex @command{sed}
+Patterns should not include the separator (unless escaped), even as part
+of a character class. In conformance with Posix, the Cray
+@command{sed} rejects @samp{s/[^/]*$//}: use @samp{s%[^/]*$%%}.
+Even when escaped, patterns should not include separators that are also
+used as @command{sed} metacharacters. For example, GNU sed 4.0.9 rejects
+@samp{s,x\@{1\,\@},,}, while sed 4.1 strips the backslash before the comma
+before evaluating the basic regular expression.
+
+Avoid empty patterns within parentheses (i.e., @samp{\(\)}). Posix does
+not require support for empty patterns, and Unicos 9 @command{sed} rejects
+them.
+
+Unicos 9 @command{sed} loops endlessly on patterns like @samp{.*\n.*}.
+
+Sed scripts should not use branch labels longer than 7 characters and
+should not contain comments; AIX 5.3 @command{sed} rejects indented comments.
+HP-UX sed has a limit of 99 commands (not counting @samp{:} commands) and
+48 labels, which cannot be circumvented by using more than one script
+file. It can execute up to 19 reads with the @samp{r} command per cycle.
+Solaris @command{/usr/ucb/sed} rejects usages that exceed a limit of
+about 6000 bytes for the internal representation of commands.
+
+Avoid redundant @samp{;}, as some @command{sed} implementations, such as
+NetBSD 1.4.2's, incorrectly try to interpret the second
+@samp{;} as a command:
+
+@example
+$ @kbd{echo a | sed 's/x/x/;;s/x/x/'}
+sed: 1: "s/x/x/;;s/x/x/": invalid command code ;
+@end example
+
+Some @command{sed} implementations have a buffer limited to 4000 bytes,
+and this limits the size of input lines, output lines, and internal
+buffers that can be processed portably. Likewise,
+not all @command{sed} implementations can handle embedded @code{NUL} or
+a missing trailing newline.
+
+Remember that ranges within a bracket expression of a regular expression
+are only well-defined in the @samp{C} (or @samp{POSIX}) locale.
+Meanwhile, support for character classes like @samp{[[:upper:]]} is not
+yet universal, so if you cannot guarantee the setting of @env{LC_ALL},
+it is better to spell out a range @samp{[ABCDEFGHIJKLMNOPQRSTUVWXYZ]}
+than to rely on @samp{[A-Z]}.
+
+Additionally, Posix states that regular expressions are only
+well-defined on characters. Unfortunately, there exist platforms such
+as MacOS X 10.5 where not all 8-bit byte values are valid characters,
+even though that platform has a single-byte @samp{C} locale. And Posix
+allows the existence of a multi-byte @samp{C} locale, although that does
+not yet appear to be a common implementation. At any rate, it means
+that not all bytes will be matched by the regular expression @samp{.}:
+
+@example
+$ @kbd{printf '\200\n' | LC_ALL=C sed -n /./p | wc -l}
+0
+$ @kbd{printf '\200\n' | LC_ALL=en_US.ISO8859-1 sed -n /./p | wc -l}
+1
+@end example
+
+Portable @command{sed} regular expressions should use @samp{\} only to escape
+characters in the string @samp{$()*.0123456789[\^n@{@}}. For example,
+alternation, @samp{\|}, is common but Posix does not require its
+support, so it should be avoided in portable scripts. Solaris
+@command{sed} does not support alternation; e.g., @samp{sed '/a\|b/d'}
+deletes only lines that contain the literal string @samp{a|b}.
+Similarly, @samp{\+} and @samp{\?} should be avoided.
+
+Anchors (@samp{^} and @samp{$}) inside groups are not portable.
+
+Nested parentheses in patterns (e.g., @samp{\(\(a*\)b*)\)}) are
+quite portable to current hosts, but was not supported by some ancient
+@command{sed} implementations like SVR3.
+
+Some @command{sed} implementations, e.g., Solaris, restrict the special
+role of the asterisk @samp{*} to one-character regular expressions and
+back-references, and the special role of interval expressions
+@samp{\@{@var{m}\@}}, @samp{\@{@var{m},\@}}, or @samp{\@{@var{m},@var{n}\@}}
+to one-character regular expressions. This may lead to unexpected behavior:
+
+@example
+$ @kbd{echo '1*23*4' | /usr/bin/sed 's/\(.\)*/x/g'}
+x2x4
+$ @kbd{echo '1*23*4' | /usr/xpg4/bin/sed 's/\(.\)*/x/g'}
+x
+@end example
+
+The @option{-e} option is mostly portable.
+However, its argument
+cannot start with @samp{a}, @samp{c}, or @samp{i},
+as this runs afoul of a Tru64 5.1 bug.
+Also, its argument cannot be empty, as this fails on AIX 5.3.
+Some people prefer to use @samp{-e}:
+
+@example
+sed -e '@var{command-1}' \
+ -e '@var{command-2}'
+@end example
+
+@noindent
+as opposed to the equivalent:
+
+@example
+sed '
+ @var{command-1}
+ @var{command-2}
+'
+@end example
+
+@noindent
+The following usage is sometimes equivalent:
+
+@example
+sed '@var{command-1};@var{command-2}'
+@end example
+
+but Posix says that this use of a semicolon has undefined effect if
+@var{command-1}'s verb is @samp{@{}, @samp{a}, @samp{b}, @samp{c},
+@samp{i}, @samp{r}, @samp{t}, @samp{w}, @samp{:}, or @samp{#}, so you
+should use semicolon only with simple scripts that do not use these
+verbs.
+
+Posix up to the 2008 revision requires the argument of the @option{-e}
+option to be a syntactically complete script. GNU @command{sed} allows
+to pass multiple script fragments, each as argument of a separate
+@option{-e} option, that are then combined, with newlines between the
+fragments, and a future Posix revision may allow this as well. This
+approach is not portable with script fragments ending in backslash; for
+example, the @command{sed} programs on Solaris 10, HP-UX 11, and AIX
+don't allow splitting in this case:
+
+@example
+$ @kbd{echo a | sed -n -e 'i\}
+@kbd{0'}
+0
+$ @kbd{echo a | sed -n -e 'i\' -e 0}
+Unrecognized command: 0
+@end example
+
+@noindent
+In practice, however, this technique of joining fragments
+through @option{-e} works for multiple @command{sed} functions within
+@samp{@{} and @samp{@}}, even if that is not specified by Posix:
+
+@example
+@c The quote around the closing brace silences interactive zsh.
+$ @kbd{echo a | sed -n -e '/a/@{' -e s/a/b/ -e p -e '@}'}
+b
+@end example
+
+Commands inside @{ @} brackets are further restricted. Posix 2008 says that
+they cannot be preceded by addresses, @samp{!}, or @samp{;}, and that
+each command must be followed immediately by a newline, without any
+intervening blanks or semicolons. The closing bracket must be alone on
+a line, other than white space preceding or following it. However, a
+future version of Posix may standardize the use of addresses within brackets.
+
+Contrary to yet another urban legend, you may portably use @samp{&} in
+the replacement part of the @code{s} command to mean ``what was
+matched''. All descendants of Unix version 7 @command{sed}
+(at least; we
+don't have first hand experience with older @command{sed} implementations) have
+supported it.
+
+Posix requires that you must not have any white space between
+@samp{!} and the following command. It is OK to have blanks between
+the address and the @samp{!}. For instance, on Solaris:
+
+@example
+$ @kbd{echo "foo" | sed -n '/bar/ ! p'}
+@error{}Unrecognized command: /bar/ ! p
+$ @kbd{echo "foo" | sed -n '/bar/! p'}
+@error{}Unrecognized command: /bar/! p
+$ @kbd{echo "foo" | sed -n '/bar/ !p'}
+foo
+@end example
+
+Posix also says that you should not combine @samp{!} and @samp{;}. If
+you use @samp{!}, it is best to put it on a command that is delimited by
+newlines rather than @samp{;}.
+
+Also note that Posix requires that the @samp{b}, @samp{t}, @samp{r}, and
+@samp{w} commands be followed by exactly one space before their argument.
+On the other hand, no white space is allowed between @samp{:} and the
+subsequent label name.
+
+If a sed script is specified on the command line and ends in an
+@samp{a}, @samp{c}, or @samp{i} command, the last line of inserted text
+should be followed by a newline. Otherwise some @command{sed}
+implementations (e.g., OpenBSD 3.9) do not append a newline to the
+inserted text.
+
+Many @command{sed} implementations (e.g., MacOS X 10.4,
+OpenBSD 3.9, Solaris 10
+@command{/usr/ucb/sed}) strip leading white space from the text of
+@samp{a}, @samp{c}, and @samp{i} commands. Prepend a backslash to
+work around this incompatibility with Posix:
+
+@example
+$ @kbd{echo flushleft | sed 'a\}
+> @kbd{ indented}
+> @kbd{'}
+flushleft
+indented
+$ @kbd{echo foo | sed 'a\}
+> @kbd{\ indented}
+> @kbd{'}
+flushleft
+ indented
+@end example
+
+Posix requires that with an empty regular expression, the last non-empty
+regular expression from either an address specification or substitution
+command is applied. However, busybox 1.6.1 complains when using a
+substitution command with a replacement containing a back-reference to
+an empty regular expression; the workaround is repeating the regular
+expression.
+
+@example
+$ @kbd{echo abc | busybox sed '/a\(b\)c/ s//\1/'}
+sed: No previous regexp.
+$ @kbd{echo abc | busybox sed '/a\(b\)c/ s/a\(b\)c/\1/'}
+b
+@end example
+
+
+@item @command{sed} (@samp{t})
+@c ---------------------------
+@prindex @command{sed} (@samp{t})
+Some old systems have @command{sed} that ``forget'' to reset their
+@samp{t} flag when starting a new cycle. For instance on MIPS
+RISC/OS, and on IRIX 5.3, if you run the following @command{sed}
+script (the line numbers are not actual part of the texts):
+
+@example
+s/keep me/kept/g # a
+t end # b
+s/.*/deleted/g # c
+:end # d
+@end example
+
+@noindent
+on
+
+@example
+delete me # 1
+delete me # 2
+keep me # 3
+delete me # 4
+@end example
+
+@noindent
+you get
+
+@example
+deleted
+delete me
+kept
+deleted
+@end example
+
+@noindent
+instead of
+
+@example
+deleted
+deleted
+kept
+deleted
+@end example
+
+Why? When processing line 1, (c) matches, therefore sets the @samp{t}
+flag, and the output is produced. When processing
+line 2, the @samp{t} flag is still set (this is the bug). Command (a)
+fails to match, but @command{sed} is not supposed to clear the @samp{t}
+flag when a substitution fails. Command (b) sees that the flag is set,
+therefore it clears it, and jumps to (d), hence you get @samp{delete me}
+instead of @samp{deleted}. When processing line (3), @samp{t} is clear,
+(a) matches, so the flag is set, hence (b) clears the flags and jumps.
+Finally, since the flag is clear, line 4 is processed properly.
+
+There are two things one should remember about @samp{t} in @command{sed}.
+Firstly, always remember that @samp{t} jumps if @emph{some} substitution
+succeeded, not only the immediately preceding substitution. Therefore,
+always use a fake @samp{t clear} followed by a @samp{:clear} on the next
+line, to reset the @samp{t} flag where needed.
+
+Secondly, you cannot rely on @command{sed} to clear the flag at each new
+cycle.
+
+One portable implementation of the script above is:
+
+@example
+t clear
+:clear
+s/keep me/kept/g
+t end
+s/.*/deleted/g
+:end
+@end example
+
+@item @command{sleep}
+@c ------------------
+@prindex @command{sleep}
+Using @command{sleep} is generally portable. However, remember that
+adding a @command{sleep} to work around timestamp issues, with a minimum
+granularity of one second, doesn't scale well for parallel builds on
+modern machines with sub-second process completion.
+
+@item @command{sort}
+@c -----------------
+@prindex @command{sort}
+Remember that sort order is influenced by the current locale. Inside
+@file{configure}, the C locale is in effect, but in Makefile snippets,
+you may need to specify @code{LC_ALL=C sort}.
+
+@item @command{tar}
+@c ----------------
+@prindex @command{tar}
+There are multiple file formats for @command{tar}; if you use Automake,
+the macro @code{AM_INIT_AUTOMAKE} has some options controlling which
+level of portability to use.
+
+@anchor{touch}
+@item @command{touch}
+@c ------------------
+@prindex @command{touch}
+@cindex timestamp resolution
+If you specify the desired timestamp (e.g., with the @option{-r}
+option), older @command{touch} implementations use the @code{utime} or
+@code{utimes} system call, which can result in the same kind of
+timestamp truncation problems that @samp{cp -p} has.
+
+On ancient BSD systems, @command{touch} or any command that
+results in an empty file does not update the timestamps, so use a
+command like @command{echo} as a workaround.
+Also,
+GNU @command{touch} 3.16r (and presumably all before that)
+fails to work on SunOS 4.1.3 when the empty file is on an
+NFS-mounted 4.2 volume.
+However, these problems are no longer of practical concern.
+
+@item @command{tr}
+@c ---------------
+@prindex @command{tr}
+@cindex carriage return, deleting
+@cindex newline, deleting
+@cindex deleting carriage return
+Not all versions of @command{tr} handle all backslash character escapes.
+For example, Solaris 10 @command{/usr/ucb/tr} falls over, even though
+Solaris contains more modern @command{tr} in other locations.
+Using octal escapes is more portable for carriage returns, since
+@samp{\015} is the same for both ASCII and EBCDIC, and since use of
+literal carriage returns in scripts causes a number of other problems.
+But for other characters, like newline, using octal escapes ties the
+operation to ASCII, so it is better to use literal characters.
+
+@example
+$ @kbd{@{ echo moon; echo light; @} | /usr/ucb/tr -d '\n' ; echo}
+moo
+light
+$ @kbd{@{ echo moon; echo light; @} | /usr/bin/tr -d '\n' ; echo}
+moonlight
+$ @kbd{@{ echo moon; echo light; @} | /usr/ucb/tr -d '\012' ; echo}
+moonlight
+$ @kbd{nl='}
+@kbd{'; @{ echo moon; echo light; @} | /usr/ucb/tr -d "$nl" ; echo}
+moonlight
+@end example
+
+Not all versions of @command{tr} recognize direct ranges of characters: at
+least Solaris @command{/usr/bin/tr} still fails to do so. But you can
+use @command{/usr/xpg4/bin/tr} instead, or add brackets (which in Posix
+transliterate to themselves).
+
+@example
+$ @kbd{echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr a-z A-Z}
+HAZy FAntAZy
+$ @kbd{echo "Hazy Fantazy" | LC_ALL=C /usr/bin/tr '[a-z]' '[A-Z]'}
+HAZY FANTAZY
+$ @kbd{echo "Hazy Fantazy" | LC_ALL=C /usr/xpg4/bin/tr a-z A-Z}
+HAZY FANTAZY
+@end example
+
+When providing two arguments, be sure the second string is at least as
+long as the first.
+
+@example
+$ @kbd{echo abc | /usr/xpg4/bin/tr bc d}
+adc
+$ @kbd{echo abc | coreutils/tr bc d}
+add
+@end example
+
+Posix requires @command{tr} to operate on binary files. But at least
+Solaris @command{/usr/ucb/tr} and @command{/usr/bin/tr} silently discard
+@code{NUL} in the input prior to doing any translation. When using
+@command{tr} to process a binary file that may contain @code{NUL} bytes,
+it is necessary to use @command{/usr/xpg4/bin/tr} instead, or
+@command{/usr/xpg6/bin/tr} if that is available.
+
+@example
+$ @kbd{printf 'a\0b' | /usr/ucb/tr x x | od -An -tx1}
+ 61 62
+$ @kbd{printf 'a\0b' | /usr/bin/tr x x | od -An -tx1}
+ 61 62
+$ @kbd{printf 'a\0b' | /usr/xpg4/bin/tr x x | od -An -tx1}
+ 61 00 62
+@end example
+
+Solaris @command{/usr/ucb/tr} additionally fails to handle @samp{\0} as the
+octal escape for @code{NUL}.
+
+@example
+$ @kbd{printf 'abc' | /usr/ucb/tr 'bc' '\0d' | od -An -tx1}
+ 61 62 63
+$ @kbd{printf 'abc' | /usr/bin/tr 'bc' '\0d' | od -An -tx1}
+ 61 00 64
+$ @kbd{printf 'abc' | /usr/xpg4/bin/tr 'bc' '\0d' | od -An -tx1}
+ 61 00 64
+@end example
+
+@end table
+
+
+@node Portable Make
+@chapter Portable Make Programming
+@prindex @command{make}
+@cindex Limitations of @command{make}
+
+Writing portable makefiles is an art. Since a makefile's commands are
+executed by the shell, you must consider the shell portability issues
+already mentioned. However, other issues are specific to @command{make}
+itself.
+
+@menu
+* $< in Ordinary Make Rules:: $< in ordinary rules
+* Failure in Make Rules:: Failing portably in rules
+* Special Chars in Names:: Special Characters in Macro Names
+* Backslash-Newline-Empty:: Empty lines after backslash-newline
+* Backslash-Newline Comments:: Spanning comments across line boundaries
+* Long Lines in Makefiles:: Line length limitations
+* Macros and Submakes:: @code{make macro=value} and submakes
+* The Make Macro MAKEFLAGS:: @code{$(MAKEFLAGS)} portability issues
+* The Make Macro SHELL:: @code{$(SHELL)} portability issues
+* Parallel Make:: Parallel @command{make} quirks
+* Comments in Make Rules:: Other problems with Make comments
+* Newlines in Make Rules:: Using literal newlines in rules
+* Comments in Make Macros:: Other problems with Make comments in macros
+* Trailing whitespace in Make Macros:: Macro substitution problems
+* Command-line Macros and whitespace:: Whitespace trimming of values
+* obj/ and Make:: Don't name a subdirectory @file{obj}
+* make -k Status:: Exit status of @samp{make -k}
+* VPATH and Make:: @code{VPATH} woes
+* Single Suffix Rules:: Single suffix rules and separated dependencies
+* Timestamps and Make:: Subsecond timestamp resolution
+@end menu
+
+@node $< in Ordinary Make Rules
+@section @code{$<} in Ordinary Make Rules
+
+Posix says that the @samp{$<} construct in makefiles can be
+used only in inference rules and in the @samp{.DEFAULT} rule; its
+meaning in ordinary rules is unspecified. Solaris @command{make}
+for instance replaces it with the empty string. OpenBSD (3.0 and
+later) @command{make} diagnoses these uses and errors out.
+
+@node Failure in Make Rules
+@section Failure in Make Rules
+
+Posix 2008 requires that @command{make} must invoke each command with
+the equivalent of a @samp{sh -e -c} subshell, which causes the
+subshell to exit immediately if a subsidiary simple-command fails,
+although not all @command{make} implementations have historically
+followed this rule. For
+example, the command @samp{touch T; rm -f U} may attempt to
+remove @file{U} even if the @command{touch} fails, although this is not
+permitted with Posix make. One way to work around failures in simple
+commands is to reword them so that they always succeed, e.g., @samp{touch
+T || :; rm -f U}.
+However, even this approach can run into common bugs in BSD
+implementations of the @option{-e} option of @command{sh} and
+@command{set} (@pxref{set, , Limitations of Shell Builtins}), so if you
+are worried
+about porting to buggy BSD shells it may be simpler to migrate
+complicated @command{make} actions into separate scripts.
+
+@node Special Chars in Names
+@section Special Characters in Make Macro Names
+
+Posix limits macro names to nonempty strings containing only
+ASCII letters and digits, @samp{.}, and @samp{_}. Many
+@command{make} implementations allow a wider variety of characters, but
+portable makefiles should avoid them. It is portable to start a name
+with a special character, e.g., @samp{$(.FOO)}.
+
+Some ancient @command{make} implementations don't support leading
+underscores in macro names. An example is NEWS-OS 4.2R.
+
+@example
+$ @kbd{cat Makefile}
+_am_include = #
+_am_quote =
+all:; @@echo this is test
+$ @kbd{make}
+Make: Must be a separator on rules line 2. Stop.
+$ @kbd{cat Makefile2}
+am_include = #
+am_quote =
+all:; @@echo this is test
+$ @kbd{make -f Makefile2}
+this is test
+@end example
+
+@noindent
+However, this problem is no longer of practical concern.
+
+@node Backslash-Newline-Empty
+@section Backslash-Newline Before Empty Lines
+
+A bug in Bash 2.03 can cause problems if a Make rule contains a
+backslash-newline followed by line that expands to nothing.
+For example, on Solaris 8:
+
+@example
+SHELL = /bin/bash
+EMPTY =
+foo:
+ touch foo \
+ $(EMPTY)
+@end example
+
+@noindent
+executes
+
+@example
+/bin/bash -c 'touch foo \
+'
+@end example
+
+@noindent
+which fails with a syntax error, due to the Bash bug. To avoid this
+problem, avoid nullable macros in the last line of a multiline command.
+
+@c This has been seen on ia64 hpux 11.20, and on one hppa hpux 10.20,
+@c but another hppa hpux 10.20 didn't have it. Bob Proulx
+@c <bob@proulx.com> thinks it was in hpux 8.0 too.
+On some versions of HP-UX, @command{make} reads multiple newlines
+following a backslash, continuing to the next non-empty line. For
+example,
+
+@example
+FOO = one \
+
+BAR = two
+
+test:
+ : FOO is "$(FOO)"
+ : BAR is "$(BAR)"
+@end example
+
+@noindent
+shows @code{FOO} equal to @code{one BAR = two}. Other implementations
+sensibly let a backslash continue only to the immediately following
+line.
+
+@node Backslash-Newline Comments
+@section Backslash-Newline in Make Comments
+
+According to Posix, Make comments start with @code{#}
+and continue until an unescaped newline is reached.
+
+@example
+$ @kbd{cat Makefile}
+# A = foo \
+ bar \
+ baz
+
+all:
+ @@echo ok
+$ @kbd{make} # GNU make
+ok
+@end example
+
+@noindent
+However this is not always the case. Some implementations
+discard everything from @code{#} through the end of the line, ignoring any
+trailing backslash.
+
+@example
+$ @kbd{pmake} # BSD make
+"Makefile", line 3: Need an operator
+Fatal errors encountered -- cannot continue
+@end example
+
+@noindent
+Therefore, if you want to comment out a multi-line definition, prefix each
+line with @code{#}, not only the first.
+
+@example
+# A = foo \
+# bar \
+# baz
+@end example
+
+@node Long Lines in Makefiles
+@section Long Lines in Makefiles
+
+Tru64 5.1's @command{make} has been reported to crash when given a
+makefile with lines longer than around 20 kB. Earlier versions are
+reported to exit with @code{Line too long} diagnostics.
+
+@node Macros and Submakes
+@section @code{make macro=value} and Submakes
+
+A command-line variable definition such as @code{foo=bar} overrides any
+definition of @code{foo} in a makefile. Some @command{make}
+implementations (such as GNU @command{make}) propagate this
+override to subsidiary invocations of @command{make}. Some other
+implementations do not pass the substitution along to submakes.
+
+@example
+$ @kbd{cat Makefile}
+foo = foo
+one:
+ @@echo $(foo)
+ $(MAKE) two
+two:
+ @@echo $(foo)
+$ @kbd{make foo=bar} # GNU make 3.79.1
+bar
+make two
+make[1]: Entering directory `/home/adl'
+bar
+make[1]: Leaving directory `/home/adl'
+$ @kbd{pmake foo=bar} # BSD make
+bar
+pmake two
+foo
+@end example
+
+You have a few possibilities if you do want the @code{foo=bar} override
+to propagate to submakes. One is to use the @option{-e}
+option, which causes all environment variables to have precedence over
+the makefile macro definitions, and declare foo as an environment
+variable:
+
+@example
+$ @kbd{env foo=bar make -e}
+@end example
+
+The @option{-e} option is propagated to submakes automatically,
+and since the environment is inherited between @command{make}
+invocations, the @code{foo} macro is overridden in
+submakes as expected.
+
+This syntax (@code{foo=bar make -e}) is portable only when used
+outside of a makefile, for instance from a script or from the
+command line. When run inside a @command{make} rule, GNU
+@command{make} 3.80 and prior versions forget to propagate the
+@option{-e} option to submakes.
+
+Moreover, using @option{-e} could have unexpected side effects if your
+environment contains some other macros usually defined by the
+makefile. (See also the note about @code{make -e} and @code{SHELL}
+below.)
+
+If you can foresee all macros that a user might want to override, then
+you can propagate them to submakes manually, from your makefile:
+
+@example
+foo = foo
+one:
+ @@echo $(foo)
+ $(MAKE) foo=$(foo) two
+two:
+ @@echo $(foo)
+@end example
+
+Another way to propagate a variable to submakes in a portable way is to
+expand an extra variable in every invocation of @samp{$(MAKE)} within
+your makefile:
+
+@example
+foo = foo
+one:
+ @@echo $(foo)
+ $(MAKE) $(SUBMAKEFLAGS) two
+two:
+ @@echo $(foo)
+@end example
+
+Users must be aware that this technique is in use to take advantage of
+it, e.g.@: with @code{make foo=bar SUBMAKEFLAGS='foo=bar'}, but it
+allows any macro to be overridden. Makefiles generated by
+@command{automake} use this technique, expanding @code{$(AM_MAKEFLAGS)}
+on the command lines of submakes (@pxref{Subdirectories, , Automake,
+automake, GNU Automake}).
+
+@node The Make Macro MAKEFLAGS
+@section The Make Macro MAKEFLAGS
+@cindex @code{MAKEFLAGS} and @command{make}
+@cindex @command{make} and @code{MAKEFLAGS}
+
+Posix requires @command{make} to use @code{MAKEFLAGS} to affect the
+current and recursive invocations of make, but allows implementations
+several formats for the variable. It is tricky to parse
+@code{$MAKEFLAGS} to determine whether @option{-s} for silent execution
+or @option{-k} for continued execution are in effect. For example, you
+cannot assume that the first space-separated word in @code{$MAKEFLAGS}
+contains single-letter options, since in the Cygwin version of
+GNU @command{make} it is either @option{--unix} or
+@option{--win32} with the second word containing single-letter options.
+
+@example
+$ @kbd{cat Makefile}
+all:
+ @@echo MAKEFLAGS = $(MAKEFLAGS)
+$ @kbd{make}
+MAKEFLAGS = --unix
+$ @kbd{make -k}
+MAKEFLAGS = --unix -k
+@end example
+
+@node The Make Macro SHELL
+@section The Make Macro @code{SHELL}
+@cindex @code{SHELL} and @command{make}
+@cindex @command{make} and @code{SHELL}
+
+Posix-compliant @command{make} internally uses the @code{$(SHELL)}
+macro to spawn shell processes and execute Make rules. This
+is a builtin macro supplied by @command{make}, but it can be modified
+by a makefile or by a command-line argument.
+
+Not all @command{make} implementations define this @code{SHELL} macro.
+Tru64
+@command{make} is an example; this implementation always uses
+@code{/bin/sh}. So it's a good idea to always define @code{SHELL} in
+your makefiles. If you use Autoconf, do
+
+@example
+SHELL = @@SHELL@@
+@end example
+
+@noindent
+If you use Automake, this is done for you.
+
+Do not force @code{SHELL = /bin/sh} because that is not correct
+everywhere. Remember, @file{/bin/sh} is not Posix compliant on many
+systems, such as FreeBSD 4, NetBSD 3, AIX 3, Solaris 10, or Tru64.
+Additionally, DJGPP lacks @code{/bin/sh}, and when its
+GNU @command{make} port sees such a setting it enters a
+special emulation mode where features like pipes and redirections are
+emulated on top of DOS's @command{command.com}. Unfortunately this
+emulation is incomplete; for instance it does not handle command
+substitutions. Using @code{@@SHELL@@} means that your makefile will
+benefit from the same improved shell, such as @command{bash} or
+@command{ksh}, that was discovered during @command{configure}, so that
+you aren't fighting two different sets of shell bugs between the two
+contexts.
+
+Posix-compliant @command{make} should never acquire the value of
+$(SHELL) from the environment, even when @code{make -e} is used
+(otherwise, think about what would happen to your rules if
+@code{SHELL=/bin/tcsh}).
+
+However not all @command{make} implementations have this exception.
+For instance it's not surprising that Tru64 @command{make} doesn't
+protect @code{SHELL}, since it doesn't use it.
+
+@example
+$ @kbd{cat Makefile}
+SHELL = /bin/sh
+FOO = foo
+all:
+ @@echo $(SHELL)
+ @@echo $(FOO)
+$ @kbd{env SHELL=/bin/tcsh FOO=bar make -e} # Tru64 Make
+/bin/tcsh
+bar
+$ @kbd{env SHELL=/bin/tcsh FOO=bar gmake -e} # GNU make
+/bin/sh
+bar
+@end example
+
+Conversely, @command{make} is not supposed to export any changes to the
+macro @code{SHELL} to child processes. Again, many implementations
+break this rule:
+
+@example
+$ @kbd{cat Makefile}
+all:
+ @@echo $(SHELL)
+ @@printenv SHELL
+$ @kbd{env SHELL=sh make -e SHELL=/bin/ksh} # BSD Make, GNU make 3.80
+/bin/ksh
+/bin/ksh
+$ @kbd{env SHELL=sh gmake -e SHELL=/bin/ksh} # GNU make 3.81
+/bin/ksh
+sh
+@end example
+
+@node Parallel Make
+@section Parallel Make
+@cindex Parallel @command{make}
+
+Support for parallel execution in @command{make} implementation varies.
+Generally, using GNU make is your best bet.
+
+When NetBSD or FreeBSD @command{make} are run in parallel mode, they will
+reuse the same shell for multiple commands within one recipe. This can
+have various unexpected consequences. For example, changes of directories
+or variables persist between recipes, so that:
+
+@example
+all:
+ @@var=value; cd /; pwd; echo $$var; echo $$$$
+ @@pwd; echo $$var; echo $$$$
+@end example
+
+@noindent
+may output the following with @code{make -j1}, at least on NetBSD up to
+5.1 and FreeBSD up to 8.2:
+
+@example
+/
+value
+32235
+/
+value
+32235
+@end example
+
+@noindent
+while without @option{-j1}, or with @option{-B}, the output looks less
+surprising:
+
+@example
+/
+value
+32238
+/tmp
+
+32239
+@end example
+
+@noindent
+Another consequence is that, if one command in a recipe uses @code{exit 0}
+to indicate a successful exit, the shell will be gone and the remaining
+commands of this recipe will not be executed.
+
+The BSD @command{make} implementations, when run in parallel mode,
+will also pass the @command{Makefile} recipes to the shell through
+its standard input, thus making it unusable from the recipes:
+
+@example
+$ @kbd{cat Makefile}
+read:
+ @@read line; echo LINE: $$line
+@c $$ @c restore font-lock
+$ @kbd{echo foo | make read}
+LINE: foo
+$ @kbd{echo foo | make -j1 read} # NetBSD 5.1 and FreeBSD 8.2
+LINE:
+@end example
+
+@noindent
+Moreover, when FreeBSD @command{make} (up at least to 8.2) is run in
+parallel mode, it implements the @code{@@} and @code{-} ``recipe
+modifiers'' by dynamically modifying the active shell flags. This
+behavior has the effects of potentially clobbering the exit status
+of recipes silenced with the @code{@@} modifier if they also unset
+the @option{errexit} shell flag, and of mangling the output in
+unexpected ways:
+
+@example
+$ @kbd{cat Makefile}
+a:
+ @@echo $$-; set +e; false
+b:
+ -echo $$-; false; echo set -
+$ @kbd{make a; echo status: $?}
+ehBc
+*** Error code 1
+status: 1
+$ @kbd{make -j1 a; echo status: $?}
+ehB
+status: 0
+$ @kbd{make b}
+echo $-; echo set -
+hBc
+set -
+$ @kbd{make -j1 b}
+echo $-; echo hvB
+@end example
+
+@noindent
+You can avoid all these issues by using the @option{-B} option to enable
+compatibility semantics. However, that will effectively also disable
+all parallelism as that will cause prerequisites to be updated in the
+order they are listed in a rule.
+
+Some make implementations (among them, FreeBSD @command{make}, NetBSD
+@command{make}, and Solaris @command{dmake}), when invoked with a
+@option{-j@var{N}} option, connect the standard output and standard
+error of all their child processes to pipes or temporary regular
+files. This can lead to subtly different semantics in the behavior
+of the spawned processes. For example, even if the @command{make}
+standard output is connected to a tty, the recipe command will not be:
+
+@example
+$ @kbd{cat Makefile}
+all:
+ @@test -t 1 && echo "Is a tty" || echo "Is not a tty"
+$ @kbd{make -j 2} # FreeBSD 8.2 make
+Is not a tty
+$ @kbd{make -j 2} # NetBSD 5.1 make
+--- all ---
+Is not a tty
+$ @kbd{dmake -j 2} # Solaris 10 dmake
+@var{hostname} --> 1 job
+@var{hostname} --> Job output
+Is not a tty
+@end example
+
+@noindent
+On the other hand:
+
+@example
+$ @kbd{make -j 2} # GNU make, Heirloom make
+Is a tty
+@end example
+
+@noindent
+The above examples also show additional status output produced in parallel
+mode for targets being updated by Solaris @command{dmake} and NetBSD
+@command{make} (but @emph{not} by FreeBSD @command{make}).
+
+Furthermore, parallel runs of those @command{make} implementations will
+route standard error from commands that they spawn into their own
+standard output, and may remove leading whitespace from output lines.
+
+
+@node Comments in Make Rules
+@section Comments in Make Rules
+@cindex Comments in @file{Makefile} rules
+@cindex @file{Makefile} rules and comments
+
+Never put comments in a rule.
+
+Some @command{make} treat anything starting with a tab as a command for
+the current rule, even if the tab is immediately followed by a @code{#}.
+The @command{make} from Tru64 Unix V5.1 is one of them. The following
+makefile runs @code{# foo} through the shell.
+
+@example
+all:
+ # foo
+@end example
+
+As a workaround, you can use the @command{:} no-op command with a string
+argument that gets ignored:
+
+@example
+all:
+ : "foo"
+@end example
+
+Conversely, if you want to use the @samp{#} character in some command,
+you can only do so by expanding it inside a rule (@pxref{Comments in
+Make Macros}). So for example, if @samp{COMMENT_CHAR} is substituted by
+@command{config.status} as @samp{#}, then the following substitutes
+@samp{@@COMMENT_CHAR@@} in a generated header:
+
+@example
+foo.h: foo.h.in
+ sed -e 's|@@''COMMENT_CHAR''@@|@@COMMENT_CHAR@@|g' \
+ $(srcdir)/foo.h.in > $@@
+@end example
+
+The funny shell quoting avoids a substitution at @command{config.status}
+run time of the left-hand side of the @command{sed} @samp{s} command.
+
+@node Newlines in Make Rules
+@section Newlines in Make Rules
+@cindex Newlines in @file{Makefile} rules
+@cindex @file{Makefile} rules and newlines
+
+In shell scripts, newlines can be used inside string literals. But in
+the shell statements of @file{Makefile} rules, this is not possible:
+A newline not preceded by a backslash is a separator between shell
+statements. Whereas a newline that is preceded by a backslash becomes
+part of the shell statement according to POSIX, but gets replaced,
+together with the backslash that precedes it, by a space in GNU
+@command{make} 3.80 and older. So, how can a newline be used in a string
+literal?
+
+The trick is to set up a shell variable that contains a newline:
+
+@example
+nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"
+@end example
+
+For example, in order to create a multiline @samp{sed} expression that
+inserts a blank line after every line of a file, this code can be used:
+
+@example
+nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"; \
+sed -e "s/\$$/\\$$@{nl@}/" < input > output
+@end example
+
+@node Comments in Make Macros
+@section Comments in Make Macros
+@cindex Comments in @file{Makefile} macros
+@cindex @file{Makefile} macros and comments
+
+Avoid putting comments in macro values as far as possible. Posix
+specifies that the text starting from the @samp{#} sign until the end of
+the line is to be ignored, which has the unfortunate effect of
+disallowing them even within quotes. Thus, the following might lead to
+a syntax error at compile time:
+
+@example
+CPPFLAGS = "-DCOMMENT_CHAR='#'"
+@end example
+
+@noindent
+as @samp{CPPFLAGS} may be expanded to @samp{"-DCOMMENT_CHAR='}.
+
+Most @command{make} implementations disregard this and treat single and
+double quotes specially here. Also, GNU @command{make} lets you put
+@samp{#} into a macro value by escaping it with a backslash, i.e.,
+@samp{\#}. However, neither of these usages are portable.
+@xref{Comments in Make Rules}, for a portable alternative.
+
+Even without quoting involved, comments can have surprising effects,
+because the whitespace before them is part of the variable value:
+
+@example
+foo = bar # trailing comment
+print: ; @@echo "$(foo)."
+@end example
+
+@noindent
+prints @samp{bar .}, which is usually not intended, and can expose
+@command{make} bugs as described below.
+
+@node Trailing whitespace in Make Macros
+@section Trailing whitespace in Make Macros
+@cindex whitespace in @file{Makefile} macros
+@cindex @file{Makefile} macros and whitespace
+
+GNU @command{make} 3.80 mistreats trailing whitespace in macro
+substitutions and appends another spurious suffix:
+
+@example
+empty =
+foo = bar $(empty)
+print: ; @@echo $(foo:=.test)
+@end example
+
+@noindent
+prints @samp{bar.test .test}.
+
+BSD and Solaris @command{make} implementations do not honor trailing
+whitespace in macro definitions as Posix requires:
+
+@example
+foo = bar # Note the space after "bar".
+print: ; @@echo $(foo)t
+@end example
+
+@noindent
+prints @samp{bart} instead of @samp{bar t}. To work around this, you
+can use a helper macro as in the previous example.
+
+
+@node Command-line Macros and whitespace
+@section Command-line Macros and whitespace
+@cindex whitespace in command-line macros
+@cindex command-line, macros set on
+@cindex environment, macros set from
+
+Some @command{make} implementations may strip trailing whitespace off
+of macros set on the command line in addition to leading whitespace.
+Further, some may strip leading whitespace off of macros set from
+environment variables:
+
+@example
+$ @kbd{echo 'print: ; @@echo "x$(foo)x$(bar)x"' |
+ foo=' f f ' make -f - bar=' b b '}
+x f f xb b x # AIX, BSD, GNU make
+xf f xb b x # HP-UX, IRIX, Tru64/OSF make
+x f f xb bx # Solaris make
+@end example
+
+
+@node obj/ and Make
+@section The @file{obj/} Subdirectory and Make
+@cindex @file{obj/}, subdirectory
+@cindex BSD @command{make} and @file{obj/}
+
+Never name one of your subdirectories @file{obj/} if you don't like
+surprises.
+
+If an @file{obj/} directory exists, BSD @command{make} enters it
+before reading the makefile. Hence the makefile in the
+current directory is not read.
+
+@example
+$ @kbd{cat Makefile}
+all:
+ echo Hello
+$ @kbd{cat obj/Makefile}
+all:
+ echo World
+$ @kbd{make} # GNU make
+echo Hello
+Hello
+$ @kbd{pmake} # BSD make
+echo World
+World
+@end example
+
+@node make -k Status
+@section Exit Status of @code{make -k}
+@cindex @code{make -k}
+
+Do not rely on the exit status of @code{make -k}. Some implementations
+reflect whether they encountered an error in their exit status; other
+implementations always succeed.
+
+@example
+$ @kbd{cat Makefile}
+all:
+ false
+$ @kbd{make -k; echo exit status: $?} # GNU make
+false
+make: *** [all] Error 1
+exit status: 2
+$ @kbd{pmake -k; echo exit status: $?} # BSD make
+false
+*** Error code 1 (continuing)
+exit status: 0
+@end example
+
+@node VPATH and Make
+@section @code{VPATH} and Make
+@cindex @code{VPATH}
+
+Posix does not specify the semantics of @code{VPATH}. Typically,
+@command{make} supports @code{VPATH}, but its implementation is not
+consistent.
+
+Autoconf and Automake support makefiles whose usages of @code{VPATH} are
+portable to recent-enough popular implementations of @command{make}, but
+to keep the resulting makefiles portable, a package's makefile
+prototypes must take the following issues into account. These issues
+are complicated and are often poorly understood, and installers who use
+@code{VPATH} should expect to find many bugs in this area. If you use
+@code{VPATH}, the simplest way to avoid these portability bugs is to
+stick with GNU @command{make}, since it is the most
+commonly-used @command{make} among Autoconf users.
+
+Here are some known issues with some @code{VPATH}
+implementations.
+
+@menu
+* Variables listed in VPATH:: @code{VPATH} must be literal on ancient hosts
+* VPATH and Double-colon:: Problems with @samp{::} on ancient hosts
+* $< in Explicit Rules:: @code{$<} does not work in ordinary rules
+* Automatic Rule Rewriting:: @code{VPATH} goes wild on Solaris
+* Tru64 Directory Magic:: @command{mkdir} goes wild on Tru64
+* Make Target Lookup:: More details about @code{VPATH} lookup
+@end menu
+
+@node Variables listed in VPATH
+@subsection Variables listed in @code{VPATH}
+@cindex @code{VPATH} and variables
+@cindex variables and @code{VPATH}
+
+Do not set @code{VPATH} to the value of another variable, for example
+@samp{VPATH = $(srcdir)}, because some ancient versions of
+@command{make} do not do variable substitutions on the value of
+@code{VPATH}. For example, use this
+
+@example
+srcdir = @@srcdir@@
+VPATH = @@srcdir@@
+@end example
+
+@noindent
+rather than @samp{VPATH = $(srcdir)}. Note that with GNU
+Automake, there is no need to set this yourself.
+
+@node VPATH and Double-colon
+@subsection @code{VPATH} and Double-colon Rules
+@cindex @code{VPATH} and double-colon rules
+@cindex double-colon rules and @code{VPATH}
+
+With ancient versions of Sun @command{make},
+any assignment to @code{VPATH} causes @command{make} to execute only
+the first set of double-colon rules.
+However, this problem is no longer of practical concern.
+
+@node $< in Explicit Rules
+@subsection @code{$<} Not Supported in Explicit Rules
+@cindex explicit rules, @code{$<}, and @code{VPATH}
+@cindex @code{$<}, explicit rules, and @code{VPATH}
+@cindex @code{VPATH}, explicit rules, and @code{$<}
+
+Using @code{$<} in explicit rules is not portable.
+The prerequisite file must be named explicitly in the rule. If you want
+to find the prerequisite via a @code{VPATH} search, you have to code the
+whole thing manually. @xref{Build Directories}.
+
+@node Automatic Rule Rewriting
+@subsection Automatic Rule Rewriting
+@cindex @code{VPATH} and automatic rule rewriting
+@cindex automatic rule rewriting and @code{VPATH}
+
+Some @command{make} implementations, such as Solaris and Tru64,
+search for prerequisites in @code{VPATH} and
+then rewrite each occurrence as a plain word in the rule.
+For instance:
+
+@example
+# This isn't portable to GNU make.
+VPATH = ../pkg/src
+f.c: if.c
+ cp if.c f.c
+@end example
+
+@noindent
+executes @code{cp ../pkg/src/if.c f.c} if @file{if.c} is
+found in @file{../pkg/src}.
+
+However, this rule leads to real problems in practice. For example, if
+the source directory contains an ordinary file named @file{test} that is
+used in a dependency, Solaris @command{make} rewrites commands like
+@samp{if test -r foo; @dots{}} to @samp{if ../pkg/src/test -r foo;
+@dots{}}, which is typically undesirable. In fact, @command{make} is
+completely unaware of shell syntax used in the rules, so the VPATH
+rewrite can potentially apply to @emph{any} whitespace-separated word
+in a rule, including shell variables, functions, and keywords.
+
+@example
+$ @kbd{mkdir build}
+$ @kbd{cd build}
+$ @kbd{cat > Makefile <<'END'}
+VPATH = ..
+all: arg func for echo
+ func () @{ for arg in "$$@@"; do echo $$arg; done; @}; \
+ func "hello world"
+END
+$ @kbd{touch ../arg ../func ../for ../echo}
+$ @kbd{make}
+../func () @{ ../for ../arg in "$@@"; do ../echo $arg; done; @}; \
+../func "hello world"
+sh: syntax error at line 1: `do' unexpected
+*** Error code 2
+@end example
+
+@noindent
+To avoid this problem, portable makefiles should never mention a source
+file or dependency whose name is that of a shell keyword like @file{for}
+or @file{until}, a shell command like @command{cat} or @command{gcc} or
+@command{test}, or a shell function or variable used in the corresponding
+@command{Makefile} recipe.
+
+Because of these problems GNU @command{make} and many other @command{make}
+implementations do not rewrite commands, so portable makefiles should
+search @code{VPATH} manually. It is tempting to write this:
+
+@smallexample
+# This isn't portable to Solaris make.
+VPATH = ../pkg/src
+f.c: if.c
+ cp `test -f if.c || echo $(VPATH)/`if.c f.c
+@end smallexample
+
+@noindent
+However, the ``prerequisite rewriting'' still applies here. So if
+@file{if.c} is in @file{../pkg/src}, Solaris and Tru64 @command{make}
+execute
+
+@smallexample
+cp `test -f ../pkg/src/if.c || echo ../pkg/src/`if.c f.c
+@end smallexample
+
+@noindent
+which reduces to
+
+@example
+cp if.c f.c
+@end example
+
+@noindent
+and thus fails. Oops.
+
+A simple workaround, and good practice anyway, is to use @samp{$?} and
+@samp{$@@} when possible:
+
+@smallexample
+VPATH = ../pkg/src
+f.c: if.c
+ cp $? $@@
+@end smallexample
+
+@noindent
+but this does not generalize well to commands with multiple
+prerequisites. A more general workaround is to rewrite the rule so that
+the prerequisite @file{if.c} never appears as a plain word. For
+example, these three rules would be safe, assuming @file{if.c} is in
+@file{../pkg/src} and the other files are in the working directory:
+
+@smallexample
+VPATH = ../pkg/src
+f.c: if.c f1.c
+ cat `test -f ./if.c || echo $(VPATH)/`if.c f1.c >$@@
+g.c: if.c g1.c
+ cat `test -f 'if.c' || echo $(VPATH)/`if.c g1.c >$@@
+h.c: if.c h1.c
+ cat `test -f "if.c" || echo $(VPATH)/`if.c h1.c >$@@
+@end smallexample
+
+Things get worse when your prerequisites are in a macro.
+
+@example
+VPATH = ../pkg/src
+HEADERS = f.h g.h h.h
+install-HEADERS: $(HEADERS)
+ for i in $(HEADERS); do \
+ $(INSTALL) -m 644 \
+ `test -f $$i || echo $(VPATH)/`$$i \
+ $(DESTDIR)$(includedir)/$$i; \
+@c $$ restore font-lock
+ done
+@end example
+
+The above @code{install-HEADERS} rule is not Solaris-proof because @code{for
+i in $(HEADERS);} is expanded to @code{for i in f.h g.h h.h;}
+where @code{f.h} and @code{g.h} are plain words and are hence
+subject to @code{VPATH} adjustments.
+
+If the three files are in @file{../pkg/src}, the rule is run as:
+
+@example
+for i in ../pkg/src/f.h ../pkg/src/g.h h.h; do \
+ install -m 644 \
+ `test -f $i || echo ../pkg/src/`$i \
+ /usr/local/include/$i; \
+done
+@end example
+
+where the two first @command{install} calls fail. For instance,
+consider the @code{f.h} installation:
+
+@example
+install -m 644 \
+ `test -f ../pkg/src/f.h || \
+ echo ../pkg/src/ \
+ `../pkg/src/f.h \
+ /usr/local/include/../pkg/src/f.h;
+@end example
+
+@noindent
+It reduces to:
+
+@example
+install -m 644 \
+ ../pkg/src/f.h \
+ /usr/local/include/../pkg/src/f.h;
+@end example
+
+Note that the manual @code{VPATH} search did not cause any problems here;
+however this command installs @file{f.h} in an incorrect directory.
+
+Trying to quote @code{$(HEADERS)} in some way, as we did for
+@code{foo.c} a few makefiles ago, does not help:
+
+@example
+install-HEADERS: $(HEADERS)
+ headers='$(HEADERS)'; \
+ for i in $$headers; do \
+ $(INSTALL) -m 644 \
+ `test -f $$i || echo $(VPATH)/`$$i \
+ $(DESTDIR)$(includedir)/$$i; \
+ done
+@end example
+
+Now, @code{headers='$(HEADERS)'} macro-expands to:
+
+@example
+headers='f.h g.h h.h'
+@end example
+
+@noindent
+but @code{g.h} is still a plain word. (As an aside, the idiom
+@code{headers='$(HEADERS)'; for i in $$headers;} is a good
+idea if @code{$(HEADERS)} can be empty, because some shells diagnose a
+syntax error on @code{for i in;}.)
+
+One workaround is to strip this unwanted @file{../pkg/src/} prefix manually:
+
+@example
+VPATH = ../pkg/src
+HEADERS = f.h g.h h.h
+install-HEADERS: $(HEADERS)
+ headers='$(HEADERS)'; \
+ for i in $$headers; do \
+ i=`expr "$$i" : '$(VPATH)/\(.*\)'`;
+ $(INSTALL) -m 644 \
+ `test -f $$i || echo $(VPATH)/`$$i \
+ $(DESTDIR)$(includedir)/$$i; \
+@c $$ restore font-lock
+ done
+@end example
+
+Automake does something similar. However the above hack works only if
+the files listed in @code{HEADERS} are in the current directory or a
+subdirectory; they should not be in an enclosing directory. If we had
+@code{HEADERS = ../f.h}, the above fragment would fail in a VPATH
+build with Tru64 @command{make}. The reason is that not only does
+Tru64 @command{make} rewrite dependencies, but it also simplifies
+them. Hence @code{../f.h} becomes @code{../pkg/f.h} instead of
+@code{../pkg/src/../f.h}. This obviously defeats any attempt to strip
+a leading @file{../pkg/src/} component.
+
+The following example makes the behavior of Tru64 @command{make}
+more apparent.
+
+@example
+$ @kbd{cat Makefile}
+VPATH = sub
+all: ../foo
+ echo ../foo
+$ @kbd{ls}
+Makefile foo
+$ @kbd{make}
+echo foo
+foo
+@end example
+
+@noindent
+Dependency @file{../foo} was found in @file{sub/../foo}, but Tru64
+@command{make} simplified it as @file{foo}. (Note that the @file{sub/}
+directory does not even exist, this just means that the simplification
+occurred before the file was checked for.)
+
+For the record here is how SunOS 4 @command{make} behaves on this
+example.
+
+@smallexample
+$ @kbd{make}
+make: Fatal error: Don't know how to make target `../foo'
+$ @kbd{mkdir sub}
+$ @kbd{make}
+echo sub/../foo
+sub/../foo
+@end smallexample
+
+
+@node Tru64 Directory Magic
+@subsection Tru64 @command{make} Creates Prerequisite Directories Magically
+@cindex @code{VPATH} and prerequisite directories
+@cindex prerequisite directories and @code{VPATH}
+
+When a prerequisite is a subdirectory of @code{VPATH}, Tru64
+@command{make} creates it in the current directory.
+
+@example
+$ @kbd{mkdir -p foo/bar build}
+$ @kbd{cd build}
+$ @kbd{cat >Makefile <<END
+VPATH = ..
+all: foo/bar
+END}
+$ @kbd{make}
+mkdir foo
+mkdir foo/bar
+@end example
+
+This can yield unexpected results if a rule uses a manual @code{VPATH}
+search as presented before.
+
+@example
+VPATH = ..
+all : foo/bar
+ command `test -d foo/bar || echo ../`foo/bar
+@end example
+
+The above @command{command} is run on the empty @file{foo/bar}
+directory that was created in the current directory.
+
+@node Make Target Lookup
+@subsection Make Target Lookup
+@cindex @code{VPATH}, resolving target pathnames
+
+GNU @command{make} uses a complex algorithm to decide when it
+should use files found via a @code{VPATH} search. @xref{Search
+Algorithm, , How Directory Searches are Performed, make, The GNU Make
+Manual}.
+
+If a target needs to be rebuilt, GNU @command{make} discards the
+file name found during the @code{VPATH} search for this target, and
+builds the file locally using the file name given in the makefile.
+If a target does not need to be rebuilt, GNU @command{make} uses the
+file name found during the @code{VPATH} search.
+
+Other @command{make} implementations, like NetBSD @command{make}, are
+easier to describe: the file name found during the @code{VPATH} search
+is used whether the target needs to be rebuilt or not. Therefore
+new files are created locally, but existing files are updated at their
+@code{VPATH} location.
+
+OpenBSD and FreeBSD @command{make}, however,
+never perform a
+@code{VPATH} search for a dependency that has an explicit rule.
+This is extremely annoying.
+
+When attempting a @code{VPATH} build for an autoconfiscated package
+(e.g., @code{mkdir build && cd build && ../configure}), this means
+GNU
+@command{make} builds everything locally in the @file{build}
+directory, while BSD @command{make} builds new files locally and
+updates existing files in the source directory.
+
+@example
+$ @kbd{cat Makefile}
+VPATH = ..
+all: foo.x bar.x
+foo.x bar.x: newer.x
+ @@echo Building $@@
+$ @kbd{touch ../bar.x}
+$ @kbd{touch ../newer.x}
+$ @kbd{make} # GNU make
+Building foo.x
+Building bar.x
+$ @kbd{pmake} # NetBSD make
+Building foo.x
+Building ../bar.x
+$ @kbd{fmake} # FreeBSD make, OpenBSD make
+Building foo.x
+Building bar.x
+$ @kbd{tmake} # Tru64 make
+Building foo.x
+Building bar.x
+$ @kbd{touch ../bar.x}
+$ @kbd{make} # GNU make
+Building foo.x
+$ @kbd{pmake} # NetBSD make
+Building foo.x
+$ @kbd{fmake} # FreeBSD make, OpenBSD make
+Building foo.x
+Building bar.x
+$ @kbd{tmake} # Tru64 make
+Building foo.x
+Building bar.x
+@end example
+
+Note how NetBSD @command{make} updates @file{../bar.x} in its
+VPATH location, and how FreeBSD, OpenBSD, and Tru64
+@command{make} always
+update @file{bar.x}, even when @file{../bar.x} is up to date.
+
+Another point worth mentioning is that once GNU @command{make} has
+decided to ignore a @code{VPATH} file name (e.g., it ignored
+@file{../bar.x} in the above example) it continues to ignore it when
+the target occurs as a prerequisite of another rule.
+
+The following example shows that GNU @command{make} does not look up
+@file{bar.x} in @code{VPATH} before performing the @code{.x.y} rule,
+because it ignored the @code{VPATH} result of @file{bar.x} while running
+the @code{bar.x: newer.x} rule.
+
+@example
+$ @kbd{cat Makefile}
+VPATH = ..
+all: bar.y
+bar.x: newer.x
+ @@echo Building $@@
+.SUFFIXES: .x .y
+.x.y:
+ cp $< $@@
+$ @kbd{touch ../bar.x}
+$ @kbd{touch ../newer.x}
+$ @kbd{make} # GNU make
+Building bar.x
+cp bar.x bar.y
+cp: cannot stat `bar.x': No such file or directory
+make: *** [bar.y] Error 1
+$ @kbd{pmake} # NetBSD make
+Building ../bar.x
+cp ../bar.x bar.y
+$ @kbd{rm bar.y}
+$ @kbd{fmake} # FreeBSD make, OpenBSD make
+echo Building bar.x
+cp bar.x bar.y
+cp: cannot stat `bar.x': No such file or directory
+*** Error code 1
+$ @kbd{tmake} # Tru64 make
+Building bar.x
+cp: bar.x: No such file or directory
+*** Exit 1
+@end example
+
+Note that if you drop away the command from the @code{bar.x: newer.x}
+rule, GNU @command{make} magically starts to work: it
+knows that @code{bar.x} hasn't been updated, therefore it doesn't
+discard the result from @code{VPATH} (@file{../bar.x}) in succeeding
+uses. Tru64 also works, but FreeBSD and OpenBSD
+still don't.
+
+@example
+$ @kbd{cat Makefile}
+VPATH = ..
+all: bar.y
+bar.x: newer.x
+.SUFFIXES: .x .y
+.x.y:
+ cp $< $@@
+$ @kbd{touch ../bar.x}
+$ @kbd{touch ../newer.x}
+$ @kbd{make} # GNU make
+cp ../bar.x bar.y
+$ @kbd{rm bar.y}
+$ @kbd{pmake} # NetBSD make
+cp ../bar.x bar.y
+$ @kbd{rm bar.y}
+$ @kbd{fmake} # FreeBSD make, OpenBSD make
+cp bar.x bar.y
+cp: cannot stat `bar.x': No such file or directory
+*** Error code 1
+$ @kbd{tmake} # Tru64 make
+cp ../bar.x bar.y
+@end example
+
+It seems the sole solution that would please every @command{make}
+implementation is to never rely on @code{VPATH} searches for targets.
+In other words, @code{VPATH} should be reserved to unbuilt sources.
+
+
+@node Single Suffix Rules
+@section Single Suffix Rules and Separated Dependencies
+@cindex Single Suffix Inference Rule
+@cindex Rule, Single Suffix Inference
+A @dfn{Single Suffix Rule} is basically a usual suffix (inference) rule
+(@samp{.from.to:}), but which @emph{destination} suffix is empty
+(@samp{.from:}).
+
+@cindex Separated Dependencies
+@dfn{Separated dependencies} simply refers to listing the prerequisite
+of a target, without defining a rule. Usually one can list on the one
+hand side, the rules, and on the other hand side, the dependencies.
+
+Solaris @command{make} does not support separated dependencies for
+targets defined by single suffix rules:
+
+@example
+$ @kbd{cat Makefile}
+.SUFFIXES: .in
+foo: foo.in
+.in:
+ cp $< $@@
+$ @kbd{touch foo.in}
+$ @kbd{make}
+$ @kbd{ls}
+Makefile foo.in
+@end example
+
+@noindent
+while GNU Make does:
+
+@example
+$ @kbd{gmake}
+cp foo.in foo
+$ @kbd{ls}
+Makefile foo foo.in
+@end example
+
+Note it works without the @samp{foo: foo.in} dependency.
+
+@example
+$ @kbd{cat Makefile}
+.SUFFIXES: .in
+.in:
+ cp $< $@@
+$ @kbd{make foo}
+cp foo.in foo
+@end example
+
+@noindent
+and it works with double suffix inference rules:
+
+@example
+$ @kbd{cat Makefile}
+foo.out: foo.in
+.SUFFIXES: .in .out
+.in.out:
+ cp $< $@@
+$ @kbd{make}
+cp foo.in foo.out
+@end example
+
+As a result, in such a case, you have to write target rules.
+
+@node Timestamps and Make
+@section Timestamp Resolution and Make
+@cindex timestamp resolution
+Traditionally, file timestamps had 1-second resolution, and
+@command{make} used those timestamps to determine whether one file was
+newer than the other. However, many modern file systems have
+timestamps with 1-nanosecond resolution. Some @command{make}
+implementations look at the entire timestamp; others ignore the
+fractional part, which can lead to incorrect results. Normally this
+is not a problem, but in some extreme cases you may need to use tricks
+like @samp{sleep 1} to work around timestamp truncation bugs.
+
+Commands like @samp{cp -p} and @samp{touch -r} typically do not copy
+file timestamps to their full resolutions (@pxref{touch, , Limitations of Usual
+Tools}). Hence you should be wary of rules like this:
+
+@example
+dest: src
+ cp -p src dest
+@end example
+
+as @file{dest} often appears to be older than @file{src} after the
+timestamp is truncated, and this can cause @command{make} to do
+needless rework the next time it is invoked. To work around this
+problem, you can use a timestamp file, e.g.:
+
+@example
+dest-stamp: src
+ cp -p src dest
+ date >dest-stamp
+@end example
+
+Apart from timestamp resolution, there are also differences in handling
+equal timestamps. HP-UX @command{make} updates targets if it has the
+same time stamp as one of its prerequisites, in violation of Posix rules.
+
+This can cause spurious rebuilds for repeated runs of @command{make}.
+This in turn can cause @command{make} to fail if it tries to rebuild
+generated files in a possibly read-only source tree with tools not
+present on the end-user machine. Use GNU @command{make} instead.
+
+
+
+@c ======================================== Portable C and C++ Programming
+
+@node Portable C and C++
+@chapter Portable C and C++ Programming
+@cindex Portable C and C++ programming
+
+C and C++ programs often use low-level features of the underlying
+system, and therefore are often more difficult to make portable to other
+platforms.
+
+Several standards have been developed to help make your programs more
+portable. If you write programs with these standards in mind, you can
+have greater confidence that your programs work on a wide variety
+of systems.
+@ifhtml
+@uref{http://@/gcc.gnu.org/@/onlinedocs/@/gcc/@/Standards.html, Language
+Standards Supported by GCC}
+@end ifhtml
+@ifnothtml
+@xref{Standards, , Language Standards Supported by
+GCC, gcc, Using the GNU Compiler Collection
+(GCC)},
+@end ifnothtml
+for a list of C-related standards. Many programs also assume the
+@uref{http://@/www.opengroup.org/@/susv3, Posix standard}.
+
+Some old code is written to be portable to K&R C, which predates any C
+standard. K&R C compilers are no longer of practical interest, though,
+and the rest of section assumes at least C89, the first C standard.
+
+Program portability is a huge topic, and this section can only briefly
+introduce common pitfalls. @xref{System Portability, , Portability
+between System Types, standards, The GNU Coding Standards}, for
+more information.
+
+@menu
+* Varieties of Unportability:: How to make your programs unportable
+* Integer Overflow:: When integers get too large
+* Preprocessor Arithmetic:: @code{#if} expression problems
+* Null Pointers:: Properties of null pointers
+* Buffer Overruns:: Subscript errors and the like
+* Volatile Objects:: @code{volatile} and signals
+* Floating Point Portability:: Portable floating-point arithmetic
+* Exiting Portably:: Exiting and the exit status
+@end menu
+
+@node Varieties of Unportability
+@section Varieties of Unportability
+@cindex portability
+
+Autoconf tests and ordinary programs often need to test what is allowed
+on a system, and therefore they may need to deliberately exceed the
+boundaries of what the standards allow, if only to see whether an
+optional feature is present. When you write such a program, you should
+keep in mind the difference between constraints, unspecified behavior,
+and undefined behavior.
+
+In C, a @dfn{constraint} is a rule that the compiler must enforce. An
+example constraint is that C programs must not declare a bit-field with
+negative width. Tests can therefore reliably assume that programs with
+negative-width bit-fields are rejected by a compiler that conforms
+to the standard.
+
+@dfn{Unspecified behavior} is valid behavior, where the standard allows
+multiple possibilities. For example, the order of evaluation of
+function arguments is unspecified. Some unspecified behavior is
+@dfn{implementation-defined}, i.e., documented by the implementation,
+but since Autoconf tests cannot read the documentation they cannot
+distinguish between implementation-defined and other unspecified
+behavior. It is common for Autoconf tests to probe implementations to
+determine otherwise-unspecified behavior.
+
+@dfn{Undefined behavior} is invalid behavior, where the standard allows
+the implementation to do anything it pleases. For example,
+dereferencing a null pointer leads to undefined behavior. If possible,
+test programs should avoid undefined behavior, since a program with
+undefined behavior might succeed on a test that should fail.
+
+The above rules apply to programs that are intended to conform to the
+standard. However, strictly-conforming programs are quite rare, since
+the standards are so limiting. A major goal of Autoconf is to support
+programs that use implementation features not described by the standard,
+and it is fairly common for test programs to violate the above rules, if
+the programs work well enough in practice.
+
+@node Integer Overflow
+@section Integer Overflow
+@cindex integer overflow
+@cindex overflow, signed integer
+@cindex signed integer overflow
+@cindex wraparound arithmetic
+
+In practice many portable C programs assume that signed integer overflow wraps
+around reliably using two's complement arithmetic. Yet the C standard
+says that program behavior is undefined on overflow, and in a few cases
+C programs do not work on some modern implementations because their
+overflows do not wrap around as their authors expected. Conversely, in
+signed integer remainder, the C standard requires overflow
+behavior that is commonly not implemented.
+
+@menu
+* Integer Overflow Basics:: Why integer overflow is a problem
+* Signed Overflow Examples:: Examples of code assuming wraparound
+* Optimization and Wraparound:: Optimizations that break uses of wraparound
+* Signed Overflow Advice:: Practical advice for signed overflow issues
+* Signed Integer Division:: @code{INT_MIN / -1} and @code{INT_MIN % -1}
+@end menu
+
+@node Integer Overflow Basics
+@subsection Basics of Integer Overflow
+@cindex integer overflow
+@cindex overflow, signed integer
+@cindex signed integer overflow
+@cindex wraparound arithmetic
+
+In languages like C, unsigned integer overflow reliably wraps around;
+e.g., @code{UINT_MAX + 1} yields zero.
+This is guaranteed by the C standard and is
+portable in practice, unless you specify aggressive,
+nonstandard optimization options
+suitable only for special applications.
+
+In contrast, the C standard says that signed integer overflow leads to
+undefined behavior where a program can do anything, including dumping
+core or overrunning a buffer. The misbehavior can even precede the
+overflow. Such an overflow can occur during addition, subtraction,
+multiplication, division, and left shift.
+
+Despite this requirement of the standard, many C programs and Autoconf
+tests assume that signed integer overflow silently wraps around modulo a
+power of two, using two's complement arithmetic, so long as you cast the
+resulting value to a signed integer type or store it into a signed
+integer variable. If you use conservative optimization flags, such
+programs are generally portable to the vast majority of modern
+platforms, with a few exceptions discussed later.
+
+For historical reasons the C standard also allows implementations with
+ones' complement or signed magnitude arithmetic, but it is safe to
+assume two's complement nowadays.
+
+Also, overflow can occur when converting an out-of-range value to a
+signed integer type. Here a standard implementation must define what
+happens, but this might include raising an exception. In practice all
+known implementations support silent wraparound in this case, so you need
+not worry about other possibilities.
+
+@node Signed Overflow Examples
+@subsection Examples of Code Assuming Wraparound Overflow
+@cindex integer overflow
+@cindex overflow, signed integer
+@cindex signed integer overflow
+@cindex wraparound arithmetic
+
+There has long been a tension between what the C standard requires for
+signed integer overflow, and what C programs commonly assume. The
+standard allows aggressive optimizations based on assumptions that
+overflow never occurs, but many practical C programs rely on overflow
+wrapping around. These programs do not conform to the standard, but
+they commonly work in practice because compiler writers are
+understandably reluctant to implement optimizations that would break
+many programs, unless perhaps a user specifies aggressive optimization.
+
+The C Standard says that if a program has signed integer overflow its
+behavior is undefined, and the undefined behavior can even precede the
+overflow. To take an extreme example:
+
+@c Inspired by Robert Dewar's example in
+@c <http://gcc.gnu.org/ml/gcc/2007-01/msg00038.html> (2007-01-01).
+@example
+if (password == expected_password)
+ allow_superuser_privileges ();
+else if (counter++ == INT_MAX)
+ abort ();
+else
+ printf ("%d password mismatches\n", counter);
+@end example
+
+@noindent
+If the @code{int} variable @code{counter} equals @code{INT_MAX},
+@code{counter++} must overflow and the behavior is undefined, so the C
+standard allows the compiler to optimize away the test against
+@code{INT_MAX} and the @code{abort} call.
+Worse, if an earlier bug in the program lets the compiler deduce that
+@code{counter == INT_MAX} or that @code{counter} previously overflowed,
+the C standard allows the compiler to optimize away the password test
+and generate code that allows superuser privileges unconditionally.
+
+Despite this requirement by the standard, it has long been common for C
+code to assume wraparound arithmetic after signed overflow, and all
+known practical C implementations support some C idioms that assume
+wraparound signed arithmetic, even if the idioms do not conform
+strictly to the standard. If your code looks like the following
+examples it will almost surely work with real-world compilers.
+
+Here is an example derived from the 7th Edition Unix implementation of
+@code{atoi} (1979-01-10):
+
+@example
+char *p;
+int f, n;
+@dots{}
+while (*p >= '0' && *p <= '9')
+ n = n * 10 + *p++ - '0';
+return (f ? -n : n);
+@end example
+
+@noindent
+Even if the input string is in range, on most modern machines this has
+signed overflow when computing the most negative integer (the @code{-n}
+overflows) or a value near an extreme integer (the first @code{+}
+overflows).
+
+Here is another example, derived from the 7th Edition implementation of
+@code{rand} (1979-01-10). Here the programmer expects both
+multiplication and addition to wrap on overflow:
+
+@example
+static long int randx = 1;
+@dots{}
+randx = randx * 1103515245 + 12345;
+return (randx >> 16) & 077777;
+@end example
+
+In the following example, derived from the GNU C Library 2.5
+implementation of @code{mktime} (2006-09-09), the code assumes
+wraparound arithmetic in @code{+} to detect signed overflow:
+
+@example
+time_t t, t1, t2;
+int sec_requested, sec_adjustment;
+@dots{}
+t1 = t + sec_requested;
+t2 = t1 + sec_adjustment;
+if (((t1 < t) != (sec_requested < 0))
+ | ((t2 < t1) != (sec_adjustment < 0)))
+ return -1;
+@end example
+
+If your code looks like these examples, it is probably safe even though
+it does not strictly conform to the C standard. This might lead one to
+believe that one can generally assume wraparound on overflow, but that
+is not always true, as can be seen in the next section.
+
+@node Optimization and Wraparound
+@subsection Optimizations That Break Wraparound Arithmetic
+@cindex loop induction
+
+Compilers sometimes generate code that is incompatible with wraparound
+integer arithmetic. A simple example is an algebraic simplification: a
+compiler might translate @code{(i * 2000) / 1000} to @code{i * 2}
+because it assumes that @code{i * 2000} does not overflow. The
+translation is not equivalent to the original when overflow occurs:
+e.g., in the typical case of 32-bit signed two's complement wraparound
+@code{int}, if @code{i} has type @code{int} and value @code{1073742},
+the original expression returns @minus{}2147483 but the optimized
+version returns the mathematically correct value 2147484.
+
+More subtly, loop induction optimizations often exploit the undefined
+behavior of signed overflow. Consider the following contrived function
+@code{sumc}:
+
+@example
+int
+sumc (int lo, int hi)
+@{
+ int sum = 0;
+ int i;
+ for (i = lo; i <= hi; i++)
+ sum ^= i * 53;
+ return sum;
+@}
+@end example
+
+@noindent
+To avoid multiplying by 53 each time through the loop, an optimizing
+compiler might internally transform @code{sumc} to the equivalent of the
+following:
+
+@example
+int
+transformed_sumc (int lo, int hi)
+@{
+ int sum = 0;
+ int hic = hi * 53;
+ int ic;
+ for (ic = lo * 53; ic <= hic; ic += 53)
+ sum ^= ic;
+ return sum;
+@}
+@end example
+
+@noindent
+This transformation is allowed by the C standard, but it is invalid for
+wraparound arithmetic when @code{INT_MAX / 53 < hi}, because then the
+overflow in computing expressions like @code{hi * 53} can cause the
+expression @code{i <= hi} to yield a different value from the
+transformed expression @code{ic <= hic}.
+
+For this reason, compilers that use loop induction and similar
+techniques often do not support reliable wraparound arithmetic when a
+loop induction variable like @code{ic} is involved. Since loop
+induction variables are generated by the compiler, and are not visible
+in the source code, it is not always trivial to say whether the problem
+affects your code.
+
+Hardly any code actually depends on wraparound arithmetic in cases like
+these, so in practice these loop induction optimizations are almost
+always useful. However, edge cases in this area can cause problems.
+For example:
+
+@example
+int j;
+for (j = 1; 0 < j; j *= 2)
+ test (j);
+@end example
+
+@noindent
+Here, the loop attempts to iterate through all powers of 2 that
+@code{int} can represent, but the C standard allows a compiler to
+optimize away the comparison and generate an infinite loop,
+under the argument that behavior is undefined on overflow. As of this
+writing this optimization is not done by any production version of
+GCC with @option{-O2}, but it might be performed by other
+compilers, or by more aggressive GCC optimization options,
+and the GCC developers have not decided whether it will
+continue to work with GCC and @option{-O2}.
+
+@node Signed Overflow Advice
+@subsection Practical Advice for Signed Overflow Issues
+@cindex integer overflow
+@cindex overflow, signed integer
+@cindex signed integer overflow
+@cindex wraparound arithmetic
+
+Ideally the safest approach is to avoid signed integer overflow
+entirely. For example, instead of multiplying two signed integers, you
+can convert them to unsigned integers, multiply the unsigned values,
+then test whether the result is in signed range.
+
+Rewriting code in this way will be inconvenient, though, particularly if
+the signed values might be negative. Also, it may hurt
+performance. Using unsigned arithmetic to check for overflow is
+particularly painful to do portably and efficiently when dealing with an
+integer type like @code{uid_t} whose width and signedness vary from
+platform to platform.
+
+Furthermore, many C applications pervasively assume wraparound behavior
+and typically it is not easy to find and remove all these assumptions.
+Hence it is often useful to maintain nonstandard code that assumes
+wraparound on overflow, instead of rewriting the code. The rest of this
+section attempts to give practical advice for this situation.
+
+If your code wants to detect signed integer overflow in @code{sum = a +
+b}, it is generally safe to use an expression like @code{(sum < a) != (b
+< 0)}.
+
+If your code uses a signed loop index, make sure that the index cannot
+overflow, along with all signed expressions derived from the index.
+Here is a contrived example of problematic code with two instances of
+overflow.
+
+@example
+for (i = INT_MAX - 10; i <= INT_MAX; i++)
+ if (i + 1 < 0)
+ @{
+ report_overflow ();
+ break;
+ @}
+@end example
+
+@noindent
+Because of the two overflows, a compiler might optimize away or
+transform the two comparisons in a way that is incompatible with the
+wraparound assumption.
+
+If your code uses an expression like @code{(i * 2000) / 1000} and you
+actually want the multiplication to wrap around on overflow, use
+unsigned arithmetic
+to do it, e.g., @code{((int) (i * 2000u)) / 1000}.
+
+If your code assumes wraparound behavior and you want to insulate it
+against any GCC optimizations that would fail to support that
+behavior, you should use GCC's @option{-fwrapv} option, which
+causes signed overflow to wrap around reliably (except for division and
+remainder, as discussed in the next section).
+
+If you need to port to platforms where signed integer overflow does not
+reliably wrap around (e.g., due to hardware overflow checking, or to
+highly aggressive optimizations), you should consider debugging with
+GCC's @option{-ftrapv} option, which causes signed overflow to
+raise an exception.
+
+@node Signed Integer Division
+@subsection Signed Integer Division and Integer Overflow
+@cindex division, integer
+
+Overflow in signed
+integer division is not always harmless: for example, on CPUs of the
+i386 family, dividing @code{INT_MIN} by @code{-1} yields a SIGFPE signal
+which by default terminates the program. Worse, taking the remainder
+of these two values typically yields the same signal on these CPUs,
+even though the C standard requires @code{INT_MIN % -1} to yield zero
+because the expression does not overflow.
+
+@node Preprocessor Arithmetic
+@section Preprocessor Arithmetic
+@cindex preprocessor arithmetic
+
+In C99, preprocessor arithmetic, used for @code{#if} expressions, must
+be evaluated as if all signed values are of type @code{intmax_t} and all
+unsigned values of type @code{uintmax_t}. Many compilers are buggy in
+this area, though. For example, as of 2007, Sun C mishandles @code{#if
+LLONG_MIN < 0} on a platform with 32-bit @code{long int} and 64-bit
+@code{long long int}. Also, some older preprocessors mishandle
+constants ending in @code{LL}. To work around these problems, you can
+compute the value of expressions like @code{LONG_MAX < LLONG_MAX} at
+@code{configure}-time rather than at @code{#if}-time.
+
+@node Null Pointers
+@section Properties of Null Pointers
+@cindex null pointers
+
+Most modern hosts reliably fail when you attempt to dereference a null
+pointer.
+
+On almost all modern hosts, null pointers use an all-bits-zero internal
+representation, so you can reliably use @code{memset} with 0 to set all
+the pointers in an array to null values.
+
+If @code{p} is a null pointer to an object type, the C expression
+@code{p + 0} always evaluates to @code{p} on modern hosts, even though
+the standard says that it has undefined behavior.
+
+@node Buffer Overruns
+@section Buffer Overruns and Subscript Errors
+@cindex buffer overruns
+
+Buffer overruns and subscript errors are the most common dangerous
+errors in C programs. They result in undefined behavior because storing
+outside an array typically modifies storage that is used by some other
+object, and most modern systems lack runtime checks to catch these
+errors. Programs should not rely on buffer overruns being caught.
+
+There is one exception to the usual rule that a portable program cannot
+address outside an array. In C, it is valid to compute the address just
+past an object, e.g., @code{&a[N]} where @code{a} has @code{N} elements,
+so long as you do not dereference the resulting pointer. But it is not
+valid to compute the address just before an object, e.g., @code{&a[-1]};
+nor is it valid to compute two past the end, e.g., @code{&a[N+1]}. On
+most platforms @code{&a[-1] < &a[0] && &a[N] < &a[N+1]}, but this is not
+reliable in general, and it is usually easy enough to avoid the
+potential portability problem, e.g., by allocating an extra unused array
+element at the start or end.
+
+@uref{http://@/valgrind.org/, Valgrind} can catch many overruns.
+GCC
+users might also consider using the @option{-fmudflap} option to catch
+overruns.
+
+Buffer overruns are usually caused by off-by-one errors, but there are
+more subtle ways to get them.
+
+Using @code{int} values to index into an array or compute array sizes
+causes problems on typical 64-bit hosts where an array index might
+be @math{2^{31}} or larger. Index values of type @code{size_t} avoid this
+problem, but cannot be negative. Index values of type @code{ptrdiff_t}
+are signed, and are wide enough in practice.
+
+If you add or multiply two numbers to calculate an array size, e.g.,
+@code{malloc (x * sizeof y + z)}, havoc ensues if the addition or
+multiplication overflows.
+
+Many implementations of the @code{alloca} function silently misbehave
+and can generate buffer overflows if given sizes that are too large.
+The size limits are implementation dependent, but are at least 4000
+bytes on all platforms that we know about.
+
+The standard functions @code{asctime}, @code{asctime_r}, @code{ctime},
+@code{ctime_r}, and @code{gets} are prone to buffer overflows, and
+portable code should not use them unless the inputs are known to be
+within certain limits. The time-related functions can overflow their
+buffers if given timestamps out of range (e.g., a year less than -999
+or greater than 9999). Time-related buffer overflows cannot happen with
+recent-enough versions of the GNU C library, but are possible
+with other
+implementations. The @code{gets} function is the worst, since it almost
+invariably overflows its buffer when presented with an input line larger
+than the buffer.
+
+@node Volatile Objects
+@section Volatile Objects
+@cindex volatile objects
+
+The keyword @code{volatile} is often misunderstood in portable code.
+Its use inhibits some memory-access optimizations, but programmers often
+wish that it had a different meaning than it actually does.
+
+@code{volatile} was designed for code that accesses special objects like
+memory-mapped device registers whose contents spontaneously change.
+Such code is inherently low-level, and it is difficult to specify
+portably what @code{volatile} means in these cases. The C standard
+says, ``What constitutes an access to an object that has
+volatile-qualified type is implementation-defined,'' so in theory each
+implementation is supposed to fill in the gap by documenting what
+@code{volatile} means for that implementation. In practice, though,
+this documentation is usually absent or incomplete.
+
+One area of confusion is the distinction between objects defined with
+volatile types, and volatile lvalues. From the C standard's point of
+view, an object defined with a volatile type has externally visible
+behavior. You can think of such objects as having little oscilloscope
+probes attached to them, so that the user can observe some properties of
+accesses to them, just as the user can observe data written to output
+files. However, the standard does not make it clear whether users can
+observe accesses by volatile lvalues to ordinary objects. For example:
+
+@example
+/* Declare and access a volatile object.
+ Accesses to X are "visible" to users. */
+static int volatile x;
+x = 1;
+
+/* Access two ordinary objects via a volatile lvalue.
+ It's not clear whether accesses to *P are "visible". */
+int y;
+int *z = malloc (sizeof (int));
+int volatile *p;
+p = &y;
+*p = 1;
+p = z;
+*p = 1;
+@end example
+
+Programmers often wish that @code{volatile} meant ``Perform the memory
+access here and now, without merging several memory accesses, without
+changing the memory word size, and without reordering.'' But the C
+standard does not require this. For objects defined with a volatile
+type, accesses must be done before the next sequence point; but
+otherwise merging, reordering, and word-size change is allowed. Worse,
+it is not clear from the standard whether volatile lvalues provide more
+guarantees in general than nonvolatile lvalues, if the underlying
+objects are ordinary.
+
+Even when accessing objects defined with a volatile type,
+the C standard allows only
+extremely limited signal handlers: the behavior is undefined if a signal
+handler reads any nonlocal object, or writes to any nonlocal object
+whose type is not @code{sig_atomic_t volatile}, or calls any standard
+library function other than @code{abort}, @code{signal}, and (if C99)
+@code{_Exit}. Hence C compilers need not worry about a signal handler
+disturbing ordinary computation, unless the computation accesses a
+@code{sig_atomic_t volatile} lvalue that is not a local variable.
+(There is an obscure exception for accesses via a pointer to a volatile
+character, since it may point into part of a @code{sig_atomic_t
+volatile} object.) Posix
+adds to the list of library functions callable from a portable signal
+handler, but otherwise is like the C standard in this area.
+
+Some C implementations allow memory-access optimizations within each
+translation unit, such that actual behavior agrees with the behavior
+required by the standard only when calling a function in some other
+translation unit, and a signal handler acts like it was called from a
+different translation unit. The C standard hints that in these
+implementations, objects referred to by signal handlers ``would require
+explicit specification of @code{volatile} storage, as well as other
+implementation-defined restrictions.'' But unfortunately even for this
+special case these other restrictions are often not documented well.
+@xref{Volatiles, , When is a Volatile Object Accessed?, gcc, Using the
+GNU Compiler Collection (GCC)}, for some
+restrictions imposed by GCC. @xref{Defining Handlers, ,
+Defining Signal Handlers, libc, The GNU C Library}, for some
+restrictions imposed by the GNU C library. Restrictions
+differ on other platforms.
+
+If possible, it is best to use a signal handler that fits within the
+limits imposed by the C and Posix standards.
+
+If this is not practical, you can try the following rules of thumb. A
+signal handler should access only volatile lvalues, preferably lvalues
+that refer to objects defined with a volatile type, and should not
+assume that the accessed objects have an internally consistent state
+if they are larger than a machine word. Furthermore, installers
+should employ compilers and compiler options that are commonly used
+for building operating system kernels, because kernels often need more
+from @code{volatile} than the C Standard requires, and installers who
+compile an application in a similar environment can sometimes benefit
+from the extra constraints imposed by kernels on compilers.
+Admittedly we are handwaving somewhat here, as there are few
+guarantees in this area; the rules of thumb may help to fix some bugs
+but there is a good chance that they will not fix them all.
+
+For @code{volatile}, C++ has the same problems that C does.
+Multithreaded applications have even more problems with @code{volatile},
+but they are beyond the scope of this section.
+
+The bottom line is that using @code{volatile} typically hurts
+performance but should not hurt correctness. In some cases its use
+does help correctness, but these cases are often so poorly understood
+that all too often adding @code{volatile} to a data structure merely
+alleviates some symptoms of a bug while not fixing the bug in general.
+
+@node Floating Point Portability
+@section Floating Point Portability
+@cindex floating point
+
+Almost all modern systems use IEEE-754 floating point, and it is safe to
+assume IEEE-754 in most portable code these days. For more information,
+please see David Goldberg's classic paper
+@uref{http://@/www.validlab.com/@/goldberg/@/paper.pdf, What Every Computer
+Scientist Should Know About Floating-Point Arithmetic}.
+
+@node Exiting Portably
+@section Exiting Portably
+@cindex exiting portably
+
+A C or C++ program can exit with status @var{N} by returning
+@var{N} from the @code{main} function. Portable programs are supposed
+to exit either with status 0 or @code{EXIT_SUCCESS} to succeed, or with
+status @code{EXIT_FAILURE} to fail, but in practice it is portable to
+fail by exiting with status 1, and test programs that assume Posix can
+fail by exiting with status values from 1 through 255. Programs on
+SunOS 2.0 (1985) through 3.5.2 (1988) incorrectly exited with zero
+status when @code{main} returned nonzero, but ancient systems like these
+are no longer of practical concern.
+
+A program can also exit with status @var{N} by passing @var{N} to the
+@code{exit} function, and a program can fail by calling the @code{abort}
+function. If a program is specialized to just some platforms, it can fail
+by calling functions specific to those platforms, e.g., @code{_exit}
+(Posix) and @code{_Exit} (C99). However, like other functions, an exit
+function should be declared, typically by including a header. For
+example, if a C program calls @code{exit}, it should include @file{stdlib.h}
+either directly or via the default includes (@pxref{Default Includes}).
+
+A program can fail due to undefined behavior such as dereferencing a null
+pointer, but this is not recommended as undefined behavior allows an
+implementation to do whatever it pleases and this includes exiting
+successfully.
+
+
+@c ================================================== Manual Configuration
+
+@node Manual Configuration
+@chapter Manual Configuration
+
+A few kinds of features can't be guessed automatically by running test
+programs. For example, the details of the object-file format, or
+special options that need to be passed to the compiler or linker. You
+can check for such features using ad-hoc means, such as having
+@command{configure} check the output of the @code{uname} program, or
+looking for libraries that are unique to particular systems. However,
+Autoconf provides a uniform method for handling unguessable features.
+
+@menu
+* Specifying Target Triplets:: Specifying target triplets
+* Canonicalizing:: Getting the canonical system type
+* Using System Type:: What to do with the system type
+@end menu
+
+@node Specifying Target Triplets
+@section Specifying target triplets
+@cindex System type
+@cindex Target triplet
+@c This node used to be named Specifying Names. The @anchor allows old
+@c links to still work.
+@anchor{Specifying Names}
+
+Autoconf-generated
+@command{configure} scripts can make decisions based on a canonical name
+for the system type, or @dfn{target triplet}, which has the form:
+@samp{@var{cpu}-@var{vendor}-@var{os}}, where @var{os} can be
+@samp{@var{system}} or @samp{@var{kernel}-@var{system}}
+
+@command{configure} can usually guess the canonical name for the type of
+system it's running on. To do so it runs a script called
+@command{config.guess}, which infers the name using the @code{uname}
+command or symbols predefined by the C preprocessor.
+
+Alternately, the user can specify the system type with command line
+arguments to @command{configure} (@pxref{System Type}. Doing so is
+necessary when
+cross-compiling. In the most complex case of cross-compiling, three
+system types are involved. The options to specify them are:
+
+@table @option
+@item --build=@var{build-type}
+the type of system on which the package is being configured and
+compiled. It defaults to the result of running @command{config.guess}.
+Specifying a @var{build-type} that differs from @var{host-type} enables
+cross-compilation mode.
+
+@item --host=@var{host-type}
+the type of system on which the package runs. By default it is the
+same as the build machine. Specifying a @var{host-type} that differs
+from @var{build-type}, when @var{build-type} was also explicitly
+specified, enables cross-compilation mode.
+
+@item --target=@var{target-type}
+the type of system for which any compiler tools in the package
+produce code (rarely needed). By default, it is the same as host.
+@end table
+
+If you mean to override the result of @command{config.guess}, use
+@option{--build}, not @option{--host}, since the latter enables
+cross-compilation. For historical reasons,
+whenever you specify @option{--host},
+be sure to specify @option{--build} too; this will be fixed in the
+future. So, to enter cross-compilation mode, use a command like this
+
+@example
+./configure --build=i686-pc-linux-gnu --host=m68k-coff
+@end example
+
+@noindent
+Note that if you do not specify @option{--host}, @command{configure}
+fails if it can't run the code generated by the specified compiler. For
+example, configuring as follows fails:
+
+@example
+./configure CC=m68k-coff-gcc
+@end example
+
+When cross-compiling, @command{configure} will warn about any tools
+(compilers, linkers, assemblers) whose name is not prefixed with the
+host type. This is an aid to users performing cross-compilation.
+Continuing the example above, if a cross-compiler named @command{cc} is
+used with a native @command{pkg-config}, then libraries found by
+@command{pkg-config} will likely cause subtle build failures; but using
+the names @command{m68k-coff-cc} and @command{m68k-coff-pkg-config}
+avoids any confusion. Avoiding the warning is as simple as creating the
+correct symlinks naming the cross tools.
+
+@cindex @command{config.sub}
+@command{configure} recognizes short aliases for many system types; for
+example, @samp{decstation} can be used instead of
+@samp{mips-dec-ultrix4.2}. @command{configure} runs a script called
+@command{config.sub} to canonicalize system type aliases.
+
+This section deliberately omits the description of the obsolete
+interface; see @ref{Hosts and Cross-Compilation}.
+
+
+@node Canonicalizing
+@section Getting the Canonical System Type
+@cindex System type
+@cindex Canonical system type
+
+The following macros make the system type available to @command{configure}
+scripts.
+
+@ovindex build_alias
+@ovindex host_alias
+@ovindex target_alias
+
+The variables @samp{build_alias}, @samp{host_alias}, and
+@samp{target_alias} are always exactly the arguments of @option{--build},
+@option{--host}, and @option{--target}; in particular, they are left empty
+if the user did not use them, even if the corresponding
+@code{AC_CANONICAL} macro was run. Any configure script may use these
+variables anywhere. These are the variables that should be used when in
+interaction with the user.
+
+If you need to recognize some special environments based on their system
+type, run the following macros to get canonical system names. These
+variables are not set before the macro call.
+
+If you use these macros, you must distribute @command{config.guess} and
+@command{config.sub} along with your source code. @xref{Output}, for
+information about the @code{AC_CONFIG_AUX_DIR} macro which you can use
+to control in which directory @command{configure} looks for those scripts.
+
+
+@defmac AC_CANONICAL_BUILD
+@acindex{CANONICAL_BUILD}
+@ovindex build
+@ovindex build_cpu
+@ovindex build_vendor
+@ovindex build_os
+Compute the canonical build-system type variable, @code{build}, and its
+three individual parts @code{build_cpu}, @code{build_vendor}, and
+@code{build_os}.
+
+If @option{--build} was specified, then @code{build} is the
+canonicalization of @code{build_alias} by @command{config.sub},
+otherwise it is determined by the shell script @command{config.guess}.
+@end defmac
+
+@defmac AC_CANONICAL_HOST
+@acindex{CANONICAL_HOST}
+@ovindex host
+@ovindex host_cpu
+@ovindex host_vendor
+@ovindex host_os
+Compute the canonical host-system type variable, @code{host}, and its
+three individual parts @code{host_cpu}, @code{host_vendor}, and
+@code{host_os}.
+
+If @option{--host} was specified, then @code{host} is the
+canonicalization of @code{host_alias} by @command{config.sub},
+otherwise it defaults to @code{build}.
+@end defmac
+
+@defmac AC_CANONICAL_TARGET
+@acindex{CANONICAL_TARGET}
+@ovindex target
+@ovindex target_cpu
+@ovindex target_vendor
+@ovindex target_os
+Compute the canonical target-system type variable, @code{target}, and its
+three individual parts @code{target_cpu}, @code{target_vendor}, and
+@code{target_os}.
+
+If @option{--target} was specified, then @code{target} is the
+canonicalization of @code{target_alias} by @command{config.sub},
+otherwise it defaults to @code{host}.
+@end defmac
+
+Note that there can be artifacts due to the backward compatibility
+code. @xref{Hosts and Cross-Compilation}, for more.
+
+@node Using System Type
+@section Using the System Type
+
+In @file{configure.ac} the system type is generally used by one or more
+@code{case} statements to select system-specifics. Shell wildcards can
+be used to match a group of system types.
+
+For example, an extra assembler code object file could be chosen, giving
+access to a CPU cycle counter register. @code{$(CYCLE_OBJ)} in the
+following would be used in a makefile to add the object to a
+program or library.
+
+@example
+AS_CASE([$host],
+ [alpha*-*-*], [CYCLE_OBJ=rpcc.o],
+ [i?86-*-*], [CYCLE_OBJ=rdtsc.o],
+ [CYCLE_OBJ=""]
+)
+AC_SUBST([CYCLE_OBJ])
+@end example
+
+@code{AC_CONFIG_LINKS} (@pxref{Configuration Links}) is another good way
+to select variant source files, for example optimized code for some
+CPUs. The configured CPU type doesn't always indicate exact CPU types,
+so some runtime capability checks may be necessary too.
+
+@example
+case $host in
+ alpha*-*-*) AC_CONFIG_LINKS([dither.c:alpha/dither.c]) ;;
+ powerpc*-*-*) AC_CONFIG_LINKS([dither.c:powerpc/dither.c]) ;;
+ *-*-*) AC_CONFIG_LINKS([dither.c:generic/dither.c]) ;;
+esac
+@end example
+
+The host system type can also be used to find cross-compilation tools
+with @code{AC_CHECK_TOOL} (@pxref{Generic Programs}).
+
+The above examples all show @samp{$host}, since this is where the code
+is going to run. Only rarely is it necessary to test @samp{$build}
+(which is where the build is being done).
+
+Whenever you're tempted to use @samp{$host} it's worth considering
+whether some sort of probe would be better. New system types come along
+periodically or previously missing features are added. Well-written
+probes can adapt themselves to such things, but hard-coded lists of
+names can't. Here are some guidelines,
+
+@itemize @bullet
+@item
+Availability of libraries and library functions should always be checked
+by probing.
+@item
+Variant behavior of system calls is best identified with runtime tests
+if possible, but bug workarounds or obscure difficulties might have to
+be driven from @samp{$host}.
+@item
+Assembler code is inevitably highly CPU-specific and is best selected
+according to @samp{$host_cpu}.
+@item
+Assembler variations like underscore prefix on globals or ELF versus
+COFF type directives are however best determined by probing, perhaps
+even examining the compiler output.
+@end itemize
+
+@samp{$target} is for use by a package creating a compiler or similar.
+For ordinary packages it's meaningless and should not be used. It
+indicates what the created compiler should generate code for, if it can
+cross-compile. @samp{$target} generally selects various hard-coded CPU
+and system conventions, since usually the compiler or tools under
+construction themselves determine how the target works.
+
+
+@c ===================================================== Site Configuration.
+
+@node Site Configuration
+@chapter Site Configuration
+
+@command{configure} scripts support several kinds of local configuration
+decisions. There are ways for users to specify where external software
+packages are, include or exclude optional features, install programs
+under modified names, and set default values for @command{configure}
+options.
+
+@menu
+* Help Formatting:: Customizing @samp{configure --help}
+* External Software:: Working with other optional software
+* Package Options:: Selecting optional features
+* Pretty Help Strings:: Formatting help string
+* Option Checking:: Controlling checking of @command{configure} options
+* Site Details:: Configuring site details
+* Transforming Names:: Changing program names when installing
+* Site Defaults:: Giving @command{configure} local defaults
+@end menu
+
+@node Help Formatting
+@section Controlling Help Output
+
+Users consult @samp{configure --help} to learn of configuration
+decisions specific to your package. By default, @command{configure}
+breaks this output into sections for each type of option; within each
+section, help strings appear in the order @file{configure.ac} defines
+them:
+
+@example
+Optional Features:
+ @dots{}
+ --enable-bar include bar
+
+Optional Packages:
+ @dots{}
+ --with-foo use foo
+@end example
+
+@defmac AC_PRESERVE_HELP_ORDER
+@acindex{PRESERVE_HELP_ORDER}
+
+Request an alternate @option{--help} format, in which options of all
+types appear together, in the order defined. Call this macro before any
+@code{AC_ARG_ENABLE} or @code{AC_ARG_WITH}.
+
+@example
+Optional Features and Packages:
+ @dots{}
+ --enable-bar include bar
+ --with-foo use foo
+@end example
+
+@end defmac
+
+@node External Software
+@section Working With External Software
+@cindex External software
+
+Some packages require, or can optionally use, other software packages
+that are already installed. The user can give @command{configure}
+command line options to specify which such external software to use.
+The options have one of these forms:
+
+@c FIXME: Can't use @ovar here, Texinfo 4.0 goes lunatic and emits something
+@c awful.
+@example
+--with-@var{package}@r{[}=@var{arg}@r{]}
+--without-@var{package}
+@end example
+
+For example, @option{--with-gnu-ld} means work with the GNU linker
+instead of some other linker. @option{--with-x} means work with The X
+Window System.
+
+The user can give an argument by following the package name with
+@samp{=} and the argument. Giving an argument of @samp{no} is for
+packages that are used by default; it says to @emph{not} use the
+package. An argument that is neither @samp{yes} nor @samp{no} could
+include a name or number of a version of the other package, to specify
+more precisely which other package this program is supposed to work
+with. If no argument is given, it defaults to @samp{yes}.
+@option{--without-@var{package}} is equivalent to
+@option{--with-@var{package}=no}.
+
+Normally @command{configure} scripts complain about
+@option{--with-@var{package}} options that they do not support.
+@xref{Option Checking}, for details, and for how to override the
+defaults.
+
+For each external software package that may be used, @file{configure.ac}
+should call @code{AC_ARG_WITH} to detect whether the @command{configure}
+user asked to use it. Whether each package is used or not by default,
+and which arguments are valid, is up to you.
+
+@anchor{AC_ARG_WITH}
+@defmac AC_ARG_WITH (@var{package}, @var{help-string}, @
+ @ovar{action-if-given}, @ovar{action-if-not-given})
+@acindex{ARG_WITH}
+If the user gave @command{configure} the option @option{--with-@var{package}}
+or @option{--without-@var{package}}, run shell commands
+@var{action-if-given}. If neither option was given, run shell commands
+@var{action-if-not-given}. The name @var{package} indicates another
+software package that this program should work with. It should consist
+only of alphanumeric characters, dashes, plus signs, and dots.
+
+The option's argument is available to the shell commands
+@var{action-if-given} in the shell variable @code{withval}, which is
+actually just the value of the shell variable named
+@code{with_@var{package}}, with any non-alphanumeric characters in
+@var{package} changed into @samp{_}. You may use that variable instead,
+if you wish.
+
+The argument @var{help-string} is a description of the option that
+looks like this:
+@example
+ --with-readline support fancy command line editing
+@end example
+
+@noindent
+@var{help-string} may be more than one line long, if more detail is
+needed. Just make sure the columns line up in @samp{configure
+--help}. Avoid tabs in the help string. The easiest way to provide the
+proper leading whitespace is to format your @var{help-string} with the macro
+@code{AS_HELP_STRING} (@pxref{Pretty Help Strings}).
+
+The following example shows how to use the @code{AC_ARG_WITH} macro in
+a common situation. You want to let the user decide whether to enable
+support for an external library (e.g., the readline library); if the user
+specified neither @option{--with-readline} nor @option{--without-readline},
+you want to enable support for readline only if the library is available
+on the system.
+
+@c FIXME: Remove AS_IF when the problem of AC_REQUIRE within `if' is solved.
+@example
+AC_ARG_WITH([readline],
+ [AS_HELP_STRING([--with-readline],
+ [support fancy command line editing @@<:@@default=check@@:>@@])],
+ [],
+ [with_readline=check])
+
+LIBREADLINE=
+AS_IF([test "x$with_readline" != xno],
+ [AC_CHECK_LIB([readline], [main],
+ [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
+ AC_DEFINE([HAVE_LIBREADLINE], [1],
+ [Define if you have libreadline])
+ ],
+ [if test "x$with_readline" != xcheck; then
+ AC_MSG_FAILURE(
+ [--with-readline was given, but test for readline failed])
+ fi
+ ], -lncurses)])
+@end example
+
+The next example shows how to use @code{AC_ARG_WITH} to give the user the
+possibility to enable support for the readline library, in case it is still
+experimental and not well tested, and is therefore disabled by default.
+
+@c FIXME: Remove AS_IF when the problem of AC_REQUIRE within `if' is solved.
+@example
+AC_ARG_WITH([readline],
+ [AS_HELP_STRING([--with-readline],
+ [enable experimental support for readline])],
+ [],
+ [with_readline=no])
+
+LIBREADLINE=
+AS_IF([test "x$with_readline" != xno],
+ [AC_CHECK_LIB([readline], [main],
+ [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
+ AC_DEFINE([HAVE_LIBREADLINE], [1],
+ [Define if you have libreadline])
+ ],
+ [AC_MSG_FAILURE(
+ [--with-readline was given, but test for readline failed])],
+ [-lncurses])])
+@end example
+
+The last example shows how to use @code{AC_ARG_WITH} to give the user the
+possibility to disable support for the readline library, given that it is
+an important feature and that it should be enabled by default.
+
+@c FIXME: Remove AS_IF when the problem of AC_REQUIRE within `if' is solved.
+@example
+AC_ARG_WITH([readline],
+ [AS_HELP_STRING([--without-readline],
+ [disable support for readline])],
+ [],
+ [with_readline=yes])
+
+LIBREADLINE=
+AS_IF([test "x$with_readline" != xno],
+ [AC_CHECK_LIB([readline], [main],
+ [AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
+ AC_DEFINE([HAVE_LIBREADLINE], [1],
+ [Define if you have libreadline])
+ ],
+ [AC_MSG_FAILURE(
+ [readline test failed (--without-readline to disable)])],
+ [-lncurses])])
+@end example
+
+These three examples can be easily adapted to the case where
+@code{AC_ARG_ENABLE} should be preferred to @code{AC_ARG_WITH} (see
+@ref{Package Options}).
+@end defmac
+
+@node Package Options
+@section Choosing Package Options
+@cindex Package options
+@cindex Options, package
+
+If a software package has optional compile-time features, the user can
+give @command{configure} command line options to specify whether to
+compile them. The options have one of these forms:
+
+@c FIXME: Can't use @ovar here, Texinfo 4.0 goes lunatic and emits something
+@c awful.
+@example
+--enable-@var{feature}@r{[}=@var{arg}@r{]}
+--disable-@var{feature}
+@end example
+
+These options allow users to choose which optional features to build and
+install. @option{--enable-@var{feature}} options should never make a
+feature behave differently or cause one feature to replace another.
+They should only cause parts of the program to be built rather than left
+out.
+
+The user can give an argument by following the feature name with
+@samp{=} and the argument. Giving an argument of @samp{no} requests
+that the feature @emph{not} be made available. A feature with an
+argument looks like @option{--enable-debug=stabs}. If no argument is
+given, it defaults to @samp{yes}. @option{--disable-@var{feature}} is
+equivalent to @option{--enable-@var{feature}=no}.
+
+Normally @command{configure} scripts complain about
+@option{--enable-@var{package}} options that they do not support.
+@xref{Option Checking}, for details, and for how to override the
+defaults.
+
+For each optional feature, @file{configure.ac} should call
+@code{AC_ARG_ENABLE} to detect whether the @command{configure} user asked
+to include it. Whether each feature is included or not by default, and
+which arguments are valid, is up to you.
+
+@anchor{AC_ARG_ENABLE}
+@defmac AC_ARG_ENABLE (@var{feature}, @var{help-string}, @
+ @ovar{action-if-given}, @ovar{action-if-not-given})
+@acindex{ARG_ENABLE}
+If the user gave @command{configure} the option
+@option{--enable-@var{feature}} or @option{--disable-@var{feature}}, run
+shell commands @var{action-if-given}. If neither option was given, run
+shell commands @var{action-if-not-given}. The name @var{feature}
+indicates an optional user-level facility. It should consist only of
+alphanumeric characters, dashes, plus signs, and dots.
+
+The option's argument is available to the shell commands
+@var{action-if-given} in the shell variable @code{enableval}, which is
+actually just the value of the shell variable named
+@code{enable_@var{feature}}, with any non-alphanumeric characters in
+@var{feature} changed into @samp{_}. You may use that variable instead,
+if you wish. The @var{help-string} argument is like that of
+@code{AC_ARG_WITH} (@pxref{External Software}).
+
+You should format your @var{help-string} with the macro
+@code{AS_HELP_STRING} (@pxref{Pretty Help Strings}).
+
+See the examples suggested with the definition of @code{AC_ARG_WITH}
+(@pxref{External Software}) to get an idea of possible applications of
+@code{AC_ARG_ENABLE}.
+@end defmac
+
+@node Pretty Help Strings
+@section Making Your Help Strings Look Pretty
+@cindex Help strings
+
+Properly formatting the @samp{help strings} which are used in
+@code{AC_ARG_WITH} (@pxref{External Software}) and @code{AC_ARG_ENABLE}
+(@pxref{Package Options}) can be challenging. Specifically, you want
+your own @samp{help strings} to line up in the appropriate columns of
+@samp{configure --help} just like the standard Autoconf @samp{help
+strings} do. This is the purpose of the @code{AS_HELP_STRING} macro.
+
+@anchor{AS_HELP_STRING}
+@defmac AS_HELP_STRING (@var{left-hand-side}, @var{right-hand-side} @
+ @dvar{indent-column, 26}, @dvar{wrap-column, 79})
+@asindex{HELP_STRING}
+
+Expands into a help string that looks pretty when the user executes
+@samp{configure --help}. It is typically used in @code{AC_ARG_WITH}
+(@pxref{External Software}) or @code{AC_ARG_ENABLE} (@pxref{Package
+Options}). The following example makes this clearer.
+
+@example
+AC_ARG_WITH([foo],
+ [AS_HELP_STRING([--with-foo],
+ [use foo (default is no)])],
+ [use_foo=$withval],
+ [use_foo=no])
+@end example
+
+Then the last few lines of @samp{configure --help} appear like
+this:
+
+@example
+--enable and --with options recognized:
+ --with-foo use foo (default is no)
+@end example
+
+Macro expansion is performed on the first argument. However, the second
+argument of @code{AS_HELP_STRING} is treated as a whitespace separated
+list of text to be reformatted, and is not subject to macro expansion.
+Since it is not expanded, it should not be double quoted.
+@xref{Autoconf Language}, for a more detailed explanation.
+
+The @code{AS_HELP_STRING} macro is particularly helpful when the
+@var{left-hand-side} and/or @var{right-hand-side} are composed of macro
+arguments, as shown in the following example. Be aware that
+@var{left-hand-side} may not expand to unbalanced quotes,
+although quadrigraphs can be used.
+
+@example
+AC_DEFUN([MY_ARG_WITH],
+ [AC_ARG_WITH(m4_translit([[$1]], [_], [-]),
+ [AS_HELP_STRING([--with-m4_translit([$1], [_], [-])],
+ [use $1 (default is $2)])],
+ [use_[]$1=$withval],
+ [use_[]$1=$2])])
+MY_ARG_WITH([a_b], [no])
+@end example
+@noindent
+Here, the last few lines of @samp{configure --help} will include:
+
+@example
+--enable and --with options recognized:
+ --with-a-b use a_b (default is no)
+@end example
+
+The parameters @var{indent-column} and @var{wrap-column} were introduced
+in Autoconf 2.62. Generally, they should not be specified; they exist
+for fine-tuning of the wrapping.
+@example
+AS_HELP_STRING([--option], [description of option])
+@result{} --option description of option
+AS_HELP_STRING([--option], [description of option], [15], [30])
+@result{} --option description of
+@result{} option
+@end example
+@end defmac
+
+
+@node Option Checking
+@section Controlling Checking of @command{configure} Options
+@cindex Options, Package
+
+The @command{configure} script checks its command-line options against a
+list of known options, like @option{--help} or @option{--config-cache}.
+An unknown option ordinarily indicates a mistake by the user and
+@command{configure} halts with an error. However, by default unknown
+@option{--with-@var{package}} and @option{--enable-@var{feature}}
+options elicit only a warning, to support configuring entire source
+trees.
+
+Source trees often contain multiple packages with a top-level
+@command{configure} script that uses the @code{AC_CONFIG_SUBDIRS} macro
+(@pxref{Subdirectories}). Because the packages generally support
+different @option{--with-@var{package}} and
+@option{--enable-@var{feature}} options, the GNU Coding
+Standards say they must accept unrecognized options without halting.
+Even a warning message is undesirable here, so @code{AC_CONFIG_SUBDIRS}
+automatically disables the warnings.
+
+This default behavior may be modified in two ways. First, the installer
+can invoke @code{configure --disable-option-checking} to disable
+these warnings, or invoke @code{configure --enable-option-checking=fatal}
+options to turn them into fatal errors, respectively. Second, the
+maintainer can use @code{AC_DISABLE_OPTION_CHECKING}.
+
+@defmac AC_DISABLE_OPTION_CHECKING
+@acindex{DISABLE_OPTION_CHECKING}
+
+By default, disable warnings related to any unrecognized
+@option{--with-@var{package}} or @option{--enable-@var{feature}}
+options. This is implied by @code{AC_CONFIG_SUBDIRS}.
+
+The installer can override this behavior by passing
+@option{--enable-option-checking} (enable warnings) or
+@option{--enable-option-checking=fatal} (enable errors) to
+@command{configure}.
+@end defmac
+
+
+@node Site Details
+@section Configuring Site Details
+@cindex Site details
+
+Some software packages require complex site-specific information. Some
+examples are host names to use for certain services, company names, and
+email addresses to contact. Since some configuration scripts generated
+by Metaconfig ask for such information interactively, people sometimes
+wonder how to get that information in Autoconf-generated configuration
+scripts, which aren't interactive.
+
+Such site configuration information should be put in a file that is
+edited @emph{only by users}, not by programs. The location of the file
+can either be based on the @code{prefix} variable, or be a standard
+location such as the user's home directory. It could even be specified
+by an environment variable. The programs should examine that file at
+runtime, rather than at compile time. Runtime configuration is more
+convenient for users and makes the configuration process simpler than
+getting the information while configuring. @xref{Directory Variables, ,
+Variables for Installation Directories, standards, The GNU Coding
+Standards}, for more information on where to put data files.
+
+@node Transforming Names
+@section Transforming Program Names When Installing
+@cindex Transforming program names
+@cindex Program names, transforming
+
+Autoconf supports changing the names of programs when installing them.
+In order to use these transformations, @file{configure.ac} must call the
+macro @code{AC_ARG_PROGRAM}.
+
+@defmac AC_ARG_PROGRAM
+@acindex{ARG_PROGRAM}
+@ovindex program_transform_name
+Place in output variable @code{program_transform_name} a sequence of
+@code{sed} commands for changing the names of installed programs.
+
+If any of the options described below are given to @command{configure},
+program names are transformed accordingly. Otherwise, if
+@code{AC_CANONICAL_TARGET} has been called and a @option{--target} value
+is given, the target type followed by a dash is used as a prefix.
+Otherwise, no program name transformation is done.
+@end defmac
+
+@menu
+* Transformation Options:: @command{configure} options to transform names
+* Transformation Examples:: Sample uses of transforming names
+* Transformation Rules:: Makefile uses of transforming names
+@end menu
+
+@node Transformation Options
+@subsection Transformation Options
+
+You can specify name transformations by giving @command{configure} these
+command line options:
+
+@table @option
+@item --program-prefix=@var{prefix}
+prepend @var{prefix} to the names;
+
+@item --program-suffix=@var{suffix}
+append @var{suffix} to the names;
+
+@item --program-transform-name=@var{expression}
+perform @code{sed} substitution @var{expression} on the names.
+@end table
+
+@node Transformation Examples
+@subsection Transformation Examples
+
+These transformations are useful with programs that can be part of a
+cross-compilation development environment. For example, a
+cross-assembler running on a Sun 4 configured with
+@option{--target=i960-vxworks} is normally installed as
+@file{i960-vxworks-as}, rather than @file{as}, which could be confused
+with a native Sun 4 assembler.
+
+You can force a program name to begin with @file{g}, if you don't want
+GNU programs installed on your system to shadow other programs with
+the same name. For example, if you configure GNU @code{diff} with
+@option{--program-prefix=g}, then when you run @samp{make install} it is
+installed as @file{/usr/local/bin/gdiff}.
+
+As a more sophisticated example, you could use
+
+@example
+--program-transform-name='s/^/g/; s/^gg/g/; s/^gless/less/'
+@end example
+@noindent
+
+to prepend @samp{g} to most of the program names in a source tree,
+excepting those like @code{gdb} that already have one and those like
+@code{less} and @code{lesskey} that aren't GNU programs. (That is
+assuming that you have a source tree containing those programs that is
+set up to use this feature.)
+
+One way to install multiple versions of some programs simultaneously is
+to append a version number to the name of one or both. For example, if
+you want to keep Autoconf version 1 around for awhile, you can configure
+Autoconf version 2 using @option{--program-suffix=2} to install the
+programs as @file{/usr/local/bin/autoconf2},
+@file{/usr/local/bin/autoheader2}, etc. Nevertheless, pay attention
+that only the binaries are renamed, therefore you'd have problems with
+the library files which might overlap.
+
+@node Transformation Rules
+@subsection Transformation Rules
+
+Here is how to use the variable @code{program_transform_name} in a
+@file{Makefile.in}:
+
+@example
+PROGRAMS = cp ls rm
+transform = @@program_transform_name@@
+install:
+ for p in $(PROGRAMS); do \
+ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p | \
+ sed '$(transform)'`; \
+ done
+
+uninstall:
+ for p in $(PROGRAMS); do \
+ rm -f $(DESTDIR)$(bindir)/`echo $$p | sed '$(transform)'`; \
+@c $$ restore font-lock
+ done
+@end example
+
+It is guaranteed that @code{program_transform_name} is never empty, and
+that there are no useless separators. Therefore you may safely embed
+@code{program_transform_name} within a sed program using @samp{;}:
+
+@example
+transform = @@program_transform_name@@
+transform_exe = s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/
+@end example
+
+Whether to do the transformations on documentation files (Texinfo or
+@code{man}) is a tricky question; there seems to be no perfect answer,
+due to the several reasons for name transforming. Documentation is not
+usually particular to a specific architecture, and Texinfo files do not
+conflict with system documentation. But they might conflict with
+earlier versions of the same files, and @code{man} pages sometimes do
+conflict with system documentation. As a compromise, it is probably
+best to do name transformations on @code{man} pages but not on Texinfo
+manuals.
+
+@node Site Defaults
+@section Setting Site Defaults
+@cindex Site defaults
+@cindex config.site
+
+Autoconf-generated @command{configure} scripts allow your site to provide
+default values for some configuration values. You do this by creating
+site- and system-wide initialization files.
+
+@evindex CONFIG_SITE
+If the environment variable @code{CONFIG_SITE} is set, @command{configure}
+uses its value as the name of a shell script to read; it is recommended
+that this be an absolute file name. Otherwise, it
+reads the shell script @file{@var{prefix}/share/config.site} if it exists,
+then @file{@var{prefix}/etc/config.site} if it exists. Thus,
+settings in machine-specific files override those in machine-independent
+ones in case of conflict.
+
+Site files can be arbitrary shell scripts, but only certain kinds of
+code are really appropriate to be in them. Because @command{configure}
+reads any cache file after it has read any site files, a site file can
+define a default cache file to be shared between all Autoconf-generated
+@command{configure} scripts run on that system (@pxref{Cache Files}). If
+you set a default cache file in a site file, it is a good idea to also
+set the output variable @code{CC} in that site file, because the cache
+file is only valid for a particular compiler, but many systems have
+several available.
+
+You can examine or override the value set by a command line option to
+@command{configure} in a site file; options set shell variables that have
+the same names as the options, with any dashes turned into underscores.
+The exceptions are that @option{--without-} and @option{--disable-} options
+are like giving the corresponding @option{--with-} or @option{--enable-}
+option and the value @samp{no}. Thus, @option{--cache-file=localcache}
+sets the variable @code{cache_file} to the value @samp{localcache};
+@option{--enable-warnings=no} or @option{--disable-warnings} sets the variable
+@code{enable_warnings} to the value @samp{no}; @option{--prefix=/usr} sets the
+variable @code{prefix} to the value @samp{/usr}; etc.
+
+Site files are also good places to set default values for other output
+variables, such as @code{CFLAGS}, if you need to give them non-default
+values: anything you would normally do, repetitively, on the command
+line. If you use non-default values for @var{prefix} or
+@var{exec_prefix} (wherever you locate the site file), you can set them
+in the site file if you specify it with the @code{CONFIG_SITE}
+environment variable.
+
+You can set some cache values in the site file itself. Doing this is
+useful if you are cross-compiling, where it is impossible to check features
+that require running a test program. You could ``prime the cache'' by
+setting those values correctly for that system in
+@file{@var{prefix}/etc/config.site}. To find out the names of the cache
+variables you need to set, see the documentation of the respective
+Autoconf macro. If the variables or their semantics are undocumented,
+you may need to look for shell variables with @samp{_cv_} in their names
+in the affected @command{configure} scripts, or in the Autoconf M4
+source code for those macros; but in that case, their name or semantics
+may change in a future Autoconf version.
+
+The cache file is careful to not override any variables set in the site
+files. Similarly, you should not override command-line options in the
+site files. Your code should check that variables such as @code{prefix}
+and @code{cache_file} have their default values (as set near the top of
+@command{configure}) before changing them.
+
+Here is a sample file @file{/usr/share/local/@/gnu/share/@/config.site}. The
+command @samp{configure --prefix=/usr/share/local/gnu} would read this
+file (if @code{CONFIG_SITE} is not set to a different file).
+
+@example
+# /usr/share/local/gnu/share/config.site for configure
+#
+# Change some defaults.
+test "$prefix" = NONE && prefix=/usr/share/local/gnu
+test "$exec_prefix" = NONE && exec_prefix=/usr/local/gnu
+test "$sharedstatedir" = '$@{prefix@}/com' && sharedstatedir=/var
+test "$localstatedir" = '$@{prefix@}/var' && localstatedir=/var
+
+# Give Autoconf 2.x generated configure scripts a shared default
+# cache file for feature test results, architecture-specific.
+if test "$cache_file" = /dev/null; then
+ cache_file="$prefix/var/config.cache"
+ # A cache file is only valid for one C compiler.
+ CC=gcc
+fi
+@end example
+
+@c Leave this use of ``File system'' rendered as one word, but
+@c slightly obfuscated so as not to trigger the syntax-check prohibition.
+@cindex File@/system Hierarchy Standard
+@cindex FHS
+
+Another use of @file{config.site} is for priming the directory variables
+@c ``File system'', but slightly obfuscated, as above.
+in a manner consistent with the File@/system Hierarchy Standard
+(FHS). Once the following file is installed at
+@file{/usr/share/config.site}, a user can execute simply
+@code{./configure --prefix=/usr} to get all the directories chosen in
+the locations recommended by FHS.
+
+@example
+# /usr/share/config.site for FHS defaults when installing below /usr,
+# and the respective settings were not changed on the command line.
+if test "$prefix" = /usr; then
+ test "$sysconfdir" = '$@{prefix@}/etc' && sysconfdir=/etc
+ test "$sharedstatedir" = '$@{prefix@}/com' && sharedstatedir=/var
+ test "$localstatedir" = '$@{prefix@}/var' && localstatedir=/var
+fi
+@end example
+
+@cindex @file{lib64}
+@cindex 64-bit libraries
+Likewise, on platforms where 64-bit libraries are built by default, then
+installed in @file{/usr/local/@/lib64} instead of @file{/usr/local/@/lib},
+it is appropriate to install @file{/usr/local/@/share/config.site}:
+
+@example
+# /usr/local/share/config.site for platforms that prefer
+# the directory /usr/local/lib64 over /usr/local/lib.
+test "$libdir" = '$@{exec_prefix@}/lib' && libdir='$@{exec_prefix@}/lib64'
+@end example
+
+
+@c ============================================== Running configure Scripts.
+
+@node Running configure Scripts
+@chapter Running @command{configure} Scripts
+@cindex @command{configure}
+
+Below are instructions on how to configure a package that uses a
+@command{configure} script, suitable for inclusion as an @file{INSTALL}
+file in the package. A plain-text version of @file{INSTALL} which you
+may use comes with Autoconf.
+
+@menu
+* Basic Installation:: Instructions for typical cases
+* Compilers and Options:: Selecting compilers and optimization
+* Multiple Architectures:: Compiling for multiple architectures at once
+* Installation Names:: Installing in different directories
+* Optional Features:: Selecting optional features
+* Particular Systems:: Particular systems
+* System Type:: Specifying the system type
+* Sharing Defaults:: Setting site-wide defaults for @command{configure}
+* Defining Variables:: Specifying the compiler etc.
+* configure Invocation:: Changing how @command{configure} runs
+@end menu
+
+@set autoconf
+@include install.texi
+
+
+@c ============================================== config.status Invocation
+
+@node config.status Invocation
+@chapter config.status Invocation
+@cindex @command{config.status}
+
+The @command{configure} script creates a file named @file{config.status},
+which actually configures, @dfn{instantiates}, the template files. It
+also records the configuration options that were specified when the
+package was last configured in case reconfiguring is needed.
+
+Synopsis:
+@example
+./config.status @ovar{option}@dots{} @ovar{tag}@dots{}
+@end example
+
+It configures each @var{tag}; if none are specified, all the templates
+are instantiated. A @var{tag} refers to a file or other tag associated
+with a configuration action, as specified by an @code{AC_CONFIG_@var{ITEMS}}
+macro (@pxref{Configuration Actions}). The files must be specified
+without their dependencies, as in
+
+@example
+./config.status foobar
+@end example
+
+@noindent
+not
+
+@example
+./config.status foobar:foo.in:bar.in
+@end example
+
+The supported options are:
+
+@table @option
+@item --help
+@itemx -h
+Print a summary of the command line options, the list of the template
+files, and exit.
+
+@item --version
+@itemx -V
+Print the version number of Autoconf and the configuration settings,
+and exit.
+
+@item --config
+Print the configuration settings in reusable way, quoted for the shell,
+and exit. For example, for a debugging build that otherwise reuses the
+configuration from a different build directory @var{build-dir} of a
+package in @var{src-dir}, you could use the following:
+
+@example
+args=`@var{build-dir}/config.status --config`
+eval @var{src-dir}/configure "$args" CFLAGS=-g --srcdir=@var{src-dir}
+@end example
+
+@noindent
+Note that it may be necessary to override a @option{--srcdir} setting
+that was saved in the configuration, if the arguments are used in a
+different build directory.
+
+@item --silent
+@itemx --quiet
+@itemx -q
+Do not print progress messages.
+
+@item --debug
+@itemx -d
+Don't remove the temporary files.
+
+@item --file=@var{file}[:@var{template}]
+Require that @var{file} be instantiated as if
+@samp{AC_CONFIG_FILES(@var{file}:@var{template})} was used. Both
+@var{file} and @var{template} may be @samp{-} in which case the standard
+output and/or standard input, respectively, is used. If a
+@var{template} file name is relative, it is first looked for in the build
+tree, and then in the source tree. @xref{Configuration Actions}, for
+more details.
+
+This option and the following ones provide one way for separately
+distributed packages to share the values computed by @command{configure}.
+Doing so can be useful if some of the packages need a superset of the
+features that one of them, perhaps a common library, does. These
+options allow a @file{config.status} file to create files other than the
+ones that its @file{configure.ac} specifies, so it can be used for a
+different package, or for extracting a subset of values. For example,
+
+@example
+echo '@@CC@@' | ./config.status --file=-
+@end example
+
+@noindent
+provides the value of @code{@@CC@@} on standard output.
+
+@item --header=@var{file}[:@var{template}]
+Same as @option{--file} above, but with @samp{AC_CONFIG_HEADERS}.
+
+@item --recheck
+Ask @file{config.status} to update itself and exit (no instantiation).
+This option is useful if you change @command{configure}, so that the
+results of some tests might be different from the previous run. The
+@option{--recheck} option reruns @command{configure} with the same arguments
+you used before, plus the @option{--no-create} option, which prevents
+@command{configure} from running @file{config.status} and creating
+@file{Makefile} and other files, and the @option{--no-recursion} option,
+which prevents @command{configure} from running other @command{configure}
+scripts in subdirectories. (This is so other Make rules can
+run @file{config.status} when it changes; @pxref{Automatic Remaking},
+for an example).
+@end table
+
+@file{config.status} checks several optional environment variables that
+can alter its behavior:
+
+@anchor{CONFIG_SHELL}
+@defvar CONFIG_SHELL
+@evindex CONFIG_SHELL
+The shell with which to run @command{configure}. It must be
+Bourne-compatible, and the absolute name of the shell should be passed.
+The default is a shell that supports @code{LINENO} if available, and
+@file{/bin/sh} otherwise.
+@end defvar
+
+@defvar CONFIG_STATUS
+@evindex CONFIG_STATUS
+The file name to use for the shell script that records the
+configuration. The default is @file{./config.status}. This variable is
+useful when one package uses parts of another and the @command{configure}
+scripts shouldn't be merged because they are maintained separately.
+@end defvar
+
+You can use @file{./config.status} in your makefiles. For example, in
+the dependencies given above (@pxref{Automatic Remaking}),
+@file{config.status} is run twice when @file{configure.ac} has changed.
+If that bothers you, you can make each run only regenerate the files for
+that rule:
+@example
+@group
+config.h: stamp-h
+stamp-h: config.h.in config.status
+ ./config.status config.h
+ echo > stamp-h
+
+Makefile: Makefile.in config.status
+ ./config.status Makefile
+@end group
+@end example
+
+The calling convention of @file{config.status} has changed; see
+@ref{Obsolete config.status Use}, for details.
+
+
+@c =================================================== Obsolete Constructs
+
+@node Obsolete Constructs
+@chapter Obsolete Constructs
+@cindex Obsolete constructs
+
+Autoconf changes, and throughout the years some constructs have been
+obsoleted. Most of the changes involve the macros, but in some cases
+the tools themselves, or even some concepts, are now considered
+obsolete.
+
+You may completely skip this chapter if you are new to Autoconf. Its
+intention is mainly to help maintainers updating their packages by
+understanding how to move to more modern constructs.
+
+@menu
+* Obsolete config.status Use:: Obsolete convention for @command{config.status}
+* acconfig Header:: Additional entries in @file{config.h.in}
+* autoupdate Invocation:: Automatic update of @file{configure.ac}
+* Obsolete Macros:: Backward compatibility macros
+* Autoconf 1:: Tips for upgrading your files
+* Autoconf 2.13:: Some fresher tips
+@end menu
+
+@node Obsolete config.status Use
+@section Obsolete @file{config.status} Invocation
+
+@file{config.status} now supports arguments to specify the files to
+instantiate; see @ref{config.status Invocation}, for more details.
+Before, environment variables had to be used.
+
+@defvar CONFIG_COMMANDS
+@evindex CONFIG_COMMANDS
+The tags of the commands to execute. The default is the arguments given
+to @code{AC_OUTPUT} and @code{AC_CONFIG_COMMANDS} in
+@file{configure.ac}.
+@end defvar
+
+@defvar CONFIG_FILES
+@evindex CONFIG_FILES
+The files in which to perform @samp{@@@var{variable}@@} substitutions.
+The default is the arguments given to @code{AC_OUTPUT} and
+@code{AC_CONFIG_FILES} in @file{configure.ac}.
+@end defvar
+
+@defvar CONFIG_HEADERS
+@evindex CONFIG_HEADERS
+The files in which to substitute C @code{#define} statements. The
+default is the arguments given to @code{AC_CONFIG_HEADERS}; if that
+macro was not called, @file{config.status} ignores this variable.
+@end defvar
+
+@defvar CONFIG_LINKS
+@evindex CONFIG_LINKS
+The symbolic links to establish. The default is the arguments given to
+@code{AC_CONFIG_LINKS}; if that macro was not called,
+@file{config.status} ignores this variable.
+@end defvar
+
+In @ref{config.status Invocation}, using this old interface, the example
+would be:
+
+@example
+@group
+config.h: stamp-h
+stamp-h: config.h.in config.status
+ CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_FILES= \
+ CONFIG_HEADERS=config.h ./config.status
+ echo > stamp-h
+
+Makefile: Makefile.in config.status
+ CONFIG_COMMANDS= CONFIG_LINKS= CONFIG_HEADERS= \
+ CONFIG_FILES=Makefile ./config.status
+@end group
+@end example
+
+@noindent
+(If @file{configure.ac} does not call @code{AC_CONFIG_HEADERS}, there is
+no need to set @code{CONFIG_HEADERS} in the @command{make} rules. Equally
+for @code{CONFIG_COMMANDS}, etc.)
+
+
+@node acconfig Header
+@section @file{acconfig.h}
+
+@cindex @file{acconfig.h}
+@cindex @file{config.h.top}
+@cindex @file{config.h.bot}
+
+In order to produce @file{config.h.in}, @command{autoheader} needs to
+build or to find templates for each symbol. Modern releases of Autoconf
+use @code{AH_VERBATIM} and @code{AH_TEMPLATE} (@pxref{Autoheader
+Macros}), but in older releases a file, @file{acconfig.h}, contained the
+list of needed templates. @command{autoheader} copied comments and
+@code{#define} and @code{#undef} statements from @file{acconfig.h} in
+the current directory, if present. This file used to be mandatory if
+you @code{AC_DEFINE} any additional symbols.
+
+Modern releases of Autoconf also provide @code{AH_TOP} and
+@code{AH_BOTTOM} if you need to prepend/append some information to
+@file{config.h.in}. Ancient versions of Autoconf had a similar feature:
+if @file{./acconfig.h} contains the string @samp{@@TOP@@},
+@command{autoheader} copies the lines before the line containing
+@samp{@@TOP@@} into the top of the file that it generates. Similarly,
+if @file{./acconfig.h} contains the string @samp{@@BOTTOM@@},
+@command{autoheader} copies the lines after that line to the end of the
+file it generates. Either or both of those strings may be omitted. An
+even older alternate way to produce the same effect in ancient versions
+of Autoconf is to create the files @file{@var{file}.top} (typically
+@file{config.h.top}) and/or @file{@var{file}.bot} in the current
+directory. If they exist, @command{autoheader} copies them to the
+beginning and end, respectively, of its output.
+
+In former versions of Autoconf, the files used in preparing a software
+package for distribution were:
+@example
+@group
+configure.ac --. .------> autoconf* -----> configure
+ +---+
+[aclocal.m4] --+ `---.
+[acsite.m4] ---' |
+ +--> [autoheader*] -> [config.h.in]
+[acconfig.h] ----. |
+ +-----'
+[config.h.top] --+
+[config.h.bot] --'
+@end group
+@end example
+
+Using only the @code{AH_} macros, @file{configure.ac} should be
+self-contained, and should not depend upon @file{acconfig.h} etc.
+
+
+@node autoupdate Invocation
+@section Using @command{autoupdate} to Modernize @file{configure.ac}
+@cindex @command{autoupdate}
+
+The @command{autoupdate} program updates a @file{configure.ac} file that
+calls Autoconf macros by their old names to use the current macro names.
+In version 2 of Autoconf, most of the macros were renamed to use a more
+uniform and descriptive naming scheme. @xref{Macro Names}, for a
+description of the new scheme. Although the old names still work
+(@pxref{Obsolete Macros}, for a list of the old macros and the corresponding
+new names), you can make your @file{configure.ac} files more readable
+and make it easier to use the current Autoconf documentation if you
+update them to use the new macro names.
+
+@evindex SIMPLE_BACKUP_SUFFIX
+If given no arguments, @command{autoupdate} updates @file{configure.ac},
+backing up the original version with the suffix @file{~} (or the value
+of the environment variable @code{SIMPLE_BACKUP_SUFFIX}, if that is
+set). If you give @command{autoupdate} an argument, it reads that file
+instead of @file{configure.ac} and writes the updated file to the
+standard output.
+
+@noindent
+@command{autoupdate} accepts the following options:
+
+@table @option
+@item --help
+@itemx -h
+Print a summary of the command line options and exit.
+
+@item --version
+@itemx -V
+Print the version number of Autoconf and exit.
+
+@item --verbose
+@itemx -v
+Report processing steps.
+
+@item --debug
+@itemx -d
+Don't remove the temporary files.
+
+@item --force
+@itemx -f
+Force the update even if the file has not changed. Disregard the cache.
+
+@item --include=@var{dir}
+@itemx -I @var{dir}
+Also look for input files in @var{dir}. Multiple invocations accumulate.
+Directories are browsed from last to first.
+
+@item --prepend-include=@var{dir}
+@itemx -B @var{dir}
+Prepend directory @var{dir} to the search path. This is used to include
+the language-specific files before any third-party macros.
+@end table
+
+@node Obsolete Macros
+@section Obsolete Macros
+
+Several macros are obsoleted in Autoconf, for various reasons (typically
+they failed to quote properly, couldn't be extended for more recent
+issues, etc.). They are still supported, but deprecated: their use
+should be avoided.
+
+During the jump from Autoconf version 1 to version 2, most of the
+macros were renamed to use a more uniform and descriptive naming scheme,
+but their signature did not change. @xref{Macro Names}, for a
+description of the new naming scheme. Below, if there is just the mapping
+from old names to new names for these macros, the reader is invited to
+refer to the definition of the new macro for the signature and the
+description.
+
+@defmac AC_AIX
+@acindex{AIX}
+@cvindex _ALL_SOURCE
+This macro is a platform-specific subset of
+@code{AC_USE_SYSTEM_EXTENSIONS} (@pxref{AC_USE_SYSTEM_EXTENSIONS}).
+@end defmac
+
+@defmac AC_ALLOCA
+@acindex{ALLOCA}
+Replaced by @code{AC_FUNC_ALLOCA} (@pxref{AC_FUNC_ALLOCA}).
+@end defmac
+
+@defmac AC_ARG_ARRAY
+@acindex{ARG_ARRAY}
+Removed because of limited usefulness.
+@end defmac
+
+@defmac AC_C_CROSS
+@acindex{C_CROSS}
+This macro is obsolete; it does nothing.
+@end defmac
+
+@defmac AC_C_LONG_DOUBLE
+@acindex{C_LONG_DOUBLE}
+@cvindex HAVE_LONG_DOUBLE
+If the C compiler supports a working @code{long double} type with more
+range or precision than the @code{double} type, define
+@code{HAVE_LONG_DOUBLE}.
+
+You should use @code{AC_TYPE_LONG_DOUBLE} or
+@code{AC_TYPE_LONG_DOUBLE_WIDER} instead. @xref{Particular Types}.
+@end defmac
+
+@defmac AC_CANONICAL_SYSTEM
+@acindex{CANONICAL_SYSTEM}
+Determine the system type and set output variables to the names of the
+canonical system types. @xref{Canonicalizing}, for details about the
+variables this macro sets.
+
+The user is encouraged to use either @code{AC_CANONICAL_BUILD}, or
+@code{AC_CANONICAL_HOST}, or @code{AC_CANONICAL_TARGET}, depending on
+the needs. Using @code{AC_CANONICAL_TARGET} is enough to run the two
+other macros (@pxref{Canonicalizing}).
+@end defmac
+
+@defmac AC_CHAR_UNSIGNED
+@acindex{CHAR_UNSIGNED}
+Replaced by @code{AC_C_CHAR_UNSIGNED} (@pxref{AC_C_CHAR_UNSIGNED}).
+@end defmac
+
+@defmac AC_CHECK_TYPE (@var{type}, @var{default})
+@acindex{CHECK_TYPE}
+Autoconf, up to 2.13, used to provide this version of
+@code{AC_CHECK_TYPE}, deprecated because of its flaws. First, although
+it is a member of the @code{CHECK} clan, it does
+more than just checking. Secondly, missing types are defined
+using @code{#define}, not @code{typedef}, and this can lead to
+problems in the case of pointer types.
+
+This use of @code{AC_CHECK_TYPE} is obsolete and discouraged; see
+@ref{Generic Types}, for the description of the current macro.
+
+If the type @var{type} is not defined, define it to be the C (or C++)
+builtin type @var{default}, e.g., @samp{short int} or @samp{unsigned int}.
+
+This macro is equivalent to:
+
+@example
+AC_CHECK_TYPE([@var{type}], [],
+ [AC_DEFINE_UNQUOTED([@var{type}], [@var{default}],
+ [Define to `@var{default}'
+ if <sys/types.h> does not define.])])
+@end example
+
+In order to keep backward compatibility, the two versions of
+@code{AC_CHECK_TYPE} are implemented, selected using these heuristics:
+
+@enumerate
+@item
+If there are three or four arguments, the modern version is used.
+
+@item
+If the second argument appears to be a C or C++ type, then the
+obsolete version is used. This happens if the argument is a C or C++
+@emph{builtin} type or a C identifier ending in @samp{_t}, optionally
+followed by one of @samp{[(* } and then by a string of zero or more
+characters taken from the set @samp{[]()* _a-zA-Z0-9}.
+
+@item
+If the second argument is spelled with the alphabet of valid C and C++
+types, the user is warned and the modern version is used.
+
+@item
+Otherwise, the modern version is used.
+@end enumerate
+
+@noindent
+You are encouraged either to use a valid builtin type, or to use the
+equivalent modern code (see above), or better yet, to use
+@code{AC_CHECK_TYPES} together with
+
+@example
+#ifndef HAVE_LOFF_T
+typedef loff_t off_t;
+#endif
+@end example
+@end defmac
+@c end of AC_CHECK_TYPE
+
+@defmac AC_CHECKING (@var{feature-description})
+@acindex{CHECKING}
+Same as
+
+@example
+AC_MSG_NOTICE([checking @var{feature-description}@dots{}]
+@end example
+
+@noindent
+@xref{AC_MSG_NOTICE}.
+@end defmac
+
+@defmac AC_COMPILE_CHECK (@var{echo-text}, @var{includes}, @
+ @var{function-body}, @var{action-if-true}, @ovar{action-if-false})
+@acindex{COMPILE_CHECK}
+This is an obsolete version of @code{AC_TRY_COMPILE} itself replaced by
+@code{AC_COMPILE_IFELSE} (@pxref{Running the Compiler}), with the
+addition that it prints @samp{checking for @var{echo-text}} to the
+standard output first, if @var{echo-text} is non-empty. Use
+@code{AC_MSG_CHECKING} and @code{AC_MSG_RESULT} instead to print
+messages (@pxref{Printing Messages}).
+@end defmac
+
+@defmac AC_CONST
+@acindex{CONST}
+Replaced by @code{AC_C_CONST} (@pxref{AC_C_CONST}).
+@end defmac
+
+@defmac AC_CROSS_CHECK
+@acindex{CROSS_CHECK}
+Same as @code{AC_C_CROSS}, which is obsolete too, and does nothing
+@code{:-)}.
+@end defmac
+
+@defmac AC_CYGWIN
+@acindex{CYGWIN}
+@evindex CYGWIN
+Check for the Cygwin environment in which case the shell variable
+@code{CYGWIN} is set to @samp{yes}. Don't use this macro, the dignified
+means to check the nature of the host is using @code{AC_CANONICAL_HOST}
+(@pxref{Canonicalizing}). As a matter of fact this macro is defined as:
+
+@example
+AC_REQUIRE([AC_CANONICAL_HOST])[]dnl
+case $host_os in
+ *cygwin* ) CYGWIN=yes;;
+ * ) CYGWIN=no;;
+esac
+@end example
+
+Beware that the variable @env{CYGWIN} has a special meaning when
+running Cygwin, and should not be changed. That's yet another reason
+not to use this macro.
+@end defmac
+
+@defmac AC_DECL_SYS_SIGLIST
+@acindex{DECL_SYS_SIGLIST}
+@cvindex SYS_SIGLIST_DECLARED
+Same as:
+
+@example
+AC_CHECK_DECLS([sys_siglist], [], [],
+[#include <signal.h>
+/* NetBSD declares sys_siglist in unistd.h. */
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+])
+@end example
+
+@noindent
+@xref{AC_CHECK_DECLS}.
+@end defmac
+
+@defmac AC_DECL_YYTEXT
+@acindex{DECL_YYTEXT}
+Does nothing, now integrated in @code{AC_PROG_LEX} (@pxref{AC_PROG_LEX}).
+@end defmac
+
+@defmac AC_DIR_HEADER
+@acindex{DIR_HEADER}
+@cvindex DIRENT
+@cvindex SYSNDIR
+@cvindex SYSDIR
+@cvindex NDIR
+Like calling @code{AC_FUNC_CLOSEDIR_VOID}
+(@pxref{AC_FUNC_CLOSEDIR_VOID}) and @code{AC_HEADER_DIRENT}
+(@pxref{AC_HEADER_DIRENT}),
+but defines a different set of C preprocessor macros to indicate which
+header file is found:
+
+@multitable {@file{sys/ndir.h}} {Old Symbol} {@code{HAVE_SYS_NDIR_H}}
+@item Header @tab Old Symbol @tab New Symbol
+@item @file{dirent.h} @tab @code{DIRENT} @tab @code{HAVE_DIRENT_H}
+@item @file{sys/ndir.h} @tab @code{SYSNDIR} @tab @code{HAVE_SYS_NDIR_H}
+@item @file{sys/dir.h} @tab @code{SYSDIR} @tab @code{HAVE_SYS_DIR_H}
+@item @file{ndir.h} @tab @code{NDIR} @tab @code{HAVE_NDIR_H}
+@end multitable
+@end defmac
+
+@defmac AC_DYNIX_SEQ
+@acindex{DYNIX_SEQ}
+If on DYNIX/ptx, add @option{-lseq} to output variable
+@code{LIBS}. This macro used to be defined as
+
+@example
+AC_CHECK_LIB([seq], [getmntent], [LIBS="-lseq $LIBS"])
+@end example
+
+@noindent
+now it is just @code{AC_FUNC_GETMNTENT} (@pxref{AC_FUNC_GETMNTENT}).
+@end defmac
+
+@defmac AC_EXEEXT
+@acindex{EXEEXT}
+@ovindex EXEEXT
+Defined the output variable @code{EXEEXT} based on the output of the
+compiler, which is now done automatically. Typically set to empty
+string if Posix and @samp{.exe} if a DOS variant.
+@end defmac
+
+@defmac AC_EMXOS2
+@acindex{EMXOS2}
+Similar to @code{AC_CYGWIN} but checks for the EMX environment on OS/2
+and sets @code{EMXOS2}. Don't use this macro, the dignified means to
+check the nature of the host is using @code{AC_CANONICAL_HOST}
+(@pxref{Canonicalizing}).
+@end defmac
+
+@defmac AC_ENABLE (@var{feature}, @var{action-if-given}, @
+ @ovar{action-if-not-given})
+@acindex{ENABLE}
+This is an obsolete version of @code{AC_ARG_ENABLE} that does not
+support providing a help string (@pxref{AC_ARG_ENABLE}).
+@end defmac
+
+@defmac AC_ERROR
+@acindex{ERROR}
+Replaced by @code{AC_MSG_ERROR} (@pxref{AC_MSG_ERROR}).
+@end defmac
+
+@defmac AC_FIND_X
+@acindex{FIND_X}
+Replaced by @code{AC_PATH_X} (@pxref{AC_PATH_X}).
+@end defmac
+
+@defmac AC_FIND_XTRA
+@acindex{FIND_XTRA}
+Replaced by @code{AC_PATH_XTRA} (@pxref{AC_PATH_XTRA}).
+@end defmac
+
+@defmac AC_FOREACH
+@acindex{FOREACH}
+Replaced by @code{m4_foreach_w} (@pxref{m4_foreach_w}).
+@end defmac
+
+@defmac AC_FUNC_CHECK
+@acindex{FUNC_CHECK}
+Replaced by @code{AC_CHECK_FUNC} (@pxref{AC_CHECK_FUNC}).
+@end defmac
+
+@anchor{AC_FUNC_SETVBUF_REVERSED}
+@defmac AC_FUNC_SETVBUF_REVERSED
+@acindex{FUNC_SETVBUF_REVERSED}
+@cvindex SETVBUF_REVERSED
+@c @fuindex setvbuf
+@prindex @code{setvbuf}
+Do nothing. Formerly, this macro checked whether @code{setvbuf} takes
+the buffering type as its second argument and the buffer pointer as the
+third, instead of the other way around, and defined
+@code{SETVBUF_REVERSED}. However, the last systems to have the problem
+were those based on SVR2, which became obsolete in 1987, and the macro
+is no longer needed.
+@end defmac
+
+@defmac AC_FUNC_WAIT3
+@acindex{FUNC_WAIT3}
+@cvindex HAVE_WAIT3
+@c @fuindex wait3
+@prindex @code{wait3}
+If @code{wait3} is found and fills in the contents of its third argument
+(a @samp{struct rusage *}), which HP-UX does not do, define
+@code{HAVE_WAIT3}.
+
+These days portable programs should use @code{waitpid}, not
+@code{wait3}, as @code{wait3} has been removed from Posix.
+@end defmac
+
+@defmac AC_GCC_TRADITIONAL
+@acindex{GCC_TRADITIONAL}
+Replaced by @code{AC_PROG_GCC_TRADITIONAL} (@pxref{AC_PROG_GCC_TRADITIONAL}).
+@end defmac
+
+@defmac AC_GETGROUPS_T
+@acindex{GETGROUPS_T}
+Replaced by @code{AC_TYPE_GETGROUPS} (@pxref{AC_TYPE_GETGROUPS}).
+@end defmac
+
+@defmac AC_GETLOADAVG
+@acindex{GETLOADAVG}
+Replaced by @code{AC_FUNC_GETLOADAVG} (@pxref{AC_FUNC_GETLOADAVG}).
+@end defmac
+
+@defmac AC_GNU_SOURCE
+@acindex{GNU_SOURCE}
+@cvindex _GNU_SOURCE
+This macro is a platform-specific subset of
+@code{AC_USE_SYSTEM_EXTENSIONS} (@pxref{AC_USE_SYSTEM_EXTENSIONS}).
+@end defmac
+
+@defmac AC_HAVE_FUNCS
+@acindex{HAVE_FUNCS}
+Replaced by @code{AC_CHECK_FUNCS} (@pxref{AC_CHECK_FUNCS}).
+@end defmac
+
+@defmac AC_HAVE_HEADERS
+@acindex{HAVE_HEADERS}
+Replaced by @code{AC_CHECK_HEADERS} (@pxref{AC_CHECK_HEADERS}).
+@end defmac
+
+@defmac AC_HAVE_LIBRARY (@var{library}, @ovar{action-if-found}, @
+ @ovar{action-if-not-found}, @ovar{other-libraries})
+@acindex{HAVE_LIBRARY}
+This macro is equivalent to calling @code{AC_CHECK_LIB} with a
+@var{function} argument of @code{main}. In addition, @var{library} can
+be written as any of @samp{foo}, @option{-lfoo}, or @samp{libfoo.a}. In
+all of those cases, the compiler is passed @option{-lfoo}. However,
+@var{library} cannot be a shell variable; it must be a literal name.
+@xref{AC_CHECK_LIB}.
+@end defmac
+
+@defmac AC_HAVE_POUNDBANG
+@acindex{HAVE_POUNDBANG}
+Replaced by @code{AC_SYS_INTERPRETER} (@pxref{AC_SYS_INTERPRETER}).
+@end defmac
+
+@defmac AC_HEADER_CHECK
+@acindex{HEADER_CHECK}
+Replaced by @code{AC_CHECK_HEADER} (@pxref{AC_CHECK_HEADER}).
+@end defmac
+
+@defmac AC_HEADER_EGREP
+@acindex{HEADER_EGREP}
+Replaced by @code{AC_EGREP_HEADER} (@pxref{AC_EGREP_HEADER}).
+@end defmac
+
+@defmac AC_HELP_STRING
+@acindex{HELP_STRING}
+Replaced by @code{AS_HELP_STRING} (@pxref{AS_HELP_STRING}).
+@end defmac
+
+@defmac AC_INIT (@var{unique-file-in-source-dir})
+@acindex{INIT}
+Formerly @code{AC_INIT} used to have a single argument, and was
+equivalent to:
+
+@example
+AC_INIT
+AC_CONFIG_SRCDIR(@var{unique-file-in-source-dir})
+@end example
+See @ref{AC_INIT} and @ref{AC_CONFIG_SRCDIR}.
+@end defmac
+
+@defmac AC_INLINE
+@acindex{INLINE}
+Replaced by @code{AC_C_INLINE} (@pxref{AC_C_INLINE}).
+@end defmac
+
+@defmac AC_INT_16_BITS
+@acindex{INT_16_BITS}
+@cvindex INT_16_BITS
+If the C type @code{int} is 16 bits wide, define @code{INT_16_BITS}.
+Use @samp{AC_CHECK_SIZEOF(int)} instead (@pxref{AC_CHECK_SIZEOF}).
+@end defmac
+
+@defmac AC_IRIX_SUN
+@acindex{IRIX_SUN}
+If on IRIX (Silicon Graphics Unix), add @option{-lsun} to output
+@code{LIBS}. If you were using it to get @code{getmntent}, use
+@code{AC_FUNC_GETMNTENT} instead. If you used it for the NIS versions
+of the password and group functions, use @samp{AC_CHECK_LIB(sun,
+getpwnam)}. Up to Autoconf 2.13, it used to be
+
+@example
+AC_CHECK_LIB([sun], [getmntent], [LIBS="-lsun $LIBS"])
+@end example
+
+@noindent
+now it is defined as
+
+@example
+AC_FUNC_GETMNTENT
+AC_CHECK_LIB([sun], [getpwnam])
+@end example
+
+@noindent
+See @ref{AC_FUNC_GETMNTENT} and @ref{AC_CHECK_LIB}.
+@end defmac
+
+@defmac AC_ISC_POSIX
+@acindex{ISC_POSIX}
+@ovindex LIBS
+This macro adds @option{-lcposix} to output variable @code{LIBS} if
+necessary for Posix facilities. Sun dropped support for the obsolete
+INTERACTIVE Systems Corporation Unix on 2006-07-23. New programs
+need not use this macro. It is implemented as
+@code{AC_SEARCH_LIBS([strerror], [cposix])} (@pxref{AC_SEARCH_LIBS}).
+@end defmac
+
+@defmac AC_LANG_C
+@acindex{LANG_C}
+Same as @samp{AC_LANG([C])} (@pxref{AC_LANG}).
+@end defmac
+
+@defmac AC_LANG_CPLUSPLUS
+@acindex{LANG_CPLUSPLUS}
+Same as @samp{AC_LANG([C++])} (@pxref{AC_LANG}).
+@end defmac
+
+@defmac AC_LANG_FORTRAN77
+@acindex{LANG_FORTRAN77}
+Same as @samp{AC_LANG([Fortran 77])} (@pxref{AC_LANG}).
+@end defmac
+
+@defmac AC_LANG_RESTORE
+@acindex{LANG_RESTORE}
+Select the @var{language} that is saved on the top of the stack, as set
+by @code{AC_LANG_SAVE}, remove it from the stack, and call
+@code{AC_LANG(@var{language})}. @xref{Language Choice}, for the
+preferred way to change languages.
+@end defmac
+
+@defmac AC_LANG_SAVE
+@acindex{LANG_SAVE}
+Remember the current language (as set by @code{AC_LANG}) on a stack.
+The current language does not change. @code{AC_LANG_PUSH} is preferred
+(@pxref{AC_LANG_PUSH}).
+@end defmac
+
+@defmac AC_LINK_FILES (@var{source}@dots{}, @var{dest}@dots{})
+@acindex{LINK_FILES}
+This is an obsolete version of @code{AC_CONFIG_LINKS}
+(@pxref{AC_CONFIG_LINKS}. An updated version of:
+
+@example
+AC_LINK_FILES(config/$machine.h config/$obj_format.h,
+ host.h object.h)
+@end example
+
+@noindent
+is:
+
+@example
+AC_CONFIG_LINKS([host.h:config/$machine.h
+ object.h:config/$obj_format.h])
+@end example
+@end defmac
+
+@defmac AC_LN_S
+@acindex{LN_S}
+Replaced by @code{AC_PROG_LN_S} (@pxref{AC_PROG_LN_S}).
+@end defmac
+
+@defmac AC_LONG_64_BITS
+@acindex{LONG_64_BITS}
+@cvindex LONG_64_BITS
+Define @code{LONG_64_BITS} if the C type @code{long int} is 64 bits wide.
+Use the generic macro @samp{AC_CHECK_SIZEOF([long int])} instead
+(@pxref{AC_CHECK_SIZEOF}).
+@end defmac
+
+@defmac AC_LONG_DOUBLE
+@acindex{LONG_DOUBLE}
+If the C compiler supports a working @code{long double} type with more
+range or precision than the @code{double} type, define
+@code{HAVE_LONG_DOUBLE}.
+
+You should use @code{AC_TYPE_LONG_DOUBLE} or
+@code{AC_TYPE_LONG_DOUBLE_WIDER} instead. @xref{Particular Types}.
+@end defmac
+
+@defmac AC_LONG_FILE_NAMES
+@acindex{LONG_FILE_NAMES}
+Replaced by
+@example
+AC_SYS_LONG_FILE_NAMES
+@end example
+@noindent
+@xref{AC_SYS_LONG_FILE_NAMES}.
+@end defmac
+
+@defmac AC_MAJOR_HEADER
+@acindex{MAJOR_HEADER}
+Replaced by @code{AC_HEADER_MAJOR} (@pxref{AC_HEADER_MAJOR}).
+@end defmac
+
+@defmac AC_MEMORY_H
+@acindex{MEMORY_H}
+@cvindex NEED_MEMORY_H
+Used to define @code{NEED_MEMORY_H} if the @code{mem} functions were
+defined in @file{memory.h}. Today it is equivalent to
+@samp{AC_CHECK_HEADERS([memory.h])} (@pxref{AC_CHECK_HEADERS}). Adjust
+your code to depend upon
+@code{HAVE_MEMORY_H}, not @code{NEED_MEMORY_H}; see @ref{Standard
+Symbols}.
+@end defmac
+
+@defmac AC_MINGW32
+@acindex{MINGW32}
+Similar to @code{AC_CYGWIN} but checks for the MinGW compiler
+environment and sets @code{MINGW32}. Don't use this macro, the
+dignified means to check the nature of the host is using
+@code{AC_CANONICAL_HOST} (@pxref{Canonicalizing}).
+@end defmac
+
+@defmac AC_MINIX
+@acindex{MINIX}
+@cvindex _MINIX
+@cvindex _POSIX_SOURCE
+@cvindex _POSIX_1_SOURCE
+This macro is a platform-specific subset of
+@code{AC_USE_SYSTEM_EXTENSIONS} (@pxref{AC_USE_SYSTEM_EXTENSIONS}).
+@end defmac
+
+@defmac AC_MINUS_C_MINUS_O
+@acindex{MINUS_C_MINUS_O}
+Replaced by @code{AC_PROG_CC_C_O} (@pxref{AC_PROG_CC_C_O}).
+@end defmac
+
+@defmac AC_MMAP
+@acindex{MMAP}
+Replaced by @code{AC_FUNC_MMAP} (@pxref{AC_FUNC_MMAP}).
+@end defmac
+
+@defmac AC_MODE_T
+@acindex{MODE_T}
+Replaced by @code{AC_TYPE_MODE_T} (@pxref{AC_TYPE_MODE_T}).
+@end defmac
+
+@defmac AC_OBJEXT
+@acindex{OBJEXT}
+@ovindex OBJEXT
+Defined the output variable @code{OBJEXT} based on the output of the
+compiler, after .c files have been excluded. Typically set to @samp{o}
+if Posix, @samp{obj} if a DOS variant.
+Now the compiler checking macros handle
+this automatically.
+@end defmac
+
+@defmac AC_OBSOLETE (@var{this-macro-name}, @ovar{suggestion})
+@acindex{OBSOLETE}
+Make M4 print a message to the standard error output warning that
+@var{this-macro-name} is obsolete, and giving the file and line number
+where it was called. @var{this-macro-name} should be the name of the
+macro that is calling @code{AC_OBSOLETE}. If @var{suggestion} is given,
+it is printed at the end of the warning message; for example, it can be
+a suggestion for what to use instead of @var{this-macro-name}.
+
+For instance
+
+@example
+AC_OBSOLETE([$0], [; use AC_CHECK_HEADERS(unistd.h) instead])dnl
+@end example
+
+@noindent
+You are encouraged to use @code{AU_DEFUN} instead, since it gives better
+services to the user (@pxref{AU_DEFUN}).
+@end defmac
+
+@defmac AC_OFF_T
+@acindex{OFF_T}
+Replaced by @code{AC_TYPE_OFF_T} (@pxref{AC_TYPE_OFF_T}).
+@end defmac
+
+@defmac AC_OUTPUT (@ovar{file}@dots{}, @ovar{extra-cmds}, @ovar{init-cmds})
+@acindex{OUTPUT}
+The use of @code{AC_OUTPUT} with arguments is deprecated. This obsoleted
+interface is equivalent to:
+
+@example
+@group
+AC_CONFIG_FILES(@var{file}@dots{})
+AC_CONFIG_COMMANDS([default],
+ @var{extra-cmds}, @var{init-cmds})
+AC_OUTPUT
+@end group
+@end example
+
+@noindent
+See @ref{AC_CONFIG_FILES}, @ref{AC_CONFIG_COMMANDS}, and @ref{AC_OUTPUT}.
+@end defmac
+
+@defmac AC_OUTPUT_COMMANDS (@var{extra-cmds}, @ovar{init-cmds})
+@acindex{OUTPUT_COMMANDS}
+Specify additional shell commands to run at the end of
+@file{config.status}, and shell commands to initialize any variables
+from @command{configure}. This macro may be called multiple times. It is
+obsolete, replaced by @code{AC_CONFIG_COMMANDS} (@pxref{AC_CONFIG_COMMANDS}).
+
+Here is an unrealistic example:
+
+@example
+fubar=27
+AC_OUTPUT_COMMANDS([echo this is extra $fubar, and so on.],
+ [fubar=$fubar])
+AC_OUTPUT_COMMANDS([echo this is another, extra, bit],
+ [echo init bit])
+@end example
+
+Aside from the fact that @code{AC_CONFIG_COMMANDS} requires an
+additional key, an important difference is that
+@code{AC_OUTPUT_COMMANDS} is quoting its arguments twice, unlike
+@code{AC_CONFIG_COMMANDS}. This means that @code{AC_CONFIG_COMMANDS}
+can safely be given macro calls as arguments:
+
+@example
+AC_CONFIG_COMMANDS(foo, [my_FOO()])
+@end example
+
+@noindent
+Conversely, where one level of quoting was enough for literal strings
+with @code{AC_OUTPUT_COMMANDS}, you need two with
+@code{AC_CONFIG_COMMANDS}. The following lines are equivalent:
+
+@example
+@group
+AC_OUTPUT_COMMANDS([echo "Square brackets: []"])
+AC_CONFIG_COMMANDS([default], [[echo "Square brackets: []"]])
+@end group
+@end example
+@end defmac
+
+@defmac AC_PID_T
+@acindex{PID_T}
+Replaced by @code{AC_TYPE_PID_T} (@pxref{AC_TYPE_PID_T}).
+@end defmac
+
+@defmac AC_PREFIX
+@acindex{PREFIX}
+Replaced by @code{AC_PREFIX_PROGRAM} (@pxref{AC_PREFIX_PROGRAM}).
+@end defmac
+
+@defmac AC_PROGRAMS_CHECK
+@acindex{PROGRAMS_CHECK}
+Replaced by @code{AC_CHECK_PROGS} (@pxref{AC_CHECK_PROGS}).
+@end defmac
+
+@defmac AC_PROGRAMS_PATH
+@acindex{PROGRAMS_PATH}
+Replaced by @code{AC_PATH_PROGS} (@pxref{AC_PATH_PROGS}).
+@end defmac
+
+@defmac AC_PROGRAM_CHECK
+@acindex{PROGRAM_CHECK}
+Replaced by @code{AC_CHECK_PROG} (@pxref{AC_CHECK_PROG}).
+@end defmac
+
+@defmac AC_PROGRAM_EGREP
+@acindex{PROGRAM_EGREP}
+Replaced by @code{AC_EGREP_CPP} (@pxref{AC_EGREP_CPP}).
+@end defmac
+
+@defmac AC_PROGRAM_PATH
+@acindex{PROGRAM_PATH}
+Replaced by @code{AC_PATH_PROG} (@pxref{AC_PATH_PROG}).
+@end defmac
+
+@defmac AC_REMOTE_TAPE
+@acindex{REMOTE_TAPE}
+Removed because of limited usefulness.
+@end defmac
+
+@defmac AC_RESTARTABLE_SYSCALLS
+@acindex{RESTARTABLE_SYSCALLS}
+This macro was renamed @code{AC_SYS_RESTARTABLE_SYSCALLS}. However,
+these days portable programs should use @code{sigaction} with
+@code{SA_RESTART} if they want restartable system calls. They should
+not rely on @code{HAVE_RESTARTABLE_SYSCALLS}, since nowadays whether a
+system call is restartable is a dynamic issue, not a configuration-time
+issue.
+@end defmac
+
+@defmac AC_RETSIGTYPE
+@acindex{RETSIGTYPE}
+Replaced by @code{AC_TYPE_SIGNAL} (@pxref{AC_TYPE_SIGNAL}), which itself
+is obsolete when assuming C89 or better.
+@end defmac
+
+@defmac AC_RSH
+@acindex{RSH}
+Removed because of limited usefulness.
+@end defmac
+
+@defmac AC_SCO_INTL
+@acindex{SCO_INTL}
+@ovindex LIBS
+If on SCO Unix, add @option{-lintl} to output variable @code{LIBS}. This
+macro used to do this:
+
+@example
+AC_CHECK_LIB([intl], [strftime], [LIBS="-lintl $LIBS"])
+@end example
+
+@noindent
+Now it just calls @code{AC_FUNC_STRFTIME} instead (@pxref{AC_FUNC_STRFTIME}).
+@end defmac
+
+@defmac AC_SETVBUF_REVERSED
+@acindex{SETVBUF_REVERSED}
+Replaced by
+@example
+AC_FUNC_SETVBUF_REVERSED
+@end example
+@noindent
+@xref{AC_FUNC_SETVBUF_REVERSED}.
+@end defmac
+
+@defmac AC_SET_MAKE
+@acindex{SET_MAKE}
+Replaced by @code{AC_PROG_MAKE_SET} (@pxref{AC_PROG_MAKE_SET}).
+@end defmac
+
+@defmac AC_SIZEOF_TYPE
+@acindex{SIZEOF_TYPE}
+Replaced by @code{AC_CHECK_SIZEOF} (@pxref{AC_CHECK_SIZEOF}).
+@end defmac
+
+@defmac AC_SIZE_T
+@acindex{SIZE_T}
+Replaced by @code{AC_TYPE_SIZE_T} (@pxref{AC_TYPE_SIZE_T}).
+@end defmac
+
+@defmac AC_STAT_MACROS_BROKEN
+@acindex{STAT_MACROS_BROKEN}
+Replaced by @code{AC_HEADER_STAT} (@pxref{AC_HEADER_STAT}).
+@end defmac
+
+@defmac AC_STDC_HEADERS
+@acindex{STDC_HEADERS}
+Replaced by @code{AC_HEADER_STDC} (@pxref{AC_HEADER_STDC}).
+@end defmac
+
+@defmac AC_STRCOLL
+@acindex{STRCOLL}
+Replaced by @code{AC_FUNC_STRCOLL} (@pxref{AC_FUNC_STRCOLL}).
+@end defmac
+
+@defmac AC_STRUCT_ST_BLKSIZE
+@acindex{STRUCT_ST_BLKSIZE}
+@cvindex HAVE_STRUCT_STAT_ST_BLKSIZE
+@cvindex HAVE_ST_BLKSIZE
+If @code{struct stat} contains an @code{st_blksize} member, define
+@code{HAVE_STRUCT_STAT_ST_BLKSIZE}. The former name,
+@code{HAVE_ST_BLKSIZE} is to be avoided, as its support will cease in
+the future. This macro is obsoleted, and should be replaced by
+
+@example
+AC_CHECK_MEMBERS([struct stat.st_blksize])
+@end example
+@noindent
+@xref{AC_CHECK_MEMBERS}.
+@end defmac
+
+@defmac AC_STRUCT_ST_RDEV
+@acindex{STRUCT_ST_RDEV}
+@cvindex HAVE_ST_RDEV
+@cvindex HAVE_STRUCT_STAT_ST_RDEV
+If @code{struct stat} contains an @code{st_rdev} member, define
+@code{HAVE_STRUCT_STAT_ST_RDEV}. The former name for this macro,
+@code{HAVE_ST_RDEV}, is to be avoided as it will cease to be supported
+in the future. Actually, even the new macro is obsolete and should be
+replaced by:
+@example
+AC_CHECK_MEMBERS([struct stat.st_rdev])
+@end example
+@noindent
+@xref{AC_CHECK_MEMBERS}.
+@end defmac
+
+@defmac AC_ST_BLKSIZE
+@acindex{ST_BLKSIZE}
+Replaced by @code{AC_CHECK_MEMBERS} (@pxref{AC_CHECK_MEMBERS}).
+@end defmac
+
+@defmac AC_ST_BLOCKS
+@acindex{ST_BLOCKS}
+Replaced by @code{AC_STRUCT_ST_BLOCKS} (@pxref{AC_STRUCT_ST_BLOCKS}).
+@end defmac
+
+@defmac AC_ST_RDEV
+@acindex{ST_RDEV}
+Replaced by @code{AC_CHECK_MEMBERS} (@pxref{AC_CHECK_MEMBERS}).
+@end defmac
+
+@defmac AC_SYS_RESTARTABLE_SYSCALLS
+@acindex{SYS_RESTARTABLE_SYSCALLS}
+@cvindex HAVE_RESTARTABLE_SYSCALLS
+If the system automatically restarts a system call that is interrupted
+by a signal, define @code{HAVE_RESTARTABLE_SYSCALLS}. This macro does
+not check whether system calls are restarted in general---it checks whether a
+signal handler installed with @code{signal} (but not @code{sigaction})
+causes system calls to be restarted. It does not check whether system calls
+can be restarted when interrupted by signals that have no handler.
+
+These days portable programs should use @code{sigaction} with
+@code{SA_RESTART} if they want restartable system calls. They should
+not rely on @code{HAVE_RESTARTABLE_SYSCALLS}, since nowadays whether a
+system call is restartable is a dynamic issue, not a configuration-time
+issue.
+@end defmac
+
+@defmac AC_SYS_SIGLIST_DECLARED
+@acindex{SYS_SIGLIST_DECLARED}
+This macro was renamed @code{AC_DECL_SYS_SIGLIST}. However, even that
+name is obsolete, as the same functionality is now achieved via
+@code{AC_CHECK_DECLS} (@pxref{AC_CHECK_DECLS}).
+@end defmac
+
+@defmac AC_TEST_CPP
+@acindex{TEST_CPP}
+This macro was renamed @code{AC_TRY_CPP}, which in turn was replaced by
+@code{AC_PREPROC_IFELSE} (@pxref{AC_PREPROC_IFELSE}).
+@end defmac
+
+@defmac AC_TEST_PROGRAM
+@acindex{TEST_PROGRAM}
+This macro was renamed @code{AC_TRY_RUN}, which in turn was replaced by
+@code{AC_RUN_IFELSE} (@pxref{AC_RUN_IFELSE}).
+@end defmac
+
+@defmac AC_TIMEZONE
+@acindex{TIMEZONE}
+Replaced by @code{AC_STRUCT_TIMEZONE} (@pxref{AC_STRUCT_TIMEZONE}).
+@end defmac
+
+@defmac AC_TIME_WITH_SYS_TIME
+@acindex{TIME_WITH_SYS_TIME}
+Replaced by @code{AC_HEADER_TIME} (@pxref{AC_HEADER_TIME}).
+@end defmac
+
+@defmac AC_TRY_COMPILE (@var{includes}, @var{function-body}, @
+ @ovar{action-if-true}, @ovar{action-if-false})
+@acindex{TRY_COMPILE}
+Same as:
+
+@example
+AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[@var{includes}]],
+ [[@var{function-body}]])],
+ [@var{action-if-true}],
+ [@var{action-if-false}])
+@end example
+
+@noindent
+@xref{Running the Compiler}.
+
+This macro double quotes both @var{includes} and @var{function-body}.
+
+For C and C++, @var{includes} is any @code{#include} statements needed
+by the code in @var{function-body} (@var{includes} is ignored if
+the currently selected language is Fortran or Fortran 77). The compiler
+and compilation flags are determined by the current language
+(@pxref{Language Choice}).
+@end defmac
+
+@defmac AC_TRY_CPP (@var{input}, @ovar{action-if-true}, @ovar{action-if-false})
+@acindex{TRY_CPP}
+Same as:
+
+@example
+AC_PREPROC_IFELSE(
+ [AC_LANG_SOURCE([[@var{input}]])],
+ [@var{action-if-true}],
+ [@var{action-if-false}])
+@end example
+
+@noindent
+@xref{Running the Preprocessor}.
+
+This macro double quotes the @var{input}.
+@end defmac
+
+@defmac AC_TRY_LINK (@var{includes}, @var{function-body}, @
+ @ovar{action-if-true}, @ovar{action-if-false})
+@acindex{TRY_LINK}
+Same as:
+
+@example
+AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[@var{includes}]],
+ [[@var{function-body}]])],
+ [@var{action-if-true}],
+ [@var{action-if-false}])
+@end example
+
+@noindent
+@xref{Running the Compiler}.
+
+This macro double quotes both @var{includes} and @var{function-body}.
+
+Depending on the current language (@pxref{Language Choice}), create a
+test program to see whether a function whose body consists of
+@var{function-body} can be compiled and linked. If the file compiles
+and links successfully, run shell commands @var{action-if-found},
+otherwise run @var{action-if-not-found}.
+
+This macro double quotes both @var{includes} and @var{function-body}.
+
+For C and C++, @var{includes} is any @code{#include} statements needed
+by the code in @var{function-body} (@var{includes} is ignored if
+the currently selected language is Fortran or Fortran 77). The compiler
+and compilation flags are determined by the current language
+(@pxref{Language Choice}), and in addition @code{LDFLAGS} and
+@code{LIBS} are used for linking.
+@end defmac
+
+@defmac AC_TRY_LINK_FUNC (@var{function}, @ovar{action-if-found}, @
+ @ovar{action-if-not-found})
+@acindex{TRY_LINK_FUNC}
+This macro is equivalent to
+@example
+AC_LINK_IFELSE([AC_LANG_CALL([], [@var{function}])],
+ [@var{action-if-found}], [@var{action-if-not-found}])
+@end example
+@noindent
+@xref{AC_LINK_IFELSE}.
+@end defmac
+
+@defmac AC_TRY_RUN (@var{program}, @ovar{action-if-true}, @
+ @ovar{action-if-false}, @dvar{action-if-cross-compiling, AC_MSG_FAILURE})
+@acindex{TRY_RUN}
+Same as:
+
+@example
+AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[@var{program}]])],
+ [@var{action-if-true}],
+ [@var{action-if-false}],
+ [@var{action-if-cross-compiling}])
+@end example
+
+@noindent
+@xref{Runtime}.
+@end defmac
+
+@anchor{AC_TYPE_SIGNAL}
+@defmac AC_TYPE_SIGNAL
+@acindex{TYPE_SIGNAL}
+@cvindex RETSIGTYPE
+@hdrindex{signal.h}
+If @file{signal.h} declares @code{signal} as returning a pointer to a
+function returning @code{void}, define @code{RETSIGTYPE} to be
+@code{void}; otherwise, define it to be @code{int}. These days, it is
+portable to assume C89, and that signal handlers return @code{void},
+without needing to use this macro or @code{RETSIGTYPE}.
+
+When targeting older K&R C, it is possible to define signal handlers as
+returning type @code{RETSIGTYPE}, and omit a return statement:
+
+@example
+@group
+RETSIGTYPE
+hup_handler ()
+@{
+@dots{}
+@}
+@end group
+@end example
+@end defmac
+
+@defmac AC_UID_T
+@acindex{UID_T}
+Replaced by @code{AC_TYPE_UID_T} (@pxref{AC_TYPE_UID_T}).
+@end defmac
+
+@defmac AC_UNISTD_H
+@acindex{UNISTD_H}
+Same as @samp{AC_CHECK_HEADERS([unistd.h])} (@pxref{AC_CHECK_HEADERS}).
+@end defmac
+
+@defmac AC_USG
+@acindex{USG}
+@cvindex USG
+Define @code{USG} if the BSD string functions are defined in
+@file{strings.h}. You should no longer depend upon @code{USG}, but on
+@code{HAVE_STRING_H}; see @ref{Standard Symbols}.
+@end defmac
+
+@defmac AC_UTIME_NULL
+@acindex{UTIME_NULL}
+Replaced by @code{AC_FUNC_UTIME_NULL} (@pxref{AC_FUNC_UTIME_NULL}).
+@end defmac
+
+@defmac AC_VALIDATE_CACHED_SYSTEM_TUPLE (@ovar{cmd})
+@acindex{VALIDATE_CACHED_SYSTEM_TUPLE}
+If the cache file is inconsistent with the current host, target and
+build system types, it used to execute @var{cmd} or print a default
+error message. This is now handled by default.
+@end defmac
+
+@defmac AC_VERBOSE (@var{result-description})
+@acindex{VERBOSE}
+Replaced by @code{AC_MSG_RESULT} (@pxref{AC_MSG_RESULT}).
+@end defmac
+
+@defmac AC_VFORK
+@acindex{VFORK}
+Replaced by @code{AC_FUNC_FORK} (@pxref{AC_FUNC_FORK}).
+@end defmac
+
+@defmac AC_VPRINTF
+@acindex{VPRINTF}
+Replaced by @code{AC_FUNC_VPRINTF} (@pxref{AC_FUNC_VPRINTF}).
+@end defmac
+
+@defmac AC_WAIT3
+@acindex{WAIT3}
+This macro was renamed @code{AC_FUNC_WAIT3}. However, these days
+portable programs should use @code{waitpid}, not @code{wait3}, as
+@code{wait3} has been removed from Posix.
+@end defmac
+
+@defmac AC_WARN
+@acindex{WARN}
+Replaced by @code{AC_MSG_WARN} (@pxref{AC_MSG_WARN}).
+@end defmac
+
+@defmac AC_WITH (@var{package}, @var{action-if-given}, @
+ @ovar{action-if-not-given})
+@acindex{WITH}
+This is an obsolete version of @code{AC_ARG_WITH} that does not
+support providing a help string (@pxref{AC_ARG_WITH}).
+@end defmac
+
+@defmac AC_WORDS_BIGENDIAN
+@acindex{WORDS_BIGENDIAN}
+Replaced by @code{AC_C_BIGENDIAN} (@pxref{AC_C_BIGENDIAN}).
+@end defmac
+
+@defmac AC_XENIX_DIR
+@acindex{XENIX_DIR}
+@ovindex LIBS
+This macro used to add @option{-lx} to output variable @code{LIBS} if on
+Xenix. Also, if @file{dirent.h} is being checked for, added
+@option{-ldir} to @code{LIBS}. Now it is merely an alias of
+@code{AC_HEADER_DIRENT} instead, plus some code to detect whether
+running XENIX on which you should not depend:
+
+@example
+AC_MSG_CHECKING([for Xenix])
+AC_EGREP_CPP([yes],
+[#if defined M_XENIX && !defined M_UNIX
+ yes
+#endif],
+ [AC_MSG_RESULT([yes]); XENIX=yes],
+ [AC_MSG_RESULT([no]); XENIX=])
+@end example
+@noindent
+Don't use this macro, the dignified means to check the nature of the
+host is using @code{AC_CANONICAL_HOST} (@pxref{Canonicalizing}).
+@end defmac
+
+@defmac AC_YYTEXT_POINTER
+@acindex{YYTEXT_POINTER}
+This macro was renamed @code{AC_DECL_YYTEXT}, which in turn was
+integrated into @code{AC_PROG_LEX} (@pxref{AC_PROG_LEX}).
+@end defmac
+
+@node Autoconf 1
+@section Upgrading From Version 1
+@cindex Upgrading autoconf
+@cindex Autoconf upgrading
+
+Autoconf version 2 is mostly backward compatible with version 1.
+However, it introduces better ways to do some things, and doesn't
+support some of the ugly things in version 1. So, depending on how
+sophisticated your @file{configure.ac} files are, you might have to do
+some manual work in order to upgrade to version 2. This chapter points
+out some problems to watch for when upgrading. Also, perhaps your
+@command{configure} scripts could benefit from some of the new features in
+version 2; the changes are summarized in the file @file{NEWS} in the
+Autoconf distribution.
+
+@menu
+* Changed File Names:: Files you might rename
+* Changed Makefiles:: New things to put in @file{Makefile.in}
+* Changed Macros:: Macro calls you might replace
+* Changed Results:: Changes in how to check test results
+* Changed Macro Writing:: Better ways to write your own macros
+@end menu
+
+@node Changed File Names
+@subsection Changed File Names
+
+If you have an @file{aclocal.m4} installed with Autoconf (as opposed to
+in a particular package's source directory), you must rename it to
+@file{acsite.m4}. @xref{autoconf Invocation}.
+
+If you distribute @file{install.sh} with your package, rename it to
+@file{install-sh} so @command{make} builtin rules don't inadvertently
+create a file called @file{install} from it. @code{AC_PROG_INSTALL}
+looks for the script under both names, but it is best to use the new name.
+
+If you were using @file{config.h.top}, @file{config.h.bot}, or
+@file{acconfig.h}, you still can, but you have less clutter if you
+use the @code{AH_} macros. @xref{Autoheader Macros}.
+
+@node Changed Makefiles
+@subsection Changed Makefiles
+
+Add @samp{@@CFLAGS@@}, @samp{@@CPPFLAGS@@}, and @samp{@@LDFLAGS@@} in
+your @file{Makefile.in} files, so they can take advantage of the values
+of those variables in the environment when @command{configure} is run.
+Doing this isn't necessary, but it's a convenience for users.
+
+Also add @samp{@@configure_input@@} in a comment to each input file for
+@code{AC_OUTPUT}, so that the output files contain a comment saying
+they were produced by @command{configure}. Automatically selecting the
+right comment syntax for all the kinds of files that people call
+@code{AC_OUTPUT} on became too much work.
+
+Add @file{config.log} and @file{config.cache} to the list of files you
+remove in @code{distclean} targets.
+
+If you have the following in @file{Makefile.in}:
+
+@example
+prefix = /usr/local
+exec_prefix = $(prefix)
+@end example
+
+@noindent
+you must change it to:
+
+@example
+prefix = @@prefix@@
+exec_prefix = @@exec_prefix@@
+@end example
+
+@noindent
+The old behavior of replacing those variables without @samp{@@}
+characters around them has been removed.
+
+@node Changed Macros
+@subsection Changed Macros
+
+Many of the macros were renamed in Autoconf version 2. You can still
+use the old names, but the new ones are clearer, and it's easier to find
+the documentation for them. @xref{Obsolete Macros}, for a table showing the
+new names for the old macros. Use the @command{autoupdate} program to
+convert your @file{configure.ac} to using the new macro names.
+@xref{autoupdate Invocation}.
+
+Some macros have been superseded by similar ones that do the job better,
+but are not call-compatible. If you get warnings about calling obsolete
+macros while running @command{autoconf}, you may safely ignore them, but
+your @command{configure} script generally works better if you follow
+the advice that is printed about what to replace the obsolete macros with. In
+particular, the mechanism for reporting the results of tests has
+changed. If you were using @command{echo} or @code{AC_VERBOSE} (perhaps
+via @code{AC_COMPILE_CHECK}), your @command{configure} script's output
+looks better if you switch to @code{AC_MSG_CHECKING} and
+@code{AC_MSG_RESULT}. @xref{Printing Messages}. Those macros work best
+in conjunction with cache variables. @xref{Caching Results}.
+
+
+
+@node Changed Results
+@subsection Changed Results
+
+If you were checking the results of previous tests by examining the
+shell variable @code{DEFS}, you need to switch to checking the values of
+the cache variables for those tests. @code{DEFS} no longer exists while
+@command{configure} is running; it is only created when generating output
+files. This difference from version 1 is because properly quoting the
+contents of that variable turned out to be too cumbersome and
+inefficient to do every time @code{AC_DEFINE} is called. @xref{Cache
+Variable Names}.
+
+For example, here is a @file{configure.ac} fragment written for Autoconf
+version 1:
+
+@example
+AC_HAVE_FUNCS(syslog)
+case "$DEFS" in
+*-DHAVE_SYSLOG*) ;;
+*) # syslog is not in the default libraries. See if it's in some other.
+ saved_LIBS="$LIBS"
+ for lib in bsd socket inet; do
+ AC_CHECKING(for syslog in -l$lib)
+ LIBS="-l$lib $saved_LIBS"
+ AC_HAVE_FUNCS(syslog)
+ case "$DEFS" in
+ *-DHAVE_SYSLOG*) break ;;
+ *) ;;
+ esac
+ LIBS="$saved_LIBS"
+ done ;;
+esac
+@end example
+
+Here is a way to write it for version 2:
+
+@example
+AC_CHECK_FUNCS([syslog])
+if test "x$ac_cv_func_syslog" = xno; then
+ # syslog is not in the default libraries. See if it's in some other.
+ for lib in bsd socket inet; do
+ AC_CHECK_LIB([$lib], [syslog], [AC_DEFINE([HAVE_SYSLOG])
+ LIBS="-l$lib $LIBS"; break])
+ done
+fi
+@end example
+
+If you were working around bugs in @code{AC_DEFINE_UNQUOTED} by adding
+backslashes before quotes, you need to remove them. It now works
+predictably, and does not treat quotes (except back quotes) specially.
+@xref{Setting Output Variables}.
+
+All of the Boolean shell variables set by Autoconf macros now use
+@samp{yes} for the true value. Most of them use @samp{no} for false,
+though for backward compatibility some use the empty string instead. If
+you were relying on a shell variable being set to something like 1 or
+@samp{t} for true, you need to change your tests.
+
+@node Changed Macro Writing
+@subsection Changed Macro Writing
+
+When defining your own macros, you should now use @code{AC_DEFUN}
+instead of @code{define}. @code{AC_DEFUN} automatically calls
+@code{AC_PROVIDE} and ensures that macros called via @code{AC_REQUIRE}
+do not interrupt other macros, to prevent nested @samp{checking@dots{}}
+messages on the screen. There's no actual harm in continuing to use the
+older way, but it's less convenient and attractive. @xref{Macro
+Definitions}.
+
+You probably looked at the macros that came with Autoconf as a guide for
+how to do things. It would be a good idea to take a look at the new
+versions of them, as the style is somewhat improved and they take
+advantage of some new features.
+
+If you were doing tricky things with undocumented Autoconf internals
+(macros, variables, diversions), check whether you need to change
+anything to account for changes that have been made. Perhaps you can
+even use an officially supported technique in version 2 instead of
+kludging. Or perhaps not.
+
+To speed up your locally written feature tests, add caching to them.
+See whether any of your tests are of general enough usefulness to
+encapsulate them into macros that you can share.
+
+
+@node Autoconf 2.13
+@section Upgrading From Version 2.13
+@cindex Upgrading autoconf
+@cindex Autoconf upgrading
+
+The introduction of the previous section (@pxref{Autoconf 1}) perfectly
+suits this section@enddots{}
+
+@quotation
+Autoconf version 2.50 is mostly backward compatible with version 2.13.
+However, it introduces better ways to do some things, and doesn't
+support some of the ugly things in version 2.13. So, depending on how
+sophisticated your @file{configure.ac} files are, you might have to do
+some manual work in order to upgrade to version 2.50. This chapter
+points out some problems to watch for when upgrading. Also, perhaps
+your @command{configure} scripts could benefit from some of the new
+features in version 2.50; the changes are summarized in the file
+@file{NEWS} in the Autoconf distribution.
+@end quotation
+
+@menu
+* Changed Quotation:: Broken code which used to work
+* New Macros:: Interaction with foreign macros
+* Hosts and Cross-Compilation:: Bugward compatibility kludges
+* AC_LIBOBJ vs LIBOBJS:: LIBOBJS is a forbidden token
+* AC_ACT_IFELSE vs AC_TRY_ACT:: A more generic scheme for testing sources
+@end menu
+
+@node Changed Quotation
+@subsection Changed Quotation
+
+The most important changes are invisible to you: the implementation of
+most macros have completely changed. This allowed more factorization of
+the code, better error messages, a higher uniformity of the user's
+interface etc. Unfortunately, as a side effect, some construct which
+used to (miraculously) work might break starting with Autoconf 2.50.
+The most common culprit is bad quotation.
+
+For instance, in the following example, the message is not properly
+quoted:
+
+@example
+AC_INIT
+AC_CHECK_HEADERS(foo.h, ,
+ AC_MSG_ERROR(cannot find foo.h, bailing out))
+AC_OUTPUT
+@end example
+
+@noindent
+Autoconf 2.13 simply ignores it:
+
+@example
+$ @kbd{autoconf-2.13; ./configure --silent}
+creating cache ./config.cache
+configure: error: cannot find foo.h
+$
+@end example
+
+@noindent
+while Autoconf 2.50 produces a broken @file{configure}:
+
+@example
+$ @kbd{autoconf-2.50; ./configure --silent}
+configure: error: cannot find foo.h
+./configure: exit: bad non-numeric arg `bailing'
+./configure: exit: bad non-numeric arg `bailing'
+$
+@end example
+
+The message needs to be quoted, and the @code{AC_MSG_ERROR} invocation
+too!
+
+@example
+AC_INIT([Example], [1.0], [bug-example@@example.org])
+AC_CHECK_HEADERS([foo.h], [],
+ [AC_MSG_ERROR([cannot find foo.h, bailing out])])
+AC_OUTPUT
+@end example
+
+Many many (and many more) Autoconf macros were lacking proper quotation,
+including no less than@dots{} @code{AC_DEFUN} itself!
+
+@example
+$ @kbd{cat configure.in}
+AC_DEFUN([AC_PROG_INSTALL],
+[# My own much better version
+])
+AC_INIT
+AC_PROG_INSTALL
+AC_OUTPUT
+$ @kbd{autoconf-2.13}
+autoconf: Undefined macros:
+***BUG in Autoconf--please report*** AC_FD_MSG
+***BUG in Autoconf--please report*** AC_EPI
+configure.in:1:AC_DEFUN([AC_PROG_INSTALL],
+configure.in:5:AC_PROG_INSTALL
+$ @kbd{autoconf-2.50}
+$
+@end example
+
+
+@node New Macros
+@subsection New Macros
+
+@cindex undefined macro
+@cindex @code{_m4_divert_diversion}
+
+While Autoconf was relatively dormant in the late 1990s, Automake
+provided Autoconf-like macros for a while. Starting with Autoconf 2.50
+in 2001, Autoconf provided
+versions of these macros, integrated in the @code{AC_} namespace,
+instead of @code{AM_}. But in order to ease the upgrading via
+@command{autoupdate}, bindings to such @code{AM_} macros are provided.
+
+Unfortunately older versions of Automake (e.g., Automake 1.4)
+did not quote the names of these macros.
+Therefore, when @command{m4} finds something like
+@samp{AC_DEFUN(AM_TYPE_PTRDIFF_T, @dots{})} in @file{aclocal.m4},
+@code{AM_TYPE_PTRDIFF_T} is
+expanded, replaced with its Autoconf definition.
+
+Fortunately Autoconf catches pre-@code{AC_INIT} expansions, and
+complains, in its own words:
+
+@example
+$ @kbd{cat configure.ac}
+AC_INIT([Example], [1.0], [bug-example@@example.org])
+AM_TYPE_PTRDIFF_T
+$ @kbd{aclocal-1.4}
+$ @kbd{autoconf}
+aclocal.m4:17: error: m4_defn: undefined macro: _m4_divert_diversion
+aclocal.m4:17: the top level
+autom4te: m4 failed with exit status: 1
+$
+@end example
+
+Modern versions of Automake no longer define most of these
+macros, and properly quote the names of the remaining macros.
+If you must use an old Automake, do not depend upon macros from Automake
+as it is simply not its job
+to provide macros (but the one it requires itself):
+
+@example
+$ @kbd{cat configure.ac}
+AC_INIT([Example], [1.0], [bug-example@@example.org])
+AM_TYPE_PTRDIFF_T
+$ @kbd{rm aclocal.m4}
+$ @kbd{autoupdate}
+autoupdate: `configure.ac' is updated
+$ @kbd{cat configure.ac}
+AC_INIT([Example], [1.0], [bug-example@@example.org])
+AC_CHECK_TYPES([ptrdiff_t])
+$ @kbd{aclocal-1.4}
+$ @kbd{autoconf}
+$
+@end example
+
+
+@node Hosts and Cross-Compilation
+@subsection Hosts and Cross-Compilation
+@cindex Cross compilation
+
+Based on the experience of compiler writers, and after long public
+debates, many aspects of the cross-compilation chain have changed:
+
+@itemize @minus
+@item
+the relationship between the build, host, and target architecture types,
+
+@item
+the command line interface for specifying them to @command{configure},
+
+@item
+the variables defined in @command{configure},
+
+@item
+the enabling of cross-compilation mode.
+@end itemize
+
+@sp 1
+
+The relationship between build, host, and target have been cleaned up:
+the chain of default is now simply: target defaults to host, host to
+build, and build to the result of @command{config.guess}. Nevertheless,
+in order to ease the transition from 2.13 to 2.50, the following
+transition scheme is implemented. @emph{Do not rely on it}, as it will
+be completely disabled in a couple of releases (we cannot keep it, as it
+proves to cause more problems than it cures).
+
+They all default to the result of running @command{config.guess}, unless
+you specify either @option{--build} or @option{--host}. In this case,
+the default becomes the system type you specified. If you specify both,
+and they're different, @command{configure} enters cross compilation
+mode, so it doesn't run any tests that require execution.
+
+Hint: if you mean to override the result of @command{config.guess},
+prefer @option{--build} over @option{--host}.
+
+@sp 1
+
+For backward compatibility, @command{configure} accepts a system
+type as an option by itself. Such an option overrides the
+defaults for build, host, and target system types. The following
+configure statement configures a cross toolchain that runs on
+NetBSD/alpha but generates code for GNU Hurd/sparc,
+which is also the build platform.
+
+@example
+./configure --host=alpha-netbsd sparc-gnu
+@end example
+
+@sp 1
+
+In Autoconf 2.13 and before, the variables @code{build}, @code{host},
+and @code{target} had a different semantics before and after the
+invocation of @code{AC_CANONICAL_BUILD} etc. Now, the argument of
+@option{--build} is strictly copied into @code{build_alias}, and is left
+empty otherwise. After the @code{AC_CANONICAL_BUILD}, @code{build} is
+set to the canonicalized build type. To ease the transition, before,
+its contents is the same as that of @code{build_alias}. Do @emph{not}
+rely on this broken feature.
+
+For consistency with the backward compatibility scheme exposed above,
+when @option{--host} is specified but @option{--build} isn't, the build
+system is assumed to be the same as @option{--host}, and
+@samp{build_alias} is set to that value. Eventually, this
+historically incorrect behavior will go away.
+
+@sp 1
+
+The former scheme to enable cross-compilation proved to cause more harm
+than good, in particular, it used to be triggered too easily, leaving
+regular end users puzzled in front of cryptic error messages.
+@command{configure} could even enter cross-compilation mode only
+because the compiler was not functional. This is mainly because
+@command{configure} used to try to detect cross-compilation, instead of
+waiting for an explicit flag from the user.
+
+Now, @command{configure} enters cross-compilation mode if and only if
+@option{--host} is passed.
+
+That's the short documentation. To ease the transition between 2.13 and
+its successors, a more complicated scheme is implemented. @emph{Do not
+rely on the following}, as it will be removed in the near future.
+
+If you specify @option{--host}, but not @option{--build}, when
+@command{configure} performs the first compiler test it tries to run
+an executable produced by the compiler. If the execution fails, it
+enters cross-compilation mode. This is fragile. Moreover, by the time
+the compiler test is performed, it may be too late to modify the
+build-system type: other tests may have already been performed.
+Therefore, whenever you specify @option{--host}, be sure to specify
+@option{--build} too.
+
+@example
+./configure --build=i686-pc-linux-gnu --host=m68k-coff
+@end example
+
+@noindent
+enters cross-compilation mode. The former interface, which
+consisted in setting the compiler to a cross-compiler without informing
+@command{configure} is obsolete. For instance, @command{configure}
+fails if it can't run the code generated by the specified compiler if you
+configure as follows:
+
+@example
+./configure CC=m68k-coff-gcc
+@end example
+
+
+@node AC_LIBOBJ vs LIBOBJS
+@subsection @code{AC_LIBOBJ} vs.@: @code{LIBOBJS}
+
+Up to Autoconf 2.13, the replacement of functions was triggered via the
+variable @code{LIBOBJS}. Since Autoconf 2.50, the macro
+@code{AC_LIBOBJ} should be used instead (@pxref{Generic Functions}).
+Starting at Autoconf 2.53, the use of @code{LIBOBJS} is an error.
+
+This change is mandated by the unification of the GNU Build System
+components. In particular, the various fragile techniques used to parse
+a @file{configure.ac} are all replaced with the use of traces. As a
+consequence, any action must be traceable, which obsoletes critical
+variable assignments. Fortunately, @code{LIBOBJS} was the only problem,
+and it can even be handled gracefully (read, ``without your having to
+change something'').
+
+There were two typical uses of @code{LIBOBJS}: asking for a replacement
+function, and adjusting @code{LIBOBJS} for Automake and/or Libtool.
+
+@sp 1
+
+As for function replacement, the fix is immediate: use
+@code{AC_LIBOBJ}. For instance:
+
+@example
+LIBOBJS="$LIBOBJS fnmatch.o"
+LIBOBJS="$LIBOBJS malloc.$ac_objext"
+@end example
+
+@noindent
+should be replaced with:
+
+@example
+AC_LIBOBJ([fnmatch])
+AC_LIBOBJ([malloc])
+@end example
+
+@sp 1
+
+@ovindex LIBOBJDIR
+When used with Automake 1.10 or newer, a suitable value for
+@code{LIBOBJDIR} is set so that the @code{LIBOBJS} and @code{LTLIBOBJS}
+can be referenced from any @file{Makefile.am}. Even without Automake,
+arranging for @code{LIBOBJDIR} to be set correctly enables
+referencing @code{LIBOBJS} and @code{LTLIBOBJS} in another directory.
+The @code{LIBOBJDIR} feature is experimental.
+
+
+@node AC_ACT_IFELSE vs AC_TRY_ACT
+@subsection @code{AC_@var{ACT}_IFELSE} vs.@: @code{AC_TRY_@var{ACT}}
+@c the anchor keeps the old node name, to try to avoid breaking links
+@anchor{AC_FOO_IFELSE vs AC_TRY_FOO}
+
+@acindex{@var{ACT}_IFELSE}
+@acindex{TRY_@var{ACT}}
+Since Autoconf 2.50, internal codes uses @code{AC_PREPROC_IFELSE},
+@code{AC_COMPILE_IFELSE}, @code{AC_LINK_IFELSE}, and
+@code{AC_RUN_IFELSE} on one hand and @code{AC_LANG_SOURCE},
+and @code{AC_LANG_PROGRAM} on the other hand instead of the deprecated
+@code{AC_TRY_CPP}, @code{AC_TRY_COMPILE}, @code{AC_TRY_LINK}, and
+@code{AC_TRY_RUN}. The motivations where:
+@itemize @minus
+@item
+a more consistent interface: @code{AC_TRY_COMPILE} etc.@: were double
+quoting their arguments;
+
+@item
+the combinatoric explosion is solved by decomposing on the one hand the
+generation of sources, and on the other hand executing the program;
+
+@item
+this scheme helps supporting more languages than plain C and C++.
+@end itemize
+
+In addition to the change of syntax, the philosophy has changed too:
+while emphasis was put on speed at the expense of accuracy, today's
+Autoconf promotes accuracy of the testing framework at, ahem@dots{}, the
+expense of speed.
+
+
+As a perfect example of what is @emph{not} to be done, here is how to
+find out whether a header file contains a particular declaration, such
+as a typedef, a structure, a structure member, or a function. Use
+@code{AC_EGREP_HEADER} instead of running @code{grep} directly on the
+header file; on some systems the symbol might be defined in another
+header file that the file you are checking includes.
+
+As a (bad) example, here is how you should not check for C preprocessor
+symbols, either defined by header files or predefined by the C
+preprocessor: using @code{AC_EGREP_CPP}:
+
+@example
+@group
+AC_EGREP_CPP(yes,
+[#ifdef _AIX
+ yes
+#endif
+], is_aix=yes, is_aix=no)
+@end group
+@end example
+
+The above example, properly written would (i) use
+@code{AC_LANG_PROGRAM}, and (ii) run the compiler:
+
+@example
+@group
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+[[#ifndef _AIX
+ error: This isn't AIX!
+#endif
+]])],
+ [is_aix=yes],
+ [is_aix=no])
+@end group
+@end example
+
+
+@c ============================= Generating Test Suites with Autotest
+
+@node Using Autotest
+@chapter Generating Test Suites with Autotest
+
+@cindex Autotest
+
+@display
+@strong{N.B.: This section describes a feature which is still
+stabilizing. Although we believe that Autotest is useful as-is, this
+documentation describes an interface which might change in the future:
+do not depend upon Autotest without subscribing to the Autoconf mailing
+lists.}
+@end display
+
+It is paradoxical that portable projects depend on nonportable tools
+to run their test suite. Autoconf by itself is the paragon of this
+problem: although it aims at perfectly portability, up to 2.13 its
+test suite was using DejaGNU, a rich and complex testing
+framework, but which is far from being standard on Posix systems.
+Worse yet, it was likely to be missing on the most fragile platforms,
+the very platforms that are most likely to torture Autoconf and
+exhibit deficiencies.
+
+To circumvent this problem, many package maintainers have developed their
+own testing framework, based on simple shell scripts whose sole outputs
+are exit status values describing whether the test succeeded. Most of
+these tests share common patterns, and this can result in lots of
+duplicated code and tedious maintenance.
+
+Following exactly the same reasoning that yielded to the inception of
+Autoconf, Autotest provides a test suite generation framework, based on
+M4 macros building a portable shell script. The suite itself is
+equipped with automatic logging and tracing facilities which greatly
+diminish the interaction with bug reporters, and simple timing reports.
+
+Autoconf itself has been using Autotest for years, and we do attest that
+it has considerably improved the strength of the test suite and the
+quality of bug reports. Other projects are known to use some generation
+of Autotest, such as Bison, Free Recode, Free Wdiff, GNU Tar, each of
+them with different needs, and this usage has validated Autotest as a general
+testing framework.
+
+Nonetheless, compared to DejaGNU, Autotest is inadequate for
+interactive tool testing, which is probably its main limitation.
+
+@menu
+* Using an Autotest Test Suite:: Autotest and the user
+* Writing Testsuites:: Autotest macros
+* testsuite Invocation:: Running @command{testsuite} scripts
+* Making testsuite Scripts:: Using autom4te to create @command{testsuite}
+@end menu
+
+@node Using an Autotest Test Suite
+@section Using an Autotest Test Suite
+
+@menu
+* testsuite Scripts:: The concepts of Autotest
+* Autotest Logs:: Their contents
+@end menu
+
+@node testsuite Scripts
+@subsection @command{testsuite} Scripts
+
+@cindex @command{testsuite}
+
+Generating testing or validation suites using Autotest is rather easy.
+The whole validation suite is held in a file to be processed through
+@command{autom4te}, itself using GNU M4 under the hood, to
+produce a stand-alone Bourne shell script which then gets distributed.
+Neither @command{autom4te} nor GNU M4 are needed at
+the installer's end.
+
+@cindex test group
+Each test of the validation suite should be part of some test group. A
+@dfn{test group} is a sequence of interwoven tests that ought to be
+executed together, usually because one test in the group creates data
+files that a later test in the same group needs to read. Complex test
+groups make later debugging more tedious. It is much better to
+keep only a few tests per test group. Ideally there is only one test
+per test group.
+
+For all but the simplest packages, some file such as @file{testsuite.at}
+does not fully hold all test sources, as these are often easier to
+maintain in separate files. Each of these separate files holds a single
+test group, or a sequence of test groups all addressing some common
+functionality in the package. In such cases, @file{testsuite.at}
+merely initializes the validation suite, and sometimes does elementary
+health checking, before listing include statements for all other test
+files. The special file @file{package.m4}, containing the
+identification of the package, is automatically included if found.
+
+A convenient alternative consists in moving all the global issues
+(local Autotest macros, elementary health checking, and @code{AT_INIT}
+invocation) into the file @code{local.at}, and making
+@file{testsuite.at} be a simple list of @code{m4_include}s of sub test
+suites. In such case, generating the whole test suite or pieces of it
+is only a matter of choosing the @command{autom4te} command line
+arguments.
+
+The validation scripts that Autotest produces are by convention called
+@command{testsuite}. When run, @command{testsuite} executes each test
+group in turn, producing only one summary line per test to say if that
+particular test succeeded or failed. At end of all tests, summarizing
+counters get printed. One debugging directory is left for each test
+group which failed, if any: such directories are named
+@file{testsuite.dir/@var{nn}}, where @var{nn} is the sequence number of
+the test group, and they include:
+
+@itemize @bullet
+@item a debugging script named @file{run} which reruns the test in
+@dfn{debug mode} (@pxref{testsuite Invocation}). The automatic generation
+of debugging scripts has the purpose of easing the chase for bugs.
+
+@item all the files created with @code{AT_DATA}
+
+@item all the Erlang source code files created with @code{AT_CHECK_EUNIT}
+
+@item a log of the run, named @file{testsuite.log}
+@end itemize
+
+In the ideal situation, none of the tests fail, and consequently no
+debugging directory is left behind for validation.
+
+It often happens in practice that individual tests in the validation
+suite need to get information coming out of the configuration process.
+Some of this information, common for all validation suites, is provided
+through the file @file{atconfig}, automatically created by
+@code{AC_CONFIG_TESTDIR}. For configuration information which your
+testing environment specifically needs, you might prepare an optional
+file named @file{atlocal.in}, instantiated by @code{AC_CONFIG_FILES}.
+The configuration process produces @file{atconfig} and @file{atlocal}
+out of these two input files, and these two produced files are
+automatically read by the @file{testsuite} script.
+
+Here is a diagram showing the relationship between files.
+
+@noindent
+Files used in preparing a software package for distribution:
+
+@example
+ [package.m4] -->.
+ \
+subfile-1.at ->. [local.at] ---->+
+ ... \ \
+subfile-i.at ---->-- testsuite.at -->-- autom4te* -->testsuite
+ ... /
+subfile-n.at ->'
+@end example
+
+@noindent
+Files used in configuring a software package:
+
+@example
+ .--> atconfig
+ /
+[atlocal.in] --> config.status* --<
+ \
+ `--> [atlocal]
+@end example
+
+@noindent
+Files created during test suite execution:
+
+@example
+atconfig -->. .--> testsuite.log
+ \ /
+ >-- testsuite* --<
+ / \
+[atlocal] ->' `--> [testsuite.dir]
+@end example
+
+
+@node Autotest Logs
+@subsection Autotest Logs
+
+When run, the test suite creates a log file named after itself, e.g., a
+test suite named @command{testsuite} creates @file{testsuite.log}. It
+contains a lot of information, usually more than maintainers actually
+need, but therefore most of the time it contains all that is needed:
+
+@table @asis
+@item command line arguments
+A bad but unfortunately widespread habit consists of
+setting environment variables before the command, such as in
+@samp{CC=my-home-grown-cc ./testsuite}. The test suite does not
+know this change, hence (i) it cannot report it to you, and (ii)
+it cannot preserve the value of @code{CC} for subsequent runs.
+Autoconf faced exactly the same problem, and solved it by asking
+users to pass the variable definitions as command line arguments.
+Autotest requires this rule, too, but has no means to enforce it; the log
+then contains a trace of the variables that were changed by the user.
+
+@item @file{ChangeLog} excerpts
+The topmost lines of all the @file{ChangeLog} files found in the source
+hierarchy. This is especially useful when bugs are reported against
+development versions of the package, since the version string does not
+provide sufficient information to know the exact state of the sources
+the user compiled. Of course, this relies on the use of a
+@file{ChangeLog}.
+
+@item build machine
+Running a test suite in a cross-compile environment is not an easy task,
+since it would mean having the test suite run on a machine @var{build},
+while running programs on a machine @var{host}. It is much simpler to
+run both the test suite and the programs on @var{host}, but then, from
+the point of view of the test suite, there remains a single environment,
+@var{host} = @var{build}. The log contains relevant information on the
+state of the @var{build} machine, including some important environment
+variables.
+@c FIXME: How about having an M4sh macro to say `hey, log the value
+@c of `@dots{}'? This would help both Autoconf and Autotest.
+
+@item tested programs
+The absolute file name and answers to @option{--version} of the tested
+programs (see @ref{Writing Testsuites}, @code{AT_TESTED}).
+
+@item configuration log
+The contents of @file{config.log}, as created by @command{configure},
+are appended. It contains the configuration flags and a detailed report
+on the configuration itself.
+@end table
+
+
+@node Writing Testsuites
+@section Writing @file{testsuite.at}
+
+The @file{testsuite.at} is a Bourne shell script making use of special
+Autotest M4 macros. It often contains a call to @code{AT_INIT} near
+its beginning followed by one call to @code{m4_include} per source file
+for tests. Each such included file, or the remainder of
+@file{testsuite.at} if include files are not used, contain a sequence of
+test groups. Each test group begins with a call to @code{AT_SETUP},
+then an arbitrary number of shell commands or calls to @code{AT_CHECK},
+and then completes with a call to @code{AT_CLEANUP}. Multiple test
+groups can be categorized by a call to @code{AT_BANNER}.
+
+All of the public Autotest macros have all-uppercase names in the
+namespace @samp{^AT_} to prevent them from accidentally conflicting with
+other text; Autoconf also reserves the namespace @samp{^_AT_} for
+internal macros. All shell variables used in the testsuite for internal
+purposes have mostly-lowercase names starting with @samp{at_}. Autotest
+also uses here-document delimiters in the namespace @samp{^_AT[A-Z]}, and
+makes use of the file system namespace @samp{^at-}.
+
+Since Autoconf is built on top of M4sugar (@pxref{Programming in
+M4sugar}) and M4sh (@pxref{Programming in M4sh}), you must also be aware
+of those namespaces (@samp{^_?\(m4\|AS\)_}). In general, you
+@emph{should not use} the namespace of a package that does not own the
+macro or shell code you are writing.
+
+@defmac AT_INIT (@ovar{name})
+@atindex{INIT}
+@c FIXME: Not clear, plus duplication of the information.
+Initialize Autotest. Giving a @var{name} to the test suite is
+encouraged if your package includes several test suites. Before this
+macro is called, @code{AT_PACKAGE_STRING} and
+@code{AT_PACKAGE_BUGREPORT} must be defined, which are used to display
+information about the testsuite to the user. Typically, these macros
+are provided by a file @file{package.m4} built by @command{make}
+(@pxref{Making testsuite Scripts}), in order to inherit the package
+name, version, and bug reporting address from @file{configure.ac}.
+@end defmac
+
+@defmac AT_COPYRIGHT (@var{copyright-notice})
+@atindex{COPYRIGHT}
+@cindex Copyright Notice
+State that, in addition to the Free Software Foundation's copyright on
+the Autotest macros, parts of your test suite are covered by
+@var{copyright-notice}.
+
+The @var{copyright-notice} shows up in both the head of
+@command{testsuite} and in @samp{testsuite --version}.
+@end defmac
+
+@defmac AT_ARG_OPTION (@var{options}, @var{help-text}, @
+ @ovar{action-if-given}, @ovar{action-if-not-given})
+@atindex{ARG_OPTION}
+@vrindex at_arg_@var{option}
+Accept options from the space-separated list @var{options}, a list that
+has leading dashes removed from the options. Long options will be
+prefixed with @samp{--}, single-character options with @samp{-}. The
+first word in this list is the primary @var{option}, any others are
+assumed to be short-hand aliases. The variable associated with it
+is @code{at_arg_@var{option}}, with any dashes in @var{option} replaced
+with underscores.
+
+If the user passes @option{--@var{option}} to the @command{testsuite},
+the variable will be set to @samp{:}. If the user does not pass the
+option, or passes @option{--no-@var{option}}, then the variable will be
+set to @samp{false}.
+
+@vrindex at_optarg
+@vrindex at_optarg_@var{option}
+@var{action-if-given} is run each time the option is encountered; here,
+the variable @code{at_optarg} will be set to @samp{:} or @samp{false} as
+appropriate. @code{at_optarg} is actually just a copy of
+@code{at_arg_@var{option}}.
+
+@var{action-if-not-given} will be run once after option parsing is
+complete and if no option from @var{options} was used.
+
+@var{help-text} is added to the end of the list of options shown in
+@command{testsuite --help} (@pxref{AS_HELP_STRING}).
+
+It is recommended that you use a package-specific prefix to @var{options}
+names in order to avoid clashes with future Autotest built-in options.
+@end defmac
+
+@defmac AT_ARG_OPTION_ARG (@var{options}, @var{help-text}, @
+ @ovar{action-if-given}, @ovar{action-if-not-given})
+@atindex{ARG_OPTION_ARG}
+@vrindex at_arg_@var{option}
+Accept options with arguments from the space-separated list
+@var{options}, a list that has leading dashes removed from the options.
+Long options will be prefixed with @samp{--}, single-character options
+with @samp{-}. The first word in this list is the primary @var{option},
+any others are assumed to be short-hand aliases. The variable associated
+with it is @code{at_arg_@var{option}}, with any dashes in @var{option}
+replaced with underscores.
+
+If the user passes @option{--@var{option}=@var{arg}} or
+@option{--@var{option} @var{arg}} to the @command{testsuite}, the
+variable will be set to @samp{@var{arg}}.
+
+@vrindex at_optarg
+@var{action-if-given} is run each time the option is encountered; here,
+the variable @code{at_optarg} will be set to @samp{@var{arg}}.
+@code{at_optarg} is actually just a copy of @code{at_arg_@var{option}}.
+
+@var{action-if-not-given} will be run once after option parsing is
+complete and if no option from @var{options} was used.
+
+@var{help-text} is added to the end of the list of options shown in
+@command{testsuite --help} (@pxref{AS_HELP_STRING}).
+
+It is recommended that you use a package-specific prefix to @var{options}
+names in order to avoid clashes with future Autotest built-in options.
+@end defmac
+
+@defmac AT_COLOR_TESTS
+@atindex{COLOR_TESTS}
+Enable colored test results by default when the output is connected to
+a terminal.
+@end defmac
+
+@defmac AT_TESTED (@var{executables})
+@atindex{TESTED}
+Log the file name and answer to @option{--version} of each program in
+space-separated list @var{executables}. Several invocations register
+new executables, in other words, don't fear registering one program
+several times.
+
+Autotest test suites rely on @env{PATH} to find the tested program.
+This avoids the need to generate absolute names of the various tools, and
+makes it possible to test installed programs. Therefore, knowing which
+programs are being exercised is crucial to understanding problems in
+the test suite itself, or its occasional misuses. It is a good idea to
+also subscribe foreign programs you depend upon, to avoid incompatible
+diagnostics.
+@end defmac
+
+@sp 1
+
+@defmac AT_BANNER (@var{test-category-name})
+@atindex{BANNER}
+This macro identifies the start of a category of related test groups.
+When the resulting @file{testsuite} is invoked with more than one test
+group to run, its output will include a banner containing
+@var{test-category-name} prior to any tests run from that category. The
+banner should be no more than about 40 or 50 characters. A blank banner
+indicates uncategorized tests; an empty line will be inserted after
+tests from an earlier category, effectively ending that category.
+@end defmac
+
+@defmac AT_SETUP (@var{test-group-name})
+@atindex{SETUP}
+This macro starts a group of related tests, all to be executed in the
+same subshell. It accepts a single argument, which holds a few words
+(no more than about 30 or 40 characters) quickly describing the purpose
+of the test group being started. @var{test-group-name} must not expand
+to unbalanced quotes, although quadrigraphs can be used.
+@end defmac
+
+@defmac AT_KEYWORDS (@var{keywords})
+@atindex{KEYWORDS}
+Associate the space-separated list of @var{keywords} to the enclosing
+test group. This makes it possible to run ``slices'' of the test suite.
+For instance, if some of your test groups exercise some @samp{foo}
+feature, then using @samp{AT_KEYWORDS(foo)} lets you run
+@samp{./testsuite -k foo} to run exclusively these test groups. The
+@var{test-group-name} of the test group is automatically recorded to
+@code{AT_KEYWORDS}.
+
+Several invocations within a test group accumulate new keywords. In
+other words, don't fear registering the same keyword several times in a
+test group.
+@end defmac
+
+@defmac AT_CAPTURE_FILE (@var{file})
+@atindex{CAPTURE_FILE}
+If the current test group fails, log the contents of @var{file}.
+Several identical calls within one test group have no additional effect.
+@end defmac
+
+@defmac AT_FAIL_IF (@var{shell-condition})
+@atindex{FAIL_IF}
+Make the test group fail and skip the rest of its execution, if
+@var{shell-condition} is true. @var{shell-condition} is a shell expression
+such as a @code{test} command. Tests before @command{AT_FAIL_IF}
+will be executed and may still cause the test group to be skipped.
+You can instantiate this macro many times from within the same test group.
+
+You should use this macro only for very simple failure conditions. If the
+@var{shell-condition} could emit any kind of output you should instead
+use @command{AT_CHECK} like
+@example
+AT_CHECK([if @var{shell-condition}; then exit 99; fi])
+@end example
+@noindent
+so that such output is properly recorded in the @file{testsuite.log}
+file.
+@end defmac
+
+@defmac AT_SKIP_IF (@var{shell-condition})
+@atindex{SKIP_IF}
+Determine whether the test should be skipped because it requires
+features that are unsupported on the machine under test.
+@var{shell-condition} is a shell expression such as a @code{test}
+command. Tests before @command{AT_SKIP_IF} will be executed
+and may still cause the test group to fail. You can instantiate this
+macro many times from within the same test group.
+
+You should use this macro only for very simple skip conditions. If the
+@var{shell-condition} could emit any kind of output you should instead
+use @command{AT_CHECK} like
+@example
+AT_CHECK([if @var{shell-condition}; then exit 77; fi])
+@end example
+@noindent
+so that such output is properly recorded in the @file{testsuite.log}
+file.
+@end defmac
+
+@defmac AT_XFAIL_IF (@var{shell-condition})
+@atindex{XFAIL_IF}
+Determine whether the test is expected to fail because it is a known
+bug (for unsupported features, you should skip the test).
+@var{shell-condition} is a shell expression such as a @code{test}
+command; you can instantiate this macro many times from within the
+same test group, and one of the conditions is enough to turn
+the test into an expected failure.
+@end defmac
+
+@defmac AT_CLEANUP
+@atindex{CLEANUP}
+End the current test group.
+@end defmac
+
+@sp 1
+
+@defmac AT_DATA (@var{file}, @var{contents})
+@atindex{DATA}
+Initialize an input data @var{file} with given @var{contents}. Of
+course, the @var{contents} have to be properly quoted between square
+brackets to protect against included commas or spurious M4
+expansion. @var{contents} must be empty or end with a newline.
+@var{file} must
+be a single shell word that expands into a single file name.
+@end defmac
+
+@defmac AT_CHECK (@var{commands}, @dvar{status, 0}, @ovar{stdout}, @
+ @ovar{stderr}, @ovar{run-if-fail}, @ovar{run-if-pass})
+@defmacx AT_CHECK_UNQUOTED (@var{commands}, @dvar{status, 0}, @ovar{stdout}, @
+ @ovar{stderr}, @ovar{run-if-fail}, @ovar{run-if-pass})
+@atindex{CHECK}
+@atindex{CHECK_UNQUOTED}
+@vrindex at_status
+Execute a test by performing given shell @var{commands} in a subshell.
+@var{commands} is output as-is, so shell expansions are honored. These
+commands should normally exit with @var{status}, while producing expected
+@var{stdout} and @var{stderr} contents. If @var{commands} exit with
+unexpected status 77, then the rest of the test group is skipped. If
+@var{commands} exit with unexpected status 99, then the test group is
+immediately failed. Otherwise, if this test fails, run shell commands
+@var{run-if-fail} or, if this test passes, run shell commands
+@var{run-if-pass}, both inside the current shell execution environment.
+At the beginning of @var{run-if-fail} and @var{run-if-pass}, the status of
+@var{commands} is available in the @code{at_status} shell variable.
+
+This macro must be invoked in between @code{AT_SETUP} and @code{AT_CLEANUP}.
+
+If @var{status} is the literal @samp{ignore}, then the corresponding
+exit status is not checked, except for the special cases of 77 (skip)
+and 99 (hard failure). The existence of hard failures allows one to
+mark a test as an expected failure with @code{AT_XFAIL_IF} because a
+feature has not yet been implemented, but to still distinguish between
+gracefully handling the missing feature and dumping core. A hard
+failure also inhibits post-test actions in @var{run-if-fail}.
+
+If the value of the @var{stdout} or @var{stderr} parameter is one of the
+literals in the following table, then the test treats the output
+according to the rules of that literal. Otherwise, the value of the
+parameter is treated as text that must exactly match the output given by
+@var{commands} on standard output and standard error (including an empty
+parameter for no output); any differences are captured in the testsuite
+log and the test is failed (unless an unexpected exit status of 77
+skipped the test instead). The difference between @code{AT_CHECK} and
+@code{AT_CHECK_UNQUOTED} is that only the latter performs shell variable
+expansion (@samp{$}), command substitution (@samp{`}), and backslash
+escaping (@samp{\}) on comparison text given in the @var{stdout} and
+@var{stderr} arguments; if the text includes a trailing newline, this
+would be the same as if it were specified via an unquoted
+here-document. (However, there is no difference in the interpretation
+of @var{commands}).
+
+@table @samp
+@item ignore
+The content of the output is ignored, but still captured in the test
+group log (if the testsuite is run with option @option{-v}, the test
+group log is displayed as the test is run; if the test group later
+fails, the test group log is also copied into the overall testsuite
+log). This action is valid for both @var{stdout} and @var{stderr}.
+
+@item ignore-nolog
+The content of the output is ignored, and nothing is captured in the log
+files. If @var{commands} are likely to produce binary output (including
+long lines) or large amounts of output, then logging the output can make
+it harder to locate details related to subsequent tests within the
+group, and could potentially corrupt terminal display of a user running
+@command{testsuite -v}.
+
+@item stdout
+For the @var{stdout} parameter, capture the content of standard output
+to both the file @file{stdout} and the test group log. Subsequent
+commands in the test group can then post-process the file. This action
+is often used when it is desired to use @command{grep} to look for a
+substring in the output, or when the output must be post-processed to
+normalize error messages into a common form.
+
+@item stderr
+Like @samp{stdout}, except that it only works for the @var{stderr}
+parameter, and the standard error capture file will be named
+@file{stderr}.
+
+@item stdout-nolog
+@itemx stderr-nolog
+Like @samp{stdout} or @samp{stderr}, except that the captured output is
+not duplicated into the test group log. This action is particularly
+useful for an intermediate check that produces large amounts of data,
+which will be followed by another check that filters down to the
+relevant data, as it makes it easier to locate details in the log.
+
+@item expout
+For the @var{stdout} parameter, compare standard output contents with
+the previously created file @file{expout}, and list any differences in
+the testsuite log.
+
+@item experr
+Like @samp{expout}, except that it only works for the @var{stderr}
+parameter, and the standard error contents are compared with
+@file{experr}.
+@end table
+@end defmac
+
+@defmac AT_CHECK_EUNIT (@var{module}, @var{test-spec}, @ovar{erlflags}, @
+ @ovar{run-if-fail}, @ovar{run-if-pass})
+@atindex{CHECK_EUNIT}
+Initialize and execute an Erlang module named @var{module} that performs
+tests following the @var{test-spec} EUnit test specification.
+@var{test-spec} must be a valid EUnit test specification, as defined in
+the @uref{http://@/erlang.org/@/doc/@/apps/@/eunit/@/index.html, EUnit
+Reference Manual}. @var{erlflags} are optional command-line options
+passed to the Erlang interpreter to execute the test Erlang module.
+Typically, @var{erlflags} defines at least the paths to directories
+containing the compiled Erlang modules under test, as @samp{-pa path1
+path2 ...}.
+
+For example, the unit tests associated with Erlang module @samp{testme},
+which compiled code is in subdirectory @file{src}, can be performed
+with:
+
+@example
+AT_CHECK_EUNIT([testme_testsuite], [@{module, testme@}],
+ [-pa "$@{abs_top_builddir@}/src"])
+@end example
+
+This macro must be invoked in between @code{AT_SETUP} and @code{AT_CLEANUP}.
+
+Variables @code{ERL}, @code{ERLC}, and (optionally) @code{ERLCFLAGS}
+must be defined as the path of the Erlang interpreter, the path of the
+Erlang compiler, and the command-line flags to pass to the compiler,
+respectively. Those variables should be configured in
+@file{configure.ac} using the @command{AC_ERLANG_PATH_ERL} and
+@command{AC_ERLANG_PATH_ERLC} macros, and the configured values of those
+variables are automatically defined in the testsuite. If @code{ERL} or
+@code{ERLC} is not defined, the test group is skipped.
+
+If the EUnit library cannot be found, i.e. if module @code{eunit} cannot
+be loaded, the test group is skipped. Otherwise, if @var{test-spec} is
+an invalid EUnit test specification, the test group fails. Otherwise,
+if the EUnit test passes, shell commands @var{run-if-pass} are executed
+or, if the EUnit test fails, shell commands @var{run-if-fail} are
+executed and the test group fails.
+
+Only the generated test Erlang module is automatically compiled and
+executed. If @var{test-spec} involves testing other Erlang modules,
+e.g. module @samp{testme} in the example above, those modules must be
+already compiled.
+
+If the testsuite is run in verbose mode, with option @option{--verbose},
+EUnit is also run in verbose mode to output more details about
+individual unit tests.
+@end defmac
+
+
+@node testsuite Invocation
+@section Running @command{testsuite} Scripts
+@cindex @command{testsuite}
+
+Autotest test suites support the following options:
+
+@table @option
+@item --help
+@itemx -h
+Display the list of options and exit successfully.
+
+@item --version
+@itemx -V
+Display the version of the test suite and exit successfully.
+
+@item --directory=@var{dir}
+@itemx -C @var{dir}
+Change the current directory to @var{dir} before creating any files.
+Useful for running the testsuite in a subdirectory from a top-level
+Makefile.
+
+@item --jobs@r{[}=@var{n}@r{]}
+@itemx -j@ovar{n}
+Run @var{n} tests in parallel, if possible. If @var{n} is not given,
+run all given tests in parallel. Note that there should be no space
+before the argument to @option{-j}, as @option{-j @var{number}} denotes
+the separate arguments @option{-j} and @option{@var{number}}, see below.
+
+In parallel mode, the standard input device of the testsuite script is
+not available to commands inside a test group. Furthermore, banner
+lines are not printed, and the summary line for each test group is
+output after the test group completes. Summary lines may appear
+unordered. If verbose and trace output are enabled (see below), they
+may appear intermixed from concurrently running tests.
+
+Parallel mode requires the @command{mkfifo} command to work, and will be
+silently disabled otherwise.
+
+@item --clean
+@itemx -c
+Remove all the files the test suite might have created and exit. Meant
+for @code{clean} Make targets.
+
+@item --list
+@itemx -l
+List all the tests (or only the selection), including their possible
+keywords.
+@end table
+
+@sp 1
+
+By default all tests are performed (or described with @option{--list})
+silently in the default environment, but the environment, set of tests,
+and verbosity level can be tuned:
+
+@table @samp
+@item @var{variable}=@var{value}
+Set the environment @var{variable} to @var{value}. Use this rather
+than @samp{FOO=foo ./testsuite} as debugging scripts would then run in a
+different environment.
+
+@cindex @code{AUTOTEST_PATH}
+The variable @code{AUTOTEST_PATH} specifies the testing path to prepend
+to @env{PATH}. Relative directory names (not starting with
+@samp{/}) are considered to be relative to the top level of the
+package being built. All directories are made absolute, first
+starting from the top level @emph{build} tree, then from the
+@emph{source} tree. For instance @samp{./testsuite
+AUTOTEST_PATH=tests:bin} for a @file{/src/foo-1.0} source package built
+in @file{/tmp/foo} results in @samp{/tmp/foo/tests:/tmp/foo/bin} and
+then @samp{/src/foo-1.0/tests:/src/foo-1.0/bin} being prepended to
+@env{PATH}.
+
+@item @var{number}
+@itemx @var{number}-@var{number}
+@itemx @var{number}-
+@itemx -@var{number}
+Add the corresponding test groups, with obvious semantics, to the
+selection.
+
+@item --keywords=@var{keywords}
+@itemx -k @var{keywords}
+Add to the selection the test groups with title or keywords (arguments
+to @code{AT_SETUP} or @code{AT_KEYWORDS}) that match @emph{all} keywords
+of the comma separated list @var{keywords}, case-insensitively. Use
+@samp{!} immediately before the keyword to invert the selection for this
+keyword. By default, the keywords match whole words; enclose them in
+@samp{.*} to also match parts of words.
+
+For example, running
+
+@example
+@kbd{./testsuite -k 'autoupdate,.*FUNC.*'}
+@end example
+
+@noindent
+selects all tests tagged @samp{autoupdate} @emph{and} with tags
+containing @samp{FUNC} (as in @samp{AC_CHECK_FUNC}, @samp{AC_FUNC_ALLOCA},
+etc.), while
+
+@example
+@kbd{./testsuite -k '!autoupdate' -k '.*FUNC.*'}
+@end example
+
+@noindent
+selects all tests not tagged @samp{autoupdate} @emph{or} with tags
+containing @samp{FUNC}.
+
+@item --errexit
+@itemx -e
+If any test fails, immediately abort testing. This implies
+@option{--debug}: post test group clean up, and top-level logging
+are inhibited. This option is meant for the full test
+suite, it is not really useful for generated debugging scripts.
+If the testsuite is run in parallel mode using @option{--jobs},
+then concurrently running tests will finish before exiting.
+
+@item --verbose
+@itemx -v
+Force more verbosity in the detailed output of what is being done. This
+is the default for debugging scripts.
+
+@item --color
+@itemx --color@r{[}=never@r{|}auto@r{|}always@r{]}
+Enable colored test results. Without an argument, or with @samp{always},
+test results will be colored. With @samp{never}, color mode is turned
+off. Otherwise, if either the macro @code{AT_COLOR_TESTS} is used by
+the testsuite author, or the argument @samp{auto} is given, then test
+results are colored if standard output is connected to a terminal.
+
+@item --debug
+@itemx -d
+Do not remove the files after a test group was performed---but they are
+still removed @emph{before}, therefore using this option is sane when
+running several test groups. Create debugging scripts. Do not
+overwrite the top-level
+log (in order to preserve a supposedly existing full log file). This is
+the default for debugging scripts, but it can also be useful to debug
+the testsuite itself.
+
+@item --recheck
+Add to the selection all test groups that failed or passed unexpectedly
+during the last non-debugging test run.
+
+@item --trace
+@itemx -x
+Trigger shell tracing of the test groups.
+@end table
+
+Besides these options accepted by every Autotest testsuite, the
+testsuite author might have added package-specific options
+via the @code{AT_ARG_OPTION} and @code{AT_ARG_OPTION_ARG} macros
+(@pxref{Writing Testsuites}); refer to @command{testsuite --help} and
+the package documentation for details.
+
+
+@node Making testsuite Scripts
+@section Making @command{testsuite} Scripts
+
+For putting Autotest into movement, you need some configuration and
+makefile machinery. We recommend, at least if your package uses deep or
+shallow hierarchies, that you use @file{tests/} as the name of the
+directory holding all your tests and their makefile. Here is a
+check list of things to do.
+
+@itemize @minus
+
+@item
+@cindex @file{package.m4}
+@atindex{PACKAGE_STRING}
+@atindex{PACKAGE_BUGREPORT}
+@atindex{PACKAGE_NAME}
+@atindex{PACKAGE_TARNAME}
+@atindex{PACKAGE_VERSION}
+@atindex{PACKAGE_URL}
+Make sure to create the file @file{package.m4}, which defines the
+identity of the package. It must define @code{AT_PACKAGE_STRING}, the
+full signature of the package, and @code{AT_PACKAGE_BUGREPORT}, the
+address to which bug reports should be sent. For sake of completeness,
+we suggest that you also define @code{AT_PACKAGE_NAME},
+@code{AT_PACKAGE_TARNAME}, @code{AT_PACKAGE_VERSION}, and
+@code{AT_PACKAGE_URL}.
+@xref{Initializing configure}, for a description of these variables.
+Be sure to distribute @file{package.m4} and to put it into the source
+hierarchy: the test suite ought to be shipped! See below for an example
+@file{Makefile} excerpt.
+
+@item
+Invoke @code{AC_CONFIG_TESTDIR}.
+
+@defmac AC_CONFIG_TESTDIR (@var{directory}, @dvar{test-path, directory})
+@acindex{CONFIG_TESTDIR}
+An Autotest test suite is to be configured in @var{directory}. This
+macro causes @file{@var{directory}/atconfig} to be created by
+@command{config.status} and sets the default @code{AUTOTEST_PATH} to
+@var{test-path} (@pxref{testsuite Invocation}).
+@end defmac
+
+@item
+Still within @file{configure.ac}, as appropriate, ensure that some
+@code{AC_CONFIG_FILES} command includes substitution for
+@file{tests/atlocal}.
+
+@item
+The appropriate @file{Makefile} should be modified so the validation in
+your package is triggered by @samp{make check}. An example is provided
+below.
+@end itemize
+
+With Automake, here is a minimal example for inclusion in
+@file{tests/Makefile.am}, in order to link @samp{make check} with a
+validation suite.
+
+@example
+# The `:;' works around a Bash 3.2 bug when the output is not writable.
+$(srcdir)/package.m4: $(top_srcdir)/configure.ac
+ :;@{ \
+ echo '# Signature of the current package.' && \
+ echo 'm4_define([AT_PACKAGE_NAME],' && \
+ echo ' [$(PACKAGE_NAME)])' && \
+ echo 'm4_define([AT_PACKAGE_TARNAME],' && \
+ echo ' [$(PACKAGE_TARNAME)])' && \
+ echo 'm4_define([AT_PACKAGE_VERSION],' && \
+ echo ' [$(PACKAGE_VERSION)])' && \
+ echo 'm4_define([AT_PACKAGE_STRING],' && \
+ echo ' [$(PACKAGE_STRING)])' && \
+ echo 'm4_define([AT_PACKAGE_BUGREPORT],' && \
+ echo ' [$(PACKAGE_BUGREPORT)])'; \
+ echo 'm4_define([AT_PACKAGE_URL],' && \
+ echo ' [$(PACKAGE_URL)])'; \
+ @} >'$(srcdir)/package.m4'
+
+EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) atlocal.in
+TESTSUITE = $(srcdir)/testsuite
+
+check-local: atconfig atlocal $(TESTSUITE)
+ $(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS)
+
+installcheck-local: atconfig atlocal $(TESTSUITE)
+ $(SHELL) '$(TESTSUITE)' AUTOTEST_PATH='$(bindir)' \
+ $(TESTSUITEFLAGS)
+
+clean-local:
+ test ! -f '$(TESTSUITE)' || \
+ $(SHELL) '$(TESTSUITE)' --clean
+
+AUTOM4TE = $(SHELL) $(srcdir)/build-aux/missing --run autom4te
+AUTOTEST = $(AUTOM4TE) --language=autotest
+$(TESTSUITE): $(srcdir)/testsuite.at $(srcdir)/package.m4
+ $(AUTOTEST) -I '$(srcdir)' -o $@@.tmp $@@.at
+ mv $@@.tmp $@@
+@end example
+
+Note that the built testsuite is distributed; this is necessary because
+users might not have Autoconf installed, and thus would not be able to
+rebuild it. Likewise, the use of @file{missing} provides the user with
+a nicer error message if they modify a source file to the testsuite, and
+accidentally trigger the rebuild rules.
+
+You might want to list explicitly the dependencies, i.e., the list of
+the files @file{testsuite.at} includes.
+
+If you don't use Automake, you should include the above example in
+@file{tests/@/Makefile.in}, along with additional lines inspired from
+the following:
+
+@example
+subdir = tests
+PACKAGE_NAME = @@PACKAGE_NAME@@
+PACKAGE_TARNAME = @@PACKAGE_TARNAME@@
+PACKAGE_VERSION = @@PACKAGE_VERSION@@
+PACKAGE_STRING = @@PACKAGE_STRING@@
+PACKAGE_BUGREPORT = @@PACKAGE_BUGREPORT@@
+PACKAGE_URL = @@PACKAGE_URL@@
+
+atconfig: $(top_builddir)/config.status
+ cd $(top_builddir) && \
+ $(SHELL) ./config.status $(subdir)/$@@
+
+atlocal: $(srcdir)/atlocal.in $(top_builddir)/config.status
+ cd $(top_builddir) && \
+ $(SHELL) ./config.status $(subdir)/$@@
+@end example
+
+@noindent
+and manage to have @code{$(EXTRA_DIST)} distributed. You will also want
+to distribute the file @file{build-aux/@/missing} from the Automake
+project; a copy of this file resides in the Autoconf source tree.
+
+With all this in place, and if you have not initialized @samp{TESTSUITEFLAGS}
+within your makefile, you can fine-tune test suite execution with this
+variable, for example:
+
+@example
+make check TESTSUITEFLAGS='-v -d -x 75 -k AC_PROG_CC CFLAGS=-g'
+@end example
+
+
+
+@c =============================== Frequent Autoconf Questions, with answers
+
+@node FAQ
+@chapter Frequent Autoconf Questions, with answers
+
+Several questions about Autoconf come up occasionally. Here some of them
+are addressed.
+
+@menu
+* Distributing:: Distributing @command{configure} scripts
+* Why GNU M4:: Why not use the standard M4?
+* Bootstrapping:: Autoconf and GNU M4 require each other?
+* Why Not Imake:: Why GNU uses @command{configure} instead of Imake
+* Defining Directories:: Passing @code{datadir} to program
+* Autom4te Cache:: What is it? Can I remove it?
+* Present But Cannot Be Compiled:: Compiler and Preprocessor Disagree
+* Expanded Before Required:: Expanded Before Required
+* Debugging:: Debugging @command{configure} scripts
+@end menu
+
+@node Distributing
+@section Distributing @command{configure} Scripts
+@cindex License
+
+@display
+What are the restrictions on distributing @command{configure}
+scripts that Autoconf generates? How does that affect my
+programs that use them?
+@end display
+
+There are no restrictions on how the configuration scripts that Autoconf
+produces may be distributed or used. In Autoconf version 1, they were
+covered by the GNU General Public License. We still encourage
+software authors to distribute their work under terms like those of the
+GPL, but doing so is not required to use Autoconf.
+
+Of the other files that might be used with @command{configure},
+@file{config.h.in} is under whatever copyright you use for your
+@file{configure.ac}. @file{config.sub} and @file{config.guess} have an
+exception to the GPL when they are used with an Autoconf-generated
+@command{configure} script, which permits you to distribute them under the
+same terms as the rest of your package. @file{install-sh} is from the X
+Consortium and is not copyrighted.
+
+@node Why GNU M4
+@section Why Require GNU M4?
+
+@display
+Why does Autoconf require GNU M4?
+@end display
+
+Many M4 implementations have hard-coded limitations on the size and
+number of macros that Autoconf exceeds. They also lack several
+builtin macros that it would be difficult to get along without in a
+sophisticated application like Autoconf, including:
+
+@example
+m4_builtin
+m4_indir
+m4_bpatsubst
+__file__
+__line__
+@end example
+
+Autoconf requires version 1.4.6 or later of GNU M4.
+
+Since only software maintainers need to use Autoconf, and since GNU
+M4 is simple to configure and install, it seems reasonable to require
+GNU M4 to be installed also. Many maintainers of GNU and
+other free software already have most of the GNU utilities
+installed, since they prefer them.
+
+@node Bootstrapping
+@section How Can I Bootstrap?
+@cindex Bootstrap
+
+@display
+If Autoconf requires GNU M4 and GNU M4 has an Autoconf
+@command{configure} script, how do I bootstrap? It seems like a chicken
+and egg problem!
+@end display
+
+This is a misunderstanding. Although GNU M4 does come with a
+@command{configure} script produced by Autoconf, Autoconf is not required
+in order to run the script and install GNU M4. Autoconf is only
+required if you want to change the M4 @command{configure} script, which few
+people have to do (mainly its maintainer).
+
+@node Why Not Imake
+@section Why Not Imake?
+@cindex Imake
+
+@display
+Why not use Imake instead of @command{configure} scripts?
+@end display
+
+Several people have written addressing this question, so
+adaptations of their explanations are included here.
+
+The following answer is based on one written by Richard Pixley:
+
+@quotation
+Autoconf generated scripts frequently work on machines that it has
+never been set up to handle before. That is, it does a good job of
+inferring a configuration for a new system. Imake cannot do this.
+
+Imake uses a common database of host specific data. For X11, this makes
+sense because the distribution is made as a collection of tools, by one
+central authority who has control over the database.
+
+GNU tools are not released this way. Each GNU tool has a
+maintainer; these maintainers are scattered across the world. Using a
+common database would be a maintenance nightmare. Autoconf may appear
+to be this kind of database, but in fact it is not. Instead of listing
+host dependencies, it lists program requirements.
+
+If you view the GNU suite as a collection of native tools, then the
+problems are similar. But the GNU development tools can be
+configured as cross tools in almost any host+target permutation. All of
+these configurations can be installed concurrently. They can even be
+configured to share host independent files across hosts. Imake doesn't
+address these issues.
+
+Imake templates are a form of standardization. The GNU coding
+standards address the same issues without necessarily imposing the same
+restrictions.
+@end quotation
+
+
+Here is some further explanation, written by Per Bothner:
+
+@quotation
+One of the advantages of Imake is that it is easy to generate large
+makefiles using the @samp{#include} and macro mechanisms of @command{cpp}.
+However, @code{cpp} is not programmable: it has limited conditional
+facilities, and no looping. And @code{cpp} cannot inspect its
+environment.
+
+All of these problems are solved by using @code{sh} instead of
+@code{cpp}. The shell is fully programmable, has macro substitution,
+can execute (or source) other shell scripts, and can inspect its
+environment.
+@end quotation
+
+
+Paul Eggert elaborates more:
+
+@quotation
+With Autoconf, installers need not assume that Imake itself is already
+installed and working well. This may not seem like much of an advantage
+to people who are accustomed to Imake. But on many hosts Imake is not
+installed or the default installation is not working well, and requiring
+Imake to install a package hinders the acceptance of that package on
+those hosts. For example, the Imake template and configuration files
+might not be installed properly on a host, or the Imake build procedure
+might wrongly assume that all source files are in one big directory
+tree, or the Imake configuration might assume one compiler whereas the
+package or the installer needs to use another, or there might be a
+version mismatch between the Imake expected by the package and the Imake
+supported by the host. These problems are much rarer with Autoconf,
+where each package comes with its own independent configuration
+processor.
+
+Also, Imake often suffers from unexpected interactions between
+@command{make} and the installer's C preprocessor. The fundamental problem
+here is that the C preprocessor was designed to preprocess C programs,
+not makefiles. This is much less of a problem with Autoconf,
+which uses the general-purpose preprocessor M4, and where the
+package's author (rather than the installer) does the preprocessing in a
+standard way.
+@end quotation
+
+
+Finally, Mark Eichin notes:
+
+@quotation
+Imake isn't all that extensible, either. In order to add new features to
+Imake, you need to provide your own project template, and duplicate most
+of the features of the existing one. This means that for a sophisticated
+project, using the vendor-provided Imake templates fails to provide any
+leverage---since they don't cover anything that your own project needs
+(unless it is an X11 program).
+
+On the other side, though:
+
+The one advantage that Imake has over @command{configure}:
+@file{Imakefile} files tend to be much shorter (likewise, less redundant)
+than @file{Makefile.in} files. There is a fix to this, however---at least
+for the Kerberos V5 tree, we've modified things to call in common
+@file{post.in} and @file{pre.in} makefile fragments for the
+entire tree. This means that a lot of common things don't have to be
+duplicated, even though they normally are in @command{configure} setups.
+@end quotation
+
+
+@node Defining Directories
+@section How Do I @code{#define} Installation Directories?
+
+@display
+My program needs library files, installed in @code{datadir} and
+similar. If I use
+
+@example
+AC_DEFINE_UNQUOTED([DATADIR], [$datadir],
+ [Define to the read-only architecture-independent
+ data directory.])
+@end example
+
+@noindent
+I get
+
+@example
+#define DATADIR "$@{prefix@}/share"
+@end example
+@end display
+
+As already explained, this behavior is on purpose, mandated by the
+GNU Coding Standards, see @ref{Installation Directory
+Variables}. There are several means to achieve a similar goal:
+
+@itemize @minus
+@item
+Do not use @code{AC_DEFINE} but use your makefile to pass the
+actual value of @code{datadir} via compilation flags.
+@xref{Installation Directory Variables}, for the details.
+
+@item
+This solution can be simplified when compiling a program: you may either
+extend the @code{CPPFLAGS}:
+
+@example
+CPPFLAGS = -DDATADIR='"$(datadir)"' @@CPPFLAGS@@
+@end example
+
+@noindent
+If you are using Automake, you should use @code{AM_CPPFLAGS} instead:
+
+@example
+AM_CPPFLAGS = -DDATADIR='"$(datadir)"'
+@end example
+
+@noindent
+Alternatively, create a dedicated header file:
+
+@example
+DISTCLEANFILES = myprog-paths.h
+myprog-paths.h: Makefile
+ echo '#define DATADIR "$(datadir)"' >$@@
+@end example
+
+@noindent
+The gnulib module @samp{configmake} provides such a header with all the
+standard directory variables defined, @pxref{configmake,,, gnulib, GNU
+Gnulib}.
+
+@item
+Use @code{AC_DEFINE} but have @command{configure} compute the literal
+value of @code{datadir} and others. Many people have wrapped macros to
+automate this task; for an example, see the macro @code{AC_DEFINE_DIR} from
+the @uref{http://@/www.gnu.org/@/software/@/autoconf-archive/, Autoconf Macro
+Archive}.
+
+This solution does not conform to the GNU Coding Standards.
+
+@item
+Note that all the previous solutions hard wire the absolute name of
+these directories in the executables, which is not a good property. You
+may try to compute the names relative to @code{prefix}, and try to
+find @code{prefix} at runtime, this way your package is relocatable.
+@end itemize
+
+
+@node Autom4te Cache
+@section What is @file{autom4te.cache}?
+
+@display
+What is this directory @file{autom4te.cache}? Can I safely remove it?
+@end display
+
+In the GNU Build System, @file{configure.ac} plays a central
+role and is read by many tools: @command{autoconf} to create
+@file{configure}, @command{autoheader} to create @file{config.h.in},
+@command{automake} to create @file{Makefile.in}, @command{autoscan} to
+check the completeness of @file{configure.ac}, @command{autoreconf} to
+check the GNU Build System components that are used. To
+``read @file{configure.ac}'' actually means to compile it with M4,
+which can be a long process for complex @file{configure.ac}.
+
+This is why all these tools, instead of running directly M4, invoke
+@command{autom4te} (@pxref{autom4te Invocation}) which, while answering to
+a specific demand, stores additional information in
+@file{autom4te.cache} for future runs. For instance, if you run
+@command{autoconf}, behind the scenes, @command{autom4te} also
+stores information for the other tools, so that when you invoke
+@command{autoheader} or @command{automake} etc., reprocessing
+@file{configure.ac} is not needed. The speed up is frequently 30%,
+and is increasing with the size of @file{configure.ac}.
+
+But it is and remains being simply a cache: you can safely remove it.
+
+@sp 1
+
+@display
+Can I permanently get rid of it?
+@end display
+
+The creation of this cache can be disabled from
+@file{~/.autom4te.cfg}, see @ref{Customizing autom4te}, for more
+details. You should be aware that disabling the cache slows down the
+Autoconf test suite by 40%. The more GNU Build System
+components are used, the more the cache is useful; for instance
+running @samp{autoreconf -f} on the Core Utilities is twice slower without
+the cache @emph{although @option{--force} implies that the cache is
+not fully exploited}, and eight times slower than without
+@option{--force}.
+
+
+@node Present But Cannot Be Compiled
+@section Header Present But Cannot Be Compiled
+
+The most important guideline to bear in mind when checking for
+features is to mimic as much as possible the intended use.
+Unfortunately, old versions of @code{AC_CHECK_HEADER} and
+@code{AC_CHECK_HEADERS} failed to follow this idea, and called
+the preprocessor, instead of the compiler, to check for headers. As a
+result, incompatibilities between headers went unnoticed during
+configuration, and maintainers finally had to deal with this issue
+elsewhere.
+
+The transition began with Autoconf 2.56. As of Autoconf 2.64 both
+checks are performed, and @command{configure} complains loudly if the
+compiler and the preprocessor do not agree. However, only the compiler
+result is considered.
+
+Consider the following example:
+
+@smallexample
+$ @kbd{cat number.h}
+typedef int number;
+$ @kbd{cat pi.h}
+const number pi = 3;
+$ @kbd{cat configure.ac}
+AC_INIT([Example], [1.0], [bug-example@@example.org])
+AC_CHECK_HEADERS([pi.h])
+$ @kbd{autoconf -Wall}
+$ @kbd{./configure}
+checking for gcc... gcc
+checking for C compiler default output file name... a.out
+checking whether the C compiler works... yes
+checking whether we are cross compiling... no
+checking for suffix of executables...
+checking for suffix of object files... o
+checking whether we are using the GNU C compiler... yes
+checking whether gcc accepts -g... yes
+checking for gcc option to accept ISO C89... none needed
+checking how to run the C preprocessor... gcc -E
+checking for grep that handles long lines and -e... grep
+checking for egrep... grep -E
+checking for ANSI C header files... yes
+checking for sys/types.h... yes
+checking for sys/stat.h... yes
+checking for stdlib.h... yes
+checking for string.h... yes
+checking for memory.h... yes
+checking for strings.h... yes
+checking for inttypes.h... yes
+checking for stdint.h... yes
+checking for unistd.h... yes
+checking pi.h usability... no
+checking pi.h presence... yes
+configure: WARNING: pi.h: present but cannot be compiled
+configure: WARNING: pi.h: check for missing prerequisite headers?
+configure: WARNING: pi.h: see the Autoconf documentation
+configure: WARNING: pi.h: section "Present But Cannot Be Compiled"
+configure: WARNING: pi.h: proceeding with the compiler's result
+configure: WARNING: ## -------------------------------------- ##
+configure: WARNING: ## Report this to bug-example@@example.org ##
+configure: WARNING: ## -------------------------------------- ##
+checking for pi.h... yes
+@end smallexample
+
+@noindent
+The proper way the handle this case is using the fourth argument
+(@pxref{Generic Headers}):
+
+@example
+$ @kbd{cat configure.ac}
+AC_INIT([Example], [1.0], [bug-example@@example.org])
+AC_CHECK_HEADERS([number.h pi.h], [], [],
+[[#ifdef HAVE_NUMBER_H
+# include <number.h>
+#endif
+]])
+$ @kbd{autoconf -Wall}
+$ @kbd{./configure}
+checking for gcc... gcc
+checking for C compiler default output... a.out
+checking whether the C compiler works... yes
+checking whether we are cross compiling... no
+checking for suffix of executables...
+checking for suffix of object files... o
+checking whether we are using the GNU C compiler... yes
+checking whether gcc accepts -g... yes
+checking for gcc option to accept ANSI C... none needed
+checking for number.h... yes
+checking for pi.h... yes
+@end example
+
+See @ref{Particular Headers}, for a list of headers with their
+prerequisites.
+
+@node Expanded Before Required
+@section Expanded Before Required
+
+@cindex expanded before required
+Older versions of Autoconf silently built files with incorrect ordering
+between dependent macros if an outer macro first expanded, then later
+indirectly required, an inner macro. Starting with Autoconf 2.64, this
+situation no longer generates out-of-order code, but results in
+duplicate output and a syntax warning:
+
+@example
+$ @kbd{cat configure.ac}
+@result{}AC_DEFUN([TESTA], [[echo in A
+@result{}if test -n "$SEEN_A" ; then echo duplicate ; fi
+@result{}SEEN_A=:]])
+@result{}AC_DEFUN([TESTB], [AC_REQUIRE([TESTA])[echo in B
+@result{}if test -z "$SEEN_A" ; then echo bug ; fi]])
+@result{}AC_DEFUN([TESTC], [AC_REQUIRE([TESTB])[echo in C]])
+@result{}AC_DEFUN([OUTER], [[echo in OUTER]
+@result{}TESTA
+@result{}TESTC])
+@result{}AC_INIT
+@result{}OUTER
+@result{}AC_OUTPUT
+$ @kbd{autoconf}
+@result{}configure.ac:11: warning: AC_REQUIRE:
+@result{} `TESTA' was expanded before it was required
+@result{}configure.ac:4: TESTB is expanded from...
+@result{}configure.ac:6: TESTC is expanded from...
+@result{}configure.ac:7: OUTER is expanded from...
+@result{}configure.ac:11: the top level
+@end example
+
+@noindent
+To avoid this warning, decide what purpose the macro in question serves.
+If it only needs to be expanded once (for example, if it provides
+initialization text used by later macros), then the simplest fix is to
+change the macro to be declared with @code{AC_DEFUN_ONCE}
+(@pxref{One-Shot Macros}), although this only works in Autoconf 2.64 and
+newer. A more portable fix is to change all
+instances of direct calls to instead go through @code{AC_REQUIRE}
+(@pxref{Prerequisite Macros}). If, instead, the macro is parameterized
+by arguments or by the current definition of other macros in the m4
+environment, then the macro should always be directly expanded instead
+of required.
+
+For another case study, consider this example trimmed down from an
+actual package. Originally, the package contained shell code and
+multiple macro invocations at the top level of @file{configure.ac}:
+
+@example
+AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])])
+foobar=
+AC_PROG_CC
+FOO
+@end example
+
+@noindent
+but that was getting complex, so the author wanted to offload some of
+the text into a new macro in another file included via
+@file{aclocal.m4}. The na@"ive approach merely wraps the text in a new
+macro:
+
+@example
+AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])])
+AC_DEFUN([BAR], [
+foobar=
+AC_PROG_CC
+FOO
+])
+BAR
+@end example
+
+@noindent
+With older versions of Autoconf, the setting of @samp{foobar=} occurs
+before the single compiler check, as the author intended. But with
+Autoconf 2.64, this issues the ``expanded before it was required''
+warning for @code{AC_PROG_CC}, and outputs two copies of the compiler
+check, one before @samp{foobar=}, and one after. To understand why this
+is happening, remember that the use of @code{AC_COMPILE_IFELSE} includes
+a call to @code{AC_REQUIRE([AC_PROG_CC])} under the hood. According to
+the documented semantics of @code{AC_REQUIRE}, this means that
+@code{AC_PROG_CC} @emph{must} occur before the body of the outermost
+@code{AC_DEFUN}, which in this case is @code{BAR}, thus preceding the
+use of @samp{foobar=}. The older versions of Autoconf were broken with
+regards to the rules of @code{AC_REQUIRE}, which explains why the code
+changed from one over to two copies of @code{AC_PROG_CC} when upgrading
+autoconf. In other words, the author was unknowingly relying on a bug
+exploit to get the desired results, and that exploit broke once the bug
+was fixed.
+
+So, what recourse does the author have, to restore their intended
+semantics of setting @samp{foobar=} prior to a single compiler check,
+regardless of whether Autoconf 2.63 or 2.64 is used? One idea is to
+remember that only @code{AC_DEFUN} is impacted by @code{AC_REQUIRE};
+there is always the possibility of using the lower-level
+@code{m4_define}:
+
+@example
+AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])])
+m4_define([BAR], [
+foobar=
+AC_PROG_CC
+FOO
+])
+BAR
+@end example
+
+@noindent
+This works great if everything is in the same file. However, it does
+not help in the case where the author wants to have @command{aclocal}
+find the definition of @code{BAR} from its own file, since
+@command{aclocal} requires the use of @code{AC_DEFUN}. In this case, a
+better fix is to recognize that if @code{BAR} also uses
+@code{AC_REQUIRE}, then there will no longer be direct expansion prior
+to a subsequent require. Then, by creating yet another helper macro,
+the author can once again guarantee a single invocation of
+@code{AC_PROG_CC}, which will still occur after @code{foobar=}. The
+author can also use @code{AC_BEFORE} to make sure no other macro
+appearing before @code{BAR} has triggered an unwanted expansion of
+@code{AC_PROG_CC}.
+
+@example
+AC_DEFUN([FOO], [AC_COMPILE_IFELSE([@dots{}])])
+AC_DEFUN([BEFORE_CC], [
+foobar=
+])
+AC_DEFUN([BAR], [
+AC_BEFORE([$0], [AC_PROG_CC])dnl
+AC_REQUIRE([BEFORE_CC])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+FOO
+])
+BAR
+@end example
+
+
+@node Debugging
+@section Debugging @command{configure} scripts
+
+While in general, @command{configure} scripts generated by Autoconf
+strive to be fairly portable to various systems, compilers, shells, and
+other tools, it may still be necessary to debug a failing test, broken
+script or makefile, or fix or override an incomplete, faulty, or erroneous
+test, especially during macro development. Failures can occur at all levels,
+in M4 syntax or semantics, shell script issues, or due to bugs in the
+test or the tools invoked by @command{configure}. Together with the
+rather arcane error message that @command{m4} and @command{make} may
+produce when their input contains syntax errors, this can make debugging
+rather painful.
+
+Nevertheless, here is a list of hints and strategies that may help:
+
+@itemize
+@item
+When @command{autoconf} fails, common causes for error include:
+
+@itemize
+@item
+mismatched or unbalanced parentheses or braces (@pxref{Balancing
+Parentheses}),
+
+@item under- or overquoted macro arguments (@pxref{Autoconf
+Language}, @pxref{Quoting and Parameters}, @pxref{Quotation and Nested
+Macros}),
+
+@item spaces between macro name and opening parenthesis (@pxref{Autoconf
+Language}).
+@end itemize
+
+Typically, it helps to go back to the last working version of the input
+and compare the differences for each of these errors. Another
+possibility is to sprinkle pairs of @code{m4_traceon} and
+@code{m4_traceoff} judiciously in the code, either without a parameter
+or listing some macro names and watch @command{m4} expand its input
+verbosely (@pxref{Debugging via autom4te}).
+
+@item
+Sometimes @command{autoconf} succeeds but the generated
+@command{configure} script has invalid shell syntax. You can detect this
+case by running @samp{bash -n configure} or @samp{sh -n configure}.
+If this command fails, the same tips apply, as if @command{autoconf} had
+failed.
+
+@item
+Debugging @command{configure} script execution may be done by sprinkling
+pairs of @code{set -x} and @code{set +x} into the shell script before
+and after the region that contains a bug. Running the whole script with
+@samp{@var{shell} -vx ./configure 2>&1 | tee @var{log-file}} with a decent
+@var{shell} may work, but produces lots of output. Here, it can help to
+search for markers like @samp{checking for} a particular test in the
+@var{log-file}.
+
+@item
+Alternatively, you might use a shell with debugging capabilities like
+@uref{http://bashdb.sourceforge.net/, bashdb}.
+
+@item
+When @command{configure} tests produce invalid results for your system,
+it may be necessary to override them:
+
+@itemize
+@item
+For programs, tools or libraries variables, preprocessor, compiler, or
+linker flags, it is often sufficient to override them at @command{make}
+run time with some care (@pxref{Macros and Submakes}). Since this
+normally won't cause @command{configure} to be run again with these
+changed settings, it may fail if the changed variable would have caused
+different test results from @command{configure}, so this may work only
+for simple differences.
+
+@item
+Most tests which produce their result in a substituted variable allow to
+override the test by setting the variable on the @command{configure}
+command line (@pxref{Compilers and Options}, @pxref{Defining Variables},
+@pxref{Particular Systems}).
+
+@item
+Many tests store their result in a cache variable (@pxref{Caching
+Results}). This lets you override them either on the
+@command{configure} command line as above, or through a primed cache or
+site file (@pxref{Cache Files}, @pxref{Site Defaults}). The name of a
+cache variable is documented with a test macro or may be inferred from
+@ref{Cache Variable Names}; the precise semantics of undocumented
+variables are often internal details, subject to change.
+@end itemize
+
+@item
+Alternatively, @command{configure} may produce invalid results because
+of uncaught programming errors, in your package or in an upstream
+library package. For example, when @code{AC_CHECK_LIB} fails to find a
+library with a specified function, always check @file{config.log}. This
+will reveal the exact error that produced the failing result: the
+library linked by @code{AC_CHECK_LIB} probably has a fatal bug.
+@end itemize
+
+Conversely, as macro author, you can make it easier for users of your
+macro:
+
+@itemize
+@item
+by minimizing dependencies between tests and between test results as far
+as possible,
+
+@item
+by using @command{make} variables to factorize and allow
+override of settings at @command{make} run time,
+
+@item
+by honoring the GNU Coding Standards and not overriding flags
+reserved for the user except temporarily during @command{configure}
+tests,
+
+@item
+by not requiring users of your macro to use the cache variables.
+Instead, expose the result of the test via @var{run-if-true} and
+@var{run-if-false} parameters. If the result is not a boolean,
+then provide it through documented shell variables.
+@end itemize
+
+
+@c ===================================================== History of Autoconf.
+
+@node History
+@chapter History of Autoconf
+@cindex History of autoconf
+
+@emph{This chapter was written by the original author, David MacKenzie.}
+
+You may be wondering, Why was Autoconf originally written? How did it
+get into its present form? (Why does it look like gorilla spit?) If
+you're not wondering, then this chapter contains no information useful
+to you, and you might as well skip it. If you @emph{are} wondering,
+then let there be light@enddots{}
+
+@menu
+* Genesis:: Prehistory and naming of @command{configure}
+* Exodus:: The plagues of M4 and Perl
+* Leviticus:: The priestly code of portability arrives
+* Numbers:: Growth and contributors
+* Deuteronomy:: Approaching the promises of easy configuration
+@end menu
+
+@node Genesis
+@section Genesis
+
+In June 1991 I was maintaining many of the GNU utilities for the
+Free Software Foundation. As they were ported to more platforms and
+more programs were added, the number of @option{-D} options that users
+had to select in the makefile (around 20) became burdensome.
+Especially for me---I had to test each new release on a bunch of
+different systems. So I wrote a little shell script to guess some of
+the correct settings for the fileutils package, and released it as part
+of fileutils 2.0. That @command{configure} script worked well enough that
+the next month I adapted it (by hand) to create similar @command{configure}
+scripts for several other GNU utilities packages. Brian Berliner
+also adapted one of my scripts for his CVS revision control system.
+
+Later that summer, I learned that Richard Stallman and Richard Pixley
+were developing similar scripts to use in the GNU compiler tools;
+so I adapted my @command{configure} scripts to support their evolving
+interface: using the file name @file{Makefile.in} as the templates;
+adding @samp{+srcdir}, the first option (of many); and creating
+@file{config.status} files.
+
+@node Exodus
+@section Exodus
+
+As I got feedback from users, I incorporated many improvements, using
+Emacs to search and replace, cut and paste, similar changes in each of
+the scripts. As I adapted more GNU utilities packages to use
+@command{configure} scripts, updating them all by hand became impractical.
+Rich Murphey, the maintainer of the GNU graphics utilities, sent me
+mail saying that the @command{configure} scripts were great, and asking if
+I had a tool for generating them that I could send him. No, I thought,
+but I should! So I started to work out how to generate them. And the
+journey from the slavery of hand-written @command{configure} scripts to the
+abundance and ease of Autoconf began.
+
+Cygnus @command{configure}, which was being developed at around that time,
+is table driven; it is meant to deal mainly with a discrete number of
+system types with a small number of mainly unguessable features (such as
+details of the object file format). The automatic configuration system
+that Brian Fox had developed for Bash takes a similar approach. For
+general use, it seems to me a hopeless cause to try to maintain an
+up-to-date database of which features each variant of each operating
+system has. It's easier and more reliable to check for most features on
+the fly---especially on hybrid systems that people have hacked on
+locally or that have patches from vendors installed.
+
+I considered using an architecture similar to that of Cygnus
+@command{configure}, where there is a single @command{configure} script that
+reads pieces of @file{configure.in} when run. But I didn't want to have
+to distribute all of the feature tests with every package, so I settled
+on having a different @command{configure} made from each
+@file{configure.in} by a preprocessor. That approach also offered more
+control and flexibility.
+
+I looked briefly into using the Metaconfig package, by Larry Wall,
+Harlan Stenn, and Raphael Manfredi, but I decided not to for several
+reasons. The @command{Configure} scripts it produces are interactive,
+which I find quite inconvenient; I didn't like the ways it checked for
+some features (such as library functions); I didn't know that it was
+still being maintained, and the @command{Configure} scripts I had
+seen didn't work on many modern systems (such as System V R4 and NeXT);
+it wasn't flexible in what it could do in response to a feature's
+presence or absence; I found it confusing to learn; and it was too big
+and complex for my needs (I didn't realize then how much Autoconf would
+eventually have to grow).
+
+I considered using Perl to generate my style of @command{configure}
+scripts, but decided that M4 was better suited to the job of simple
+textual substitutions: it gets in the way less, because output is
+implicit. Plus, everyone already has it. (Initially I didn't rely on
+the GNU extensions to M4.) Also, some of my friends at the
+University of Maryland had recently been putting M4 front ends on
+several programs, including @code{tvtwm}, and I was interested in trying
+out a new language.
+
+@node Leviticus
+@section Leviticus
+
+Since my @command{configure} scripts determine the system's capabilities
+automatically, with no interactive user intervention, I decided to call
+the program that generates them Autoconfig. But with a version number
+tacked on, that name would be too long for old Unix file systems,
+so I shortened it to Autoconf.
+
+In the fall of 1991 I called together a group of fellow questers after
+the Holy Grail of portability (er, that is, alpha testers) to give me
+feedback as I encapsulated pieces of my handwritten scripts in M4 macros
+and continued to add features and improve the techniques used in the
+checks. Prominent among the testers were Fran@,{c}ois Pinard, who came up
+with the idea of making an Autoconf shell script to run M4
+and check for unresolved macro calls; Richard Pixley, who suggested
+running the compiler instead of searching the file system to find
+include files and symbols, for more accurate results; Karl Berry, who
+got Autoconf to configure @TeX{} and added the macro index to the
+documentation; and Ian Lance Taylor, who added support for creating a C
+header file as an alternative to putting @option{-D} options in a
+makefile, so he could use Autoconf for his UUCP package.
+The alpha testers cheerfully adjusted their files again and again as the
+names and calling conventions of the Autoconf macros changed from
+release to release. They all contributed many specific checks, great
+ideas, and bug fixes.
+
+@node Numbers
+@section Numbers
+
+In July 1992, after months of alpha testing, I released Autoconf 1.0,
+and converted many GNU packages to use it. I was surprised by how
+positive the reaction to it was. More people started using it than I
+could keep track of, including people working on software that wasn't
+part of the GNU Project (such as TCL, FSP, and Kerberos V5).
+Autoconf continued to improve rapidly, as many people using the
+@command{configure} scripts reported problems they encountered.
+
+Autoconf turned out to be a good torture test for M4 implementations.
+Unix M4 started to dump core because of the length of the
+macros that Autoconf defined, and several bugs showed up in GNU
+M4 as well. Eventually, we realized that we needed to use some
+features that only GNU M4 has. 4.3BSD M4, in
+particular, has an impoverished set of builtin macros; the System V
+version is better, but still doesn't provide everything we need.
+
+More development occurred as people put Autoconf under more stresses
+(and to uses I hadn't anticipated). Karl Berry added checks for X11.
+david zuhn contributed C++ support. Fran@,{c}ois Pinard made it diagnose
+invalid arguments. Jim Blandy bravely coerced it into configuring
+GNU Emacs, laying the groundwork for several later improvements.
+Roland McGrath got it to configure the GNU C Library, wrote the
+@command{autoheader} script to automate the creation of C header file
+templates, and added a @option{--verbose} option to @command{configure}.
+Noah Friedman added the @option{--autoconf-dir} option and
+@code{AC_MACRODIR} environment variable. (He also coined the term
+@dfn{autoconfiscate} to mean ``adapt a software package to use
+Autoconf''.) Roland and Noah improved the quoting protection in
+@code{AC_DEFINE} and fixed many bugs, especially when I got sick of
+dealing with portability problems from February through June, 1993.
+
+@node Deuteronomy
+@section Deuteronomy
+
+A long wish list for major features had accumulated, and the effect of
+several years of patching by various people had left some residual
+cruft. In April 1994, while working for Cygnus Support, I began a major
+revision of Autoconf. I added most of the features of the Cygnus
+@command{configure} that Autoconf had lacked, largely by adapting the
+relevant parts of Cygnus @command{configure} with the help of david zuhn
+and Ken Raeburn. These features include support for using
+@file{config.sub}, @file{config.guess}, @option{--host}, and
+@option{--target}; making links to files; and running @command{configure}
+scripts in subdirectories. Adding these features enabled Ken to convert
+GNU @code{as}, and Rob Savoye to convert DejaGNU, to using
+Autoconf.
+
+I added more features in response to other peoples' requests. Many
+people had asked for @command{configure} scripts to share the results of
+the checks between runs, because (particularly when configuring a large
+source tree, like Cygnus does) they were frustratingly slow. Mike
+Haertel suggested adding site-specific initialization scripts. People
+distributing software that had to unpack on MS-DOS asked for a way to
+override the @file{.in} extension on the file names, which produced file
+names like @file{config.h.in} containing two dots. Jim Avera did an
+extensive examination of the problems with quoting in @code{AC_DEFINE}
+and @code{AC_SUBST}; his insights led to significant improvements.
+Richard Stallman asked that compiler output be sent to @file{config.log}
+instead of @file{/dev/null}, to help people debug the Emacs
+@command{configure} script.
+
+I made some other changes because of my dissatisfaction with the quality
+of the program. I made the messages showing results of the checks less
+ambiguous, always printing a result. I regularized the names of the
+macros and cleaned up coding style inconsistencies. I added some
+auxiliary utilities that I had developed to help convert source code
+packages to use Autoconf. With the help of Fran@,{c}ois Pinard, I made
+the macros not interrupt each others' messages. (That feature revealed
+some performance bottlenecks in GNU M4, which he hastily
+corrected!) I reorganized the documentation around problems people want
+to solve. And I began a test suite, because experience had shown that
+Autoconf has a pronounced tendency to regress when we change it.
+
+Again, several alpha testers gave invaluable feedback, especially
+Fran@,{c}ois Pinard, Jim Meyering, Karl Berry, Rob Savoye, Ken Raeburn,
+and Mark Eichin.
+
+Finally, version 2.0 was ready. And there was much rejoicing. (And I
+have free time again. I think. Yeah, right.)
+
+
+@c ========================================================== Appendices
+
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+
+@include fdl.texi
+
+@node Indices
+@appendix Indices
+
+@menu
+* Environment Variable Index:: Index of environment variables used
+* Output Variable Index:: Index of variables set in output files
+* Preprocessor Symbol Index:: Index of C preprocessor symbols defined
+* Cache Variable Index:: Index of documented cache variables
+* Autoconf Macro Index:: Index of Autoconf macros
+* M4 Macro Index:: Index of M4, M4sugar, and M4sh macros
+* Autotest Macro Index:: Index of Autotest macros
+* Program & Function Index:: Index of those with portability problems
+* Concept Index:: General index
+@end menu
+
+@node Environment Variable Index
+@appendixsec Environment Variable Index
+
+This is an alphabetical list of the environment variables that might
+influence Autoconf checks.
+
+@printindex ev
+
+@node Output Variable Index
+@appendixsec Output Variable Index
+
+This is an alphabetical list of the variables that Autoconf can
+substitute into files that it creates, typically one or more
+makefiles. @xref{Setting Output Variables}, for more information
+on how this is done.
+
+@printindex ov
+
+@node Preprocessor Symbol Index
+@appendixsec Preprocessor Symbol Index
+
+This is an alphabetical list of the C preprocessor symbols that the
+Autoconf macros define. To work with Autoconf, C source code needs to
+use these names in @code{#if} or @code{#ifdef} directives.
+
+@printindex cv
+
+@node Cache Variable Index
+@appendixsec Cache Variable Index
+
+This is an alphabetical list of documented cache variables used
+by macros defined in Autoconf. Autoconf macros may use additional cache
+variables internally.
+@ifset shortindexflag
+To make the list easier to use, the variables are listed without their
+preceding @samp{ac_cv_}.
+@end ifset
+
+@printindex CA
+
+@node Autoconf Macro Index
+@appendixsec Autoconf Macro Index
+
+This is an alphabetical list of the Autoconf macros.
+@ifset shortindexflag
+To make the list easier to use, the macros are listed without their
+preceding @samp{AC_}.
+@end ifset
+
+@printindex AC
+
+@node M4 Macro Index
+@appendixsec M4 Macro Index
+
+This is an alphabetical list of the M4, M4sugar, and M4sh macros.
+@ifset shortindexflag
+To make the list easier to use, the macros are listed without their
+preceding @samp{m4_} or @samp{AS_}. The prefix is @samp{m4_} for
+all-lowercase macro names and @samp{AS_} for all-uppercase macro
+names.
+@end ifset
+
+@printindex MS
+
+@node Autotest Macro Index
+@appendixsec Autotest Macro Index
+
+This is an alphabetical list of the Autotest macros.
+@ifset shortindexflag
+To make the list easier to use, the macros are listed without their
+preceding @samp{AT_}.
+@end ifset
+
+@printindex AT
+
+@node Program & Function Index
+@appendixsec Program and Function Index
+
+This is an alphabetical list of the programs and functions whose
+portability is discussed in this document.
+
+@printindex pr
+
+@node Concept Index
+@appendixsec Concept Index
+
+This is an alphabetical list of the files, tools, and concepts
+introduced in this document.
+
+@printindex cp
+
+@bye
+
+@c LocalWords: texinfo setfilename autoconf texi settitle setchapternewpage
+@c LocalWords: setcontentsaftertitlepage finalout ARG ovar varname dvar acx
+@c LocalWords: makeinfo dvi defcodeindex ev ov CPP cv Autotest mv defindex fn
+@c LocalWords: shortindexflag iftex ifset acindex ACindex ifclear ahindex fu
+@c LocalWords: asindex MSindex atindex ATindex auindex hdrindex prindex FIXME
+@c LocalWords: msindex alloca fnindex Aaarg indices FSF's dircategory ifnames
+@c LocalWords: direntry autoscan autoreconf autoheader autoupdate config FDs
+@c LocalWords: testsuite titlepage Elliston Demaille vskip filll ifnottex hmm
+@c LocalWords: insertcopying Autoconf's detailmenu Automake Libtool Posix ois
+@c LocalWords: Systemology Checkpointing Changequote INTERCAL changequote dfn
+@c LocalWords: Quadrigraphs builtins Shellology acconfig Bugward LIBOBJ Imake
+@c LocalWords: LIBOBJS IFELSE cindex flushright Pinard Metaconfig uref Simons
+@c LocalWords: distclean uninstall noindent versioning Tromey dir
+@c LocalWords: SAMS samp aclocal acsite underquoted emph itemx prepend SUBST
+@c LocalWords: evindex automake Gettext autopoint gettext symlink libtoolize
+@c LocalWords: defmac INIT tarname ovindex cvindex BUGREPORT PREREQ asis PROG
+@c LocalWords: SRCDIR srcdir globbing afterwards cmds foos fooo foooo init cd
+@c LocalWords: builddir timestamp src Imakefile chmod defvar CFLAGS CPPFLAGS
+@c LocalWords: CXXFLAGS DEFS DHAVE defvarx FCFLAGS FFLAGS LDFLAGS bindir GCC
+@c LocalWords: datadir datarootdir docdir dvidir htmldir libdir ifnothtml kbd
+@c LocalWords: includedir infodir libexecdir localedir localstatedir mandir
+@c LocalWords: oldincludedir pdfdir PDF psdir PostScript sbindir sysconfdir
+@c LocalWords: sharedstatedir DDATADIR sed tmp pkgdatadir VPATH conf unistd
+@c LocalWords: undef endif builtin FUNCS ifndef STACKSEG getb GETB YMP fubar
+@c LocalWords: PRE dest SUBDIRS subdirs fi struct STDC stdlib stddef INTTYPES
+@c LocalWords: inttypes STDINT stdint AWK AIX Solaris NeXT env EGREP FGREP yy
+@c LocalWords: LEXLIB YYTEXT lfl nonportable Automake's LN RANLIB byacc INETD
+@c LocalWords: inetd prog PROGS progs ranlib lmp lXt lX nsl gethostbyname UX
+@c LocalWords: NextStep isinf isnan glibc IRIX sunmath lm lsunmath pre sizeof
+@c LocalWords: ld inline malloc putenv setenv FreeBSD realloc SunOS MinGW
+@c LocalWords: snprintf vsnprintf sprintf vsprintf sscanf gcc strerror ifdef
+@c LocalWords: strnlen sysconf PAGESIZE unsetenv va fallback memcpy dst FUNC
+@c LocalWords: PowerPC GNUC libPW pragma Olibcalls CHOWN chown CLOSEDIR VFORK
+@c LocalWords: closedir FNMATCH fnmatch vfork FSEEKO LARGEFILE fseeko SVR sc
+@c LocalWords: largefile GETGROUPS getgroups GETLOADAVG DGUX UMAX NLIST KMEM
+@c LocalWords: SETGID getloadavg nlist GETMNTENT irix
+@c LocalWords: getmntent UnixWare GETPGRP getpgid getpgrp Posix's pid LSTAT
+@c LocalWords: lstat rpl MEMCMP memcmp OpenStep MBRTOWC mbrtowc MKTIME mktime
+@c LocalWords: localtime MMAP mmap OBSTACK obstack obstacks ARGTYPES timeval
+@c LocalWords: SETPGRP setpgrp defmacx Hurd SETVBUF setvbuf STRCOLL strcoll
+@c LocalWords: STRTOD strtod DECL STRFTIME strftime SCO UTIME utime VPRINTF
+@c LocalWords: DOPRNT vprintf doprnt sp unfixable LIBSOURCE LIBSOURCES Eggert
+@c LocalWords: linux netinet ia Tru XFree DIRENT NDIR dirent ndir multitable
+@c LocalWords: NAMLEN strlen namlen MKDEV SYSMACROS makedev RESOLV resolv DNS
+@c LocalWords: inet structs NAMESER arpa NETDB netdb UTekV UTS GCC's kB
+@c LocalWords: STDBOOL BOOL stdbool cplusplus bool Bool stdarg tm
+@c LocalWords: ctype strchr strrchr rindex bcopy memmove memchr WEXITSTATUS
+@c LocalWords: WIFEXITED TIOCGWINSZ GWINSZ termios preprocess preprocessable
+@c LocalWords: DECLS strdup calloc BLKSIZE blksize RDEV rdev TZNAME tzname pw
+@c LocalWords: passwd gecos pwd MBSTATE mbstate wchar RETSIGTYPE hup UID uid
+@c LocalWords: gid ptrdiff uintmax EXEEXT OBJEXT Ae conftest AXP str
+@c LocalWords: ALIGNOF WERROR Werror cpp HP's WorkShop egcs un fied stdc CXX
+@c LocalWords: varargs BIGENDIAN Endianness SPARC endianness grep'ed CONST FC
+@c LocalWords: const STRINGIZE stringizing PARAMS unprotoize protos KCC cxx
+@c LocalWords: xlC aCC CXXCPP FREEFORM xlf FLIBS FCLIBS ish SRCEXT XTRA LFS
+@c LocalWords: ISC lcposix MINIX Minix conditionalized inlines hw dD confdefs
+@c LocalWords: fputs stdout PREPROC ar UFS HFS QNX realtime fstype STATVFS se
+@c LocalWords: statvfs STATFS statfs func machfile hdr lelf raboof DEFUN GTK
+@c LocalWords: GTKMM Grmph ified ine defn baz EOF qar Ahhh changecom algol io
+@c LocalWords: changeword quadrigraphs quadrigraph dnl SGI atoi overquoting
+@c LocalWords: Aas Wcross sep args namespace undefine bpatsubst popdef dquote
+@c LocalWords: bregexp Overquote overquotation meisch maisch meische maische
+@c LocalWords: miscian DIRNAME dirname MKDIR CATFILE XMKMF TRAVOLTA celsius
+@c LocalWords: EMX emxos Emacsen Korn DYNIX subshell posix Ksh ksh Pdksh Zsh
+@c LocalWords: pdksh zsh Allbery Lipe Kubota UWS zorglub stderr eval esac lfn
+@c LocalWords: drivespec Posixy DJGPP doschk prettybird LPT pfew Zsh's yu yaa
+@c LocalWords: yM uM aM firebird IP subdir misparses ok Unpatched abc bc zA
+@c LocalWords: CDPATH DUALCASE LINENO prepass Subshells lineno NULLCMD cmp wc
+@c LocalWords: MAILPATH scanset arg NetBSD Almquist printf expr cp
+@c LocalWords: Oliva awk Aaaaarg cmd regex xfoo GNV OpenVMS VM
+@c LocalWords: sparc Proulx nbar nfoo maxdepth acdilrtu TWG mc
+@c LocalWords: mkdir exe uname OpenBSD Fileutils mktemp umask TMPDIR guid os
+@c LocalWords: fooXXXXXX Unicos utimes hpux hppa unescaped
+@c LocalWords: pmake DOS's gmake ifoo DESTDIR autoconfiscated pc coff mips gg
+@c LocalWords: dec ultrix cpu wildcards rpcc rdtsc powerpc readline
+@c LocalWords: withval vxworks gless localcache usr LOFF loff CYGWIN Cygwin
+@c LocalWords: cygwin SIGLIST siglist SYSNDIR SYSDIR ptx lseq rusage elif MSC
+@c LocalWords: lfoo POUNDBANG lsun NIS getpwnam SYSCALLS RSH INTL lintl aix
+@c LocalWords: intl lx ldir syslog bsd EPI toolchain netbsd objext de KNR nn
+@c LocalWords: fication LTLIBOBJS Wdiff TESTDIR atconfig atlocal akim XFAIL
+@c LocalWords: ChangeLog prepended errexit smallexample TESTSUITEFLAGS GPL er
+@c LocalWords: installcheck autotest indir Pixley Bothner Eichin Kerberos adl
+@c LocalWords: DISTCLEANFILES preprocessor's fileutils Stallman Murphey Stenn
+@c LocalWords: Manfredi Autoconfig TCL FSP david zuhn Blandy MACRODIR Raeburn
+@c LocalWords: autoconfiscate Savoye Haertel Avera Meyering fdl appendixsec
+@c LocalWords: printindex american LIBOBJDIR LibdirTest ERLCFLAGS OBJCFLAGS
+@c LocalWords: VER Gnulib online xyes strcpy TYPEOF typeof OBJC objcc objc ln
+@c LocalWords: GOBJC OTP ERLC erl valloc decr dumpdef errprint incr
+@c LocalWords: esyscmd len maketemp pushdef substr syscmd sysval translit txt
+@c LocalWords: sinclude foreach myvar tolower toupper uniq BASENAME STDIN
+@c LocalWords: Dynix basename aname cname macroexpands xno xcheck
+@c LocalWords: LIBREADLINE lreadline lncurses libreadline
+
+@c Local Variables:
+@c fill-column: 72
+@c ispell-local-dictionary: "american"
+@c indent-tabs-mode: nil
+@c whitespace-check-buffer-indent: nil
+@c End:
diff --git a/doc/fdl.texi b/doc/fdl.texi
new file mode 100644
index 0000000..cb71f05
--- /dev/null
+++ b/doc/fdl.texi
@@ -0,0 +1,505 @@
+@c The GNU Free Documentation License.
+@center Version 1.3, 3 November 2008
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+@uref{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The ``Document'', below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as ``you''. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, La@TeX{} input
+format, SGML or XML using a publicly available
+DTD, and standard-conforming simple HTML,
+PostScript or PDF designed for human modification. Examples
+of transparent image formats include PNG, XCF and
+JPG. Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, SGML or
+XML for which the DTD and/or processing tools are
+not generally available, and the machine-generated HTML,
+PostScript or PDF produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+The ``publisher'' means any person or entity that distributes copies
+of the Document to the public.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document). You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page. If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on. These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles. Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''. Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''. You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+@item
+RELICENSING
+
+``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+
+``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+``Incorporate'' means to publish or republish a Document, in whole or
+in part, as part of another Document.
+
+An MMC is ``eligible for relicensing'' if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+@end enumerate
+
+@page
+@heading ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+ Copyright (C) @var{year} @var{your name}.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with@dots{}Texts.''@: line with this:
+
+@smallexample
+@group
+ with the Invariant Sections being @var{list their titles}, with
+ the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+ being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@c Local Variables:
+@c ispell-local-pdict: "ispell-dict"
+@c End:
diff --git a/doc/gendocs_template b/doc/gendocs_template
new file mode 100644
index 0000000..f3a3ff6
--- /dev/null
+++ b/doc/gendocs_template
@@ -0,0 +1,89 @@
+<!--#include virtual="/server/header.html" -->
+<title>%%TITLE%% - GNU Project - Free Software Foundation (FSF)</title>
+<!--#include virtual="/server/banner.html" -->
+<h2>%%TITLE%%</h2>
+
+<address>Free Software Foundation</address>
+<address>last updated %%DATE%%</address>
+
+<p>This manual (%%PACKAGE%%) is available in the following formats:</p>
+
+<ul>
+<li><a href="%%PACKAGE%%.html">HTML
+ (%%HTML_MONO_SIZE%%K bytes)</a> - entirely on one web page.</li>
+<li><a href="html_node/index.html">HTML</a> - with one web page per
+ node.</li>
+%%IF HTML_SECTION%%
+<li><a href="html_section/index.html">HTML</a> - with one web page per
+ section.</li>
+%%ENDIF HTML_SECTION%%
+%%IF HTML_CHAPTER%%
+<li><a href="html_chapter/index.html">HTML</a> - with one web page per
+ chapter.</li>
+%%ENDIF HTML_CHAPTER%%
+<li><a href="%%PACKAGE%%.html.gz">HTML compressed
+ (%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
+ one web page.</li>
+<li><a href="%%PACKAGE%%.html_node.tar.gz">HTML compressed
+ (%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> -
+ with one web page per node.</li>
+%%IF HTML_SECTION%%
+<li><a href="%%PACKAGE%%.html_section.tar.gz">HTML compressed
+ (%%HTML_SECTION_TGZ_SIZE%%K gzipped tar file)</a> -
+ with one web page per section.</li>
+%%ENDIF HTML_SECTION%%
+%%IF HTML_CHAPTER%%
+<li><a href="%%PACKAGE%%.html_chapter.tar.gz">HTML compressed
+ (%%HTML_CHAPTER_TGZ_SIZE%%K gzipped tar file)</a> -
+ with one web page per chapter.</li>
+%%ENDIF HTML_CHAPTER%%
+<li><a href="%%PACKAGE%%.info.tar.gz">Info document
+ (%%INFO_TGZ_SIZE%%K bytes gzipped tar file)</a>.</li>
+<li><a href="%%PACKAGE%%.txt">ASCII text
+ (%%ASCII_SIZE%%K bytes)</a>.</li>
+<li><a href="%%PACKAGE%%.txt.gz">ASCII text compressed
+ (%%ASCII_GZ_SIZE%%K bytes gzipped)</a>.</li>
+<li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file
+ (%%DVI_GZ_SIZE%%K bytes gzipped)</a>.</li>
+<li><a href="%%PACKAGE%%.ps.gz">PostScript file
+ (%%PS_GZ_SIZE%%K bytes gzipped)</a>.</li>
+<li><a href="%%PACKAGE%%.pdf">PDF file
+ (%%PDF_SIZE%%K bytes)</a>.</li>
+<li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source
+ (%%TEXI_TGZ_SIZE%%K bytes gzipped tar file).</a></li>
+</ul>
+
+<p>You can <a href="http://shop.fsf.org/">buy printed copies of
+some manuals</a> (among other items) from the Free Software Foundation;
+this helps support FSF activities.</p>
+
+<p>(This page generated by the <a href="%%SCRIPTURL%%">%%SCRIPTNAME%%
+script</a>.)</p>
+
+<!-- If needed, change the copyright block at the bottom. In general,
+ all pages on the GNU web server should have the section about
+ verbatim copying. Please do NOT remove this without talking
+ with the webmasters first.
+ Please make sure the copyright date is consistent with the document
+ and that it is like this: "2001, 2002", not this: "2001-2002". -->
+</div><!-- for id="content", starts in the include above -->
+<!--#include virtual="/server/footer.html" -->
+<div id="footer">
+
+<p>Please send general FSF &amp; GNU inquiries to
+<a href="mailto:gnu@gnu.org">&lt;gnu@gnu.org&gt;</a>.
+There are also <a href="/contact/">other ways to contact</a>
+the FSF.<br />
+Please send broken links and other corrections or suggestions to
+<a href="mailto:%%EMAIL%%">&lt;%%EMAIL%%&gt;</a>.</p>
+
+<p>Copyright &copy; 2012 Free Software Foundation, Inc.</p>
+
+<p>Verbatim copying and distribution of this entire article are
+permitted worldwide, without royalty, in any medium, provided this
+notice, and the copyright notice, are preserved.</p>
+
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/gnu-oids.texi b/doc/gnu-oids.texi
new file mode 100644
index 0000000..ecbd59b
--- /dev/null
+++ b/doc/gnu-oids.texi
@@ -0,0 +1,55 @@
+@c This table of OID's is included in the GNU Coding Standards.
+@c
+@c Copyright 2008, 2009, 2010 Free Software Foundation, Inc.
+@c
+@c Copying and distribution of this file, with or without modification,
+@c are permitted in any medium without royalty provided the copyright
+@c notice and this notice are preserved.
+@c
+@c When adding new OIDs, please add them also to
+@c http://www.alvestrand.no/objectid/ (except it gets an internal
+@c server error, so never mind)
+@c (Our page is http://www.alvestrand.no/objectid/1.3.6.1.4.1.11591.html.)
+
+1.3.6.1.4.1.11591 GNU
+
+1.3.6.1.4.1.11591.1 GNU Radius
+
+1.3.6.1.4.1.11591.2 GnuPG
+ 1.3.6.1.4.1.11591.2.1 notation
+ 1.3.6.1.4.1.11591.2.1.1 pkaAddress
+
+1.3.6.1.4.1.11591.3 GNU Radar
+
+1.3.6.1.4.1.11591.4 GNU GSS
+
+@c Added 2008-10-24 on request from Sergey Poznyakoff <gray@gnu.org.ua>
+1.3.6.1.4.1.11591.5 GNU Mailutils
+
+@c Added 2009-03-03 on request from Simon Josefsson <simon@josefsson.org>
+1.3.6.1.4.1.11591.6 GNU Shishi
+
+@c Added 2010-05-17 on request from Eric Blossom <eb@comsec.com>
+1.3.6.1.4.1.11591.7 GNU Radio
+
+@c Added 2010-07-02 on request from Sergey Poznyakoff <gray@gnu.org.ua>
+1.3.6.1.4.1.11591.8 GNU Dico
+
+1.3.6.1.4.1.11591.12 digestAlgorithm
+ 1.3.6.1.4.1.11591.12.2 TIGER/192
+ 1.3.6.1.4.1.11591.13 encryptionAlgorithm
+ 1.3.6.1.4.1.11591.13.2 Serpent
+ 1.3.6.1.4.1.11591.13.2.1 Serpent-128-ECB
+ 1.3.6.1.4.1.11591.13.2.2 Serpent-128-CBC
+ 1.3.6.1.4.1.11591.13.2.3 Serpent-128-OFB
+ 1.3.6.1.4.1.11591.13.2.4 Serpent-128-CFB
+ 1.3.6.1.4.1.11591.13.2.21 Serpent-192-ECB
+ 1.3.6.1.4.1.11591.13.2.22 Serpent-192-CBC
+ 1.3.6.1.4.1.11591.13.2.23 Serpent-192-OFB
+ 1.3.6.1.4.1.11591.13.2.24 Serpent-192-CFB
+ 1.3.6.1.4.1.11591.13.2.41 Serpent-256-ECB
+ 1.3.6.1.4.1.11591.13.2.42 Serpent-256-CBC
+ 1.3.6.1.4.1.11591.13.2.43 Serpent-256-OFB
+ 1.3.6.1.4.1.11591.13.2.44 Serpent-256-CFB
+ 1.3.6.1.4.1.11591.14 CRC algorithms
+ 1.3.6.1.4.1.11591.14.1 CRC 32
diff --git a/doc/install.texi b/doc/install.texi
new file mode 100644
index 0000000..4c2ffb5
--- /dev/null
+++ b/doc/install.texi
@@ -0,0 +1,437 @@
+@c This file is included by autoconf.texi and is used to produce
+@c the INSTALL file.
+
+@ifclear autoconf
+
+@unnumbered Installation Instructions
+
+Copyright @copyright{} 1994-1996, 1999-2002, 2004-2012 Free Software
+Foundation, Inc.
+
+Copying and distribution of this file, with or without modification, are
+permitted in any medium without royalty provided the copyright notice
+and this notice are preserved. This file is offered as-is, without
+warranty of any kind.
+
+@end ifclear
+
+@node Basic Installation
+@section Basic Installation
+
+Briefly, the shell commands @samp{./configure; make; make install}
+should configure, build, and install this package. The following
+more-detailed instructions are generic; see the @file{README} file for
+instructions specific to this package.
+@ifclear autoconf
+Some packages provide this @file{INSTALL} file but do not implement all
+of the features documented below. The lack of an optional feature in a
+given package is not necessarily a bug.
+@end ifclear
+More recommendations for GNU packages can be found in
+@ref{Makefile Conventions, , Makefile Conventions, standards,
+GNU Coding Standards}.
+
+The @command{configure} shell script attempts to guess correct values
+for various system-dependent variables used during compilation. It uses
+those values to create a @file{Makefile} in each directory of the
+package. It may also create one or more @file{.h} files containing
+system-dependent definitions. Finally, it creates a shell script
+@file{config.status} that you can run in the future to recreate the
+current configuration, and a file @file{config.log} containing compiler
+output (useful mainly for debugging @command{configure}).
+
+It can also use an optional file (typically called @file{config.cache}
+and enabled with @option{--cache-file=config.cache} or simply
+@option{-C}) that saves the results of its tests to speed up
+reconfiguring. Caching is disabled by default to prevent problems with
+accidental use of stale cache files.
+
+If you need to do unusual things to compile the package, please try to
+figure out how @command{configure} could check whether to do them, and
+mail diffs or instructions to the address given in the @file{README} so
+they can be considered for the next release. If you are using the
+cache, and at some point @file{config.cache} contains results you don't
+want to keep, you may remove or edit it.
+
+The file @file{configure.ac} (or @file{configure.in}) is used to create
+@file{configure} by a program called @command{autoconf}. You need
+@file{configure.ac} if you want to change it or regenerate
+@file{configure} using a newer version of @command{autoconf}.
+
+The simplest way to compile this package is:
+
+@enumerate
+@item
+@command{cd} to the directory containing the package's source code and type
+@samp{./configure} to configure the package for your system.
+
+Running @command{configure} might take a while. While running, it prints some
+messages telling which features it is checking for.
+
+@item
+Type @samp{make} to compile the package.
+
+@item
+Optionally, type @samp{make check} to run any self-tests that come with
+the package, generally using the just-built uninstalled binaries.
+
+@item
+Type @samp{make install} to install the programs and any data files and
+documentation. When installing into a prefix owned by root, it is
+recommended that the package be configured and built as a regular user,
+and only the @samp{make install} phase executed with root privileges.
+
+@item
+Optionally, type @samp{make installcheck} to repeat any self-tests, but
+this time using the binaries in their final installed location. This
+target does not install anything. Running this target as a regular
+user, particularly if the prior @samp{make install} required root
+privileges, verifies that the installation completed correctly.
+
+@item
+You can remove the program binaries and object files from the source
+code directory by typing @samp{make clean}. To also remove the files
+that @command{configure} created (so you can compile the package for a
+different kind of computer), type @samp{make distclean}. There is also
+a @samp{make maintainer-clean} target, but that is intended mainly for
+the package's developers. If you use it, you may have to get all sorts
+of other programs in order to regenerate files that came with the
+distribution.
+
+@item
+Often, you can also type @samp{make uninstall} to remove the installed
+files again. In practice, not all packages have tested that
+uninstallation works correctly, even though it is required by the
+GNU Coding Standards.
+
+@item
+Some packages, particularly those that use Automake, provide @samp{make
+distcheck}, which can by used by developers to test that all other
+targets like @samp{make install} and @samp{make uninstall} work
+correctly. This target is generally not run by end users.
+@end enumerate
+
+@node Compilers and Options
+@section Compilers and Options
+
+Some systems require unusual options for compilation or linking that the
+@command{configure} script does not know about. Run @samp{./configure
+--help} for details on some of the pertinent environment variables.
+
+You can give @command{configure} initial values for configuration
+parameters by setting variables in the command line or in the environment.
+Here is an example:
+
+@example
+./configure CC=c99 CFLAGS=-g LIBS=-lposix
+@end example
+
+@xref{Defining Variables}, for more details.
+
+
+@node Multiple Architectures
+@section Compiling For Multiple Architectures
+
+You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you can use GNU @command{make}.
+@command{cd} to the directory where you want the object files and
+executables to go and run the @command{configure} script.
+@command{configure} automatically checks for the source code in the
+directory that @command{configure} is in and in @file{..}. This is
+known as a @dfn{VPATH} build.
+
+With a non-GNU @command{make},
+it is safer to compile the package for one
+architecture at a time in the source code directory. After you have
+installed the package for one architecture, use @samp{make distclean}
+before reconfiguring for another architecture.
+
+On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types---known as @dfn{fat} or
+@dfn{universal} binaries---by specifying multiple @option{-arch} options
+to the compiler but only a single @option{-arch} option to the
+preprocessor. Like this:
+
+@example
+./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CPP="gcc -E" CXXCPP="g++ -E"
+@end example
+
+This is not guaranteed to produce working output in all cases, you may
+have to build one architecture at a time and combine the results
+using the @command{lipo} tool if you have problems.
+
+@node Installation Names
+@section Installation Names
+
+By default, @samp{make install} installs the package's commands under
+@file{/usr/local/bin}, include files under @file{/usr/local/include}, etc.
+You can specify an
+installation prefix other than @file{/usr/local} by giving
+@command{configure} the option @option{--prefix=@var{prefix}}, where
+@var{prefix} must be an absolute file name.
+
+You can specify separate installation prefixes for architecture-specific
+files and architecture-independent files. If you pass the option
+@option{--exec-prefix=@var{prefix}} to @command{configure}, the
+package uses @var{prefix} as the prefix for installing programs and
+libraries. Documentation and other data files still use the
+regular prefix.
+
+In addition, if you use an unusual directory layout you can give options
+like @option{--bindir=@var{dir}} to specify different values for
+particular kinds of files. Run @samp{configure --help} for a list of
+the directories you can set and what kinds of files go in them. In
+general, the default for these options is expressed in terms of
+@samp{$@{prefix@}}, so that specifying just @option{--prefix} will
+affect all of the other directory specifications that were not
+explicitly provided.
+
+The most portable way to affect installation locations is to pass the
+correct locations to @command{configure}; however, many packages provide
+one or both of the following shortcuts of passing variable assignments
+to the @samp{make install} command line to change installation locations
+without having to reconfigure or recompile.
+
+The first method involves providing an override variable for each
+affected directory. For example, @samp{make install
+prefix=/alternate/directory} will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+@samp{$@{prefix@}}. Any directories that were specified during
+@command{configure}, but not in terms of @samp{$@{prefix@}}, must each be
+overridden at install time for the entire
+installation to be relocated. The approach of makefile variable
+overrides for each directory variable is required by the GNU
+Coding Standards, and ideally causes no recompilation. However, some
+platforms have known limitations with the semantics of shared libraries
+that end up requiring recompilation when using this method, particularly
+noticeable in packages that use GNU Libtool.
+
+The second method involves providing the @samp{DESTDIR} variable. For
+example, @samp{make install DESTDIR=/alternate/directory} will prepend
+@samp{/alternate/directory} before all installation names. The approach
+of @samp{DESTDIR} overrides is not required by the GNU Coding
+Standards, and does not work on platforms that have drive letters. On
+the other hand, it does better at avoiding recompilation issues, and
+works well even when some directory options were not specified in terms
+of @samp{$@{prefix@}} at @command{configure} time.
+
+@node Optional Features
+@section Optional Features
+
+If the package supports it, you can cause programs to be installed with
+an extra prefix or suffix on their names by giving @command{configure}
+the option @option{--program-prefix=@var{PREFIX}} or
+@option{--program-suffix=@var{SUFFIX}}.
+
+Some packages pay attention to @option{--enable-@var{feature}} options
+to @command{configure}, where @var{feature} indicates an optional part
+of the package. They may also pay attention to
+@option{--with-@var{package}} options, where @var{package} is something
+like @samp{gnu-as} or @samp{x} (for the X Window System). The
+@file{README} should mention any @option{--enable-} and @option{--with-}
+options that the package recognizes.
+
+For packages that use the X Window System, @command{configure} can
+usually find the X include and library files automatically, but if it
+doesn't, you can use the @command{configure} options
+@option{--x-includes=@var{dir}} and @option{--x-libraries=@var{dir}} to
+specify their locations.
+
+Some packages offer the ability to configure how verbose the execution
+of @command{make} will be. For these packages, running
+@samp{./configure --enable-silent-rules} sets the default to minimal
+output, which can be overridden with @code{make V=1}; while running
+@samp{./configure --disable-silent-rules} sets the default to verbose,
+which can be overridden with @code{make V=0}.
+
+@node Particular Systems
+@section Particular systems
+
+On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is
+not installed, it is recommended to use the following options in order to
+use an ANSI C compiler:
+
+@example
+./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+@end example
+
+@noindent
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+HP-UX @command{make} updates targets which have the same time stamps as
+their prerequisites, which makes it generally unusable when shipped
+generated files such as @command{configure} are involved. Use GNU
+@command{make} instead.
+
+On OSF/1 a.k.a.@: Tru64, some versions of the default C compiler cannot
+parse its @code{<wchar.h>} header file. The option @option{-nodtk} can be
+used as a workaround. If GNU CC is not installed, it is therefore
+recommended to try
+
+@example
+./configure CC="cc"
+@end example
+
+@noindent
+and if that doesn't work, try
+
+@example
+./configure CC="cc -nodtk"
+@end example
+
+On Solaris, don't put @code{/usr/ucb} early in your @env{PATH}. This
+directory contains several dysfunctional programs; working variants
+of these programs are available in @code{/usr/bin}. So, if you need
+@code{/usr/ucb} in your @env{PATH}, put it @emph{after} @code{/usr/bin}.
+
+On Haiku, software installed for all users goes in @file{/boot/common},
+not @file{/usr/local}. It is recommended to use the following options:
+
+@example
+./configure --prefix=/boot/common
+@end example
+
+@node System Type
+@section Specifying the System Type
+
+There may be some features @command{configure} cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+@emph{same} architectures, @command{configure} can figure that out, but
+if it prints a message saying it cannot guess the machine type, give it
+the @option{--build=@var{type}} option. @var{type} can either be a
+short name for the system type, such as @samp{sun4}, or a canonical name
+which has the form:
+
+@example
+@var{cpu}-@var{company}-@var{system}
+@end example
+
+@noindent
+where @var{system} can have one of these forms:
+
+@example
+@var{os}
+@var{kernel}-@var{os}
+@end example
+
+See the file @file{config.sub} for the possible values of each field.
+If @file{config.sub} isn't included in this package, then this package
+doesn't need to know the machine type.
+
+If you are @emph{building} compiler tools for cross-compiling, you
+should use the option @option{--target=@var{type}} to select the type of
+system they will produce code for.
+
+If you want to @emph{use} a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+@dfn{host} platform (i.e., that on which the generated programs will
+eventually be run) with @option{--host=@var{type}}.
+
+@node Sharing Defaults
+@section Sharing Defaults
+
+If you want to set default values for @command{configure} scripts to
+share, you can create a site shell script called @file{config.site} that
+gives default values for variables like @code{CC}, @code{cache_file},
+and @code{prefix}. @command{configure} looks for
+@file{@var{prefix}/share/config.site} if it exists, then
+@file{@var{prefix}/etc/config.site} if it exists. Or, you can set the
+@code{CONFIG_SITE} environment variable to the location of the site
+script. A warning: not all @command{configure} scripts look for a site
+script.
+
+@node Defining Variables
+@section Defining Variables
+
+Variables not defined in a site shell script can be set in the
+environment passed to @command{configure}. However, some packages may
+run configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the @command{configure} command line, using @samp{VAR=value}.
+For example:
+
+@example
+./configure CC=/usr/local2/bin/gcc
+@end example
+
+@noindent
+causes the specified @command{gcc} to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+@noindent
+Unfortunately, this technique does not work for @env{CONFIG_SHELL} due
+to an Autoconf limitation. Until the limitation is lifted, you can use
+this workaround:
+
+@example
+CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
+@end example
+
+@node configure Invocation
+@section @command{configure} Invocation
+
+@command{configure} recognizes the following options to control how it
+operates.
+
+@table @option
+@item --help
+@itemx -h
+Print a summary of all of the options to @command{configure}, and exit.
+
+@item --help=short
+@itemx --help=recursive
+Print a summary of the options unique to this package's
+@command{configure}, and exit. The @code{short} variant lists options
+used only in the top level, while the @code{recursive} variant lists
+options also present in any nested packages.
+
+@item --version
+@itemx -V
+Print the version of Autoconf used to generate the @command{configure}
+script, and exit.
+
+@item --cache-file=@var{file}
+@cindex Cache, enabling
+Enable the cache: use and save the results of the tests in @var{file},
+traditionally @file{config.cache}. @var{file} defaults to
+@file{/dev/null} to disable caching.
+
+@item --config-cache
+@itemx -C
+Alias for @option{--cache-file=config.cache}.
+
+@item --quiet
+@itemx --silent
+@itemx -q
+Do not print messages saying which checks are being made. To suppress
+all normal output, redirect it to @file{/dev/null} (any error messages
+will still be shown).
+
+@item --srcdir=@var{dir}
+Look for the package's source code in directory @var{dir}. Usually
+@command{configure} can determine that directory automatically.
+
+@item --prefix=@var{dir}
+Use @var{dir} as the installation prefix. @ref{Installation Names}
+for more details, including other options available for fine-tuning
+the installation locations.
+
+@item --no-create
+@itemx -n
+Run the configure checks, but stop before creating any output files.
+@end table
+
+@noindent
+@command{configure} also accepts some other, not widely useful, options.
+Run @samp{configure --help} for more details.
+
+@c Local Variables:
+@c fill-column: 72
+@c ispell-local-dictionary: "american"
+@c indent-tabs-mode: nil
+@c whitespace-check-buffer-indent: nil
+@c End:
diff --git a/doc/make-stds.texi b/doc/make-stds.texi
new file mode 100644
index 0000000..cdcbb68
--- /dev/null
+++ b/doc/make-stds.texi
@@ -0,0 +1,1159 @@
+@comment This file is included by both standards.texi and make.texinfo.
+@comment It was broken out of standards.texi on 1/6/93 by roland.
+
+@node Makefile Conventions
+@chapter Makefile Conventions
+@cindex makefile, conventions for
+@cindex conventions for makefiles
+@cindex standards for makefiles
+
+@c Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001,
+@c 2004, 2005, 2006, 2007, 2008, 2010 Free Software Foundation, Inc.
+@c
+@c Permission is granted to copy, distribute and/or modify this document
+@c under the terms of the GNU Free Documentation License, Version 1.3
+@c or any later version published by the Free Software Foundation;
+@c with no Invariant Sections, with no
+@c Front-Cover Texts, and with no Back-Cover Texts.
+@c A copy of the license is included in the section entitled ``GNU
+@c Free Documentation License''.
+
+This
+@ifinfo
+node
+@end ifinfo
+@iftex
+@ifset CODESTD
+section
+@end ifset
+@ifclear CODESTD
+chapter
+@end ifclear
+@end iftex
+describes conventions for writing the Makefiles for GNU programs.
+Using Automake will help you write a Makefile that follows these
+conventions. For more information on portable Makefiles, see
+@sc{posix} and @ref{Portable Make, Portable Make Programming,, autoconf,
+Autoconf}.
+
+
+@menu
+* Makefile Basics:: General conventions for Makefiles.
+* Utilities in Makefiles:: Utilities to be used in Makefiles.
+* Command Variables:: Variables for specifying commands.
+* DESTDIR:: Supporting staged installs.
+* Directory Variables:: Variables for installation directories.
+* Standard Targets:: Standard targets for users.
+* Install Command Categories:: Three categories of commands in the `install'
+ rule: normal, pre-install and post-install.
+@end menu
+
+@node Makefile Basics
+@section General Conventions for Makefiles
+
+Every Makefile should contain this line:
+
+@example
+SHELL = /bin/sh
+@end example
+
+@noindent
+to avoid trouble on systems where the @code{SHELL} variable might be
+inherited from the environment. (This is never a problem with GNU
+@code{make}.)
+
+Different @code{make} programs have incompatible suffix lists and
+implicit rules, and this sometimes creates confusion or misbehavior. So
+it is a good idea to set the suffix list explicitly using only the
+suffixes you need in the particular Makefile, like this:
+
+@example
+.SUFFIXES:
+.SUFFIXES: .c .o
+@end example
+
+@noindent
+The first line clears out the suffix list, the second introduces all
+suffixes which may be subject to implicit rules in this Makefile.
+
+Don't assume that @file{.} is in the path for command execution. When
+you need to run programs that are a part of your package during the
+make, please make sure that it uses @file{./} if the program is built as
+part of the make or @file{$(srcdir)/} if the file is an unchanging part
+of the source code. Without one of these prefixes, the current search
+path is used.
+
+The distinction between @file{./} (the @dfn{build directory}) and
+@file{$(srcdir)/} (the @dfn{source directory}) is important because
+users can build in a separate directory using the @samp{--srcdir} option
+to @file{configure}. A rule of the form:
+
+@smallexample
+foo.1 : foo.man sedscript
+ sed -f sedscript foo.man > foo.1
+@end smallexample
+
+@noindent
+will fail when the build directory is not the source directory, because
+@file{foo.man} and @file{sedscript} are in the source directory.
+
+When using GNU @code{make}, relying on @samp{VPATH} to find the source
+file will work in the case where there is a single dependency file,
+since the @code{make} automatic variable @samp{$<} will represent the
+source file wherever it is. (Many versions of @code{make} set @samp{$<}
+only in implicit rules.) A Makefile target like
+
+@smallexample
+foo.o : bar.c
+ $(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o
+@end smallexample
+
+@noindent
+should instead be written as
+
+@smallexample
+foo.o : bar.c
+ $(CC) -I. -I$(srcdir) $(CFLAGS) -c $< -o $@@
+@end smallexample
+
+@noindent
+in order to allow @samp{VPATH} to work correctly. When the target has
+multiple dependencies, using an explicit @samp{$(srcdir)} is the easiest
+way to make the rule work well. For example, the target above for
+@file{foo.1} is best written as:
+
+@smallexample
+foo.1 : foo.man sedscript
+ sed -f $(srcdir)/sedscript $(srcdir)/foo.man > $@@
+@end smallexample
+
+GNU distributions usually contain some files which are not source
+files---for example, Info files, and the output from Autoconf, Automake,
+Bison or Flex. Since these files normally appear in the source
+directory, they should always appear in the source directory, not in the
+build directory. So Makefile rules to update them should put the
+updated files in the source directory.
+
+However, if a file does not appear in the distribution, then the
+Makefile should not put it in the source directory, because building a
+program in ordinary circumstances should not modify the source directory
+in any way.
+
+Try to make the build and installation targets, at least (and all their
+subtargets) work correctly with a parallel @code{make}.
+
+@node Utilities in Makefiles
+@section Utilities in Makefiles
+
+Write the Makefile commands (and any shell scripts, such as
+@code{configure}) to run under @code{sh} (both the traditional Bourne
+shell and the @sc{posix} shell), not @code{csh}. Don't use any
+special features of @code{ksh} or @code{bash}, or @sc{posix} features
+not widely supported in traditional Bourne @code{sh}.
+
+The @code{configure} script and the Makefile rules for building and
+installation should not use any utilities directly except these:
+
+@c dd find
+@c gunzip gzip md5sum
+@c mkfifo mknod tee uname
+
+@example
+awk cat cmp cp diff echo egrep expr false grep install-info ln ls
+mkdir mv printf pwd rm rmdir sed sleep sort tar test touch tr true
+@end example
+
+Compression programs such as @code{gzip} can be used in the
+@code{dist} rule.
+
+Generally, stick to the widely-supported (usually
+@sc{posix}-specified) options and features of these programs. For
+example, don't use @samp{mkdir -p}, convenient as it may be, because a
+few systems don't support it at all and with others, it is not safe
+for parallel execution. For a list of known incompatibilities, see
+@ref{Portable Shell, Portable Shell Programming,, autoconf, Autoconf}.
+
+
+It is a good idea to avoid creating symbolic links in makefiles, since a
+few file systems don't support them.
+
+The Makefile rules for building and installation can also use compilers
+and related programs, but should do so via @code{make} variables so that the
+user can substitute alternatives. Here are some of the programs we
+mean:
+
+@example
+ar bison cc flex install ld ldconfig lex
+make makeinfo ranlib texi2dvi yacc
+@end example
+
+Use the following @code{make} variables to run those programs:
+
+@example
+$(AR) $(BISON) $(CC) $(FLEX) $(INSTALL) $(LD) $(LDCONFIG) $(LEX)
+$(MAKE) $(MAKEINFO) $(RANLIB) $(TEXI2DVI) $(YACC)
+@end example
+
+When you use @code{ranlib} or @code{ldconfig}, you should make sure
+nothing bad happens if the system does not have the program in question.
+Arrange to ignore an error from that command, and print a message before
+the command to tell the user that failure of this command does not mean
+a problem. (The Autoconf @samp{AC_PROG_RANLIB} macro can help with
+this.)
+
+If you use symbolic links, you should implement a fallback for systems
+that don't have symbolic links.
+
+Additional utilities that can be used via Make variables are:
+
+@example
+chgrp chmod chown mknod
+@end example
+
+It is ok to use other utilities in Makefile portions (or scripts)
+intended only for particular systems where you know those utilities
+exist.
+
+@node Command Variables
+@section Variables for Specifying Commands
+
+Makefiles should provide variables for overriding certain commands, options,
+and so on.
+
+In particular, you should run most utility programs via variables.
+Thus, if you use Bison, have a variable named @code{BISON} whose default
+value is set with @samp{BISON = bison}, and refer to it with
+@code{$(BISON)} whenever you need to use Bison.
+
+File management utilities such as @code{ln}, @code{rm}, @code{mv}, and
+so on, need not be referred to through variables in this way, since users
+don't need to replace them with other programs.
+
+Each program-name variable should come with an options variable that is
+used to supply options to the program. Append @samp{FLAGS} to the
+program-name variable name to get the options variable name---for
+example, @code{BISONFLAGS}. (The names @code{CFLAGS} for the C
+compiler, @code{YFLAGS} for yacc, and @code{LFLAGS} for lex, are
+exceptions to this rule, but we keep them because they are standard.)
+Use @code{CPPFLAGS} in any compilation command that runs the
+preprocessor, and use @code{LDFLAGS} in any compilation command that
+does linking as well as in any direct use of @code{ld}.
+
+If there are C compiler options that @emph{must} be used for proper
+compilation of certain files, do not include them in @code{CFLAGS}.
+Users expect to be able to specify @code{CFLAGS} freely themselves.
+Instead, arrange to pass the necessary options to the C compiler
+independently of @code{CFLAGS}, by writing them explicitly in the
+compilation commands or by defining an implicit rule, like this:
+
+@smallexample
+CFLAGS = -g
+ALL_CFLAGS = -I. $(CFLAGS)
+.c.o:
+ $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $<
+@end smallexample
+
+Do include the @samp{-g} option in @code{CFLAGS}, because that is not
+@emph{required} for proper compilation. You can consider it a default
+that is only recommended. If the package is set up so that it is
+compiled with GCC by default, then you might as well include @samp{-O}
+in the default value of @code{CFLAGS} as well.
+
+Put @code{CFLAGS} last in the compilation command, after other variables
+containing compiler options, so the user can use @code{CFLAGS} to
+override the others.
+
+@code{CFLAGS} should be used in every invocation of the C compiler,
+both those which do compilation and those which do linking.
+
+Every Makefile should define the variable @code{INSTALL}, which is the
+basic command for installing a file into the system.
+
+Every Makefile should also define the variables @code{INSTALL_PROGRAM}
+and @code{INSTALL_DATA}. (The default for @code{INSTALL_PROGRAM} should
+be @code{$(INSTALL)}; the default for @code{INSTALL_DATA} should be
+@code{$@{INSTALL@} -m 644}.) Then it should use those variables as the
+commands for actual installation, for executables and non-executables
+respectively. Minimal use of these variables is as follows:
+
+@example
+$(INSTALL_PROGRAM) foo $(bindir)/foo
+$(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a
+@end example
+
+However, it is preferable to support a @code{DESTDIR} prefix on the
+target files, as explained in the next section.
+
+It is acceptable, but not required, to install multiple files in one
+command, with the final argument being a directory, as in:
+
+@example
+$(INSTALL_PROGRAM) foo bar baz $(bindir)
+@end example
+
+
+@node DESTDIR
+@section @code{DESTDIR}: Support for Staged Installs
+
+@vindex DESTDIR
+@cindex staged installs
+@cindex installations, staged
+
+@code{DESTDIR} is a variable prepended to each installed target file,
+like this:
+
+@example
+$(INSTALL_PROGRAM) foo $(DESTDIR)$(bindir)/foo
+$(INSTALL_DATA) libfoo.a $(DESTDIR)$(libdir)/libfoo.a
+@end example
+
+The @code{DESTDIR} variable is specified by the user on the @code{make}
+command line as an absolute file name. For example:
+
+@example
+make DESTDIR=/tmp/stage install
+@end example
+
+@noindent
+@code{DESTDIR} should be supported only in the @code{install*} and
+@code{uninstall*} targets, as those are the only targets where it is
+useful.
+
+If your installation step would normally install
+@file{/usr/local/bin/foo} and @file{/usr/@/local/@/lib/@/libfoo.a}, then an
+installation invoked as in the example above would install
+@file{/tmp/stage/usr/local/bin/foo} and
+@file{/tmp/stage/usr/local/lib/libfoo.a} instead.
+
+Prepending the variable @code{DESTDIR} to each target in this way
+provides for @dfn{staged installs}, where the installed files are not
+placed directly into their expected location but are instead copied
+into a temporary location (@code{DESTDIR}). However, installed files
+maintain their relative directory structure and any embedded file names
+will not be modified.
+
+You should not set the value of @code{DESTDIR} in your @file{Makefile}
+at all; then the files are installed into their expected locations by
+default. Also, specifying @code{DESTDIR} should not change the
+operation of the software in any way, so its value should not be
+included in any file contents.
+
+@code{DESTDIR} support is commonly used in package creation. It is
+also helpful to users who want to understand what a given package will
+install where, and to allow users who don't normally have permissions
+to install into protected areas to build and install before gaining
+those permissions. Finally, it can be useful with tools such as
+@code{stow}, where code is installed in one place but made to appear
+to be installed somewhere else using symbolic links or special mount
+operations. So, we strongly recommend GNU packages support
+@code{DESTDIR}, though it is not an absolute requirement.
+
+
+@node Directory Variables
+@section Variables for Installation Directories
+
+Installation directories should always be named by variables, so it is
+easy to install in a nonstandard place. The standard names for these
+variables and the values they should have in GNU packages are
+described below. They are based on a standard file system layout;
+variants of it are used in GNU/Linux and other modern operating
+systems.
+
+Installers are expected to override these values when calling
+@command{make} (e.g., @kbd{make prefix=/usr install} or
+@command{configure} (e.g., @kbd{configure --prefix=/usr}). GNU
+packages should not try to guess which value should be appropriate for
+these variables on the system they are being installed onto: use the
+default settings specified here so that all GNU packages behave
+identically, allowing the installer to achieve any desired layout.
+
+@cindex directories, creating installation
+@cindex installation directories, creating
+All installation directories, and their parent directories, should be
+created (if necessary) before they are installed into.
+
+These first two variables set the root for the installation. All the
+other installation directories should be subdirectories of one of
+these two, and nothing should be directly installed into these two
+directories.
+
+@table @code
+@item prefix
+@vindex prefix
+A prefix used in constructing the default values of the variables listed
+below. The default value of @code{prefix} should be @file{/usr/local}.
+When building the complete GNU system, the prefix will be empty and
+@file{/usr} will be a symbolic link to @file{/}.
+(If you are using Autoconf, write it as @samp{@@prefix@@}.)
+
+Running @samp{make install} with a different value of @code{prefix} from
+the one used to build the program should @emph{not} recompile the
+program.
+
+@item exec_prefix
+@vindex exec_prefix
+A prefix used in constructing the default values of some of the
+variables listed below. The default value of @code{exec_prefix} should
+be @code{$(prefix)}.
+(If you are using Autoconf, write it as @samp{@@exec_prefix@@}.)
+
+Generally, @code{$(exec_prefix)} is used for directories that contain
+machine-specific files (such as executables and subroutine libraries),
+while @code{$(prefix)} is used directly for other directories.
+
+Running @samp{make install} with a different value of @code{exec_prefix}
+from the one used to build the program should @emph{not} recompile the
+program.
+@end table
+
+Executable programs are installed in one of the following directories.
+
+@table @code
+@item bindir
+@vindex bindir
+The directory for installing executable programs that users can run.
+This should normally be @file{/usr/local/bin}, but write it as
+@file{$(exec_prefix)/bin}.
+(If you are using Autoconf, write it as @samp{@@bindir@@}.)
+
+@item sbindir
+@vindex sbindir
+The directory for installing executable programs that can be run from
+the shell, but are only generally useful to system administrators. This
+should normally be @file{/usr/local/sbin}, but write it as
+@file{$(exec_prefix)/sbin}.
+(If you are using Autoconf, write it as @samp{@@sbindir@@}.)
+
+@item libexecdir
+@vindex libexecdir
+@comment This paragraph adjusted to avoid overfull hbox --roland 5jul94
+The directory for installing executable programs to be run by other
+programs rather than by users. This directory should normally be
+@file{/usr/local/libexec}, but write it as @file{$(exec_prefix)/libexec}.
+(If you are using Autoconf, write it as @samp{@@libexecdir@@}.)
+
+The definition of @samp{libexecdir} is the same for all packages, so
+you should install your data in a subdirectory thereof. Most packages
+install their data under @file{$(libexecdir)/@var{package-name}/},
+possibly within additional subdirectories thereof, such as
+@file{$(libexecdir)/@var{package-name}/@var{machine}/@var{version}}.
+@end table
+
+Data files used by the program during its execution are divided into
+categories in two ways.
+
+@itemize @bullet
+@item
+Some files are normally modified by programs; others are never normally
+modified (though users may edit some of these).
+
+@item
+Some files are architecture-independent and can be shared by all
+machines at a site; some are architecture-dependent and can be shared
+only by machines of the same kind and operating system; others may never
+be shared between two machines.
+@end itemize
+
+This makes for six different possibilities. However, we want to
+discourage the use of architecture-dependent files, aside from object
+files and libraries. It is much cleaner to make other data files
+architecture-independent, and it is generally not hard.
+
+Here are the variables Makefiles should use to specify directories
+to put these various kinds of files in:
+
+@table @samp
+@item datarootdir
+The root of the directory tree for read-only architecture-independent
+data files. This should normally be @file{/usr/local/share}, but
+write it as @file{$(prefix)/share}. (If you are using Autoconf, write
+it as @samp{@@datarootdir@@}.) @samp{datadir}'s default value is
+based on this variable; so are @samp{infodir}, @samp{mandir}, and
+others.
+
+@item datadir
+The directory for installing idiosyncratic read-only
+architecture-independent data files for this program. This is usually
+the same place as @samp{datarootdir}, but we use the two separate
+variables so that you can move these program-specific files without
+altering the location for Info files, man pages, etc.
+
+@c raggedright (not until next Texinfo release)
+This should normally be @file{/usr/local/share}, but write it as
+@file{$(datarootdir)}. (If you are using Autoconf, write it as
+@samp{@@datadir@@}.)
+@c end raggedright
+
+The definition of @samp{datadir} is the same for all packages, so you
+should install your data in a subdirectory thereof. Most packages
+install their data under @file{$(datadir)/@var{package-name}/}.
+
+@item sysconfdir
+The directory for installing read-only data files that pertain to a
+single machine--that is to say, files for configuring a host. Mailer
+and network configuration files, @file{/etc/passwd}, and so forth belong
+here. All the files in this directory should be ordinary ASCII text
+files. This directory should normally be @file{/usr/local/etc}, but
+write it as @file{$(prefix)/etc}.
+(If you are using Autoconf, write it as @samp{@@sysconfdir@@}.)
+
+Do not install executables here in this directory (they probably belong
+in @file{$(libexecdir)} or @file{$(sbindir)}). Also do not install
+files that are modified in the normal course of their use (programs
+whose purpose is to change the configuration of the system excluded).
+Those probably belong in @file{$(localstatedir)}.
+
+@item sharedstatedir
+The directory for installing architecture-independent data files which
+the programs modify while they run. This should normally be
+@file{/usr/local/com}, but write it as @file{$(prefix)/com}.
+(If you are using Autoconf, write it as @samp{@@sharedstatedir@@}.)
+
+@item localstatedir
+The directory for installing data files which the programs modify while
+they run, and that pertain to one specific machine. Users should never
+need to modify files in this directory to configure the package's
+operation; put such configuration information in separate files that go
+in @file{$(datadir)} or @file{$(sysconfdir)}. @file{$(localstatedir)}
+should normally be @file{/usr/local/var}, but write it as
+@file{$(prefix)/var}.
+(If you are using Autoconf, write it as @samp{@@localstatedir@@}.)
+@end table
+
+These variables specify the directory for installing certain specific
+types of files, if your program has them. Every GNU package should
+have Info files, so every program needs @samp{infodir}, but not all
+need @samp{libdir} or @samp{lispdir}.
+
+@table @samp
+@item includedir
+The directory for installing header files to be included by user
+programs with the C @samp{#include} preprocessor directive. This
+should normally be @file{/usr/local/include}, but write it as
+@file{$(prefix)/include}.
+(If you are using Autoconf, write it as @samp{@@includedir@@}.)
+
+Most compilers other than GCC do not look for header files in directory
+@file{/usr/local/include}. So installing the header files this way is
+only useful with GCC. Sometimes this is not a problem because some
+libraries are only really intended to work with GCC. But some libraries
+are intended to work with other compilers. They should install their
+header files in two places, one specified by @code{includedir} and one
+specified by @code{oldincludedir}.
+
+@item oldincludedir
+The directory for installing @samp{#include} header files for use with
+compilers other than GCC. This should normally be @file{/usr/include}.
+(If you are using Autoconf, you can write it as @samp{@@oldincludedir@@}.)
+
+The Makefile commands should check whether the value of
+@code{oldincludedir} is empty. If it is, they should not try to use
+it; they should cancel the second installation of the header files.
+
+A package should not replace an existing header in this directory unless
+the header came from the same package. Thus, if your Foo package
+provides a header file @file{foo.h}, then it should install the header
+file in the @code{oldincludedir} directory if either (1) there is no
+@file{foo.h} there or (2) the @file{foo.h} that exists came from the Foo
+package.
+
+To tell whether @file{foo.h} came from the Foo package, put a magic
+string in the file---part of a comment---and @code{grep} for that string.
+
+@item docdir
+The directory for installing documentation files (other than Info) for
+this package. By default, it should be
+@file{/usr/local/share/doc/@var{yourpkg}}, but it should be written as
+@file{$(datarootdir)/doc/@var{yourpkg}}. (If you are using Autoconf,
+write it as @samp{@@docdir@@}.) The @var{yourpkg} subdirectory, which
+may include a version number, prevents collisions among files with
+common names, such as @file{README}.
+
+@item infodir
+The directory for installing the Info files for this package. By
+default, it should be @file{/usr/local/share/info}, but it should be
+written as @file{$(datarootdir)/info}. (If you are using Autoconf,
+write it as @samp{@@infodir@@}.) @code{infodir} is separate from
+@code{docdir} for compatibility with existing practice.
+
+@item htmldir
+@itemx dvidir
+@itemx pdfdir
+@itemx psdir
+Directories for installing documentation files in the particular
+format. They should all be set to @code{$(docdir)} by default. (If
+you are using Autoconf, write them as @samp{@@htmldir@@},
+@samp{@@dvidir@@}, etc.) Packages which supply several translations
+of their documentation should install them in
+@samp{$(htmldir)/}@var{ll}, @samp{$(pdfdir)/}@var{ll}, etc. where
+@var{ll} is a locale abbreviation such as @samp{en} or @samp{pt_BR}.
+
+@item libdir
+The directory for object files and libraries of object code. Do not
+install executables here, they probably ought to go in @file{$(libexecdir)}
+instead. The value of @code{libdir} should normally be
+@file{/usr/local/lib}, but write it as @file{$(exec_prefix)/lib}.
+(If you are using Autoconf, write it as @samp{@@libdir@@}.)
+
+@item lispdir
+The directory for installing any Emacs Lisp files in this package. By
+default, it should be @file{/usr/local/share/emacs/site-lisp}, but it
+should be written as @file{$(datarootdir)/emacs/site-lisp}.
+
+If you are using Autoconf, write the default as @samp{@@lispdir@@}.
+In order to make @samp{@@lispdir@@} work, you need the following lines
+in your @file{configure.in} file:
+
+@example
+lispdir='$@{datarootdir@}/emacs/site-lisp'
+AC_SUBST(lispdir)
+@end example
+
+@item localedir
+The directory for installing locale-specific message catalogs for this
+package. By default, it should be @file{/usr/local/share/locale}, but
+it should be written as @file{$(datarootdir)/locale}. (If you are
+using Autoconf, write it as @samp{@@localedir@@}.) This directory
+usually has a subdirectory per locale.
+@end table
+
+Unix-style man pages are installed in one of the following:
+
+@table @samp
+@item mandir
+The top-level directory for installing the man pages (if any) for this
+package. It will normally be @file{/usr/local/share/man}, but you
+should write it as @file{$(datarootdir)/man}. (If you are using
+Autoconf, write it as @samp{@@mandir@@}.)
+
+@item man1dir
+The directory for installing section 1 man pages. Write it as
+@file{$(mandir)/man1}.
+@item man2dir
+The directory for installing section 2 man pages. Write it as
+@file{$(mandir)/man2}
+@item @dots{}
+
+@strong{Don't make the primary documentation for any GNU software be a
+man page. Write a manual in Texinfo instead. Man pages are just for
+the sake of people running GNU software on Unix, which is a secondary
+application only.}
+
+@item manext
+The file name extension for the installed man page. This should contain
+a period followed by the appropriate digit; it should normally be @samp{.1}.
+
+@item man1ext
+The file name extension for installed section 1 man pages.
+@item man2ext
+The file name extension for installed section 2 man pages.
+@item @dots{}
+Use these names instead of @samp{manext} if the package needs to install man
+pages in more than one section of the manual.
+@end table
+
+And finally, you should set the following variable:
+
+@table @samp
+@item srcdir
+The directory for the sources being compiled. The value of this
+variable is normally inserted by the @code{configure} shell script.
+(If you are using Autoconf, use @samp{srcdir = @@srcdir@@}.)
+@end table
+
+For example:
+
+@smallexample
+@c I have changed some of the comments here slightly to fix an overfull
+@c hbox, so the make manual can format correctly. --roland
+# Common prefix for installation directories.
+# NOTE: This directory must exist when you start the install.
+prefix = /usr/local
+datarootdir = $(prefix)/share
+datadir = $(datarootdir)
+exec_prefix = $(prefix)
+# Where to put the executable for the command `gcc'.
+bindir = $(exec_prefix)/bin
+# Where to put the directories used by the compiler.
+libexecdir = $(exec_prefix)/libexec
+# Where to put the Info files.
+infodir = $(datarootdir)/info
+@end smallexample
+
+If your program installs a large number of files into one of the
+standard user-specified directories, it might be useful to group them
+into a subdirectory particular to that program. If you do this, you
+should write the @code{install} rule to create these subdirectories.
+
+Do not expect the user to include the subdirectory name in the value of
+any of the variables listed above. The idea of having a uniform set of
+variable names for installation directories is to enable the user to
+specify the exact same values for several different GNU packages. In
+order for this to be useful, all the packages must be designed so that
+they will work sensibly when the user does so.
+
+At times, not all of these variables may be implemented in the current
+release of Autoconf and/or Automake; but as of Autoconf@tie{}2.60, we
+believe all of them are. When any are missing, the descriptions here
+serve as specifications for what Autoconf will implement. As a
+programmer, you can either use a development version of Autoconf or
+avoid using these variables until a stable release is made which
+supports them.
+
+
+@node Standard Targets
+@section Standard Targets for Users
+
+All GNU programs should have the following targets in their Makefiles:
+
+@table @samp
+@item all
+Compile the entire program. This should be the default target. This
+target need not rebuild any documentation files; Info files should
+normally be included in the distribution, and DVI (and other
+documentation format) files should be made only when explicitly asked
+for.
+
+By default, the Make rules should compile and link with @samp{-g}, so
+that executable programs have debugging symbols. Otherwise, you are
+essentially helpless in the face of a crash, and it is often far from
+easy to reproduce with a fresh build.
+
+@item 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.
+
+Do not strip executables when installing them. This helps eventual
+debugging that may be needed later, and nowadays disk space is cheap
+and dynamic loaders typically ensure debug sections are not loaded during
+normal execution. Users that need stripped binaries may invoke the
+@code{install-strip} target to do that.
+
+If possible, write the @code{install} target rule so that it does not
+modify anything in the directory where the program was built, provided
+@samp{make all} has just been done. This is convenient for building the
+program under one user name and installing it under another.
+
+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 @code{prefix} and
+@code{exec_prefix}, as well as all subdirectories that are needed.
+One way to do this is by means of an @code{installdirs} target
+as described below.
+
+Use @samp{-} before any command for installing a man page, so that
+@code{make} will ignore any errors. This is in case there are systems
+that don't have the Unix man page documentation system installed.
+
+The way to install Info files is to copy them into @file{$(infodir)}
+with @code{$(INSTALL_DATA)} (@pxref{Command Variables}), and then run
+the @code{install-info} program if it is present. @code{install-info}
+is a program that edits the Info @file{dir} file to add or update the
+menu entry for the given Info file; it is part of the Texinfo package.
+
+Here is a sample rule to install an Info file that also tries to
+handle some additional situations, such as @code{install-info} not
+being present.
+
+@comment This example has been carefully formatted for the Make manual.
+@comment Please do not reformat it without talking to bug-make@gnu.org.
+@smallexample
+do-install-info: foo.info installdirs
+ $(NORMAL_INSTALL)
+# Prefer an info file in . to one in srcdir.
+ if test -f foo.info; then d=.; \
+ else d="$(srcdir)"; fi; \
+ $(INSTALL_DATA) $$d/foo.info \
+ "$(DESTDIR)$(infodir)/foo.info"
+# Run install-info only if it exists.
+# Use `if' instead of just prepending `-' to the
+# line so we notice real errors from install-info.
+# Use `$(SHELL) -c' because some shells do not
+# fail gracefully when there is an unknown command.
+ $(POST_INSTALL)
+ if $(SHELL) -c 'install-info --version' \
+ >/dev/null 2>&1; then \
+ install-info --dir-file="$(DESTDIR)$(infodir)/dir" \
+ "$(DESTDIR)$(infodir)/foo.info"; \
+ else true; fi
+@end smallexample
+
+When writing the @code{install} target, you must classify all the
+commands into three categories: normal ones, @dfn{pre-installation}
+commands and @dfn{post-installation} commands. @xref{Install Command
+Categories}.
+
+@item install-html
+@itemx install-dvi
+@itemx install-pdf
+@itemx install-ps
+These targets install documentation in formats other than Info;
+they're intended to be called explicitly by the person installing the
+package, if that format is desired. GNU prefers Info files, so these
+must be installed by the @code{install} target.
+
+When you have many documentation files to install, we recommend that
+you avoid collisions and clutter by arranging for these targets to
+install in subdirectories of the appropriate installation directory,
+such as @code{htmldir}. As one example, if your package has multiple
+manuals, and you wish to install HTML documentation with many files
+(such as the ``split'' mode output by @code{makeinfo --html}), you'll
+certainly want to use subdirectories, or two nodes with the same name
+in different manuals will overwrite each other.
+
+Please make these @code{install-@var{format}} targets invoke the
+commands for the @var{format} target, for example, by making
+@var{format} a dependency.
+
+@item uninstall
+Delete all the installed files---the copies that the @samp{install}
+and @samp{install-*} targets create.
+
+This rule should not modify the directories where compilation is done,
+only the directories where files are installed.
+
+The uninstallation commands are divided into three categories, just like
+the installation commands. @xref{Install Command Categories}.
+
+@item install-strip
+Like @code{install}, but strip the executable files while installing
+them. In simple cases, this target can use the @code{install} target in
+a simple way:
+
+@smallexample
+install-strip:
+ $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
+ install
+@end smallexample
+
+But if the package installs scripts as well as real executables, the
+@code{install-strip} target can't just refer to the @code{install}
+target; it has to strip the executables but not the scripts.
+
+@code{install-strip} should not strip the executables in the build
+directory which are being copied for installation. It should only strip
+the copies that are installed.
+
+Normally we do not recommend stripping an executable unless you are sure
+the program has no bugs. However, it can be reasonable to install a
+stripped executable for actual execution while saving the unstripped
+executable elsewhere in case there is a bug.
+
+@item clean
+Delete all files in the current directory that are normally created by
+building the program. Also delete files in other directories if they
+are created by this makefile. However, don't delete the files that
+record the configuration. Also preserve files that could be made by
+building, but normally aren't because the distribution comes with
+them. There is no need to delete parent directories that were created
+with @samp{mkdir -p}, since they could have existed anyway.
+
+Delete @file{.dvi} files here if they are not part of the distribution.
+
+@item distclean
+Delete all files in the current directory (or created by this
+makefile) that are created by configuring or building the program. If
+you have unpacked the source and built the program without creating
+any other files, @samp{make distclean} should leave only the files
+that were in the distribution. However, there is no need to delete
+parent directories that were created with @samp{mkdir -p}, since they
+could have existed anyway.
+
+@item mostlyclean
+Like @samp{clean}, but may refrain from deleting a few files that people
+normally don't want to recompile. For example, the @samp{mostlyclean}
+target for GCC does not delete @file{libgcc.a}, because recompiling it
+is rarely necessary and takes a lot of time.
+
+@item maintainer-clean
+Delete almost everything that can be reconstructed with this Makefile.
+This typically includes everything deleted by @code{distclean}, plus
+more: C source files produced by Bison, tags tables, Info files, and
+so on.
+
+The reason we say ``almost everything'' is that running the command
+@samp{make maintainer-clean} should not delete @file{configure} even
+if @file{configure} can be remade using a rule in the Makefile. More
+generally, @samp{make maintainer-clean} should not delete anything
+that needs to exist in order to run @file{configure} and then begin to
+build the program. Also, there is no need to delete parent
+directories that were created with @samp{mkdir -p}, since they could
+have existed anyway. These are the only exceptions;
+@code{maintainer-clean} should delete everything else that can be
+rebuilt.
+
+The @samp{maintainer-clean} target is intended to be used by a maintainer of
+the package, not by ordinary users. You may need special tools to
+reconstruct some of the files that @samp{make maintainer-clean} deletes.
+Since these files are normally included in the distribution, we don't
+take care to make them easy to reconstruct. If you find you need to
+unpack the full distribution again, don't blame us.
+
+To help make users aware of this, the commands for the special
+@code{maintainer-clean} target should start with these two:
+
+@smallexample
+@@echo 'This command is intended for maintainers to use; it'
+@@echo 'deletes files that may need special tools to rebuild.'
+@end smallexample
+
+@item TAGS
+Update a tags table for this program.
+@c ADR: how?
+
+@item info
+Generate any Info files needed. The best way to write the rules is as
+follows:
+
+@smallexample
+info: foo.info
+
+foo.info: foo.texi chap1.texi chap2.texi
+ $(MAKEINFO) $(srcdir)/foo.texi
+@end smallexample
+
+@noindent
+You must define the variable @code{MAKEINFO} in the Makefile. It should
+run the @code{makeinfo} program, which is part of the Texinfo
+distribution.
+
+Normally a GNU distribution comes with Info files, and that means the
+Info files are present in the source directory. Therefore, the Make
+rule for an info file should update it in the source directory. When
+users build the package, ordinarily Make will not update the Info files
+because they will already be up to date.
+
+@item dvi
+@itemx html
+@itemx pdf
+@itemx ps
+Generate documentation files in the given format. These targets
+should always exist, but any or all can be a no-op if the given output
+format cannot be generated. These targets should not be dependencies
+of the @code{all} target; the user must manually invoke them.
+
+Here's an example rule for generating DVI files from Texinfo:
+
+@smallexample
+dvi: foo.dvi
+
+foo.dvi: foo.texi chap1.texi chap2.texi
+ $(TEXI2DVI) $(srcdir)/foo.texi
+@end smallexample
+
+@noindent
+You must define the variable @code{TEXI2DVI} in the Makefile. It
+should run the program @code{texi2dvi}, which is part of the Texinfo
+distribution. (@code{texi2dvi} uses @TeX{} to do the real work of
+formatting. @TeX{} is not distributed with Texinfo.) Alternatively,
+write only the dependencies, and allow GNU @code{make} to provide the
+command.
+
+Here's another example, this one for generating HTML from Texinfo:
+
+@smallexample
+html: foo.html
+
+foo.html: foo.texi chap1.texi chap2.texi
+ $(TEXI2HTML) $(srcdir)/foo.texi
+@end smallexample
+
+@noindent
+Again, you would define the variable @code{TEXI2HTML} in the Makefile;
+for example, it might run @code{makeinfo --no-split --html}
+(@command{makeinfo} is part of the Texinfo distribution).
+
+@item dist
+Create a distribution tar file for this program. The tar file should be
+set up so that the file names in the tar file start with a subdirectory
+name which is the name of the package it is a distribution for. This
+name can include the version number.
+
+For example, the distribution tar file of GCC version 1.40 unpacks into
+a subdirectory named @file{gcc-1.40}.
+
+The easiest way to do this is to create a subdirectory appropriately
+named, use @code{ln} or @code{cp} to install the proper files in it, and
+then @code{tar} that subdirectory.
+
+Compress the tar file with @code{gzip}. For example, the actual
+distribution file for GCC version 1.40 is called @file{gcc-1.40.tar.gz}.
+It is ok to support other free compression formats as well.
+
+The @code{dist} target should explicitly depend on all non-source files
+that are in the distribution, to make sure they are up to date in the
+distribution.
+@ifset CODESTD
+@xref{Releases, , Making Releases}.
+@end ifset
+@ifclear CODESTD
+@xref{Releases, , Making Releases, standards, GNU Coding Standards}.
+@end ifclear
+
+@item check
+Perform self-tests (if any). The user must build the program before
+running the tests, but need not install the program; you should write
+the self-tests so that they work when the program is built but not
+installed.
+@end table
+
+The following targets are suggested as conventional names, for programs
+in which they are useful.
+
+@table @code
+@item installcheck
+Perform installation tests (if any). The user must build and install
+the program before running the tests. You should not assume that
+@file{$(bindir)} is in the search path.
+
+@item installdirs
+It's useful to add a target named @samp{installdirs} to create the
+directories where files are installed, and their parent directories.
+There is a script called @file{mkinstalldirs} which is convenient for
+this; you can find it in the Gnulib package.
+You can use a rule like this:
+
+@comment This has been carefully formatted to look decent in the Make manual.
+@comment Please be sure not to make it extend any further to the right.--roland
+@smallexample
+# Make sure all installation directories (e.g. $(bindir))
+# actually exist by making them if necessary.
+installdirs: mkinstalldirs
+ $(srcdir)/mkinstalldirs $(bindir) $(datadir) \
+ $(libdir) $(infodir) \
+ $(mandir)
+@end smallexample
+
+@noindent
+or, if you wish to support @env{DESTDIR} (strongly encouraged),
+
+@smallexample
+# Make sure all installation directories (e.g. $(bindir))
+# actually exist by making them if necessary.
+installdirs: mkinstalldirs
+ $(srcdir)/mkinstalldirs \
+ $(DESTDIR)$(bindir) $(DESTDIR)$(datadir) \
+ $(DESTDIR)$(libdir) $(DESTDIR)$(infodir) \
+ $(DESTDIR)$(mandir)
+@end smallexample
+
+This rule should not modify the directories where compilation is done.
+It should do nothing but create installation directories.
+@end table
+
+@node Install Command Categories
+@section Install Command Categories
+
+@cindex pre-installation commands
+@cindex post-installation commands
+When writing the @code{install} target, you must classify all the
+commands into three categories: normal ones, @dfn{pre-installation}
+commands and @dfn{post-installation} commands.
+
+Normal commands move files into their proper places, and set their
+modes. They may not alter any files except the ones that come entirely
+from the package they belong to.
+
+Pre-installation and post-installation commands may alter other files;
+in particular, they can edit global configuration files or data bases.
+
+Pre-installation commands are typically executed before the normal
+commands, and post-installation commands are typically run after the
+normal commands.
+
+The most common use for a post-installation command is to run
+@code{install-info}. This cannot be done with a normal command, since
+it alters a file (the Info directory) which does not come entirely and
+solely from the package being installed. It is a post-installation
+command because it needs to be done after the normal command which
+installs the package's Info files.
+
+Most programs don't need any pre-installation commands, but we have the
+feature just in case it is needed.
+
+To classify the commands in the @code{install} rule into these three
+categories, insert @dfn{category lines} among them. A category line
+specifies the category for the commands that follow.
+
+A category line consists of a tab and a reference to a special Make
+variable, plus an optional comment at the end. There are three
+variables you can use, one for each category; the variable name
+specifies the category. Category lines are no-ops in ordinary execution
+because these three Make variables are normally undefined (and you
+@emph{should not} define them in the makefile).
+
+Here are the three possible category lines, each with a comment that
+explains what it means:
+
+@smallexample
+ $(PRE_INSTALL) # @r{Pre-install commands follow.}
+ $(POST_INSTALL) # @r{Post-install commands follow.}
+ $(NORMAL_INSTALL) # @r{Normal commands follow.}
+@end smallexample
+
+If you don't use a category line at the beginning of the @code{install}
+rule, all the commands are classified as normal until the first category
+line. If you don't use any category lines, all the commands are
+classified as normal.
+
+These are the category lines for @code{uninstall}:
+
+@smallexample
+ $(PRE_UNINSTALL) # @r{Pre-uninstall commands follow.}
+ $(POST_UNINSTALL) # @r{Post-uninstall commands follow.}
+ $(NORMAL_UNINSTALL) # @r{Normal commands follow.}
+@end smallexample
+
+Typically, a pre-uninstall command would be used for deleting entries
+from the Info directory.
+
+If the @code{install} or @code{uninstall} target has any dependencies
+which act as subroutines of installation, then you should start
+@emph{each} dependency's commands with a category line, and start the
+main target's commands with a category line also. This way, you can
+ensure that each command is placed in the right category regardless of
+which of the dependencies actually run.
+
+Pre-installation and post-installation commands should not run any
+programs except for these:
+
+@example
+[ basename bash cat chgrp chmod chown cmp cp dd diff echo
+egrep expand expr false fgrep find getopt grep gunzip gzip
+hostname install install-info kill ldconfig ln ls md5sum
+mkdir mkfifo mknod mv printenv pwd rm rmdir sed sort tee
+test touch true uname xargs yes
+@end example
+
+@cindex binary packages
+The reason for distinguishing the commands in this way is for the sake
+of making binary packages. Typically a binary package contains all the
+executables and other files that need to be installed, and has its own
+method of installing them---so it does not need to run the normal
+installation commands. But installing the binary package does need to
+execute the pre-installation and post-installation commands.
+
+Programs to build binary packages work by extracting the
+pre-installation and post-installation commands. Here is one way of
+extracting the pre-installation commands (the @option{-s} option to
+@command{make} is needed to silence messages about entering
+subdirectories):
+
+@smallexample
+make -s -n install -o all \
+ PRE_INSTALL=pre-install \
+ POST_INSTALL=post-install \
+ NORMAL_INSTALL=normal-install \
+ | gawk -f pre-install.awk
+@end smallexample
+
+@noindent
+where the file @file{pre-install.awk} could contain this:
+
+@smallexample
+$0 ~ /^(normal-install|post-install)[ \t]*$/ @{on = 0@}
+on @{print $0@}
+$0 ~ /^pre-install[ \t]*$/ @{on = 1@}
+@end smallexample
diff --git a/doc/stamp-vti b/doc/stamp-vti
new file mode 100644
index 0000000..b9e94c9
--- /dev/null
+++ b/doc/stamp-vti
@@ -0,0 +1,4 @@
+@set UPDATED 24 April 2012
+@set UPDATED-MONTH April 2012
+@set EDITION 2.69
+@set VERSION 2.69
diff --git a/doc/standards.info b/doc/standards.info
new file mode 100644
index 0000000..d3e05b2
--- /dev/null
+++ b/doc/standards.info
@@ -0,0 +1,5780 @@
+This is standards.info, produced by makeinfo version 4.13 from
+standards.texi.
+
+INFO-DIR-SECTION GNU organization
+START-INFO-DIR-ENTRY
+* Standards: (standards). GNU coding standards.
+END-INFO-DIR-ENTRY
+
+ The GNU coding standards, last updated April 7, 2012.
+
+ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts. A copy of the license is included in the section entitled "GNU
+Free Documentation License".
+
+
+File: standards.info, Node: Top, Next: Preface, Up: (dir)
+
+GNU Coding Standards
+********************
+
+The GNU coding standards, last updated April 7, 2012.
+
+ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts. A copy of the license is included in the section entitled "GNU
+Free Documentation License".
+
+* Menu:
+
+* Preface:: About the GNU Coding Standards.
+* Legal Issues:: Keeping free software free.
+* Design Advice:: General program design.
+* Program Behavior:: Program behavior for all programs
+* Writing C:: Making the best use of C.
+* Documentation:: Documenting programs.
+* Managing Releases:: The release process.
+* References:: Mentioning non-free software or documentation.
+* GNU Free Documentation License:: Copying and sharing this manual.
+* Index::
+
+
+File: standards.info, Node: Preface, Next: Legal Issues, Prev: Top, Up: Top
+
+1 About the GNU Coding Standards
+********************************
+
+The GNU Coding Standards were written by Richard Stallman and other GNU
+Project volunteers. Their purpose is to make the GNU system clean,
+consistent, and easy to install. This document can also be read as a
+guide to writing portable, robust and reliable programs. It focuses on
+programs written in C, but many of the rules and principles are useful
+even if you write in another programming language. The rules often
+state reasons for writing in a certain way.
+
+ If you did not obtain this file directly from the GNU project and
+recently, please check for a newer version. You can get the GNU Coding
+Standards from the GNU web server in many different formats, including
+the Texinfo source, PDF, HTML, DVI, plain text, and more, at:
+`http://www.gnu.org/prep/standards/'.
+
+ If you are maintaining an official GNU package, in addition to this
+document, please read and follow the GNU maintainer information (*note
+Contents: (maintain)Top.).
+
+ If you want to receive diffs for every change to these GNU documents,
+join the mailing list `gnustandards-commit@gnu.org', via the web
+interface at
+`http://lists.gnu.org/mailman/listinfo/gnustandards-commit'. Archives
+are also available there.
+
+ Please send corrections or suggestions for this document to
+<bug-standards@gnu.org>. If you make a suggestion, please include a
+suggested new wording for it, to help us consider the suggestion
+efficiently. We prefer a context diff to the Texinfo source, but if
+that's difficult for you, you can make a context diff for some other
+version of this document, or propose it in any way that makes it clear.
+The source repository for this document can be found at
+`http://savannah.gnu.org/projects/gnustandards'.
+
+ These standards cover the minimum of what is important when writing a
+GNU package. Likely, the need for additional standards will come up.
+Sometimes, you might suggest that such standards be added to this
+document. If you think your standards would be generally useful, please
+do suggest them.
+
+ You should also set standards for your package on many questions not
+addressed or not firmly specified here. The most important point is to
+be self-consistent--try to stick to the conventions you pick, and try
+to document them as much as possible. That way, your program will be
+more maintainable by others.
+
+ The GNU Hello program serves as an example of how to follow the GNU
+coding standards for a trivial program.
+`http://www.gnu.org/software/hello/hello.html'.
+
+ This release of the GNU Coding Standards was last updated April 7,
+2012.
+
+
+File: standards.info, Node: Legal Issues, Next: Design Advice, Prev: Preface, Up: Top
+
+2 Keeping Free Software Free
+****************************
+
+This chapter discusses how you can make sure that GNU software avoids
+legal difficulties, and other related issues.
+
+* Menu:
+
+* Reading Non-Free Code:: Referring to proprietary programs.
+* Contributions:: Accepting contributions.
+* Trademarks:: How we deal with trademark issues.
+
+
+File: standards.info, Node: Reading Non-Free Code, Next: Contributions, Up: Legal Issues
+
+2.1 Referring to Proprietary Programs
+=====================================
+
+Don't in any circumstances refer to Unix source code for or during your
+work on GNU! (Or to any other proprietary programs.)
+
+ If you have a vague recollection of the internals of a Unix program,
+this does not absolutely mean you can't write an imitation of it, but
+do try to organize the imitation internally along different lines,
+because this is likely to make the details of the Unix version
+irrelevant and dissimilar to your results.
+
+ For example, Unix utilities were generally optimized to minimize
+memory use; if you go for speed instead, your program will be very
+different. You could keep the entire input file in memory and scan it
+there instead of using stdio. Use a smarter algorithm discovered more
+recently than the Unix program. Eliminate use of temporary files. Do
+it in one pass instead of two (we did this in the assembler).
+
+ Or, on the contrary, emphasize simplicity instead of speed. For some
+applications, the speed of today's computers makes simpler algorithms
+adequate.
+
+ Or go for generality. For example, Unix programs often have static
+tables or fixed-size strings, which make for arbitrary limits; use
+dynamic allocation instead. Make sure your program handles NULs and
+other funny characters in the input files. Add a programming language
+for extensibility and write part of the program in that language.
+
+ Or turn some parts of the program into independently usable
+libraries. Or use a simple garbage collector instead of tracking
+precisely when to free memory, or use a new GNU facility such as
+obstacks.
+
+
+File: standards.info, Node: Contributions, Next: Trademarks, Prev: Reading Non-Free Code, Up: Legal Issues
+
+2.2 Accepting Contributions
+===========================
+
+If the program you are working on is copyrighted by the Free Software
+Foundation, then when someone else sends you a piece of code to add to
+the program, we need legal papers to use it--just as we asked you to
+sign papers initially. _Each_ person who makes a nontrivial
+contribution to a program must sign some sort of legal papers in order
+for us to have clear title to the program; the main author alone is not
+enough.
+
+ So, before adding in any contributions from other people, please tell
+us, so we can arrange to get the papers. Then wait until we tell you
+that we have received the signed papers, before you actually use the
+contribution.
+
+ This applies both before you release the program and afterward. If
+you receive diffs to fix a bug, and they make significant changes, we
+need legal papers for that change.
+
+ This also applies to comments and documentation files. For copyright
+law, comments and code are just text. Copyright applies to all kinds of
+text, so we need legal papers for all kinds.
+
+ We know it is frustrating to ask for legal papers; it's frustrating
+for us as well. But if you don't wait, you are going out on a limb--for
+example, what if the contributor's employer won't sign a disclaimer?
+You might have to take that code out again!
+
+ You don't need papers for changes of a few lines here or there, since
+they are not significant for copyright purposes. Also, you don't need
+papers if all you get from the suggestion is some ideas, not actual code
+which you use. For example, if someone sent you one implementation, but
+you write a different implementation of the same idea, you don't need to
+get papers.
+
+ The very worst thing is if you forget to tell us about the other
+contributor. We could be very embarrassed in court some day as a
+result.
+
+ We have more detailed advice for maintainers of GNU packages. If you
+have reached the stage of maintaining a GNU program (whether released
+or not), please take a look: *note Legal Matters: (maintain)Legal
+Matters.
+
+
+File: standards.info, Node: Trademarks, Prev: Contributions, Up: Legal Issues
+
+2.3 Trademarks
+==============
+
+Please do not include any trademark acknowledgements in GNU software
+packages or documentation.
+
+ Trademark acknowledgements are the statements that such-and-such is a
+trademark of so-and-so. The GNU Project has no objection to the basic
+idea of trademarks, but these acknowledgements feel like kowtowing, and
+there is no legal requirement for them, so we don't use them.
+
+ What is legally required, as regards other people's trademarks, is to
+avoid using them in ways which a reader might reasonably understand as
+naming or labeling our own programs or activities. For example, since
+"Objective C" is (or at least was) a trademark, we made sure to say
+that we provide a "compiler for the Objective C language" rather than
+an "Objective C compiler". The latter would have been meant as a
+shorter way of saying the former, but it does not explicitly state the
+relationship, so it could be misinterpreted as using "Objective C" as a
+label for the compiler rather than for the language.
+
+ Please don't use "win" as an abbreviation for Microsoft Windows in
+GNU software or documentation. In hacker terminology, calling
+something a "win" is a form of praise. If you wish to praise Microsoft
+Windows when speaking on your own, by all means do so, but not in GNU
+software. Usually we write the name "Windows" in full, but when
+brevity is very important (as in file names and sometimes symbol
+names), we abbreviate it to "w". For instance, the files and functions
+in Emacs that deal with Windows start with `w32'.
+
+
+File: standards.info, Node: Design Advice, Next: Program Behavior, Prev: Legal Issues, Up: Top
+
+3 General Program Design
+************************
+
+This chapter discusses some of the issues you should take into account
+when designing your program.
+
+* Menu:
+
+* Source Language:: Which languages to use.
+* Compatibility:: Compatibility with other implementations.
+* Using Extensions:: Using non-standard features.
+* Standard C:: Using standard C features.
+* Conditional Compilation:: Compiling code only if a conditional is true.
+
+
+File: standards.info, Node: Source Language, Next: Compatibility, Up: Design Advice
+
+3.1 Which Languages to Use
+==========================
+
+When you want to use a language that gets compiled and runs at high
+speed, the best language to use is C. Using another language is like
+using a non-standard feature: it will cause trouble for users. Even if
+GCC supports the other language, users may find it inconvenient to have
+to install the compiler for that other language in order to build your
+program. For example, if you write your program in C++, people will
+have to install the GNU C++ compiler in order to compile your program.
+
+ C has one other advantage over C++ and other compiled languages: more
+people know C, so more people will find it easy to read and modify the
+program if it is written in C.
+
+ So in general it is much better to use C, rather than the comparable
+alternatives.
+
+ But there are two exceptions to that conclusion:
+
+ * It is no problem to use another language to write a tool
+ specifically intended for use with that language. That is because
+ the only people who want to build the tool will be those who have
+ installed the other language anyway.
+
+ * If an application is of interest only to a narrow part of the
+ community, then the question of which language it is written in
+ has less effect on other people, so you may as well please
+ yourself.
+
+ Many programs are designed to be extensible: they include an
+interpreter for a language that is higher level than C. Often much of
+the program is written in that language, too. The Emacs editor
+pioneered this technique.
+
+ The standard extensibility interpreter for GNU software is Guile
+(`http://www.gnu.org/software/guile/'), which implements the language
+Scheme (an especially clean and simple dialect of Lisp). Guile also
+includes bindings for GTK+/GNOME, making it practical to write modern
+GUI functionality within Guile. We don't reject programs written in
+other "scripting languages" such as Perl and Python, but using Guile is
+very important for the overall consistency of the GNU system.
+
+
+File: standards.info, Node: Compatibility, Next: Using Extensions, Prev: Source Language, Up: Design Advice
+
+3.2 Compatibility with Other Implementations
+============================================
+
+With occasional exceptions, utility programs and libraries for GNU
+should be upward compatible with those in Berkeley Unix, and upward
+compatible with Standard C if Standard C specifies their behavior, and
+upward compatible with POSIX if POSIX specifies their behavior.
+
+ When these standards conflict, it is useful to offer compatibility
+modes for each of them.
+
+ Standard C and POSIX prohibit many kinds of extensions. Feel free
+to make the extensions anyway, and include a `--ansi', `--posix', or
+`--compatible' option to turn them off. However, if the extension has
+a significant chance of breaking any real programs or scripts, then it
+is not really upward compatible. So you should try to redesign its
+interface to make it upward compatible.
+
+ Many GNU programs suppress extensions that conflict with POSIX if the
+environment variable `POSIXLY_CORRECT' is defined (even if it is
+defined with a null value). Please make your program recognize this
+variable if appropriate.
+
+ When a feature is used only by users (not by programs or command
+files), and it is done poorly in Unix, feel free to replace it
+completely with something totally different and better. (For example,
+`vi' is replaced with Emacs.) But it is nice to offer a compatible
+feature as well. (There is a free `vi' clone, so we offer it.)
+
+ Additional useful features are welcome regardless of whether there
+is any precedent for them.
+
+
+File: standards.info, Node: Using Extensions, Next: Standard C, Prev: Compatibility, Up: Design Advice
+
+3.3 Using Non-standard Features
+===============================
+
+Many GNU facilities that already exist support a number of convenient
+extensions over the comparable Unix facilities. Whether to use these
+extensions in implementing your program is a difficult question.
+
+ On the one hand, using the extensions can make a cleaner program.
+On the other hand, people will not be able to build the program unless
+the other GNU tools are available. This might cause the program to
+work on fewer kinds of machines.
+
+ With some extensions, it might be easy to provide both alternatives.
+For example, you can define functions with a "keyword" `INLINE' and
+define that as a macro to expand into either `inline' or nothing,
+depending on the compiler.
+
+ In general, perhaps it is best not to use the extensions if you can
+straightforwardly do without them, but to use the extensions if they
+are a big improvement.
+
+ An exception to this rule are the large, established programs (such
+as Emacs) which run on a great variety of systems. Using GNU
+extensions in such programs would make many users unhappy, so we don't
+do that.
+
+ Another exception is for programs that are used as part of
+compilation: anything that must be compiled with other compilers in
+order to bootstrap the GNU compilation facilities. If these require
+the GNU compiler, then no one can compile them without having them
+installed already. That would be extremely troublesome in certain
+cases.
+
+
+File: standards.info, Node: Standard C, Next: Conditional Compilation, Prev: Using Extensions, Up: Design Advice
+
+3.4 Standard C and Pre-Standard C
+=================================
+
+1989 Standard C is widespread enough now that it is ok to use its
+features in new programs. There is one exception: do not ever use the
+"trigraph" feature of Standard C.
+
+ 1999 Standard C is not widespread yet, so please do not require its
+features in programs. It is ok to use its features if they are present.
+
+ However, it is easy to support pre-standard compilers in most
+programs, so if you know how to do that, feel free. If a program you
+are maintaining has such support, you should try to keep it working.
+
+ To support pre-standard C, instead of writing function definitions in
+standard prototype form,
+
+ int
+ foo (int x, int y)
+ ...
+
+write the definition in pre-standard style like this,
+
+ int
+ foo (x, y)
+ int x, y;
+ ...
+
+and use a separate declaration to specify the argument prototype:
+
+ int foo (int, int);
+
+ You need such a declaration anyway, in a header file, to get the
+benefit of prototypes in all the files where the function is called.
+And once you have the declaration, you normally lose nothing by writing
+the function definition in the pre-standard style.
+
+ This technique does not work for integer types narrower than `int'.
+If you think of an argument as being of a type narrower than `int',
+declare it as `int' instead.
+
+ There are a few special cases where this technique is hard to use.
+For example, if a function argument needs to hold the system type
+`dev_t', you run into trouble, because `dev_t' is shorter than `int' on
+some machines; but you cannot use `int' instead, because `dev_t' is
+wider than `int' on some machines. There is no type you can safely use
+on all machines in a non-standard definition. The only way to support
+non-standard C and pass such an argument is to check the width of
+`dev_t' using Autoconf and choose the argument type accordingly. This
+may not be worth the trouble.
+
+ In order to support pre-standard compilers that do not recognize
+prototypes, you may want to use a preprocessor macro like this:
+
+ /* Declare the prototype for a general external function. */
+ #if defined (__STDC__) || defined (WINDOWSNT)
+ #define P_(proto) proto
+ #else
+ #define P_(proto) ()
+ #endif
+
+
+File: standards.info, Node: Conditional Compilation, Prev: Standard C, Up: Design Advice
+
+3.5 Conditional Compilation
+===========================
+
+When supporting configuration options already known when building your
+program we prefer using `if (... )' over conditional compilation, as in
+the former case the compiler is able to perform more extensive checking
+of all possible code paths.
+
+ For example, please write
+
+ if (HAS_FOO)
+ ...
+ else
+ ...
+
+instead of:
+
+ #ifdef HAS_FOO
+ ...
+ #else
+ ...
+ #endif
+
+ A modern compiler such as GCC will generate exactly the same code in
+both cases, and we have been using similar techniques with good success
+in several projects. Of course, the former method assumes that
+`HAS_FOO' is defined as either 0 or 1.
+
+ While this is not a silver bullet solving all portability problems,
+and is not always appropriate, following this policy would have saved
+GCC developers many hours, or even days, per year.
+
+ In the case of function-like macros like `REVERSIBLE_CC_MODE' in GCC
+which cannot be simply used in `if (...)' statements, there is an easy
+workaround. Simply introduce another macro `HAS_REVERSIBLE_CC_MODE' as
+in the following example:
+
+ #ifdef REVERSIBLE_CC_MODE
+ #define HAS_REVERSIBLE_CC_MODE 1
+ #else
+ #define HAS_REVERSIBLE_CC_MODE 0
+ #endif
+
+
+File: standards.info, Node: Program Behavior, Next: Writing C, Prev: Design Advice, Up: Top
+
+4 Program Behavior for All Programs
+***********************************
+
+This chapter describes conventions for writing robust software. It
+also describes general standards for error messages, the command line
+interface, and how libraries should behave.
+
+* Menu:
+
+* Non-GNU Standards:: We consider standards such as POSIX;
+ we don't "obey" them.
+* Semantics:: Writing robust programs.
+* Libraries:: Library behavior.
+* Errors:: Formatting error messages.
+* User Interfaces:: Standards about interfaces generally.
+* Graphical Interfaces:: Standards for graphical interfaces.
+* Command-Line Interfaces:: Standards for command line interfaces.
+* Dynamic Plug-In Interfaces:: Standards for dynamic plug-in interfaces.
+* Option Table:: Table of long options.
+* OID Allocations:: Table of OID slots for GNU.
+* Memory Usage:: When and how to care about memory needs.
+* File Usage:: Which files to use, and where.
+
+
+File: standards.info, Node: Non-GNU Standards, Next: Semantics, Up: Program Behavior
+
+4.1 Non-GNU Standards
+=====================
+
+The GNU Project regards standards published by other organizations as
+suggestions, not orders. We consider those standards, but we do not
+"obey" them. In developing a GNU program, you should implement an
+outside standard's specifications when that makes the GNU system better
+overall in an objective sense. When it doesn't, you shouldn't.
+
+ In most cases, following published standards is convenient for
+users--it means that their programs or scripts will work more portably.
+For instance, GCC implements nearly all the features of Standard C as
+specified by that standard. C program developers would be unhappy if
+it did not. And GNU utilities mostly follow specifications of POSIX.2;
+shell script writers and users would be unhappy if our programs were
+incompatible.
+
+ But we do not follow either of these specifications rigidly, and
+there are specific points on which we decided not to follow them, so as
+to make the GNU system better for users.
+
+ For instance, Standard C says that nearly all extensions to C are
+prohibited. How silly! GCC implements many extensions, some of which
+were later adopted as part of the standard. If you want these
+constructs to give an error message as "required" by the standard, you
+must specify `--pedantic', which was implemented only so that we can
+say "GCC is a 100% implementation of the standard", not because there
+is any reason to actually use it.
+
+ POSIX.2 specifies that `df' and `du' must output sizes by default in
+units of 512 bytes. What users want is units of 1k, so that is what we
+do by default. If you want the ridiculous behavior "required" by
+POSIX, you must set the environment variable `POSIXLY_CORRECT' (which
+was originally going to be named `POSIX_ME_HARDER').
+
+ GNU utilities also depart from the letter of the POSIX.2
+specification when they support long-named command-line options, and
+intermixing options with ordinary arguments. This minor
+incompatibility with POSIX is never a problem in practice, and it is
+very useful.
+
+ In particular, don't reject a new feature, or remove an old one,
+merely because a standard says it is "forbidden" or "deprecated".
+
+
+File: standards.info, Node: Semantics, Next: Libraries, Prev: Non-GNU Standards, Up: Program Behavior
+
+4.2 Writing Robust Programs
+===========================
+
+Avoid arbitrary limits on the length or number of _any_ data structure,
+including file names, lines, files, and symbols, by allocating all data
+structures dynamically. In most Unix utilities, "long lines are
+silently truncated". This is not acceptable in a GNU utility.
+
+ Utilities reading files should not drop NUL characters, or any other
+nonprinting characters _including those with codes above 0177_. The
+only sensible exceptions would be utilities specifically intended for
+interface to certain types of terminals or printers that can't handle
+those characters. Whenever possible, try to make programs work
+properly with sequences of bytes that represent multibyte characters;
+UTF-8 is the most important.
+
+ Check every system call for an error return, unless you know you wish
+to ignore errors. Include the system error text (from `perror',
+`strerror', or equivalent) in _every_ error message resulting from a
+failing system call, as well as the name of the file if any and the
+name of the utility. Just "cannot open foo.c" or "stat failed" is not
+sufficient.
+
+ Check every call to `malloc' or `realloc' to see if it returned
+zero. Check `realloc' even if you are making the block smaller; in a
+system that rounds block sizes to a power of 2, `realloc' may get a
+different block if you ask for less space.
+
+ In Unix, `realloc' can destroy the storage block if it returns zero.
+GNU `realloc' does not have this bug: if it fails, the original block
+is unchanged. Feel free to assume the bug is fixed. If you wish to
+run your program on Unix, and wish to avoid lossage in this case, you
+can use the GNU `malloc'.
+
+ You must expect `free' to alter the contents of the block that was
+freed. Anything you want to fetch from the block, you must fetch before
+calling `free'.
+
+ If `malloc' fails in a noninteractive program, make that a fatal
+error. In an interactive program (one that reads commands from the
+user), it is better to abort the command and return to the command
+reader loop. This allows the user to kill other processes to free up
+virtual memory, and then try the command again.
+
+ Use `getopt_long' to decode arguments, unless the argument syntax
+makes this unreasonable.
+
+ When static storage is to be written in during program execution, use
+explicit C code to initialize it. Reserve C initialized declarations
+for data that will not be changed.
+
+ Try to avoid low-level interfaces to obscure Unix data structures
+(such as file directories, utmp, or the layout of kernel memory), since
+these are less likely to work compatibly. If you need to find all the
+files in a directory, use `readdir' or some other high-level interface.
+These are supported compatibly by GNU.
+
+ The preferred signal handling facilities are the BSD variant of
+`signal', and the POSIX `sigaction' function; the alternative USG
+`signal' interface is an inferior design.
+
+ Nowadays, using the POSIX signal functions may be the easiest way to
+make a program portable. If you use `signal', then on GNU/Linux
+systems running GNU libc version 1, you should include `bsd/signal.h'
+instead of `signal.h', so as to get BSD behavior. It is up to you
+whether to support systems where `signal' has only the USG behavior, or
+give up on them.
+
+ In error checks that detect "impossible" conditions, just abort.
+There is usually no point in printing any message. These checks
+indicate the existence of bugs. Whoever wants to fix the bugs will have
+to read the source code and run a debugger. So explain the problem with
+comments in the source. The relevant data will be in variables, which
+are easy to examine with the debugger, so there is no point moving them
+elsewhere.
+
+ Do not use a count of errors as the exit status for a program.
+_That does not work_, because exit status values are limited to 8 bits
+(0 through 255). A single run of the program might have 256 errors; if
+you try to return 256 as the exit status, the parent process will see 0
+as the status, and it will appear that the program succeeded.
+
+ If you make temporary files, check the `TMPDIR' environment
+variable; if that variable is defined, use the specified directory
+instead of `/tmp'.
+
+ In addition, be aware that there is a possible security problem when
+creating temporary files in world-writable directories. In C, you can
+avoid this problem by creating temporary files in this manner:
+
+ fd = open (filename, O_WRONLY | O_CREAT | O_EXCL, 0600);
+
+or by using the `mkstemps' function from Gnulib (*note mkstemps:
+(gnulib)mkstemps.).
+
+ In bash, use `set -C' (long name `noclobber') to avoid this problem.
+In addition, the `mktemp' utility is a more general solution for
+creating temporary files from shell scripts (*note mktemp invocation:
+(coreutils)mktemp invocation.).
+
+
+File: standards.info, Node: Libraries, Next: Errors, Prev: Semantics, Up: Program Behavior
+
+4.3 Library Behavior
+====================
+
+Try to make library functions reentrant. If they need to do dynamic
+storage allocation, at least try to avoid any nonreentrancy aside from
+that of `malloc' itself.
+
+ Here are certain name conventions for libraries, to avoid name
+conflicts.
+
+ Choose a name prefix for the library, more than two characters long.
+All external function and variable names should start with this prefix.
+In addition, there should only be one of these in any given library
+member. This usually means putting each one in a separate source file.
+
+ An exception can be made when two external symbols are always used
+together, so that no reasonable program could use one without the
+other; then they can both go in the same file.
+
+ External symbols that are not documented entry points for the user
+should have names beginning with `_'. The `_' should be followed by
+the chosen name prefix for the library, to prevent collisions with
+other libraries. These can go in the same files with user entry points
+if you like.
+
+ Static functions and variables can be used as you like and need not
+fit any naming convention.
+
+
+File: standards.info, Node: Errors, Next: User Interfaces, Prev: Libraries, Up: Program Behavior
+
+4.4 Formatting Error Messages
+=============================
+
+Error messages from compilers should look like this:
+
+ SOURCEFILE:LINENO: MESSAGE
+
+If you want to mention the column number, use one of these formats:
+
+ SOURCEFILE:LINENO:COLUMN: MESSAGE
+ SOURCEFILE:LINENO.COLUMN: MESSAGE
+
+Line numbers should start from 1 at the beginning of the file, and
+column numbers should start from 1 at the beginning of the line. (Both
+of these conventions are chosen for compatibility.) Calculate column
+numbers assuming that space and all ASCII printing characters have
+equal width, and assuming tab stops every 8 columns. For non-ASCII
+characters, Unicode character widths should be used when in a UTF-8
+locale; GNU libc and GNU gnulib provide suitable `wcwidth' functions.
+
+ The error message can also give both the starting and ending
+positions of the erroneous text. There are several formats so that you
+can avoid redundant information such as a duplicate line number. Here
+are the possible formats:
+
+ SOURCEFILE:LINE1.COLUMN1-LINE2.COLUMN2: MESSAGE
+ SOURCEFILE:LINE1.COLUMN1-COLUMN2: MESSAGE
+ SOURCEFILE:LINE1-LINE2: MESSAGE
+
+When an error is spread over several files, you can use this format:
+
+ FILE1:LINE1.COLUMN1-FILE2:LINE2.COLUMN2: MESSAGE
+
+ Error messages from other noninteractive programs should look like
+this:
+
+ PROGRAM:SOURCEFILE:LINENO: MESSAGE
+
+when there is an appropriate source file, or like this:
+
+ PROGRAM: MESSAGE
+
+when there is no relevant source file.
+
+ If you want to mention the column number, use this format:
+
+ PROGRAM:SOURCEFILE:LINENO:COLUMN: MESSAGE
+
+ In an interactive program (one that is reading commands from a
+terminal), it is better not to include the program name in an error
+message. The place to indicate which program is running is in the
+prompt or with the screen layout. (When the same program runs with
+input from a source other than a terminal, it is not interactive and
+would do best to print error messages using the noninteractive style.)
+
+ The string MESSAGE should not begin with a capital letter when it
+follows a program name and/or file name, because that isn't the
+beginning of a sentence. (The sentence conceptually starts at the
+beginning of the line.) Also, it should not end with a period.
+
+ Error messages from interactive programs, and other messages such as
+usage messages, should start with a capital letter. But they should not
+end with a period.
+
+
+File: standards.info, Node: User Interfaces, Next: Graphical Interfaces, Prev: Errors, Up: Program Behavior
+
+4.5 Standards for Interfaces Generally
+======================================
+
+Please don't make the behavior of a utility depend on the name used to
+invoke it. It is useful sometimes to make a link to a utility with a
+different name, and that should not change what it does.
+
+ Instead, use a run time option or a compilation switch or both to
+select among the alternate behaviors.
+
+ Likewise, please don't make the behavior of the program depend on the
+type of output device it is used with. Device independence is an
+important principle of the system's design; do not compromise it merely
+to save someone from typing an option now and then. (Variation in error
+message syntax when using a terminal is ok, because that is a side issue
+that people do not depend on.)
+
+ If you think one behavior is most useful when the output is to a
+terminal, and another is most useful when the output is a file or a
+pipe, then it is usually best to make the default behavior the one that
+is useful with output to a terminal, and have an option for the other
+behavior.
+
+ Compatibility requires certain programs to depend on the type of
+output device. It would be disastrous if `ls' or `sh' did not do so in
+the way all users expect. In some of these cases, we supplement the
+program with a preferred alternate version that does not depend on the
+output device type. For example, we provide a `dir' program much like
+`ls' except that its default output format is always multi-column
+format.
+
+
+File: standards.info, Node: Graphical Interfaces, Next: Command-Line Interfaces, Prev: User Interfaces, Up: Program Behavior
+
+4.6 Standards for Graphical Interfaces
+======================================
+
+When you write a program that provides a graphical user interface,
+please make it work with the X Window System and the GTK+ toolkit
+unless the functionality specifically requires some alternative (for
+example, "displaying jpeg images while in console mode").
+
+ In addition, please provide a command-line interface to control the
+functionality. (In many cases, the graphical user interface can be a
+separate program which invokes the command-line program.) This is so
+that the same jobs can be done from scripts.
+
+ Please also consider providing a D-bus interface for use from other
+running programs, such as within GNOME. (GNOME used to use CORBA for
+this, but that is being phased out.) In addition, consider providing a
+library interface (for use from C), and perhaps a keyboard-driven
+console interface (for use by users from console mode). Once you are
+doing the work to provide the functionality and the graphical
+interface, these won't be much extra work.
+
+
+File: standards.info, Node: Command-Line Interfaces, Next: Dynamic Plug-In Interfaces, Prev: Graphical Interfaces, Up: Program Behavior
+
+4.7 Standards for Command Line Interfaces
+=========================================
+
+It is a good idea to follow the POSIX guidelines for the command-line
+options of a program. The easiest way to do this is to use `getopt' to
+parse them. Note that the GNU version of `getopt' will normally permit
+options anywhere among the arguments unless the special argument `--'
+is used. This is not what POSIX specifies; it is a GNU extension.
+
+ Please define long-named options that are equivalent to the
+single-letter Unix-style options. We hope to make GNU more user
+friendly this way. This is easy to do with the GNU function
+`getopt_long'.
+
+ One of the advantages of long-named options is that they can be
+consistent from program to program. For example, users should be able
+to expect the "verbose" option of any GNU program which has one, to be
+spelled precisely `--verbose'. To achieve this uniformity, look at the
+table of common long-option names when you choose the option names for
+your program (*note Option Table::).
+
+ It is usually a good idea for file names given as ordinary arguments
+to be input files only; any output files would be specified using
+options (preferably `-o' or `--output'). Even if you allow an output
+file name as an ordinary argument for compatibility, try to provide an
+option as another way to specify it. This will lead to more consistency
+among GNU utilities, and fewer idiosyncrasies for users to remember.
+
+ All programs should support two standard options: `--version' and
+`--help'. CGI programs should accept these as command-line options,
+and also if given as the `PATH_INFO'; for instance, visiting
+`http://example.org/p.cgi/--help' in a browser should output the same
+information as invoking `p.cgi --help' from the command line.
+
+* Menu:
+
+* --version:: The standard output for --version.
+* --help:: The standard output for --help.
+
+
+File: standards.info, Node: --version, Next: --help, Up: Command-Line Interfaces
+
+4.7.1 `--version'
+-----------------
+
+The standard `--version' option should direct the program to print
+information about its name, version, origin and legal status, all on
+standard output, and then exit successfully. Other options and
+arguments should be ignored once this is seen, and the program should
+not perform its normal function.
+
+ The first line is meant to be easy for a program to parse; the
+version number proper starts after the last space. In addition, it
+contains the canonical name for this program, in this format:
+
+ GNU Emacs 19.30
+
+The program's name should be a constant string; _don't_ compute it from
+`argv[0]'. The idea is to state the standard or canonical name for the
+program, not its file name. There are other ways to find out the
+precise file name where a command is found in `PATH'.
+
+ If the program is a subsidiary part of a larger package, mention the
+package name in parentheses, like this:
+
+ emacsserver (GNU Emacs) 19.30
+
+If the package has a version number which is different from this
+program's version number, you can mention the package version number
+just before the close-parenthesis.
+
+ If you _need_ to mention the version numbers of libraries which are
+distributed separately from the package which contains this program,
+you can do so by printing an additional line of version info for each
+library you want to mention. Use the same format for these lines as for
+the first line.
+
+ Please do not mention all of the libraries that the program uses
+"just for completeness"--that would produce a lot of unhelpful clutter.
+Please mention library version numbers only if you find in practice that
+they are very important to you in debugging.
+
+ The following line, after the version number line or lines, should
+be a copyright notice. If more than one copyright notice is called
+for, put each on a separate line.
+
+ Next should follow a line stating the license, preferably using one
+of abbreviations below, and a brief statement that the program is free
+software, and that users are free to copy and change it. Also mention
+that there is no warranty, to the extent permitted by law. See
+recommended wording below.
+
+ It is ok to finish the output with a list of the major authors of the
+program, as a way of giving credit.
+
+ Here's an example of output that follows these rules:
+
+ GNU hello 2.3
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+ This is free software: you are free to change and redistribute it.
+ There is NO WARRANTY, to the extent permitted by law.
+
+ You should adapt this to your program, of course, filling in the
+proper year, copyright holder, name of program, and the references to
+distribution terms, and changing the rest of the wording as necessary.
+
+ This copyright notice only needs to mention the most recent year in
+which changes were made--there's no need to list the years for previous
+versions' changes. You don't have to mention the name of the program in
+these notices, if that is inconvenient, since it appeared in the first
+line. (The rules are different for copyright notices in source files;
+*note Copyright Notices: (maintain)Copyright Notices.)
+
+ Translations of the above lines must preserve the validity of the
+copyright notices (*note Internationalization::). If the translation's
+character set supports it, the `(C)' should be replaced with the
+copyright symbol, as follows:
+
+ (the official copyright symbol, which is the letter C in a circle);
+
+ Write the word "Copyright" exactly like that, in English. Do not
+translate it into another language. International treaties recognize
+the English word "Copyright"; translations into other languages do not
+have legal significance.
+
+ Finally, here is the table of our suggested license abbreviations.
+Any abbreviation can be followed by `vVERSION[+]', meaning that
+particular version, or later versions with the `+', as shown above.
+
+ In the case of exceptions for extra permissions with the GPL, we use
+`/' for a separator; the version number can follow the license
+abbreviation as usual, as in the examples below.
+
+GPL
+ GNU General Public License, `http://www.gnu.org/licenses/gpl.html'.
+
+LGPL
+ GNU Lesser General Public License,
+ `http://www.gnu.org/licenses/lgpl.html'.
+
+GPL/Ada
+ GNU GPL with the exception for Ada.
+
+Apache
+ The Apache Software Foundation license,
+ `http://www.apache.org/licenses'.
+
+Artistic
+ The Artistic license used for Perl,
+ `http://www.perlfoundation.org/legal'.
+
+Expat
+ The Expat license, `http://www.jclark.com/xml/copying.txt'.
+
+MPL
+ The Mozilla Public License, `http://www.mozilla.org/MPL/'.
+
+OBSD
+ The original (4-clause) BSD license, incompatible with the GNU GPL
+ `http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6'.
+
+PHP
+ The license used for PHP, `http://www.php.net/license/'.
+
+public domain
+ The non-license that is being in the public domain,
+ `http://www.gnu.org/licenses/license-list.html#PublicDomain'.
+
+Python
+ The license for Python, `http://www.python.org/2.0.1/license.html'.
+
+RBSD
+ The revised (3-clause) BSD, compatible with the GNU GPL,
+ `http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5'.
+
+X11
+ The simple non-copyleft license used for most versions of the X
+ Window System, `http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3'.
+
+Zlib
+ The license for Zlib, `http://www.gzip.org/zlib/zlib_license.html'.
+
+
+ More information about these licenses and many more are on the GNU
+licensing web pages, `http://www.gnu.org/licenses/license-list.html'.
+
+
+File: standards.info, Node: --help, Prev: --version, Up: Command-Line Interfaces
+
+4.7.2 `--help'
+--------------
+
+The standard `--help' option should output brief documentation for how
+to invoke the program, on standard output, then exit successfully.
+Other options and arguments should be ignored once this is seen, and
+the program should not perform its normal function.
+
+ Near the end of the `--help' option's output, please place lines
+giving the email address for bug reports, the package's home page
+(normally <http://www.gnu.org/software/PKG>, and the general page for
+help using GNU programs. The format should be like this:
+
+ Report bugs to: MAILING-ADDRESS
+ PKG home page: <http://www.gnu.org/software/PKG/>
+ General help using GNU software: <http://www.gnu.org/gethelp/>
+
+ It is ok to mention other appropriate mailing lists and web pages.
+
+
+File: standards.info, Node: Dynamic Plug-In Interfaces, Next: Option Table, Prev: Command-Line Interfaces, Up: Program Behavior
+
+4.8 Standards for Dynamic Plug-in Interfaces
+============================================
+
+Another aspect of keeping free programs free is encouraging development
+of free plug-ins, and discouraging development of proprietary plug-ins.
+Many GNU programs will not have anything like plug-ins at all, but
+those that do should follow these practices.
+
+ First, the general plug-in architecture design should closely tie the
+plug-in to the original code, such that the plug-in and the base
+program are parts of one extended program. For GCC, for example,
+plug-ins receive and modify GCC's internal data structures, and so
+clearly form an extended program with the base GCC.
+
+ Second, you should require plug-in developers to affirm that their
+plug-ins are released under an appropriate license. This should be
+enforced with a simple programmatic check. For GCC, again for example,
+a plug-in must define the global symbol `plugin_is_GPL_compatible',
+thus asserting that the plug-in is released under a GPL-compatible
+license (*note Plugins: (gccint)Plugins.).
+
+ By adding this check to your program you are not creating a new legal
+requirement. The GPL itself requires plug-ins to be free software,
+licensed compatibly. As long as you have followed the first rule above
+to keep plug-ins closely tied to your original program, the GPL and AGPL
+already require those plug-ins to be released under a compatible
+license. The symbol definition in the plug-in--or whatever equivalent
+works best in your program--makes it harder for anyone who might
+distribute proprietary plug-ins to legally defend themselves. If a case
+about this got to court, we can point to that symbol as evidence that
+the plug-in developer understood that the license had this requirement.
+
+
+File: standards.info, Node: Option Table, Next: OID Allocations, Prev: Dynamic Plug-In Interfaces, Up: Program Behavior
+
+4.9 Table of Long Options
+=========================
+
+Here is a table of long options used by GNU programs. It is surely
+incomplete, but we aim to list all the options that a new program might
+want to be compatible with. If you use names not already in the table,
+please send <bug-standards@gnu.org> a list of them, with their
+meanings, so we can update the table.
+
+`after-date'
+ `-N' in `tar'.
+
+`all'
+ `-a' in `du', `ls', `nm', `stty', `uname', and `unexpand'.
+
+`all-text'
+ `-a' in `diff'.
+
+`almost-all'
+ `-A' in `ls'.
+
+`append'
+ `-a' in `etags', `tee', `time'; `-r' in `tar'.
+
+`archive'
+ `-a' in `cp'.
+
+`archive-name'
+ `-n' in `shar'.
+
+`arglength'
+ `-l' in `m4'.
+
+`ascii'
+ `-a' in `diff'.
+
+`assign'
+ `-v' in `gawk'.
+
+`assume-new'
+ `-W' in `make'.
+
+`assume-old'
+ `-o' in `make'.
+
+`auto-check'
+ `-a' in `recode'.
+
+`auto-pager'
+ `-a' in `wdiff'.
+
+`auto-reference'
+ `-A' in `ptx'.
+
+`avoid-wraps'
+ `-n' in `wdiff'.
+
+`background'
+ For server programs, run in the background.
+
+`backward-search'
+ `-B' in `ctags'.
+
+`basename'
+ `-f' in `shar'.
+
+`batch'
+ Used in GDB.
+
+`baud'
+ Used in GDB.
+
+`before'
+ `-b' in `tac'.
+
+`binary'
+ `-b' in `cpio' and `diff'.
+
+`bits-per-code'
+ `-b' in `shar'.
+
+`block-size'
+ Used in `cpio' and `tar'.
+
+`blocks'
+ `-b' in `head' and `tail'.
+
+`break-file'
+ `-b' in `ptx'.
+
+`brief'
+ Used in various programs to make output shorter.
+
+`bytes'
+ `-c' in `head', `split', and `tail'.
+
+`c++'
+ `-C' in `etags'.
+
+`catenate'
+ `-A' in `tar'.
+
+`cd'
+ Used in various programs to specify the directory to use.
+
+`changes'
+ `-c' in `chgrp' and `chown'.
+
+`classify'
+ `-F' in `ls'.
+
+`colons'
+ `-c' in `recode'.
+
+`command'
+ `-c' in `su'; `-x' in GDB.
+
+`compare'
+ `-d' in `tar'.
+
+`compat'
+ Used in `gawk'.
+
+`compress'
+ `-Z' in `tar' and `shar'.
+
+`concatenate'
+ `-A' in `tar'.
+
+`confirmation'
+ `-w' in `tar'.
+
+`context'
+ Used in `diff'.
+
+`copyleft'
+ `-W copyleft' in `gawk'.
+
+`copyright'
+ `-C' in `ptx', `recode', and `wdiff'; `-W copyright' in `gawk'.
+
+`core'
+ Used in GDB.
+
+`count'
+ `-q' in `who'.
+
+`count-links'
+ `-l' in `du'.
+
+`create'
+ Used in `tar' and `cpio'.
+
+`cut-mark'
+ `-c' in `shar'.
+
+`cxref'
+ `-x' in `ctags'.
+
+`date'
+ `-d' in `touch'.
+
+`debug'
+ `-d' in `make' and `m4'; `-t' in Bison.
+
+`define'
+ `-D' in `m4'.
+
+`defines'
+ `-d' in Bison and `ctags'.
+
+`delete'
+ `-D' in `tar'.
+
+`dereference'
+ `-L' in `chgrp', `chown', `cpio', `du', `ls', and `tar'.
+
+`dereference-args'
+ `-D' in `du'.
+
+`device'
+ Specify an I/O device (special file name).
+
+`diacritics'
+ `-d' in `recode'.
+
+`dictionary-order'
+ `-d' in `look'.
+
+`diff'
+ `-d' in `tar'.
+
+`digits'
+ `-n' in `csplit'.
+
+`directory'
+ Specify the directory to use, in various programs. In `ls', it
+ means to show directories themselves rather than their contents.
+ In `rm' and `ln', it means to not treat links to directories
+ specially.
+
+`discard-all'
+ `-x' in `strip'.
+
+`discard-locals'
+ `-X' in `strip'.
+
+`dry-run'
+ `-n' in `make'.
+
+`ed'
+ `-e' in `diff'.
+
+`elide-empty-files'
+ `-z' in `csplit'.
+
+`end-delete'
+ `-x' in `wdiff'.
+
+`end-insert'
+ `-z' in `wdiff'.
+
+`entire-new-file'
+ `-N' in `diff'.
+
+`environment-overrides'
+ `-e' in `make'.
+
+`eof'
+ `-e' in `xargs'.
+
+`epoch'
+ Used in GDB.
+
+`error-limit'
+ Used in `makeinfo'.
+
+`error-output'
+ `-o' in `m4'.
+
+`escape'
+ `-b' in `ls'.
+
+`exclude-from'
+ `-X' in `tar'.
+
+`exec'
+ Used in GDB.
+
+`exit'
+ `-x' in `xargs'.
+
+`exit-0'
+ `-e' in `unshar'.
+
+`expand-tabs'
+ `-t' in `diff'.
+
+`expression'
+ `-e' in `sed'.
+
+`extern-only'
+ `-g' in `nm'.
+
+`extract'
+ `-i' in `cpio'; `-x' in `tar'.
+
+`faces'
+ `-f' in `finger'.
+
+`fast'
+ `-f' in `su'.
+
+`fatal-warnings'
+ `-E' in `m4'.
+
+`file'
+ `-f' in `gawk', `info', `make', `mt', `sed', and `tar'.
+
+`field-separator'
+ `-F' in `gawk'.
+
+`file-prefix'
+ `-b' in Bison.
+
+`file-type'
+ `-F' in `ls'.
+
+`files-from'
+ `-T' in `tar'.
+
+`fill-column'
+ Used in `makeinfo'.
+
+`flag-truncation'
+ `-F' in `ptx'.
+
+`fixed-output-files'
+ `-y' in Bison.
+
+`follow'
+ `-f' in `tail'.
+
+`footnote-style'
+ Used in `makeinfo'.
+
+`force'
+ `-f' in `cp', `ln', `mv', and `rm'.
+
+`force-prefix'
+ `-F' in `shar'.
+
+`foreground'
+ For server programs, run in the foreground; in other words, don't
+ do anything special to run the server in the background.
+
+`format'
+ Used in `ls', `time', and `ptx'.
+
+`freeze-state'
+ `-F' in `m4'.
+
+`fullname'
+ Used in GDB.
+
+`gap-size'
+ `-g' in `ptx'.
+
+`get'
+ `-x' in `tar'.
+
+`graphic'
+ `-i' in `ul'.
+
+`graphics'
+ `-g' in `recode'.
+
+`group'
+ `-g' in `install'.
+
+`gzip'
+ `-z' in `tar' and `shar'.
+
+`hashsize'
+ `-H' in `m4'.
+
+`header'
+ `-h' in `objdump' and `recode'
+
+`heading'
+ `-H' in `who'.
+
+`help'
+ Used to ask for brief usage information.
+
+`here-delimiter'
+ `-d' in `shar'.
+
+`hide-control-chars'
+ `-q' in `ls'.
+
+`html'
+ In `makeinfo', output HTML.
+
+`idle'
+ `-u' in `who'.
+
+`ifdef'
+ `-D' in `diff'.
+
+`ignore'
+ `-I' in `ls'; `-x' in `recode'.
+
+`ignore-all-space'
+ `-w' in `diff'.
+
+`ignore-backups'
+ `-B' in `ls'.
+
+`ignore-blank-lines'
+ `-B' in `diff'.
+
+`ignore-case'
+ `-f' in `look' and `ptx'; `-i' in `diff' and `wdiff'.
+
+`ignore-errors'
+ `-i' in `make'.
+
+`ignore-file'
+ `-i' in `ptx'.
+
+`ignore-indentation'
+ `-I' in `etags'.
+
+`ignore-init-file'
+ `-f' in Oleo.
+
+`ignore-interrupts'
+ `-i' in `tee'.
+
+`ignore-matching-lines'
+ `-I' in `diff'.
+
+`ignore-space-change'
+ `-b' in `diff'.
+
+`ignore-zeros'
+ `-i' in `tar'.
+
+`include'
+ `-i' in `etags'; `-I' in `m4'.
+
+`include-dir'
+ `-I' in `make'.
+
+`incremental'
+ `-G' in `tar'.
+
+`info'
+ `-i', `-l', and `-m' in Finger.
+
+`init-file'
+ In some programs, specify the name of the file to read as the
+ user's init file.
+
+`initial'
+ `-i' in `expand'.
+
+`initial-tab'
+ `-T' in `diff'.
+
+`inode'
+ `-i' in `ls'.
+
+`interactive'
+ `-i' in `cp', `ln', `mv', `rm'; `-e' in `m4'; `-p' in `xargs';
+ `-w' in `tar'.
+
+`intermix-type'
+ `-p' in `shar'.
+
+`iso-8601'
+ Used in `date'
+
+`jobs'
+ `-j' in `make'.
+
+`just-print'
+ `-n' in `make'.
+
+`keep-going'
+ `-k' in `make'.
+
+`keep-files'
+ `-k' in `csplit'.
+
+`kilobytes'
+ `-k' in `du' and `ls'.
+
+`language'
+ `-l' in `etags'.
+
+`less-mode'
+ `-l' in `wdiff'.
+
+`level-for-gzip'
+ `-g' in `shar'.
+
+`line-bytes'
+ `-C' in `split'.
+
+`lines'
+ Used in `split', `head', and `tail'.
+
+`link'
+ `-l' in `cpio'.
+
+`lint'
+`lint-old'
+ Used in `gawk'.
+
+`list'
+ `-t' in `cpio'; `-l' in `recode'.
+
+`list'
+ `-t' in `tar'.
+
+`literal'
+ `-N' in `ls'.
+
+`load-average'
+ `-l' in `make'.
+
+`login'
+ Used in `su'.
+
+`machine'
+ Used in `uname'.
+
+`macro-name'
+ `-M' in `ptx'.
+
+`mail'
+ `-m' in `hello' and `uname'.
+
+`make-directories'
+ `-d' in `cpio'.
+
+`makefile'
+ `-f' in `make'.
+
+`mapped'
+ Used in GDB.
+
+`max-args'
+ `-n' in `xargs'.
+
+`max-chars'
+ `-n' in `xargs'.
+
+`max-lines'
+ `-l' in `xargs'.
+
+`max-load'
+ `-l' in `make'.
+
+`max-procs'
+ `-P' in `xargs'.
+
+`mesg'
+ `-T' in `who'.
+
+`message'
+ `-T' in `who'.
+
+`minimal'
+ `-d' in `diff'.
+
+`mixed-uuencode'
+ `-M' in `shar'.
+
+`mode'
+ `-m' in `install', `mkdir', and `mkfifo'.
+
+`modification-time'
+ `-m' in `tar'.
+
+`multi-volume'
+ `-M' in `tar'.
+
+`name-prefix'
+ `-a' in Bison.
+
+`nesting-limit'
+ `-L' in `m4'.
+
+`net-headers'
+ `-a' in `shar'.
+
+`new-file'
+ `-W' in `make'.
+
+`no-builtin-rules'
+ `-r' in `make'.
+
+`no-character-count'
+ `-w' in `shar'.
+
+`no-check-existing'
+ `-x' in `shar'.
+
+`no-common'
+ `-3' in `wdiff'.
+
+`no-create'
+ `-c' in `touch'.
+
+`no-defines'
+ `-D' in `etags'.
+
+`no-deleted'
+ `-1' in `wdiff'.
+
+`no-dereference'
+ `-d' in `cp'.
+
+`no-inserted'
+ `-2' in `wdiff'.
+
+`no-keep-going'
+ `-S' in `make'.
+
+`no-lines'
+ `-l' in Bison.
+
+`no-piping'
+ `-P' in `shar'.
+
+`no-prof'
+ `-e' in `gprof'.
+
+`no-regex'
+ `-R' in `etags'.
+
+`no-sort'
+ `-p' in `nm'.
+
+`no-splash'
+ Don't print a startup splash screen.
+
+`no-split'
+ Used in `makeinfo'.
+
+`no-static'
+ `-a' in `gprof'.
+
+`no-time'
+ `-E' in `gprof'.
+
+`no-timestamp'
+ `-m' in `shar'.
+
+`no-validate'
+ Used in `makeinfo'.
+
+`no-wait'
+ Used in `emacsclient'.
+
+`no-warn'
+ Used in various programs to inhibit warnings.
+
+`node'
+ `-n' in `info'.
+
+`nodename'
+ `-n' in `uname'.
+
+`nonmatching'
+ `-f' in `cpio'.
+
+`nstuff'
+ `-n' in `objdump'.
+
+`null'
+ `-0' in `xargs'.
+
+`number'
+ `-n' in `cat'.
+
+`number-nonblank'
+ `-b' in `cat'.
+
+`numeric-sort'
+ `-n' in `nm'.
+
+`numeric-uid-gid'
+ `-n' in `cpio' and `ls'.
+
+`nx'
+ Used in GDB.
+
+`old-archive'
+ `-o' in `tar'.
+
+`old-file'
+ `-o' in `make'.
+
+`one-file-system'
+ `-l' in `tar', `cp', and `du'.
+
+`only-file'
+ `-o' in `ptx'.
+
+`only-prof'
+ `-f' in `gprof'.
+
+`only-time'
+ `-F' in `gprof'.
+
+`options'
+ `-o' in `getopt', `fdlist', `fdmount', `fdmountd', and `fdumount'.
+
+`output'
+ In various programs, specify the output file name.
+
+`output-prefix'
+ `-o' in `shar'.
+
+`override'
+ `-o' in `rm'.
+
+`overwrite'
+ `-c' in `unshar'.
+
+`owner'
+ `-o' in `install'.
+
+`paginate'
+ `-l' in `diff'.
+
+`paragraph-indent'
+ Used in `makeinfo'.
+
+`parents'
+ `-p' in `mkdir' and `rmdir'.
+
+`pass-all'
+ `-p' in `ul'.
+
+`pass-through'
+ `-p' in `cpio'.
+
+`port'
+ `-P' in `finger'.
+
+`portability'
+ `-c' in `cpio' and `tar'.
+
+`posix'
+ Used in `gawk'.
+
+`prefix-builtins'
+ `-P' in `m4'.
+
+`prefix'
+ `-f' in `csplit'.
+
+`preserve'
+ Used in `tar' and `cp'.
+
+`preserve-environment'
+ `-p' in `su'.
+
+`preserve-modification-time'
+ `-m' in `cpio'.
+
+`preserve-order'
+ `-s' in `tar'.
+
+`preserve-permissions'
+ `-p' in `tar'.
+
+`print'
+ `-l' in `diff'.
+
+`print-chars'
+ `-L' in `cmp'.
+
+`print-data-base'
+ `-p' in `make'.
+
+`print-directory'
+ `-w' in `make'.
+
+`print-file-name'
+ `-o' in `nm'.
+
+`print-symdefs'
+ `-s' in `nm'.
+
+`printer'
+ `-p' in `wdiff'.
+
+`prompt'
+ `-p' in `ed'.
+
+`proxy'
+ Specify an HTTP proxy.
+
+`query-user'
+ `-X' in `shar'.
+
+`question'
+ `-q' in `make'.
+
+`quiet'
+ Used in many programs to inhibit the usual output. Every program
+ accepting `--quiet' should accept `--silent' as a synonym.
+
+`quiet-unshar'
+ `-Q' in `shar'
+
+`quote-name'
+ `-Q' in `ls'.
+
+`rcs'
+ `-n' in `diff'.
+
+`re-interval'
+ Used in `gawk'.
+
+`read-full-blocks'
+ `-B' in `tar'.
+
+`readnow'
+ Used in GDB.
+
+`recon'
+ `-n' in `make'.
+
+`record-number'
+ `-R' in `tar'.
+
+`recursive'
+ Used in `chgrp', `chown', `cp', `ls', `diff', and `rm'.
+
+`reference'
+ `-r' in `touch'.
+
+`references'
+ `-r' in `ptx'.
+
+`regex'
+ `-r' in `tac' and `etags'.
+
+`release'
+ `-r' in `uname'.
+
+`reload-state'
+ `-R' in `m4'.
+
+`relocation'
+ `-r' in `objdump'.
+
+`rename'
+ `-r' in `cpio'.
+
+`replace'
+ `-i' in `xargs'.
+
+`report-identical-files'
+ `-s' in `diff'.
+
+`reset-access-time'
+ `-a' in `cpio'.
+
+`reverse'
+ `-r' in `ls' and `nm'.
+
+`reversed-ed'
+ `-f' in `diff'.
+
+`right-side-defs'
+ `-R' in `ptx'.
+
+`same-order'
+ `-s' in `tar'.
+
+`same-permissions'
+ `-p' in `tar'.
+
+`save'
+ `-g' in `stty'.
+
+`se'
+ Used in GDB.
+
+`sentence-regexp'
+ `-S' in `ptx'.
+
+`separate-dirs'
+ `-S' in `du'.
+
+`separator'
+ `-s' in `tac'.
+
+`sequence'
+ Used by `recode' to chose files or pipes for sequencing passes.
+
+`shell'
+ `-s' in `su'.
+
+`show-all'
+ `-A' in `cat'.
+
+`show-c-function'
+ `-p' in `diff'.
+
+`show-ends'
+ `-E' in `cat'.
+
+`show-function-line'
+ `-F' in `diff'.
+
+`show-tabs'
+ `-T' in `cat'.
+
+`silent'
+ Used in many programs to inhibit the usual output. Every program
+ accepting `--silent' should accept `--quiet' as a synonym.
+
+`size'
+ `-s' in `ls'.
+
+`socket'
+ Specify a file descriptor for a network server to use for its
+ socket, instead of opening and binding a new socket. This
+ provides a way to run, in a non-privileged process, a server that
+ normally needs a reserved port number.
+
+`sort'
+ Used in `ls'.
+
+`source'
+ `-W source' in `gawk'.
+
+`sparse'
+ `-S' in `tar'.
+
+`speed-large-files'
+ `-H' in `diff'.
+
+`split-at'
+ `-E' in `unshar'.
+
+`split-size-limit'
+ `-L' in `shar'.
+
+`squeeze-blank'
+ `-s' in `cat'.
+
+`start-delete'
+ `-w' in `wdiff'.
+
+`start-insert'
+ `-y' in `wdiff'.
+
+`starting-file'
+ Used in `tar' and `diff' to specify which file within a directory
+ to start processing with.
+
+`statistics'
+ `-s' in `wdiff'.
+
+`stdin-file-list'
+ `-S' in `shar'.
+
+`stop'
+ `-S' in `make'.
+
+`strict'
+ `-s' in `recode'.
+
+`strip'
+ `-s' in `install'.
+
+`strip-all'
+ `-s' in `strip'.
+
+`strip-debug'
+ `-S' in `strip'.
+
+`submitter'
+ `-s' in `shar'.
+
+`suffix'
+ `-S' in `cp', `ln', `mv'.
+
+`suffix-format'
+ `-b' in `csplit'.
+
+`sum'
+ `-s' in `gprof'.
+
+`summarize'
+ `-s' in `du'.
+
+`symbolic'
+ `-s' in `ln'.
+
+`symbols'
+ Used in GDB and `objdump'.
+
+`synclines'
+ `-s' in `m4'.
+
+`sysname'
+ `-s' in `uname'.
+
+`tabs'
+ `-t' in `expand' and `unexpand'.
+
+`tabsize'
+ `-T' in `ls'.
+
+`terminal'
+ `-T' in `tput' and `ul'. `-t' in `wdiff'.
+
+`text'
+ `-a' in `diff'.
+
+`text-files'
+ `-T' in `shar'.
+
+`time'
+ Used in `ls' and `touch'.
+
+`timeout'
+ Specify how long to wait before giving up on some operation.
+
+`to-stdout'
+ `-O' in `tar'.
+
+`total'
+ `-c' in `du'.
+
+`touch'
+ `-t' in `make', `ranlib', and `recode'.
+
+`trace'
+ `-t' in `m4'.
+
+`traditional'
+ `-t' in `hello'; `-W traditional' in `gawk'; `-G' in `ed', `m4',
+ and `ptx'.
+
+`tty'
+ Used in GDB.
+
+`typedefs'
+ `-t' in `ctags'.
+
+`typedefs-and-c++'
+ `-T' in `ctags'.
+
+`typeset-mode'
+ `-t' in `ptx'.
+
+`uncompress'
+ `-z' in `tar'.
+
+`unconditional'
+ `-u' in `cpio'.
+
+`undefine'
+ `-U' in `m4'.
+
+`undefined-only'
+ `-u' in `nm'.
+
+`update'
+ `-u' in `cp', `ctags', `mv', `tar'.
+
+`usage'
+ Used in `gawk'; same as `--help'.
+
+`uuencode'
+ `-B' in `shar'.
+
+`vanilla-operation'
+ `-V' in `shar'.
+
+`verbose'
+ Print more information about progress. Many programs support this.
+
+`verify'
+ `-W' in `tar'.
+
+`version'
+ Print the version number.
+
+`version-control'
+ `-V' in `cp', `ln', `mv'.
+
+`vgrind'
+ `-v' in `ctags'.
+
+`volume'
+ `-V' in `tar'.
+
+`what-if'
+ `-W' in `make'.
+
+`whole-size-limit'
+ `-l' in `shar'.
+
+`width'
+ `-w' in `ls' and `ptx'.
+
+`word-regexp'
+ `-W' in `ptx'.
+
+`writable'
+ `-T' in `who'.
+
+`zeros'
+ `-z' in `gprof'.
+
+
+File: standards.info, Node: OID Allocations, Next: Memory Usage, Prev: Option Table, Up: Program Behavior
+
+4.10 OID Allocations
+====================
+
+The OID (object identifier) 1.3.6.1.4.1.11591 has been assigned to the
+GNU Project (thanks to Werner Koch). These are used for SNMP, LDAP,
+X.509 certificates, and so on. The web site
+`http://www.alvestrand.no/objectid' has a (voluntary) listing of many
+OID assignments.
+
+ If you need a new slot for your GNU package, write
+<maintainers@gnu.org>. Here is a list of arcs currently assigned:
+
+
+ 1.3.6.1.4.1.11591 GNU
+
+ 1.3.6.1.4.1.11591.1 GNU Radius
+
+ 1.3.6.1.4.1.11591.2 GnuPG
+ 1.3.6.1.4.1.11591.2.1 notation
+ 1.3.6.1.4.1.11591.2.1.1 pkaAddress
+
+ 1.3.6.1.4.1.11591.3 GNU Radar
+
+ 1.3.6.1.4.1.11591.4 GNU GSS
+
+ 1.3.6.1.4.1.11591.5 GNU Mailutils
+
+ 1.3.6.1.4.1.11591.6 GNU Shishi
+
+ 1.3.6.1.4.1.11591.7 GNU Radio
+
+ 1.3.6.1.4.1.11591.8 GNU Dico
+
+ 1.3.6.1.4.1.11591.12 digestAlgorithm
+ 1.3.6.1.4.1.11591.12.2 TIGER/192
+ 1.3.6.1.4.1.11591.13 encryptionAlgorithm
+ 1.3.6.1.4.1.11591.13.2 Serpent
+ 1.3.6.1.4.1.11591.13.2.1 Serpent-128-ECB
+ 1.3.6.1.4.1.11591.13.2.2 Serpent-128-CBC
+ 1.3.6.1.4.1.11591.13.2.3 Serpent-128-OFB
+ 1.3.6.1.4.1.11591.13.2.4 Serpent-128-CFB
+ 1.3.6.1.4.1.11591.13.2.21 Serpent-192-ECB
+ 1.3.6.1.4.1.11591.13.2.22 Serpent-192-CBC
+ 1.3.6.1.4.1.11591.13.2.23 Serpent-192-OFB
+ 1.3.6.1.4.1.11591.13.2.24 Serpent-192-CFB
+ 1.3.6.1.4.1.11591.13.2.41 Serpent-256-ECB
+ 1.3.6.1.4.1.11591.13.2.42 Serpent-256-CBC
+ 1.3.6.1.4.1.11591.13.2.43 Serpent-256-OFB
+ 1.3.6.1.4.1.11591.13.2.44 Serpent-256-CFB
+ 1.3.6.1.4.1.11591.14 CRC algorithms
+ 1.3.6.1.4.1.11591.14.1 CRC 32
+
+
+File: standards.info, Node: Memory Usage, Next: File Usage, Prev: OID Allocations, Up: Program Behavior
+
+4.11 Memory Usage
+=================
+
+If a program typically uses just a few meg of memory, don't bother
+making any effort to reduce memory usage. For example, if it is
+impractical for other reasons to operate on files more than a few meg
+long, it is reasonable to read entire input files into memory to
+operate on them.
+
+ However, for programs such as `cat' or `tail', that can usefully
+operate on very large files, it is important to avoid using a technique
+that would artificially limit the size of files it can handle. If a
+program works by lines and could be applied to arbitrary user-supplied
+input files, it should keep only a line in memory, because this is not
+very hard and users will want to be able to operate on input files that
+are bigger than will fit in memory all at once.
+
+ If your program creates complicated data structures, just make them
+in memory and give a fatal error if `malloc' returns zero.
+
+ Memory analysis tools such as `valgrind' can be useful, but don't
+complicate a program merely to avoid their false alarms. For example,
+if memory is used until just before a process exits, don't free it
+simply to silence such a tool.
+
+
+File: standards.info, Node: File Usage, Prev: Memory Usage, Up: Program Behavior
+
+4.12 File Usage
+===============
+
+Programs should be prepared to operate when `/usr' and `/etc' are
+read-only file systems. Thus, if the program manages log files, lock
+files, backup files, score files, or any other files which are modified
+for internal purposes, these files should not be stored in `/usr' or
+`/etc'.
+
+ There are two exceptions. `/etc' is used to store system
+configuration information; it is reasonable for a program to modify
+files in `/etc' when its job is to update the system configuration.
+Also, if the user explicitly asks to modify one file in a directory, it
+is reasonable for the program to store other files in the same
+directory.
+
+
+File: standards.info, Node: Writing C, Next: Documentation, Prev: Program Behavior, Up: Top
+
+5 Making The Best Use of C
+**************************
+
+This chapter provides advice on how best to use the C language when
+writing GNU software.
+
+* Menu:
+
+* Formatting:: Formatting your source code.
+* Comments:: Commenting your work.
+* Syntactic Conventions:: Clean use of C constructs.
+* Names:: Naming variables, functions, and files.
+* System Portability:: Portability among different operating systems.
+* CPU Portability:: Supporting the range of CPU types.
+* System Functions:: Portability and ``standard'' library functions.
+* Internationalization:: Techniques for internationalization.
+* Character Set:: Use ASCII by default.
+* Quote Characters:: Use "..." or '...' in the C locale.
+* Mmap:: How you can safely use `mmap'.
+
+
+File: standards.info, Node: Formatting, Next: Comments, Up: Writing C
+
+5.1 Formatting Your Source Code
+===============================
+
+It is important to put the open-brace that starts the body of a C
+function in column one, so that they will start a defun. Several tools
+look for open-braces in column one to find the beginnings of C
+functions. These tools will not work on code not formatted that way.
+
+ Avoid putting open-brace, open-parenthesis or open-bracket in column
+one when they are inside a function, so that they won't start a defun.
+The open-brace that starts a `struct' body can go in column one if you
+find it useful to treat that definition as a defun.
+
+ It is also important for function definitions to start the name of
+the function in column one. This helps people to search for function
+definitions, and may also help certain tools recognize them. Thus,
+using Standard C syntax, the format is this:
+
+ static char *
+ concat (char *s1, char *s2)
+ {
+ ...
+ }
+
+or, if you want to use traditional C syntax, format the definition like
+this:
+
+ static char *
+ concat (s1, s2) /* Name starts in column one here */
+ char *s1, *s2;
+ { /* Open brace in column one here */
+ ...
+ }
+
+ In Standard C, if the arguments don't fit nicely on one line, split
+it like this:
+
+ int
+ lots_of_args (int an_integer, long a_long, short a_short,
+ double a_double, float a_float)
+ ...
+
+ For `struct' and `enum' types, likewise put the braces in column
+one, unless the whole contents fits on one line:
+
+ struct foo
+ {
+ int a, b;
+ }
+or
+ struct foo { int a, b; }
+
+ The rest of this section gives our recommendations for other aspects
+of C formatting style, which is also the default style of the `indent'
+program in version 1.2 and newer. It corresponds to the options
+
+ -nbad -bap -nbc -bbo -bl -bli2 -bls -ncdb -nce -cp1 -cs -di2
+ -ndj -nfc1 -nfca -hnl -i2 -ip5 -lp -pcs -psl -nsc -nsob
+
+ We don't think of these recommendations as requirements, because it
+causes no problems for users if two different programs have different
+formatting styles.
+
+ But whatever style you use, please use it consistently, since a
+mixture of styles within one program tends to look ugly. If you are
+contributing changes to an existing program, please follow the style of
+that program.
+
+ For the body of the function, our recommended style looks like this:
+
+ if (x < foo (y, z))
+ haha = bar[4] + 5;
+ else
+ {
+ while (z)
+ {
+ haha += foo (z, z);
+ z--;
+ }
+ return ++x + bar ();
+ }
+
+ We find it easier to read a program when it has spaces before the
+open-parentheses and after the commas. Especially after the commas.
+
+ When you split an expression into multiple lines, split it before an
+operator, not after one. Here is the right way:
+
+ if (foo_this_is_long && bar > win (x, y, z)
+ && remaining_condition)
+
+ Try to avoid having two operators of different precedence at the same
+level of indentation. For example, don't write this:
+
+ mode = (inmode[j] == VOIDmode
+ || GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j])
+ ? outmode[j] : inmode[j]);
+
+ Instead, use extra parentheses so that the indentation shows the
+nesting:
+
+ mode = ((inmode[j] == VOIDmode
+ || (GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j])))
+ ? outmode[j] : inmode[j]);
+
+ Insert extra parentheses so that Emacs will indent the code properly.
+For example, the following indentation looks nice if you do it by hand,
+
+ v = rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000
+ + rup->ru_stime.tv_sec*1000 + rup->ru_stime.tv_usec/1000;
+
+but Emacs would alter it. Adding a set of parentheses produces
+something that looks equally nice, and which Emacs will preserve:
+
+ v = (rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000
+ + rup->ru_stime.tv_sec*1000 + rup->ru_stime.tv_usec/1000);
+
+ Format do-while statements like this:
+
+ do
+ {
+ a = foo (a);
+ }
+ while (a > 0);
+
+ Please use formfeed characters (control-L) to divide the program into
+pages at logical places (but not within a function). It does not matter
+just how long the pages are, since they do not have to fit on a printed
+page. The formfeeds should appear alone on lines by themselves.
+
+
+File: standards.info, Node: Comments, Next: Syntactic Conventions, Prev: Formatting, Up: Writing C
+
+5.2 Commenting Your Work
+========================
+
+Every program should start with a comment saying briefly what it is for.
+Example: `fmt - filter for simple filling of text'. This comment
+should be at the top of the source file containing the `main' function
+of the program.
+
+ Also, please write a brief comment at the start of each source file,
+with the file name and a line or two about the overall purpose of the
+file.
+
+ Please write the comments in a GNU program in English, because
+English is the one language that nearly all programmers in all
+countries can read. If you do not write English well, please write
+comments in English as well as you can, then ask other people to help
+rewrite them. If you can't write comments in English, please find
+someone to work with you and translate your comments into English.
+
+ Please put a comment on each function saying what the function does,
+what sorts of arguments it gets, and what the possible values of
+arguments mean and are used for. It is not necessary to duplicate in
+words the meaning of the C argument declarations, if a C type is being
+used in its customary fashion. If there is anything nonstandard about
+its use (such as an argument of type `char *' which is really the
+address of the second character of a string, not the first), or any
+possible values that would not work the way one would expect (such as,
+that strings containing newlines are not guaranteed to work), be sure
+to say so.
+
+ Also explain the significance of the return value, if there is one.
+
+ Please put two spaces after the end of a sentence in your comments,
+so that the Emacs sentence commands will work. Also, please write
+complete sentences and capitalize the first word. If a lower-case
+identifier comes at the beginning of a sentence, don't capitalize it!
+Changing the spelling makes it a different identifier. If you don't
+like starting a sentence with a lower case letter, write the sentence
+differently (e.g., "The identifier lower-case is ...").
+
+ The comment on a function is much clearer if you use the argument
+names to speak about the argument values. The variable name itself
+should be lower case, but write it in upper case when you are speaking
+about the value rather than the variable itself. Thus, "the inode
+number NODE_NUM" rather than "an inode".
+
+ There is usually no purpose in restating the name of the function in
+the comment before it, because readers can see that for themselves.
+There might be an exception when the comment is so long that the
+function itself would be off the bottom of the screen.
+
+ There should be a comment on each static variable as well, like this:
+
+ /* Nonzero means truncate lines in the display;
+ zero means continue them. */
+ int truncate_lines;
+
+ Every `#endif' should have a comment, except in the case of short
+conditionals (just a few lines) that are not nested. The comment should
+state the condition of the conditional that is ending, _including its
+sense_. `#else' should have a comment describing the condition _and
+sense_ of the code that follows. For example:
+
+ #ifdef foo
+ ...
+ #else /* not foo */
+ ...
+ #endif /* not foo */
+ #ifdef foo
+ ...
+ #endif /* foo */
+
+but, by contrast, write the comments this way for a `#ifndef':
+
+ #ifndef foo
+ ...
+ #else /* foo */
+ ...
+ #endif /* foo */
+ #ifndef foo
+ ...
+ #endif /* not foo */
+
+
+File: standards.info, Node: Syntactic Conventions, Next: Names, Prev: Comments, Up: Writing C
+
+5.3 Clean Use of C Constructs
+=============================
+
+Please explicitly declare the types of all objects. For example, you
+should explicitly declare all arguments to functions, and you should
+declare functions to return `int' rather than omitting the `int'.
+
+ Some programmers like to use the GCC `-Wall' option, and change the
+code whenever it issues a warning. If you want to do this, then do.
+Other programmers prefer not to use `-Wall', because it gives warnings
+for valid and legitimate code which they do not want to change. If you
+want to do this, then do. The compiler should be your servant, not
+your master.
+
+ Don't make the program ugly just to placate static analysis tools
+such as `lint', `clang', and GCC with extra warnings options such as
+`-Wconversion' and `-Wundef'. These tools can help find bugs and
+unclear code, but they can also generate so many false alarms that it
+hurts readability to silence them with unnecessary casts, wrappers, and
+other complications. For example, please don't insert casts to `void'
+or calls to do-nothing functions merely to pacify a lint checker.
+
+ Declarations of external functions and functions to appear later in
+the source file should all go in one place near the beginning of the
+file (somewhere before the first function definition in the file), or
+else should go in a header file. Don't put `extern' declarations inside
+functions.
+
+ It used to be common practice to use the same local variables (with
+names like `tem') over and over for different values within one
+function. Instead of doing this, it is better to declare a separate
+local variable for each distinct purpose, and give it a name which is
+meaningful. This not only makes programs easier to understand, it also
+facilitates optimization by good compilers. You can also move the
+declaration of each local variable into the smallest scope that includes
+all its uses. This makes the program even cleaner.
+
+ Don't use local variables or parameters that shadow global
+identifiers. GCC's `-Wshadow' option can detect this problem.
+
+ Don't declare multiple variables in one declaration that spans lines.
+Start a new declaration on each line, instead. For example, instead of
+this:
+
+ int foo,
+ bar;
+
+write either this:
+
+ int foo, bar;
+
+or this:
+
+ int foo;
+ int bar;
+
+(If they are global variables, each should have a comment preceding it
+anyway.)
+
+ When you have an `if'-`else' statement nested in another `if'
+statement, always put braces around the `if'-`else'. Thus, never write
+like this:
+
+ if (foo)
+ if (bar)
+ win ();
+ else
+ lose ();
+
+always like this:
+
+ if (foo)
+ {
+ if (bar)
+ win ();
+ else
+ lose ();
+ }
+
+ If you have an `if' statement nested inside of an `else' statement,
+either write `else if' on one line, like this,
+
+ if (foo)
+ ...
+ else if (bar)
+ ...
+
+with its `then'-part indented like the preceding `then'-part, or write
+the nested `if' within braces like this:
+
+ if (foo)
+ ...
+ else
+ {
+ if (bar)
+ ...
+ }
+
+ Don't declare both a structure tag and variables or typedefs in the
+same declaration. Instead, declare the structure tag separately and
+then use it to declare the variables or typedefs.
+
+ Try to avoid assignments inside `if'-conditions (assignments inside
+`while'-conditions are ok). For example, don't write this:
+
+ if ((foo = (char *) malloc (sizeof *foo)) == 0)
+ fatal ("virtual memory exhausted");
+
+instead, write this:
+
+ foo = (char *) malloc (sizeof *foo);
+ if (foo == 0)
+ fatal ("virtual memory exhausted");
+
+ This example uses zero without a cast as a null pointer constant.
+This is perfectly fine, except that a cast is needed when calling a
+varargs function or when using `sizeof'.
+
+
+File: standards.info, Node: Names, Next: System Portability, Prev: Syntactic Conventions, Up: Writing C
+
+5.4 Naming Variables, Functions, and Files
+==========================================
+
+The names of global variables and functions in a program serve as
+comments of a sort. So don't choose terse names--instead, look for
+names that give useful information about the meaning of the variable or
+function. In a GNU program, names should be English, like other
+comments.
+
+ Local variable names can be shorter, because they are used only
+within one context, where (presumably) comments explain their purpose.
+
+ Try to limit your use of abbreviations in symbol names. It is ok to
+make a few abbreviations, explain what they mean, and then use them
+frequently, but don't use lots of obscure abbreviations.
+
+ Please use underscores to separate words in a name, so that the Emacs
+word commands can be useful within them. Stick to lower case; reserve
+upper case for macros and `enum' constants, and for name-prefixes that
+follow a uniform convention.
+
+ For example, you should use names like `ignore_space_change_flag';
+don't use names like `iCantReadThis'.
+
+ Variables that indicate whether command-line options have been
+specified should be named after the meaning of the option, not after
+the option-letter. A comment should state both the exact meaning of
+the option and its letter. For example,
+
+ /* Ignore changes in horizontal whitespace (-b). */
+ int ignore_space_change_flag;
+
+ When you want to define names with constant integer values, use
+`enum' rather than `#define'. GDB knows about enumeration constants.
+
+ You might want to make sure that none of the file names would
+conflict if the files were loaded onto an MS-DOS file system which
+shortens the names. You can use the program `doschk' to test for this.
+
+ Some GNU programs were designed to limit themselves to file names of
+14 characters or less, to avoid file name conflicts if they are read
+into older System V systems. Please preserve this feature in the
+existing GNU programs that have it, but there is no need to do this in
+new GNU programs. `doschk' also reports file names longer than 14
+characters.
+
+
+File: standards.info, Node: System Portability, Next: CPU Portability, Prev: Names, Up: Writing C
+
+5.5 Portability between System Types
+====================================
+
+In the Unix world, "portability" refers to porting to different Unix
+versions. For a GNU program, this kind of portability is desirable, but
+not paramount.
+
+ The primary purpose of GNU software is to run on top of the GNU
+kernel, compiled with the GNU C compiler, on various types of CPU. So
+the kinds of portability that are absolutely necessary are quite
+limited. But it is important to support Linux-based GNU systems, since
+they are the form of GNU that is popular.
+
+ Beyond that, it is good to support the other free operating systems
+(*BSD), and it is nice to support other Unix-like systems if you want
+to. Supporting a variety of Unix-like systems is desirable, although
+not paramount. It is usually not too hard, so you may as well do it.
+But you don't have to consider it an obligation, if it does turn out to
+be hard.
+
+ The easiest way to achieve portability to most Unix-like systems is
+to use Autoconf. It's unlikely that your program needs to know more
+information about the host platform than Autoconf can provide, simply
+because most of the programs that need such knowledge have already been
+written.
+
+ Avoid using the format of semi-internal data bases (e.g.,
+directories) when there is a higher-level alternative (`readdir').
+
+ As for systems that are not like Unix, such as MSDOS, Windows, VMS,
+MVS, and older Macintosh systems, supporting them is often a lot of
+work. When that is the case, it is better to spend your time adding
+features that will be useful on GNU and GNU/Linux, rather than on
+supporting other incompatible systems.
+
+ If you do support Windows, please do not abbreviate it as "win". In
+hacker terminology, calling something a "win" is a form of praise.
+You're free to praise Microsoft Windows on your own if you want, but
+please don't do this in GNU packages. Instead of abbreviating
+"Windows" to "win", you can write it in full or abbreviate it to "woe"
+or "w". In GNU Emacs, for instance, we use `w32' in file names of
+Windows-specific files, but the macro for Windows conditionals is
+called `WINDOWSNT'.
+
+ It is a good idea to define the "feature test macro" `_GNU_SOURCE'
+when compiling your C files. When you compile on GNU or GNU/Linux,
+this will enable the declarations of GNU library extension functions,
+and that will usually give you a compiler error message if you define
+the same function names in some other way in your program. (You don't
+have to actually _use_ these functions, if you prefer to make the
+program more portable to other systems.)
+
+ But whether or not you use these GNU extensions, you should avoid
+using their names for any other meanings. Doing so would make it hard
+to move your code into other GNU programs.
+
+
+File: standards.info, Node: CPU Portability, Next: System Functions, Prev: System Portability, Up: Writing C
+
+5.6 Portability between CPUs
+============================
+
+Even GNU systems will differ because of differences among CPU
+types--for example, difference in byte ordering and alignment
+requirements. It is absolutely essential to handle these differences.
+However, don't make any effort to cater to the possibility that an
+`int' will be less than 32 bits. We don't support 16-bit machines in
+GNU.
+
+ Similarly, don't make any effort to cater to the possibility that
+`long' will be smaller than predefined types like `size_t'. For
+example, the following code is ok:
+
+ printf ("size = %lu\n", (unsigned long) sizeof array);
+ printf ("diff = %ld\n", (long) (pointer2 - pointer1));
+
+ 1989 Standard C requires this to work, and we know of only one
+counterexample: 64-bit programs on Microsoft Windows. We will leave it
+to those who want to port GNU programs to that environment to figure
+out how to do it.
+
+ Predefined file-size types like `off_t' are an exception: they are
+longer than `long' on many platforms, so code like the above won't work
+with them. One way to print an `off_t' value portably is to print its
+digits yourself, one by one.
+
+ Don't assume that the address of an `int' object is also the address
+of its least-significant byte. This is false on big-endian machines.
+Thus, don't make the following mistake:
+
+ int c;
+ ...
+ while ((c = getchar ()) != EOF)
+ write (file_descriptor, &c, 1);
+
+Instead, use `unsigned char' as follows. (The `unsigned' is for
+portability to unusual systems where `char' is signed and where there
+is integer overflow checking.)
+
+ int c;
+ while ((c = getchar ()) != EOF)
+ {
+ unsigned char u = c;
+ write (file_descriptor, &u, 1);
+ }
+
+ Avoid casting pointers to integers if you can. Such casts greatly
+reduce portability, and in most programs they are easy to avoid. In the
+cases where casting pointers to integers is essential--such as, a Lisp
+interpreter which stores type information as well as an address in one
+word--you'll have to make explicit provisions to handle different word
+sizes. You will also need to make provision for systems in which the
+normal range of addresses you can get from `malloc' starts far away
+from zero.
+
+
+File: standards.info, Node: System Functions, Next: Internationalization, Prev: CPU Portability, Up: Writing C
+
+5.7 Calling System Functions
+============================
+
+Historically, C implementations differed substantially, and many
+systems lacked a full implementation of ANSI/ISO C89. Nowadays,
+however, very few systems lack a C89 compiler and GNU C supports almost
+all of C99. Similarly, most systems implement POSIX.1-1993 libraries
+and tools, and many have POSIX.1-2001.
+
+ Hence, there is little reason to support old C or non-POSIX systems,
+and you may want to take advantage of C99 and POSIX-1.2001 to write
+clearer, more portable, or faster code. You should use standard
+interfaces where possible; but if GNU extensions make your program more
+maintainable, powerful, or otherwise better, don't hesitate to use
+them. In any case, don't make your own declaration of system
+functions; that's a recipe for conflict.
+
+ Despite the standards, nearly every library function has some sort of
+portability issue on some system or another. Here are some examples:
+
+`open'
+ Names with trailing `/''s are mishandled on many platforms.
+
+`printf'
+ `long double' may be unimplemented; floating values Infinity and
+ NaN are often mishandled; output for large precisions may be
+ incorrect.
+
+`readlink'
+ May return `int' instead of `ssize_t'.
+
+`scanf'
+ On Windows, `errno' is not set on failure.
+
+ Gnulib (http://www.gnu.org/software/gnulib/) is a big help in this
+regard. Gnulib provides implementations of standard interfaces on many
+of the systems that lack them, including portable implementations of
+enhanced GNU interfaces, thereby making their use portable, and of
+POSIX-1.2008 interfaces, some of which are missing even on up-to-date
+GNU systems.
+
+ Gnulib also provides many useful non-standard interfaces; for
+example, C implementations of standard data structures (hash tables,
+binary trees), error-checking type-safe wrappers for memory allocation
+functions (`xmalloc', `xrealloc'), and output of error messages.
+
+ Gnulib integrates with GNU Autoconf and Automake to remove much of
+the burden of writing portable code from the programmer: Gnulib makes
+your configure script automatically determine what features are missing
+and use the Gnulib code to supply the missing pieces.
+
+ The Gnulib and Autoconf manuals have extensive sections on
+portability: *note Introduction: (gnulib)Top. and *note Portable C and
+C++: (autoconf)Portable C and C++. Please consult them for many more
+details.
+
+
+File: standards.info, Node: Internationalization, Next: Character Set, Prev: System Functions, Up: Writing C
+
+5.8 Internationalization
+========================
+
+GNU has a library called GNU gettext that makes it easy to translate the
+messages in a program into various languages. You should use this
+library in every program. Use English for the messages as they appear
+in the program, and let gettext provide the way to translate them into
+other languages.
+
+ Using GNU gettext involves putting a call to the `gettext' macro
+around each string that might need translation--like this:
+
+ printf (gettext ("Processing file '%s'..."), file);
+
+This permits GNU gettext to replace the string `"Processing file
+'%s'..."' with a translated version.
+
+ Once a program uses gettext, please make a point of writing calls to
+`gettext' when you add new strings that call for translation.
+
+ Using GNU gettext in a package involves specifying a "text domain
+name" for the package. The text domain name is used to separate the
+translations for this package from the translations for other packages.
+Normally, the text domain name should be the same as the name of the
+package--for example, `coreutils' for the GNU core utilities.
+
+ To enable gettext to work well, avoid writing code that makes
+assumptions about the structure of words or sentences. When you want
+the precise text of a sentence to vary depending on the data, use two or
+more alternative string constants each containing a complete sentences,
+rather than inserting conditionalized words or phrases into a single
+sentence framework.
+
+ Here is an example of what not to do:
+
+ printf ("%s is full", capacity > 5000000 ? "disk" : "floppy disk");
+
+ If you apply gettext to all strings, like this,
+
+ printf (gettext ("%s is full"),
+ capacity > 5000000 ? gettext ("disk") : gettext ("floppy disk"));
+
+the translator will hardly know that "disk" and "floppy disk" are meant
+to be substituted in the other string. Worse, in some languages (like
+French) the construction will not work: the translation of the word
+"full" depends on the gender of the first part of the sentence; it
+happens to be not the same for "disk" as for "floppy disk".
+
+ Complete sentences can be translated without problems:
+
+ printf (capacity > 5000000 ? gettext ("disk is full")
+ : gettext ("floppy disk is full"));
+
+ A similar problem appears at the level of sentence structure with
+this code:
+
+ printf ("# Implicit rule search has%s been done.\n",
+ f->tried_implicit ? "" : " not");
+
+Adding `gettext' calls to this code cannot give correct results for all
+languages, because negation in some languages requires adding words at
+more than one place in the sentence. By contrast, adding `gettext'
+calls does the job straightforwardly if the code starts out like this:
+
+ printf (f->tried_implicit
+ ? "# Implicit rule search has been done.\n",
+ : "# Implicit rule search has not been done.\n");
+
+ Another example is this one:
+
+ printf ("%d file%s processed", nfiles,
+ nfiles != 1 ? "s" : "");
+
+The problem with this example is that it assumes that plurals are made
+by adding `s'. If you apply gettext to the format string, like this,
+
+ printf (gettext ("%d file%s processed"), nfiles,
+ nfiles != 1 ? "s" : "");
+
+the message can use different words, but it will still be forced to use
+`s' for the plural. Here is a better way, with gettext being applied to
+the two strings independently:
+
+ printf ((nfiles != 1 ? gettext ("%d files processed")
+ : gettext ("%d file processed")),
+ nfiles);
+
+But this still doesn't work for languages like Polish, which has three
+plural forms: one for nfiles == 1, one for nfiles == 2, 3, 4, 22, 23,
+24, ... and one for the rest. The GNU `ngettext' function solves this
+problem:
+
+ printf (ngettext ("%d files processed", "%d file processed", nfiles),
+ nfiles);
+
+
+File: standards.info, Node: Character Set, Next: Quote Characters, Prev: Internationalization, Up: Writing C
+
+5.9 Character Set
+=================
+
+Sticking to the ASCII character set (plain text, 7-bit characters) is
+preferred in GNU source code comments, text documents, and other
+contexts, unless there is good reason to do something else because of
+the application domain. For example, if source code deals with the
+French Revolutionary calendar, it is OK if its literal strings contain
+accented characters in month names like "Flore'al". Also, it is OK
+(but not required) to use non-ASCII characters to represent proper
+names of contributors in change logs (*note Change Logs::).
+
+ If you need to use non-ASCII characters, you should normally stick
+with one encoding, certainly within a single file. UTF-8 is likely to
+be the best choice.
+
+
+File: standards.info, Node: Quote Characters, Next: Mmap, Prev: Character Set, Up: Writing C
+
+5.10 Quote Characters
+=====================
+
+In the C locale, the output of GNU programs should stick to plain ASCII
+for quotation characters in messages to users: preferably 0x22 (`"') or
+0x27 (`'') for both opening and closing quotes. Although GNU programs
+traditionally used 0x60 (``') for opening and 0x27 (`'') for closing
+quotes, nowadays quotes ``like this'' are typically rendered
+asymmetrically, so quoting `"like this"' or `'like this'' typically
+looks better.
+
+ It is ok, but not required, for GNU programs to generate
+locale-specific quotes in non-C locales. For example:
+
+ printf (gettext ("Processing file '%s'..."), file);
+
+Here, a French translation might cause `gettext' to return the string
+`"Traitement de fichier < %s >..."', yielding quotes more appropriate
+for a French locale.
+
+ Sometimes a program may need to use opening and closing quotes
+directly. By convention, `gettext' translates the string `"`"' to the
+opening quote and the string `"'"' to the closing quote, and a program
+can use these translations. Generally, though, it is better to
+translate quote characters in the context of longer strings.
+
+ If the output of your program is ever likely to be parsed by another
+program, it is good to provide an option that makes this parsing
+reliable. For example, you could escape special characters using
+conventions from the C language or the Bourne shell. See for example
+the option `--quoting-style' of GNU `ls'.
+
+
+File: standards.info, Node: Mmap, Prev: Quote Characters, Up: Writing C
+
+5.11 Mmap
+=========
+
+Don't assume that `mmap' either works on all files or fails for all
+files. It may work on some files and fail on others.
+
+ The proper way to use `mmap' is to try it on the specific file for
+which you want to use it--and if `mmap' doesn't work, fall back on
+doing the job in another way using `read' and `write'.
+
+ The reason this precaution is needed is that the GNU kernel (the
+HURD) provides a user-extensible file system, in which there can be many
+different kinds of "ordinary files". Many of them support `mmap', but
+some do not. It is important to make programs handle all these kinds
+of files.
+
+
+File: standards.info, Node: Documentation, Next: Managing Releases, Prev: Writing C, Up: Top
+
+6 Documenting Programs
+**********************
+
+A GNU program should ideally come with full free documentation, adequate
+for both reference and tutorial purposes. If the package can be
+programmed or extended, the documentation should cover programming or
+extending it, as well as just using it.
+
+* Menu:
+
+* GNU Manuals:: Writing proper manuals.
+* Doc Strings and Manuals:: Compiling doc strings doesn't make a manual.
+* Manual Structure Details:: Specific structure conventions.
+* License for Manuals:: Writing the distribution terms for a manual.
+* Manual Credits:: Giving credit to documentation contributors.
+* Printed Manuals:: Mentioning the printed manual.
+* NEWS File:: NEWS files supplement manuals.
+* Change Logs:: Recording changes.
+* Man Pages:: Man pages are secondary.
+* Reading other Manuals:: How far you can go in learning
+ from other manuals.
+
+
+File: standards.info, Node: GNU Manuals, Next: Doc Strings and Manuals, Up: Documentation
+
+6.1 GNU Manuals
+===============
+
+The preferred document format for the GNU system is the Texinfo
+formatting language. Every GNU package should (ideally) have
+documentation in Texinfo both for reference and for learners. Texinfo
+makes it possible to produce a good quality formatted book, using TeX,
+and to generate an Info file. It is also possible to generate HTML
+output from Texinfo source. See the Texinfo manual, either the
+hardcopy, or the on-line version available through `info' or the Emacs
+Info subsystem (`C-h i').
+
+ Nowadays some other formats such as Docbook and Sgmltexi can be
+converted automatically into Texinfo. It is ok to produce the Texinfo
+documentation by conversion this way, as long as it gives good results.
+
+ Make sure your manual is clear to a reader who knows nothing about
+the topic and reads it straight through. This means covering basic
+topics at the beginning, and advanced topics only later. This also
+means defining every specialized term when it is first used.
+
+ Programmers tend to carry over the structure of the program as the
+structure for its documentation. But this structure is not necessarily
+good for explaining how to use the program; it may be irrelevant and
+confusing for a user.
+
+ Instead, the right way to structure documentation is according to the
+concepts and questions that a user will have in mind when reading it.
+This principle applies at every level, from the lowest (ordering
+sentences in a paragraph) to the highest (ordering of chapter topics
+within the manual). Sometimes this structure of ideas matches the
+structure of the implementation of the software being documented--but
+often they are different. An important part of learning to write good
+documentation is to learn to notice when you have unthinkingly
+structured the documentation like the implementation, stop yourself,
+and look for better alternatives.
+
+ For example, each program in the GNU system probably ought to be
+documented in one manual; but this does not mean each program should
+have its own manual. That would be following the structure of the
+implementation, rather than the structure that helps the user
+understand.
+
+ Instead, each manual should cover a coherent _topic_. For example,
+instead of a manual for `diff' and a manual for `diff3', we have one
+manual for "comparison of files" which covers both of those programs,
+as well as `cmp'. By documenting these programs together, we can make
+the whole subject clearer.
+
+ The manual which discusses a program should certainly document all of
+the program's command-line options and all of its commands. It should
+give examples of their use. But don't organize the manual as a list of
+features. Instead, organize it logically, by subtopics. Address the
+questions that a user will ask when thinking about the job that the
+program does. Don't just tell the reader what each feature can do--say
+what jobs it is good for, and show how to use it for those jobs.
+Explain what is recommended usage, and what kinds of usage users should
+avoid.
+
+ In general, a GNU manual should serve both as tutorial and reference.
+It should be set up for convenient access to each topic through Info,
+and for reading straight through (appendixes aside). A GNU manual
+should give a good introduction to a beginner reading through from the
+start, and should also provide all the details that hackers want. The
+Bison manual is a good example of this--please take a look at it to see
+what we mean.
+
+ That is not as hard as it first sounds. Arrange each chapter as a
+logical breakdown of its topic, but order the sections, and write their
+text, so that reading the chapter straight through makes sense. Do
+likewise when structuring the book into chapters, and when structuring a
+section into paragraphs. The watchword is, _at each point, address the
+most fundamental and important issue raised by the preceding text._
+
+ If necessary, add extra chapters at the beginning of the manual which
+are purely tutorial and cover the basics of the subject. These provide
+the framework for a beginner to understand the rest of the manual. The
+Bison manual provides a good example of how to do this.
+
+ To serve as a reference, a manual should have an Index that list all
+the functions, variables, options, and important concepts that are part
+of the program. One combined Index should do for a short manual, but
+sometimes for a complex package it is better to use multiple indices.
+The Texinfo manual includes advice on preparing good index entries, see
+*note Making Index Entries: (texinfo)Index Entries, and see *note
+Defining the Entries of an Index: (texinfo)Indexing Commands.
+
+ Don't use Unix man pages as a model for how to write GNU
+documentation; most of them are terse, badly structured, and give
+inadequate explanation of the underlying concepts. (There are, of
+course, some exceptions.) Also, Unix man pages use a particular format
+which is different from what we use in GNU manuals.
+
+ Please include an email address in the manual for where to report
+bugs _in the text of the manual_.
+
+ Please do not use the term "pathname" that is used in Unix
+documentation; use "file name" (two words) instead. We use the term
+"path" only for search paths, which are lists of directory names.
+
+ Please do not use the term "illegal" to refer to erroneous input to
+a computer program. Please use "invalid" for this, and reserve the
+term "illegal" for activities prohibited by law.
+
+ Please do not write `()' after a function name just to indicate it
+is a function. `foo ()' is not a function, it is a function call with
+no arguments.
+
+
+File: standards.info, Node: Doc Strings and Manuals, Next: Manual Structure Details, Prev: GNU Manuals, Up: Documentation
+
+6.2 Doc Strings and Manuals
+===========================
+
+Some programming systems, such as Emacs, provide a documentation string
+for each function, command or variable. You may be tempted to write a
+reference manual by compiling the documentation strings and writing a
+little additional text to go around them--but you must not do it. That
+approach is a fundamental mistake. The text of well-written
+documentation strings will be entirely wrong for a manual.
+
+ A documentation string needs to stand alone--when it appears on the
+screen, there will be no other text to introduce or explain it.
+Meanwhile, it can be rather informal in style.
+
+ The text describing a function or variable in a manual must not stand
+alone; it appears in the context of a section or subsection. Other text
+at the beginning of the section should explain some of the concepts, and
+should often make some general points that apply to several functions or
+variables. The previous descriptions of functions and variables in the
+section will also have given information about the topic. A description
+written to stand alone would repeat some of that information; this
+redundancy looks bad. Meanwhile, the informality that is acceptable in
+a documentation string is totally unacceptable in a manual.
+
+ The only good way to use documentation strings in writing a good
+manual is to use them as a source of information for writing good text.
+
+
+File: standards.info, Node: Manual Structure Details, Next: License for Manuals, Prev: Doc Strings and Manuals, Up: Documentation
+
+6.3 Manual Structure Details
+============================
+
+The title page of the manual should state the version of the programs or
+packages documented in the manual. The Top node of the manual should
+also contain this information. If the manual is changing more
+frequently than or independent of the program, also state a version
+number for the manual in both of these places.
+
+ Each program documented in the manual should have a node named
+`PROGRAM Invocation' or `Invoking PROGRAM'. This node (together with
+its subnodes, if any) should describe the program's command line
+arguments and how to run it (the sort of information people would look
+for in a man page). Start with an `@example' containing a template for
+all the options and arguments that the program uses.
+
+ Alternatively, put a menu item in some menu whose item name fits one
+of the above patterns. This identifies the node which that item points
+to as the node for this purpose, regardless of the node's actual name.
+
+ The `--usage' feature of the Info reader looks for such a node or
+menu item in order to find the relevant text, so it is essential for
+every Texinfo file to have one.
+
+ If one manual describes several programs, it should have such a node
+for each program described in the manual.
+
+
+File: standards.info, Node: License for Manuals, Next: Manual Credits, Prev: Manual Structure Details, Up: Documentation
+
+6.4 License for Manuals
+=======================
+
+Please use the GNU Free Documentation License for all GNU manuals that
+are more than a few pages long. Likewise for a collection of short
+documents--you only need one copy of the GNU FDL for the whole
+collection. For a single short document, you can use a very permissive
+non-copyleft license, to avoid taking up space with a long license.
+
+ See `http://www.gnu.org/copyleft/fdl-howto.html' for more explanation
+of how to employ the GFDL.
+
+ Note that it is not obligatory to include a copy of the GNU GPL or
+GNU LGPL in a manual whose license is neither the GPL nor the LGPL. It
+can be a good idea to include the program's license in a large manual;
+in a short manual, whose size would be increased considerably by
+including the program's license, it is probably better not to include
+it.
+
+
+File: standards.info, Node: Manual Credits, Next: Printed Manuals, Prev: License for Manuals, Up: Documentation
+
+6.5 Manual Credits
+==================
+
+Please credit the principal human writers of the manual as the authors,
+on the title page of the manual. If a company sponsored the work, thank
+the company in a suitable place in the manual, but do not cite the
+company as an author.
+
+
+File: standards.info, Node: Printed Manuals, Next: NEWS File, Prev: Manual Credits, Up: Documentation
+
+6.6 Printed Manuals
+===================
+
+The FSF publishes some GNU manuals in printed form. To encourage sales
+of these manuals, the on-line versions of the manual should mention at
+the very start that the printed manual is available and should point at
+information for getting it--for instance, with a link to the page
+`http://www.gnu.org/order/order.html'. This should not be included in
+the printed manual, though, because there it is redundant.
+
+ It is also useful to explain in the on-line forms of the manual how
+the user can print out the manual from the sources.
+
+
+File: standards.info, Node: NEWS File, Next: Change Logs, Prev: Printed Manuals, Up: Documentation
+
+6.7 The NEWS File
+=================
+
+In addition to its manual, the package should have a file named `NEWS'
+which contains a list of user-visible changes worth mentioning. In
+each new release, add items to the front of the file and identify the
+version they pertain to. Don't discard old items; leave them in the
+file after the newer items. This way, a user upgrading from any
+previous version can see what is new.
+
+ If the `NEWS' file gets very long, move some of the older items into
+a file named `ONEWS' and put a note at the end referring the user to
+that file.
+
+
+File: standards.info, Node: Change Logs, Next: Man Pages, Prev: NEWS File, Up: Documentation
+
+6.8 Change Logs
+===============
+
+Keep a change log to describe all the changes made to program source
+files. The purpose of this is so that people investigating bugs in the
+future will know about the changes that might have introduced the bug.
+Often a new bug can be found by looking at what was recently changed.
+More importantly, change logs can help you eliminate conceptual
+inconsistencies between different parts of a program, by giving you a
+history of how the conflicting concepts arose and who they came from.
+
+* Menu:
+
+* Change Log Concepts::
+* Style of Change Logs::
+* Simple Changes::
+* Conditional Changes::
+* Indicating the Part Changed::
+
+
+File: standards.info, Node: Change Log Concepts, Next: Style of Change Logs, Up: Change Logs
+
+6.8.1 Change Log Concepts
+-------------------------
+
+You can think of the change log as a conceptual "undo list" which
+explains how earlier versions were different from the current version.
+People can see the current version; they don't need the change log to
+tell them what is in it. What they want from a change log is a clear
+explanation of how the earlier version differed.
+
+ The change log file is normally called `ChangeLog' and covers an
+entire directory. Each directory can have its own change log, or a
+directory can use the change log of its parent directory--it's up to
+you.
+
+ Another alternative is to record change log information with a
+version control system such as RCS or CVS. This can be converted
+automatically to a `ChangeLog' file using `rcs2log'; in Emacs, the
+command `C-x v a' (`vc-update-change-log') does the job.
+
+ There's no need to describe the full purpose of the changes or how
+they work together. However, sometimes it is useful to write one line
+to describe the overall purpose of a change or a batch of changes. If
+you think that a change calls for explanation, you're probably right.
+Please do explain it--but please put the full explanation in comments
+in the code, where people will see it whenever they see the code. For
+example, "New function" is enough for the change log when you add a
+function, because there should be a comment before the function
+definition to explain what it does.
+
+ In the past, we recommended not mentioning changes in non-software
+files (manuals, help files, etc.) in change logs. However, we've been
+advised that it is a good idea to include them, for the sake of
+copyright records.
+
+ The easiest way to add an entry to `ChangeLog' is with the Emacs
+command `M-x add-change-log-entry'. An entry should have an asterisk,
+the name of the changed file, and then in parentheses the name of the
+changed functions, variables or whatever, followed by a colon. Then
+describe the changes you made to that function or variable.
+
+
+File: standards.info, Node: Style of Change Logs, Next: Simple Changes, Prev: Change Log Concepts, Up: Change Logs
+
+6.8.2 Style of Change Logs
+--------------------------
+
+Here are some simple examples of change log entries, starting with the
+header line that says who made the change and when it was installed,
+followed by descriptions of specific changes. (These examples are
+drawn from Emacs and GCC.)
+
+ 1998-08-17 Richard Stallman <rms@gnu.org>
+
+ * register.el (insert-register): Return nil.
+ (jump-to-register): Likewise.
+
+ * sort.el (sort-subr): Return nil.
+
+ * tex-mode.el (tex-bibtex-file, tex-file, tex-region):
+ Restart the tex shell if process is gone or stopped.
+ (tex-shell-running): New function.
+
+ * expr.c (store_one_arg): Round size up for move_block_to_reg.
+ (expand_call): Round up when emitting USE insns.
+ * stmt.c (assign_parms): Round size up for move_block_from_reg.
+
+ It's important to name the changed function or variable in full.
+Don't abbreviate function or variable names, and don't combine them.
+Subsequent maintainers will often search for a function name to find all
+the change log entries that pertain to it; if you abbreviate the name,
+they won't find it when they search.
+
+ For example, some people are tempted to abbreviate groups of function
+names by writing `* register.el ({insert,jump-to}-register)'; this is
+not a good idea, since searching for `jump-to-register' or
+`insert-register' would not find that entry.
+
+ Separate unrelated change log entries with blank lines. When two
+entries represent parts of the same change, so that they work together,
+then don't put blank lines between them. Then you can omit the file
+name and the asterisk when successive entries are in the same file.
+
+ Break long lists of function names by closing continued lines with
+`)', rather than `,', and opening the continuation with `(' as in this
+example:
+
+ * keyboard.c (menu_bar_items, tool_bar_items)
+ (Fexecute_extended_command): Deal with 'keymap' property.
+
+ When you install someone else's changes, put the contributor's name
+in the change log entry rather than in the text of the entry. In other
+words, write this:
+
+ 2002-07-14 John Doe <jdoe@gnu.org>
+
+ * sewing.c: Make it sew.
+
+rather than this:
+
+ 2002-07-14 Usual Maintainer <usual@gnu.org>
+
+ * sewing.c: Make it sew. Patch by jdoe@gnu.org.
+
+ As for the date, that should be the date you applied the change.
+
+
+File: standards.info, Node: Simple Changes, Next: Conditional Changes, Prev: Style of Change Logs, Up: Change Logs
+
+6.8.3 Simple Changes
+--------------------
+
+Certain simple kinds of changes don't need much detail in the change
+log.
+
+ When you change the calling sequence of a function in a simple
+fashion, and you change all the callers of the function to use the new
+calling sequence, there is no need to make individual entries for all
+the callers that you changed. Just write in the entry for the function
+being called, "All callers changed"--like this:
+
+ * keyboard.c (Fcommand_execute): New arg SPECIAL.
+ All callers changed.
+
+ When you change just comments or doc strings, it is enough to write
+an entry for the file, without mentioning the functions. Just "Doc
+fixes" is enough for the change log.
+
+ There's no technical need to make change log entries for
+documentation files. This is because documentation is not susceptible
+to bugs that are hard to fix. Documentation does not consist of parts
+that must interact in a precisely engineered fashion. To correct an
+error, you need not know the history of the erroneous passage; it is
+enough to compare what the documentation says with the way the program
+actually works.
+
+ However, you should keep change logs for documentation files when the
+project gets copyright assignments from its contributors, so as to make
+the records of authorship more accurate.
+
+
+File: standards.info, Node: Conditional Changes, Next: Indicating the Part Changed, Prev: Simple Changes, Up: Change Logs
+
+6.8.4 Conditional Changes
+-------------------------
+
+Source files can often contain code that is conditional to build-time
+or static conditions. For example, C programs can contain compile-time
+`#if' conditionals; programs implemented in interpreted languages can
+contain module imports of function definitions that are only performed
+for certain versions of the interpreter; and Automake `Makefile.am'
+files can contain variable definitions or target declarations that are
+only to be considered if a configure-time Automake conditional is true.
+
+ Many changes are conditional as well: sometimes you add a new
+variable, or function, or even a new program or library, which is
+entirely dependent on a build-time condition. It is useful to indicate
+in the change log the conditions for which a change applies.
+
+ Our convention for indicating conditional changes is to use _square
+brackets around the name of the condition_.
+
+ Conditional changes can happen in numerous scenarios and with many
+variations, so here are some examples to help clarify. This first
+example describes changes in C, Perl, and Python files which are
+conditional but do not have an associated function or entity name:
+
+ * xterm.c [SOLARIS2]: Include <string.h>.
+ * FilePath.pm [$^O eq 'VMS']: Import the VMS::Feature module.
+ * framework.py [sys.version_info < (2, 6)]: Make "with" statement
+ available by importing it from __future__,
+ to support also python 2.5.
+
+ Our other examples will for simplicity be limited to C, as the minor
+changes necessary to adapt them to other languages should be
+self-evident.
+
+ Next, here is an entry describing a new definition which is entirely
+conditional: the C macro `FRAME_WINDOW_P' is defined (and used) only
+when the macro `HAVE_X_WINDOWS' is defined:
+
+ * frame.h [HAVE_X_WINDOWS] (FRAME_WINDOW_P): Macro defined.
+
+ Next, an entry for a change within the function `init_display',
+whose definition as a whole is unconditional, but the changes
+themselves are contained in a `#ifdef HAVE_LIBNCURSES' conditional:
+
+ * dispnew.c (init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
+
+ Finally, here is an entry for a change that takes effect only when a
+certain macro is _not_ defined:
+
+ (gethostname) [!HAVE_SOCKETS]: Replace with winsock version.
+
+
+File: standards.info, Node: Indicating the Part Changed, Prev: Conditional Changes, Up: Change Logs
+
+6.8.5 Indicating the Part Changed
+---------------------------------
+
+Indicate the part of a function which changed by using angle brackets
+enclosing an indication of what the changed part does. Here is an entry
+for a change in the part of the function `sh-while-getopts' that deals
+with `sh' commands:
+
+ * progmodes/sh-script.el (sh-while-getopts) <sh>: Handle case that
+ user-specified option string is empty.
+
+
+File: standards.info, Node: Man Pages, Next: Reading other Manuals, Prev: Change Logs, Up: Documentation
+
+6.9 Man Pages
+=============
+
+In the GNU project, man pages are secondary. It is not necessary or
+expected for every GNU program to have a man page, but some of them do.
+It's your choice whether to include a man page in your program.
+
+ When you make this decision, consider that supporting a man page
+requires continual effort each time the program is changed. The time
+you spend on the man page is time taken away from more useful work.
+
+ For a simple program which changes little, updating the man page may
+be a small job. Then there is little reason not to include a man page,
+if you have one.
+
+ For a large program that changes a great deal, updating a man page
+may be a substantial burden. If a user offers to donate a man page,
+you may find this gift costly to accept. It may be better to refuse
+the man page unless the same person agrees to take full responsibility
+for maintaining it--so that you can wash your hands of it entirely. If
+this volunteer later ceases to do the job, then don't feel obliged to
+pick it up yourself; it may be better to withdraw the man page from the
+distribution until someone else agrees to update it.
+
+ When a program changes only a little, you may feel that the
+discrepancies are small enough that the man page remains useful without
+updating. If so, put a prominent note near the beginning of the man
+page explaining that you don't maintain it and that the Texinfo manual
+is more authoritative. The note should say how to access the Texinfo
+documentation.
+
+ Be sure that man pages include a copyright statement and free
+license. The simple all-permissive license is appropriate for simple
+man pages (*note License Notices for Other Files: (maintain)License
+Notices for Other Files.).
+
+ For long man pages, with enough explanation and documentation that
+they can be considered true manuals, use the GFDL (*note License for
+Manuals::).
+
+ Finally, the GNU help2man program
+(`http://www.gnu.org/software/help2man/') is one way to automate
+generation of a man page, in this case from `--help' output. This is
+sufficient in many cases.
+
+
+File: standards.info, Node: Reading other Manuals, Prev: Man Pages, Up: Documentation
+
+6.10 Reading other Manuals
+==========================
+
+There may be non-free books or documentation files that describe the
+program you are documenting.
+
+ It is ok to use these documents for reference, just as the author of
+a new algebra textbook can read other books on algebra. A large portion
+of any non-fiction book consists of facts, in this case facts about how
+a certain program works, and these facts are necessarily the same for
+everyone who writes about the subject. But be careful not to copy your
+outline structure, wording, tables or examples from preexisting non-free
+documentation. Copying from free documentation may be ok; please check
+with the FSF about the individual case.
+
+
+File: standards.info, Node: Managing Releases, Next: References, Prev: Documentation, Up: Top
+
+7 The Release Process
+*********************
+
+Making a release is more than just bundling up your source files in a
+tar file and putting it up for FTP. You should set up your software so
+that it can be configured to run on a variety of systems. Your Makefile
+should conform to the GNU standards described below, and your directory
+layout should also conform to the standards discussed below. Doing so
+makes it easy to include your package into the larger framework of all
+GNU software.
+
+* Menu:
+
+* Configuration:: How configuration of GNU packages should work.
+* Makefile Conventions:: Makefile conventions.
+* Releases:: Making releases
+
+
+File: standards.info, Node: Configuration, Next: Makefile Conventions, Up: Managing Releases
+
+7.1 How Configuration Should Work
+=================================
+
+Each GNU distribution should come with a shell script named
+`configure'. This script is given arguments which describe the kind of
+machine and system you want to compile the program for. The
+`configure' script must record the configuration options so that they
+affect compilation.
+
+ The description here is the specification of the interface for the
+`configure' script in GNU packages. Many packages implement it using
+GNU Autoconf (*note Introduction: (autoconf)Top.) and/or GNU Automake
+(*note Introduction: (automake)Top.), but you do not have to use these
+tools. You can implement it any way you like; for instance, by making
+`configure' be a wrapper around a completely different configuration
+system.
+
+ Another way for the `configure' script to operate is to make a link
+from a standard name such as `config.h' to the proper configuration
+file for the chosen system. If you use this technique, the
+distribution should _not_ contain a file named `config.h'. This is so
+that people won't be able to build the program without configuring it
+first.
+
+ Another thing that `configure' can do is to edit the Makefile. If
+you do this, the distribution should _not_ contain a file named
+`Makefile'. Instead, it should include a file `Makefile.in' which
+contains the input used for editing. Once again, this is so that people
+won't be able to build the program without configuring it first.
+
+ If `configure' does write the `Makefile', then `Makefile' should
+have a target named `Makefile' which causes `configure' to be rerun,
+setting up the same configuration that was set up last time. The files
+that `configure' reads should be listed as dependencies of `Makefile'.
+
+ All the files which are output from the `configure' script should
+have comments at the beginning explaining that they were generated
+automatically using `configure'. This is so that users won't think of
+trying to edit them by hand.
+
+ The `configure' script should write a file named `config.status'
+which describes which configuration options were specified when the
+program was last configured. This file should be a shell script which,
+if run, will recreate the same configuration.
+
+ The `configure' script should accept an option of the form
+`--srcdir=DIRNAME' to specify the directory where sources are found (if
+it is not the current directory). This makes it possible to build the
+program in a separate directory, so that the actual source directory is
+not modified.
+
+ If the user does not specify `--srcdir', then `configure' should
+check both `.' and `..' to see if it can find the sources. If it finds
+the sources in one of these places, it should use them from there.
+Otherwise, it should report that it cannot find the sources, and should
+exit with nonzero status.
+
+ Usually the easy way to support `--srcdir' is by editing a
+definition of `VPATH' into the Makefile. Some rules may need to refer
+explicitly to the specified source directory. To make this possible,
+`configure' can add to the Makefile a variable named `srcdir' whose
+value is precisely the specified directory.
+
+ In addition, the `configure' script should take options
+corresponding to most of the standard directory variables (*note
+Directory Variables::). Here is the list:
+
+ --prefix --exec-prefix --bindir --sbindir --libexecdir --sysconfdir
+ --sharedstatedir --localstatedir --libdir --includedir --oldincludedir
+ --datarootdir --datadir --infodir --localedir --mandir --docdir
+ --htmldir --dvidir --pdfdir --psdir
+
+ The `configure' script should also take an argument which specifies
+the type of system to build the program for. This argument should look
+like this:
+
+ CPU-COMPANY-SYSTEM
+
+ For example, an Athlon-based GNU/Linux system might be
+`i686-pc-linux-gnu'.
+
+ The `configure' script needs to be able to decode all plausible
+alternatives for how to describe a machine. Thus,
+`athlon-pc-gnu/linux' would be a valid alias. There is a shell script
+called `config.sub'
+(http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD)
+that you can use as a subroutine to validate system types and
+canonicalize aliases.
+
+ The `configure' script should also take the option
+`--build=BUILDTYPE', which should be equivalent to a plain BUILDTYPE
+argument. For example, `configure --build=i686-pc-linux-gnu' is
+equivalent to `configure i686-pc-linux-gnu'. When the build type is
+not specified by an option or argument, the `configure' script should
+normally guess it using the shell script `config.guess'
+(http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD).
+
+ Other options are permitted to specify in more detail the software
+or hardware present on the machine, to include or exclude optional parts
+of the package, or to adjust the name of some tools or arguments to
+them:
+
+`--enable-FEATURE[=PARAMETER]'
+ Configure the package to build and install an optional user-level
+ facility called FEATURE. This allows users to choose which
+ optional features to include. Giving an optional PARAMETER of
+ `no' should omit FEATURE, if it is built by default.
+
+ No `--enable' option should *ever* cause one feature to replace
+ another. No `--enable' option should ever substitute one useful
+ behavior for another useful behavior. The only proper use for
+ `--enable' is for questions of whether to build part of the program
+ or exclude it.
+
+`--with-PACKAGE'
+ The package PACKAGE will be installed, so configure this package
+ to work with PACKAGE.
+
+ Possible values of PACKAGE include `gnu-as' (or `gas'), `gnu-ld',
+ `gnu-libc', `gdb', `x', and `x-toolkit'.
+
+ Do not use a `--with' option to specify the file name to use to
+ find certain files. That is outside the scope of what `--with'
+ options are for.
+
+`VARIABLE=VALUE'
+ Set the value of the variable VARIABLE to VALUE. This is used to
+ override the default values of commands or arguments in the build
+ process. For example, the user could issue `configure CFLAGS=-g
+ CXXFLAGS=-g' to build with debugging information and without the
+ default optimization.
+
+ Specifying variables as arguments to `configure', like this:
+ ./configure CC=gcc
+ is preferable to setting them in environment variables:
+ CC=gcc ./configure
+ as it helps to recreate the same configuration later with
+ `config.status'. However, both methods should be supported.
+
+ All `configure' scripts should accept all of the "detail" options
+and the variable settings, whether or not they make any difference to
+the particular package at hand. In particular, they should accept any
+option that starts with `--with-' or `--enable-'. This is so users
+will be able to configure an entire GNU source tree at once with a
+single set of options.
+
+ You will note that the categories `--with-' and `--enable-' are
+narrow: they *do not* provide a place for any sort of option you might
+think of. That is deliberate. We want to limit the possible
+configuration options in GNU software. We do not want GNU programs to
+have idiosyncratic configuration options.
+
+ Packages that perform part of the compilation process may support
+cross-compilation. In such a case, the host and target machines for the
+program may be different.
+
+ The `configure' script should normally treat the specified type of
+system as both the host and the target, thus producing a program which
+works for the same type of machine that it runs on.
+
+ To compile a program to run on a host type that differs from the
+build type, use the configure option `--host=HOSTTYPE', where HOSTTYPE
+uses the same syntax as BUILDTYPE. The host type normally defaults to
+the build type.
+
+ To configure a cross-compiler, cross-assembler, or what have you, you
+should specify a target different from the host, using the configure
+option `--target=TARGETTYPE'. The syntax for TARGETTYPE is the same as
+for the host type. So the command would look like this:
+
+ ./configure --host=HOSTTYPE --target=TARGETTYPE
+
+ The target type normally defaults to the host type. Programs for
+which cross-operation is not meaningful need not accept the `--target'
+option, because configuring an entire operating system for
+cross-operation is not a meaningful operation.
+
+ Some programs have ways of configuring themselves automatically. If
+your program is set up to do this, your `configure' script can simply
+ignore most of its arguments.
+
+
+File: standards.info, Node: Makefile Conventions, Next: Releases, Prev: Configuration, Up: Managing Releases
+
+7.2 Makefile Conventions
+========================
+
+This node describes conventions for writing the Makefiles for GNU
+programs. Using Automake will help you write a Makefile that follows
+these conventions. For more information on portable Makefiles, see
+POSIX and *note Portable Make Programming: (autoconf)Portable Make.
+
+* Menu:
+
+* Makefile Basics:: General conventions for Makefiles.
+* Utilities in Makefiles:: Utilities to be used in Makefiles.
+* Command Variables:: Variables for specifying commands.
+* DESTDIR:: Supporting staged installs.
+* Directory Variables:: Variables for installation directories.
+* Standard Targets:: Standard targets for users.
+* Install Command Categories:: Three categories of commands in the `install'
+ rule: normal, pre-install and post-install.
+
+
+File: standards.info, Node: Makefile Basics, Next: Utilities in Makefiles, Up: Makefile Conventions
+
+7.2.1 General Conventions for Makefiles
+---------------------------------------
+
+Every Makefile should contain this line:
+
+ SHELL = /bin/sh
+
+to avoid trouble on systems where the `SHELL' variable might be
+inherited from the environment. (This is never a problem with GNU
+`make'.)
+
+ Different `make' programs have incompatible suffix lists and
+implicit rules, and this sometimes creates confusion or misbehavior. So
+it is a good idea to set the suffix list explicitly using only the
+suffixes you need in the particular Makefile, like this:
+
+ .SUFFIXES:
+ .SUFFIXES: .c .o
+
+The first line clears out the suffix list, the second introduces all
+suffixes which may be subject to implicit rules in this Makefile.
+
+ Don't assume that `.' is in the path for command execution. When
+you need to run programs that are a part of your package during the
+make, please make sure that it uses `./' if the program is built as
+part of the make or `$(srcdir)/' if the file is an unchanging part of
+the source code. Without one of these prefixes, the current search
+path is used.
+
+ The distinction between `./' (the "build directory") and
+`$(srcdir)/' (the "source directory") is important because users can
+build in a separate directory using the `--srcdir' option to
+`configure'. A rule of the form:
+
+ foo.1 : foo.man sedscript
+ sed -f sedscript foo.man > foo.1
+
+will fail when the build directory is not the source directory, because
+`foo.man' and `sedscript' are in the source directory.
+
+ When using GNU `make', relying on `VPATH' to find the source file
+will work in the case where there is a single dependency file, since
+the `make' automatic variable `$<' will represent the source file
+wherever it is. (Many versions of `make' set `$<' only in implicit
+rules.) A Makefile target like
+
+ foo.o : bar.c
+ $(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o
+
+should instead be written as
+
+ foo.o : bar.c
+ $(CC) -I. -I$(srcdir) $(CFLAGS) -c $< -o $@
+
+in order to allow `VPATH' to work correctly. When the target has
+multiple dependencies, using an explicit `$(srcdir)' is the easiest way
+to make the rule work well. For example, the target above for `foo.1'
+is best written as:
+
+ foo.1 : foo.man sedscript
+ sed -f $(srcdir)/sedscript $(srcdir)/foo.man > $@
+
+ GNU distributions usually contain some files which are not source
+files--for example, Info files, and the output from Autoconf, Automake,
+Bison or Flex. Since these files normally appear in the source
+directory, they should always appear in the source directory, not in the
+build directory. So Makefile rules to update them should put the
+updated files in the source directory.
+
+ However, if a file does not appear in the distribution, then the
+Makefile should not put it in the source directory, because building a
+program in ordinary circumstances should not modify the source directory
+in any way.
+
+ Try to make the build and installation targets, at least (and all
+their subtargets) work correctly with a parallel `make'.
+
+
+File: standards.info, Node: Utilities in Makefiles, Next: Command Variables, Prev: Makefile Basics, Up: Makefile Conventions
+
+7.2.2 Utilities in Makefiles
+----------------------------
+
+Write the Makefile commands (and any shell scripts, such as
+`configure') to run under `sh' (both the traditional Bourne shell and
+the POSIX shell), not `csh'. Don't use any special features of `ksh'
+or `bash', or POSIX features not widely supported in traditional Bourne
+`sh'.
+
+ The `configure' script and the Makefile rules for building and
+installation should not use any utilities directly except these:
+
+ awk cat cmp cp diff echo egrep expr false grep install-info ln ls
+ mkdir mv printf pwd rm rmdir sed sleep sort tar test touch tr true
+
+ Compression programs such as `gzip' can be used in the `dist' rule.
+
+ Generally, stick to the widely-supported (usually POSIX-specified)
+options and features of these programs. For example, don't use `mkdir
+-p', convenient as it may be, because a few systems don't support it at
+all and with others, it is not safe for parallel execution. For a list
+of known incompatibilities, see *note Portable Shell Programming:
+(autoconf)Portable Shell.
+
+ It is a good idea to avoid creating symbolic links in makefiles,
+since a few file systems don't support them.
+
+ The Makefile rules for building and installation can also use
+compilers and related programs, but should do so via `make' variables
+so that the user can substitute alternatives. Here are some of the
+programs we mean:
+
+ ar bison cc flex install ld ldconfig lex
+ make makeinfo ranlib texi2dvi yacc
+
+ Use the following `make' variables to run those programs:
+
+ $(AR) $(BISON) $(CC) $(FLEX) $(INSTALL) $(LD) $(LDCONFIG) $(LEX)
+ $(MAKE) $(MAKEINFO) $(RANLIB) $(TEXI2DVI) $(YACC)
+
+ When you use `ranlib' or `ldconfig', you should make sure nothing
+bad happens if the system does not have the program in question.
+Arrange to ignore an error from that command, and print a message before
+the command to tell the user that failure of this command does not mean
+a problem. (The Autoconf `AC_PROG_RANLIB' macro can help with this.)
+
+ If you use symbolic links, you should implement a fallback for
+systems that don't have symbolic links.
+
+ Additional utilities that can be used via Make variables are:
+
+ chgrp chmod chown mknod
+
+ It is ok to use other utilities in Makefile portions (or scripts)
+intended only for particular systems where you know those utilities
+exist.
+
+
+File: standards.info, Node: Command Variables, Next: DESTDIR, Prev: Utilities in Makefiles, Up: Makefile Conventions
+
+7.2.3 Variables for Specifying Commands
+---------------------------------------
+
+Makefiles should provide variables for overriding certain commands,
+options, and so on.
+
+ In particular, you should run most utility programs via variables.
+Thus, if you use Bison, have a variable named `BISON' whose default
+value is set with `BISON = bison', and refer to it with `$(BISON)'
+whenever you need to use Bison.
+
+ File management utilities such as `ln', `rm', `mv', and so on, need
+not be referred to through variables in this way, since users don't
+need to replace them with other programs.
+
+ Each program-name variable should come with an options variable that
+is used to supply options to the program. Append `FLAGS' to the
+program-name variable name to get the options variable name--for
+example, `BISONFLAGS'. (The names `CFLAGS' for the C compiler,
+`YFLAGS' for yacc, and `LFLAGS' for lex, are exceptions to this rule,
+but we keep them because they are standard.) Use `CPPFLAGS' in any
+compilation command that runs the preprocessor, and use `LDFLAGS' in
+any compilation command that does linking as well as in any direct use
+of `ld'.
+
+ If there are C compiler options that _must_ be used for proper
+compilation of certain files, do not include them in `CFLAGS'. Users
+expect to be able to specify `CFLAGS' freely themselves. Instead,
+arrange to pass the necessary options to the C compiler independently
+of `CFLAGS', by writing them explicitly in the compilation commands or
+by defining an implicit rule, like this:
+
+ CFLAGS = -g
+ ALL_CFLAGS = -I. $(CFLAGS)
+ .c.o:
+ $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $<
+
+ Do include the `-g' option in `CFLAGS', because that is not
+_required_ for proper compilation. You can consider it a default that
+is only recommended. If the package is set up so that it is compiled
+with GCC by default, then you might as well include `-O' in the default
+value of `CFLAGS' as well.
+
+ Put `CFLAGS' last in the compilation command, after other variables
+containing compiler options, so the user can use `CFLAGS' to override
+the others.
+
+ `CFLAGS' should be used in every invocation of the C compiler, both
+those which do compilation and those which do linking.
+
+ Every Makefile should define the variable `INSTALL', which is the
+basic command for installing a file into the system.
+
+ Every Makefile should also define the variables `INSTALL_PROGRAM'
+and `INSTALL_DATA'. (The default for `INSTALL_PROGRAM' should be
+`$(INSTALL)'; the default for `INSTALL_DATA' should be `${INSTALL} -m
+644'.) Then it should use those variables as the commands for actual
+installation, for executables and non-executables respectively.
+Minimal use of these variables is as follows:
+
+ $(INSTALL_PROGRAM) foo $(bindir)/foo
+ $(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a
+
+ However, it is preferable to support a `DESTDIR' prefix on the
+target files, as explained in the next section.
+
+ It is acceptable, but not required, to install multiple files in one
+command, with the final argument being a directory, as in:
+
+ $(INSTALL_PROGRAM) foo bar baz $(bindir)
+
+
+File: standards.info, Node: DESTDIR, Next: Directory Variables, Prev: Command Variables, Up: Makefile Conventions
+
+7.2.4 `DESTDIR': Support for Staged Installs
+--------------------------------------------
+
+`DESTDIR' is a variable prepended to each installed target file, like
+this:
+
+ $(INSTALL_PROGRAM) foo $(DESTDIR)$(bindir)/foo
+ $(INSTALL_DATA) libfoo.a $(DESTDIR)$(libdir)/libfoo.a
+
+ The `DESTDIR' variable is specified by the user on the `make'
+command line as an absolute file name. For example:
+
+ make DESTDIR=/tmp/stage install
+
+`DESTDIR' should be supported only in the `install*' and `uninstall*'
+targets, as those are the only targets where it is useful.
+
+ If your installation step would normally install
+`/usr/local/bin/foo' and `/usr/local/lib/libfoo.a', then an
+installation invoked as in the example above would install
+`/tmp/stage/usr/local/bin/foo' and `/tmp/stage/usr/local/lib/libfoo.a'
+instead.
+
+ Prepending the variable `DESTDIR' to each target in this way
+provides for "staged installs", where the installed files are not
+placed directly into their expected location but are instead copied
+into a temporary location (`DESTDIR'). However, installed files
+maintain their relative directory structure and any embedded file names
+will not be modified.
+
+ You should not set the value of `DESTDIR' in your `Makefile' at all;
+then the files are installed into their expected locations by default.
+Also, specifying `DESTDIR' should not change the operation of the
+software in any way, so its value should not be included in any file
+contents.
+
+ `DESTDIR' support is commonly used in package creation. It is also
+helpful to users who want to understand what a given package will
+install where, and to allow users who don't normally have permissions
+to install into protected areas to build and install before gaining
+those permissions. Finally, it can be useful with tools such as
+`stow', where code is installed in one place but made to appear to be
+installed somewhere else using symbolic links or special mount
+operations. So, we strongly recommend GNU packages support `DESTDIR',
+though it is not an absolute requirement.
+
+
+File: standards.info, Node: Directory Variables, Next: Standard Targets, Prev: DESTDIR, Up: Makefile Conventions
+
+7.2.5 Variables for Installation Directories
+--------------------------------------------
+
+Installation directories should always be named by variables, so it is
+easy to install in a nonstandard place. The standard names for these
+variables and the values they should have in GNU packages are described
+below. They are based on a standard file system layout; variants of it
+are used in GNU/Linux and other modern operating systems.
+
+ Installers are expected to override these values when calling `make'
+(e.g., `make prefix=/usr install' or `configure' (e.g., `configure
+--prefix=/usr'). GNU packages should not try to guess which value
+should be appropriate for these variables on the system they are being
+installed onto: use the default settings specified here so that all GNU
+packages behave identically, allowing the installer to achieve any
+desired layout.
+
+ All installation directories, and their parent directories, should be
+created (if necessary) before they are installed into.
+
+ These first two variables set the root for the installation. All the
+other installation directories should be subdirectories of one of these
+two, and nothing should be directly installed into these two
+directories.
+
+`prefix'
+ A prefix used in constructing the default values of the variables
+ listed below. The default value of `prefix' should be
+ `/usr/local'. When building the complete GNU system, the prefix
+ will be empty and `/usr' will be a symbolic link to `/'. (If you
+ are using Autoconf, write it as `@prefix@'.)
+
+ Running `make install' with a different value of `prefix' from the
+ one used to build the program should _not_ recompile the program.
+
+`exec_prefix'
+ A prefix used in constructing the default values of some of the
+ variables listed below. The default value of `exec_prefix' should
+ be `$(prefix)'. (If you are using Autoconf, write it as
+ `@exec_prefix@'.)
+
+ Generally, `$(exec_prefix)' is used for directories that contain
+ machine-specific files (such as executables and subroutine
+ libraries), while `$(prefix)' is used directly for other
+ directories.
+
+ Running `make install' with a different value of `exec_prefix'
+ from the one used to build the program should _not_ recompile the
+ program.
+
+ Executable programs are installed in one of the following
+directories.
+
+`bindir'
+ The directory for installing executable programs that users can
+ run. This should normally be `/usr/local/bin', but write it as
+ `$(exec_prefix)/bin'. (If you are using Autoconf, write it as
+ `@bindir@'.)
+
+`sbindir'
+ The directory for installing executable programs that can be run
+ from the shell, but are only generally useful to system
+ administrators. This should normally be `/usr/local/sbin', but
+ write it as `$(exec_prefix)/sbin'. (If you are using Autoconf,
+ write it as `@sbindir@'.)
+
+`libexecdir'
+ The directory for installing executable programs to be run by other
+ programs rather than by users. This directory should normally be
+ `/usr/local/libexec', but write it as `$(exec_prefix)/libexec'.
+ (If you are using Autoconf, write it as `@libexecdir@'.)
+
+ The definition of `libexecdir' is the same for all packages, so
+ you should install your data in a subdirectory thereof. Most
+ packages install their data under `$(libexecdir)/PACKAGE-NAME/',
+ possibly within additional subdirectories thereof, such as
+ `$(libexecdir)/PACKAGE-NAME/MACHINE/VERSION'.
+
+ Data files used by the program during its execution are divided into
+categories in two ways.
+
+ * Some files are normally modified by programs; others are never
+ normally modified (though users may edit some of these).
+
+ * Some files are architecture-independent and can be shared by all
+ machines at a site; some are architecture-dependent and can be
+ shared only by machines of the same kind and operating system;
+ others may never be shared between two machines.
+
+ This makes for six different possibilities. However, we want to
+discourage the use of architecture-dependent files, aside from object
+files and libraries. It is much cleaner to make other data files
+architecture-independent, and it is generally not hard.
+
+ Here are the variables Makefiles should use to specify directories
+to put these various kinds of files in:
+
+`datarootdir'
+ The root of the directory tree for read-only
+ architecture-independent data files. This should normally be
+ `/usr/local/share', but write it as `$(prefix)/share'. (If you
+ are using Autoconf, write it as `@datarootdir@'.) `datadir''s
+ default value is based on this variable; so are `infodir',
+ `mandir', and others.
+
+`datadir'
+ The directory for installing idiosyncratic read-only
+ architecture-independent data files for this program. This is
+ usually the same place as `datarootdir', but we use the two
+ separate variables so that you can move these program-specific
+ files without altering the location for Info files, man pages, etc.
+
+ This should normally be `/usr/local/share', but write it as
+ `$(datarootdir)'. (If you are using Autoconf, write it as
+ `@datadir@'.)
+
+ The definition of `datadir' is the same for all packages, so you
+ should install your data in a subdirectory thereof. Most packages
+ install their data under `$(datadir)/PACKAGE-NAME/'.
+
+`sysconfdir'
+ The directory for installing read-only data files that pertain to a
+ single machine-that is to say, files for configuring a host.
+ Mailer and network configuration files, `/etc/passwd', and so
+ forth belong here. All the files in this directory should be
+ ordinary ASCII text files. This directory should normally be
+ `/usr/local/etc', but write it as `$(prefix)/etc'. (If you are
+ using Autoconf, write it as `@sysconfdir@'.)
+
+ Do not install executables here in this directory (they probably
+ belong in `$(libexecdir)' or `$(sbindir)'). Also do not install
+ files that are modified in the normal course of their use (programs
+ whose purpose is to change the configuration of the system
+ excluded). Those probably belong in `$(localstatedir)'.
+
+`sharedstatedir'
+ The directory for installing architecture-independent data files
+ which the programs modify while they run. This should normally be
+ `/usr/local/com', but write it as `$(prefix)/com'. (If you are
+ using Autoconf, write it as `@sharedstatedir@'.)
+
+`localstatedir'
+ The directory for installing data files which the programs modify
+ while they run, and that pertain to one specific machine. Users
+ should never need to modify files in this directory to configure
+ the package's operation; put such configuration information in
+ separate files that go in `$(datadir)' or `$(sysconfdir)'.
+ `$(localstatedir)' should normally be `/usr/local/var', but write
+ it as `$(prefix)/var'. (If you are using Autoconf, write it as
+ `@localstatedir@'.)
+
+ These variables specify the directory for installing certain specific
+types of files, if your program has them. Every GNU package should
+have Info files, so every program needs `infodir', but not all need
+`libdir' or `lispdir'.
+
+`includedir'
+ The directory for installing header files to be included by user
+ programs with the C `#include' preprocessor directive. This
+ should normally be `/usr/local/include', but write it as
+ `$(prefix)/include'. (If you are using Autoconf, write it as
+ `@includedir@'.)
+
+ Most compilers other than GCC do not look for header files in
+ directory `/usr/local/include'. So installing the header files
+ this way is only useful with GCC. Sometimes this is not a problem
+ because some libraries are only really intended to work with GCC.
+ But some libraries are intended to work with other compilers.
+ They should install their header files in two places, one
+ specified by `includedir' and one specified by `oldincludedir'.
+
+`oldincludedir'
+ The directory for installing `#include' header files for use with
+ compilers other than GCC. This should normally be `/usr/include'.
+ (If you are using Autoconf, you can write it as `@oldincludedir@'.)
+
+ The Makefile commands should check whether the value of
+ `oldincludedir' is empty. If it is, they should not try to use
+ it; they should cancel the second installation of the header files.
+
+ A package should not replace an existing header in this directory
+ unless the header came from the same package. Thus, if your Foo
+ package provides a header file `foo.h', then it should install the
+ header file in the `oldincludedir' directory if either (1) there
+ is no `foo.h' there or (2) the `foo.h' that exists came from the
+ Foo package.
+
+ To tell whether `foo.h' came from the Foo package, put a magic
+ string in the file--part of a comment--and `grep' for that string.
+
+`docdir'
+ The directory for installing documentation files (other than Info)
+ for this package. By default, it should be
+ `/usr/local/share/doc/YOURPKG', but it should be written as
+ `$(datarootdir)/doc/YOURPKG'. (If you are using Autoconf, write
+ it as `@docdir@'.) The YOURPKG subdirectory, which may include a
+ version number, prevents collisions among files with common names,
+ such as `README'.
+
+`infodir'
+ The directory for installing the Info files for this package. By
+ default, it should be `/usr/local/share/info', but it should be
+ written as `$(datarootdir)/info'. (If you are using Autoconf,
+ write it as `@infodir@'.) `infodir' is separate from `docdir' for
+ compatibility with existing practice.
+
+`htmldir'
+`dvidir'
+`pdfdir'
+`psdir'
+ Directories for installing documentation files in the particular
+ format. They should all be set to `$(docdir)' by default. (If
+ you are using Autoconf, write them as `@htmldir@', `@dvidir@',
+ etc.) Packages which supply several translations of their
+ documentation should install them in `$(htmldir)/'LL,
+ `$(pdfdir)/'LL, etc. where LL is a locale abbreviation such as
+ `en' or `pt_BR'.
+
+`libdir'
+ The directory for object files and libraries of object code. Do
+ not install executables here, they probably ought to go in
+ `$(libexecdir)' instead. The value of `libdir' should normally be
+ `/usr/local/lib', but write it as `$(exec_prefix)/lib'. (If you
+ are using Autoconf, write it as `@libdir@'.)
+
+`lispdir'
+ The directory for installing any Emacs Lisp files in this package.
+ By default, it should be `/usr/local/share/emacs/site-lisp', but it
+ should be written as `$(datarootdir)/emacs/site-lisp'.
+
+ If you are using Autoconf, write the default as `@lispdir@'. In
+ order to make `@lispdir@' work, you need the following lines in
+ your `configure.in' file:
+
+ lispdir='${datarootdir}/emacs/site-lisp'
+ AC_SUBST(lispdir)
+
+`localedir'
+ The directory for installing locale-specific message catalogs for
+ this package. By default, it should be `/usr/local/share/locale',
+ but it should be written as `$(datarootdir)/locale'. (If you are
+ using Autoconf, write it as `@localedir@'.) This directory
+ usually has a subdirectory per locale.
+
+ Unix-style man pages are installed in one of the following:
+
+`mandir'
+ The top-level directory for installing the man pages (if any) for
+ this package. It will normally be `/usr/local/share/man', but you
+ should write it as `$(datarootdir)/man'. (If you are using
+ Autoconf, write it as `@mandir@'.)
+
+`man1dir'
+ The directory for installing section 1 man pages. Write it as
+ `$(mandir)/man1'.
+
+`man2dir'
+ The directory for installing section 2 man pages. Write it as
+ `$(mandir)/man2'
+
+`...'
+ *Don't make the primary documentation for any GNU software be a
+ man page. Write a manual in Texinfo instead. Man pages are just
+ for the sake of people running GNU software on Unix, which is a
+ secondary application only.*
+
+`manext'
+ The file name extension for the installed man page. This should
+ contain a period followed by the appropriate digit; it should
+ normally be `.1'.
+
+`man1ext'
+ The file name extension for installed section 1 man pages.
+
+`man2ext'
+ The file name extension for installed section 2 man pages.
+
+`...'
+ Use these names instead of `manext' if the package needs to
+ install man pages in more than one section of the manual.
+
+ And finally, you should set the following variable:
+
+`srcdir'
+ The directory for the sources being compiled. The value of this
+ variable is normally inserted by the `configure' shell script.
+ (If you are using Autoconf, use `srcdir = @srcdir@'.)
+
+ For example:
+
+ # Common prefix for installation directories.
+ # NOTE: This directory must exist when you start the install.
+ prefix = /usr/local
+ datarootdir = $(prefix)/share
+ datadir = $(datarootdir)
+ exec_prefix = $(prefix)
+ # Where to put the executable for the command `gcc'.
+ bindir = $(exec_prefix)/bin
+ # Where to put the directories used by the compiler.
+ libexecdir = $(exec_prefix)/libexec
+ # Where to put the Info files.
+ infodir = $(datarootdir)/info
+
+ If your program installs a large number of files into one of the
+standard user-specified directories, it might be useful to group them
+into a subdirectory particular to that program. If you do this, you
+should write the `install' rule to create these subdirectories.
+
+ Do not expect the user to include the subdirectory name in the value
+of any of the variables listed above. The idea of having a uniform set
+of variable names for installation directories is to enable the user to
+specify the exact same values for several different GNU packages. In
+order for this to be useful, all the packages must be designed so that
+they will work sensibly when the user does so.
+
+ At times, not all of these variables may be implemented in the
+current release of Autoconf and/or Automake; but as of Autoconf 2.60, we
+believe all of them are. When any are missing, the descriptions here
+serve as specifications for what Autoconf will implement. As a
+programmer, you can either use a development version of Autoconf or
+avoid using these variables until a stable release is made which
+supports them.
+
+
+File: standards.info, Node: Standard Targets, Next: Install Command Categories, Prev: Directory Variables, Up: Makefile Conventions
+
+7.2.6 Standard Targets for Users
+--------------------------------
+
+All GNU programs should have the following targets in their Makefiles:
+
+`all'
+ Compile the entire program. This should be the default target.
+ This target need not rebuild any documentation files; Info files
+ should normally be included in the distribution, and DVI (and other
+ documentation format) files should be made only when explicitly
+ asked for.
+
+ By default, the Make rules should compile and link with `-g', so
+ that executable programs have debugging symbols. Otherwise, you
+ are essentially helpless in the face of a crash, and it is often
+ far from easy to reproduce with a fresh build.
+
+`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.
+
+ Do not strip executables when installing them. This helps eventual
+ debugging that may be needed later, and nowadays disk space is
+ cheap and dynamic loaders typically ensure debug sections are not
+ loaded during normal execution. Users that need stripped binaries
+ may invoke the `install-strip' target to do that.
+
+ If possible, write the `install' target rule so that it does not
+ modify anything in the directory where the program was built,
+ provided `make all' has just been done. This is convenient for
+ building the program under one user name and installing it under
+ another.
+
+ 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 way to install Info files is to copy them into `$(infodir)'
+ with `$(INSTALL_DATA)' (*note Command Variables::), and then run
+ the `install-info' program if it is present. `install-info' is a
+ program that edits the Info `dir' file to add or update the menu
+ entry for the given Info file; it is part of the Texinfo package.
+
+ Here is a sample rule to install an Info file that also tries to
+ handle some additional situations, such as `install-info' not
+ being present.
+
+ do-install-info: foo.info installdirs
+ $(NORMAL_INSTALL)
+ # Prefer an info file in . to one in srcdir.
+ if test -f foo.info; then d=.; \
+ else d="$(srcdir)"; fi; \
+ $(INSTALL_DATA) $$d/foo.info \
+ "$(DESTDIR)$(infodir)/foo.info"
+ # Run install-info only if it exists.
+ # Use `if' instead of just prepending `-' to the
+ # line so we notice real errors from install-info.
+ # Use `$(SHELL) -c' because some shells do not
+ # fail gracefully when there is an unknown command.
+ $(POST_INSTALL)
+ if $(SHELL) -c 'install-info --version' \
+ >/dev/null 2>&1; then \
+ install-info --dir-file="$(DESTDIR)$(infodir)/dir" \
+ "$(DESTDIR)$(infodir)/foo.info"; \
+ else true; fi
+
+ When writing the `install' target, you must classify all the
+ commands into three categories: normal ones, "pre-installation"
+ commands and "post-installation" commands. *Note Install Command
+ Categories::.
+
+`install-html'
+`install-dvi'
+`install-pdf'
+`install-ps'
+ These targets install documentation in formats other than Info;
+ they're intended to be called explicitly by the person installing
+ the package, if that format is desired. GNU prefers Info files,
+ so these must be installed by the `install' target.
+
+ When you have many documentation files to install, we recommend
+ that you avoid collisions and clutter by arranging for these
+ targets to install in subdirectories of the appropriate
+ installation directory, such as `htmldir'. As one example, if
+ your package has multiple manuals, and you wish to install HTML
+ documentation with many files (such as the "split" mode output by
+ `makeinfo --html'), you'll certainly want to use subdirectories,
+ or two nodes with the same name in different manuals will
+ overwrite each other.
+
+ Please make these `install-FORMAT' targets invoke the commands for
+ the FORMAT target, for example, by making FORMAT a dependency.
+
+`uninstall'
+ Delete all the installed files--the copies that the `install' and
+ `install-*' targets create.
+
+ This rule should not modify the directories where compilation is
+ done, only the directories where files are installed.
+
+ The uninstallation commands are divided into three categories,
+ just like the installation commands. *Note Install Command
+ Categories::.
+
+`install-strip'
+ Like `install', but strip the executable files while installing
+ them. In simple cases, this target can use the `install' target in
+ a simple way:
+
+ install-strip:
+ $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
+ install
+
+ But if the package installs scripts as well as real executables,
+ the `install-strip' target can't just refer to the `install'
+ target; it has to strip the executables but not the scripts.
+
+ `install-strip' should not strip the executables in the build
+ directory which are being copied for installation. It should only
+ strip the copies that are installed.
+
+ Normally we do not recommend stripping an executable unless you
+ are sure the program has no bugs. However, it can be reasonable
+ to install a stripped executable for actual execution while saving
+ the unstripped executable elsewhere in case there is a bug.
+
+`clean'
+ Delete all files in the current directory that are normally
+ created by building the program. Also delete files in other
+ directories if they are created by this makefile. However, don't
+ delete the files that record the configuration. Also preserve
+ files that could be made by building, but normally aren't because
+ the distribution comes with them. There is no need to delete
+ parent directories that were created with `mkdir -p', since they
+ could have existed anyway.
+
+ Delete `.dvi' files here if they are not part of the distribution.
+
+`distclean'
+ Delete all files in the current directory (or created by this
+ makefile) that are created by configuring or building the program.
+ If you have unpacked the source and built the program without
+ creating any other files, `make distclean' should leave only the
+ files that were in the distribution. However, there is no need to
+ delete parent directories that were created with `mkdir -p', since
+ they could have existed anyway.
+
+`mostlyclean'
+ Like `clean', but may refrain from deleting a few files that people
+ normally don't want to recompile. For example, the `mostlyclean'
+ target for GCC does not delete `libgcc.a', because recompiling it
+ is rarely necessary and takes a lot of time.
+
+`maintainer-clean'
+ Delete almost everything that can be reconstructed with this
+ Makefile. This typically includes everything deleted by
+ `distclean', plus more: C source files produced by Bison, tags
+ tables, Info files, and so on.
+
+ The reason we say "almost everything" is that running the command
+ `make maintainer-clean' should not delete `configure' even if
+ `configure' can be remade using a rule in the Makefile. More
+ generally, `make maintainer-clean' should not delete anything that
+ needs to exist in order to run `configure' and then begin to build
+ the program. Also, there is no need to delete parent directories
+ that were created with `mkdir -p', since they could have existed
+ anyway. These are the only exceptions; `maintainer-clean' should
+ delete everything else that can be rebuilt.
+
+ The `maintainer-clean' target is intended to be used by a
+ maintainer of the package, not by ordinary users. You may need
+ special tools to reconstruct some of the files that `make
+ maintainer-clean' deletes. Since these files are normally
+ included in the distribution, we don't take care to make them easy
+ to reconstruct. If you find you need to unpack the full
+ distribution again, don't blame us.
+
+ To help make users aware of this, the commands for the special
+ `maintainer-clean' target should start with these two:
+
+ @echo 'This command is intended for maintainers to use; it'
+ @echo 'deletes files that may need special tools to rebuild.'
+
+`TAGS'
+ Update a tags table for this program.
+
+`info'
+ Generate any Info files needed. The best way to write the rules
+ is as follows:
+
+ info: foo.info
+
+ foo.info: foo.texi chap1.texi chap2.texi
+ $(MAKEINFO) $(srcdir)/foo.texi
+
+ You must define the variable `MAKEINFO' in the Makefile. It should
+ run the `makeinfo' program, which is part of the Texinfo
+ distribution.
+
+ Normally a GNU distribution comes with Info files, and that means
+ the Info files are present in the source directory. Therefore,
+ the Make rule for an info file should update it in the source
+ directory. When users build the package, ordinarily Make will not
+ update the Info files because they will already be up to date.
+
+`dvi'
+`html'
+`pdf'
+`ps'
+ Generate documentation files in the given format. These targets
+ should always exist, but any or all can be a no-op if the given
+ output format cannot be generated. These targets should not be
+ dependencies of the `all' target; the user must manually invoke
+ them.
+
+ Here's an example rule for generating DVI files from Texinfo:
+
+ dvi: foo.dvi
+
+ foo.dvi: foo.texi chap1.texi chap2.texi
+ $(TEXI2DVI) $(srcdir)/foo.texi
+
+ You must define the variable `TEXI2DVI' in the Makefile. It
+ should run the program `texi2dvi', which is part of the Texinfo
+ distribution. (`texi2dvi' uses TeX to do the real work of
+ formatting. TeX is not distributed with Texinfo.) Alternatively,
+ write only the dependencies, and allow GNU `make' to provide the
+ command.
+
+ Here's another example, this one for generating HTML from Texinfo:
+
+ html: foo.html
+
+ foo.html: foo.texi chap1.texi chap2.texi
+ $(TEXI2HTML) $(srcdir)/foo.texi
+
+ Again, you would define the variable `TEXI2HTML' in the Makefile;
+ for example, it might run `makeinfo --no-split --html' (`makeinfo'
+ is part of the Texinfo distribution).
+
+`dist'
+ Create a distribution tar file for this program. The tar file
+ should be set up so that the file names in the tar file start with
+ a subdirectory name which is the name of the package it is a
+ distribution for. This name can include the version number.
+
+ For example, the distribution tar file of GCC version 1.40 unpacks
+ into a subdirectory named `gcc-1.40'.
+
+ The easiest way to do this is to create a subdirectory
+ appropriately named, use `ln' or `cp' to install the proper files
+ in it, and then `tar' that subdirectory.
+
+ Compress the tar file with `gzip'. For example, the actual
+ distribution file for GCC version 1.40 is called `gcc-1.40.tar.gz'.
+ It is ok to support other free compression formats as well.
+
+ The `dist' target should explicitly depend on all non-source files
+ that are in the distribution, to make sure they are up to date in
+ the distribution. *Note Making Releases: Releases.
+
+`check'
+ Perform self-tests (if any). The user must build the program
+ before running the tests, but need not install the program; you
+ should write the self-tests so that they work when the program is
+ built but not 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; you can find it in the Gnulib package. You
+ can use a rule like this:
+
+ # Make sure all installation directories (e.g. $(bindir))
+ # actually exist by making them if necessary.
+ installdirs: mkinstalldirs
+ $(srcdir)/mkinstalldirs $(bindir) $(datadir) \
+ $(libdir) $(infodir) \
+ $(mandir)
+
+ or, if you wish to support `DESTDIR' (strongly encouraged),
+
+ # Make sure all installation directories (e.g. $(bindir))
+ # actually exist by making them if necessary.
+ installdirs: mkinstalldirs
+ $(srcdir)/mkinstalldirs \
+ $(DESTDIR)$(bindir) $(DESTDIR)$(datadir) \
+ $(DESTDIR)$(libdir) $(DESTDIR)$(infodir) \
+ $(DESTDIR)$(mandir)
+
+ This rule should not modify the directories where compilation is
+ done. It should do nothing but create installation directories.
+
+
+File: standards.info, Node: Install Command Categories, Prev: Standard Targets, Up: Makefile Conventions
+
+7.2.7 Install Command Categories
+--------------------------------
+
+When writing the `install' target, you must classify all the commands
+into three categories: normal ones, "pre-installation" commands and
+"post-installation" commands.
+
+ Normal commands move files into their proper places, and set their
+modes. They may not alter any files except the ones that come entirely
+from the package they belong to.
+
+ Pre-installation and post-installation commands may alter other
+files; in particular, they can edit global configuration files or data
+bases.
+
+ Pre-installation commands are typically executed before the normal
+commands, and post-installation commands are typically run after the
+normal commands.
+
+ The most common use for a post-installation command is to run
+`install-info'. This cannot be done with a normal command, since it
+alters a file (the Info directory) which does not come entirely and
+solely from the package being installed. It is a post-installation
+command because it needs to be done after the normal command which
+installs the package's Info files.
+
+ Most programs don't need any pre-installation commands, but we have
+the feature just in case it is needed.
+
+ To classify the commands in the `install' rule into these three
+categories, insert "category lines" among them. A category line
+specifies the category for the commands that follow.
+
+ A category line consists of a tab and a reference to a special Make
+variable, plus an optional comment at the end. There are three
+variables you can use, one for each category; the variable name
+specifies the category. Category lines are no-ops in ordinary execution
+because these three Make variables are normally undefined (and you
+_should not_ define them in the makefile).
+
+ Here are the three possible category lines, each with a comment that
+explains what it means:
+
+ $(PRE_INSTALL) # Pre-install commands follow.
+ $(POST_INSTALL) # Post-install commands follow.
+ $(NORMAL_INSTALL) # Normal commands follow.
+
+ If you don't use a category line at the beginning of the `install'
+rule, all the commands are classified as normal until the first category
+line. If you don't use any category lines, all the commands are
+classified as normal.
+
+ These are the category lines for `uninstall':
+
+ $(PRE_UNINSTALL) # Pre-uninstall commands follow.
+ $(POST_UNINSTALL) # Post-uninstall commands follow.
+ $(NORMAL_UNINSTALL) # Normal commands follow.
+
+ Typically, a pre-uninstall command would be used for deleting entries
+from the Info directory.
+
+ If the `install' or `uninstall' target has any dependencies which
+act as subroutines of installation, then you should start _each_
+dependency's commands with a category line, and start the main target's
+commands with a category line also. This way, you can ensure that each
+command is placed in the right category regardless of which of the
+dependencies actually run.
+
+ Pre-installation and post-installation commands should not run any
+programs except for these:
+
+ [ basename bash cat chgrp chmod chown cmp cp dd diff echo
+ egrep expand expr false fgrep find getopt grep gunzip gzip
+ hostname install install-info kill ldconfig ln ls md5sum
+ mkdir mkfifo mknod mv printenv pwd rm rmdir sed sort tee
+ test touch true uname xargs yes
+
+ The reason for distinguishing the commands in this way is for the
+sake of making binary packages. Typically a binary package contains
+all the executables and other files that need to be installed, and has
+its own method of installing them--so it does not need to run the normal
+installation commands. But installing the binary package does need to
+execute the pre-installation and post-installation commands.
+
+ Programs to build binary packages work by extracting the
+pre-installation and post-installation commands. Here is one way of
+extracting the pre-installation commands (the `-s' option to `make' is
+needed to silence messages about entering subdirectories):
+
+ make -s -n install -o all \
+ PRE_INSTALL=pre-install \
+ POST_INSTALL=post-install \
+ NORMAL_INSTALL=normal-install \
+ | gawk -f pre-install.awk
+
+where the file `pre-install.awk' could contain this:
+
+ $0 ~ /^(normal-install|post-install)[ \t]*$/ {on = 0}
+ on {print $0}
+ $0 ~ /^pre-install[ \t]*$/ {on = 1}
+
+
+File: standards.info, Node: Releases, Prev: Makefile Conventions, Up: Managing Releases
+
+7.3 Making Releases
+===================
+
+You should identify each release with a pair of version numbers, a
+major version and a minor. We have no objection to using more than two
+numbers, but it is very unlikely that you really need them.
+
+ Package the distribution of `Foo version 69.96' up in a gzipped tar
+file with the name `foo-69.96.tar.gz'. It should unpack into a
+subdirectory named `foo-69.96'.
+
+ Building and installing the program should never modify any of the
+files contained in the distribution. This means that all the files
+that form part of the program in any way must be classified into "source
+files" and "non-source files". Source files are written by humans and
+never changed automatically; non-source files are produced from source
+files by programs under the control of the Makefile.
+
+ The distribution should contain a file named `README' which gives
+the name of the package, and a general description of what it does. It
+is also good to explain the purpose of each of the first-level
+subdirectories in the package, if there are any. The `README' file
+should either state the version number of the package, or refer to where
+in the package it can be found.
+
+ The `README' file should refer to the file `INSTALL', which should
+contain an explanation of the installation procedure.
+
+ The `README' file should also refer to the file which contains the
+copying conditions. The GNU GPL, if used, should be in a file called
+`COPYING'. If the GNU LGPL is used, it should be in a file called
+`COPYING.LESSER'.
+
+ Naturally, all the source files must be in the distribution. It is
+okay to include non-source files in the distribution along with the
+source files they are generated from, provided they are up-to-date with
+the source they are made from, and machine-independent, so that normal
+building of the distribution will never modify them. We commonly
+include non-source files produced by Autoconf, Automake, Bison, `lex',
+TeX, and `makeinfo'; this helps avoid unnecessary dependencies between
+our distributions, so that users can install whichever packages they
+want to install.
+
+ Non-source files that might actually be modified by building and
+installing the program should *never* be included in the distribution.
+So if you do distribute non-source files, always make sure they are up
+to date when you make a new distribution.
+
+ Make sure that all the files in the distribution are world-readable,
+and that directories are world-readable and world-searchable (octal
+mode 755). We used to recommend that all directories in the
+distribution also be world-writable (octal mode 777), because ancient
+versions of `tar' would otherwise not cope when extracting the archive
+as an unprivileged user. That can easily lead to security issues when
+creating the archive, however, so now we recommend against that.
+
+ Don't include any symbolic links in the distribution itself. If the
+tar file contains symbolic links, then people cannot even unpack it on
+systems that don't support symbolic links. Also, don't use multiple
+names for one file in different directories, because certain file
+systems cannot handle this and that prevents unpacking the distribution.
+
+ Try to make sure that all the file names will be unique on MS-DOS. A
+name on MS-DOS consists of up to 8 characters, optionally followed by a
+period and up to three characters. MS-DOS will truncate extra
+characters both before and after the period. Thus, `foobarhacker.c'
+and `foobarhacker.o' are not ambiguous; they are truncated to
+`foobarha.c' and `foobarha.o', which are distinct.
+
+ Include in your distribution a copy of the `texinfo.tex' you used to
+test print any `*.texinfo' or `*.texi' files.
+
+ Likewise, if your program uses small GNU software packages like
+regex, getopt, obstack, or termcap, include them in the distribution
+file. Leaving them out would make the distribution file a little
+smaller at the expense of possible inconvenience to a user who doesn't
+know what other files to get.
+
+
+File: standards.info, Node: References, Next: GNU Free Documentation License, Prev: Managing Releases, Up: Top
+
+8 References to Non-Free Software and Documentation
+***************************************************
+
+A GNU program should not recommend, promote, or grant legitimacy to the
+use of any non-free program. Proprietary software is a social and
+ethical problem, and our aim is to put an end to that problem. We
+can't stop some people from writing proprietary programs, or stop other
+people from using them, but we can and should refuse to advertise them
+to new potential customers, or to give the public the idea that their
+existence is ethical.
+
+ The GNU definition of free software is found on the GNU web site at
+`http://www.gnu.org/philosophy/free-sw.html', and the definition of
+free documentation is found at
+`http://www.gnu.org/philosophy/free-doc.html'. The terms "free" and
+"non-free", used in this document, refer to those definitions.
+
+ A list of important licenses and whether they qualify as free is in
+`http://www.gnu.org/licenses/license-list.html'. If it is not clear
+whether a license qualifies as free, please ask the GNU Project by
+writing to <licensing@gnu.org>. We will answer, and if the license is
+an important one, we will add it to the list.
+
+ When a non-free program or system is well known, you can mention it
+in passing--that is harmless, since users who might want to use it
+probably already know about it. For instance, it is fine to explain
+how to build your package on top of some widely used non-free operating
+system, or how to use it together with some widely used non-free
+program.
+
+ However, you should give only the necessary information to help those
+who already use the non-free program to use your program with it--don't
+give, or refer to, any further information about the proprietary
+program, and don't imply that the proprietary program enhances your
+program, or that its existence is in any way a good thing. The goal
+should be that people already using the proprietary program will get
+the advice they need about how to use your free program with it, while
+people who don't already use the proprietary program will not see
+anything likely to lead them to take an interest in it.
+
+ If a non-free program or system is obscure in your program's domain,
+your program should not mention or support it at all, since doing so
+would tend to popularize the non-free program more than it popularizes
+your program. (You cannot hope to find many additional users for your
+program among the users of Foobar, if the existence of Foobar is not
+generally known among people who might want to use your program.)
+
+ Sometimes a program is free software in itself but depends on a
+non-free platform in order to run. For instance, many Java programs
+depend on some non-free Java libraries. To recommend or promote such a
+program is to promote the other programs it needs. This is why we are
+careful about listing Java programs in the Free Software Directory: we
+don't want to promote the non-free Java libraries.
+
+ We hope this particular problem with Java will be gone by and by, as
+we replace the remaining non-free standard Java libraries with free
+software, but the general principle will remain the same: don't
+recommend, promote or legitimize programs that depend on non-free
+software to run.
+
+ Some free programs strongly encourage the use of non-free software.
+A typical example is `mplayer'. It is free software in itself, and the
+free code can handle some kinds of files. However, `mplayer'
+recommends use of non-free codecs for other kinds of files, and users
+that install `mplayer' are very likely to install those codecs along
+with it. To recommend `mplayer' is, in effect, to promote use of the
+non-free codecs.
+
+ Thus, you should not recommend programs that strongly encourage the
+use of non-free software. This is why we do not list `mplayer' in the
+Free Software Directory.
+
+ A GNU package should not refer the user to any non-free documentation
+for free software. Free documentation that can be included in free
+operating systems is essential for completing the GNU system, or any
+free operating system, so encouraging it is a priority; to recommend
+use of documentation that we are not allowed to include undermines the
+impetus for the community to produce documentation that we can include.
+So GNU packages should never recommend non-free documentation.
+
+ By contrast, it is ok to refer to journal articles and textbooks in
+the comments of a program for explanation of how it functions, even
+though they are non-free. This is because we don't include such things
+in the GNU system even if they are free--they are outside the scope of
+what a software distribution needs to include.
+
+ Referring to a web site that describes or recommends a non-free
+program is promoting that program, so please do not make links to (or
+mention by name) web sites that contain such material. This policy is
+relevant particularly for the web pages for a GNU package.
+
+ Following links from nearly any web site can lead eventually to
+non-free software; this is inherent in the nature of the web. So it
+makes no sense to criticize a site for having such links. As long as
+the site does not itself recommend a non-free program, there is no need
+to consider the question of the sites that it links to for other
+reasons.
+
+ Thus, for example, you should not refer to AT&T's web site if that
+recommends AT&T's non-free software packages; you should not refer to a
+site that links to AT&T's site presenting it as a place to get some
+non-free program, because that link recommends and legitimizes the
+non-free program. However, that a site contains a link to AT&T's web
+site for some other purpose (such as long-distance telephone service)
+is not an objection against it.
+
+
+File: standards.info, Node: GNU Free Documentation License, Next: Index, Prev: References, Up: Top
+
+Appendix A GNU Free Documentation License
+*****************************************
+
+ Version 1.3, 3 November 2008
+
+ Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+ `http://fsf.org/'
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ 0. PREAMBLE
+
+ The purpose of this License is to make a manual, textbook, or other
+ functional and useful document "free" in the sense of freedom: to
+ assure everyone the effective freedom to copy and redistribute it,
+ with or without modifying it, either commercially or
+ noncommercially. Secondarily, this License preserves for the
+ author and publisher a way to get credit for their work, while not
+ being considered responsible for modifications made by others.
+
+ This License is a kind of "copyleft", which means that derivative
+ works of the document must themselves be free in the same sense.
+ It complements the GNU General Public License, which is a copyleft
+ license designed for free software.
+
+ We have designed this License in order to use it for manuals for
+ free software, because free software needs free documentation: a
+ free program should come with manuals providing the same freedoms
+ that the software does. But this License is not limited to
+ software manuals; it can be used for any textual work, regardless
+ of subject matter or whether it is published as a printed book.
+ We recommend this License principally for works whose purpose is
+ instruction or reference.
+
+ 1. APPLICABILITY AND DEFINITIONS
+
+ This License applies to any manual or other work, in any medium,
+ that contains a notice placed by the copyright holder saying it
+ can be distributed under the terms of this License. Such a notice
+ grants a world-wide, royalty-free license, unlimited in duration,
+ to use that work under the conditions stated herein. The
+ "Document", below, refers to any such manual or work. Any member
+ of the public is a licensee, and is addressed as "you". You
+ accept the license if you copy, modify or distribute the work in a
+ way requiring permission under copyright law.
+
+ A "Modified Version" of the Document means any work containing the
+ Document or a portion of it, either copied verbatim, or with
+ modifications and/or translated into another language.
+
+ A "Secondary Section" is a named appendix or a front-matter section
+ of the Document that deals exclusively with the relationship of the
+ publishers or authors of the Document to the Document's overall
+ subject (or to related matters) and contains nothing that could
+ fall directly within that overall subject. (Thus, if the Document
+ is in part a textbook of mathematics, a Secondary Section may not
+ explain any mathematics.) The relationship could be a matter of
+ historical connection with the subject or with related matters, or
+ of legal, commercial, philosophical, ethical or political position
+ regarding them.
+
+ The "Invariant Sections" are certain Secondary Sections whose
+ titles are designated, as being those of Invariant Sections, in
+ the notice that says that the Document is released under this
+ License. If a section does not fit the above definition of
+ Secondary then it is not allowed to be designated as Invariant.
+ The Document may contain zero Invariant Sections. If the Document
+ does not identify any Invariant Sections then there are none.
+
+ The "Cover Texts" are certain short passages of text that are
+ listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+ that says that the Document is released under this License. A
+ Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+ be at most 25 words.
+
+ A "Transparent" copy of the Document means a machine-readable copy,
+ represented in a format whose specification is available to the
+ general public, that is suitable for revising the document
+ straightforwardly with generic text editors or (for images
+ composed of pixels) generic paint programs or (for drawings) some
+ widely available drawing editor, and that is suitable for input to
+ text formatters or for automatic translation to a variety of
+ formats suitable for input to text formatters. A copy made in an
+ otherwise Transparent file format whose markup, or absence of
+ markup, has been arranged to thwart or discourage subsequent
+ modification by readers is not Transparent. An image format is
+ not Transparent if used for any substantial amount of text. A
+ copy that is not "Transparent" is called "Opaque".
+
+ Examples of suitable formats for Transparent copies include plain
+ ASCII without markup, Texinfo input format, LaTeX input format,
+ SGML or XML using a publicly available DTD, and
+ standard-conforming simple HTML, PostScript or PDF designed for
+ human modification. Examples of transparent image formats include
+ PNG, XCF and JPG. Opaque formats include proprietary formats that
+ can be read and edited only by proprietary word processors, SGML or
+ XML for which the DTD and/or processing tools are not generally
+ available, and the machine-generated HTML, PostScript or PDF
+ produced by some word processors for output purposes only.
+
+ The "Title Page" means, for a printed book, the title page itself,
+ plus such following pages as are needed to hold, legibly, the
+ material this License requires to appear in the title page. For
+ works in formats which do not have any title page as such, "Title
+ Page" means the text near the most prominent appearance of the
+ work's title, preceding the beginning of the body of the text.
+
+ The "publisher" means any person or entity that distributes copies
+ of the Document to the public.
+
+ A section "Entitled XYZ" means a named subunit of the Document
+ whose title either is precisely XYZ or contains XYZ in parentheses
+ following text that translates XYZ in another language. (Here XYZ
+ stands for a specific section name mentioned below, such as
+ "Acknowledgements", "Dedications", "Endorsements", or "History".)
+ To "Preserve the Title" of such a section when you modify the
+ Document means that it remains a section "Entitled XYZ" according
+ to this definition.
+
+ The Document may include Warranty Disclaimers next to the notice
+ which states that this License applies to the Document. These
+ Warranty Disclaimers are considered to be included by reference in
+ this License, but only as regards disclaiming warranties: any other
+ implication that these Warranty Disclaimers may have is void and
+ has no effect on the meaning of this License.
+
+ 2. VERBATIM COPYING
+
+ You may copy and distribute the Document in any medium, either
+ commercially or noncommercially, provided that this License, the
+ copyright notices, and the license notice saying this License
+ applies to the Document are reproduced in all copies, and that you
+ add no other conditions whatsoever to those of this License. You
+ may not use technical measures to obstruct or control the reading
+ or further copying of the copies you make or distribute. However,
+ you may accept compensation in exchange for copies. If you
+ distribute a large enough number of copies you must also follow
+ the conditions in section 3.
+
+ You may also lend copies, under the same conditions stated above,
+ and you may publicly display copies.
+
+ 3. COPYING IN QUANTITY
+
+ If you publish printed copies (or copies in media that commonly
+ have printed covers) of the Document, numbering more than 100, and
+ the Document's license notice requires Cover Texts, you must
+ enclose the copies in covers that carry, clearly and legibly, all
+ these Cover Texts: Front-Cover Texts on the front cover, and
+ Back-Cover Texts on the back cover. Both covers must also clearly
+ and legibly identify you as the publisher of these copies. The
+ front cover must present the full title with all words of the
+ title equally prominent and visible. You may add other material
+ on the covers in addition. Copying with changes limited to the
+ covers, as long as they preserve the title of the Document and
+ satisfy these conditions, can be treated as verbatim copying in
+ other respects.
+
+ If the required texts for either cover are too voluminous to fit
+ legibly, you should put the first ones listed (as many as fit
+ reasonably) on the actual cover, and continue the rest onto
+ adjacent pages.
+
+ If you publish or distribute Opaque copies of the Document
+ numbering more than 100, you must either include a
+ machine-readable Transparent copy along with each Opaque copy, or
+ state in or with each Opaque copy a computer-network location from
+ which the general network-using public has access to download
+ using public-standard network protocols a complete Transparent
+ copy of the Document, free of added material. If you use the
+ latter option, you must take reasonably prudent steps, when you
+ begin distribution of Opaque copies in quantity, to ensure that
+ this Transparent copy will remain thus accessible at the stated
+ location until at least one year after the last time you
+ distribute an Opaque copy (directly or through your agents or
+ retailers) of that edition to the public.
+
+ It is requested, but not required, that you contact the authors of
+ the Document well before redistributing any large number of
+ copies, to give them a chance to provide you with an updated
+ version of the Document.
+
+ 4. MODIFICATIONS
+
+ You may copy and distribute a Modified Version of the Document
+ under the conditions of sections 2 and 3 above, provided that you
+ release the Modified Version under precisely this License, with
+ the Modified Version filling the role of the Document, thus
+ licensing distribution and modification of the Modified Version to
+ whoever possesses a copy of it. In addition, you must do these
+ things in the Modified Version:
+
+ A. Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of
+ previous versions (which should, if there were any, be listed
+ in the History section of the Document). You may use the
+ same title as a previous version if the original publisher of
+ that version gives permission.
+
+ B. List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in
+ the Modified Version, together with at least five of the
+ principal authors of the Document (all of its principal
+ authors, if it has fewer than five), unless they release you
+ from this requirement.
+
+ C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+ D. Preserve all the copyright notices of the Document.
+
+ E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+ F. Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified
+ Version under the terms of this License, in the form shown in
+ the Addendum below.
+
+ G. Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document's
+ license notice.
+
+ H. Include an unaltered copy of this License.
+
+ I. Preserve the section Entitled "History", Preserve its Title,
+ and add to it an item stating at least the title, year, new
+ authors, and publisher of the Modified Version as given on
+ the Title Page. If there is no section Entitled "History" in
+ the Document, create one stating the title, year, authors,
+ and publisher of the Document as given on its Title Page,
+ then add an item describing the Modified Version as stated in
+ the previous sentence.
+
+ J. Preserve the network location, if any, given in the Document
+ for public access to a Transparent copy of the Document, and
+ likewise the network locations given in the Document for
+ previous versions it was based on. These may be placed in
+ the "History" section. You may omit a network location for a
+ work that was published at least four years before the
+ Document itself, or if the original publisher of the version
+ it refers to gives permission.
+
+ K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the
+ section all the substance and tone of each of the contributor
+ acknowledgements and/or dedications given therein.
+
+ L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section
+ titles.
+
+ M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+
+ N. Do not retitle any existing section to be Entitled
+ "Endorsements" or to conflict in title with any Invariant
+ Section.
+
+ O. Preserve any Warranty Disclaimers.
+
+ If the Modified Version includes new front-matter sections or
+ appendices that qualify as Secondary Sections and contain no
+ material copied from the Document, you may at your option
+ designate some or all of these sections as invariant. To do this,
+ add their titles to the list of Invariant Sections in the Modified
+ Version's license notice. These titles must be distinct from any
+ other section titles.
+
+ You may add a section Entitled "Endorsements", provided it contains
+ nothing but endorsements of your Modified Version by various
+ parties--for example, statements of peer review or that the text
+ has been approved by an organization as the authoritative
+ definition of a standard.
+
+ You may add a passage of up to five words as a Front-Cover Text,
+ and a passage of up to 25 words as a Back-Cover Text, to the end
+ of the list of Cover Texts in the Modified Version. Only one
+ passage of Front-Cover Text and one of Back-Cover Text may be
+ added by (or through arrangements made by) any one entity. If the
+ Document already includes a cover text for the same cover,
+ previously added by you or by arrangement made by the same entity
+ you are acting on behalf of, you may not add another; but you may
+ replace the old one, on explicit permission from the previous
+ publisher that added the old one.
+
+ The author(s) and publisher(s) of the Document do not by this
+ License give permission to use their names for publicity for or to
+ assert or imply endorsement of any Modified Version.
+
+ 5. COMBINING DOCUMENTS
+
+ You may combine the Document with other documents released under
+ this License, under the terms defined in section 4 above for
+ modified versions, provided that you include in the combination
+ all of the Invariant Sections of all of the original documents,
+ unmodified, and list them all as Invariant Sections of your
+ combined work in its license notice, and that you preserve all
+ their Warranty Disclaimers.
+
+ The combined work need only contain one copy of this License, and
+ multiple identical Invariant Sections may be replaced with a single
+ copy. If there are multiple Invariant Sections with the same name
+ but different contents, make the title of each such section unique
+ by adding at the end of it, in parentheses, the name of the
+ original author or publisher of that section if known, or else a
+ unique number. Make the same adjustment to the section titles in
+ the list of Invariant Sections in the license notice of the
+ combined work.
+
+ In the combination, you must combine any sections Entitled
+ "History" in the various original documents, forming one section
+ Entitled "History"; likewise combine any sections Entitled
+ "Acknowledgements", and any sections Entitled "Dedications". You
+ must delete all sections Entitled "Endorsements."
+
+ 6. COLLECTIONS OF DOCUMENTS
+
+ You may make a collection consisting of the Document and other
+ documents released under this License, and replace the individual
+ copies of this License in the various documents with a single copy
+ that is included in the collection, provided that you follow the
+ rules of this License for verbatim copying of each of the
+ documents in all other respects.
+
+ You may extract a single document from such a collection, and
+ distribute it individually under this License, provided you insert
+ a copy of this License into the extracted document, and follow
+ this License in all other respects regarding verbatim copying of
+ that document.
+
+ 7. AGGREGATION WITH INDEPENDENT WORKS
+
+ A compilation of the Document or its derivatives with other
+ separate and independent documents or works, in or on a volume of
+ a storage or distribution medium, is called an "aggregate" if the
+ copyright resulting from the compilation is not used to limit the
+ legal rights of the compilation's users beyond what the individual
+ works permit. When the Document is included in an aggregate, this
+ License does not apply to the other works in the aggregate which
+ are not themselves derivative works of the Document.
+
+ If the Cover Text requirement of section 3 is applicable to these
+ copies of the Document, then if the Document is less than one half
+ of the entire aggregate, the Document's Cover Texts may be placed
+ on covers that bracket the Document within the aggregate, or the
+ electronic equivalent of covers if the Document is in electronic
+ form. Otherwise they must appear on printed covers that bracket
+ the whole aggregate.
+
+ 8. TRANSLATION
+
+ Translation is considered a kind of modification, so you may
+ distribute translations of the Document under the terms of section
+ 4. Replacing Invariant Sections with translations requires special
+ permission from their copyright holders, but you may include
+ translations of some or all Invariant Sections in addition to the
+ original versions of these Invariant Sections. You may include a
+ translation of this License, and all the license notices in the
+ Document, and any Warranty Disclaimers, provided that you also
+ include the original English version of this License and the
+ original versions of those notices and disclaimers. In case of a
+ disagreement between the translation and the original version of
+ this License or a notice or disclaimer, the original version will
+ prevail.
+
+ If a section in the Document is Entitled "Acknowledgements",
+ "Dedications", or "History", the requirement (section 4) to
+ Preserve its Title (section 1) will typically require changing the
+ actual title.
+
+ 9. TERMINATION
+
+ You may not copy, modify, sublicense, or distribute the Document
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense, or distribute it is void,
+ and will automatically terminate your rights under this License.
+
+ However, if you cease all violation of this License, then your
+ license from a particular copyright holder is reinstated (a)
+ provisionally, unless and until the copyright holder explicitly
+ and finally terminates your license, and (b) permanently, if the
+ copyright holder fails to notify you of the violation by some
+ reasonable means prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+ reinstated permanently if the copyright holder notifies you of the
+ violation by some reasonable means, this is the first time you have
+ received notice of violation of this License (for any work) from
+ that copyright holder, and you cure the violation prior to 30 days
+ after your receipt of the notice.
+
+ Termination of your rights under this section does not terminate
+ the licenses of parties who have received copies or rights from
+ you under this License. If your rights have been terminated and
+ not permanently reinstated, receipt of a copy of some or all of
+ the same material does not give you any rights to use it.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+ The Free Software Foundation may publish new, revised versions of
+ the GNU Free Documentation License from time to time. Such new
+ versions will be similar in spirit to the present version, but may
+ differ in detail to address new problems or concerns. See
+ `http://www.gnu.org/copyleft/'.
+
+ Each version of the License is given a distinguishing version
+ number. If the Document specifies that a particular numbered
+ version of this License "or any later version" applies to it, you
+ have the option of following the terms and conditions either of
+ that specified version or of any later version that has been
+ published (not as a draft) by the Free Software Foundation. If
+ the Document does not specify a version number of this License,
+ you may choose any version ever published (not as a draft) by the
+ Free Software Foundation. If the Document specifies that a proxy
+ can decide which future versions of this License can be used, that
+ proxy's public statement of acceptance of a version permanently
+ authorizes you to choose that version for the Document.
+
+ 11. RELICENSING
+
+ "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+ World Wide Web server that publishes copyrightable works and also
+ provides prominent facilities for anybody to edit those works. A
+ public wiki that anybody can edit is an example of such a server.
+ A "Massive Multiauthor Collaboration" (or "MMC") contained in the
+ site means any set of copyrightable works thus published on the MMC
+ site.
+
+ "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+ license published by Creative Commons Corporation, a not-for-profit
+ corporation with a principal place of business in San Francisco,
+ California, as well as future copyleft versions of that license
+ published by that same organization.
+
+ "Incorporate" means to publish or republish a Document, in whole or
+ in part, as part of another Document.
+
+ An MMC is "eligible for relicensing" if it is licensed under this
+ License, and if all works that were first published under this
+ License somewhere other than this MMC, and subsequently
+ incorporated in whole or in part into the MMC, (1) had no cover
+ texts or invariant sections, and (2) were thus incorporated prior
+ to November 1, 2008.
+
+ The operator of an MMC Site may republish an MMC contained in the
+ site under CC-BY-SA on the same site at any time before August 1,
+ 2009, provided the MMC is eligible for relicensing.
+
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+ Copyright (C) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+
+ If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with
+ the Front-Cover Texts being LIST, and with the Back-Cover Texts
+ being LIST.
+
+ If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+ If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+
+File: standards.info, Node: Index, Prev: GNU Free Documentation License, Up: Top
+
+Index
+*****
+
+
+* Menu:
+
+* #endif, commenting: Comments. (line 60)
+* --help output: --help. (line 6)
+* --version output: --version. (line 6)
+* -Wall compiler option: Syntactic Conventions.
+ (line 10)
+* accepting contributions: Contributions. (line 6)
+* address for bug reports: --help. (line 11)
+* ANSI C standard: Standard C. (line 6)
+* arbitrary limits on data: Semantics. (line 6)
+* ASCII characters: Character Set. (line 6)
+* autoconf: System Portability. (line 23)
+* avoiding proprietary code: Reading Non-Free Code.
+ (line 6)
+* behavior, dependent on program's name: User Interfaces. (line 6)
+* binary packages: Install Command Categories.
+ (line 80)
+* bindir: Directory Variables. (line 57)
+* braces, in C source: Formatting. (line 6)
+* bug reports: --help. (line 11)
+* bug-standards@gnu.org email address: Preface. (line 30)
+* C library functions, and portability: System Functions. (line 6)
+* canonical name of a program: --version. (line 12)
+* casting pointers to integers: CPU Portability. (line 50)
+* CGI programs, standard options for: Command-Line Interfaces.
+ (line 31)
+* change logs: Change Logs. (line 6)
+* change logs, conditional changes: Conditional Changes. (line 6)
+* change logs, style: Style of Change Logs.
+ (line 6)
+* character set: Character Set. (line 6)
+* clang: Syntactic Conventions.
+ (line 17)
+* command-line arguments, decoding: Semantics. (line 47)
+* command-line interface: Command-Line Interfaces.
+ (line 6)
+* commenting: Comments. (line 6)
+* compatibility with C and POSIX standards: Compatibility. (line 6)
+* compiler warnings: Syntactic Conventions.
+ (line 10)
+* conditional changes, and change logs: Conditional Changes. (line 6)
+* conditionals, comments for: Comments. (line 60)
+* configure: Configuration. (line 6)
+* control-L: Formatting. (line 128)
+* conventions for makefiles: Makefile Conventions.
+ (line 6)
+* CORBA: Graphical Interfaces.
+ (line 16)
+* credits for manuals: Manual Credits. (line 6)
+* D-bus: Graphical Interfaces.
+ (line 16)
+* data structures, in Gnulib: System Functions. (line 44)
+* data types, and portability: CPU Portability. (line 6)
+* DESTDIR: DESTDIR. (line 6)
+* directories, creating installation: Directory Variables. (line 20)
+* documentation: Documentation. (line 6)
+* doschk: Names. (line 38)
+* double quote: Quote Characters. (line 6)
+* downloading this manual: Preface. (line 14)
+* dynamic plug-ins: Dynamic Plug-In Interfaces.
+ (line 6)
+* encodings: Character Set. (line 6)
+* enum types, formatting: Formatting. (line 45)
+* error messages: Semantics. (line 19)
+* error messages, formatting: Errors. (line 6)
+* error messages, in Gnulib: System Functions. (line 44)
+* exec_prefix: Directory Variables. (line 39)
+* expressions, splitting: Formatting. (line 91)
+* FDL, GNU Free Documentation License: GNU Free Documentation License.
+ (line 6)
+* file usage: File Usage. (line 6)
+* file-name limitations: Names. (line 38)
+* formatting error messages: Errors. (line 6)
+* formatting source code: Formatting. (line 6)
+* formfeed: Formatting. (line 128)
+* function argument, declaring: Syntactic Conventions.
+ (line 6)
+* function definitions, formatting: Formatting. (line 6)
+* function prototypes: Standard C. (line 17)
+* getopt: Command-Line Interfaces.
+ (line 6)
+* gettext: Internationalization.
+ (line 6)
+* GNOME: Graphical Interfaces.
+ (line 16)
+* GNOME and Guile: Source Language. (line 38)
+* Gnulib: System Functions. (line 37)
+* gnustandards project repository: Preface. (line 30)
+* gnustandards-commit@gnu.org mailing list: Preface. (line 24)
+* graphical user interface: Graphical Interfaces.
+ (line 6)
+* grave accent: Quote Characters. (line 6)
+* GTK+: Graphical Interfaces.
+ (line 6)
+* Guile: Source Language. (line 38)
+* implicit int: Syntactic Conventions.
+ (line 6)
+* impossible conditions: Semantics. (line 71)
+* installation directories, creating: Directory Variables. (line 20)
+* installations, staged: DESTDIR. (line 6)
+* interface styles: Graphical Interfaces.
+ (line 6)
+* internationalization: Internationalization.
+ (line 6)
+* keyboard interface: Graphical Interfaces.
+ (line 16)
+* LDAP: OID Allocations. (line 6)
+* left quote: Quote Characters. (line 6)
+* legal aspects: Legal Issues. (line 6)
+* legal papers: Contributions. (line 6)
+* libexecdir: Directory Variables. (line 70)
+* libiconv: Semantics. (line 11)
+* libraries: Libraries. (line 6)
+* library functions, and portability: System Functions. (line 6)
+* library interface: Graphical Interfaces.
+ (line 16)
+* license for manuals: License for Manuals. (line 6)
+* lint: Syntactic Conventions.
+ (line 17)
+* locale-specific quote characters: Quote Characters. (line 6)
+* long option names: Option Table. (line 6)
+* long-named options: Command-Line Interfaces.
+ (line 12)
+* makefile, conventions for: Makefile Conventions.
+ (line 6)
+* malloc return value: Semantics. (line 26)
+* man pages: Man Pages. (line 6)
+* manual structure: Manual Structure Details.
+ (line 6)
+* memory allocation failure: Semantics. (line 26)
+* memory leak: Memory Usage. (line 23)
+* memory usage: Memory Usage. (line 6)
+* message text, and internationalization: Internationalization.
+ (line 29)
+* mmap: Mmap. (line 6)
+* multiple variables in a line: Syntactic Conventions.
+ (line 43)
+* names of variables, functions, and files: Names. (line 6)
+* NEWS file: NEWS File. (line 6)
+* non-ASCII characters: Character Set. (line 6)
+* non-POSIX systems, and portability: System Portability. (line 32)
+* non-standard extensions: Using Extensions. (line 6)
+* NUL characters: Semantics. (line 11)
+* OID allocations for GNU: OID Allocations. (line 6)
+* open brace: Formatting. (line 6)
+* opening quote: Quote Characters. (line 6)
+* optional features, configure-time: Configuration. (line 100)
+* options for compatibility: Compatibility. (line 14)
+* options, standard command-line: Command-Line Interfaces.
+ (line 31)
+* output device and program's behavior: User Interfaces. (line 13)
+* packaging: Releases. (line 6)
+* PATH_INFO, specifying standard options as: Command-Line Interfaces.
+ (line 31)
+* plug-ins: Dynamic Plug-In Interfaces.
+ (line 6)
+* plugin_is_GPL_compatible: Dynamic Plug-In Interfaces.
+ (line 17)
+* portability, and data types: CPU Portability. (line 6)
+* portability, and library functions: System Functions. (line 6)
+* portability, between system types: System Portability. (line 6)
+* POSIX compatibility: Compatibility. (line 6)
+* POSIX functions, and portability: System Functions. (line 6)
+* POSIXLY_CORRECT, environment variable: Compatibility. (line 21)
+* post-installation commands: Install Command Categories.
+ (line 6)
+* pre-installation commands: Install Command Categories.
+ (line 6)
+* prefix: Directory Variables. (line 29)
+* program configuration: Configuration. (line 6)
+* program design: Design Advice. (line 6)
+* program name and its behavior: User Interfaces. (line 6)
+* program's canonical name: --version. (line 12)
+* programming languages: Source Language. (line 6)
+* proprietary programs: Reading Non-Free Code.
+ (line 6)
+* quote characters: Quote Characters. (line 6)
+* README file: Releases. (line 21)
+* references to non-free material: References. (line 6)
+* releasing: Managing Releases. (line 6)
+* right quote: Quote Characters. (line 6)
+* Savannah repository for gnustandards: Preface. (line 30)
+* sbindir: Directory Variables. (line 63)
+* signal handling: Semantics. (line 60)
+* single quote: Quote Characters. (line 6)
+* SNMP: OID Allocations. (line 6)
+* spaces before open-paren: Formatting. (line 85)
+* staged installs: DESTDIR. (line 6)
+* standard command-line options: Command-Line Interfaces.
+ (line 31)
+* standards for makefiles: Makefile Conventions.
+ (line 6)
+* struct types, formatting: Formatting. (line 45)
+* syntactic conventions: Syntactic Conventions.
+ (line 6)
+* table of long options: Option Table. (line 6)
+* temporary files: Semantics. (line 85)
+* temporary variables: Syntactic Conventions.
+ (line 31)
+* texinfo.tex, in a distribution: Releases. (line 72)
+* TMPDIR environment variable: Semantics. (line 85)
+* trademarks: Trademarks. (line 6)
+* user interface styles: Graphical Interfaces.
+ (line 6)
+* valgrind: Memory Usage. (line 23)
+* where to obtain standards.texi: Preface. (line 14)
+* X.509: OID Allocations. (line 6)
+* xmalloc, in Gnulib: System Functions. (line 44)
+
+
+
+Tag Table:
+Node: Top824
+Node: Preface2122
+Node: Legal Issues4834
+Node: Reading Non-Free Code5304
+Node: Contributions7034
+Node: Trademarks9220
+Node: Design Advice10855
+Node: Source Language11447
+Node: Compatibility13573
+Node: Using Extensions15201
+Node: Standard C16777
+Node: Conditional Compilation19180
+Node: Program Behavior20578
+Node: Non-GNU Standards21768
+Node: Semantics24049
+Node: Libraries28993
+Node: Errors30238
+Node: User Interfaces32807
+Node: Graphical Interfaces34412
+Node: Command-Line Interfaces35596
+Node: --version37642
+Node: --help43380
+Node: Dynamic Plug-In Interfaces44253
+Node: Option Table46152
+Node: OID Allocations61110
+Node: Memory Usage62944
+Node: File Usage64219
+Node: Writing C64969
+Node: Formatting65950
+Node: Comments70438
+Node: Syntactic Conventions73990
+Node: Names77965
+Node: System Portability80177
+Node: CPU Portability83068
+Node: System Functions85434
+Node: Internationalization87976
+Node: Character Set91976
+Node: Quote Characters92831
+Node: Mmap94390
+Node: Documentation95098
+Node: GNU Manuals96204
+Node: Doc Strings and Manuals101942
+Node: Manual Structure Details103495
+Node: License for Manuals104913
+Node: Manual Credits105887
+Node: Printed Manuals106280
+Node: NEWS File106966
+Node: Change Logs107644
+Node: Change Log Concepts108398
+Node: Style of Change Logs110501
+Node: Simple Changes113001
+Node: Conditional Changes114443
+Node: Indicating the Part Changed116884
+Node: Man Pages117411
+Node: Reading other Manuals119617
+Node: Managing Releases120408
+Node: Configuration121189
+Node: Makefile Conventions129854
+Node: Makefile Basics130853
+Node: Utilities in Makefiles134027
+Node: Command Variables136532
+Node: DESTDIR139778
+Node: Directory Variables141952
+Node: Standard Targets156574
+Node: Install Command Categories170675
+Node: Releases175208
+Node: References179322
+Node: GNU Free Documentation License185175
+Node: Index210342
+
+End Tag Table
diff --git a/doc/standards.texi b/doc/standards.texi
new file mode 100644
index 0000000..69a400e
--- /dev/null
+++ b/doc/standards.texi
@@ -0,0 +1,4256 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename standards.info
+@settitle GNU Coding Standards
+@c This date is automagically updated when you save this file:
+@set lastupdate April 7, 2012
+@c %**end of header
+
+@dircategory GNU organization
+@direntry
+* Standards: (standards). GNU coding standards.
+@end direntry
+
+@c @setchapternewpage odd
+@setchapternewpage off
+
+@c Put everything in one index (arbitrarily chosen to be the concept index).
+@syncodeindex fn cp
+@syncodeindex ky cp
+@syncodeindex pg cp
+@syncodeindex vr cp
+
+@c This is used by a cross ref in make-stds.texi
+@set CODESTD 1
+
+@copying
+The GNU coding standards, last updated @value{lastupdate}.
+
+Copyright @copyright{} 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+2011, 2012 Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts. A copy of the license is included in the section entitled
+``GNU Free Documentation License''.
+@end copying
+
+@titlepage
+@title GNU Coding Standards
+@author Richard Stallman, et al.
+@author last updated @value{lastupdate}
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top GNU Coding Standards
+
+@insertcopying
+@end ifnottex
+
+@menu
+* Preface:: About the GNU Coding Standards.
+* Legal Issues:: Keeping free software free.
+* Design Advice:: General program design.
+* Program Behavior:: Program behavior for all programs
+* Writing C:: Making the best use of C.
+* Documentation:: Documenting programs.
+* Managing Releases:: The release process.
+* References:: Mentioning non-free software or documentation.
+* GNU Free Documentation License:: Copying and sharing this manual.
+* Index::
+
+@end menu
+
+@node Preface
+@chapter About the GNU Coding Standards
+
+The GNU Coding Standards were written by Richard Stallman and other GNU
+Project volunteers. Their purpose is to make the GNU system clean,
+consistent, and easy to install. This document can also be read as a
+guide to writing portable, robust and reliable programs. It focuses on
+programs written in C, but many of the rules and principles are useful
+even if you write in another programming language. The rules often
+state reasons for writing in a certain way.
+
+@cindex where to obtain @code{standards.texi}
+@cindex downloading this manual
+If you did not obtain this file directly from the GNU project and
+recently, please check for a newer version. You can get the GNU
+Coding Standards from the GNU web server in many
+different formats, including the Texinfo source, PDF, HTML, DVI, plain
+text, and more, at: @uref{http://www.gnu.org/prep/standards/}.
+
+If you are maintaining an official GNU package, in addition to this
+document, please read and follow the GNU maintainer information
+(@pxref{Top, , Contents, maintain, Information for Maintainers of GNU
+Software}).
+
+@cindex @code{gnustandards-commit@@gnu.org} mailing list
+If you want to receive diffs for every change to these GNU documents,
+join the mailing list @code{gnustandards-commit@@gnu.org}, via the web
+interface at
+@url{http://lists.gnu.org/mailman/listinfo/gnustandards-commit}.
+Archives are also available there.
+
+@cindex @code{bug-standards@@gnu.org} email address
+@cindex Savannah repository for gnustandards
+@cindex gnustandards project repository
+Please send corrections or suggestions for this document to
+@email{bug-standards@@gnu.org}. If you make a suggestion, please
+include a suggested new wording for it, to help us consider the
+suggestion efficiently. We prefer a context diff to the Texinfo
+source, but if that's difficult for you, you can make a context diff
+for some other version of this document, or propose it in any way that
+makes it clear. The source repository for this document can be found
+at @url{http://savannah.gnu.org/projects/gnustandards}.
+
+These standards cover the minimum of what is important when writing a
+GNU package. Likely, the need for additional standards will come up.
+Sometimes, you might suggest that such standards be added to this
+document. If you think your standards would be generally useful, please
+do suggest them.
+
+You should also set standards for your package on many questions not
+addressed or not firmly specified here. The most important point is to
+be self-consistent---try to stick to the conventions you pick, and try
+to document them as much as possible. That way, your program will be
+more maintainable by others.
+
+The GNU Hello program serves as an example of how to follow the GNU
+coding standards for a trivial program.
+@uref{http://www.gnu.org/software/hello/hello.html}.
+
+This release of the GNU Coding Standards was last updated
+@value{lastupdate}.
+
+
+@node Legal Issues
+@chapter Keeping Free Software Free
+@cindex legal aspects
+
+This chapter discusses how you can make sure that GNU software
+avoids legal difficulties, and other related issues.
+
+@menu
+* Reading Non-Free Code:: Referring to proprietary programs.
+* Contributions:: Accepting contributions.
+* Trademarks:: How we deal with trademark issues.
+@end menu
+
+@node Reading Non-Free Code
+@section Referring to Proprietary Programs
+@cindex proprietary programs
+@cindex avoiding proprietary code
+
+Don't in any circumstances refer to Unix source code for or during
+your work on GNU! (Or to any other proprietary programs.)
+
+If you have a vague recollection of the internals of a Unix program,
+this does not absolutely mean you can't write an imitation of it, but
+do try to organize the imitation internally along different lines,
+because this is likely to make the details of the Unix version
+irrelevant and dissimilar to your results.
+
+For example, Unix utilities were generally optimized to minimize
+memory use; if you go for speed instead, your program will be very
+different. You could keep the entire input file in memory and scan it
+there instead of using stdio. Use a smarter algorithm discovered more
+recently than the Unix program. Eliminate use of temporary files. Do
+it in one pass instead of two (we did this in the assembler).
+
+Or, on the contrary, emphasize simplicity instead of speed. For some
+applications, the speed of today's computers makes simpler algorithms
+adequate.
+
+Or go for generality. For example, Unix programs often have static
+tables or fixed-size strings, which make for arbitrary limits; use
+dynamic allocation instead. Make sure your program handles NULs and
+other funny characters in the input files. Add a programming language
+for extensibility and write part of the program in that language.
+
+Or turn some parts of the program into independently usable libraries.
+Or use a simple garbage collector instead of tracking precisely when
+to free memory, or use a new GNU facility such as obstacks.
+
+
+@node Contributions
+@section Accepting Contributions
+@cindex legal papers
+@cindex accepting contributions
+
+If the program you are working on is copyrighted by the Free Software
+Foundation, then when someone else sends you a piece of code to add to
+the program, we need legal papers to use it---just as we asked you to
+sign papers initially. @emph{Each} person who makes a nontrivial
+contribution to a program must sign some sort of legal papers in order
+for us to have clear title to the program; the main author alone is not
+enough.
+
+So, before adding in any contributions from other people, please tell
+us, so we can arrange to get the papers. Then wait until we tell you
+that we have received the signed papers, before you actually use the
+contribution.
+
+This applies both before you release the program and afterward. If
+you receive diffs to fix a bug, and they make significant changes, we
+need legal papers for that change.
+
+This also applies to comments and documentation files. For copyright
+law, comments and code are just text. Copyright applies to all kinds of
+text, so we need legal papers for all kinds.
+
+We know it is frustrating to ask for legal papers; it's frustrating for
+us as well. But if you don't wait, you are going out on a limb---for
+example, what if the contributor's employer won't sign a disclaimer?
+You might have to take that code out again!
+
+You don't need papers for changes of a few lines here or there, since
+they are not significant for copyright purposes. Also, you don't need
+papers if all you get from the suggestion is some ideas, not actual code
+which you use. For example, if someone sent you one implementation, but
+you write a different implementation of the same idea, you don't need to
+get papers.
+
+The very worst thing is if you forget to tell us about the other
+contributor. We could be very embarrassed in court some day as a
+result.
+
+We have more detailed advice for maintainers of GNU packages. If you
+have reached the stage of maintaining a GNU program (whether released
+or not), please take a look: @pxref{Legal Matters,,, maintain,
+Information for GNU Maintainers}.
+
+
+@node Trademarks
+@section Trademarks
+@cindex trademarks
+
+Please do not include any trademark acknowledgements in GNU software
+packages or documentation.
+
+Trademark acknowledgements are the statements that such-and-such is a
+trademark of so-and-so. The GNU Project has no objection to the basic
+idea of trademarks, but these acknowledgements feel like kowtowing,
+and there is no legal requirement for them, so we don't use them.
+
+What is legally required, as regards other people's trademarks, is to
+avoid using them in ways which a reader might reasonably understand as
+naming or labeling our own programs or activities. For example, since
+``Objective C'' is (or at least was) a trademark, we made sure to say
+that we provide a ``compiler for the Objective C language'' rather
+than an ``Objective C compiler''. The latter would have been meant as
+a shorter way of saying the former, but it does not explicitly state
+the relationship, so it could be misinterpreted as using ``Objective
+C'' as a label for the compiler rather than for the language.
+
+Please don't use ``win'' as an abbreviation for Microsoft Windows in
+GNU software or documentation. In hacker terminology, calling
+something a ``win'' is a form of praise. If you wish to praise
+Microsoft Windows when speaking on your own, by all means do so, but
+not in GNU software. Usually we write the name ``Windows'' in full,
+but when brevity is very important (as in file names and sometimes
+symbol names), we abbreviate it to ``w''. For instance, the files and
+functions in Emacs that deal with Windows start with @samp{w32}.
+
+@node Design Advice
+@chapter General Program Design
+@cindex program design
+
+This chapter discusses some of the issues you should take into
+account when designing your program.
+
+@c Standard or ANSI C
+@c
+@c In 1989 the American National Standards Institute (ANSI) standardized
+@c C as standard X3.159-1989. In December of that year the
+@c International Standards Organization ISO adopted the ANSI C standard
+@c making minor changes. In 1990 ANSI then re-adopted ISO standard
+@c C. This version of C is known as either ANSI C or Standard C.
+
+@c A major revision of the C Standard appeared in 1999.
+
+@menu
+* Source Language:: Which languages to use.
+* Compatibility:: Compatibility with other implementations.
+* Using Extensions:: Using non-standard features.
+* Standard C:: Using standard C features.
+* Conditional Compilation:: Compiling code only if a conditional is true.
+@end menu
+
+@node Source Language
+@section Which Languages to Use
+@cindex programming languages
+
+When you want to use a language that gets compiled and runs at high
+speed, the best language to use is C. Using another language is like
+using a non-standard feature: it will cause trouble for users. Even if
+GCC supports the other language, users may find it inconvenient to have
+to install the compiler for that other language in order to build your
+program. For example, if you write your program in C++, people will
+have to install the GNU C++ compiler in order to compile your program.
+
+C has one other advantage over C++ and other compiled languages: more
+people know C, so more people will find it easy to read and modify the
+program if it is written in C.
+
+So in general it is much better to use C, rather than the
+comparable alternatives.
+
+But there are two exceptions to that conclusion:
+
+@itemize @bullet
+@item
+It is no problem to use another language to write a tool specifically
+intended for use with that language. That is because the only people
+who want to build the tool will be those who have installed the other
+language anyway.
+
+@item
+If an application is of interest only to a narrow part of the community,
+then the question of which language it is written in has less effect on
+other people, so you may as well please yourself.
+@end itemize
+
+Many programs are designed to be extensible: they include an interpreter
+for a language that is higher level than C. Often much of the program
+is written in that language, too. The Emacs editor pioneered this
+technique.
+
+@cindex Guile
+@cindex GNOME and Guile
+The standard extensibility interpreter for GNU software is Guile
+(@uref{http://www.gnu.org/@/software/@/guile/}), which implements the
+language Scheme (an especially clean and simple dialect of Lisp).
+Guile also includes bindings for GTK+/GNOME, making it practical to
+write modern GUI functionality within Guile. We don't reject programs
+written in other ``scripting languages'' such as Perl and Python, but
+using Guile is very important for the overall consistency of the GNU
+system.
+
+
+@node Compatibility
+@section Compatibility with Other Implementations
+@cindex compatibility with C and @sc{posix} standards
+@cindex @sc{posix} compatibility
+
+With occasional exceptions, utility programs and libraries for GNU
+should be upward compatible with those in Berkeley Unix, and upward
+compatible with Standard C if Standard C specifies their
+behavior, and upward compatible with @sc{posix} if @sc{posix} specifies
+their behavior.
+
+When these standards conflict, it is useful to offer compatibility
+modes for each of them.
+
+@cindex options for compatibility
+Standard C and @sc{posix} prohibit many kinds of extensions. Feel
+free to make the extensions anyway, and include a @samp{--ansi},
+@samp{--posix}, or @samp{--compatible} option to turn them off.
+However, if the extension has a significant chance of breaking any real
+programs or scripts, then it is not really upward compatible. So you
+should try to redesign its interface to make it upward compatible.
+
+@cindex @code{POSIXLY_CORRECT}, environment variable
+Many GNU programs suppress extensions that conflict with @sc{posix} if the
+environment variable @code{POSIXLY_CORRECT} is defined (even if it is
+defined with a null value). Please make your program recognize this
+variable if appropriate.
+
+When a feature is used only by users (not by programs or command
+files), and it is done poorly in Unix, feel free to replace it
+completely with something totally different and better. (For example,
+@code{vi} is replaced with Emacs.) But it is nice to offer a compatible
+feature as well. (There is a free @code{vi} clone, so we offer it.)
+
+Additional useful features are welcome regardless of whether
+there is any precedent for them.
+
+@node Using Extensions
+@section Using Non-standard Features
+@cindex non-standard extensions
+
+Many GNU facilities that already exist support a number of convenient
+extensions over the comparable Unix facilities. Whether to use these
+extensions in implementing your program is a difficult question.
+
+On the one hand, using the extensions can make a cleaner program.
+On the other hand, people will not be able to build the program
+unless the other GNU tools are available. This might cause the
+program to work on fewer kinds of machines.
+
+With some extensions, it might be easy to provide both alternatives.
+For example, you can define functions with a ``keyword'' @code{INLINE}
+and define that as a macro to expand into either @code{inline} or
+nothing, depending on the compiler.
+
+In general, perhaps it is best not to use the extensions if you can
+straightforwardly do without them, but to use the extensions if they
+are a big improvement.
+
+An exception to this rule are the large, established programs (such as
+Emacs) which run on a great variety of systems. Using GNU extensions in
+such programs would make many users unhappy, so we don't do that.
+
+Another exception is for programs that are used as part of compilation:
+anything that must be compiled with other compilers in order to
+bootstrap the GNU compilation facilities. If these require the GNU
+compiler, then no one can compile them without having them installed
+already. That would be extremely troublesome in certain cases.
+
+@node Standard C
+@section Standard C and Pre-Standard C
+@cindex @sc{ansi} C standard
+
+1989 Standard C is widespread enough now that it is ok to use its
+features in new programs. There is one exception: do not ever use the
+``trigraph'' feature of Standard C.
+
+1999 Standard C is not widespread yet, so please do not require its
+features in programs. It is ok to use its features if they are present.
+
+However, it is easy to support pre-standard compilers in most programs,
+so if you know how to do that, feel free. If a program you are
+maintaining has such support, you should try to keep it working.
+
+@cindex function prototypes
+To support pre-standard C, instead of writing function definitions in
+standard prototype form,
+
+@example
+int
+foo (int x, int y)
+@dots{}
+@end example
+
+@noindent
+write the definition in pre-standard style like this,
+
+@example
+int
+foo (x, y)
+ int x, y;
+@dots{}
+@end example
+
+@noindent
+and use a separate declaration to specify the argument prototype:
+
+@example
+int foo (int, int);
+@end example
+
+You need such a declaration anyway, in a header file, to get the benefit
+of prototypes in all the files where the function is called. And once
+you have the declaration, you normally lose nothing by writing the
+function definition in the pre-standard style.
+
+This technique does not work for integer types narrower than @code{int}.
+If you think of an argument as being of a type narrower than @code{int},
+declare it as @code{int} instead.
+
+There are a few special cases where this technique is hard to use. For
+example, if a function argument needs to hold the system type
+@code{dev_t}, you run into trouble, because @code{dev_t} is shorter than
+@code{int} on some machines; but you cannot use @code{int} instead,
+because @code{dev_t} is wider than @code{int} on some machines. There
+is no type you can safely use on all machines in a non-standard
+definition. The only way to support non-standard C and pass such an
+argument is to check the width of @code{dev_t} using Autoconf and choose
+the argument type accordingly. This may not be worth the trouble.
+
+In order to support pre-standard compilers that do not recognize
+prototypes, you may want to use a preprocessor macro like this:
+
+@example
+/* Declare the prototype for a general external function. */
+#if defined (__STDC__) || defined (WINDOWSNT)
+#define P_(proto) proto
+#else
+#define P_(proto) ()
+#endif
+@end example
+
+@node Conditional Compilation
+@section Conditional Compilation
+
+When supporting configuration options already known when building your
+program we prefer using @code{if (... )} over conditional compilation,
+as in the former case the compiler is able to perform more extensive
+checking of all possible code paths.
+
+For example, please write
+
+@smallexample
+ if (HAS_FOO)
+ ...
+ else
+ ...
+@end smallexample
+
+@noindent
+instead of:
+
+@smallexample
+ #ifdef HAS_FOO
+ ...
+ #else
+ ...
+ #endif
+@end smallexample
+
+A modern compiler such as GCC will generate exactly the same code in
+both cases, and we have been using similar techniques with good success
+in several projects. Of course, the former method assumes that
+@code{HAS_FOO} is defined as either 0 or 1.
+
+While this is not a silver bullet solving all portability problems,
+and is not always appropriate, following this policy would have saved
+GCC developers many hours, or even days, per year.
+
+In the case of function-like macros like @code{REVERSIBLE_CC_MODE} in
+GCC which cannot be simply used in @code{if (...)} statements, there is
+an easy workaround. Simply introduce another macro
+@code{HAS_REVERSIBLE_CC_MODE} as in the following example:
+
+@smallexample
+ #ifdef REVERSIBLE_CC_MODE
+ #define HAS_REVERSIBLE_CC_MODE 1
+ #else
+ #define HAS_REVERSIBLE_CC_MODE 0
+ #endif
+@end smallexample
+
+@node Program Behavior
+@chapter Program Behavior for All Programs
+
+This chapter describes conventions for writing robust
+software. It also describes general standards for error messages, the
+command line interface, and how libraries should behave.
+
+@menu
+* Non-GNU Standards:: We consider standards such as POSIX;
+ we don't "obey" them.
+* Semantics:: Writing robust programs.
+* Libraries:: Library behavior.
+* Errors:: Formatting error messages.
+* User Interfaces:: Standards about interfaces generally.
+* Graphical Interfaces:: Standards for graphical interfaces.
+* Command-Line Interfaces:: Standards for command line interfaces.
+* Dynamic Plug-In Interfaces:: Standards for dynamic plug-in interfaces.
+* Option Table:: Table of long options.
+* OID Allocations:: Table of OID slots for GNU.
+* Memory Usage:: When and how to care about memory needs.
+* File Usage:: Which files to use, and where.
+@end menu
+
+@node Non-GNU Standards
+@section Non-GNU Standards
+
+The GNU Project regards standards published by other organizations as
+suggestions, not orders. We consider those standards, but we do not
+``obey'' them. In developing a GNU program, you should implement
+an outside standard's specifications when that makes the GNU system
+better overall in an objective sense. When it doesn't, you shouldn't.
+
+In most cases, following published standards is convenient for
+users---it means that their programs or scripts will work more
+portably. For instance, GCC implements nearly all the features of
+Standard C as specified by that standard. C program developers would
+be unhappy if it did not. And GNU utilities mostly follow
+specifications of POSIX.2; shell script writers and users would be
+unhappy if our programs were incompatible.
+
+But we do not follow either of these specifications rigidly, and there
+are specific points on which we decided not to follow them, so as to
+make the GNU system better for users.
+
+For instance, Standard C says that nearly all extensions to C are
+prohibited. How silly! GCC implements many extensions, some of which
+were later adopted as part of the standard. If you want these
+constructs to give an error message as ``required'' by the standard,
+you must specify @samp{--pedantic}, which was implemented only so that
+we can say ``GCC is a 100% implementation of the standard'', not
+because there is any reason to actually use it.
+
+POSIX.2 specifies that @samp{df} and @samp{du} must output sizes by
+default in units of 512 bytes. What users want is units of 1k, so
+that is what we do by default. If you want the ridiculous behavior
+``required'' by POSIX, you must set the environment variable
+@samp{POSIXLY_CORRECT} (which was originally going to be named
+@samp{POSIX_ME_HARDER}).
+
+GNU utilities also depart from the letter of the POSIX.2 specification
+when they support long-named command-line options, and intermixing
+options with ordinary arguments. This minor incompatibility with
+POSIX is never a problem in practice, and it is very useful.
+
+In particular, don't reject a new feature, or remove an old one,
+merely because a standard says it is ``forbidden'' or ``deprecated''.
+
+
+@node Semantics
+@section Writing Robust Programs
+
+@cindex arbitrary limits on data
+Avoid arbitrary limits on the length or number of @emph{any} data
+structure, including file names, lines, files, and symbols, by allocating
+all data structures dynamically. In most Unix utilities, ``long lines
+are silently truncated''. This is not acceptable in a GNU utility.
+
+@cindex @code{NUL} characters
+@findex libiconv
+Utilities reading files should not drop NUL characters, or any other
+nonprinting characters @emph{including those with codes above 0177}.
+The only sensible exceptions would be utilities specifically intended
+for interface to certain types of terminals or printers that can't
+handle those characters. Whenever possible, try to make programs work
+properly with sequences of bytes that represent multibyte characters;
+UTF-8 is the most important.
+
+@cindex error messages
+Check every system call for an error return, unless you know you wish
+to ignore errors. Include the system error text (from @code{perror},
+@code{strerror}, or equivalent) in @emph{every} error message
+resulting from a failing system call, as well as the name of the file
+if any and the name of the utility. Just ``cannot open foo.c'' or
+``stat failed'' is not sufficient.
+
+@cindex @code{malloc} return value
+@cindex memory allocation failure
+Check every call to @code{malloc} or @code{realloc} to see if it
+returned zero. Check @code{realloc} even if you are making the block
+smaller; in a system that rounds block sizes to a power of 2,
+@code{realloc} may get a different block if you ask for less space.
+
+In Unix, @code{realloc} can destroy the storage block if it returns
+zero. GNU @code{realloc} does not have this bug: if it fails, the
+original block is unchanged. Feel free to assume the bug is fixed. If
+you wish to run your program on Unix, and wish to avoid lossage in this
+case, you can use the GNU @code{malloc}.
+
+You must expect @code{free} to alter the contents of the block that was
+freed. Anything you want to fetch from the block, you must fetch before
+calling @code{free}.
+
+If @code{malloc} fails in a noninteractive program, make that a fatal
+error. In an interactive program (one that reads commands from the
+user), it is better to abort the command and return to the command
+reader loop. This allows the user to kill other processes to free up
+virtual memory, and then try the command again.
+
+@cindex command-line arguments, decoding
+Use @code{getopt_long} to decode arguments, unless the argument syntax
+makes this unreasonable.
+
+When static storage is to be written in during program execution, use
+explicit C code to initialize it. Reserve C initialized declarations
+for data that will not be changed.
+@c ADR: why?
+
+Try to avoid low-level interfaces to obscure Unix data structures (such
+as file directories, utmp, or the layout of kernel memory), since these
+are less likely to work compatibly. If you need to find all the files
+in a directory, use @code{readdir} or some other high-level interface.
+These are supported compatibly by GNU.
+
+@cindex signal handling
+The preferred signal handling facilities are the BSD variant of
+@code{signal}, and the @sc{posix} @code{sigaction} function; the
+alternative USG @code{signal} interface is an inferior design.
+
+Nowadays, using the @sc{posix} signal functions may be the easiest way
+to make a program portable. If you use @code{signal}, then on GNU/Linux
+systems running GNU libc version 1, you should include
+@file{bsd/signal.h} instead of @file{signal.h}, so as to get BSD
+behavior. It is up to you whether to support systems where
+@code{signal} has only the USG behavior, or give up on them.
+
+@cindex impossible conditions
+In error checks that detect ``impossible'' conditions, just abort.
+There is usually no point in printing any message. These checks
+indicate the existence of bugs. Whoever wants to fix the bugs will have
+to read the source code and run a debugger. So explain the problem with
+comments in the source. The relevant data will be in variables, which
+are easy to examine with the debugger, so there is no point moving them
+elsewhere.
+
+Do not use a count of errors as the exit status for a program.
+@emph{That does not work}, because exit status values are limited to 8
+bits (0 through 255). A single run of the program might have 256
+errors; if you try to return 256 as the exit status, the parent process
+will see 0 as the status, and it will appear that the program succeeded.
+
+@cindex temporary files
+@cindex @code{TMPDIR} environment variable
+If you make temporary files, check the @code{TMPDIR} environment
+variable; if that variable is defined, use the specified directory
+instead of @file{/tmp}.
+
+In addition, be aware that there is a possible security problem when
+creating temporary files in world-writable directories. In C, you can
+avoid this problem by creating temporary files in this manner:
+
+@example
+fd = open (filename, O_WRONLY | O_CREAT | O_EXCL, 0600);
+@end example
+
+@noindent
+or by using the @code{mkstemps} function from Gnulib
+(@pxref{mkstemps,,, gnulib, Gnulib}).
+
+In bash, use @code{set -C} (long name @code{noclobber}) to avoid this
+problem. In addition, the @code{mktemp} utility is a more general
+solution for creating temporary files from shell scripts
+(@pxref{mktemp invocation,,, coreutils, GNU Coreutils}).
+
+
+@node Libraries
+@section Library Behavior
+@cindex libraries
+
+Try to make library functions reentrant. If they need to do dynamic
+storage allocation, at least try to avoid any nonreentrancy aside from
+that of @code{malloc} itself.
+
+Here are certain name conventions for libraries, to avoid name
+conflicts.
+
+Choose a name prefix for the library, more than two characters long.
+All external function and variable names should start with this
+prefix. In addition, there should only be one of these in any given
+library member. This usually means putting each one in a separate
+source file.
+
+An exception can be made when two external symbols are always used
+together, so that no reasonable program could use one without the
+other; then they can both go in the same file.
+
+External symbols that are not documented entry points for the user
+should have names beginning with @samp{_}. The @samp{_} should be
+followed by the chosen name prefix for the library, to prevent
+collisions with other libraries. These can go in the same files with
+user entry points if you like.
+
+Static functions and variables can be used as you like and need not
+fit any naming convention.
+
+@node Errors
+@section Formatting Error Messages
+@cindex formatting error messages
+@cindex error messages, formatting
+
+Error messages from compilers should look like this:
+
+@example
+@var{sourcefile}:@var{lineno}: @var{message}
+@end example
+
+@noindent
+If you want to mention the column number, use one of these formats:
+
+@example
+@var{sourcefile}:@var{lineno}:@var{column}: @var{message}
+@var{sourcefile}:@var{lineno}.@var{column}: @var{message}
+
+@end example
+
+@noindent
+Line numbers should start from 1 at the beginning of the file, and
+column numbers should start from 1 at the beginning of the line.
+(Both of these conventions are chosen for compatibility.) Calculate
+column numbers assuming that space and all ASCII printing characters
+have equal width, and assuming tab stops every 8 columns. For
+non-ASCII characters, Unicode character widths should be used when in
+a UTF-8 locale; GNU libc and GNU gnulib provide suitable
+@code{wcwidth} functions.
+
+The error message can also give both the starting and ending positions
+of the erroneous text. There are several formats so that you can
+avoid redundant information such as a duplicate line number.
+Here are the possible formats:
+
+@example
+@var{sourcefile}:@var{line1}.@var{column1}-@var{line2}.@var{column2}: @var{message}
+@var{sourcefile}:@var{line1}.@var{column1}-@var{column2}: @var{message}
+@var{sourcefile}:@var{line1}-@var{line2}: @var{message}
+@end example
+
+@noindent
+When an error is spread over several files, you can use this format:
+
+@example
+@var{file1}:@var{line1}.@var{column1}-@var{file2}:@var{line2}.@var{column2}: @var{message}
+@end example
+
+Error messages from other noninteractive programs should look like this:
+
+@example
+@var{program}:@var{sourcefile}:@var{lineno}: @var{message}
+@end example
+
+@noindent
+when there is an appropriate source file, or like this:
+
+@example
+@var{program}: @var{message}
+@end example
+
+@noindent
+when there is no relevant source file.
+
+If you want to mention the column number, use this format:
+
+@example
+@var{program}:@var{sourcefile}:@var{lineno}:@var{column}: @var{message}
+@end example
+
+In an interactive program (one that is reading commands from a
+terminal), it is better not to include the program name in an error
+message. The place to indicate which program is running is in the
+prompt or with the screen layout. (When the same program runs with
+input from a source other than a terminal, it is not interactive and
+would do best to print error messages using the noninteractive style.)
+
+The string @var{message} should not begin with a capital letter when
+it follows a program name and/or file name, because that isn't the
+beginning of a sentence. (The sentence conceptually starts at the
+beginning of the line.) Also, it should not end with a period.
+
+Error messages from interactive programs, and other messages such as
+usage messages, should start with a capital letter. But they should not
+end with a period.
+
+@node User Interfaces
+@section Standards for Interfaces Generally
+
+@cindex program name and its behavior
+@cindex behavior, dependent on program's name
+Please don't make the behavior of a utility depend on the name used
+to invoke it. It is useful sometimes to make a link to a utility
+with a different name, and that should not change what it does.
+
+Instead, use a run time option or a compilation switch or both
+to select among the alternate behaviors.
+
+@cindex output device and program's behavior
+Likewise, please don't make the behavior of the program depend on the
+type of output device it is used with. Device independence is an
+important principle of the system's design; do not compromise it merely
+to save someone from typing an option now and then. (Variation in error
+message syntax when using a terminal is ok, because that is a side issue
+that people do not depend on.)
+
+If you think one behavior is most useful when the output is to a
+terminal, and another is most useful when the output is a file or a
+pipe, then it is usually best to make the default behavior the one that
+is useful with output to a terminal, and have an option for the other
+behavior.
+
+Compatibility requires certain programs to depend on the type of output
+device. It would be disastrous if @code{ls} or @code{sh} did not do so
+in the way all users expect. In some of these cases, we supplement the
+program with a preferred alternate version that does not depend on the
+output device type. For example, we provide a @code{dir} program much
+like @code{ls} except that its default output format is always
+multi-column format.
+
+
+@node Graphical Interfaces
+@section Standards for Graphical Interfaces
+@cindex graphical user interface
+@cindex interface styles
+@cindex user interface styles
+
+@cindex GTK+
+When you write a program that provides a graphical user interface,
+please make it work with the X Window System and the GTK+ toolkit
+unless the functionality specifically requires some alternative (for
+example, ``displaying jpeg images while in console mode'').
+
+In addition, please provide a command-line interface to control the
+functionality. (In many cases, the graphical user interface can be a
+separate program which invokes the command-line program.) This is
+so that the same jobs can be done from scripts.
+
+@cindex CORBA
+@cindex GNOME
+@cindex D-bus
+@cindex keyboard interface
+@cindex library interface
+Please also consider providing a D-bus interface for use from other
+running programs, such as within GNOME. (GNOME used to use CORBA
+for this, but that is being phased out.) In addition, consider
+providing a library interface (for use from C), and perhaps a
+keyboard-driven console interface (for use by users from console
+mode). Once you are doing the work to provide the functionality and
+the graphical interface, these won't be much extra work.
+
+
+@node Command-Line Interfaces
+@section Standards for Command Line Interfaces
+@cindex command-line interface
+
+@findex getopt
+It is a good idea to follow the @sc{posix} guidelines for the
+command-line options of a program. The easiest way to do this is to use
+@code{getopt} to parse them. Note that the GNU version of @code{getopt}
+will normally permit options anywhere among the arguments unless the
+special argument @samp{--} is used. This is not what @sc{posix}
+specifies; it is a GNU extension.
+
+@cindex long-named options
+Please define long-named options that are equivalent to the
+single-letter Unix-style options. We hope to make GNU more user
+friendly this way. This is easy to do with the GNU function
+@code{getopt_long}.
+
+One of the advantages of long-named options is that they can be
+consistent from program to program. For example, users should be able
+to expect the ``verbose'' option of any GNU program which has one, to be
+spelled precisely @samp{--verbose}. To achieve this uniformity, look at
+the table of common long-option names when you choose the option names
+for your program (@pxref{Option Table}).
+
+It is usually a good idea for file names given as ordinary arguments to
+be input files only; any output files would be specified using options
+(preferably @samp{-o} or @samp{--output}). Even if you allow an output
+file name as an ordinary argument for compatibility, try to provide an
+option as another way to specify it. This will lead to more consistency
+among GNU utilities, and fewer idiosyncrasies for users to remember.
+
+@cindex standard command-line options
+@cindex options, standard command-line
+@cindex CGI programs, standard options for
+@cindex PATH_INFO, specifying standard options as
+All programs should support two standard options: @samp{--version}
+and @samp{--help}. CGI programs should accept these as command-line
+options, and also if given as the @env{PATH_INFO}; for instance,
+visiting @url{http://example.org/p.cgi/--help} in a browser should
+output the same information as invoking @samp{p.cgi --help} from the
+command line.
+
+@menu
+* --version:: The standard output for --version.
+* --help:: The standard output for --help.
+@end menu
+
+@node --version
+@subsection @option{--version}
+
+@cindex @samp{--version} output
+
+The standard @code{--version} option should direct the program to
+print information about its name, version, origin and legal status,
+all on standard output, and then exit successfully. Other options and
+arguments should be ignored once this is seen, and the program should
+not perform its normal function.
+
+@cindex canonical name of a program
+@cindex program's canonical name
+The first line is meant to be easy for a program to parse; the version
+number proper starts after the last space. In addition, it contains
+the canonical name for this program, in this format:
+
+@example
+GNU Emacs 19.30
+@end example
+
+@noindent
+The program's name should be a constant string; @emph{don't} compute it
+from @code{argv[0]}. The idea is to state the standard or canonical
+name for the program, not its file name. There are other ways to find
+out the precise file name where a command is found in @code{PATH}.
+
+If the program is a subsidiary part of a larger package, mention the
+package name in parentheses, like this:
+
+@example
+emacsserver (GNU Emacs) 19.30
+@end example
+
+@noindent
+If the package has a version number which is different from this
+program's version number, you can mention the package version number
+just before the close-parenthesis.
+
+If you @emph{need} to mention the version numbers of libraries which
+are distributed separately from the package which contains this program,
+you can do so by printing an additional line of version info for each
+library you want to mention. Use the same format for these lines as for
+the first line.
+
+Please do not mention all of the libraries that the program uses ``just
+for completeness''---that would produce a lot of unhelpful clutter.
+Please mention library version numbers only if you find in practice that
+they are very important to you in debugging.
+
+The following line, after the version number line or lines, should be a
+copyright notice. If more than one copyright notice is called for, put
+each on a separate line.
+
+Next should follow a line stating the license, preferably using one of
+abbreviations below, and a brief statement that the program is free
+software, and that users are free to copy and change it. Also mention
+that there is no warranty, to the extent permitted by law. See
+recommended wording below.
+
+It is ok to finish the output with a list of the major authors of the
+program, as a way of giving credit.
+
+Here's an example of output that follows these rules:
+
+@smallexample
+GNU hello 2.3
+Copyright (C) 2007 Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+@end smallexample
+
+You should adapt this to your program, of course, filling in the proper
+year, copyright holder, name of program, and the references to
+distribution terms, and changing the rest of the wording as necessary.
+
+This copyright notice only needs to mention the most recent year in
+which changes were made---there's no need to list the years for previous
+versions' changes. You don't have to mention the name of the program in
+these notices, if that is inconvenient, since it appeared in the first
+line. (The rules are different for copyright notices in source files;
+@pxref{Copyright Notices,,,maintain,Information for GNU Maintainers}.)
+
+Translations of the above lines must preserve the validity of the
+copyright notices (@pxref{Internationalization}). If the translation's
+character set supports it, the @samp{(C)} should be replaced with the
+copyright symbol, as follows:
+
+@ifinfo
+(the official copyright symbol, which is the letter C in a circle);
+@end ifinfo
+@ifnotinfo
+@copyright{}
+@end ifnotinfo
+
+Write the word ``Copyright'' exactly like that, in English. Do not
+translate it into another language. International treaties recognize
+the English word ``Copyright''; translations into other languages do not
+have legal significance.
+
+Finally, here is the table of our suggested license abbreviations.
+Any abbreviation can be followed by @samp{v@var{version}[+]}, meaning
+that particular version, or later versions with the @samp{+}, as shown
+above.
+
+In the case of exceptions for extra permissions with the GPL, we use
+@samp{/} for a separator; the version number can follow the license
+abbreviation as usual, as in the examples below.
+
+@table @asis
+@item GPL
+GNU General Public License, @url{http://www.gnu.org/@/licenses/@/gpl.html}.
+
+@item LGPL
+GNU Lesser General Public License, @url{http://www.gnu.org/@/licenses/@/lgpl.html}.
+
+@item GPL/Ada
+GNU GPL with the exception for Ada.
+
+@item Apache
+The Apache Software Foundation license,
+@url{http://www.apache.org/@/licenses}.
+
+@item Artistic
+The Artistic license used for Perl, @url{http://www.perlfoundation.org/@/legal}.
+
+@item Expat
+The Expat license, @url{http://www.jclark.com/@/xml/@/copying.txt}.
+
+@item MPL
+The Mozilla Public License, @url{http://www.mozilla.org/@/MPL/}.
+
+@item OBSD
+The original (4-clause) BSD license, incompatible with the GNU GPL
+@url{http://www.xfree86.org/@/3.3.6/@/COPYRIGHT2.html#6}.
+
+@item PHP
+The license used for PHP, @url{http://www.php.net/@/license/}.
+
+@item public domain
+The non-license that is being in the public domain,
+@url{http://www.gnu.org/@/licenses/@/license-list.html#PublicDomain}.
+
+@item Python
+The license for Python, @url{http://www.python.org/@/2.0.1/@/license.html}.
+
+@item RBSD
+The revised (3-clause) BSD, compatible with the GNU GPL,@*
+@url{http://www.xfree86.org/@/3.3.6/@/COPYRIGHT2.html#5}.
+
+@item X11
+The simple non-copyleft license used for most versions of the X Window
+System, @url{http://www.xfree86.org/@/3.3.6/@/COPYRIGHT2.html#3}.
+
+@item Zlib
+The license for Zlib, @url{http://www.gzip.org/@/zlib/@/zlib_license.html}.
+
+@end table
+
+More information about these licenses and many more are on the GNU
+licensing web pages,
+@url{http://www.gnu.org/@/licenses/@/license-list.html}.
+
+
+@node --help
+@subsection @option{--help}
+
+@cindex @samp{--help} output
+
+The standard @code{--help} option should output brief documentation
+for how to invoke the program, on standard output, then exit
+successfully. Other options and arguments should be ignored once this
+is seen, and the program should not perform its normal function.
+
+@cindex address for bug reports
+@cindex bug reports
+Near the end of the @samp{--help} option's output, please place lines
+giving the email address for bug reports, the package's home page
+(normally @indicateurl{http://www.gnu.org/software/@var{pkg}}, and the
+general page for help using GNU programs. The format should be like this:
+
+@example
+Report bugs to: @var{mailing-address}
+@var{pkg} home page: <http://www.gnu.org/software/@var{pkg}/>
+General help using GNU software: <http://www.gnu.org/gethelp/>
+@end example
+
+It is ok to mention other appropriate mailing lists and web pages.
+
+
+@node Dynamic Plug-In Interfaces
+@section Standards for Dynamic Plug-in Interfaces
+@cindex plug-ins
+@cindex dynamic plug-ins
+
+Another aspect of keeping free programs free is encouraging
+development of free plug-ins, and discouraging development of
+proprietary plug-ins. Many GNU programs will not have anything like
+plug-ins at all, but those that do should follow these
+practices.
+
+First, the general plug-in architecture design should closely tie the
+plug-in to the original code, such that the plug-in and the base
+program are parts of one extended program. For GCC, for example,
+plug-ins receive and modify GCC's internal data structures, and so
+clearly form an extended program with the base GCC.
+
+@vindex plugin_is_GPL_compatible
+Second, you should require plug-in developers to affirm that their
+plug-ins are released under an appropriate license. This should be
+enforced with a simple programmatic check. For GCC, again for
+example, a plug-in must define the global symbol
+@code{plugin_is_GPL_compatible}, thus asserting that the plug-in is
+released under a GPL-compatible license (@pxref{Plugins,, Plugins,
+gccint, GCC Internals}).
+
+By adding this check to your program you are not creating a new legal
+requirement. The GPL itself requires plug-ins to be free software,
+licensed compatibly. As long as you have followed the first rule above
+to keep plug-ins closely tied to your original program, the GPL and AGPL
+already require those plug-ins to be released under a compatible
+license. The symbol definition in the plug-in---or whatever equivalent
+works best in your program---makes it harder for anyone who might
+distribute proprietary plug-ins to legally defend themselves. If a case
+about this got to court, we can point to that symbol as evidence that
+the plug-in developer understood that the license had this requirement.
+
+
+@node Option Table
+@section Table of Long Options
+@cindex long option names
+@cindex table of long options
+
+Here is a table of long options used by GNU programs. It is surely
+incomplete, but we aim to list all the options that a new program might
+want to be compatible with. If you use names not already in the table,
+please send @email{bug-standards@@gnu.org} a list of them, with their
+meanings, so we can update the table.
+
+@c Please leave newlines between items in this table; it's much easier
+@c to update when it isn't completely squashed together and unreadable.
+@c When there is more than one short option for a long option name, put
+@c a semicolon between the lists of the programs that use them, not a
+@c period. --friedman
+
+@table @samp
+@item after-date
+@samp{-N} in @code{tar}.
+
+@item all
+@samp{-a} in @code{du}, @code{ls}, @code{nm}, @code{stty}, @code{uname},
+and @code{unexpand}.
+
+@item all-text
+@samp{-a} in @code{diff}.
+
+@item almost-all
+@samp{-A} in @code{ls}.
+
+@item append
+@samp{-a} in @code{etags}, @code{tee}, @code{time};
+@samp{-r} in @code{tar}.
+
+@item archive
+@samp{-a} in @code{cp}.
+
+@item archive-name
+@samp{-n} in @code{shar}.
+
+@item arglength
+@samp{-l} in @code{m4}.
+
+@item ascii
+@samp{-a} in @code{diff}.
+
+@item assign
+@samp{-v} in @code{gawk}.
+
+@item assume-new
+@samp{-W} in @code{make}.
+
+@item assume-old
+@samp{-o} in @code{make}.
+
+@item auto-check
+@samp{-a} in @code{recode}.
+
+@item auto-pager
+@samp{-a} in @code{wdiff}.
+
+@item auto-reference
+@samp{-A} in @code{ptx}.
+
+@item avoid-wraps
+@samp{-n} in @code{wdiff}.
+
+@item background
+For server programs, run in the background.
+
+@item backward-search
+@samp{-B} in @code{ctags}.
+
+@item basename
+@samp{-f} in @code{shar}.
+
+@item batch
+Used in GDB.
+
+@item baud
+Used in GDB.
+
+@item before
+@samp{-b} in @code{tac}.
+
+@item binary
+@samp{-b} in @code{cpio} and @code{diff}.
+
+@item bits-per-code
+@samp{-b} in @code{shar}.
+
+@item block-size
+Used in @code{cpio} and @code{tar}.
+
+@item blocks
+@samp{-b} in @code{head} and @code{tail}.
+
+@item break-file
+@samp{-b} in @code{ptx}.
+
+@item brief
+Used in various programs to make output shorter.
+
+@item bytes
+@samp{-c} in @code{head}, @code{split}, and @code{tail}.
+
+@item c@t{++}
+@samp{-C} in @code{etags}.
+
+@item catenate
+@samp{-A} in @code{tar}.
+
+@item cd
+Used in various programs to specify the directory to use.
+
+@item changes
+@samp{-c} in @code{chgrp} and @code{chown}.
+
+@item classify
+@samp{-F} in @code{ls}.
+
+@item colons
+@samp{-c} in @code{recode}.
+
+@item command
+@samp{-c} in @code{su};
+@samp{-x} in GDB.
+
+@item compare
+@samp{-d} in @code{tar}.
+
+@item compat
+Used in @code{gawk}.
+
+@item compress
+@samp{-Z} in @code{tar} and @code{shar}.
+
+@item concatenate
+@samp{-A} in @code{tar}.
+
+@item confirmation
+@samp{-w} in @code{tar}.
+
+@item context
+Used in @code{diff}.
+
+@item copyleft
+@samp{-W copyleft} in @code{gawk}.
+
+@item copyright
+@samp{-C} in @code{ptx}, @code{recode}, and @code{wdiff};
+@samp{-W copyright} in @code{gawk}.
+
+@item core
+Used in GDB.
+
+@item count
+@samp{-q} in @code{who}.
+
+@item count-links
+@samp{-l} in @code{du}.
+
+@item create
+Used in @code{tar} and @code{cpio}.
+
+@item cut-mark
+@samp{-c} in @code{shar}.
+
+@item cxref
+@samp{-x} in @code{ctags}.
+
+@item date
+@samp{-d} in @code{touch}.
+
+@item debug
+@samp{-d} in @code{make} and @code{m4};
+@samp{-t} in Bison.
+
+@item define
+@samp{-D} in @code{m4}.
+
+@item defines
+@samp{-d} in Bison and @code{ctags}.
+
+@item delete
+@samp{-D} in @code{tar}.
+
+@item dereference
+@samp{-L} in @code{chgrp}, @code{chown}, @code{cpio}, @code{du},
+@code{ls}, and @code{tar}.
+
+@item dereference-args
+@samp{-D} in @code{du}.
+
+@item device
+Specify an I/O device (special file name).
+
+@item diacritics
+@samp{-d} in @code{recode}.
+
+@item dictionary-order
+@samp{-d} in @code{look}.
+
+@item diff
+@samp{-d} in @code{tar}.
+
+@item digits
+@samp{-n} in @code{csplit}.
+
+@item directory
+Specify the directory to use, in various programs. In @code{ls}, it
+means to show directories themselves rather than their contents. In
+@code{rm} and @code{ln}, it means to not treat links to directories
+specially.
+
+@item discard-all
+@samp{-x} in @code{strip}.
+
+@item discard-locals
+@samp{-X} in @code{strip}.
+
+@item dry-run
+@samp{-n} in @code{make}.
+
+@item ed
+@samp{-e} in @code{diff}.
+
+@item elide-empty-files
+@samp{-z} in @code{csplit}.
+
+@item end-delete
+@samp{-x} in @code{wdiff}.
+
+@item end-insert
+@samp{-z} in @code{wdiff}.
+
+@item entire-new-file
+@samp{-N} in @code{diff}.
+
+@item environment-overrides
+@samp{-e} in @code{make}.
+
+@item eof
+@samp{-e} in @code{xargs}.
+
+@item epoch
+Used in GDB.
+
+@item error-limit
+Used in @code{makeinfo}.
+
+@item error-output
+@samp{-o} in @code{m4}.
+
+@item escape
+@samp{-b} in @code{ls}.
+
+@item exclude-from
+@samp{-X} in @code{tar}.
+
+@item exec
+Used in GDB.
+
+@item exit
+@samp{-x} in @code{xargs}.
+
+@item exit-0
+@samp{-e} in @code{unshar}.
+
+@item expand-tabs
+@samp{-t} in @code{diff}.
+
+@item expression
+@samp{-e} in @code{sed}.
+
+@item extern-only
+@samp{-g} in @code{nm}.
+
+@item extract
+@samp{-i} in @code{cpio};
+@samp{-x} in @code{tar}.
+
+@item faces
+@samp{-f} in @code{finger}.
+
+@item fast
+@samp{-f} in @code{su}.
+
+@item fatal-warnings
+@samp{-E} in @code{m4}.
+
+@item file
+@samp{-f} in @code{gawk}, @code{info}, @code{make}, @code{mt},
+@code{sed}, and @code{tar}.
+
+@item field-separator
+@samp{-F} in @code{gawk}.
+
+@item file-prefix
+@samp{-b} in Bison.
+
+@item file-type
+@samp{-F} in @code{ls}.
+
+@item files-from
+@samp{-T} in @code{tar}.
+
+@item fill-column
+Used in @code{makeinfo}.
+
+@item flag-truncation
+@samp{-F} in @code{ptx}.
+
+@item fixed-output-files
+@samp{-y} in Bison.
+
+@item follow
+@samp{-f} in @code{tail}.
+
+@item footnote-style
+Used in @code{makeinfo}.
+
+@item force
+@samp{-f} in @code{cp}, @code{ln}, @code{mv}, and @code{rm}.
+
+@item force-prefix
+@samp{-F} in @code{shar}.
+
+@item foreground
+For server programs, run in the foreground;
+in other words, don't do anything special to run the server
+in the background.
+
+@item format
+Used in @code{ls}, @code{time}, and @code{ptx}.
+
+@item freeze-state
+@samp{-F} in @code{m4}.
+
+@item fullname
+Used in GDB.
+
+@item gap-size
+@samp{-g} in @code{ptx}.
+
+@item get
+@samp{-x} in @code{tar}.
+
+@item graphic
+@samp{-i} in @code{ul}.
+
+@item graphics
+@samp{-g} in @code{recode}.
+
+@item group
+@samp{-g} in @code{install}.
+
+@item gzip
+@samp{-z} in @code{tar} and @code{shar}.
+
+@item hashsize
+@samp{-H} in @code{m4}.
+
+@item header
+@samp{-h} in @code{objdump} and @code{recode}
+
+@item heading
+@samp{-H} in @code{who}.
+
+@item help
+Used to ask for brief usage information.
+
+@item here-delimiter
+@samp{-d} in @code{shar}.
+
+@item hide-control-chars
+@samp{-q} in @code{ls}.
+
+@item html
+In @code{makeinfo}, output HTML.
+
+@item idle
+@samp{-u} in @code{who}.
+
+@item ifdef
+@samp{-D} in @code{diff}.
+
+@item ignore
+@samp{-I} in @code{ls};
+@samp{-x} in @code{recode}.
+
+@item ignore-all-space
+@samp{-w} in @code{diff}.
+
+@item ignore-backups
+@samp{-B} in @code{ls}.
+
+@item ignore-blank-lines
+@samp{-B} in @code{diff}.
+
+@item ignore-case
+@samp{-f} in @code{look} and @code{ptx};
+@samp{-i} in @code{diff} and @code{wdiff}.
+
+@item ignore-errors
+@samp{-i} in @code{make}.
+
+@item ignore-file
+@samp{-i} in @code{ptx}.
+
+@item ignore-indentation
+@samp{-I} in @code{etags}.
+
+@item ignore-init-file
+@samp{-f} in Oleo.
+
+@item ignore-interrupts
+@samp{-i} in @code{tee}.
+
+@item ignore-matching-lines
+@samp{-I} in @code{diff}.
+
+@item ignore-space-change
+@samp{-b} in @code{diff}.
+
+@item ignore-zeros
+@samp{-i} in @code{tar}.
+
+@item include
+@samp{-i} in @code{etags};
+@samp{-I} in @code{m4}.
+
+@item include-dir
+@samp{-I} in @code{make}.
+
+@item incremental
+@samp{-G} in @code{tar}.
+
+@item info
+@samp{-i}, @samp{-l}, and @samp{-m} in Finger.
+
+@item init-file
+In some programs, specify the name of the file to read as the user's
+init file.
+
+@item initial
+@samp{-i} in @code{expand}.
+
+@item initial-tab
+@samp{-T} in @code{diff}.
+
+@item inode
+@samp{-i} in @code{ls}.
+
+@item interactive
+@samp{-i} in @code{cp}, @code{ln}, @code{mv}, @code{rm};
+@samp{-e} in @code{m4};
+@samp{-p} in @code{xargs};
+@samp{-w} in @code{tar}.
+
+@item intermix-type
+@samp{-p} in @code{shar}.
+
+@item iso-8601
+Used in @code{date}
+
+@item jobs
+@samp{-j} in @code{make}.
+
+@item just-print
+@samp{-n} in @code{make}.
+
+@item keep-going
+@samp{-k} in @code{make}.
+
+@item keep-files
+@samp{-k} in @code{csplit}.
+
+@item kilobytes
+@samp{-k} in @code{du} and @code{ls}.
+
+@item language
+@samp{-l} in @code{etags}.
+
+@item less-mode
+@samp{-l} in @code{wdiff}.
+
+@item level-for-gzip
+@samp{-g} in @code{shar}.
+
+@item line-bytes
+@samp{-C} in @code{split}.
+
+@item lines
+Used in @code{split}, @code{head}, and @code{tail}.
+
+@item link
+@samp{-l} in @code{cpio}.
+
+@item lint
+@itemx lint-old
+Used in @code{gawk}.
+
+@item list
+@samp{-t} in @code{cpio};
+@samp{-l} in @code{recode}.
+
+@item list
+@samp{-t} in @code{tar}.
+
+@item literal
+@samp{-N} in @code{ls}.
+
+@item load-average
+@samp{-l} in @code{make}.
+
+@item login
+Used in @code{su}.
+
+@item machine
+Used in @code{uname}.
+
+@item macro-name
+@samp{-M} in @code{ptx}.
+
+@item mail
+@samp{-m} in @code{hello} and @code{uname}.
+
+@item make-directories
+@samp{-d} in @code{cpio}.
+
+@item makefile
+@samp{-f} in @code{make}.
+
+@item mapped
+Used in GDB.
+
+@item max-args
+@samp{-n} in @code{xargs}.
+
+@item max-chars
+@samp{-n} in @code{xargs}.
+
+@item max-lines
+@samp{-l} in @code{xargs}.
+
+@item max-load
+@samp{-l} in @code{make}.
+
+@item max-procs
+@samp{-P} in @code{xargs}.
+
+@item mesg
+@samp{-T} in @code{who}.
+
+@item message
+@samp{-T} in @code{who}.
+
+@item minimal
+@samp{-d} in @code{diff}.
+
+@item mixed-uuencode
+@samp{-M} in @code{shar}.
+
+@item mode
+@samp{-m} in @code{install}, @code{mkdir}, and @code{mkfifo}.
+
+@item modification-time
+@samp{-m} in @code{tar}.
+
+@item multi-volume
+@samp{-M} in @code{tar}.
+
+@item name-prefix
+@samp{-a} in Bison.
+
+@item nesting-limit
+@samp{-L} in @code{m4}.
+
+@item net-headers
+@samp{-a} in @code{shar}.
+
+@item new-file
+@samp{-W} in @code{make}.
+
+@item no-builtin-rules
+@samp{-r} in @code{make}.
+
+@item no-character-count
+@samp{-w} in @code{shar}.
+
+@item no-check-existing
+@samp{-x} in @code{shar}.
+
+@item no-common
+@samp{-3} in @code{wdiff}.
+
+@item no-create
+@samp{-c} in @code{touch}.
+
+@item no-defines
+@samp{-D} in @code{etags}.
+
+@item no-deleted
+@samp{-1} in @code{wdiff}.
+
+@item no-dereference
+@samp{-d} in @code{cp}.
+
+@item no-inserted
+@samp{-2} in @code{wdiff}.
+
+@item no-keep-going
+@samp{-S} in @code{make}.
+
+@item no-lines
+@samp{-l} in Bison.
+
+@item no-piping
+@samp{-P} in @code{shar}.
+
+@item no-prof
+@samp{-e} in @code{gprof}.
+
+@item no-regex
+@samp{-R} in @code{etags}.
+
+@item no-sort
+@samp{-p} in @code{nm}.
+
+@item no-splash
+Don't print a startup splash screen.
+
+@item no-split
+Used in @code{makeinfo}.
+
+@item no-static
+@samp{-a} in @code{gprof}.
+
+@item no-time
+@samp{-E} in @code{gprof}.
+
+@item no-timestamp
+@samp{-m} in @code{shar}.
+
+@item no-validate
+Used in @code{makeinfo}.
+
+@item no-wait
+Used in @code{emacsclient}.
+
+@item no-warn
+Used in various programs to inhibit warnings.
+
+@item node
+@samp{-n} in @code{info}.
+
+@item nodename
+@samp{-n} in @code{uname}.
+
+@item nonmatching
+@samp{-f} in @code{cpio}.
+
+@item nstuff
+@samp{-n} in @code{objdump}.
+
+@item null
+@samp{-0} in @code{xargs}.
+
+@item number
+@samp{-n} in @code{cat}.
+
+@item number-nonblank
+@samp{-b} in @code{cat}.
+
+@item numeric-sort
+@samp{-n} in @code{nm}.
+
+@item numeric-uid-gid
+@samp{-n} in @code{cpio} and @code{ls}.
+
+@item nx
+Used in GDB.
+
+@item old-archive
+@samp{-o} in @code{tar}.
+
+@item old-file
+@samp{-o} in @code{make}.
+
+@item one-file-system
+@samp{-l} in @code{tar}, @code{cp}, and @code{du}.
+
+@item only-file
+@samp{-o} in @code{ptx}.
+
+@item only-prof
+@samp{-f} in @code{gprof}.
+
+@item only-time
+@samp{-F} in @code{gprof}.
+
+@item options
+@samp{-o} in @code{getopt}, @code{fdlist}, @code{fdmount},
+@code{fdmountd}, and @code{fdumount}.
+
+@item output
+In various programs, specify the output file name.
+
+@item output-prefix
+@samp{-o} in @code{shar}.
+
+@item override
+@samp{-o} in @code{rm}.
+
+@item overwrite
+@samp{-c} in @code{unshar}.
+
+@item owner
+@samp{-o} in @code{install}.
+
+@item paginate
+@samp{-l} in @code{diff}.
+
+@item paragraph-indent
+Used in @code{makeinfo}.
+
+@item parents
+@samp{-p} in @code{mkdir} and @code{rmdir}.
+
+@item pass-all
+@samp{-p} in @code{ul}.
+
+@item pass-through
+@samp{-p} in @code{cpio}.
+
+@item port
+@samp{-P} in @code{finger}.
+
+@item portability
+@samp{-c} in @code{cpio} and @code{tar}.
+
+@item posix
+Used in @code{gawk}.
+
+@item prefix-builtins
+@samp{-P} in @code{m4}.
+
+@item prefix
+@samp{-f} in @code{csplit}.
+
+@item preserve
+Used in @code{tar} and @code{cp}.
+
+@item preserve-environment
+@samp{-p} in @code{su}.
+
+@item preserve-modification-time
+@samp{-m} in @code{cpio}.
+
+@item preserve-order
+@samp{-s} in @code{tar}.
+
+@item preserve-permissions
+@samp{-p} in @code{tar}.
+
+@item print
+@samp{-l} in @code{diff}.
+
+@item print-chars
+@samp{-L} in @code{cmp}.
+
+@item print-data-base
+@samp{-p} in @code{make}.
+
+@item print-directory
+@samp{-w} in @code{make}.
+
+@item print-file-name
+@samp{-o} in @code{nm}.
+
+@item print-symdefs
+@samp{-s} in @code{nm}.
+
+@item printer
+@samp{-p} in @code{wdiff}.
+
+@item prompt
+@samp{-p} in @code{ed}.
+
+@item proxy
+Specify an HTTP proxy.
+
+@item query-user
+@samp{-X} in @code{shar}.
+
+@item question
+@samp{-q} in @code{make}.
+
+@item quiet
+Used in many programs to inhibit the usual output. Every
+program accepting @samp{--quiet} should accept @samp{--silent} as a
+synonym.
+
+@item quiet-unshar
+@samp{-Q} in @code{shar}
+
+@item quote-name
+@samp{-Q} in @code{ls}.
+
+@item rcs
+@samp{-n} in @code{diff}.
+
+@item re-interval
+Used in @code{gawk}.
+
+@item read-full-blocks
+@samp{-B} in @code{tar}.
+
+@item readnow
+Used in GDB.
+
+@item recon
+@samp{-n} in @code{make}.
+
+@item record-number
+@samp{-R} in @code{tar}.
+
+@item recursive
+Used in @code{chgrp}, @code{chown}, @code{cp}, @code{ls}, @code{diff},
+and @code{rm}.
+
+@item reference
+@samp{-r} in @code{touch}.
+
+@item references
+@samp{-r} in @code{ptx}.
+
+@item regex
+@samp{-r} in @code{tac} and @code{etags}.
+
+@item release
+@samp{-r} in @code{uname}.
+
+@item reload-state
+@samp{-R} in @code{m4}.
+
+@item relocation
+@samp{-r} in @code{objdump}.
+
+@item rename
+@samp{-r} in @code{cpio}.
+
+@item replace
+@samp{-i} in @code{xargs}.
+
+@item report-identical-files
+@samp{-s} in @code{diff}.
+
+@item reset-access-time
+@samp{-a} in @code{cpio}.
+
+@item reverse
+@samp{-r} in @code{ls} and @code{nm}.
+
+@item reversed-ed
+@samp{-f} in @code{diff}.
+
+@item right-side-defs
+@samp{-R} in @code{ptx}.
+
+@item same-order
+@samp{-s} in @code{tar}.
+
+@item same-permissions
+@samp{-p} in @code{tar}.
+
+@item save
+@samp{-g} in @code{stty}.
+
+@item se
+Used in GDB.
+
+@item sentence-regexp
+@samp{-S} in @code{ptx}.
+
+@item separate-dirs
+@samp{-S} in @code{du}.
+
+@item separator
+@samp{-s} in @code{tac}.
+
+@item sequence
+Used by @code{recode} to chose files or pipes for sequencing passes.
+
+@item shell
+@samp{-s} in @code{su}.
+
+@item show-all
+@samp{-A} in @code{cat}.
+
+@item show-c-function
+@samp{-p} in @code{diff}.
+
+@item show-ends
+@samp{-E} in @code{cat}.
+
+@item show-function-line
+@samp{-F} in @code{diff}.
+
+@item show-tabs
+@samp{-T} in @code{cat}.
+
+@item silent
+Used in many programs to inhibit the usual output.
+Every program accepting
+@samp{--silent} should accept @samp{--quiet} as a synonym.
+
+@item size
+@samp{-s} in @code{ls}.
+
+@item socket
+Specify a file descriptor for a network server to use for its socket,
+instead of opening and binding a new socket. This provides a way to
+run, in a non-privileged process, a server that normally needs a
+reserved port number.
+
+@item sort
+Used in @code{ls}.
+
+@item source
+@samp{-W source} in @code{gawk}.
+
+@item sparse
+@samp{-S} in @code{tar}.
+
+@item speed-large-files
+@samp{-H} in @code{diff}.
+
+@item split-at
+@samp{-E} in @code{unshar}.
+
+@item split-size-limit
+@samp{-L} in @code{shar}.
+
+@item squeeze-blank
+@samp{-s} in @code{cat}.
+
+@item start-delete
+@samp{-w} in @code{wdiff}.
+
+@item start-insert
+@samp{-y} in @code{wdiff}.
+
+@item starting-file
+Used in @code{tar} and @code{diff} to specify which file within
+a directory to start processing with.
+
+@item statistics
+@samp{-s} in @code{wdiff}.
+
+@item stdin-file-list
+@samp{-S} in @code{shar}.
+
+@item stop
+@samp{-S} in @code{make}.
+
+@item strict
+@samp{-s} in @code{recode}.
+
+@item strip
+@samp{-s} in @code{install}.
+
+@item strip-all
+@samp{-s} in @code{strip}.
+
+@item strip-debug
+@samp{-S} in @code{strip}.
+
+@item submitter
+@samp{-s} in @code{shar}.
+
+@item suffix
+@samp{-S} in @code{cp}, @code{ln}, @code{mv}.
+
+@item suffix-format
+@samp{-b} in @code{csplit}.
+
+@item sum
+@samp{-s} in @code{gprof}.
+
+@item summarize
+@samp{-s} in @code{du}.
+
+@item symbolic
+@samp{-s} in @code{ln}.
+
+@item symbols
+Used in GDB and @code{objdump}.
+
+@item synclines
+@samp{-s} in @code{m4}.
+
+@item sysname
+@samp{-s} in @code{uname}.
+
+@item tabs
+@samp{-t} in @code{expand} and @code{unexpand}.
+
+@item tabsize
+@samp{-T} in @code{ls}.
+
+@item terminal
+@samp{-T} in @code{tput} and @code{ul}.
+@samp{-t} in @code{wdiff}.
+
+@item text
+@samp{-a} in @code{diff}.
+
+@item text-files
+@samp{-T} in @code{shar}.
+
+@item time
+Used in @code{ls} and @code{touch}.
+
+@item timeout
+Specify how long to wait before giving up on some operation.
+
+@item to-stdout
+@samp{-O} in @code{tar}.
+
+@item total
+@samp{-c} in @code{du}.
+
+@item touch
+@samp{-t} in @code{make}, @code{ranlib}, and @code{recode}.
+
+@item trace
+@samp{-t} in @code{m4}.
+
+@item traditional
+@samp{-t} in @code{hello};
+@samp{-W traditional} in @code{gawk};
+@samp{-G} in @code{ed}, @code{m4}, and @code{ptx}.
+
+@item tty
+Used in GDB.
+
+@item typedefs
+@samp{-t} in @code{ctags}.
+
+@item typedefs-and-c++
+@samp{-T} in @code{ctags}.
+
+@item typeset-mode
+@samp{-t} in @code{ptx}.
+
+@item uncompress
+@samp{-z} in @code{tar}.
+
+@item unconditional
+@samp{-u} in @code{cpio}.
+
+@item undefine
+@samp{-U} in @code{m4}.
+
+@item undefined-only
+@samp{-u} in @code{nm}.
+
+@item update
+@samp{-u} in @code{cp}, @code{ctags}, @code{mv}, @code{tar}.
+
+@item usage
+Used in @code{gawk}; same as @samp{--help}.
+
+@item uuencode
+@samp{-B} in @code{shar}.
+
+@item vanilla-operation
+@samp{-V} in @code{shar}.
+
+@item verbose
+Print more information about progress. Many programs support this.
+
+@item verify
+@samp{-W} in @code{tar}.
+
+@item version
+Print the version number.
+
+@item version-control
+@samp{-V} in @code{cp}, @code{ln}, @code{mv}.
+
+@item vgrind
+@samp{-v} in @code{ctags}.
+
+@item volume
+@samp{-V} in @code{tar}.
+
+@item what-if
+@samp{-W} in @code{make}.
+
+@item whole-size-limit
+@samp{-l} in @code{shar}.
+
+@item width
+@samp{-w} in @code{ls} and @code{ptx}.
+
+@item word-regexp
+@samp{-W} in @code{ptx}.
+
+@item writable
+@samp{-T} in @code{who}.
+
+@item zeros
+@samp{-z} in @code{gprof}.
+@end table
+
+@node OID Allocations
+@section OID Allocations
+@cindex OID allocations for GNU
+@cindex SNMP
+@cindex LDAP
+@cindex X.509
+
+The OID (object identifier) 1.3.6.1.4.1.11591 has been assigned to the
+GNU Project (thanks to Werner Koch). These are used for SNMP, LDAP,
+X.509 certificates, and so on. The web site
+@url{http://www.alvestrand.no/objectid} has a (voluntary) listing of
+many OID assignments.
+
+If you need a new slot for your GNU package, write
+@email{maintainers@@gnu.org}. Here is a list of arcs currently
+assigned:
+
+@example
+@include gnu-oids.texi
+@end example
+
+
+@node Memory Usage
+@section Memory Usage
+@cindex memory usage
+
+If a program typically uses just a few meg of memory, don't bother making any
+effort to reduce memory usage. For example, if it is impractical for
+other reasons to operate on files more than a few meg long, it is
+reasonable to read entire input files into memory to operate on them.
+
+However, for programs such as @code{cat} or @code{tail}, that can
+usefully operate on very large files, it is important to avoid using a
+technique that would artificially limit the size of files it can handle.
+If a program works by lines and could be applied to arbitrary
+user-supplied input files, it should keep only a line in memory, because
+this is not very hard and users will want to be able to operate on input
+files that are bigger than will fit in memory all at once.
+
+If your program creates complicated data structures, just make them in
+memory and give a fatal error if @code{malloc} returns zero.
+
+@pindex valgrind
+@cindex memory leak
+Memory analysis tools such as @command{valgrind} can be useful, but
+don't complicate a program merely to avoid their false alarms. For
+example, if memory is used until just before a process exits, don't
+free it simply to silence such a tool.
+
+
+@node File Usage
+@section File Usage
+@cindex file usage
+
+Programs should be prepared to operate when @file{/usr} and @file{/etc}
+are read-only file systems. Thus, if the program manages log files,
+lock files, backup files, score files, or any other files which are
+modified for internal purposes, these files should not be stored in
+@file{/usr} or @file{/etc}.
+
+There are two exceptions. @file{/etc} is used to store system
+configuration information; it is reasonable for a program to modify
+files in @file{/etc} when its job is to update the system configuration.
+Also, if the user explicitly asks to modify one file in a directory, it
+is reasonable for the program to store other files in the same
+directory.
+
+@node Writing C
+@chapter Making The Best Use of C
+
+This chapter provides advice on how best to use the C language
+when writing GNU software.
+
+@menu
+* Formatting:: Formatting your source code.
+* Comments:: Commenting your work.
+* Syntactic Conventions:: Clean use of C constructs.
+* Names:: Naming variables, functions, and files.
+* System Portability:: Portability among different operating systems.
+* CPU Portability:: Supporting the range of CPU types.
+* System Functions:: Portability and ``standard'' library functions.
+* Internationalization:: Techniques for internationalization.
+* Character Set:: Use ASCII by default.
+* Quote Characters:: Use "..." or '...' in the C locale.
+* Mmap:: How you can safely use @code{mmap}.
+@end menu
+
+@node Formatting
+@section Formatting Your Source Code
+@cindex formatting source code
+
+@cindex open brace
+@cindex braces, in C source
+@cindex function definitions, formatting
+It is important to put the open-brace that starts the body of a C
+function in column one, so that they will start a defun. Several
+tools look for open-braces in column one to find the beginnings of C
+functions. These tools will not work on code not formatted that way.
+
+Avoid putting open-brace, open-parenthesis or open-bracket in column
+one when they are inside a function, so that they won't start a defun.
+The open-brace that starts a @code{struct} body can go in column one
+if you find it useful to treat that definition as a defun.
+
+It is also important for function definitions to start the name of the
+function in column one. This helps people to search for function
+definitions, and may also help certain tools recognize them. Thus,
+using Standard C syntax, the format is this:
+
+@example
+static char *
+concat (char *s1, char *s2)
+@{
+ @dots{}
+@}
+@end example
+
+@noindent
+or, if you want to use traditional C syntax, format the definition like
+this:
+
+@example
+static char *
+concat (s1, s2) /* Name starts in column one here */
+ char *s1, *s2;
+@{ /* Open brace in column one here */
+ @dots{}
+@}
+@end example
+
+In Standard C, if the arguments don't fit nicely on one line,
+split it like this:
+
+@example
+int
+lots_of_args (int an_integer, long a_long, short a_short,
+ double a_double, float a_float)
+@dots{}
+@end example
+
+@cindex @code{struct} types, formatting
+@cindex @code{enum} types, formatting
+For @code{struct} and @code{enum} types, likewise put the braces in
+column one, unless the whole contents fits on one line:
+
+@example
+struct foo
+@{
+ int a, b;
+@}
+@exdent @r{or}
+struct foo @{ int a, b; @}
+@end example
+
+The rest of this section gives our recommendations for other aspects of
+C formatting style, which is also the default style of the @code{indent}
+program in version 1.2 and newer. It corresponds to the options
+
+@smallexample
+-nbad -bap -nbc -bbo -bl -bli2 -bls -ncdb -nce -cp1 -cs -di2
+-ndj -nfc1 -nfca -hnl -i2 -ip5 -lp -pcs -psl -nsc -nsob
+@end smallexample
+
+We don't think of these recommendations as requirements, because it
+causes no problems for users if two different programs have different
+formatting styles.
+
+But whatever style you use, please use it consistently, since a mixture
+of styles within one program tends to look ugly. If you are
+contributing changes to an existing program, please follow the style of
+that program.
+
+For the body of the function, our recommended style looks like this:
+
+@example
+if (x < foo (y, z))
+ haha = bar[4] + 5;
+else
+ @{
+ while (z)
+ @{
+ haha += foo (z, z);
+ z--;
+ @}
+ return ++x + bar ();
+ @}
+@end example
+
+@cindex spaces before open-paren
+We find it easier to read a program when it has spaces before the
+open-parentheses and after the commas. Especially after the commas.
+
+When you split an expression into multiple lines, split it
+before an operator, not after one. Here is the right way:
+
+@cindex expressions, splitting
+@example
+if (foo_this_is_long && bar > win (x, y, z)
+ && remaining_condition)
+@end example
+
+Try to avoid having two operators of different precedence at the same
+level of indentation. For example, don't write this:
+
+@example
+mode = (inmode[j] == VOIDmode
+ || GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j])
+ ? outmode[j] : inmode[j]);
+@end example
+
+Instead, use extra parentheses so that the indentation shows the nesting:
+
+@example
+mode = ((inmode[j] == VOIDmode
+ || (GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j])))
+ ? outmode[j] : inmode[j]);
+@end example
+
+Insert extra parentheses so that Emacs will indent the code properly.
+For example, the following indentation looks nice if you do it by hand,
+
+@example
+v = rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000
+ + rup->ru_stime.tv_sec*1000 + rup->ru_stime.tv_usec/1000;
+@end example
+
+@noindent
+but Emacs would alter it. Adding a set of parentheses produces
+something that looks equally nice, and which Emacs will preserve:
+
+@example
+v = (rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000
+ + rup->ru_stime.tv_sec*1000 + rup->ru_stime.tv_usec/1000);
+@end example
+
+Format do-while statements like this:
+
+@example
+do
+ @{
+ a = foo (a);
+ @}
+while (a > 0);
+@end example
+
+@cindex formfeed
+@cindex control-L
+Please use formfeed characters (control-L) to divide the program into
+pages at logical places (but not within a function). It does not matter
+just how long the pages are, since they do not have to fit on a printed
+page. The formfeeds should appear alone on lines by themselves.
+
+@node Comments
+@section Commenting Your Work
+@cindex commenting
+
+Every program should start with a comment saying briefly what it is for.
+Example: @samp{fmt - filter for simple filling of text}. This comment
+should be at the top of the source file containing the @samp{main}
+function of the program.
+
+Also, please write a brief comment at the start of each source file,
+with the file name and a line or two about the overall purpose of the
+file.
+
+Please write the comments in a GNU program in English, because English
+is the one language that nearly all programmers in all countries can
+read. If you do not write English well, please write comments in
+English as well as you can, then ask other people to help rewrite them.
+If you can't write comments in English, please find someone to work with
+you and translate your comments into English.
+
+Please put a comment on each function saying what the function does,
+what sorts of arguments it gets, and what the possible values of
+arguments mean and are used for. It is not necessary to duplicate in
+words the meaning of the C argument declarations, if a C type is being
+used in its customary fashion. If there is anything nonstandard about
+its use (such as an argument of type @code{char *} which is really the
+address of the second character of a string, not the first), or any
+possible values that would not work the way one would expect (such as,
+that strings containing newlines are not guaranteed to work), be sure
+to say so.
+
+Also explain the significance of the return value, if there is one.
+
+Please put two spaces after the end of a sentence in your comments, so
+that the Emacs sentence commands will work. Also, please write
+complete sentences and capitalize the first word. If a lower-case
+identifier comes at the beginning of a sentence, don't capitalize it!
+Changing the spelling makes it a different identifier. If you don't
+like starting a sentence with a lower case letter, write the sentence
+differently (e.g., ``The identifier lower-case is @dots{}'').
+
+The comment on a function is much clearer if you use the argument
+names to speak about the argument values. The variable name itself
+should be lower case, but write it in upper case when you are speaking
+about the value rather than the variable itself. Thus, ``the inode
+number NODE_NUM'' rather than ``an inode''.
+
+There is usually no purpose in restating the name of the function in
+the comment before it, because readers can see that for themselves.
+There might be an exception when the comment is so long that the function
+itself would be off the bottom of the screen.
+
+There should be a comment on each static variable as well, like this:
+
+@example
+/* Nonzero means truncate lines in the display;
+ zero means continue them. */
+int truncate_lines;
+@end example
+
+@cindex conditionals, comments for
+@cindex @code{#endif}, commenting
+Every @samp{#endif} should have a comment, except in the case of short
+conditionals (just a few lines) that are not nested. The comment should
+state the condition of the conditional that is ending, @emph{including
+its sense}. @samp{#else} should have a comment describing the condition
+@emph{and sense} of the code that follows. For example:
+
+@example
+@group
+#ifdef foo
+ @dots{}
+#else /* not foo */
+ @dots{}
+#endif /* not foo */
+@end group
+@group
+#ifdef foo
+ @dots{}
+#endif /* foo */
+@end group
+@end example
+
+@noindent
+but, by contrast, write the comments this way for a @samp{#ifndef}:
+
+@example
+@group
+#ifndef foo
+ @dots{}
+#else /* foo */
+ @dots{}
+#endif /* foo */
+@end group
+@group
+#ifndef foo
+ @dots{}
+#endif /* not foo */
+@end group
+@end example
+
+@node Syntactic Conventions
+@section Clean Use of C Constructs
+@cindex syntactic conventions
+
+@cindex implicit @code{int}
+@cindex function argument, declaring
+Please explicitly declare the types of all objects. For example, you
+should explicitly declare all arguments to functions, and you should
+declare functions to return @code{int} rather than omitting the
+@code{int}.
+
+@cindex compiler warnings
+@cindex @samp{-Wall} compiler option
+Some programmers like to use the GCC @samp{-Wall} option, and change the
+code whenever it issues a warning. If you want to do this, then do.
+Other programmers prefer not to use @samp{-Wall}, because it gives
+warnings for valid and legitimate code which they do not want to change.
+If you want to do this, then do. The compiler should be your servant,
+not your master.
+
+@pindex clang
+@pindex lint
+Don't make the program ugly just to placate static analysis tools such
+as @command{lint}, @command{clang}, and GCC with extra warnings
+options such as @option{-Wconversion} and @option{-Wundef}. These
+tools can help find bugs and unclear code, but they can also generate
+so many false alarms that it hurts readability to silence them with
+unnecessary casts, wrappers, and other complications. For example,
+please don't insert casts to @code{void} or calls to do-nothing
+functions merely to pacify a lint checker.
+
+Declarations of external functions and functions to appear later in the
+source file should all go in one place near the beginning of the file
+(somewhere before the first function definition in the file), or else
+should go in a header file. Don't put @code{extern} declarations inside
+functions.
+
+@cindex temporary variables
+It used to be common practice to use the same local variables (with
+names like @code{tem}) over and over for different values within one
+function. Instead of doing this, it is better to declare a separate local
+variable for each distinct purpose, and give it a name which is
+meaningful. This not only makes programs easier to understand, it also
+facilitates optimization by good compilers. You can also move the
+declaration of each local variable into the smallest scope that includes
+all its uses. This makes the program even cleaner.
+
+Don't use local variables or parameters that shadow global identifiers.
+GCC's @samp{-Wshadow} option can detect this problem.
+
+@cindex multiple variables in a line
+Don't declare multiple variables in one declaration that spans lines.
+Start a new declaration on each line, instead. For example, instead
+of this:
+
+@example
+@group
+int foo,
+ bar;
+@end group
+@end example
+
+@noindent
+write either this:
+
+@example
+int foo, bar;
+@end example
+
+@noindent
+or this:
+
+@example
+int foo;
+int bar;
+@end example
+
+@noindent
+(If they are global variables, each should have a comment preceding it
+anyway.)
+
+When you have an @code{if}-@code{else} statement nested in another
+@code{if} statement, always put braces around the @code{if}-@code{else}.
+Thus, never write like this:
+
+@example
+if (foo)
+ if (bar)
+ win ();
+ else
+ lose ();
+@end example
+
+@noindent
+always like this:
+
+@example
+if (foo)
+ @{
+ if (bar)
+ win ();
+ else
+ lose ();
+ @}
+@end example
+
+If you have an @code{if} statement nested inside of an @code{else}
+statement, either write @code{else if} on one line, like this,
+
+@example
+if (foo)
+ @dots{}
+else if (bar)
+ @dots{}
+@end example
+
+@noindent
+with its @code{then}-part indented like the preceding @code{then}-part,
+or write the nested @code{if} within braces like this:
+
+@example
+if (foo)
+ @dots{}
+else
+ @{
+ if (bar)
+ @dots{}
+ @}
+@end example
+
+Don't declare both a structure tag and variables or typedefs in the
+same declaration. Instead, declare the structure tag separately
+and then use it to declare the variables or typedefs.
+
+Try to avoid assignments inside @code{if}-conditions (assignments
+inside @code{while}-conditions are ok). For example, don't write
+this:
+
+@example
+if ((foo = (char *) malloc (sizeof *foo)) == 0)
+ fatal ("virtual memory exhausted");
+@end example
+
+@noindent
+instead, write this:
+
+@example
+foo = (char *) malloc (sizeof *foo);
+if (foo == 0)
+ fatal ("virtual memory exhausted");
+@end example
+
+This example uses zero without a cast as a null pointer constant.
+This is perfectly fine, except that a cast is needed when calling a
+varargs function or when using @code{sizeof}.
+
+@node Names
+@section Naming Variables, Functions, and Files
+
+@cindex names of variables, functions, and files
+The names of global variables and functions in a program serve as
+comments of a sort. So don't choose terse names---instead, look for
+names that give useful information about the meaning of the variable or
+function. In a GNU program, names should be English, like other
+comments.
+
+Local variable names can be shorter, because they are used only within
+one context, where (presumably) comments explain their purpose.
+
+Try to limit your use of abbreviations in symbol names. It is ok to
+make a few abbreviations, explain what they mean, and then use them
+frequently, but don't use lots of obscure abbreviations.
+
+Please use underscores to separate words in a name, so that the Emacs
+word commands can be useful within them. Stick to lower case; reserve
+upper case for macros and @code{enum} constants, and for name-prefixes
+that follow a uniform convention.
+
+For example, you should use names like @code{ignore_space_change_flag};
+don't use names like @code{iCantReadThis}.
+
+Variables that indicate whether command-line options have been
+specified should be named after the meaning of the option, not after
+the option-letter. A comment should state both the exact meaning of
+the option and its letter. For example,
+
+@example
+@group
+/* Ignore changes in horizontal whitespace (-b). */
+int ignore_space_change_flag;
+@end group
+@end example
+
+When you want to define names with constant integer values, use
+@code{enum} rather than @samp{#define}. GDB knows about enumeration
+constants.
+
+@cindex file-name limitations
+@pindex doschk
+You might want to make sure that none of the file names would conflict
+if the files were loaded onto an MS-DOS file system which shortens the
+names. You can use the program @code{doschk} to test for this.
+
+Some GNU programs were designed to limit themselves to file names of 14
+characters or less, to avoid file name conflicts if they are read into
+older System V systems. Please preserve this feature in the existing
+GNU programs that have it, but there is no need to do this in new GNU
+programs. @code{doschk} also reports file names longer than 14
+characters.
+
+
+@node System Portability
+@section Portability between System Types
+@cindex portability, between system types
+
+In the Unix world, ``portability'' refers to porting to different Unix
+versions. For a GNU program, this kind of portability is desirable, but
+not paramount.
+
+The primary purpose of GNU software is to run on top of the GNU kernel,
+compiled with the GNU C compiler, on various types of @sc{cpu}. So the
+kinds of portability that are absolutely necessary are quite limited.
+But it is important to support Linux-based GNU systems, since they
+are the form of GNU that is popular.
+
+Beyond that, it is good to support the other free operating systems
+(*BSD), and it is nice to support other Unix-like systems if you want
+to. Supporting a variety of Unix-like systems is desirable, although
+not paramount. It is usually not too hard, so you may as well do it.
+But you don't have to consider it an obligation, if it does turn out to
+be hard.
+
+@pindex autoconf
+The easiest way to achieve portability to most Unix-like systems is to
+use Autoconf. It's unlikely that your program needs to know more
+information about the host platform than Autoconf can provide, simply
+because most of the programs that need such knowledge have already been
+written.
+
+Avoid using the format of semi-internal data bases (e.g., directories)
+when there is a higher-level alternative (@code{readdir}).
+
+@cindex non-@sc{posix} systems, and portability
+As for systems that are not like Unix, such as MSDOS, Windows, VMS, MVS,
+and older Macintosh systems, supporting them is often a lot of work.
+When that is the case, it is better to spend your time adding features
+that will be useful on GNU and GNU/Linux, rather than on supporting
+other incompatible systems.
+
+If you do support Windows, please do not abbreviate it as ``win''. In
+hacker terminology, calling something a ``win'' is a form of praise.
+You're free to praise Microsoft Windows on your own if you want, but
+please don't do this in GNU packages. Instead of abbreviating
+``Windows'' to ``win'', you can write it in full or abbreviate it to
+``woe'' or ``w''. In GNU Emacs, for instance, we use @samp{w32} in
+file names of Windows-specific files, but the macro for Windows
+conditionals is called @code{WINDOWSNT}.
+
+It is a good idea to define the ``feature test macro''
+@code{_GNU_SOURCE} when compiling your C files. When you compile on GNU
+or GNU/Linux, this will enable the declarations of GNU library extension
+functions, and that will usually give you a compiler error message if
+you define the same function names in some other way in your program.
+(You don't have to actually @emph{use} these functions, if you prefer
+to make the program more portable to other systems.)
+
+But whether or not you use these GNU extensions, you should avoid
+using their names for any other meanings. Doing so would make it hard
+to move your code into other GNU programs.
+
+@node CPU Portability
+@section Portability between @sc{cpu}s
+
+@cindex data types, and portability
+@cindex portability, and data types
+Even GNU systems will differ because of differences among @sc{cpu}
+types---for example, difference in byte ordering and alignment
+requirements. It is absolutely essential to handle these differences.
+However, don't make any effort to cater to the possibility that an
+@code{int} will be less than 32 bits. We don't support 16-bit machines
+in GNU.
+
+Similarly, don't make any effort to cater to the possibility that
+@code{long} will be smaller than predefined types like @code{size_t}.
+For example, the following code is ok:
+
+@example
+printf ("size = %lu\n", (unsigned long) sizeof array);
+printf ("diff = %ld\n", (long) (pointer2 - pointer1));
+@end example
+
+1989 Standard C requires this to work, and we know of only one
+counterexample: 64-bit programs on Microsoft Windows. We will leave
+it to those who want to port GNU programs to that environment to
+figure out how to do it.
+
+Predefined file-size types like @code{off_t} are an exception: they are
+longer than @code{long} on many platforms, so code like the above won't
+work with them. One way to print an @code{off_t} value portably is to
+print its digits yourself, one by one.
+
+Don't assume that the address of an @code{int} object is also the
+address of its least-significant byte. This is false on big-endian
+machines. Thus, don't make the following mistake:
+
+@example
+int c;
+@dots{}
+while ((c = getchar ()) != EOF)
+ write (file_descriptor, &c, 1);
+@end example
+
+@noindent Instead, use @code{unsigned char} as follows. (The @code{unsigned}
+is for portability to unusual systems where @code{char} is signed and
+where there is integer overflow checking.)
+
+@example
+int c;
+while ((c = getchar ()) != EOF)
+ @{
+ unsigned char u = c;
+ write (file_descriptor, &u, 1);
+ @}
+@end example
+
+@cindex casting pointers to integers
+Avoid casting pointers to integers if you can. Such casts greatly
+reduce portability, and in most programs they are easy to avoid. In the
+cases where casting pointers to integers is essential---such as, a Lisp
+interpreter which stores type information as well as an address in one
+word---you'll have to make explicit provisions to handle different word
+sizes. You will also need to make provision for systems in which the
+normal range of addresses you can get from @code{malloc} starts far away
+from zero.
+
+
+@node System Functions
+@section Calling System Functions
+
+@cindex C library functions, and portability
+@cindex POSIX functions, and portability
+@cindex library functions, and portability
+@cindex portability, and library functions
+
+Historically, C implementations differed substantially, and many
+systems lacked a full implementation of ANSI/ISO C89. Nowadays,
+however, very few systems lack a C89 compiler and GNU C supports
+almost all of C99. Similarly, most systems implement POSIX.1-1993
+libraries and tools, and many have POSIX.1-2001.
+
+Hence, there is little reason to support old C or non-POSIX systems,
+and you may want to take advantage of C99 and POSIX-1.2001 to write
+clearer, more portable, or faster code. You should use standard
+interfaces where possible; but if GNU extensions make your program
+more maintainable, powerful, or otherwise better, don't hesitate to
+use them. In any case, don't make your own declaration of system
+functions; that's a recipe for conflict.
+
+Despite the standards, nearly every library function has some sort of
+portability issue on some system or another. Here are some examples:
+
+@table @code
+@item open
+Names with trailing @code{/}'s are mishandled on many platforms.
+
+@item printf
+@code{long double} may be unimplemented; floating values Infinity and
+NaN are often mishandled; output for large precisions may be
+incorrect.
+
+@item readlink
+May return @code{int} instead of @code{ssize_t}.
+
+@item scanf
+On Windows, @code{errno} is not set on failure.
+@end table
+
+@cindex Gnulib
+@uref{http://www.gnu.org/software/gnulib/, Gnulib} is a big help in
+this regard. Gnulib provides implementations of standard interfaces
+on many of the systems that lack them, including portable
+implementations of enhanced GNU interfaces, thereby making their use
+portable, and of POSIX-1.2008 interfaces, some of which are missing
+even on up-to-date GNU systems.
+
+@findex xmalloc, in Gnulib
+@findex error messages, in Gnulib
+@findex data structures, in Gnulib
+Gnulib also provides many useful non-standard interfaces; for example,
+C implementations of standard data structures (hash tables, binary
+trees), error-checking type-safe wrappers for memory allocation
+functions (@code{xmalloc}, @code{xrealloc}), and output of error
+messages.
+
+Gnulib integrates with GNU Autoconf and Automake to remove much of the
+burden of writing portable code from the programmer: Gnulib makes your
+configure script automatically determine what features are missing and
+use the Gnulib code to supply the missing pieces.
+
+The Gnulib and Autoconf manuals have extensive sections on
+portability: @ref{Top,, Introduction, gnulib, Gnulib} and
+@pxref{Portable C and C++,,, autoconf, Autoconf}. Please consult them
+for many more details.
+
+
+@node Internationalization
+@section Internationalization
+@cindex internationalization
+
+@pindex gettext
+GNU has a library called GNU gettext that makes it easy to translate the
+messages in a program into various languages. You should use this
+library in every program. Use English for the messages as they appear
+in the program, and let gettext provide the way to translate them into
+other languages.
+
+Using GNU gettext involves putting a call to the @code{gettext} macro
+around each string that might need translation---like this:
+
+@example
+printf (gettext ("Processing file '%s'..."), file);
+@end example
+
+@noindent
+This permits GNU gettext to replace the string @code{"Processing file
+'%s'..."} with a translated version.
+
+Once a program uses gettext, please make a point of writing calls to
+@code{gettext} when you add new strings that call for translation.
+
+Using GNU gettext in a package involves specifying a @dfn{text domain
+name} for the package. The text domain name is used to separate the
+translations for this package from the translations for other packages.
+Normally, the text domain name should be the same as the name of the
+package---for example, @samp{coreutils} for the GNU core utilities.
+
+@cindex message text, and internationalization
+To enable gettext to work well, avoid writing code that makes
+assumptions about the structure of words or sentences. When you want
+the precise text of a sentence to vary depending on the data, use two or
+more alternative string constants each containing a complete sentences,
+rather than inserting conditionalized words or phrases into a single
+sentence framework.
+
+Here is an example of what not to do:
+
+@smallexample
+printf ("%s is full", capacity > 5000000 ? "disk" : "floppy disk");
+@end smallexample
+
+If you apply gettext to all strings, like this,
+
+@smallexample
+printf (gettext ("%s is full"),
+ capacity > 5000000 ? gettext ("disk") : gettext ("floppy disk"));
+@end smallexample
+
+@noindent
+the translator will hardly know that "disk" and "floppy disk" are meant to
+be substituted in the other string. Worse, in some languages (like French)
+the construction will not work: the translation of the word "full" depends
+on the gender of the first part of the sentence; it happens to be not the
+same for "disk" as for "floppy disk".
+
+Complete sentences can be translated without problems:
+
+@example
+printf (capacity > 5000000 ? gettext ("disk is full")
+ : gettext ("floppy disk is full"));
+@end example
+
+A similar problem appears at the level of sentence structure with this
+code:
+
+@example
+printf ("# Implicit rule search has%s been done.\n",
+ f->tried_implicit ? "" : " not");
+@end example
+
+@noindent
+Adding @code{gettext} calls to this code cannot give correct results for
+all languages, because negation in some languages requires adding words
+at more than one place in the sentence. By contrast, adding
+@code{gettext} calls does the job straightforwardly if the code starts
+out like this:
+
+@example
+printf (f->tried_implicit
+ ? "# Implicit rule search has been done.\n",
+ : "# Implicit rule search has not been done.\n");
+@end example
+
+Another example is this one:
+
+@example
+printf ("%d file%s processed", nfiles,
+ nfiles != 1 ? "s" : "");
+@end example
+
+@noindent
+The problem with this example is that it assumes that plurals are made
+by adding `s'. If you apply gettext to the format string, like this,
+
+@example
+printf (gettext ("%d file%s processed"), nfiles,
+ nfiles != 1 ? "s" : "");
+@end example
+
+@noindent
+the message can use different words, but it will still be forced to use
+`s' for the plural. Here is a better way, with gettext being applied to
+the two strings independently:
+
+@example
+printf ((nfiles != 1 ? gettext ("%d files processed")
+ : gettext ("%d file processed")),
+ nfiles);
+@end example
+
+@noindent
+But this still doesn't work for languages like Polish, which has three
+plural forms: one for nfiles == 1, one for nfiles == 2, 3, 4, 22, 23, 24, ...
+and one for the rest. The GNU @code{ngettext} function solves this problem:
+
+@example
+printf (ngettext ("%d files processed", "%d file processed", nfiles),
+ nfiles);
+@end example
+
+
+@node Character Set
+@section Character Set
+@cindex character set
+@cindex encodings
+@cindex ASCII characters
+@cindex non-ASCII characters
+
+Sticking to the ASCII character set (plain text, 7-bit characters) is
+preferred in GNU source code comments, text documents, and other
+contexts, unless there is good reason to do something else because of
+the application domain. For example, if source code deals with the
+French Revolutionary calendar, it is OK if its literal strings contain
+accented characters in month names like ``Flor@'eal''. Also, it is OK
+(but not required) to use non-ASCII characters to represent proper
+names of contributors in change logs (@pxref{Change Logs}).
+
+If you need to use non-ASCII characters, you should normally stick
+with one encoding, certainly within a single file. UTF-8 is likely to
+be the best choice.
+
+
+@node Quote Characters
+@section Quote Characters
+@cindex quote characters
+@cindex locale-specific quote characters
+@cindex left quote
+@cindex right quote
+@cindex opening quote
+@cindex single quote
+@cindex double quote
+@cindex grave accent
+@set txicodequoteundirected
+@set txicodequotebacktick
+
+In the C locale, the output of GNU programs should stick to plain
+ASCII for quotation characters in messages to users: preferably 0x22
+(@samp{"}) or 0x27 (@samp{'}) for both opening and closing quotes.
+Although GNU programs traditionally used 0x60 (@samp{`}) for opening
+and 0x27 (@samp{'}) for closing quotes, nowadays quotes @samp{`like
+this'} are typically rendered asymmetrically, so quoting @samp{"like
+this"} or @samp{'like this'} typically looks better.
+
+It is ok, but not required, for GNU programs to generate
+locale-specific quotes in non-C locales. For example:
+
+@example
+printf (gettext ("Processing file '%s'..."), file);
+@end example
+
+@noindent
+Here, a French translation might cause @code{gettext} to return the
+string @code{"Traitement de fichier
+@guilsinglleft{}@tie{}%s@tie{}@guilsinglright{}..."}, yielding quotes
+more appropriate for a French locale.
+
+Sometimes a program may need to use opening and closing quotes
+directly. By convention, @code{gettext} translates the string
+@samp{"`"} to the opening quote and the string @samp{"'"} to the
+closing quote, and a program can use these translations. Generally,
+though, it is better to translate quote characters in the context of
+longer strings.
+
+If the output of your program is ever likely to be parsed by another
+program, it is good to provide an option that makes this parsing
+reliable. For example, you could escape special characters using
+conventions from the C language or the Bourne shell. See for example
+the option @option{--quoting-style} of GNU @code{ls}.
+
+@clear txicodequoteundirected
+@clear txicodequotebacktick
+
+
+@node Mmap
+@section Mmap
+@findex mmap
+
+Don't assume that @code{mmap} either works on all files or fails
+for all files. It may work on some files and fail on others.
+
+The proper way to use @code{mmap} is to try it on the specific file for
+which you want to use it---and if @code{mmap} doesn't work, fall back on
+doing the job in another way using @code{read} and @code{write}.
+
+The reason this precaution is needed is that the GNU kernel (the HURD)
+provides a user-extensible file system, in which there can be many
+different kinds of ``ordinary files''. Many of them support
+@code{mmap}, but some do not. It is important to make programs handle
+all these kinds of files.
+
+
+@node Documentation
+@chapter Documenting Programs
+@cindex documentation
+
+A GNU program should ideally come with full free documentation, adequate
+for both reference and tutorial purposes. If the package can be
+programmed or extended, the documentation should cover programming or
+extending it, as well as just using it.
+
+@menu
+* GNU Manuals:: Writing proper manuals.
+* Doc Strings and Manuals:: Compiling doc strings doesn't make a manual.
+* Manual Structure Details:: Specific structure conventions.
+* License for Manuals:: Writing the distribution terms for a manual.
+* Manual Credits:: Giving credit to documentation contributors.
+* Printed Manuals:: Mentioning the printed manual.
+* NEWS File:: NEWS files supplement manuals.
+* Change Logs:: Recording changes.
+* Man Pages:: Man pages are secondary.
+* Reading other Manuals:: How far you can go in learning
+ from other manuals.
+@end menu
+
+@node GNU Manuals
+@section GNU Manuals
+
+The preferred document format for the GNU system is the Texinfo
+formatting language. Every GNU package should (ideally) have
+documentation in Texinfo both for reference and for learners. Texinfo
+makes it possible to produce a good quality formatted book, using
+@TeX{}, and to generate an Info file. It is also possible to generate
+HTML output from Texinfo source. See the Texinfo manual, either the
+hardcopy, or the on-line version available through @code{info} or the
+Emacs Info subsystem (@kbd{C-h i}).
+
+Nowadays some other formats such as Docbook and Sgmltexi can be
+converted automatically into Texinfo. It is ok to produce the Texinfo
+documentation by conversion this way, as long as it gives good results.
+
+Make sure your manual is clear to a reader who knows nothing about the
+topic and reads it straight through. This means covering basic topics
+at the beginning, and advanced topics only later. This also means
+defining every specialized term when it is first used.
+
+Programmers tend to carry over the structure of the program as the
+structure for its documentation. But this structure is not
+necessarily good for explaining how to use the program; it may be
+irrelevant and confusing for a user.
+
+Instead, the right way to structure documentation is according to the
+concepts and questions that a user will have in mind when reading it.
+This principle applies at every level, from the lowest (ordering
+sentences in a paragraph) to the highest (ordering of chapter topics
+within the manual). Sometimes this structure of ideas matches the
+structure of the implementation of the software being documented---but
+often they are different. An important part of learning to write good
+documentation is to learn to notice when you have unthinkingly
+structured the documentation like the implementation, stop yourself,
+and look for better alternatives.
+
+For example, each program in the GNU system probably ought to be
+documented in one manual; but this does not mean each program should
+have its own manual. That would be following the structure of the
+implementation, rather than the structure that helps the user
+understand.
+
+Instead, each manual should cover a coherent @emph{topic}. For example,
+instead of a manual for @code{diff} and a manual for @code{diff3}, we
+have one manual for ``comparison of files'' which covers both of those
+programs, as well as @code{cmp}. By documenting these programs
+together, we can make the whole subject clearer.
+
+The manual which discusses a program should certainly document all of
+the program's command-line options and all of its commands. It should
+give examples of their use. But don't organize the manual as a list
+of features. Instead, organize it logically, by subtopics. Address
+the questions that a user will ask when thinking about the job that
+the program does. Don't just tell the reader what each feature can
+do---say what jobs it is good for, and show how to use it for those
+jobs. Explain what is recommended usage, and what kinds of usage
+users should avoid.
+
+In general, a GNU manual should serve both as tutorial and reference.
+It should be set up for convenient access to each topic through Info,
+and for reading straight through (appendixes aside). A GNU manual
+should give a good introduction to a beginner reading through from the
+start, and should also provide all the details that hackers want.
+The Bison manual is a good example of this---please take a look at it
+to see what we mean.
+
+That is not as hard as it first sounds. Arrange each chapter as a
+logical breakdown of its topic, but order the sections, and write their
+text, so that reading the chapter straight through makes sense. Do
+likewise when structuring the book into chapters, and when structuring a
+section into paragraphs. The watchword is, @emph{at each point, address
+the most fundamental and important issue raised by the preceding text.}
+
+If necessary, add extra chapters at the beginning of the manual which
+are purely tutorial and cover the basics of the subject. These provide
+the framework for a beginner to understand the rest of the manual. The
+Bison manual provides a good example of how to do this.
+
+To serve as a reference, a manual should have an Index that list all the
+functions, variables, options, and important concepts that are part of
+the program. One combined Index should do for a short manual, but
+sometimes for a complex package it is better to use multiple indices.
+The Texinfo manual includes advice on preparing good index entries, see
+@ref{Index Entries, , Making Index Entries, texinfo, GNU Texinfo}, and
+see @ref{Indexing Commands, , Defining the Entries of an
+Index, texinfo, GNU Texinfo}.
+
+Don't use Unix man pages as a model for how to write GNU documentation;
+most of them are terse, badly structured, and give inadequate
+explanation of the underlying concepts. (There are, of course, some
+exceptions.) Also, Unix man pages use a particular format which is
+different from what we use in GNU manuals.
+
+Please include an email address in the manual for where to report
+bugs @emph{in the text of the manual}.
+
+Please do not use the term ``pathname'' that is used in Unix
+documentation; use ``file name'' (two words) instead. We use the term
+``path'' only for search paths, which are lists of directory names.
+
+Please do not use the term ``illegal'' to refer to erroneous input to
+a computer program. Please use ``invalid'' for this, and reserve the
+term ``illegal'' for activities prohibited by law.
+
+Please do not write @samp{()} after a function name just to indicate
+it is a function. @code{foo ()} is not a function, it is a function
+call with no arguments.
+
+@node Doc Strings and Manuals
+@section Doc Strings and Manuals
+
+Some programming systems, such as Emacs, provide a documentation string
+for each function, command or variable. You may be tempted to write a
+reference manual by compiling the documentation strings and writing a
+little additional text to go around them---but you must not do it. That
+approach is a fundamental mistake. The text of well-written
+documentation strings will be entirely wrong for a manual.
+
+A documentation string needs to stand alone---when it appears on the
+screen, there will be no other text to introduce or explain it.
+Meanwhile, it can be rather informal in style.
+
+The text describing a function or variable in a manual must not stand
+alone; it appears in the context of a section or subsection. Other text
+at the beginning of the section should explain some of the concepts, and
+should often make some general points that apply to several functions or
+variables. The previous descriptions of functions and variables in the
+section will also have given information about the topic. A description
+written to stand alone would repeat some of that information; this
+redundancy looks bad. Meanwhile, the informality that is acceptable in
+a documentation string is totally unacceptable in a manual.
+
+The only good way to use documentation strings in writing a good manual
+is to use them as a source of information for writing good text.
+
+@node Manual Structure Details
+@section Manual Structure Details
+@cindex manual structure
+
+The title page of the manual should state the version of the programs or
+packages documented in the manual. The Top node of the manual should
+also contain this information. If the manual is changing more
+frequently than or independent of the program, also state a version
+number for the manual in both of these places.
+
+Each program documented in the manual should have a node named
+@samp{@var{program} Invocation} or @samp{Invoking @var{program}}. This
+node (together with its subnodes, if any) should describe the program's
+command line arguments and how to run it (the sort of information people
+would look for in a man page). Start with an @samp{@@example}
+containing a template for all the options and arguments that the program
+uses.
+
+Alternatively, put a menu item in some menu whose item name fits one of
+the above patterns. This identifies the node which that item points to
+as the node for this purpose, regardless of the node's actual name.
+
+The @samp{--usage} feature of the Info reader looks for such a node
+or menu item in order to find the relevant text, so it is essential
+for every Texinfo file to have one.
+
+If one manual describes several programs, it should have such a node for
+each program described in the manual.
+
+@node License for Manuals
+@section License for Manuals
+@cindex license for manuals
+
+Please use the GNU Free Documentation License for all GNU manuals that
+are more than a few pages long. Likewise for a collection of short
+documents---you only need one copy of the GNU FDL for the whole
+collection. For a single short document, you can use a very permissive
+non-copyleft license, to avoid taking up space with a long license.
+
+See @uref{http://www.gnu.org/copyleft/fdl-howto.html} for more explanation
+of how to employ the GFDL.
+
+Note that it is not obligatory to include a copy of the GNU GPL or GNU
+LGPL in a manual whose license is neither the GPL nor the LGPL. It can
+be a good idea to include the program's license in a large manual; in a
+short manual, whose size would be increased considerably by including
+the program's license, it is probably better not to include it.
+
+@node Manual Credits
+@section Manual Credits
+@cindex credits for manuals
+
+Please credit the principal human writers of the manual as the authors,
+on the title page of the manual. If a company sponsored the work, thank
+the company in a suitable place in the manual, but do not cite the
+company as an author.
+
+@node Printed Manuals
+@section Printed Manuals
+
+The FSF publishes some GNU manuals in printed form. To encourage sales
+of these manuals, the on-line versions of the manual should mention at
+the very start that the printed manual is available and should point at
+information for getting it---for instance, with a link to the page
+@url{http://www.gnu.org/order/order.html}. This should not be included
+in the printed manual, though, because there it is redundant.
+
+It is also useful to explain in the on-line forms of the manual how the
+user can print out the manual from the sources.
+
+@node NEWS File
+@section The NEWS File
+@cindex @file{NEWS} file
+
+In addition to its manual, the package should have a file named
+@file{NEWS} which contains a list of user-visible changes worth
+mentioning. In each new release, add items to the front of the file and
+identify the version they pertain to. Don't discard old items; leave
+them in the file after the newer items. This way, a user upgrading from
+any previous version can see what is new.
+
+If the @file{NEWS} file gets very long, move some of the older items
+into a file named @file{ONEWS} and put a note at the end referring the
+user to that file.
+
+@node Change Logs
+@section Change Logs
+@cindex change logs
+
+Keep a change log to describe all the changes made to program source
+files. The purpose of this is so that people investigating bugs in the
+future will know about the changes that might have introduced the bug.
+Often a new bug can be found by looking at what was recently changed.
+More importantly, change logs can help you eliminate conceptual
+inconsistencies between different parts of a program, by giving you a
+history of how the conflicting concepts arose and who they came from.
+
+@menu
+* Change Log Concepts::
+* Style of Change Logs::
+* Simple Changes::
+* Conditional Changes::
+* Indicating the Part Changed::
+@end menu
+
+@node Change Log Concepts
+@subsection Change Log Concepts
+
+You can think of the change log as a conceptual ``undo list'' which
+explains how earlier versions were different from the current version.
+People can see the current version; they don't need the change log
+to tell them what is in it. What they want from a change log is a
+clear explanation of how the earlier version differed.
+
+The change log file is normally called @file{ChangeLog} and covers an
+entire directory. Each directory can have its own change log, or a
+directory can use the change log of its parent directory---it's up to
+you.
+
+Another alternative is to record change log information with a version
+control system such as RCS or CVS. This can be converted automatically
+to a @file{ChangeLog} file using @code{rcs2log}; in Emacs, the command
+@kbd{C-x v a} (@code{vc-update-change-log}) does the job.
+
+There's no need to describe the full purpose of the changes or how
+they work together. However, sometimes it is useful to write one line
+to describe the overall purpose of a change or a batch of changes. If
+you think that a change calls for explanation, you're probably right.
+Please do explain it---but please put the full explanation in comments
+in the code, where people will see it whenever they see the code. For
+example, ``New function'' is enough for the change log when you add a
+function, because there should be a comment before the function
+definition to explain what it does.
+
+In the past, we recommended not mentioning changes in non-software
+files (manuals, help files, etc.) in change logs. However, we've been
+advised that it is a good idea to include them, for the sake of
+copyright records.
+
+The easiest way to add an entry to @file{ChangeLog} is with the Emacs
+command @kbd{M-x add-change-log-entry}. An entry should have an
+asterisk, the name of the changed file, and then in parentheses the name
+of the changed functions, variables or whatever, followed by a colon.
+Then describe the changes you made to that function or variable.
+
+@node Style of Change Logs
+@subsection Style of Change Logs
+@cindex change logs, style
+
+Here are some simple examples of change log entries, starting with the
+header line that says who made the change and when it was installed,
+followed by descriptions of specific changes. (These examples are
+drawn from Emacs and GCC.)
+
+@example
+1998-08-17 Richard Stallman <rms@@gnu.org>
+
+* register.el (insert-register): Return nil.
+(jump-to-register): Likewise.
+
+* sort.el (sort-subr): Return nil.
+
+* tex-mode.el (tex-bibtex-file, tex-file, tex-region):
+Restart the tex shell if process is gone or stopped.
+(tex-shell-running): New function.
+
+* expr.c (store_one_arg): Round size up for move_block_to_reg.
+(expand_call): Round up when emitting USE insns.
+* stmt.c (assign_parms): Round size up for move_block_from_reg.
+@end example
+
+It's important to name the changed function or variable in full. Don't
+abbreviate function or variable names, and don't combine them.
+Subsequent maintainers will often search for a function name to find all
+the change log entries that pertain to it; if you abbreviate the name,
+they won't find it when they search.
+
+For example, some people are tempted to abbreviate groups of function
+names by writing @samp{* register.el (@{insert,jump-to@}-register)};
+this is not a good idea, since searching for @code{jump-to-register} or
+@code{insert-register} would not find that entry.
+
+Separate unrelated change log entries with blank lines. When two
+entries represent parts of the same change, so that they work together,
+then don't put blank lines between them. Then you can omit the file
+name and the asterisk when successive entries are in the same file.
+
+Break long lists of function names by closing continued lines with
+@samp{)}, rather than @samp{,}, and opening the continuation with
+@samp{(} as in this example:
+
+@example
+* keyboard.c (menu_bar_items, tool_bar_items)
+(Fexecute_extended_command): Deal with 'keymap' property.
+@end example
+
+When you install someone else's changes, put the contributor's name in
+the change log entry rather than in the text of the entry. In other
+words, write this:
+
+@example
+2002-07-14 John Doe <jdoe@@gnu.org>
+
+ * sewing.c: Make it sew.
+@end example
+
+@noindent
+rather than this:
+
+@example
+2002-07-14 Usual Maintainer <usual@@gnu.org>
+
+ * sewing.c: Make it sew. Patch by jdoe@@gnu.org.
+@end example
+
+As for the date, that should be the date you applied the change.
+
+@node Simple Changes
+@subsection Simple Changes
+
+Certain simple kinds of changes don't need much detail in the change
+log.
+
+When you change the calling sequence of a function in a simple fashion,
+and you change all the callers of the function to use the new calling
+sequence, there is no need to make individual entries for all the
+callers that you changed. Just write in the entry for the function
+being called, ``All callers changed''---like this:
+
+@example
+* keyboard.c (Fcommand_execute): New arg SPECIAL.
+All callers changed.
+@end example
+
+When you change just comments or doc strings, it is enough to write an
+entry for the file, without mentioning the functions. Just ``Doc
+fixes'' is enough for the change log.
+
+There's no technical need to make change log entries for documentation
+files. This is because documentation is not susceptible to bugs that
+are hard to fix. Documentation does not consist of parts that must
+interact in a precisely engineered fashion. To correct an error, you
+need not know the history of the erroneous passage; it is enough to
+compare what the documentation says with the way the program actually
+works.
+
+However, you should keep change logs for documentation files when the
+project gets copyright assignments from its contributors, so as to
+make the records of authorship more accurate.
+
+@node Conditional Changes
+@subsection Conditional Changes
+@cindex conditional changes, and change logs
+@cindex change logs, conditional changes
+
+Source files can often contain code that is conditional to build-time
+or static conditions. For example, C programs can contain
+compile-time @code{#if} conditionals; programs implemented in
+interpreted languages can contain module imports of function
+definitions that are only performed for certain versions of the
+interpreter; and Automake @file{Makefile.am} files can contain
+variable definitions or target declarations that are only to be
+considered if a configure-time Automake conditional is true.
+
+Many changes are conditional as well: sometimes you add a new variable,
+or function, or even a new program or library, which is entirely
+dependent on a build-time condition. It is useful to indicate
+in the change log the conditions for which a change applies.
+
+Our convention for indicating conditional changes is to use
+@emph{square brackets around the name of the condition}.
+
+Conditional changes can happen in numerous scenarios and with many
+variations, so here are some examples to help clarify. This first
+example describes changes in C, Perl, and Python files which are
+conditional but do not have an associated function or entity name:
+
+@example
+* xterm.c [SOLARIS2]: Include <string.h>.
+* FilePath.pm [$^O eq 'VMS']: Import the VMS::Feature module.
+* framework.py [sys.version_info < (2, 6)]: Make "with" statement
+ available by importing it from __future__,
+ to support also python 2.5.
+@end example
+
+Our other examples will for simplicity be limited to C, as the minor
+changes necessary to adapt them to other languages should be
+self-evident.
+
+Next, here is an entry describing a new definition which is entirely
+conditional: the C macro @code{FRAME_WINDOW_P} is defined (and used)
+only when the macro @code{HAVE_X_WINDOWS} is defined:
+
+@example
+* frame.h [HAVE_X_WINDOWS] (FRAME_WINDOW_P): Macro defined.
+@end example
+
+Next, an entry for a change within the function @code{init_display},
+whose definition as a whole is unconditional, but the changes
+themselves are contained in a @samp{#ifdef HAVE_LIBNCURSES}
+conditional:
+
+@example
+* dispnew.c (init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
+@end example
+
+Finally, here is an entry for a change that takes effect only when
+a certain macro is @emph{not} defined:
+
+@example
+(gethostname) [!HAVE_SOCKETS]: Replace with winsock version.
+@end example
+
+@node Indicating the Part Changed
+@subsection Indicating the Part Changed
+
+Indicate the part of a function which changed by using angle brackets
+enclosing an indication of what the changed part does. Here is an entry
+for a change in the part of the function @code{sh-while-getopts} that
+deals with @code{sh} commands:
+
+@example
+* progmodes/sh-script.el (sh-while-getopts) <sh>: Handle case that
+user-specified option string is empty.
+@end example
+
+
+@node Man Pages
+@section Man Pages
+@cindex man pages
+
+In the GNU project, man pages are secondary. It is not necessary or
+expected for every GNU program to have a man page, but some of them do.
+It's your choice whether to include a man page in your program.
+
+When you make this decision, consider that supporting a man page
+requires continual effort each time the program is changed. The time
+you spend on the man page is time taken away from more useful work.
+
+For a simple program which changes little, updating the man page may be
+a small job. Then there is little reason not to include a man page, if
+you have one.
+
+For a large program that changes a great deal, updating a man page may
+be a substantial burden. If a user offers to donate a man page, you may
+find this gift costly to accept. It may be better to refuse the man
+page unless the same person agrees to take full responsibility for
+maintaining it---so that you can wash your hands of it entirely. If
+this volunteer later ceases to do the job, then don't feel obliged to
+pick it up yourself; it may be better to withdraw the man page from the
+distribution until someone else agrees to update it.
+
+When a program changes only a little, you may feel that the
+discrepancies are small enough that the man page remains useful without
+updating. If so, put a prominent note near the beginning of the man
+page explaining that you don't maintain it and that the Texinfo manual
+is more authoritative. The note should say how to access the Texinfo
+documentation.
+
+Be sure that man pages include a copyright statement and free license.
+The simple all-permissive license is appropriate for simple man pages
+(@pxref{License Notices for Other Files,,,maintain,Information for GNU
+Maintainers}).
+
+For long man pages, with enough explanation and documentation that
+they can be considered true manuals, use the GFDL (@pxref{License for
+Manuals}).
+
+Finally, the GNU help2man program
+(@uref{http://www.gnu.org/software/help2man/}) is one way to automate
+generation of a man page, in this case from @option{--help} output.
+This is sufficient in many cases.
+
+@node Reading other Manuals
+@section Reading other Manuals
+
+There may be non-free books or documentation files that describe the
+program you are documenting.
+
+It is ok to use these documents for reference, just as the author of a
+new algebra textbook can read other books on algebra. A large portion
+of any non-fiction book consists of facts, in this case facts about how
+a certain program works, and these facts are necessarily the same for
+everyone who writes about the subject. But be careful not to copy your
+outline structure, wording, tables or examples from preexisting non-free
+documentation. Copying from free documentation may be ok; please check
+with the FSF about the individual case.
+
+@node Managing Releases
+@chapter The Release Process
+@cindex releasing
+
+Making a release is more than just bundling up your source files in a
+tar file and putting it up for FTP. You should set up your software so
+that it can be configured to run on a variety of systems. Your Makefile
+should conform to the GNU standards described below, and your directory
+layout should also conform to the standards discussed below. Doing so
+makes it easy to include your package into the larger framework of
+all GNU software.
+
+@menu
+* Configuration:: How configuration of GNU packages should work.
+* Makefile Conventions:: Makefile conventions.
+* Releases:: Making releases
+@end menu
+
+@node Configuration
+@section How Configuration Should Work
+@cindex program configuration
+
+@pindex configure
+Each GNU distribution should come with a shell script named
+@code{configure}. This script is given arguments which describe the
+kind of machine and system you want to compile the program for.
+The @code{configure} script must record the configuration options so
+that they affect compilation.
+
+The description here is the specification of the interface for the
+@code{configure} script in GNU packages. Many packages implement it
+using GNU Autoconf (@pxref{Top,, Introduction, autoconf, Autoconf})
+and/or GNU Automake (@pxref{Top,, Introduction, automake, Automake}),
+but you do not have to use these tools. You can implement it any way
+you like; for instance, by making @code{configure} be a wrapper around
+a completely different configuration system.
+
+Another way for the @code{configure} script to operate is to make a
+link from a standard name such as @file{config.h} to the proper
+configuration file for the chosen system. If you use this technique,
+the distribution should @emph{not} contain a file named
+@file{config.h}. This is so that people won't be able to build the
+program without configuring it first.
+
+Another thing that @code{configure} can do is to edit the Makefile. If
+you do this, the distribution should @emph{not} contain a file named
+@file{Makefile}. Instead, it should include a file @file{Makefile.in} which
+contains the input used for editing. Once again, this is so that people
+won't be able to build the program without configuring it first.
+
+If @code{configure} does write the @file{Makefile}, then @file{Makefile}
+should have a target named @file{Makefile} which causes @code{configure}
+to be rerun, setting up the same configuration that was set up last
+time. The files that @code{configure} reads should be listed as
+dependencies of @file{Makefile}.
+
+All the files which are output from the @code{configure} script should
+have comments at the beginning explaining that they were generated
+automatically using @code{configure}. This is so that users won't think
+of trying to edit them by hand.
+
+The @code{configure} script should write a file named @file{config.status}
+which describes which configuration options were specified when the
+program was last configured. This file should be a shell script which,
+if run, will recreate the same configuration.
+
+The @code{configure} script should accept an option of the form
+@samp{--srcdir=@var{dirname}} to specify the directory where sources are found
+(if it is not the current directory). This makes it possible to build
+the program in a separate directory, so that the actual source directory
+is not modified.
+
+If the user does not specify @samp{--srcdir}, then @code{configure} should
+check both @file{.} and @file{..} to see if it can find the sources. If
+it finds the sources in one of these places, it should use them from
+there. Otherwise, it should report that it cannot find the sources, and
+should exit with nonzero status.
+
+Usually the easy way to support @samp{--srcdir} is by editing a
+definition of @code{VPATH} into the Makefile. Some rules may need to
+refer explicitly to the specified source directory. To make this
+possible, @code{configure} can add to the Makefile a variable named
+@code{srcdir} whose value is precisely the specified directory.
+
+In addition, the @samp{configure} script should take options
+corresponding to most of the standard directory variables
+(@pxref{Directory Variables}). Here is the list:
+
+@example
+--prefix --exec-prefix --bindir --sbindir --libexecdir --sysconfdir
+--sharedstatedir --localstatedir --libdir --includedir --oldincludedir
+--datarootdir --datadir --infodir --localedir --mandir --docdir
+--htmldir --dvidir --pdfdir --psdir
+@end example
+
+The @code{configure} script should also take an argument which specifies the
+type of system to build the program for. This argument should look like
+this:
+
+@example
+@var{cpu}-@var{company}-@var{system}
+@end example
+
+For example, an Athlon-based GNU/Linux system might be
+@samp{i686-pc-linux-gnu}.
+
+The @code{configure} script needs to be able to decode all plausible
+alternatives for how to describe a machine. Thus,
+@samp{athlon-pc-gnu/linux} would be a valid alias. There is a shell
+script called
+@uref{http://git.savannah.gnu.org/@/gitweb/@/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD,
+@file{config.sub}} that you can use as a subroutine to validate system
+types and canonicalize aliases.
+
+The @code{configure} script should also take the option
+@option{--build=@var{buildtype}}, which should be equivalent to a
+plain @var{buildtype} argument. For example, @samp{configure
+--build=i686-pc-linux-gnu} is equivalent to @samp{configure
+i686-pc-linux-gnu}. When the build type is not specified by an option
+or argument, the @code{configure} script should normally guess it using
+the shell script
+@uref{http://git.savannah.gnu.org/@/gitweb/@/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD,
+@file{config.guess}}.
+
+@cindex optional features, configure-time
+Other options are permitted to specify in more detail the software
+or hardware present on the machine, to include or exclude optional parts
+of the package, or to adjust the name of some tools or arguments to them:
+
+@table @samp
+@item --enable-@var{feature}@r{[}=@var{parameter}@r{]}
+Configure the package to build and install an optional user-level
+facility called @var{feature}. This allows users to choose which
+optional features to include. Giving an optional @var{parameter} of
+@samp{no} should omit @var{feature}, if it is built by default.
+
+No @samp{--enable} option should @strong{ever} cause one feature to
+replace another. No @samp{--enable} option should ever substitute one
+useful behavior for another useful behavior. The only proper use for
+@samp{--enable} is for questions of whether to build part of the program
+or exclude it.
+
+@item --with-@var{package}
+@c @r{[}=@var{parameter}@r{]}
+The package @var{package} will be installed, so configure this package
+to work with @var{package}.
+
+@c Giving an optional @var{parameter} of
+@c @samp{no} should omit @var{package}, if it is used by default.
+
+Possible values of @var{package} include
+@samp{gnu-as} (or @samp{gas}), @samp{gnu-ld}, @samp{gnu-libc},
+@samp{gdb},
+@samp{x},
+and
+@samp{x-toolkit}.
+
+Do not use a @samp{--with} option to specify the file name to use to
+find certain files. That is outside the scope of what @samp{--with}
+options are for.
+
+@item @var{variable}=@var{value}
+Set the value of the variable @var{variable} to @var{value}. This is
+used to override the default values of commands or arguments in the
+build process. For example, the user could issue @samp{configure
+CFLAGS=-g CXXFLAGS=-g} to build with debugging information and without
+the default optimization.
+
+Specifying variables as arguments to @code{configure}, like this:
+@example
+./configure CC=gcc
+@end example
+is preferable to setting them in environment variables:
+@example
+CC=gcc ./configure
+@end example
+as it helps to recreate the same configuration later with
+@file{config.status}. However, both methods should be supported.
+@end table
+
+All @code{configure} scripts should accept all of the ``detail''
+options and the variable settings, whether or not they make any
+difference to the particular package at hand. In particular, they
+should accept any option that starts with @samp{--with-} or
+@samp{--enable-}. This is so users will be able to configure an
+entire GNU source tree at once with a single set of options.
+
+You will note that the categories @samp{--with-} and @samp{--enable-}
+are narrow: they @strong{do not} provide a place for any sort of option
+you might think of. That is deliberate. We want to limit the possible
+configuration options in GNU software. We do not want GNU programs to
+have idiosyncratic configuration options.
+
+Packages that perform part of the compilation process may support
+cross-compilation. In such a case, the host and target machines for the
+program may be different.
+
+The @code{configure} script should normally treat the specified type of
+system as both the host and the target, thus producing a program which
+works for the same type of machine that it runs on.
+
+To compile a program to run on a host type that differs from the build
+type, use the configure option @option{--host=@var{hosttype}}, where
+@var{hosttype} uses the same syntax as @var{buildtype}. The host type
+normally defaults to the build type.
+
+To configure a cross-compiler, cross-assembler, or what have you, you
+should specify a target different from the host, using the configure
+option @samp{--target=@var{targettype}}. The syntax for
+@var{targettype} is the same as for the host type. So the command would
+look like this:
+
+@example
+./configure --host=@var{hosttype} --target=@var{targettype}
+@end example
+
+The target type normally defaults to the host type.
+Programs for which cross-operation is not meaningful need not accept the
+@samp{--target} option, because configuring an entire operating system for
+cross-operation is not a meaningful operation.
+
+Some programs have ways of configuring themselves automatically. If
+your program is set up to do this, your @code{configure} script can simply
+ignore most of its arguments.
+
+@comment The makefile standards are in a separate file that is also
+@comment included by make.texinfo. Done by roland@gnu.ai.mit.edu on 1/6/93.
+@comment For this document, turn chapters into sections, etc.
+@lowersections
+@include make-stds.texi
+@raisesections
+
+@node Releases
+@section Making Releases
+@cindex packaging
+
+You should identify each release with a pair of version numbers, a
+major version and a minor. We have no objection to using more than
+two numbers, but it is very unlikely that you really need them.
+
+Package the distribution of @code{Foo version 69.96} up in a gzipped tar
+file with the name @file{foo-69.96.tar.gz}. It should unpack into a
+subdirectory named @file{foo-69.96}.
+
+Building and installing the program should never modify any of the files
+contained in the distribution. This means that all the files that form
+part of the program in any way must be classified into @dfn{source
+files} and @dfn{non-source files}. Source files are written by humans
+and never changed automatically; non-source files are produced from
+source files by programs under the control of the Makefile.
+
+@cindex @file{README} file
+The distribution should contain a file named @file{README} which gives
+the name of the package, and a general description of what it does. It
+is also good to explain the purpose of each of the first-level
+subdirectories in the package, if there are any. The @file{README} file
+should either state the version number of the package, or refer to where
+in the package it can be found.
+
+The @file{README} file should refer to the file @file{INSTALL}, which
+should contain an explanation of the installation procedure.
+
+The @file{README} file should also refer to the file which contains the
+copying conditions. The GNU GPL, if used, should be in a file called
+@file{COPYING}. If the GNU LGPL is used, it should be in a file called
+@file{COPYING.LESSER}.
+
+Naturally, all the source files must be in the distribution. It is
+okay to include non-source files in the distribution along with the
+source files they are generated from, provided they are up-to-date
+with the source they are made from, and machine-independent, so that
+normal building of the distribution will never modify them. We
+commonly include non-source files produced by Autoconf, Automake,
+Bison, @code{lex}, @TeX{}, and @code{makeinfo}; this helps avoid
+unnecessary dependencies between our distributions, so that users can
+install whichever packages they want to install.
+
+Non-source files that might actually be modified by building and
+installing the program should @strong{never} be included in the
+distribution. So if you do distribute non-source files, always make
+sure they are up to date when you make a new distribution.
+
+Make sure that all the files in the distribution are world-readable, and
+that directories are world-readable and world-searchable (octal mode 755).
+We used to recommend that all directories in the distribution also be
+world-writable (octal mode 777), because ancient versions of @code{tar}
+would otherwise not cope when extracting the archive as an unprivileged
+user. That can easily lead to security issues when creating the archive,
+however, so now we recommend against that.
+
+Don't include any symbolic links in the distribution itself. If the tar
+file contains symbolic links, then people cannot even unpack it on
+systems that don't support symbolic links. Also, don't use multiple
+names for one file in different directories, because certain file
+systems cannot handle this and that prevents unpacking the
+distribution.
+
+Try to make sure that all the file names will be unique on MS-DOS. A
+name on MS-DOS consists of up to 8 characters, optionally followed by a
+period and up to three characters. MS-DOS will truncate extra
+characters both before and after the period. Thus,
+@file{foobarhacker.c} and @file{foobarhacker.o} are not ambiguous; they
+are truncated to @file{foobarha.c} and @file{foobarha.o}, which are
+distinct.
+
+@cindex @file{texinfo.tex}, in a distribution
+Include in your distribution a copy of the @file{texinfo.tex} you used
+to test print any @file{*.texinfo} or @file{*.texi} files.
+
+Likewise, if your program uses small GNU software packages like regex,
+getopt, obstack, or termcap, include them in the distribution file.
+Leaving them out would make the distribution file a little smaller at
+the expense of possible inconvenience to a user who doesn't know what
+other files to get.
+
+@node References
+@chapter References to Non-Free Software and Documentation
+@cindex references to non-free material
+
+A GNU program should not recommend, promote, or grant legitimacy to
+the use of any non-free program. Proprietary software is a social and
+ethical problem, and our aim is to put an end to that problem. We
+can't stop some people from writing proprietary programs, or stop
+other people from using them, but we can and should refuse to
+advertise them to new potential customers, or to give the public the
+idea that their existence is ethical.
+
+The GNU definition of free software is found on the GNU web site at
+@url{http://www.gnu.org/@/philosophy/@/free-sw.html}, and the definition
+of free documentation is found at
+@url{http://www.gnu.org/@/philosophy/@/free-doc.html}. The terms ``free''
+and ``non-free'', used in this document, refer to those definitions.
+
+A list of important licenses and whether they qualify as free is in
+@url{http://www.gnu.org/@/licenses/@/license-list.html}. If it is not
+clear whether a license qualifies as free, please ask the GNU Project
+by writing to @email{licensing@@gnu.org}. We will answer, and if the
+license is an important one, we will add it to the list.
+
+When a non-free program or system is well known, you can mention it in
+passing---that is harmless, since users who might want to use it
+probably already know about it. For instance, it is fine to explain
+how to build your package on top of some widely used non-free
+operating system, or how to use it together with some widely used
+non-free program.
+
+However, you should give only the necessary information to help those
+who already use the non-free program to use your program with
+it---don't give, or refer to, any further information about the
+proprietary program, and don't imply that the proprietary program
+enhances your program, or that its existence is in any way a good
+thing. The goal should be that people already using the proprietary
+program will get the advice they need about how to use your free
+program with it, while people who don't already use the proprietary
+program will not see anything likely to lead them to take an interest
+in it.
+
+If a non-free program or system is obscure in your program's domain,
+your program should not mention or support it at all, since doing so
+would tend to popularize the non-free program more than it popularizes
+your program. (You cannot hope to find many additional users for your
+program among the users of Foobar, if the existence of Foobar is not
+generally known among people who might want to use your program.)
+
+Sometimes a program is free software in itself but depends on a
+non-free platform in order to run. For instance, many Java programs
+depend on some non-free Java libraries. To recommend or promote such
+a program is to promote the other programs it needs. This is why we
+are careful about listing Java programs in the Free Software
+Directory: we don't want to promote the non-free Java libraries.
+
+We hope this particular problem with Java will be gone by and by, as
+we replace the remaining non-free standard Java libraries with free
+software, but the general principle will remain the same: don't
+recommend, promote or legitimize programs that depend on non-free
+software to run.
+
+Some free programs strongly encourage the use of non-free software. A
+typical example is @command{mplayer}. It is free software in itself,
+and the free code can handle some kinds of files. However,
+@command{mplayer} recommends use of non-free codecs for other kinds of
+files, and users that install @command{mplayer} are very likely to
+install those codecs along with it. To recommend @command{mplayer}
+is, in effect, to promote use of the non-free codecs.
+
+Thus, you should not recommend programs that strongly encourage the
+use of non-free software. This is why we do not list
+@command{mplayer} in the Free Software Directory.
+
+A GNU package should not refer the user to any non-free documentation
+for free software. Free documentation that can be included in free
+operating systems is essential for completing the GNU system, or any
+free operating system, so encouraging it is a priority; to recommend
+use of documentation that we are not allowed to include undermines the
+impetus for the community to produce documentation that we can
+include. So GNU packages should never recommend non-free
+documentation.
+
+By contrast, it is ok to refer to journal articles and textbooks in
+the comments of a program for explanation of how it functions, even
+though they are non-free. This is because we don't include such
+things in the GNU system even if they are free---they are outside the
+scope of what a software distribution needs to include.
+
+Referring to a web site that describes or recommends a non-free
+program is promoting that program, so please do not make links to (or
+mention by name) web sites that contain such material. This policy is
+relevant particularly for the web pages for a GNU package.
+
+Following links from nearly any web site can lead eventually to
+non-free software; this is inherent in the nature of the web. So it
+makes no sense to criticize a site for having such links. As long as
+the site does not itself recommend a non-free program, there is no
+need to consider the question of the sites that it links to for other
+reasons.
+
+Thus, for example, you should not refer to AT&T's web site if that
+recommends AT&T's non-free software packages; you should not refer to
+a site that links to AT&T's site presenting it as a place to get some
+non-free program, because that link recommends and legitimizes the
+non-free program. However, that a site contains a link to AT&T's web
+site for some other purpose (such as long-distance telephone service)
+is not an objection against it.
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+
+@cindex FDL, GNU Free Documentation License
+@include fdl.texi
+
+@node Index
+@unnumbered Index
+@printindex cp
+
+@bye
+
+Local variables:
+eval: (add-hook 'write-file-hooks 'time-stamp)
+time-stamp-start: "@set lastupdate "
+time-stamp-end: "$"
+time-stamp-format: "%:b %:d, %:y"
+compile-command: "cd work.s && make"
+End:
diff --git a/doc/version.texi b/doc/version.texi
new file mode 100644
index 0000000..b9e94c9
--- /dev/null
+++ b/doc/version.texi
@@ -0,0 +1,4 @@
+@set UPDATED 24 April 2012
+@set UPDATED-MONTH April 2012
+@set EDITION 2.69
+@set VERSION 2.69