From mtmorgan at fhcrc.org  Sun May 13 21:24:26 2007
From: mtmorgan at fhcrc.org (Martin Morgan)
Date: Sun, 13 May 2007 12:24:26 -0700
Subject: [Rd] Help understanding LAPACK symbol resolution
Message-ID: <6phtzuga5n9.fsf@gopher4.fhcrc.org>

R developers,

I am trying to understand how symbols are resolved, so that I can
configure a package that I contributed to, and so that I can provide
guidance to (linux / OSX) users of the package. To be concrete, my
package uses the LAPACK Fortran symbol zsysv. This is not in
libRlapack, but is defined on my system in the library
/usr/lib64/liblapack.so.

* I suspect that the reason the symbol is not in libRlapack is just
  one of economy, i.e., no use for the symbol in R routines, rather
  than for other nefarious reasons (?? some fundamental incompatibility
  with R?)

I guess that most of my package users will have an R built without
special attention to their lapack library, so will start with
something like

mtmorgan at gopher4:~> R CMD config LAPACK_LIBS
-L/home/mtmorgan/arch/x86_64/R-devel/lib -lRlapack

My R is built with --enable-R-shlib, so predictably enough

R CMD INSTALL --clean <pkg>

is 'successful' (zsysv_ is marked as unresolved in the <pkg>.so, but
this doesn't stop compiling and linking). Also predictably enough,
loading the package in R indicates 'undefined symbol: zsysv_'. Inside
R, LD_LIBRARY_PATH starts with he R_HOME/lib, and includes /usr/lib64,
so I surmise that the libraries defined at compile / link are the ones
where symbols are searched (rather than all libraries in
LD_LIBRARY_PATH).

To allow the user to provide a specific LAPACK, I added lines to a
configure.in file that allow for a --with-lapack

LAPACK_LIBS=`"${R_HOME}/bin/R" CMD config LAPACK_LIBS`
AC_ARG_WITH([lapack],
	AC_HELP_STRING([--with-lapack=LIB_PATH],
		[LAPACK library location with complex routines]),
		[LAPACK_LIBS=$withval])

added a check to see that zsysv_ is actually available

AC_CHECK_FUNC(zsysv_,,
	AC_MSG_ERROR([lapack needs zsysv_ in ${LAPACK_LIBS}]))

and substituted LAPACK_LIBS into a Makevars.in file

AC_SUBST(LAPACK_LIBS)
AC_OUTPUT(src/Makevars)

Makevars.in:
PKG_LIBS=@LAPACK_LIBS@

I then install my package with

R CMD INSTALL --clean --configure-args=--with-lapack=-llapack <pkg>

or more generally

R CMD INSTALL --clean \
   --configure-args="--with-lapack='-L/usr/lib64 -llapack'" <pkg>

This 'works', in the sense that the package compiles, loads, and
apparently runs as expected. I'm concerned though about how lapack is
being found, and how symbols are actually being resolved.

When I

mtmorgan at gopehr4:~> ldd <pkg>.so

I see an entry

        liblapack.so.3 => /usr/lib64/liblapack.so.3 (0x00002b0928a1c000)

and I do NOT see an entry pointing to libRlapack .Am I right in
interpreting this to mean:

* All LAPACK symbols in my package, including those that
  coincidentally have a definition in libRlapack, resolve to
  /usr/lib64/liblapack.so?

* liblapack.so will be found without any need to specify
  LD_LIBRARY_PATH, or other configuration variables? Or is the library
  being found because my LD_LIBRARY_PATH already includes /usr/lib64?
  If the latter, how can the user 'best' configure their system to
  find the required library (I think I'm looking for something between
  'get the system administrator to install lapack in a findable place'
  and 'set LD_LIBRARY_PATH before starting R').

* Resolving symbols to libraries will occur in a way consistent with
  the last two points (as opposed to the implementation details)
  across platforms, compilers, and static vs. shared libraries?

Thanks for any reassurance or corrective guidance.

Martin
-- 
Martin Morgan
Bioconductor / Computational Biology
http://bioconductor.org



[Rd] Help understanding LAPACK symbol resolution
Martin Morgan