Files
bullet3/mk/autoconf/emit.m4
2006-05-25 19:18:29 +00:00

173 lines
8.3 KiB
Plaintext

# emit.m4 -*- Autoconf -*-
#==============================================================================
# Copyright (C)2003-2005 by Eric Sunshine <sunshine@sunshineco.com>
#
# This library is free software; you can redistribute it and/or modify it
# under the terms of the GNU Library General Public License as published by
# the Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This library 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 Library General Public
# License for more details.
#
# You should have received a copy of the GNU Library General Public License
# along with this library; if not, write to the Free Software Foundation,
# Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
#==============================================================================
AC_PREREQ([2.56])
#------------------------------------------------------------------------------
# CS_EMIT_BUILD_PROPERTY(KEY, VALUE, [APPEND], [EMPTY-OKAY], [EMITTER],
# [UNCONDITIONAL])
# A utility function which invokes an emitter to record the KEY/VALUE
# tuple if VALUE is not the empty string (after leading and trailing
# whitespace is stripped). If EMPTY-OKAY is not an empty string, then the
# property is emitted even if VALUE is empty; that is, it is emitted
# unconditionally. If APPEND is the empty string, then the emitter sets
# the key's value directly (though it may be overridden by the
# environment), otherwise the emitter appends VALUE to the existing value
# of the key. EMITTER is a macro name, such as CS_JAMCONFIG_PROPERTY or
# CS_MAKEFILE_PROPERTY, which performs the actual task of emitting the
# KEY/VALUE tuple; it should also accept APPEND as an optional third
# argument. If EMITTER is omitted, CS_JAMCONFIG_PROPERTY is used. Some
# emitters accept an optional fourth argument, UNCONDITIONAL, which
# instructs it to set KEY's value unconditionally, even if KEY already
# had been assigned a value via some other mechanism (such as imported
# from the environment, or from Jambase, in the case of
# CS_JAMCONFIG_PROPERTY).
#------------------------------------------------------------------------------
AC_DEFUN([CS_EMIT_BUILD_PROPERTY],
[cs_build_prop_val="$2"
cs_build_prop_val=CS_TRIM([$cs_build_prop_val])
m4_ifval([$4],
[CS_JAMCONFIG_PROPERTY([$1], [$cs_build_prop_val], [$3])],
AS_IF([test -n "$cs_build_prop_val"],
[m4_default([$5],[CS_JAMCONFIG_PROPERTY])(
[$1], [$cs_build_prop_val], [$3], [$6])]))])
#------------------------------------------------------------------------------
# CS_EMIT_BUILD_RESULT(CACHE-VAR, PREFIX, [EMITTER])
# Record the results of CS_CHECK_BUILD() or CS_CHECK_LIB_WITH() via some
# emitter. If CACHE-VAR indicates that the build succeeded, then the
# following properties are emitted:
#
# PREFIX.AVAILABLE = yes
# PREFIX.CFLAGS = $CACHE-VAR_cflags
# PREFIX.LFLAGS = $CACHE-VAR_lflags $CACHE-VAR_libs
#
# EMITTER is a macro name, such as CS_JAMCONFIG_PROPERTY or
# CS_MAKEFILE_PROPERTY, which performs the actual task of emitting the
# KEY/VALUE tuple. If EMITTER is omitted, CS_JAMCONFIG_PROPERTY is used.
#------------------------------------------------------------------------------
AC_DEFUN([CS_EMIT_BUILD_RESULT],
[AS_IF([test "$$1" = yes],
[CS_EMIT_BUILD_PROPERTY([$2.AVAILABLE], [yes], [], [], [$3])
CS_EMIT_BUILD_PROPERTY([$2.CFLAGS], [$$1_cflags], [], [], [$3])
CS_EMIT_BUILD_PROPERTY([$2.LFLAGS], [$$1_lflags $$1_libs],
[], [], [$3])])])
#------------------------------------------------------------------------------
# CS_EMIT_BUILD_FLAGS(MESSAGE, CACHE-VAR, FLAGS, [LANGUAGE], EMITTER-KEY,
# [APPEND], [ACTION-IF-RECOGNIZED],
# [ACTION-IF-NOT-RECOGNIZED], [EMITTER])
# A convenience wrapper for CS_CHECK_BUILD_FLAGS() which also records the
# results via CS_EMIT_BUILD_PROPERTY(). Checks if the compiler or linker
# recognizes a command-line option. MESSAGE is the "checking" message.
# CACHE-VAR is the shell cache variable which receives the flag
# recognized by the compiler or linker, or "no" if the flag was not
# recognized. FLAGS is a whitespace- delimited list of build tuples
# created with CS_CREATE_TUPLE(). Each tuple from FLAGS is attempted in
# order until one is found which is recognized by the compiler. After
# that, no further flags are checked. LANGUAGE is typically either C or
# C++ and specifies which compiler to use for the test. If LANGUAGE is
# omitted, C is used. EMITTER-KEY is the name to pass as the emitter's
# "key" argument if a usable flag is encountered. If APPEND is not the
# empty string, then the discovered flag is appended to the existing
# value of the EMITTER-KEY. If the command-line option was recognized,
# then ACTION-IF-RECOGNIZED is invoked, otherwise
# ACTION-IF-NOT-RECOGNIZED is invoked. EMITTER is a macro name, such as
# CS_JAMCONFIG_PROPERTY or CS_MAKEFILE_PROPERTY, which performs the
# actual task of emitting the KEY/VALUE tuple; it should also accept
# APPEND as an optional third argument. If EMITTER is omitted,
# CS_JAMCONFIG_PROPERTY is used.
#------------------------------------------------------------------------------
AC_DEFUN([CS_EMIT_BUILD_FLAGS],
[CS_CHECK_BUILD_FLAGS([$1], [$2], [$3], [$4],
[CS_EMIT_BUILD_PROPERTY([$5], [$$2], [$6], [], [$9])
$7],
[$8])])
#------------------------------------------------------------------------------
# CS_EMITTER_OPTIONAL([EMITTER])
# The CS_EMIT_FOO() macros optionally accept an emitter. If no emitter is
# supplied to those macros, then a default emitter is chosen. Other
# macros, however, which perform testing and optionally emit the results
# may wish to interpret an omitted EMITTER as a request not to emit the
# results. CS_EMITTER_OPTIONAL() is a convenience macro to help in these
# cases. It should be passed to one of the CS_EMIT_FOO() macros in place
# of the literal EMITTER argument. It functions by re-interpretating
# EMITTER as follows:
#
# - If EMITTER is omitted, then CS_NULL_EMITTER is returned, effectively
# disabling output by the CS_EMIT_FOO() macro.
# - If EMITTER is the literal string "emit" or "yes", then it returns an
# empty string, which signals to the CS_EMIT_FOO() macro that is should
# use its default emitter.
# - Any other value for EMITTER is passed along as-is to the
# CS_EMIT_FOO() macro.
#------------------------------------------------------------------------------
AC_DEFUN([CS_EMITTER_OPTIONAL],
[m4_case([$1],
[], [[CS_NULL_EMITTER]],
[emit], [],
[yes], [],
[[$1]])])
#------------------------------------------------------------------------------
# CS_NULL_EMITTER(KEY, VALUE, [APPEND])
# A do-nothing emitter suitable for use as the EMITTER argument of one of
# the CS_EMIT_FOO() macros.
#------------------------------------------------------------------------------
AC_DEFUN([CS_NULL_EMITTER], [:
])
#------------------------------------------------------------------------------
# CS_SUBST_EMITTER(KEY, VALUE, [APPEND])
# An emitter wrapped around AC_SUBST(). Invokes
# AC_SUBST(AS_TR_SH(KEY),VALUE). The APPEND argument is ignored.
# Suitable for use as the EMITTER argument of one of the CS_EMIT_FOO()
# macros. The call to AS_TR_SH() ensures that KEY is transformed into a
# valid shell variable. For instance, if a macro attempts to emit
# MYLIB.CFLAGS and MYLIB.LFLAGS via CS_SUBST_EMITTER(), then the names
# will be transformed to MYLIB_CFLAGS and MYLIB_LFLAGS, respectively, for
# the invocation of AC_SUBST().
#------------------------------------------------------------------------------
AC_DEFUN([CS_SUBST_EMITTER], [AC_SUBST(AS_TR_SH([$1]),[$2])])
#------------------------------------------------------------------------------
# CS_DEFINE_EMITTER(KEY, VALUE, [APPEND])
# An emitter wrapped around AC_DEFINE_UNQUOTED(). Invokes
# AC_DEFINE_UNQUOTED(AS_TR_CPP(KEY),VALUE). The APPEND argument is
# ignored. Suitable for use as the EMITTER argument of one of the
# CS_EMIT_FOO() macros. The call to AS_TR_CPP() ensures that KEY is a
# well-formed token for the C-preprocessor.
#------------------------------------------------------------------------------
AC_DEFUN([CS_DEFINE_EMITTER],
[AC_DEFINE_UNQUOTED(AS_TR_CPP([$1]),[$2],
[Define when feature is available])])