Paul Johnson
2006-Apr-25 20:46 UTC
[R] need automake/autoconf help to build RnetCDF and ncdf packages
I imagine this "where are your header files" problem comes up in other packages, so I'm asking this as a general R question. How should configure scripts be re-written so they look in more places? Briefly, the problem is that Fedora-Extras installs the header files in a subdirectory /usr/include/netcdf-3 rather than /usr/include: # rpm -ql netcdf-devel /usr/include/netcdf-3 /usr/include/netcdf-3/ncvalues.h /usr/include/netcdf-3/netcdf.h /usr/lib/netcdf-3/libnetcdf.a /usr/lib/netcdf-3/libnetcdf_c++.a /usr/lib/netcdf-3/libnetcdf_g77.a Last week I posted in this list that I re-built the Fedora-Extras netcdf rpm so that it would have more standard installation, and then I was able to make RNetCDF work. In the meanwhile, I posted in bugzilla.redhat.com asking if they might use the standard packaging, but their response is an adamant refusal: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=189734 When netcdf updates are issued in the Fedora-Extras network, the special hacks I put in to un-do their special hacks are lost, and netcdf programs don't work anymore. The attempt to build "ncdf" fails inside R or on the command line, but it gives a GOOD HINT about a command line work around: # R CMD INSTALL ncdf_1.5.tar.gz [...] checking /sw/include/netcdf.h presence... no checking for /sw/include/netcdf.h... no Fatal error: I cannot find the directory that holds the netcdf include file netcdf.h! You can specify it as follows: ./configure --with-netcdf_incdir=directory_with_file_netcdf.h *** Special note for R CMD INSTALL users: ********************************* The syntax for specifying multiple --configure-args does not seem to be well documented in R. If you have installed the netcdf include and library directories in some non-standard location, you can specify BOTH these during the R CMD INSTALL process using the following syntax: R CMD INSTALL --configure-args="-with-netcdf_incdir=/path/to/netcdf/incdir -with-netcdf_libdir=/path/to/netcdf/libdir" ncdf_1.1.tar.gz where you should, of course, specify your own netcdf include and library directories, and the actual package name. *************************************************************************** I found that the following did work! # R CMD INSTALL --configure-args="-with-netcdf_incdir=/usr/include/netcdf-3 -with-netcdf_libdir=/usr/lib/netcdf-3" ncdf_1.5.tar.gz It is not the best solution, because special administrative effort is required. And the "install.packages" approach inside R won't work. However, with RNetCDF, the problem is slightly worse, and no such helpful message appears: # R CMD INSTALL RNetCDF_1.1-3.tar.gz * Installing *source* package 'RNetCDF' ... checking for gcc... gcc checking for C compiler default output... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for executable suffix... checking for object suffix... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for main in -lnetcdf... no configure: error: netcdf library not found ERROR: configuration failed for package 'RNetCDF' ** Removing '/usr/lib/R/library/RNetCDF' I have no reason to doubt that the Fedora-Extras authors are right, and that some changes in the configure scripts for these packages are required. In RnetCDF's configure.ac file, I see the place where it specifies the NETCDF_INCDIR if test -z "${NETCDF_PATH}"; then AC_CHECK_FILE(/usr/local/include/netcdf.h, [USR_LOCAL_NETCDF_H=TRUE], [USR_LOCAL_NETCDF_H=FALSE]) if test "${USR_LOCAL_NETCDF_H}" = TRUE; then NETCDF_INCDIR="/usr/local/include" NETCDF_LIBDIR="/usr/local/lib" NETCDF_LIBNAME="netcdf" HAVE_NETCDF_H=TRUE elif test "${HAVE_NETCDF_H}" = FALSE; then AC_CHECK_FILE(/usr/include/netcdf.h, [USR_NETCDF_H=TRUE], [USR_NETCDF_H=FALSE]) if test "${USR_NETCDF_H}" = TRUE; then NETCDF_INCDIR="/usr/include" NETCDF_LIBDIR="/usr/lib" NETCDF_LIBNAME="netcdf" HAVE_NETCDF_H=TRUE fi fi else NETCDF_INCDIR="${NETCDF_PATH}/include" NETCDF_LIBDIR="${NETCDF_PATH}/lib" NETCDF_LIBNAME="netcdf" AC_CHECK_FILE(${NETCDF_INCDIR}/netcdf.h, [INCDIR_NETCDF_H=TRUE], [INCDIR_NETCDF_H=FALSE]) if test "${INCDIR_NETCDF_H}" = TRUE; then HAVE_NETCDF_H=TRUE fi fi I've tried fiddling around in this, and then typing #autoconf configure.ac > newconfigure sh ./newconfigure But it always ends the same: checking for main in -lnetcdf... no : error: netcdf library not found So, is there somebody here who know how configure scripts ought to be written to accomodate this? -- Paul E. Johnson Professor, Political Science 1541 Lilac Lane, Room 504 University of Kansas