blob: ac41f1ea411af2f4973dea362c2f7d30d511ee3e [file] [log] [blame]
### clibs.m4 -- extra macros for configuring R -*- Autoconf -*-
###
### Copyright (C) 2004 R Core Team
###
### This file is part of R.
###
### R 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 of the License, or (at your
### option) any later version.
###
### R 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 R; if not, you can obtain it via the World Wide Web at
### along with R; if not, a copy is available at
### http://www.r-project.org/Licenses/
## modified version of AC_F77_LIBRARY_LDFLAGS for C libraries
# _R_PROG_C_V_OUTPUT([FLAG = $r_cv_prog_c_v])
# -------------------------------------------------
# Link a trivial Fortran program, compiling with a verbose output FLAG
# (whose default value, $r_cv_prog_c_v, is computed by
# _R_PROG_C_V), and return the output in $r_c_v_output. This
# output is processed in the way expected by _AC_FC_LIBRARY_LDFLAGS,
# so that any link flags that are echoed by the compiler appear as
# space-separated items.
AC_DEFUN([_R_PROG_C_V_OUTPUT],
[AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
# Compile and link our simple test program by passing a flag (argument
# 1 to this macro) to the Fortran compiler in order to get
# "verbose" output that we can then parse for the Fortran linker
# flags.
r_save_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS m4_default([$1], [$r_cv_prog_c_v])"
(eval echo $as_me:__oline__: \"$ac_link\") >&AS_MESSAGE_LOG_FD
r_c_v_output=`eval $ac_link AS_MESSAGE_LOG_FD>&1 2>&1 | grep -v 'Driving:'`
echo "$r_c_v_output" >&AS_MESSAGE_LOG_FD
CFLAGS=$r_save_CFLAGS
rm -rf conftest*
# On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where
# /foo, /bar, and /baz are search directories for the Fortran linker.
# Here, we change these into -L/foo -L/bar -L/baz (and put it first):
r_c_v_output="`echo $r_c_v_output |
grep 'LPATH is:' |
sed 's,.*LPATH is\(: *[[^ ]]*\).*,\1,;s,: */, -L/,g'` $r_c_v_output"
case $r_c_v_output in
# If we are using xlc then replace all the commas with spaces.
*xlcentry*)
r_c_v_output=`echo $r_c_v_output | sed 's/,/ /g'` ;;
# With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted
# $LIBS confuse us, and the libraries appear later in the output anyway).
*mGLOB_options_string*)
r_c_v_output=`echo $r_c_v_output | sed 's/\"-mGLOB[[^\"]]*\"/ /g'` ;;
esac
])# _R_PROG_C_V_OUTPUT
# _R_PROG_C_V
# --------------
#
# Determine the flag that causes the Fortran compiler to print
# information of library and object files (normally -v)
# Needed for _AC_FC_LIBRARY_FLAGS
# Some compilers don't accept -v (Lahey: -verbose, xlf: -V, Fujitsu: -###)
AC_DEFUN([_R_PROG_C_V],
[AC_CACHE_CHECK([how to get verbose linking output from ${CC}],
[r_cv_prog_c_v],
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
[r_cv_prog_c_v=
# Try some options frequently used verbose output
for r_verb in -v -verbose --verbose -V -\#\#\#; do
_R_PROG_C_V_OUTPUT($r_verb)
# look for -l* and *.a constructs in the output
for r_arg in $r_c_v_output; do
case $r_arg in
[[\\/]]*.a | ?:[[\\/]]*.a | -[[lLRu]]*)
r_cv_prog_c_v=$r_verb
break 2 ;;
esac
done
done
if test -z "$r_cv_prog_c_v"; then
AC_MSG_WARN([cannot determine how to obtain linking information from ${CC}])
fi],
[AC_MSG_WARN([compilation failed])])
])])# _R_PROG_C_V
# _R_C_LIBRARY_LDFLAGS
# ----------------------
#
# Determine the linker flags (e.g. "-L" and "-l") for the C
# intrinsic and run-time libraries that are required to successfully
# link a C program or shared library. The output variable
# CLIBS is set to these flags.
#
# This macro is intended to be used in those situations when it is
# necessary to mix, e.g. C++ and Fortran, source code into a single
# program or shared library.
#
# For example, if object files from a C++ and Fortran compiler must
# be linked together, then the C++ compiler/linker must be used for
# linking (since special C++-ish things need to happen at link time
# like calling global constructors, instantiating templates, enabling
# exception support, etc.).
#
# This macro was packaged in its current form by Matthew D. Langston.
# However, nearly all of this macro came from the "OCTAVE_FLIBS" macro
# in "octave-2.0.13/aclocal.m4", and full credit should go to John
# W. Eaton for writing this extremely useful macro. Thank you John.
AC_DEFUN([_R_C_LIBRARY_LDFLAGS],
[_R_PROG_C_V
AC_CACHE_CHECK([for C libraries of ${CC}], r_cv_c_libs,
[if test "x$CLIBS" != "x"; then
r_cv_c_libs="$CLIBS" # Let the user override the test.
else
_R_PROG_C_V_OUTPUT
r_cv_c_libs=
# Save positional arguments (if any)
r_save_positional="$[@]"
set X $r_c_v_output
while test $[@%:@] != 1; do
shift
r_arg=$[1]
case $r_arg in
[[\\/]]*.a | ?:[[\\/]]*.a)
_AC_LIST_MEMBER_IF($r_arg, $r_cv_c_libs, ,
r_cv_c_libs="$r_cv_c_libs $r_arg")
;;
-bI:*)
_AC_LIST_MEMBER_IF($r_arg, $r_cv_c_libs, ,
[_AC_LINKER_OPTION([$r_arg], r_cv_c_libs)])
;;
# Ignore these flags.
-lang* | -lcrt[[01]].o | -lcrtbegin.o | -lc | -lgcc | -libmil | -LANG:=*)
;;
-lkernel32)
test x"$CYGWIN" != xyes && r_cv_c_libs="$r_cv_c_libs $r_arg"
;;
-[[LRuY]])
# These flags, when seen by themselves, take an argument.
# We remove the space between option and argument and re-iterate
# unless we find an empty arg or a new option (starting with -)
case $[2] in
"" | -*);;
*)
r_arg="$r_arg$[2]"
shift; shift
set X $r_arg "$[@]"
;;
esac
;;
-YP,*)
for r_j in `echo $r_arg | sed -e 's/-YP,/-L/;s/:/ -L/g'`; do
_AC_LIST_MEMBER_IF($r_j, $r_cv_c_libs, ,
[r_arg="$r_arg $r_j"
r_cv_c_libs="$r_cv_c_libs $r_j"])
done
;;
-[[lLR]]*)
_AC_LIST_MEMBER_IF($r_arg, $r_cv_c_libs, ,
r_cv_c_libs="$r_cv_c_libs $r_arg")
;;
# Ignore everything else.
esac
done
# restore positional arguments
set X $r_save_positional; shift
# We only consider "LD_RUN_PATH" on Solaris systems. If this is seen,
# then we insist that the "run path" must be an absolute path (i.e. it
# must begin with a "/").
case `(uname -sr) 2>/dev/null` in
"SunOS 5"*)
r_ld_run_path=`echo $r_c_v_output |
sed -n 's,^.*LD_RUN_PATH *= *\(/[[^ ]]*\).*$,-R\1,p'`
test "x$r_ld_run_path" != x &&
_AC_LINKER_OPTION([$r_ld_run_path], r_cv_c_libs)
;;
esac
fi # test "x$CLIBS" = "x"
])
CLIBS=
for arg in $r_cv_c_libs; do
case "${arg}" in
-L*)
CLIBS="${CLIBS} $arg"
;;
esac
done
])# _R_C_LIBRARY_LDFLAGS
# R_C_LIBRARY_LDFLAGS
# -------------------
AC_DEFUN([R_C_LIBRARY_LDFLAGS],
[AC_REQUIRE([AC_PROG_CC])dnl
AC_LANG_PUSH(C)dnl
_R_C_LIBRARY_LDFLAGS
AC_LANG_POP(C)dnl
])# R_C_LIBRARY_LDFLAGS