From tobias.verbeke at telenet.be  Mon Aug  6 16:30:41 2007
From: tobias.verbeke at telenet.be (Tobias Verbeke)
Date: Mon, 06 Aug 2007 14:30:41 +0000
Subject: [Rd] Makefile for embedding OpenBUGS in R package
Message-ID: <W906017980119021186410641@nocme1bl6.telenet-ops.be>

>----- Oorspronkelijk bericht -----
>Van: Prof Brian Ripley [mailto:ripley at stats.ox.ac.uk]
>Verzonden: maandag, augustus 6, 2007 03:46 PM
>Aan: 'Tobias Verbeke'
>CC: r-devel at 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

>>   (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'
** 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,                  ripley at stats.ox.ac.uk
>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
>
>



[Rd] Makefile for embedding OpenBUGS in R package
Tobias Verbeke