[R-pkg-devel] Subarchitectures

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Thu Feb 11 21:27:19 CET 2021

On 11/02/2021 2:30 p.m., Balasubramanian Narasimhan wrote:
> If GNU make is acceptable as a system requirement, you can get any R
> configuration/runtime variable in Makevars, e.g.
> R_ARCH=$(shell $(R_HOME)/bin/Rscript -e 'cat(.Platform$r_arch)')

I wanted to avoid it, since WRE discourages it so strongly.  What I 
ended up doing is putting the following into src/Makevars.in:

all: $(SHLIB) @HIDE_IF_NO_OPENGL@ ../inst/useNULL$(R_ARCH)/$(SHLIB)

../inst/useNULL$(R_ARCH)/$(SHLIB): $(SHLIB)
	cp -R *.cpp *.c *.h OpenGL useNULL
	cd useNULL;$(R_HOME)/bin/R CMD SHLIB -o $(SHLIB);rm *.cpp *.c *.h 
OpenGL/*; cd ..
	mkdir -p ../inst/useNULL$(R_ARCH)
	mv useNULL/$(SHLIB) ../inst/useNULL$(R_ARCH)/

The $(SHLIB) target should already have the subarchitecture in it. 
@HIDE_IF_NO_OPENGL@ is set by configure to "#" if OpenGL is not 
available for the build, so the second make target would be commented 
out.  If it's not commented out, then I copy all the source files into 
src/useNULL, and in that directory, I make $(SHLIB) again.  (There's 
another Makevars.in in that directory that has different compiler and 
linker options than the main one.)  Then I move the result to 
inst/useNULL$(R_ARCH)/, which will be inst/useNULL in most cases, but 
will have a subarchitecture directory added on if necessary.

This is complicated, partly because  R CMD check  has a bug 
(https://bugs.r-project.org/bugzilla/show_bug.cgi?id=18054) which means 
you will get check warnings if you try to register entry points in a DLL 
with any name except the same as the name of the package.  So to get a 
modified version of the main DLL, it has to have the same name but be 
stored somewhere else.

The version above passes checks, but it's pretty unusual, so I'm not 
certain it doesn't violate the intention of some rule or other.

Duncan Murdoch

More information about the R-package-devel mailing list