[Rd] Bundling system dependencies in binary packages

Louis Aslett louis.aslett at stats.ox.ac.uk
Wed Dec 3 20:40:06 CET 2014

On 3 December 2014 at 07:40, Prof Brian Ripley wrote:
> On 02/12/2014 18:34, Louis Aslett wrote:
>> I've been hunting round for the accepted method of bundling system
>> dependencies into binary packages.
>> For example, there are some CRAN packages (e.g. gmp, RcppArmadillo,
>> ...) which don't require the system dependencies be installed for the
>> Windows and Mac binary builds.  I understand that there are a very
>> limited number of packages for which CRAN would do this, so as a first
>> step I'm *not* asking how to get this on CRAN, but rather this
>> highlights there must be a (fairly automated/easy) mechanism to
>> achieve this.  Is it as simple as statically linking?  If so there's
> Well, packages using just C++ headers (RcppArmadillo is one) do not have
> libraries to link to.

Sorry, yes I discovered when I went to do a concrete example that I
was mistaken in thinking RcppArmadillo fell under the category of
packages I was thinking about.  gmp is the exemplar for bundling
dependencies that my query was driving at.

> But as far as possible the Windows and OS X binary packages are
> statically linked.  What is available to CRAN package builds is at
> http://www.stats.ox.ac.uk/pub/Rtools/libs.html
> http://r.research.att.com/libs/ (and includes gmp).
>> surely an automated way to trigger this without having to modify
>> Makevars to produce the static linked packages?
>> The Writing R Extensions manual section on binary packages doesn't
>> mention this and I've tried extensive Googling without joy.
> Nothing special is needed: the linkers use static linking if there is no
> dynamic library available.  So the external software is built with
> configure options --enable-static --disable-shared .  On OS X it also
> has to be built with PIC flags (not the default for static libraries).

Ok, this was exactly the issue ... my GMP didn't have PIC for the
static library.  As soon as I recompiled GMP using --with-pic for the
configure script I was able to temporarily rename my dynamic library
versions of GMP and FLINT and it picked up the static libraries
without throwing any errors.

Thank you very much -- I wasn't at all aware PIC was needed for static
code on OS X!  I'd assumed I was missing something much more

>> So in a nut shell, I'm looking to bundle a binary version of GMP
>> (https://gmplib.org) and FLINT (http://flintlib.org) into my package
>> for Windows/Mac users who can't/won't compile the libraries and which
>> I can distribute independently of CRAN, but without having to do so in
>> a manual/hacky way by tweaking Makevars each time, or modifying the
>> tgz/zip produced by R.
> There are a few exceptions where dynamic linking is used on Windows, and
> the configure scripts are used to install DLLs into the libs directory.
>   (RCurl is one, currently.)  The main reason for not doing so is naming
> conflicts for DLLs on Windows. For example, if you were to have a
> gmp.dll and so did package gmp, the first loaded would win, even though
> they might be different versions (and this was common for zlib1.dll).

Many thanks again,


More information about the R-devel mailing list