### 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 ### https://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