Murat Tasan
2010-Oct-04 20:52 UTC
[R] source package build/installation with subdirectory-lib
hi all - i have a source package i'm writing that i'd like to be able
to install with a special library that my R src files rely on.
to be more precise, i have a normal R package directory structure
(i.e. src/ R/ man/ DESCRIPTION NAMESPACE etc.).
i also have another directory here called depPkg, and it has it's own
configure file for the canonical './configure && make &&
make install'
installation.
so myPkg looks like so (only showing the relevant pieces):
+ myPkg
|--- DESCRIPTION
|--- NAMESPACE
|--- R/ (with R files in here)
|--- src/ (with my .c files in here)
|--- depPkg/ (with all of the package contents (e.g. src, docs,
configure script, etc)
if i switch into and build depPkg by hand it works just fine, and i
set a configure option to locate the .a library file it creates into
the depPkg/lib/ directory, like so:
bash$ ./configure --prefix=./lib --with-pic --disable-shared
this builds depPkglib.a and puts it in the lib directory under depPkg.
now when i compile *my* shared library in testing, it also works just
fine:
bash$ cd src
bash$ gcc -std=gnu99 -I/usr/share/R/include -I../depPkg/include -fpic -
g -O2 -c mycode.c -o mycode.o
bash$ gcc -std=gnu99 -shared -o mycode.so mycode.o -L/usr/lib64/R/lib -
lR -L../depPgk/lib -ldepPkg
when in R, i can now use dyn.load("mycode.so") and .Call(...) with my
C functions perfectly.
now i want to build the package so i can install it easily on my
colleagues' machines.
so i use the normal R build mechanism (R CMD build), but first create
a Makevars file that looks like so:
PKG_CPPFLAGS = -I../depPkg/include
PKG_LIBS = ../depPkg/lib
.PHONY: all mylibs
all: $(SHLIB)
$(SHLIB): mylibs
mylibs:
(cd ..; gunzip depPgk.tar.gz; tar -xf depPkg.tar; cd depPkg; ./
configure --prefix=./lib --with-pic --disable-shared; make; make
install)
finally, when i try R CMD INSTALL, i know it sees the Makevars file,
because the first build step shows the added include path (from the
PKG_CPPFLAGS variable), but it never seems to execute the commands for
the mylibs target, thus the compiling step of my code fails.
sorry for the long-winded description, but without it i think this
would have made no sense (and likely still doesn't).
i have also tried moving depPgk INTO the src directory and updating
the necessary ../ to ./ in the Makevars, but target mylibs never seems
to be built first.
anyone ever try something like this and have some pointers on how to
debug?
thanks much for any help,
-murat
Murat Tasan
2010-Oct-04 21:24 UTC
[R] source package build/installation with subdirectory-lib
i've simplified this process to illustrate what i'm not getting (i.e.
doing wrong) regarding Makevars:
take any R source package of yours (best to pick one that hasn't ever
needed a Makevars file), and add a Makevars in src with:
.PHONY: all testtarget
all: $(SHLIB)
$(SHLIB): testtarget
testtarget:
echo 'foobar';
now try to install the package (with the -d flag for debugging and
verbose output).
'foobar' never appears (at least on my system, but the compilation
process of the shared library code does indeed begin).
Makevars is in the src directory (with some other source files).
am i completely off here in my usage of Makevars?
thanks!
-murat
On Oct 4, 4:52?pm, Murat Tasan <mmu... at gmail.com>
wrote:> hi all - i have a source package i'm writing that i'd like to be
able
> to install with a special library that my R src files rely on.
> to be more precise, i have a normal R package directory structure
> (i.e. src/ R/ man/ DESCRIPTION NAMESPACE etc.).
> i also have another directory here called depPkg, and it has it's own
> configure file for the canonical './configure && make
&& make install'
> installation.
>
> so myPkg looks like so (only showing the relevant pieces):
>
> + myPkg
> |--- DESCRIPTION
> |--- NAMESPACE
> |--- R/ ? (with R files in here)
> |--- src/ ? (with my .c files in here)
> |--- depPkg/ ? (with all of the package contents (e.g. src, docs,
> configure script, etc)
>
> if i switch into and build depPkg by hand it works just fine, and i
> set a configure option to locate the .a library file it creates into
> the depPkg/lib/ directory, like so:
> bash$ ./configure --prefix=./lib --with-pic --disable-shared
> this builds depPkglib.a and puts it in the lib directory under depPkg.
>
> now when i compile *my* shared library in testing, it also works just
> fine:
> bash$ cd src
> bash$ gcc -std=gnu99 -I/usr/share/R/include -I../depPkg/include -fpic -
> g -O2 -c mycode.c -o mycode.o
> bash$ gcc -std=gnu99 -shared -o mycode.so mycode.o -L/usr/lib64/R/lib -
> lR -L../depPgk/lib -ldepPkg
>
> when in R, i can now use dyn.load("mycode.so") and .Call(...)
with my
> C functions perfectly.
>
> now i want to build the package so i can install it easily on my
> colleagues' machines.
> so i use the normal R build mechanism (R CMD build), but first create
> a Makevars file that looks like so:
>
> PKG_CPPFLAGS = -I../depPkg/include
> PKG_LIBS = ../depPkg/lib
>
> .PHONY: all mylibs
>
> all: $(SHLIB)
>
> $(SHLIB): mylibs
>
> mylibs:
> ? ? ? ? (cd ..; gunzip depPgk.tar.gz; tar -xf depPkg.tar; cd depPkg; ./
> configure --prefix=./lib --with-pic --disable-shared; make; make
> install)
>
> finally, when i try R CMD INSTALL, i know it sees the Makevars file,
> because the first build step shows the added include path (from the
> PKG_CPPFLAGS variable), but it never seems to execute the commands for
> the mylibs target, thus the compiling step of my code fails.
>
> sorry for the long-winded description, but without it i think this
> would have made no sense (and likely still doesn't).
>
> i have also tried moving depPgk INTO the src directory and updating
> the necessary ../ to ./ in the Makevars, but target mylibs never seems
> to be built first.
>
> anyone ever try something like this and have some pointers on how to
> debug?
>
> thanks much for any help,
>
> -murat
>
> ______________________________________________
> R-h... at r-project.org mailing
listhttps://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guidehttp://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.