On Mon, 6 Aug 2007, Tobias Verbeke wrote: >> ----- Oorspronkelijk bericht ----- >> Van: Prof Brian Ripley [mailto:[EMAIL PROTECTED] >> Verzonden: maandag, augustus 6, 2007 03:46 PM >> Aan: 'Tobias Verbeke' >> CC: r-devel@r-project.org >> Onderwerp: Re: [Rd] Makefile for embedding OpenBUGS in R package >> >> On Mon, 6 Aug 2007, Tobias Verbeke wrote: >> >>> Dear list, >>> >>> I'm trying to embed OpenBUGS in an R package for use of it >>> on 64-bit Linux. In order to get the CLI working one has to >>> compile C code contained in $OpenBUGS/Manuals/CBugs.html >> >> same as >> >> http://mathstat.helsinki.fi/openbugs/data/Docu/CBugs.html >> >> I presume. > > Actually, these files appear to differ. The file I referred to > was the file ./Manuals/CBugs.html contained in the current OpenBUGS > release: > > http://mathstat.helsinki.fi/openbugs/OpenBUGS.zip
I am baffled by that C file: why not just link an even simpler stub against brugs.so rather than play around with dlopen? >>> (copied to say CBugs.c) using >>> >>> gcc -m32 -o bugs CBugs.c -ldl >>> >>> I put the OpenBUGS distribution in the ./inst subdirectory of >>> the package root. Where should I now put the CBugs.c and how >> >> Why do you want to install CBugs.c? > > The CBugs.c file itself is indeed not needed in the built package. > >> >>> should the Makefile look like in order to be able to call >>> $PKG_ROOT/OpenBUGS/bugs afterwards ? >>> >>> Naively putting the following Makefile in ./src does not work >> >> What does 'does not work' mean? It's hard to know whether this is just >> not doing what you wanted, or something else is wrong. > > Apologies. This is the error message when putting the Makefile > in ./src and launching the package checker: > > $ R.250 CMD check CGHmix > DISPLAY=localhost:10.0 > * checking for working latex ... OK > * using log directory '/home/tverbek1/pkg/CGHmix.Rcheck' > * using R version 2.5.0 (2007-04-23) > * checking for file 'CGHmix/DESCRIPTION' ... OK > * checking extension type ... Package > * this is package 'CGHmix' version '0.1-2' > * checking package dependencies ... OK > * checking if this is a source package ... OK > * checking whether package 'CGHmix' can be installed ... ERROR > Installation failed. > See '/home/tverbek1/pkg/CGHmix.Rcheck/00install.out' for details. > > The file 00install.out contains: > > * Installing *source* package 'CGHmix' ... > ** libs > ** arch - > gcc -m32 -o ../inst/OpenBUGS/bugs ../inst/OpenBUGS/CBugs.c -ldl > cp: cannot stat `*.so': No such file or directory > ERROR: compilation failed for package 'CGHmix' Ah, so you need to circumvent the installation mechanism as you do not have a DLL in your package. See package Rserve for a workaround. [rest not needed for the reply.] > ** Removing '/home/tverbek1/pkg/CGHmix.Rcheck/CGHmix' > >> >>> -%-------- >>> bugs: ../inst/OpenBUGS/CBugs.c >>> gcc -m32 -o bugs ../inst/OpenBUGS/CBugs.c -ldl >>> -%------- >>> >>> The objective is to use something along the following >>> >>> execfile <- system.file("OpenBUGS", "bugs", package = mypkg) >>> system(paste(execfile, "< somescript.script > somefile.out")) >>> >>> This system call to the CLI is currently the only (non-WINE) >>> way of using OpenBUGS on Linux in batch mode. >> >> I think you need to make ../inst/OpenBUGS/bugs, not src/bugs. So >> something like >> >> all: ../inst/OpenBUGS/bugs >> >> ../inst/OpenBUGS/bugs: ../inst/OpenBUGS/CBugs.c >> gcc -m32 -o ../inst/OpenBUGS/bugs ../inst/OpenBUGS/CBugs.c -ldl > > Thank you. > >> However, -m32 builds a 32-bit executable on 64-bit linux. Is that what you >> wanted? > > Yes. The shared object (brugs.so) comes with the OpenBUGS distribution > and currently can only be cross-compiled by the main OpenBUGS developer > (Andrew Thomas) who knows all secrets of the Windows only BlackBox > (nomen omen) Component Pascal compiler. > > $ file brugs.so > brugs.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), > stripped > > Many thanks for your ever instructive answer. > > Tobias > > P.S. Contents of CBugs.c from OpenBUGS distribution (3.0.1) > > /* GNU General Public Licence > > This small C program loads the brugs.so ELF shared library and calls the > CLI function. > Save it as a .c file and then compile it on Linux using gcc -o bugs CBugs.c > -ldl > > */ > > #include <dlfcn.h> > #include <stdio.h> > #include <string.h> > > int main (int argc, char **argv) > { > void * handle; > void (*cli)(void); > > handle = dlopen("./brugs.so", RTLD_LAZY); > if (!handle) > return 1; > > * (void **) (&cli) = dlsym(handle, "CLI"); > (*cli)(); > dlclose(handle); > > return 0; > > } -- Brian D. Ripley, [EMAIL PROTECTED] Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel