From holzer@stat.math.ethz.ch  Mon Mar 26 14:32:30 2001
From: holzer@stat.math.ethz.ch (holzer@stat.math.ethz.ch)
Date: Mon, 26 Mar 2001 15:32:30 +0200 (MET DST)
Subject: [Rd] Problems with R CMD COMPILE within Makefile (PR#885)
Message-ID: <200103261332.PAA25104@pubhealth.ku.dk>

Dear R-developpers

This concerns a problem I posted about half a year ago on the R-help list
and to which I got some answer by Duncan Temple Lang (see below), but the
basic problem still continues. Even though I managed a workaround which is
sufficient for me Martin Maechler asked me to send a toy example of the
problem to R-bugs. So that's what I try here.

The following Makefile will not work:
----------------------------------------
.PHONY: tst.o

tst.o: tst.c
	R CMD COMPILE tst.c
----------------------------------------

It results in:
----------------------------------------
cd /u/holzer/CurrentWork/algen/C/temp/
make 
R CMD COMPILE tst.c
make[1]: Entering directory `/users/u1/staff/holzer/CurrentWork/algen/C/temp'
R CMD COMPILE tst.c
make[2]: Entering directory `/users/u1/staff/holzer/CurrentWork/algen/C/temp'
make[2]: *** No rule to make target `w'.  Stop.
make[2]: Leaving directory `/users/u1/staff/holzer/CurrentWork/algen/C/temp'
make[1]: *** [tst.o] Error 2
make[1]: Leaving directory `/users/u1/staff/holzer/CurrentWork/algen/C/temp'
make: *** [tst.o] Error 2

Compilation exited abnormally with code 2 at Mon Mar 26 15:10:07
----------------------------------------

The following alternative ends in an infinite loop:
----------------------------------------
.PHONY: tst.o

tst.o: tst.c
	MAKEFLAGS="CFLAGS=" R CMD COMPILE tst.c
----------------------------------------

----------------------------------------
cd /u/holzer/CurrentWork/algen/C/temp/
make 
MAKEFLAGS="CFLAGS=" R CMD COMPILE tst.c
make[1]: Entering directory `/users/u1/staff/holzer/CurrentWork/algen/C/temp'
MAKEFLAGS="CFLAGS=" R CMD COMPILE tst.c
make[2]: Entering directory `/users/u1/staff/holzer/CurrentWork/algen/C/temp'
MAKEFLAGS="CFLAGS=" R CMD COMPILE tst.c
make[3]: Entering directory `/users/u1/staff/holzer/CurrentWork/algen/C/temp'
MAKEFLAGS="CFLAGS=" R CMD COMPILE tst.c
make[4]: Entering directory `/users/u1/staff/holzer/CurrentWork/algen/C/temp'
...
----------------------------------------


(My workaround consists in using R SHLIB instead of R COMPILE (which works
perfectly) and removing the files that disturb or that I don't need.)

I work under Linux. tst.c consists just of one line:

int  x() {return(1);}

platform i686-pc-linux-gnu
arch     i686             
os       linux-gnu        
system   i686, linux-gnu  
status                    
major    1                
minor    2.2              
year     2001             
month    02               
day      26               
language R                


Here is Duncan's answer:

>>  I took a quick look at the R COMPILE problem and it seems that there
>> are in fact two problems.  One is the problem with the attempt to
>> build a target `w'. And the other is that if that error didn't arise,
>> you would have an infinite loop.
>> 
>> Here is quick fix to your problem. Add the line
>> 
>>   include $(R_HOME)/etc/Makeconf
>> 
>> to your Makefile. Then, make will compile imageio.o with the correct flags.
>> 
>> eyore[RCompile-174]>make
>> gcc -I/home2/FlowData/AltProjects/R-shared//include  -I/usr/local/include -mieee-fp -D__NO_MATH_INLINES  -fPIC  -g -O2 -c imageio.c -o imageio.o 
>> 
>> 
>> That should be enough to get things working.  The more detailed
>> explanation is as follows.
>> 
>> a) The rule
>> imageio.o: imageio.c
>>  	R COMPILE imageio.c
>> 
>> is executed by the first call to make.
>> The COMPILE script expands this to call
>> 
>>      make -f $R_HOME/etc/Makeconf -f Makefile imageio.o
>> 
>> At this point, this second make process sees the same rule, and does
>> the same thing. Hence, you have infinite recursion.
>> 
>> 
>> 
>> b) The problem about the target `w' is a problem resulting from the R
>> COMPILE script being called recursively from a make process.  The
>> second make process getting called via the COMPILE script is getting
>> the value of the make variable MAKEFLAG from the top-level make you
>> executed manually.  This is implicitly set to w (meaning to print
>> directory information before and after the makefile is "executed")
>> and not -w. At this point, I am not certain whether this is an
>> R oversight or a GNU make bug.


Peter

____________________________________________________________

Peter Holzer                      phone: + 41 1 632 46 34
Seminar fuer Statistik, LEO C14   fax:   + 41 1 632 12 28
(Leonhardstr. 27)                  <holzer@stat.math.ethz.ch>
ETH (Federal Inst. Technology)
8092 Zurich                       http://stat.ethz.ch/~holzer/

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._


[Rd] Problems with R CMD COMPILE within Makefile (PR#885)
holzer@stat.math.ethz.ch