Select Git revision
check-package.m4
check-package.m4 15.77 KiB
dnl ALBERTA_CHECK_PACKAGE()
dnl
dnl Check for a library + header files
dnl
dnl Arguments:
dnl
dnl $1: symbolic name (fancy)
dnl $2: space separated list of library names (base name,
dnl lib$2[.so|.a|.la]
dnl $3: Optional space separated list of functions to check for.
dnl We check first for the presence of the libraries listed in $2,
dnl and then for all functions listed in $3, while linking with
dnl all libraries listed in $2, and the additional libraries
dnl listed in $5.
dnl $4: library path (-L$4)
dnl $5: additional libraries needed (e.g. -lm -lGL); if $5 contains the
dnl string libtool, then libtool is used to resolve library
dnl dependencies (works, of course, only if lib$2.la is installed
dnl $6: space separated list of header files to check for
dnl $7: include path(s) for $6 (-I$7). May be a space separated list
dnl of directories.
dnl $8: additional include paths (e.g. when $6 includes some other headers)
dnl $9: a space separated list of the keywords
dnl
dnl optional, required, disabled, enabled
dnl
dnl optional: failing to detect the package is not fatal
dnl required: configure is terminated when the package is not detected
dnl (default)
dnl disabled: package is initially disabled and needs the appropriate
dnl --with-blah switch, otherwise the package is not checked for
dnl enabled: package is initially enabled (the default)
dnl
dnl Default is to check for libraries below $prefix/lib/ and for header-files
dnl below $prefix/include/
dnl
dnl $5 may be empty (e.g. to check for a Fortran library). In this case
dnl $6 and $7 are ignored
dnl
dnl This Macro defines the following variables (UPNAME means a
dnl canonicalized version of $1: i.e. uppercase and - converted to _)
dnl
dnl Makefile-substitution
dnl
dnl UPNAME[]_INCLUDE_PATH
dnl UPNAME[]_LIB_PATHS
dnl UPNAME[]_INCLUDES
dnl UPNAME[]_LIBS libraries and linker flags excluding $5
dnl UPNAME[]_ALL_LIBS libraries linker flags including $5
dnl
dnl config.h preprocessor macros
dnl
dnl HAVE_LIB[name] for all names listed in $2
dnl HAVE_[name]_H for all names listed in $6
dnl
dnl Automake conditional
dnl
dnl AM_CONDITIONAL([HAVE_]UPNAME, [test -n "$[]UPNAME[_LIB]"])
dnl
dnl Helper-macros
dnl
dnl
dnl ALBERTA_CHECK_PKG_OPT(PKGNAME)
dnl
AC_DEFUN([ALBERTA_CHECK_PKG_OPT],
[m4_define([UPNAME], [m4_bpatsubst(m4_toupper([$1]),-,_)])
m4_if($2,enabled,
[m4_define([NEGDEFAULT],[without])
m4_define([NEGVERB],[disable])
m4_define([DEFAULT],[auto-detect])],
[m4_define([NEGDEFAULT],[with])
m4_define([NEGVERB],[enable])
m4_define([DEFAULT],[disabled])])
AC_ARG_WITH($1,
AC_HELP_STRING(--[]NEGDEFAULT[]-$1,
[NEGVERB use of package $1 (default: DEFAULT)]),
[if test -z "$[]UPNAME[_DISABLE]"; then
case "$withval" in
yes)
UPNAME[_DISABLE]=no
;;
no)
UPNAME[_DISABLE]=yes
AC_MSG_RESULT([Disabling "$1"])
;;
*)
AC_MSG_ERROR(["$withval" should have been either "yes" or "no"])
;;
esac
fi],
[if test -z "$[]UPNAME[_DISABLE]"; then
m4_if($2,enabled,
[UPNAME[_DISABLE]=no],
[UPNAME[_DISABLE]=yes])
fi])
])
dnl
dnl ALBERTA_CHECK_PKG_HDR_OPT(PKGNAME, INCLUDEPATH)
dnl
AC_DEFUN([ALBERTA_CHECK_PKG_HDR_OPT],
[m4_define([UPNAME], [m4_bpatsubst(m4_toupper([$1]),-,_)])
AC_ARG_WITH($1-headers,
m4_if($2,[],
[AC_HELP_STRING([--with-$1-headers=DIR],
[Use $1 include files below directory DIR, DIR may actually be a space
separated list of multiple directories; in this case each is searched
in turn. (default: PREFIX/include/)])],
[AC_HELP_STRING([--with-$1-headers=DIR],
[Use $1 include files below directory DIR, DIR may actually be a space
separated list of multiple directories; in this case each is searched
in turn. (default: $2)])]),
[case "$withval" in
yes) AC_MSG_ERROR("option \"--with-$1-headers\" requires an argument")
;;
no) AC_MSG_ERROR("option \"--with-$1-headers\" requires an argument")
;;
*) UPNAME[_INCLUDE_PATH]="$withval"
;;
esac],
test -z "`eval eval eval echo ${UPNAME[_INCLUDE_PATH]}`" && UPNAME[_INCLUDE_PATH]="${DEFAULT_INCDIR}")
])
dnl
dnl headers and libraries below the same directory :(
dnl
AC_DEFUN([ALBERTA_CHECK_PKG_DIR_OPT],
[m4_define([UPNAME], [m4_bpatsubst(m4_toupper([$1]),-,_)])
AC_ARG_WITH($1-dir,
AC_HELP_STRING([--with-$1-dir=DIR],
[use $1 library (and headers) below directory DIR (no default)]),
[case "$withval" in
yes) AC_MSG_ERROR("option \"--with-$1-dir\" requires an argument")
;;
no) AC_MSG_ERROR("option \"--with-$1-dir\" requires an argument")
;;
*) UPNAME[_LIB_PATHS]="$withval"
UPNAME[_INCLUDE_PATH]="$withval"
;;
esac])
])
dnl ***************************************************************************
dnl ***************************************************************************
dnl ***************************************************************************
dnl ***************************************************************************
dnl
dnl the macro itself
dnl
AC_DEFUN([ALBERTA_CHECK_PACKAGE],
[
m4_define([alb_ac_PKGNAME],[$1])
m4_define([alb_ac_LIBNAMES],[$2])
m4_define([alb_ac_LIBFCTS],[$3])
m4_define([alb_ac_LIBPATHS],[$4])
m4_define([alb_ac_EXTRA_LIB],[$5])
m4_define([alb_ac_HEADERS],[$6])
m4_define([alb_ac_INCPATHS],[$7])
m4_define([alb_ac_EXTRA_INC],[$8])
m4_define([alb_ac_OPTIONS],[$9])
AC_REQUIRE([ALBERTA_SET_PREFIX])
m4_if($#,8,[],
[m4_if($#,9,[],
[errprint([$0] needs eight (8) or nine (9) arguments, but got $#)
m4exit(1)])])
dnl
dnl upcase $1
dnl
m4_define([UPNAME], [m4_bpatsubst(m4_toupper(alb_ac_PKGNAME),-,_)])
dnl
dnl need to use m4_if, the $i arguments are not shell variables
dnl
m4_define([ENABLED],[enabled])
m4_define([OPTIONAL],[required])
m4_if($#,9,[
m4_foreach_w([alb_ac_lvar],alb_ac_OPTIONS,
[m4_if(alb_ac_lvar,[disabled],
[m4_define([ENABLED],alb_ac_lvar)],
alb_ac_lvar,[enabled],
[m4_define([ENABLED],alb_ac_lvar)],
alb_ac_lvar,[optional],
[m4_define([OPTIONAL],alb_ac_lvar)],
alb_ac_lvar,[required],
[m4_define([OPTIONAL],alb_ac_lvar)])])])
m4_if(OPTIONAL,[optional],[ALBERTA_CHECK_PKG_OPT(alb_ac_PKGNAME,[ENABLED])])
dnl
dnl bail out if package is completely disabled
dnl
if test "${UPNAME[_DISABLE]}" = yes; then
:
else
m4_if(alb_ac_HEADERS,[],[],
[AC_MSG_RESULT([])
AC_MSG_RESULT([**** Checking for OPTIONAL package alb_ac_PKGNAME ****])])
m4_if(alb_ac_LIBPATHS,[],[DEFAULT_LIBDIR="${libdir}"],
[DEFAULT_LIBDIR="alb_ac_LIBPATHS"])
if test "${DEFAULT_LIBDIR}" = ''
then
DEFAULT_LIBDIR="'${libdir}'"
fi
dnl
dnl Optionally use an alternate name (e.g. MesaGL instead of GL etc.)
dnl
AC_ARG_WITH(alb_ac_PKGNAME[-name],
AC_HELP_STRING([--with-]alb_ac_PKGNAME[-name=NAME],
[use NAME as the name of the alb_ac_PKGNAME library (without leading "lib" prefix and
trailing suffix). If the default ("alb_ac_LIBNAMES") consists of multiple
libraries, then NAME must be a space separated list of replacement names
-- one name for each library.]),
[case "$withval" in
yes) AC_MSG_ERROR(["option \"--with-]alb_ac_PKGNAME[-name\" requires an argument"])
;;
no) AC_MSG_ERROR(["option \"--with-]alb_ac_PKGNAME[-name\" requires an argument"])
;;
*) UPNAME[_NAMES]="$withval"
;;
esac],
UPNAME[_NAMES]="alb_ac_LIBNAMES")
unset UPNAME[_LINK_NAMES]
for name in ${UPNAME[_NAMES]}; do
if test -z "${UPNAME[_LINK_NAMES]}"; then
UPNAME[_LINK_NAMES]="${name}"
else
UPNAME[_LINK_NAMES]="${UPNAME[_LINK_NAMES]} -l${name}"
fi
done
dnl
dnl headers and libraries below the same directory :(
dnl If we have no header to check for, then this additional option does not
dnl make sense, hence the m4_if()
dnl
m4_if(alb_ac_HEADERS,[],[],[ALBERTA_CHECK_PKG_DIR_OPT(alb_ac_PKGNAME)])
dnl
dnl location of library
dnl
AC_ARG_WITH(alb_ac_PKGNAME[-lib],
m4_if(alb_ac_LIBPATHS,[],
[AC_HELP_STRING([--with-]alb_ac_PKGNAME[-lib=DIR],
[use alb_ac_PKGNAME library below directory DIR.
DIR maybe a space separated directory list.
(default: EPREFIX/lib/)])],
[AC_HELP_STRING([--with-]alb_ac_PKGNAME[-lib=DIR],
[use alb_ac_PKGNAME library below directory DIR.
DIR maybe a space separated directory list.
(default: alb_ac_LIBPATHS)])]),
[case "$withval" in
yes) AC_MSG_ERROR(["option \"--with-]alb_ac_PKGNAME[-lib\" requires an argument"])
;;
no) AC_MSG_ERROR(["option \"--with-]alb_ac_PKGNAME[-lib\" requires an argument"])
;;
*) UPNAME[_LIB_PATHS]="$withval"
;;
esac],
test -z "`eval eval eval echo ${UPNAME[_LIB_PATHS]}`" \
&& UPNAME[_LIB_PATHS]="${DEFAULT_LIBDIR}")
unset alb_ac_tmp
for path in ${UPNAME[_LIB_PATHS]}; do
alb_ac_tmp="${alb_ac_tmp} -L${path}"
done
UPNAME[_LIB_PATHS]="${alb_ac_tmp}"
dnl
dnl now for the header file
dnl
m4_if(alb_ac_HEADERS,[],[],
[m4_if(alb_ac_INCPATHS,[],
[DEFAULT_INCDIR="${includedir}"
ALBERTA_CHECK_PKG_HDR_OPT(alb_ac_PKGNAME, [PREFIX/include/])],
[DEFAULT_INCDIR="alb_ac_INCPATHS"
ALBERTA_CHECK_PKG_HDR_OPT(alb_ac_PKGNAME, alb_ac_INCPATHS[]/)])])
m4_define([alb_ac_LINKER],[$CC])
m4_ifdef([alb_ac_AUXLIBS], [m4_undefine([alb_ac_AUXLIBS])])
m4_foreach_w([alb_ac_lvar],alb_ac_EXTRA_LIB,
[m4_if(alb_ac_lvar,[libtool],
[AC_LANG_CASE([C],[m4_define([alb_ac_lang_TAG],[CC])],
[C++],[m4_define([alb_ac_lang_TAG],[CXX])],
[Fortran 77],[m4_define([alb_ac_lang_TAG],[F77])])
m4_define([alb_ac_LINKER],
[libtool --tag=alb_ac_lang_TAG --mode=link ${alb_ac_lang_TAG}])],
[m4_append([alb_ac_AUXLIBS], alb_ac_lvar,[ ])])])
alb_ac_save_CC="${CC}"
CC="`eval eval eval echo alb_ac_LINKER`"
m4_ifdef([alb_ac_AUXLIBS],[],[m4_define([alb_ac_AUXLIBS],[])])
UPNAME[_AUXLIBS]="alb_ac_AUXLIBS"
dnl
dnl now check if the library and header files exist
dnl
m4_if(OPTIONAL,[optional],
[AC_CHECK_LIB(${UPNAME[_LINK_NAMES]}, main,
[UPNAME[_LIBS]="${UPNAME[_LIB_PATHS]} -l${UPNAME[_LINK_NAMES]}"
UPNAME[_ALL_LIBS]="${UPNAME[_LIB_PATHS]} -l${UPNAME[_LINK_NAMES]} ${UPNAME[_AUXLIBS]}"],
[UPNAME[_LIBS]=""
UPNAME[_ALL_LIBS]=""
UPNAME[_LIB_PATHS]=""
UPNAME[_INCLUDES]=""
UPNAME[_ALL_INCLUDES]=""
UPNAME[_INCLUDE_PATH]=""],
[`eval eval eval echo ${UPNAME[_LIB_PATHS]}` \
`eval eval eval echo ${UPNAME[_AUXLIBS]}`])],
[AC_CHECK_LIB(${UPNAME[_LINK_NAMES]}, main,
[UPNAME[_LIBS]="${UPNAME[_LIB_PATHS]} -l${UPNAME[_LINK_NAMES]}"
UPNAME[_ALL_LIBS]="${UPNAME[_LIB_PATHS]} -l${UPNAME[_LINK_NAMES]} ${UPNAME[_AUXLIBS]}"],
[case "$host" in
*darwin*)
AC_MSG_RESULT([Running the test for "alb_ac_PKGNAME" again with -framework switch])
;;
*)
AC_MSG_ERROR([Failed to find "lib{${UPNAME[_NAMES]}}"])
;;
esac],
[`eval eval eval echo $UPNAME[_LIB_PATHS]` \
`eval eval eval echo ${UPNAME[_AUXLIBS]}`])])
dnl
dnl On MacOS X we have that funky -framework switch ...
dnl So just run the test again with the framework switch in case the
dnl package was not found.
dnl
if test "x${UPNAME[_LIBS]}" = "x" ; then
case "$host" in
*darwin*)
as_ac_Lib=`echo "ac_cv_lib_${BLAS_LINK_NAMES}''_main" | $as_tr_sh`
eval "unset $as_ac_Lib"
unset UPNAME[_LINK_NAMES]
for name in ${UPNAME[_NAMES]}; do
if test -z "${UPNAME[_LINK_NAMES]}"; then
UPNAME[_LINK_NAMES]="${name}"
else
UPNAME[_LINK_NAMES]="${UPNAME[_LINK_NAMES]} -framework ${name}"
fi
done
unset alb_ac_tmp
for path in ${UPNAME[_LIB_PATHS]}; do
alb_ac_tmp="${alb_ac_tmp} -F${path}"
done
UPNAME[_LIB_PATHS]="${alb_ac_tmp}"
m4_if(OPTIONAL,[optional],
[AC_CHECK_FRAMEWORK(${UPNAME[_LINK_NAMES]}, main,
[UPNAME[_LIBS]="${UPNAME[_LIB_PATHS]} -framework ${UPNAME[_LINK_NAMES]}"
UPNAME[_ALL_LIBS]="${UPNAME[_LIB_PATHS]} -framework ${UPNAME[_LINK_NAMES]} ${UPNAME[_AUXLIBS]}"],
[UPNAME[_LIBS]=""
UPNAME[_ALL_LIBS]=""
UPNAME[_LIB_PATHS]=""
UPNAME[_INCLUDES]=""
UPNAME[_ALL_INCLUDES]=""
UPNAME[_INCLUDE_PATH]=""],
[`eval eval eval echo ${UPNAME[_LIB_PATHS]}`
`eval eval eval echo ${UPNAME[_AUXLIBS]}`])],
[AC_CHECK_FRAMEWORK(${UPNAME[_NAMES]}, main,
[UPNAME[_LIBS]="${UPNAME[_LIB_PATHS]} -framework ${UPNAME[_LINK_NAMES]}"
UPNAME[_ALL_LIBS]="${UPNAME[_LIB_PATHS]} -framework ${UPNAME[_LINK_NAMES]} ${UPNAME[_AUXLIBS]}"],
[AC_MSG_ERROR([Framework "${UPNAME[_NAMES]}" was not found])],
[`eval eval eval echo $UPNAME[_LIB_PATHS]` \
`eval eval eval echo ${UPNAME[_AUXLIBS]}`])])
;;
esac
fi
dnl
dnl Maybe the library seems to exist. Now check for all
dnl functions listed in alb_ac_LIBFCTS.
dnl
m4_if(alb_ac_LIBFCTS, [], [], [
if test "x${UPNAME[_LIBS]}" = "x" ; then
:
else
UPNAME[_LIB_EXPAND]="`eval eval eval echo ${UPNAME[_LIBS]}`"
AC_MSG_CHECKING([for m4_split(alb_ac_LIBFCTS) in \"${UPNAME[_LIB_EXPAND]}\"])
AC_MSG_RESULT([])
alb_ac_save_LIBS="${LIBS}"
LIBS="`eval eval eval echo ${UPNAME[_ALL_LIBS]}` ${LIBS}"
AC_CHECK_FUNCS(alb_ac_LIBFCTS,[],
[m4_if(OPTIONAL,[required],
[AC_MSG_ERROR([Check for library function for required package alb_ac_PKGNAME failed])])
UPNAME[_LIBS]=""
UPNAME[_ALL_LIBS]=""
UPNAME[_LIB_PATHS]=""
UPNAME[_INCLUDES]=""
UPNAME[_ALL_INCLUDES]=""
UPNAME[_INCLUDE_PATH]=""])
LIBS="${alb_ac_save_LIBS}"
fi])
dnl
dnl restore default linker
dnl
CC="${alb_ac_save_CC}"
if test "x${UPNAME[_LIBS]}" = "x" ; then
:
else
m4_if(alb_ac_HEADERS,[],[],[
dnl
dnl check for the header file(s)
dnl
[gv_ac_]UPNAME[_save_CPPFLAGS]="$CPPFLAGS"
for alb_ac_incdir in ${UPNAME[_INCLUDE_PATH]} ""; do
unset alb_ac_header_status
unset alb_ac_unset_names
alb_ac_incdir_exp="`eval eval eval echo ${alb_ac_incdir}`"
if test -n "${alb_ac_incdir_exp}"; then
CPPFLAGS="-I${alb_ac_incdir_exp} alb_ac_EXTRA_INC ${[gv_ac_]UPNAME[_save_CPPFLAGS]}"
AC_MSG_CHECKING([for header(s) \"alb_ac_HEADERS\" in \"${alb_ac_incdir_exp}\" and system include path])
AC_MSG_RESULT([])
else
AC_MSG_CHECKING([for header(s) \"alb_ac_HEADERS\" in system include path])
AC_MSG_RESULT([])
fi
AC_CHECK_HEADERS(alb_ac_HEADERS,
[alb_ac_unset_names="${alb_ac_unset_names} $as_ac_Header"],
[alb_ac_unset_names="${alb_ac_unset_names} $as_ac_Header"
alb_ac_header_status=notfound])
if test "x${alb_ac_header_status}" = "xnotfound"; then
for name in ${alb_ac_unset_names}; do
eval "unset ${name}"
done
else
break
fi
done
if test "x${alb_ac_header_status}" = "xnotfound"; then
m4_if(OPTIONAL,[optional],
[UPNAME[_LIBS]=""
UPNAME[_ALL_LIBS]=""
UPNAME[_LIB_PATHS]=""
UPNAME[_INCLUDES]=""
UPNAME[_INCLUDE_PATH]=""],
[AC_MSG_ERROR([Header file(s) \"alb_ac_HEADERS\" were not found])])
else
UPNAME[_ALL_INCLUDES]="-I${alb_ac_incdir} alb_ac_EXTRA_INC"
UPNAME[_INCLUDES]="-I${alb_ac_incdir}"
UPNAME[_INCLUDE_PATH]="${incdir}"
fi
CPPFLAGS="${[gv_ac_]UPNAME[_save_CPPFLAGS]}"
])
dnl
dnl define makefile substitutions and config.h macros
dnl
if test "x${UPNAME[_LIBS]}" = "x" ; then
:
else
m4_foreach_w([alb_ac_lvar],alb_ac_LIBNAMES,
[AC_DEFINE(m4_bpatsubst(m4_toupper([HAVE_LIB]alb_ac_lvar),-,_),
1, [Define to 1 if you have lib]alb_ac_lvar)])
AC_DEFINE([HAVE_PKG_]UPNAME,
1, [Define to 1 if you have package \"ac_alb_PKGNAME\"])
fi
fi
m4_if(alb_ac_HEADERS,[],[],[
if test -n "$[]UPNAME[_LIBS]"; then
AC_MSG_RESULT([**** Successfully finished checks for OPTIONAL package alb_ac_PKGNAME ****])
else
AC_MSG_RESULT([**** Checks for OPTIONAL package alb_ac_PKGNAME finished UNSUCCESSFULLY ****])
fi])
fi dnl disable fi
AM_CONDITIONAL([HAVE_]UPNAME, [test -n "$[]UPNAME[_LIBS]"])
AC_SUBST(UPNAME[_INCLUDE_PATH])
AC_SUBST(UPNAME[_INCLUDES])
AC_SUBST(UPNAME[_ALL_INCLUDES])
AC_SUBST(UPNAME[_LIB_PATHS])
AC_SUBST(UPNAME[_LIBS])
AC_SUBST(UPNAME[_ALL_LIBS])
AC_SUBST(UPNAME[_NAMES])
])