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

______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

Reply via email to