[Rd] Calling Rscript from Makevars

Simon Urbanek simon.urbanek at r-project.org
Sat May 21 00:05:01 CEST 2011

This is unrelated to the original question, so clarifications inline for posterity.

On May 20, 2011, at 3:15 PM, Sean Robert McGuffee wrote:

> Hi,
> I've found this type of thing to be extremely confusing, myself, but I
> managed to get something to work. I'm not sure how well. I also don't know
> if R is running autoconf or just configure--at least I don't remember off
> the top of my head.

Martyn was asking about dynamic variables in Makevars which is less intrusive than having a configure script. In general, I recommend using the configure script only as the ultima ratio if there is no easy way to achieve the same effect with Makevars, because configure prevents the package from building all architectures.

> However, here are some examples of commands I put in my
> configure.ac file: 
> CC=`"${R_HOME}/bin/R" CMD config CC`
> CXX=`"${R_HOME}/bin/R" CMD config CXX`
> CFLAGS=`"${R_HOME}/bin/R" CMD config CFLAGS`
> CXXFLAGS=`"${R_HOME}/bin/R" CMD config CXXFLAGS`
> PKG_LIBS=`${R_HOME}/bin/Rscript -e "Rcpp:::LdFlags()"`
> then you can use some preset commands such as:

Note that setting PKG_LIBS in configure won't work since configure doesn't know how to handle it. It may be ok if you don't care that the flags won't be checked, but then you better know what you're doing ;).

> or generic commands such as:
> AC_SUBST(whateverVariableYouLike)
> and make sure to put in the key command at the bottom before AC_OUTPUT:
> AC_CONFIG_FILES([src/Makefile])
> If R runs autoconf before ./configure when packaging or installing, you will
> be fine with just the configure.ac. Otherwise you might have to run autoconf
> before packaging. 

You have to run autoconf yourself - R has no way of knowing how to bootstrap your setup. Some authors prefer to use the maintainer mode in configure for that, but you still have to create some configure script.

> Anyway, what this will do is create a configure script when autoconf is run.
> When ./configure is run by R when installing, it will execute replacement
> commands on src/Makefile.in to generate the new Makefile.
> Anything within two @ symbols will be replaced.
> examples inside my Makefile.in:
> CC = @CC@
> CXX = @CXX@

You can omit all that if you use Makevars. Also using Makefile is discouraged because it forces you to replicate the whole building process which is very error prone (and may be different for each version of R).

> I still haven't figured out how to do the Makevars thing,

It's very simple - just remove all targets from your Makefile and you have Makevars since R will do the compilation and linking for you and correctly. If you feel like it, you can override its behavior by adding one rule (e.g., all:) that lists your desired dependency and you can pass on to the R default by depending on $(SHLIB).


> but I've
> completely given up on R documentation. The key part from the R
> documentation that I found useful was that it calls configure on install, so
> you can use autoconf documentation to figure out how to set things up.
> I'm sure I probably left out a ton of info, but those are my two cents.
> Please feel free to ask me for more details if you are interested.
> Good luck,
> Sean 
> On 5/20/11 12:04 PM, "Martyn Byng" <Martyn.Byng at nag.co.uk> wrote:
>> Hi,
>> I am trying to package some code to use with R and wanted to call
>> Rscript from within the Makevars file (I am trying to automate the
>> setting of the location of a third party library depending on what is
>> available / the system the package is being installed on).
>> If I just have a simple Makevars containing
>> PKG_LIBS= -lnag_nag -L/fserver/nagprod/FL22/fll6a22df/lib
>> the package is built without any errors, if I attempt to add a call to
>> Rscript, for example (which I think is the way that "Writing R
>> Extensions" recommends):
>> R_SCRIPT_NAME=Rscript
>> ifneq ($(R_HOME),)
>> else
>> endif
>> R_ARCH=$(shell $(R_SCRIPT) -e 'cat(R.version$$arch)')
>> PKG_LIBS= -lnag_nag -L/fserver/nagprod/FL22/fll6a22df/lib
>> I get the following error:
>> * checking for file 'NAGFWrappers/DESCRIPTION' ... OK
>> * preparing 'NAGFWrappers':
>> * checking DESCRIPTION meta-information ... OK
>> * cleaning src
>> make: Nothing to be done for `clean'.
>> * removing junk files
>> * checking for LF line-endings in source and make files
>> * checking for empty or unneeded directories
>> * building binary distribution
>> * installing *source* package 'NAGFWrappers' ...
>> ** libs
>> /usr/share/R/make/shlib.mk:3: /usr/lib64/R/etcx86_64/Makeconf: No such
>> file or directory
>> make: *** No rule to make target `/usr/lib64/R/etcx86_64/Makeconf'.
>> Stop.
>> ERROR: compilation failed for package 'NAGFWrappers'
>> * removing '/tmp/Rinst1513764321/NAGFWrappers'
>> * installation failed
>> Any help / pointers would be appreciated.
>> Cheers
>> Martyn
>> Output from R.version:
>> platform       x86_64-redhat-linux-gnu
>> arch           x86_64
>> os             linux-gnu
>> system         x86_64, linux-gnu
>> status           
>> major          2 
>> minor          11.0
>> year           2010
>> month          04
>> day            22
>> svn rev        51801
>> language       R 
>> version.string R version 2.11.0 (2010-04-22)
>> ________________________________________________________________________
>> The Numerical Algorithms Group Ltd is a company registered in England
>> and Wales with company number 1249803. The registered office is:
>> Wilkinson House, Jordan Hill Road, Oxford OX2 8DR, United Kingdom.
>> This e-mail has been scanned for all viruses by Star. Th...{{dropped:4}}
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

More information about the R-devel mailing list