diff options
Diffstat (limited to 'm4/groff.m4')
-rw-r--r-- | m4/groff.m4 | 1886 |
1 files changed, 1886 insertions, 0 deletions
diff --git a/m4/groff.m4 b/m4/groff.m4 new file mode 100644 index 0000000..19bf7f9 --- /dev/null +++ b/m4/groff.m4 @@ -0,0 +1,1886 @@ +# Autoconf macros for groff. +# Copyright (C) 1989-2023 Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff 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. +# +# groff 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/>. + +# Locate a print spooler for certain output formats. + +AC_DEFUN([GROFF_PRINT], [ + groff_have_spooler=no + if test -z "$PSPRINT" + then + AC_CHECK_PROGS([LPR], [lpr]) + AC_CHECK_PROGS([LP], [lp]) + if test -n "$LPR" && test -n "$LP" + then + # HP-UX provides an lpr command that emulates lpr using lp, + # but it doesn't have lpq; in this case we want to use lp + # rather than lpr. + AC_CHECK_PROGS([LPQ], [lpq]) + test -n "$LPQ" || LPR= + fi + if test -n "$LPR" + then + PSPRINT="$LPR" + elif test -n "$LP" + then + PSPRINT="$LP" + fi + fi + + if test -n "$PSPRINT" + then + groff_have_spooler="$PSPRINT" + AC_SUBST([PSPRINT]) + # Figure out DVIPRINT from PSPRINT. + AC_MSG_CHECKING([option to use when spooling DVI files]) + spooler_option=none + if test -n "$PSPRINT" && test -z "$DVIPRINT" + then + if test "$PSPRINT" = lpr + then + spooler_option=-d + DVIPRINT="$PSPRINT $spooler_option" + else + DVIPRINT="$PSPRINT" + fi + fi + AC_SUBST([DVIPRINT]) + AC_MSG_RESULT([$spooler_option]) + fi +]) + +# Bison-generated parsers have problems with C++ compilers other than +# g++. Thus, byacc is preferred over bison. If no yacc program is +# available, we issue an error only if not building from a distribution +# archive, because files generated by a yacc are already present there. + +AC_DEFUN([GROFF_PROG_YACC], [ + AC_CHECK_PROGS([YACC], [byacc 'bison -y' yacc], [missing]) + if ! test -f "$srcdir"/.tarball-version + then + if test "$YACC" = missing + then + AC_MSG_ERROR([could not find 'byacc', 'bison', or 'yacc'], 1) + fi + fi +]) + +# We need Perl 5.6.1 or newer. + +AC_DEFUN([GROFF_PERL], [ + PERLVERSION=v5.6.1 + AC_PATH_PROG([PERL], [perl], [no]) + if test "$PERL" = no + then + AC_MSG_ERROR([perl binary not found], 1) + fi + AX_PROG_PERL_VERSION([$PERLVERSION], true, + AC_MSG_ERROR([perl version is too old], 1)) +]) + +# We need m4 to generate some man pages. + +AC_DEFUN([GROFF_PROG_M4], [ + AC_CHECK_PROGS([M4], [m4], [missing]) + if test "$M4" = missing + then + AC_MSG_ERROR([could not find 'm4'], 1) + fi +]) + +# We need makeinfo from Texinfo 5.0 or newer, for @codequoteundirected. +# The minor version checking logic is present for future needs. + +AC_DEFUN([GROFF_PROG_MAKEINFO], [ + # By default automake will set MAKEINFO to MAKEINFO = ${SHELL} <top + # src dir>/build-aux/missing makeinfo. As we need a more precise + # check of makeinfo version, we don't use it. + MAKEINFO= + missing= + AC_CHECK_PROG([MAKEINFO], [makeinfo], [makeinfo]) + if test -z "$MAKEINFO" + then + missing="missing 'makeinfo'" + else + AC_MSG_CHECKING([for makeinfo version]) + # We need an additional level of quoting to make sed's regexps + # work. + [makeinfo_version=`$MAKEINFO --version 2>&1 \ + | sed -e 's/^.* \([^ ][^ ]*\)$/\1/' -e '1q'`] + AC_MSG_RESULT([$makeinfo_version]) + # Consider only the first two numbers in version number string. + makeinfo_version_major=`IFS=.; set x $makeinfo_version; echo ${2}` + makeinfo_version_minor=`IFS=.; set x $makeinfo_version; echo ${3}` + makeinfo_version_numeric=` + expr ${makeinfo_version_major}000 + $makeinfo_version_minor` + if test $makeinfo_version_numeric -lt 5000 + then + missing="'makeinfo' is too old." + MAKEINFO= + fi + fi + + if test -n "$missing" + then + infofile=doc/groff.info + test -f $infofile || infofile="$srcdir"/$infofile + if test ! -f $infofile \ + || test "$srcdir"/doc/groff.texi -nt $infofile + then + AC_MSG_ERROR($missing +[Get the 'texinfo' package version 5.0 or newer.]) + fi + fi + AC_SUBST([MAKEINFO]) +]) + +# 'makeinfo' and 'texi2dvi' are distributed together, so if the former +# is too old, the latter is too. + +AC_DEFUN([GROFF_PROG_TEXI2DVI], [ + AC_REQUIRE([GROFF_PROG_MAKEINFO]) + AC_CHECK_PROG([PROG_TEXI2DVI], [texi2dvi], [texi2dvi], [missing]) + groff_have_texi2dvi=no + if test "$PROG_TEXI2DVI" != missing && test -n "$MAKEINFO" + then + groff_have_texi2dvi=yes + fi +]) + +# 'texi2dvi' can be installed without TeX itself, so check for a 'tex' +# executable independently. + +AC_DEFUN([GROFF_USE_TEX_CHECK], [ + AC_REQUIRE([GROFF_PROG_TEXI2DVI]) + AC_CHECK_PROG([PROG_TEX], [tex], [found], [missing]) + groff_use_tex=no + test "$PROG_TEX" = found && groff_use_tex=yes +]) + +# grohtml needs the following programs to produce images from tbl(1) +# tables and eqn(1) equations. + +dnl Any macro that tests $make_htmldoc should AC_REQUIRE this. + +AC_DEFUN([GROFF_CHECK_GROHTML_PROGRAMS], [ + AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH]) + + make_htmldoc=no + missing= + m4_foreach([groff_prog], +dnl Keep this list of programs in sync with grohtml test scripts. + [[pnmcrop], [pnmcut], [pnmtopng], [pnmtops], [psselect]], [ + AC_CHECK_PROG(groff_prog, groff_prog, [found], [missing]) + if test $[]groff_prog = missing + then + missing="$missing 'groff_prog'" + fi + ]) + + test "$GHOSTSCRIPT" = "missing" && missing="'gs' $missing" + + if test -z "$missing" + then + make_htmldoc=yes + else + plural=`set $missing; test $[#] -gt 1 && echo s` + oxford=`set $missing; test $[#] -gt 2 && echo ,` + missing=`set $missing + missing= + while test $[#] -gt 0 + do + case $[#] in + 1) missing="$missing$[1]" ;; + 2) missing="$missing$[1]$oxford and " ;; + *) missing="$missing$[1], " ;; + esac + shift + done + echo $missing` + verb=`set $missing + if test $[#] -gt 1 + then + echo were + else + echo was + fi` + + grohtml_notice="The program$plural $missing $verb not found in \ +\$PATH. + + Consequently, groff's HTML output driver, 'grohtml', will not work + properly. It will not be possible to prepare or install + groff-generated documentation in HTML format. +" + fi + AC_SUBST([make_htmldoc]) +]) + + +AC_DEFUN([GROFF_GROHTML_PROGRAM_NOTICE], [ + AC_REQUIRE([GROFF_CHECK_GROHTML_PROGRAMS]) + + if test "$make_htmldoc" = no + then + AC_MSG_NOTICE([$grohtml_notice]) + fi +]) + +dnl pdfroff uses awk, and we use it in GROFF_URW_FONTS_CHECK. + +AC_DEFUN([GROFF_AWK_NOTICE], [ + AC_REQUIRE([GROFF_AWK_PATH]) + + awk_names=awk + if test -n "$ALT_AWK_PROGS" + then + awk_names="$ALT_AWK_PROGS" + fi + + if test "$AWK" = missing + then + AC_MSG_NOTICE([No awk program was found in \$PATH. + + It was sought under the name(s) "$awk_names". + ]) + fi +]) + +AC_DEFUN([GROFF_PDFROFF_DEPENDENCIES_CHECK], [ + AC_REQUIRE([GROFF_AWK_PATH]) + AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH]) + + use_pdfroff=no + pdfroff_missing_deps= + + test "$AWK" = missing && pdfroff_missing_deps="awk" + + if test "$GHOSTSCRIPT" = missing + then + verb=is + + if test -n "$pdfroff_missing_deps" + then + pdfroff_missing_deps="$pdfroff_missing_deps and " + verb=are + fi + pdfroff_missing_deps="${pdfroff_missing_deps}Ghostscript $verb" + fi + + if test -z "$pdfroff_missing_deps" + then + use_pdfroff=yes + fi + + AC_SUBST([use_pdfroff]) +]) + +AC_DEFUN([GROFF_GROPDF_DEPENDENCIES_CHECK], [ + AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH]) + AC_REQUIRE([GROFF_URW_FONTS_CHECK]) + + use_gropdf=no + gropdf_missing_deps= + + if test "$GHOSTSCRIPT" != missing \ + || test "$groff_have_urw_fonts" = yes + then + use_gropdf=yes + fi + + AC_SUBST([use_gropdf]) +]) + +AC_DEFUN([GROFF_PDFROFF_PROGRAM_NOTICE], [ + AC_REQUIRE([GROFF_PDFROFF_DEPENDENCIES_CHECK]) + + if test "$use_pdfroff" = no + then + AC_MSG_NOTICE(['pdfroff' will not be functional. + + Because $pdfroff_missing_deps missing, 'pdfroff' will not operate + and the 'pdfmark.pdf' document will not be available. +]) + fi +]) + +AC_DEFUN([GROFF_GROPDF_PROGRAM_NOTICE], [ + AC_REQUIRE([GROFF_GROPDF_DEPENDENCIES_CHECK]) + + if test "$use_gropdf" = no + then + AC_MSG_NOTICE(['gropdf' will have reduced function. + + Neither Ghostscript nor URW fonts are available; groff documentation + thus will not be available in PDF. + + 'gropdf' will be able to handle only documents using the standard PDF + base 14 fonts, plus the 'EURO' font groff supplies, and font embedding + with its '-e' option (accessed via the 'groff' command with the option + '-P -e') will not be possible. +]) + fi +]) + +# Make URW font directory configurable. + +AC_DEFUN([GROFF_URW_FONTS_PATH], [ + AC_ARG_WITH([urw-fonts-dir], + [AS_HELP_STRING([--with-urw-fonts-dir=DIR], + [search for URW PostScript Type 1 fonts in DIR])], + [urwfontsdir="$withval"]) +]) + +# Check for availability of URW fonts in the directory specified by the +# user (see GROFF_URW_FONTS_PATH above). We do NOT search the path of +# directories built into Ghostscript because those fonts lack the +# corresponding AFM files we need to generate groff font description +# files; see afmtodit(1). Ghostscript's own fonts are treated as the +# "default foundry" and we already provide descriptions of them in +# font/devpdf (along with groff's EURO font). + +AC_DEFUN([GROFF_URW_FONTS_CHECK], [ + AC_REQUIRE([GROFF_URW_FONTS_PATH]) + AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH]) + groff_have_urw_fonts=no + AC_MSG_CHECKING([for URW fonts in Type 1/PFB format]) + +dnl Keep this list in sync with font/devpdf/Foundry.in. + _list_paths="\ + /usr/share/fonts/type1/gsfonts/ \ + /usr/share/fonts/default/Type1/ \ + /usr/share/fonts/default/Type1/adobestd35/ \ + /usr/share/fonts/type1/urw-base35/ \ + /opt/local/share/fonts/urw-fonts/ \ + /usr/local/share/fonts/ghostscript/" + + if test -n "$urwfontsdir" + then + _list_paths="$urwfontsdir" + fi + +dnl Keep this list of font file names in sync with the corresponding +dnl entry in font/devpdf/util/BuildFoundries.pl. + for k in $_list_paths + do + for _font_file in \ + URWGothic-Book \ + URWGothic-Book.t1 \ + URWGothic-Book.pfb \ + URWGothicL-Book.pfb \ + a010013l.pfb + do + if test -f $k/$_font_file + then + AC_MSG_RESULT([found in $k]) + groff_have_urw_fonts=yes + urwfontsdir=$k + break 2 + fi + done + done + + if test $groff_have_urw_fonts = no + then + AC_MSG_RESULT([none found]) + urwfontsdir= + fi + + AC_SUBST([groff_have_urw_fonts]) + AC_SUBST(urwfontsdir) +]) + +AC_DEFUN([GROFF_URW_FONTS_NOTICE], [ + if test "$groff_have_urw_fonts" = no + then + gs_verbiage= + if test "$GHOSTSCRIPT" != missing + then + gs_verbiage=' as well as the search path shown by the + "'"$GHOSTSCRIPT"' -h" command (if available)' + fi + AC_MSG_NOTICE([URW fonts in Type 1/PFB format were not found. + + groff font description files for the URW fonts, used by the 'gropdf' + output driver, will not be available. Use and embedding of fonts from + the 'U' foundry in PDF documents generated by groff will not be + possible. + + You can obtain the URW base 35 fonts from their GitHub project. As of + this writing (2023-02-15), you can find them in the 'fonts' directory + of the following archives (choose one). + + https://github.com/ArtifexSoftware/urw-base35-fonts/archive/refs/ + tags/20200910.zip + https://github.com/ArtifexSoftware/urw-base35-fonts/archive/refs/ + tags/20200910.tar.gz + + You may wish to check for a newer release. + + https://github.com/ArtifexSoftware/urw-base35-fonts/releases + + 'gropdf' looks for these fonts in several directories specified in + font/devpdf/Foundry.in$gs_verbiage. + + You will need to "make distclean" and re-run the 'configure' script + after installing the URW fonts. + + Alternatively, you can pass the option '--with-urw-fonts-dir=DIR' + to 'configure' to look for them in the directory DIR you specify. + If found, the 'U' foundry will be available via the '-y' option to + 'gropdf' (accessed via the 'groff' command with the option '-P -y'). + ]) + fi +]) + + +# Check whether the pnm tools accept the -quiet option. + +dnl Any macro that tests $pnmtools_quiet should AC_REQUIRE this. + +AC_DEFUN([GROFF_PNMTOOLS_CAN_BE_QUIET], [ + AC_REQUIRE([GROFF_CHECK_GROHTML_PROGRAMS]) + + pnmtools_quiet= + + if test "$make_htmldoc" = yes + then + AC_MSG_CHECKING([whether PNM tools accept the '-quiet' option]) + if echo P2 2 2 255 0 1 2 0 | pnmtops -quiet > /dev/null 2>&1 + then + AC_MSG_RESULT([yes]) + pnmtools_quiet=-quiet + else + AC_MSG_RESULT([no]) + fi + fi + AC_SUBST([pnmtools_quiet]) +]) + + +# Check whether pnmtops can handle the -nosetpage option. +# +# We require this both for grohtml operation and generation of +# doc/gnu.eps from repository builds. + +AC_DEFUN([GROFF_PNMTOPS_NOSETPAGE], [ + AC_REQUIRE([GROFF_PNMTOOLS_CAN_BE_QUIET]) + + pnmtops_nosetpage="pnmtops $pnmtools_quiet" + AC_MSG_CHECKING([whether pnmtops accepts the '-nosetpage' option]) + if echo P2 2 2 255 0 1 2 0 | pnmtops -nosetpage > /dev/null 2>&1 + then + AC_MSG_RESULT([yes]) + pnmtops_nosetpage="pnmtops $pnmtools_quiet -nosetpage" + else + AC_MSG_RESULT([no]) + fi + AC_SUBST([pnmtops_nosetpage]) +]) + + +# Check location of 'gs'; allow '--with-gs=PROG' option to override. + +dnl Any macro that tests $GHOSTSCRIPT should AC_REQUIRE this. + +AC_DEFUN([GROFF_GHOSTSCRIPT_PATH], + [AC_REQUIRE([GROFF_GHOSTSCRIPT_PREFS]) + AC_ARG_WITH([gs], + [AS_HELP_STRING([--with-gs=PROG], + [actual [/path/]name of ghostscript executable])], + [GHOSTSCRIPT=$withval], + [AC_CHECK_TOOLS(GHOSTSCRIPT, [$ALT_GHOSTSCRIPT_PROGS], [missing])]) + test "$GHOSTSCRIPT" = no && GHOSTSCRIPT=missing]) + +# Preferences for choice of 'gs' program... +# (allow --with-alt-gs="LIST" to override). + +AC_DEFUN([GROFF_GHOSTSCRIPT_PREFS], + [AC_ARG_WITH([alt-gs], + [AS_HELP_STRING([--with-alt-gs=LIST], + [alternative names for ghostscript executable])], + [ALT_GHOSTSCRIPT_PROGS="$withval"], + [ALT_GHOSTSCRIPT_PROGS="gs gswin32c gsos2"]) + AC_SUBST([ALT_GHOSTSCRIPT_PROGS])]) + +AC_DEFUN([GROFF_GHOSTSCRIPT_AVAILABILITY_NOTICE], [ + AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH]) + + gs_names=gs + if test -n "$ALT_GHOSTSCRIPT_PROGS" + then + gs_names="$ALT_GHOSTSCRIPT_PROGS" + fi + + if test "$GHOSTSCRIPT" = missing + then + AC_MSG_NOTICE([No Ghostscript program was found in \$PATH. + + It was sought under the name(s) "$gs_names". + + groff documentation will not be available in HTML. + + 'grohtml' will have reduced function, being unable to produce + documents using the 'tbl' preprocessor. + ]) + fi +]) + +# Ghostscript version check. Versions 9.00 <= x < 9.54 suffer from a +# rendering glitch that affects the AT&T troff (and groff) special +# character \(lh; see +# <https://bugs.ghostscript.com/show_bug.cgi?id=703187>. + +AC_DEFUN([GROFF_GHOSTSCRIPT_VERSION_CHECK], [ + AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH]) + + if test "$GHOSTSCRIPT" != missing + then + AC_MSG_CHECKING([for gs version with good left sidebearing handling]) + ghostscript_notice= + ghostscript_version_good= + ghostscript_v_string=`"$GHOSTSCRIPT" -v | sed 1q` + # Get first word. + ghostscript_words=`echo "$ghostscript_v_string" | cut -d\ -f1-` + + # If the first word is "GPL", discard it. + if expr "$ghostscript_words" : "GPL" > /dev/null + then + ghostscript_words=`echo "$ghostscript_words" | cut -d\ -f2-` + fi + + # Only do a version check if the program calls itself Ghostscript. + if expr "$ghostscript_words" : "Ghostscript" > /dev/null + then + ghostscript_version_good=no + ghostscript_version=`echo "$ghostscript_words" | cut -d\ -f2` + ghostscript_major=`echo "$ghostscript_version" | cut -d. -f1` + ghostscript_minor=`echo "$ghostscript_version" | cut -d. -f2` + + if test "$ghostscript_major" -lt 9 + then + ghostscript_version_good=yes + elif test "$ghostscript_major" -ge 10 + then + ghostscript_version_good=yes + elif test "$ghostscript_minor" -ge 54 + then + ghostscript_version_good=yes + fi + fi + + if test "$ghostscript_version_good" = yes + then + ghostscript_version="$ghostscript_version (good)" + elif test "$ghostscript_version_good" = no + then + ghostscript_version="$ghostscript_version (buggy)" + ghostscript_notice="Buggy version of Ghostscript detected." + else + ghostscript_notice="Unable to determine version of Ghostscript." + fi + + if test -n "$ghostscript_version" + then + AC_MSG_RESULT([got $ghostscript_version]) + else + AC_MSG_RESULT([unable to determine]) + fi + fi +]) + +AC_DEFUN([GROFF_GHOSTSCRIPT_VERSION_NOTICE], [ + if test -n "$ghostscript_notice" + then + AC_MSG_NOTICE([$ghostscript_notice + + Ghostscript versions 9.00 <= x < 9.54 suffer from a rendering glitch + that affects the AT&T troff (and groff) special character '\(lh'; see + <https://bugs.ghostscript.com/show_bug.cgi?id=703187>. If your + version of Ghostscript has not been patched to fix this problem, you + may need to work around it in groff documents you render for the + PostScript (and, for tbl(1) tables, HTML) output devices. + ]) + fi +]) + +# Check location of 'awk'; allow '--with-awk=PROG' option to override. + +AC_DEFUN([GROFF_AWK_PATH], + [AC_REQUIRE([GROFF_AWK_PREFS]) + AC_ARG_WITH([awk], + [AS_HELP_STRING([--with-awk=PROG], + [actual [/path/]name of awk executable])], + [AWK=$withval], + [AC_CHECK_TOOLS(AWK, [$ALT_AWK_PROGS], [missing])]) + test "$AWK" = no && AWK=missing]) + + +# Preferences for choice of 'awk' program; allow --with-alt-awk="LIST" +# to override. + +AC_DEFUN([GROFF_AWK_PREFS], + [AC_ARG_WITH([alt-awk], + [AS_HELP_STRING([--with-alt-awk=LIST], + [alternative names for awk executable])], + [ALT_AWK_PROGS="$withval"], + [ALT_AWK_PROGS="gawk mawk nawk awk"]) + AC_SUBST([ALT_AWK_PROGS])]) + + +# GROFF_CSH_HACK(if hack present, if not present) + +AC_DEFUN([GROFF_CSH_HACK], + [AC_MSG_CHECKING([for csh hash hack]) + +cat <<EOF >conftest.sh +#! /bin/sh +true || exit 0 +export PATH || exit 0 +exit 1 +EOF + + chmod +x conftest.sh + if echo ./conftest.sh | (csh >/dev/null 2>&1) >/dev/null 2>&1; then + AC_MSG_RESULT([yes]) + $1 + else + AC_MSG_RESULT([no]) + $2 + fi + rm -f conftest.sh]) + + +# From udodo!hans@relay.NL.net (Hans Zuidam) + +AC_DEFUN([GROFF_ISC_SYSV3], + [AC_MSG_CHECKING([for ISC 3.x or 4.x]) + if grep ['[34]\.'] /usr/options/cb.name >/dev/null 2>&1 + then + AC_MSG_RESULT([yes]) + AC_DEFINE([_SYSV3], [1], [Define if you have ISC 3.x or 4.x.]) + else + AC_MSG_RESULT([no]) + fi]) + +AC_DEFUN([GROFF_POSIX], + [AC_MSG_CHECKING([whether -D_POSIX_SOURCE is necessary]) + AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <stdio.h> +extern "C" { void fileno(int); } + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE([_POSIX_SOURCE], [1], + [Define if -D_POSIX_SOURCE is necessary.])], + [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++])]) + + +# srand() of SunOS 4.1.3 has return type int instead of void + +AC_DEFUN([GROFF_SRAND], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([for return type of srand]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <stdlib.h> +extern "C" { void srand(unsigned int); } + + ]]) + ], + [AC_MSG_RESULT([void]) + AC_DEFINE([RET_TYPE_SRAND_IS_VOID], [1], + [Define if srand() returns void not int.])], + [AC_MSG_RESULT([int])]) + AC_LANG_POP([C++])]) + + +# In April 2005, autoconf's AC_TYPE_SIGNAL is still broken. + +AC_DEFUN([GROFF_TYPE_SIGNAL], + [AC_MSG_CHECKING([for return type of signal handlers]) + for groff_declaration in \ + 'extern "C" void (*signal (int, void (*)(int)))(int);' \ + 'extern "C" void (*signal (int, void (*)(int)) throw ())(int);' \ + 'void (*signal ()) ();' + do + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <sys/types.h> +#include <signal.h> +#ifdef signal +# undef signal +#endif +$groff_declaration + + ]], + [[ + +int i; + + ]]) + ], + [break], + [continue]) + done + + if test -n "$groff_declaration"; then + AC_MSG_RESULT([void]) + AC_DEFINE([RETSIGTYPE], [void], + [Define as the return type of signal handlers + ('int' or 'void').]) + else + AC_MSG_RESULT([int]) + AC_DEFINE([RETSIGTYPE], [int], + [Define as the return type of signal handlers + ('int' or 'void').]) + fi]) + + +AC_DEFUN([GROFF_SYS_NERR], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([for sys_nerr in <errno.h>, <stdio.h>, or <stdlib.h>]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> + + ]], + [[ + +int k; +k = sys_nerr; + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_SYS_NERR], [1], + [Define if you have sys_nerr in <errno.h>, <stdio.h>, or <stdio.h>.])], + [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++])]) + +AC_DEFUN([GROFF_SYS_ERRLIST], + [AC_MSG_CHECKING([for sys_errlist[] in <errno.h>, <stdio.h>, or <stdlib.h>]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> + + ]], + [[ + +int k; +k = (int)sys_errlist[0]; + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_SYS_ERRLIST], [1], + [Define if you have sys_errlist in <errno.h>, <stdio.h>, or <stdlib.h>.])], + [AC_MSG_RESULT([no])])]) + +AC_DEFUN([GROFF_OSFCN_H], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([C++ <osfcn.h>]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <osfcn.h> + + ]], + [[ + +read(0, 0, 0); +open(0, 0); + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_CC_OSFCN_H], [1], + [Define if you have a C++ <osfcn.h>.])], + [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++])]) + + +AC_DEFUN([GROFF_LIMITS_H], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([C++ <limits.h>]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <limits.h> + + ]], + [[ + +int x = INT_MIN; +int y = INT_MAX; +int z = UCHAR_MAX; + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_CC_LIMITS_H], [1], + [Define if you have a C++ <limits.h>.])], + [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++])]) + +AC_DEFUN([GROFF_TIME_T], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([for declaration of time_t]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <time.h> + + ]], + [[ + +time_t t = time(0); +struct tm *p = localtime(&t); + + ]]) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_DEFINE([LONG_FOR_TIME_T], [1], + [Define if localtime() takes a long * not a time_t *.])]) + AC_LANG_POP([C++])]) + +AC_DEFUN([GROFF_STRUCT_EXCEPTION], + [AC_MSG_CHECKING([struct exception]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <math.h> + + ]], + [[ + +struct exception e; + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_STRUCT_EXCEPTION], [1], + [Define if <math.h> defines struct exception.])], + [AC_MSG_RESULT([no])])]) + +AC_DEFUN([GROFF_ARRAY_DELETE], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([whether ISO C++98 array deletion syntax is supported]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM(, [[ + +char *p = new char[5]; +delete [] p; + + ]]) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([an ISO C++98-conformant compiler is required])]) + AC_LANG_POP([C++])]) + +AC_DEFUN([GROFF_TRADITIONAL_CPP], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([whether C preprocessor uses pre-ISO C90 syntax]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#define name2(a, b) a/**/b + + ]], + [[ + +int name2(foo, bar); + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_MSG_ERROR([an ISO C90-conformant C preprocessor is required])], + [AC_MSG_RESULT([no])]) + AC_LANG_POP([C++])]) + +AC_DEFUN([GROFF_WCOREFLAG], + [AC_MSG_CHECKING([w_coredump]) + AC_RUN_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <sys/types.h> +#include <sys/wait.h> + + ]], + [[ + +main() +{ +#ifdef WCOREFLAG + exit(1); +#else + int i = 0; + ((union wait *)&i)->w_coredump = 1; + exit(i != 0200); +#endif +} + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE(WCOREFLAG, 0200, + [Define if the 0200 bit of the status returned by wait() indicates + whether a core image was produced for a process that was terminated + by a signal.])], + [AC_MSG_RESULT([no])], + [AC_MSG_RESULT([no])])]) + + +AC_DEFUN([GROFF_BROKEN_SPOOLER_FLAGS], + [AC_MSG_CHECKING([default value for grops -b option]) + test -n "$BROKEN_SPOOLER_FLAGS" || BROKEN_SPOOLER_FLAGS=0 + AC_MSG_RESULT([$BROKEN_SPOOLER_FLAGS]) + AC_SUBST([BROKEN_SPOOLER_FLAGS])]) + + +AC_DEFUN([GROFF_PAGE], [ + AC_MSG_CHECKING([default paper format]) + groff_prefix=$prefix + test "$prefix" = NONE && groff_prefix=$ac_default_prefix + if test -z "$PAGE" && test -r /etc/papersize + then + sedexpr='s/#.*//;s/[ \t]\+/ /;s/ \+$//;s/^ \+//;/^$/d;p' + PAGE=`sed -n "$sedexpr" /etc/papersize` + fi + if test -z "$PAGE" + then + descfile= + if test -r "$groff_prefix"/share/groff/font/devps/DESC + then + descfile=$groff_prefix/share/groff/font/devps/DESC + elif test -r "$groff_prefix"/lib/groff/font/devps/DESC + then + descfile=$groff_prefix/lib/groff/font/devps/DESC + else + for f in "$groff_prefix"/share/groff/*/font/devps/DESC + do + if test -r "$f" + then + descfile=$f + break + fi + done + fi + + if test -n "$descfile" + then + if grep -q ['^paperlength[ ]\+841890'] "$descfile" + then + PAGE=A4 + elif grep -q ['^papersize[ ]\+[aA]4'] "$descfile" + then + PAGE=A4 + fi + fi + fi + + if test -z "$PAGE" + then + domains= + if test -r /etc/resolv.conf + then + sedexpr='s/#.*//;s/[ \t]\+/ /;s/ \+$//;s/^ \+//;/^$/d; +/^\(domain\|search\)/!d;s/\(domain\|search\) //;p' + domains=`sed -n "$sedexpr" /etc/resolv.conf` + fi + if test -z "$domains" + then + domains=`(domainname) 2>/dev/null | tr -d '+'` + if test -z "$domains" || test "$domains" = '(none)' + then + domains=`(hostname) 2>/dev/null | grep '\.'` + fi + fi + # resolv.conf's "search" directive might return multiple domains. + # If any top-level domain is two letters and it's not 'us' or 'ca', + # assume the system uses A4 paper. + for d in $domains + do + case "$d" in + [*.[Uu][Ss]|*.[Cc][Aa])] + ;; + [*.[A-Za-z][A-Za-z])] + PAGE=A4 ;; + esac + done + fi + + test -n "$PAGE" || PAGE=letter + AC_MSG_RESULT([$PAGE]) + AC_SUBST([PAGE]) +]) + + +AC_DEFUN([GROFF_CXX_CHECK], + [AC_REQUIRE([AC_PROG_CXX]) + AC_LANG_PUSH([C++]) + if test "$cross_compiling" = no; then + AC_MSG_CHECKING([that C++ compiler can compile simple program]) + fi + AC_RUN_IFELSE([ + AC_LANG_SOURCE([[ + +int main() { + return 0; +} + + ]]) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([a working C++ compiler is required])], + [:]) + + if test "$cross_compiling" = no; then + AC_MSG_CHECKING([that C++ static constructors and destructors are called]) + fi + AC_RUN_IFELSE([ + AC_LANG_SOURCE([[ + +extern "C" { + void _exit(int); +} + +int i; +struct A { + char dummy; + A() { i = 1; } + ~A() { if (i == 1) _exit(0); } +}; + +A a; + +int main() +{ + return 1; +} + + ]]) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([a working C++ compiler is required])], + [:]) + + AC_MSG_CHECKING([that header files support C++]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <stdio.h> + + ]], + [[ + +fopen(0, 0); + + ]]) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([header files do not support C++ + (if you are using a version of gcc/g++ earlier than 2.5, + you should install libg++)])]) + AC_LANG_POP([C++])]) + + +AC_DEFUN([GROFF_TMAC], + [AC_MSG_CHECKING([for prefix of system macro packages]) + sys_tmac_prefix= + sys_tmac_file_prefix= + for d in /usr/share/lib/tmac /usr/lib/tmac; do + for t in "" tmac.; do + for m in an s m; do + f=$d/$t$m + if test -z "$sys_tmac_prefix" \ + && test -f $f \ + && grep '^\.if' $f >/dev/null 2>&1; then + sys_tmac_prefix=$d/$t + sys_tmac_file_prefix=$t + fi + done + done + done + sys_tmac_prefix_result=none + test -z "$sys_tmac_prefix" \ + || sys_tmac_prefix_result="$sys_tmac_prefix" + AC_MSG_RESULT([$sys_tmac_prefix_result]) + AC_SUBST([sys_tmac_prefix]) + + AC_MSG_CHECKING([which system macro packages should be made available]) + tmac_wrap= + if test "$sys_tmac_file_prefix" = tmac.; then + for f in $sys_tmac_prefix*; do + suff=`echo $f | sed -e "s;$sys_tmac_prefix;;"` + case "$suff" in + e) + ;; + *) + grep "Copyright.*Free Software Foundation" $f >/dev/null \ + || tmac_wrap="$tmac_wrap $suff" ;; + esac + done + elif test -n "$sys_tmac_prefix"; then + files=`echo $sys_tmac_prefix*` + grep "\\.so" $files >conftest.sol + for f in $files; do + case "$f" in + ${sys_tmac_prefix}e) + ;; + *.me) + ;; + */ms.*) + ;; + *) + b=`basename $f` + if grep "\\.so.*/$b\$" conftest.sol >/dev/null \ + || grep -l "Copyright.*Free Software Foundation" $f >/dev/null; then + : + else + suff=`echo $f | sed -e "s;$sys_tmac_prefix;;"` + case "$suff" in + tmac.*) + ;; + *) + tmac_wrap="$tmac_wrap $suff" ;; + esac + fi + esac + done + rm -f conftest.sol + fi + tmac_wrap_result="none found" + test -z "$tmac_wrap" || tmac_wrap_result="$tmac_wrap" + AC_MSG_RESULT([$tmac_wrap_result]) + AC_SUBST([tmac_wrap])]) + + +# Searching if a non-GNU Troff is installed. The built-in register +# \n[.g] is always 1 in GNU Troff. +AC_DEFUN([GROFF_G], [ + g= + AC_MSG_CHECKING([for existing troff installation]) + if test "`(echo .tm '|n(.g' | tr '|' '\\\\' | troff -z -i 2>&1) \ + 2>/dev/null`" = 0 + then + AC_MSG_RESULT([yes]) + g=g + else + AC_MSG_RESULT([no]) + fi + AC_SUBST([g]) +]) + + +# Controllable groff compatibility wrappers for vendor-provided macro sets +# +# Background +# +# groff's configure script checks for a non-GNU system troff implementation +# in GROFF_G above, and uses this to rename programs that would conflict +# with the system *roff implementation. On such systems, groff's version of +# troff is installed as gtroff, groff's version of nroff is installed as +# gnroff, and so forth. See the ENVIRONMENT section of groff(1)'s manual +# page for the entry on GROFF_COMMAND_PREFIX, and the SEE ALSO section for +# details. The implementation of this can be found in "We use Automake's +# Uniform Naming Scheme" in Makefile.am, and its use of NAMEPREFIX. +# +# groff's configure script also checks for vendor-provided macro sets in +# GROFF_TMAC above, which sets 'sys_tmac_prefix' to the location of any +# vendor-provided macro sets. The script then determines if any of these +# vendor-provided macro sets are non-GNU implementations. A space-separated +# list of macro sets requiring compatibility wrappers is stored in +# 'tmac_wrap'. +# +# If 'tmac_wrap' is a non-empty list, the make infrastructure will build +# groff compatibility wrappers in the 'tmac' directory for each mentioned +# macro set. These wrappers enable compatibility mode (.cp 1) and include +# (.so <filepath>) the vendor implementation of that macro set. The 'an' +# wrapper gets special treatment, by including the 'andoc.tmac' macro set, +# before loading the vendor implementation. +# +# In groff version 1.22.3 and prior, if 'tmac_wrap' is a non-empty list at +# installation time (make install), the groff compatibility wrappers are +# installed in '<prefix>/lib/groff/site-tmac' directory (technically +# 'systemtmacdir' in Makefile.am) as the base macro set name (example: +# an.tmac), and the groff implementation of these macro sets are installed +# with a 'g' prefix in the '<prefix>/share/groff/<version>/tmac' directory +# (example: gan.tmac). +# +# If your system has these compatibility wrappers installed, then the +# command 'groff -man ...' (as an example) uses your vendor's 'an' macro +# set in compatibility mode, while the command 'groff -mgan ...' uses the +# groff implementation of the 'an' macro set. +# +# With groff being the principal (but not the only) full-featured *roff +# implementation in use today, and most FLOSS Unix-like Operating Systems +# using groff as their *roff implementation, the automatic implementation +# of compatibility wrappers on systems having their own macro sets needs to +# be revisited. Most FLOSS software is now developed on systems having no +# other *roff implementation, so manual pages (for example) are developed +# and proofread on systems using groff's implementation of the 'an' macro +# set. +# +# On systems with their own macro sets (especially 'an'), documents can be +# rendered incorrectly from the document author's point of view, when +# these compatibility mode wrappers are used. groff's own manual pages are +# the perfect case in point, with most not showing the principal usage line +# of a command, due to the use of .SY/.OP/.YS macros to display such lines. +# +# Updating groff's use of compatibility mode wrappers +# +# Given the above, on systems with their own (non-GNU) macro sets, groff's +# AUTOMATIC installation of these generated vendor compatibility wrappers +# as the principal implementation of a macro set for groff(1) users may not +# be desirable, especially if the users are principally using groff(1) to +# format FLOSS manual pages. +# +# The '--with-compatibility-wrappers=<value>' option to 'configure' gives +# these systems control over the default macro set implementation in use +# when using the groff family of tools. +# +# The supported values of the '--with-compatibility-wrappers=<value>' +# option are: +# 'check' [default] Check if system has vendor-provided non-GNU +# implementation of any *roff macro set. Based on that use the +# 'yes' or 'no' value for '--with-compatibility-wrappers'. This +# effectively emulates prior groff releases' implementation. +# 'yes' Install the vendor compatibility wrappers as groff's default +# implementation of these macro sets. This is compatible with +# groff implementations up to and including version 1.22.3. +# Direct use of the 'yes' option is discouraged, as it will +# abort the configure process if no vendor-provided non-GNU +# macro set implementations exists. +# 'no' Do not install any vendor compatibility wrappers. Use the +# groff implementation of all macro sets as the default. +# 'manual' Install the vendor compatibility wrappers as '<macro>-os.tmac' +# in the same directory as 'yes' option ('systemtmacdir'). +# groff users can access the vendor-provided macro set via the +# '-m<macro>-os' option on the command line of a tool from the +# groff family. The naming of the option value reflects that now +# a manual step must be taken to use the vendor-provided +# implementation of the macro set. This option can safely be +# used on systems without vendor-provided non-GNU macro set +# implementations to allow for cross-platform build +# instructions. +# + +AC_DEFUN([GROFF_WITH_COMPATIBILITY_WRAPPERS], + [AC_ARG_WITH([compatibility-wrappers], + [AS_HELP_STRING([--with-compatibility-wrappers[={check|manual|no|yes}]], + [choose whether and how groff compatibility wrappers for \ + vendor-provided non-GNU macro packages are installed. \ + 'check' searches for such packages, and behaves as if 'yes' or \ + 'no' were given, accordingly. \ + 'yes' generates compatibility wrappers for the vendor-provided \ + packages to allow their use with groff and related tools. \ + The compatibility wrappers are installed using the + vendor-provided names, while their groff implementations are \ + installed with a 'g' prefix. \ + Use of the latter thus requires options of the form + '-mg<package>' (example: -mgan). \ + 'no' installs only the groff implementations. + 'manual' generates compatibility wrappers for the \ + vendor-provided packages as '<macro>-os'. \ + Use of the latter thus requires options of the form + '-m<macro>-os' option (example: -man-os).])], + [compatibility_wrappers="$withval"], + [compatibility_wrappers="check"]) + + if test "$compatibility_wrappers" != check \ + && test "$compatibility_wrappers" != yes \ + && test "$compatibility_wrappers" != no \ + && test "$compatibility_wrappers" != manual + then + AC_MSG_WARN([Invalid '--with-compatibility-wrappers' argument: '$compatibility_wrappers' - assuming 'check' requested.]) + compatibility_wrappers="check" + fi + + if test -z "$tmac_wrap" + then + # No Operating System Macro Sets Present + if test "$compatibility_wrappers" = check + then + compatibility_wrappers="no" + elif test "$compatibility_wrappers" = yes + then + AC_MSG_ERROR([No non-GNU macro sets found - cannot create and install compatibility wrappers]) + elif test "$compatibility_wrappers" = no + then + : # No action required + elif test "$compatibility_wrappers" = manual + then + # 'manual' allows quiet conversion to 'no' to support + # cross-platform build instructions + compatibility_wrappers="no" + fi + else + # One or more Operating System Macro Sets Present + if test "$compatibility_wrappers" = check + then + compatibility_wrappers="yes" + fi + fi + + # Now compatibility_wrappers can only be yes, no or manual + AC_SUBST([compatibility_wrappers]) + ]) + +# We need the path to install-sh to be absolute. + +AC_DEFUN([GROFF_INSTALL_SH], + [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) + ac_dir=`cd $ac_aux_dir; pwd` + ac_install_sh="$ac_dir/install-sh -c"]) + + +# Test whether install-info is available. + +AC_DEFUN([GROFF_INSTALL_INFO], + [AC_CHECK_PROGS([INSTALL_INFO], [install-info], [:])]) + + +# At least one Unix system, Apple Macintosh Rhapsody 5.5, +# does not have -lm ... + +AC_DEFUN([GROFF_LIBM], + [AC_CHECK_LIB([m], [sin], [LIBM=-lm]) + AC_SUBST([LIBM])]) + + +# ... while the MinGW implementation of GCC for Microsoft Win32 +# does not seem to have -lc. + +AC_DEFUN([GROFF_LIBC], + [AC_CHECK_LIB([c], [main], [LIBC=-lc]) + AC_SUBST([LIBC])]) + + +# Check for EBCDIC -- stolen from the OS390 Unix LYNX port + +AC_DEFUN([GROFF_EBCDIC], + [AC_MSG_CHECKING([whether character set is EBCDIC]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +/* Treat any failure as ASCII for compatibility with existing art. + Use compile-time rather than run-time tests for cross-compiler + tolerance. */ +#if '0' != 240 +make an error "Character set is not EBCDIC" +#endif + + ]]) + ], + [groff_cv_ebcdic="yes" + TTYDEVDIRS="font/devcp1047" + AC_MSG_RESULT([yes]) + AC_DEFINE(IS_EBCDIC_HOST, 1, + [Define if the host's encoding is EBCDIC.])], + [groff_cv_ebcdic="no" + TTYDEVDIRS="font/devascii font/devlatin1" + OTHERDEVDIRS="font/devlj4 font/devlbp" + AC_MSG_RESULT([no])]) + AC_SUBST([TTYDEVDIRS]) + AC_SUBST([OTHERDEVDIRS])]) + + +# Check for OS/390 Unix. We test for EBCDIC also -- the Linux port (with +# gcc) to OS/390 uses ASCII internally. + +AC_DEFUN([GROFF_OS390], + [if test "$groff_cv_ebcdic" = "yes"; then + AC_MSG_CHECKING([for OS/390 Unix]) + case `uname` in + OS/390) + CFLAGS="$CFLAGS -D_ALL_SOURCE" + AC_MSG_RESULT([yes]) ;; + *) + AC_MSG_RESULT([no]) ;; + esac + fi]) + + +# Check whether Windows scripts like 'afmtodit.cmd' should be installed. + +AC_DEFUN([GROFF_CMD_FILES], + [AC_MSG_CHECKING([whether to install .cmd wrapper scripts for Windows]) + case "$host_os" in + *mingw*) + make_winscripts=winscripts + AC_MSG_RESULT([yes]) ;; + *) + make_winscripts= + AC_MSG_RESULT([no]) ;; + esac + AC_SUBST([make_winscripts])]) + + +# Check whether we need a declaration for a function. +# +# Stolen from GNU bfd. + +AC_DEFUN([GROFF_NEED_DECLARATION], + [AC_MSG_CHECKING([whether $1 must be declared]) + AC_LANG_PUSH([C++]) + AC_CACHE_VAL([groff_cv_decl_needed_$1], + [AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <stdio.h> +#ifdef HAVE_STRING_H +#include <string.h> +#endif +#ifdef HAVE_STRINGS_H +#include <strings.h> +#endif +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef HAVE_MATH_H +#include <math.h> +#endif + + ]], + [[ + +#ifndef $1 + char *p = (char *) $1; +#endif + + ]]) + ], + [groff_cv_decl_needed_$1=no], + [groff_cv_decl_needed_$1=yes])]) + AC_MSG_RESULT([$groff_cv_decl_needed_$1]) + if test $groff_cv_decl_needed_$1 = yes; then + AC_DEFINE([NEED_DECLARATION_]translit($1, [a-z], [A-Z]), [1], + [Define if your C++ doesn't declare ]$1[().]) + fi + AC_LANG_POP([C++])]) + + +# If mkstemp() isn't available, use our own mkstemp.cpp file. + +AC_DEFUN([GROFF_MKSTEMP], + [AC_MSG_CHECKING([for mkstemp]) + AC_LANG_PUSH([C++]) + AC_LIBSOURCE([mkstemp.cpp]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <stdlib.h> +#include <unistd.h> +int (*f) (char *); + + ]], + [[ + +f = mkstemp; + + ]]) + ], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_MKSTEMP], [1], [Define if you have mkstemp().])], + [AC_MSG_RESULT([no]) + _AC_LIBOBJ([mkstemp])]) + AC_LANG_POP([C++])]) + + +# Test whether <inttypes.h> exists, doesn't clash with <sys/types.h>, +# and declares uintmax_t. Taken from the fileutils package. + +AC_DEFUN([GROFF_INTTYPES_H], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([C++ <inttypes.h>]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <sys/types.h> +#include <inttypes.h> + + ]], + [[ + +uintmax_t i = (uintmax_t)-1; + + ]]) + ], + [groff_cv_header_inttypes_h=yes + AC_DEFINE([HAVE_CC_INTTYPES_H], [1], + [Define if you have a C++ <inttypes.h>.])], + [groff_cv_header_inttypes_h=no]) + AC_MSG_RESULT([$groff_cv_header_inttypes_h]) + AC_LANG_POP([C++])]) + + +# Test for working 'unsigned long long'. Taken from the fileutils package. + +AC_DEFUN([GROFF_UNSIGNED_LONG_LONG], + [AC_LANG_PUSH([C++]) + AC_MSG_CHECKING([for unsigned long long]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + +unsigned long long ull = 1; +int i = 63; +unsigned long long ullmax = (unsigned long long)-1; + + ]], + [[ + +return ull << i | ull >> i | ullmax / ull | ullmax % ull; + + ]]) + ], + [groff_cv_type_unsigned_long_long=yes], + [groff_cv_type_unsigned_long_long=no]) + AC_MSG_RESULT([$groff_cv_type_unsigned_long_long]) + AC_LANG_POP([C++])]) + + +# Define uintmax_t to 'unsigned long' or 'unsigned long long' +# if <inttypes.h> does not exist. Taken from the fileutils package. + +AC_DEFUN([GROFF_UINTMAX_T], + [AC_REQUIRE([GROFF_INTTYPES_H]) + if test $groff_cv_header_inttypes_h = no; then + AC_REQUIRE([GROFF_UNSIGNED_LONG_LONG]) + test $groff_cv_type_unsigned_long_long = yes \ + && ac_type='unsigned long long' \ + || ac_type='unsigned long' + AC_DEFINE_UNQUOTED([uintmax_t], [$ac_type], + [Define uintmax_t to 'unsigned long' or 'unsigned long long' if + <inttypes.h> does not exist.]) + fi]) + + +# Identify PATH_SEPARATOR character to use in GROFF_FONT_PATH and +# GROFF_TMAC_PATH which is appropriate for the target system (POSIX=':', +# MS-DOS/Win32=';'). +# +# The logic to resolve this test is already encapsulated in +# '$srcdir/src/include/nonposix.h'. + +AC_DEFUN([GROFF_TARGET_PATH_SEPARATOR], + [AC_MSG_CHECKING([separator character to use in groff search paths]) + cp "$srcdir"/src/include/nonposix.h conftest.h + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <ctype.h> +#include "conftest.h" + + ]], + [[ + +#if PATH_SEP_CHAR == ';' +make an error "Path separator is ';'" +#endif + + ]]) + ], + [GROFF_PATH_SEPARATOR=":"], + [GROFF_PATH_SEPARATOR=";"]) + AC_MSG_RESULT([$GROFF_PATH_SEPARATOR]) + AC_SUBST(GROFF_PATH_SEPARATOR)]) + + +# Check for X11. + +AC_DEFUN([GROFF_X11], [ + AC_REQUIRE([AC_PATH_XTRA]) + groff_no_x=$no_x + if test -z "$groff_no_x" + then + OLDCFLAGS=$CFLAGS + OLDLDFLAGS=$LDFLAGS + OLDLIBS=$LIBS + CFLAGS="$CFLAGS $X_CFLAGS" + LDFLAGS="$LDFLAGS $X_LIBS" + LIBS="$LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS" + + LIBS="$LIBS -lXaw" + AC_MSG_CHECKING([for Xaw library and header files]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <X11/Intrinsic.h> +#include <X11/Xaw/Simple.h> + + ]], + []) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + groff_no_x=yes]) + + LIBS="$LIBS -lXmu" + AC_MSG_CHECKING([for Xmu library and header files]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + +#include <X11/Intrinsic.h> +#include <X11/Xmu/Converters.h> + + ]], + []) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + groff_no_x=yes]) + + CFLAGS=$OLDCFLAGS + LDFLAGS=$OLDLDFLAGS + LIBS=$OLDLIBS + fi + + if ! test "$groff_no_x" = yes + then + XDEVDIRS="font/devX75 font/devX75-12 font/devX100 font/devX100-12" + XPROGDIRS="src/devices/xditview src/utils/xtotroff" + XLIBDIRS="src/libs/libxutil" + fi + + AC_SUBST([XDEVDIRS]) + AC_SUBST([XPROGDIRS]) + AC_SUBST([XLIBDIRS]) +]) + + +# Interpret the '--with-appdefdir' command-line option. + +dnl Don't quote AS_HELP_STRING! +dnl +dnl TODO: Include the computed default in the RHS of the help string. +AC_DEFUN([GROFF_APPDEFDIR_OPTION], [ + AC_ARG_WITH([appdefdir], + AS_HELP_STRING([--with-appdefdir=DIR], + [place X11 application defaults files in DIR])) +]) + + +# Get a default value for the application defaults directory. +# +# We ignore the 'XAPPLRES' and 'XUSERFILESEARCHPATH' environment +# variables. +# +# By default if --with-appdefdir is not used, we will install the +# gxditview application defaults in $prefix/lib/X11/app-defaults. +# +# Note that if --with-appdefdir was passed to 'configure', no prefix is +# added to 'appdefdir'. + +AC_DEFUN([GROFF_APPDEFDIR_DEFAULT], + [if test -z "$groff_no_x"; then + if test -z "$with_appdefdir"; then + if test "$prefix" = NONE; then + appdefdir=$ac_default_prefix/lib/X11/app-defaults + else + appdefdir=$prefix/lib/X11/app-defaults + fi + else + appdefdir=$with_appdefdir + fi + fi + AC_SUBST([appdefdir])]) + +# Emit warning if --with-appdefdir hasn't been used. + +AC_DEFUN([GROFF_APPDEFDIR_NOTICE], + [if test -z "$groff_no_x"; then + if test -z "$with_appdefdir"; then + AC_MSG_NOTICE([Default X11 application defaults directory \ +assumed. + + The application defaults files for gxditview (GXditview and + GXditview-color) will be installed in the following directory. + + $appdefdir + + To install elsewhere, say, '/etc/X11/app-defaults', add + '--with-appdefdir=/etc/X11/app-defaults' to the configure script + command-line options and rerun it (the 'prefix' value has no effect on + a --with-appdefdir option). + + If the gxditview app-defaults are installed in a directory that is not + one of the default X11 directories for this purpose (common defaults + are /usr/lib/X11/app-defaults, /usr/share/X11/app-defaults, and + /etc/X11/app-defaults), you will have to set the environment variable + XFILESEARCHPATH to this path. More details can be found in the X(7) + manual page, or in the document "X Toolkit Intrinsics - C Language + Interface manual". + ]) + fi + fi]) + + +AC_DEFUN([GROFF_LIBPROGRAMDIR_DEFAULT], + libprogramdir=$libdir/groff + AC_SUBST([libprogramdir])) + + +AC_DEFUN([GROFF_GLILYPONDDIR_DEFAULT], + glilypond_dir=$libprogramdir/glilypond + AC_SUBST([glilypond_dir])) + + +AC_DEFUN([GROFF_GPINYINDIR_DEFAULT], + gpinyin_dir=$libprogramdir/gpinyin + AC_SUBST([gpinyin_dir])) + + +AC_DEFUN([GROFF_REFERDIR_DEFAULT], + referdir=$libprogramdir/refer + AC_SUBST([referdir])) + +# Generation of doc/gnu.eps requires xpmtoppm. + +AC_DEFUN([GROFF_PROG_XPMTOPPM], + [AC_CHECK_PROG([XPMTOPPM], [xpmtoppm], [found], [missing])]) + +# Check for make built-in variable RM. + +AC_DEFUN([GROFF_MAKE_DEFINES_RM], [ + AC_MSG_CHECKING(whether make defines 'RM') + make=make + if test -n "$MAKE" + then + make=$MAKE + fi + cat <<EOF > test_make_rm.mk +all: + @if test -n "\$(RM)"; \ + then \ + echo yes; \ + else \ + echo no; \ + fi +EOF + groff_make_defines_rm=`"$make" -sf test_make_rm.mk` + AC_MSG_RESULT([$groff_make_defines_rm]) + rm -f test_make_rm.mk +]) + +# Check if diff has option -D, for gdiffmk. If not, check if gdiff is +# available on the system and make the same test. If either diff or +# gdiff is working, it is set to DIFF_PROG. If -D option is not +# available, DIFF_PROG is left to diff (gdiffmk will report a +# problem). + +AC_DEFUN([GROFF_DIFF_D], + [AC_MSG_CHECKING(for a diff program that supports option -D) + groff_has_diff_d_option=no + DIFF_PROG=diff + diff -Dx /dev/null /dev/null >/dev/null 2>&1 && groff_has_diff_d_option=yes + if test "$groff_has_diff_d_option" = no; then + AC_CHECK_PROGS([GDIFF], [gdiff]) + if test -n "$GDIFF"; then + "$GDIFF" -Dx /dev/null /dev/null >/dev/null 2>&1 && groff_has_diff_d_option=yes + if test "$groff_has_diff_d_option" = yes; then + DIFF_PROG="$GDIFF" + fi + fi + fi + AC_MSG_RESULT([$groff_has_diff_d_option]) + AC_SUBST([DIFF_PROG])]) + +# Check if 'test' supports the option -ef. + +AC_DEFUN([GROFF_HAVE_TEST_EF_OPTION], + [AC_MSG_CHECKING(whether test supports option -ef) + HAVE_TEST_EF_OPTION=no + test /dev/null -ef /dev/null > /dev/null 2>&1 && HAVE_TEST_EF_OPTION=yes + AC_MSG_RESULT([$HAVE_TEST_EF_OPTION]) + AC_SUBST([HAVE_TEST_EF_OPTION])]) + +# gdiffmk will attempt to use bash (for option -ef of 'test'). If bash +# is not available it will use /bin/sh. + +AC_DEFUN([GROFF_BASH], + [AC_PATH_PROGS([BASH_PROG], [bash], [no]) + if test "$BASH_PROG" = no; then + BASH_PROG=/bin/sh + fi + AC_SUBST([BASH_PROG])]) + +# Search for uchardet library used by preconv. + +AC_DEFUN([GROFF_UCHARDET], [ + AC_ARG_WITH([uchardet], + AS_HELP_STRING([--with-uchardet={auto|no|yes}], + [build 'preconv' against uchardet library to automatically \ +detect input file encoding])) + AS_IF([test "$with_uchardet" != no], + [PKG_CHECK_MODULES([UCHARDET], + [uchardet >= 0.0.1], + [AC_DEFINE([HAVE_UCHARDET], [1], + [uchardet library availability]) + groff_have_uchardet=yes], [ + if test "$with_uchardet" = yes + then + AC_MSG_FAILURE([could not find uchardet library]) + fi + groff_have_uchardet=no])], + [groff_have_uchardet=no]) +]) + +AC_DEFUN([GROFF_UCHARDET_NOTICE], [ + if test "$groff_have_uchardet" = no && test "$with_uchardet" != no + then + AC_MSG_NOTICE([The uchardet library was not found. + + The 'preconv' preprocessor program will be unable to attempt automatic + inference of an input file's character encoding. See the preconv(1) + man page. + ]) + fi +]) + + +AC_DEFUN([GROFF_USE_GROFF_ALLOCATOR], [ + AC_ARG_ENABLE([groff-allocator], + [AS_HELP_STRING([--enable-groff-allocator], [enable libgroff's \ +allocator for C++ new/delete])], + [test "$enableval" = yes && groff_use_own_allocator=yes], + [groff_use_own_allocator=no]) +]) |