boinc/m4/sah_check_lib.m4

460 lines
12 KiB
Plaintext

AC_DEFUN([SAH_CHECK_LIB],[
alib="$1"
# check to see if it is in our static list
for slib in ${STATIC_LIB_LIST}; do
lib_is_static="no"
tmp_pattern=`echo s/x${slib}// | sed 's/\*/.*/'`
if test -z "`echo x${alib} | sed ${tmp_pattern}`"
then
SAH_STATIC_LIB_REQUIRED(${alib},[$2],[
lib_is_static="yes"
sah_lib_last="${sah_static_lib_last}"
$3
],[$4],[$5])
break;
fi
done
if test "${lib_is_static}" = "no" ; then
SAH_DYNAMIC_LIB_REQUIRED(${alib},[$2],[
sah_lib_last="${sah_dynamic_lib_last}"
$3
],[$4], [$5])
fi
])
AC_DEFUN([SAH_CHECK_LDFLAG],[
sv_ldflags="${LDFLAGS}"
AC_MSG_CHECKING(if compiler works with $1 flag)
LDFLAGS="${LDFLAGS} $1"
AC_LINK_IFELSE([
AC_LANG_PROGRAM([[
#define CONFIG_TEST
int foo() {return 1;}
]],
[ return foo(); ])],
[
AC_MSG_RESULT(yes)
$2
],
[
AC_MSG_RESULT(no)
LDFLAGS="${sv_ldflags}"
$3
]
)
])
AC_DEFUN([SAH_LINKAGE_FLAGS],[
if test "${disable_static_linkage}" = "yes"
then
ld_static_option=""
ld_dynamic_option=""
LD_EXPORT_DYNAMIC=""
else
if test -z "${ld_static_option}"
then
case $target in
*linux* | *solaris* | *cygwin* )
AC_MSG_CHECKING([${CC} flags for static linkage ...])
ld_static_option="-Wl,-Bstatic"
AC_MSG_RESULT($ld_static_option)
AC_MSG_CHECKING([${CC} flags for dynamic linkage ...])
ld_dynamic_option="-Wl,-Bdynamic"
AC_MSG_RESULT($ld_dynamic_option)
;;
*darwin* )
AC_MSG_CHECKING([${CC} flags for static linkage ...])
ld_static_option="-static"
AC_MSG_RESULT($ld_static_option)
AC_MSG_CHECKING([${CC} flags for dynamic linkage ...])
ld_dynamic_option="-dynamic"
AC_MSG_RESULT($ld_dynamic_option)
;;
*)
if test -z "${dummy_ld_variable_gfdsahjf}"
then
dummy_ld_variable_gfdsahjf="been there done that"
AC_MSG_CHECKING([${CC} flags for static linkage ...])
AC_MSG_RESULT(unknown)
AC_MSG_CHECKING([${CC} flags for dynamic linkage ...])
AC_MSG_RESULT(unknown)
fi
;;
esac
AC_MSG_CHECKING([${CC} flags for exporting dynamic symbols from an executable ...])
case $target in
*cygwin*)
LD_EXPORT_DYNAMIC="-Wl,--export-all-symbols"
AC_MSG_RESULT(${LD_EXPORT_DYNAMIC})
;;
*linux*)
AC_MSG_RESULT(-rdynamic)
LD_EXPORT_DYNAMIC="-rdynamic"
;;
*)
AC_MSG_RESULT(none required)
LD_EXPORT_DYNAMIC=
;;
esac
fi
fi
if test -z "${LIBEXT}";
then
SAH_LIBEXT
fi
if test -z "${DLLEXT}";
then
SAH_DLLEXT
fi
AC_SUBST(LD_EXPORT_DYNAMIC)
])
# use this function in order to find a library that we require to be static.
# we will check in the following order....
# 1) files named lib{name}.a
# 2) files named {name}.a
# 3) linking with the static flags "$STATIC_FLAGS -l{name}"
AC_DEFUN([SAH_STATIC_LIB_REQUIRED],[
SAH_LINKAGE_FLAGS
# upercase the library name for our definition
ac_uc_defn=HAVE_LIB`echo $1 | sed -e 's/[^a-zA-Z0-9_]/_/g' \
-e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
# Build our cache variable names
STATIC_LIB_LIST="${STATIC_LIB_LIST} $1"
varname=`echo sah_cv_static_lib_$1_$2 | $as_tr_sh`
var2=`echo sah_cv_static_lib_$1_fopen | $as_tr_sh`
if test "$2" != "fopen" ; then
tmp_msg="for $2 in static library $1"
else
tmp_msg="for static library $1"
fi
AC_CACHE_CHECK([$tmp_msg],
[$varname],
[
tmp_res="no"
#
# check if we want to actually do all this.
if test "${disable_static_linkage}" = "yes"
then
sah_static_checklibs="-l$1"
else
sah_static_checklibs="lib$1.${LIBEXT} $1.${LIBEXT} -l$1"
fi
sah_save_libs="${LIBS}"
for libname in ${sah_static_checklibs}
do
SAH_FIND_STATIC_LIB(${libname})
if test -n "${tmp_lib_name}"
then
LIBS="${tmp_lib_name} $5 ${sah_save_libs}"
AC_LINK_IFELSE([
AC_LANG_PROGRAM([[
#define CONFIG_TEST 1
#ifdef __cplusplus
extern "C" {
#endif
char $2 ();
#ifdef __cplusplus
}
#endif
]],
[ $2 (); ])],
[
tmp_res="${tmp_lib_name}"
]
)
fi
if test "${tmp_res}" != "no"
then
break
fi
done
LIBS="${sah_save_libs}"
eval ${varname}='"'${tmp_res}'"'
eval ${var2}='"'${tmp_res}'"'
])
#
# save the result for use by the caller
sah_static_lib_last="`eval echo '${'$varname'}'`"
#
if test "${sah_static_lib_last}" != "no"
then
LIBS="${sah_static_lib_last} ${LIBS}"
AC_DEFINE_UNQUOTED([$ac_uc_defn], [1],
[Define to 1 if the $1 library has the function $2]
)
$3
else
$4
echo > /dev/null
fi
])
# use this function in order to find a library that we require to be dynamic.
# we will check in the following order....
# 1) linking with the dynamic flags "$DYNAMIC_FLAGS -l{name}"
# 2) linking with no flags "-l{name}"
AC_DEFUN([SAH_DYNAMIC_LIB_REQUIRED],[
SAH_LINKAGE_FLAGS
# upercase the library name for our definition
ac_uc_defn=HAVE_LIB`echo $1 | sed -e 's/[^a-zA-Z0-9_]/_/g' \
-e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
# Build our cache variable names
DYNAMIC_LIB_LIST="${DYNAMIC_LIB_LIST} $1"
varname=`echo sah_cv_dynamic_lib_$1_$2 | $as_tr_sh`
var2=`echo sah_cv_dynamic_lib_$1_fopen | $as_tr_sh`
if test "$2" != "fopen" ; then
tmp_msg="for $2 in dynamic library $1"
else
tmp_msg="for dynamic library $1"
fi
AC_CACHE_CHECK([$tmp_msg],
[$varname],
[
tmp_res="no"
#
# check if we want to actually do all this.
if test "${disable_static_linkage}" = "yes"
then
sah_dynamic_checklibs="-l$1 -l$1.${DLLEXT}"
else
sah_dynamic_checklibs="-l$1"
fi
sah_save_libs="${LIBS}"
for libname in ${sah_dynamic_checklibs}
do
tmp_lib_name="${libname}"
LIBS="${ld_dynamic_option} ${tmp_lib_name} $5 ${sah_save_libs}"
AC_LINK_IFELSE([
AC_LANG_PROGRAM([[
#define CONFIG_TEST 1
#ifdef __cplusplus
extern "C" {
#endif
char $2 ();
#ifdef __cplusplus
}
#endif
]],
[ $2 (); ])
],
[
tmp_res="${ld_dynamic_option} ${tmp_lib_name}"
])
if test "${tmp_res}" = "no"
then
tmp_lib_name="${libname}"
LIBS="${tmp_lib_name} ${sah_save_libs}"
AC_LINK_IFELSE([
AC_LANG_PROGRAM([[
#define CONFIG_TEST 1
#ifdef __cplusplus
extern "C" {
#endif
char $2 ();
#ifdef __cplusplus
}
#endif
]],
[ $2 (); ])
],
[
tmp_res="${tmp_lib_name}"
])
fi
done
LIBS="${sah_save_libs}"
eval ${varname}='"'${tmp_res}'"'
eval ${var2}='"'${tmp_res}'"'
])
#
# save the result for use by the caller
sah_dynamic_lib_last="`eval echo '${'$varname'}'`"
#
if test "${sah_dynamic_lib_last}" != "no"
then
LIBS="${sah_dynamic_lib_last} ${LIBS}"
AC_DEFINE_UNQUOTED([$ac_uc_defn], [1],
[Define to 1 if the $1 library has the function $2]
)
$3
else
$4
echo > /dev/null
fi
])
AC_DEFUN([SAH_STATIC_LIB],[
SAH_STATIC_LIB_REQUIRED([$1],[$2])
sah_lib_last="${sah_static_lib_last}"
if test "${sah_lib_last}" = "no" ; then
SAH_DYNAMIC_LIB_REQUIRED([$1],[$2])
sah_lib_last=${sah_dynamic_lib_last}
fi
if test "${sah_lib_last}" != "no" ; then
$3
echo > /dev/null
else
$4
echo > /dev/null
fi
])
AC_DEFUN([SAH_DYNAMIC_LIB],[
SAH_DYNAMIC_LIB_REQUIRED([$1],[$2])
sah_lib_last="${sah_dynamic_lib_last}"
if test "${sah_lib_last}" = "no" ; then
SAH_STATIC_LIB_REQUIRED([$1],[$2])
sah_lib_last=${sah_static_lib_last}
fi
if test "${sah_lib_last}" != "no" ; then
$3
echo > /dev/null
else
$4
echo > /dev/null
fi
])
#The SAH_FIND_STATIC_LIB macro searches the LD_LIBRARY_PATH or equivalent
#in order to find a static version of the library being loaded.
AC_DEFUN([SAH_FIND_STATIC_LIB],[
# libtool sets up the variable shlibpath_var which holds the name of the
# LIB_PATH variable. We also want to strip the sparcv9 and 64s from the
# path, because we'll add them again later
strip_pattern="s/sparcv9//g; s/lib64/lib/g; s/lib\/64/lib/g"
tmp_libpath=`eval echo '${'$shlibpath_var'}' | sed "${strip_pattern}"`
# in cygwin, the DLLs are in the path, but the static libraries are elsewhere.
# Here's an educated guess.
if test "${shlibpath_var}" = "PATH"
then
tmp_libpath=`echo ${PATH} | sed 's/\/bin/\/lib/g'`
tmp_libpath="${tmp_libpath}:${PATH}"
fi
gcc_version=`${CC} -v 2>&1 | grep "gcc version" | $AWK '{print $[]3}'`
for gcc_host in `${CC} -v 2>&1 | grep host` --host=${ac_cv_target}
do
if test -n "`echo x$gcc_host | grep x--host=`"
then
gcc_host="`echo $gcc_host | sed 's/--host=//'`"
break
fi
done
for dirs in `${CC} -v 2>&1 | grep prefix` --prefix=/usr/local
do
if test -n "`echo x$dirs | grep x--prefix=`"
then
gcc_prefix="`echo $dirs | sed 's/--prefix=//'`"
gcc_specs=`${CC} -v 2>&1 | grep specs | $AWK '{print $[]4}' | sed 's/\/specs//'`
tmp_libpath="${gcc_specs}:${gcc_prefix}/lib:${gcc_prefix}/lib/gcc-lib/${gcc_host}/${gcc_version}:${tmp_libpath}"
break
fi
done
# now lets add any directories in LIBS or LDFLAGS
tmp_more_dirs=`echo $LIBS $LDFLAGS | $AWK '{for (i=1;i<(NF+1);i++) { printf("x%s\n",$[]i); }}' | grep x-L | sed 's/x-L//' | $AWK '{printf("%s:",$[]1);}'`
tmp_libpath="${tmp_more_dirs}${tmp_libpath}"
# Put machine/arch specific tweaks to the libpath here.
if test -z "${COMPILER_MODEL_BITS}"
then
SAH_DEFAULT_BITNESS
fi
case $target in
x86_64-*-linux*)
if test -n "${COMPILER_MODEL_BITS}"
then
tmp_pattern="s/\/lib/\/lib${COMPILER_MODEL_BITS}/g"
tmp_pattern_b="s/${COMPILER_MODEL_BITS}${COMPILER_MODEL_BITS}/${COMPILER_MODEL_BITS}/g"
abcd_q=`echo ${tmp_libpath} | sed ${tmp_pattern} | sed ${tmp_pattern_b} `
case ${COMPILER_MODEL_BITS} in
32)
gcc_host_dirs=`echo ${gcc_prefix}/lib/gcc*/i[3456]86*linux*/${gcc_version}`
;;
64)
gcc_host_dirs=`echo ${gcc_prefix}/lib/gcc-lib/x86_64*linux*/${gcc_version}`
;;
esac
tmp_libpath="${abcd_q}:${tmp_libpath}"
for tmp_dir in ${gcc_host_dirs}
do
tmp_libpath="${tmp_dir}:${tmp_libpath}"
done
fi
;;
sparc*-sun-solaris*)
if test -n "${COMPILER_MODEL_BITS}"
then
tmp_pattern="s/\/lib/\/lib\/${COMPILER_MODEL_BITS}/g"
tmp_pattern_b="s/${COMPILER_MODEL_BITS}\/${COMPILER_MODEL_BITS}/${COMPILER_MODEL_BITS}/g"
abcd_q=`echo ${tmp_libpath} | sed ${tmp_pattern} | sed ${tmp_pattern_b}`
case ${COMPILER_MODEL_BITS} in
64)
tmp_arch="sparcv9"
;;
32)
tmp_arch=
;;
esac
abcd_r=
for tmp_dir in `echo ${tmp_libpath} | sed 's/\:/ /g'`
do
abcd_r="${abcd_r}:${tmp_dir}/${tmp_arch}"
done
tmp_libpath="${abcd_r}:${abcd_q}:${tmp_libpath}"
fi
;;
*)
echo > /dev/null
;;
esac
if test -n "`echo x$1 | grep x-l`"
then
# in the -l case, don't search, just use the ld_static_option (usually
# -Wl,-B static
tmp_lib_name="${ld_static_option} $1"
else
# we also want to check the system config files for library dirs.
tmp_dir_list=
if test -e /etc/ld.so.conf
then
tmp_dir_list=`cat /etc/ld.so.conf`
else
if test -e /var/ld/ld.config
then
tmp_dir_list=`cat /var/ld/ld.config`
fi
fi
## add library-paths from LDFLAGS to beginning of lib-path
ldflags_path=`echo $LDFLAGS | sed 's/-l[[^ ]]*//g' | sed 's/-L\([[^ ]]*\)/:\1/g' | sed 's/[[ ]]*//g'`
tmp_dir_list=`echo ${ldflags_path}:${tmp_libpath}:/lib:/usr/lib:/usr/ucb/lib:/usr/local/lib:/opt/misc/lib:${tmp_dir_list} | $AWK -F: '{for (i=1;i<(NF+1);i++) { print $[]i; }}'`
tmp_lib_name=
# now that we know where we are looking, find our library
for tmp_dir in $tmp_dir_list
do
if test -e $tmp_dir/$1
then
tmp_lib_name=${tmp_dir}/$1
break
fi
done
fi
])