autoconf/autoheader.in
David MacKenzie 11d9768195 Update the file even if it is unchanged, to avoid foiling a
Makefile rule that makes it from configure.in.
If you let the rule for making config.status from configure
create config.h from config.h.in, then an unnecessary update here
will not cause unneeded recompilation.  Recompilation should only
happen if config.h is updated, which won't occur if config.h.in
had the same contents, even if its timestamp changed.  (Ick.)
1994-03-19 21:39:45 +00:00

217 lines
6.4 KiB
Bash

#!/bin/sh
# autoheader -- create `config.h.in' from `configure.in'
# Copyright (C) 1992, 1993 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 2, 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, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
# Written by Roland McGrath.
# If given no args, create `config.h.in' from template file `configure.in'.
# With one arg, create a header file on standard output from
# the given template file.
usage="Usage: autoheader [-h] [--help] [-m dir] [--macrodir=dir]
[-v] [--version] [template-file]"
# NLS nuisances.
# These must not be set unconditionally because not all systems understand
# e.g. LANG=C (notably SCO).
if test "${LC_ALL+set}" = 'set' ; then LC_ALL=C; export LC_ALL; fi
if test "${LANG+set}" = 'set' ; then LANG=C; export LANG; fi
test -z "${AC_MACRODIR}" && AC_MACRODIR=@datadir@
test -z "${M4}" && M4=@M4@
print_version=""
while test $# -gt 0 ; do
case "z${1}" in
z-h | z--help | z--h* )
echo "${usage}"; exit 0 ;;
z--macrodir=* | z--m*=* )
AC_MACRODIR="`echo \"${1}\" | sed -e 's/^[^=]*=//'`"
shift ;;
z-m | z--macrodir | z--m* )
shift
test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; }
AC_MACRODIR="${1}"
shift ;;
z-v | z--version | z--v* )
print_version="-DAC_PRINT_VERSION"
shift ;;
z-- ) # Stop option processing
shift; break ;;
z- ) # Use stdin as input.
break ;;
z-* )
echo "${usage}" 1>&2; exit 1 ;;
* )
break ;;
esac
done
TEMPLATES="${AC_MACRODIR}/acconfig.h"
test -r acconfig.h && TEMPLATES="${TEMPLATES} acconfig.h"
MACROFILES="${AC_MACRODIR}/acgeneral.m4 ${AC_MACRODIR}/acspecific.m4"
test -r ${AC_MACRODIR}/aclocal.m4 \
&& MACROFILES="${MACROFILES} ${AC_MACRODIR}/aclocal.m4"
test -r aclocal.m4 && MACROFILES="${MACROFILES} aclocal.m4"
MACROFILES="${print_version} ${MACROFILES}"
case $# in
0) if test -n "$print_version"
then infile=/dev/null
else infile=configure.in; fi ;;
1) infile=$1 ;;
*) echo "$usage" >&2; exit 1 ;;
esac
# These are the alternate definitions of the acgeneral.m4 macros we want to
# redefine. They produce strings in the output marked with "@@@" so we can
# easily extract the information we want. The `#' at the end of the first
# line of each definition seems to be necessary to prevent m4 from eating
# the newline, which makes the @@@ not always be at the beginning of a line.
frob='define([AC_DEFINE],[#
@@@syms="$syms $1"@@@
])dnl
define([AC_HAVE_FUNCS],[#
@@@funcs="$funcs $1"@@@
])dnl
define([AC_HAVE_HEADERS],[#
@@@headers="$headers $1"@@@
])dnl
define([AC_CONFIG_HEADER],[#
@@@config_h=$1@@@
])dnl
define([AC_HAVE_LIBRARY], [#
changequote(/,/)dnl
define(/libname/, dnl
patsubst(patsubst($1, /lib\([^\.]*\)\.a/, /\1/), /-l/, //))dnl
changequote([,])dnl
@@@libs="$libs libname"@@@
# If it was found, we do:
$2
# If it was not found, we do:
$3
])dnl
'
config_h=config.h
syms=
funcs=
headers=
libs=
# We extract assignments of SYMS, FUNCS, HEADERS, and LIBS from the
# modified autoconf processing of the input file. The sed hair is
# necessary to win for multi-line macro invocations.
eval "`echo \"$frob\" \
| $M4 $MACROFILES - $infile \
| sed -n -e '
: again
/^@@@.*@@@$/s/^@@@\(.*\)@@@$/\1/p
/^@@@/{
s/^@@@//p
n
s/^/@@@/
b again
}'`"
test -n "$print_version" && exit 0
# Make SYMS newline-separated rather than blank-separated, and remove dups.
syms="`for sym in $syms; do echo $sym; done | sort | uniq`"
if test $# -eq 0; then
tmpout=autoh$$
trap "rm -f $tmpout; exit 1" 1 2 15
exec > $tmpout
fi
# Don't write "do not edit" -- it will get copied into the
# config.h, which it's ok to edit.
echo "/* ${config_h}.in. Generated automatically from $infile by autoheader. */"
# This puts each paragraph on its own line, separated by @s.
if test -n "$syms"; then
# Make sure the boundary of template files is also the boundary
# of the paragraph. Extra newlines don't hurt since they will
# be removed.
for t in $TEMPLATES; do cat $t; echo; echo; done |
# The sed script is suboptimal because it has to take care of
# some broken seds (e.g. AIX) that remove '\n' from the
# pattern/hold space if the line is empty. (junio@twinsun.com).
sed -n -e '
/^[ ]*$/{
x
s/\n/@/g
p
s/.*/@/
x
}
H' | sed -e 's/@@*/@/g' |
# Select each paragraph that refers to a symbol we picked out above.
fgrep "$syms" |
tr @ \\012
fi
for func in `for x in $funcs; do echo $x; done | sort | uniq`; do
sym="`echo ${func} | sed 's/[^a-zA-Z0-9_]/_/g' | tr '[a-z]' '[A-Z]'`"
echo "
/* Define if you have ${func}. */
#undef HAVE_${sym}"
done
for header in `for x in $headers; do echo $x; done | sort | uniq`; do
sym="`echo ${header} | sed 's/[^a-zA-Z0-9_]/_/g' | tr '[a-z]' '[A-Z]'`"
echo "
/* Define if you have the <${header}> header file. */
#undef HAVE_${sym}"
done
for lib in `for x in $libs; do echo $x; done | sort | uniq`; do
sym="`echo ${lib} | sed 's/[^a-zA-Z0-9_]/_/g' | tr '[a-z]' '[A-Z]'`"
echo "
/* Define if you have the ${lib} library (-l${lib}). */
#undef HAVE_LIB${sym}"
done
status=0
for sym in $syms; do
if fgrep $sym $TEMPLATES >/dev/null; then
: # All is well.
else
echo "$0: Symbol \`${sym}' is not covered by $TEMPLATES" >&2
status=1
fi
done
if test $# -eq 0; then
if test $status -eq 0; then
# Update the file even if it is unchanged, to avoid foiling a
# Makefile rule that makes it from configure.in.
# If you let the rule for making config.status from configure
# create config.h from config.h.in, then an unnecessary update here
# will not cause unneeded recompilation. Recompilation should only
# happen if config.h is updated, which won't occur if config.h.in
# had the same contents, even if its timestamp changed. (Ick.)
mv -f $tmpout ${config_h}.in
else
rm -f $tmpout
fi
fi
exit $status