[Rd] PKG_LIBS in make child processes
Ulrich Bodenhofer
bodenhofer at bioinf.jku.at
Tue Oct 11 08:39:33 CEST 2016
[cross-posted from bioc-devel list]
Hi all,
I have a subtle question related to how R CMD SHLIB handles variables in
make child processes. In more detail: I am the maintainer of the 'msa'
package which has been in Bioconductor since April 2015. This package
integrates three open-source libraries for multiple sequence alignment.
This is organized in the following way: in src/, there are three
sub-directories, one for each of the libraries (plus another one for a
garbage collector library, but that is not relevant at this point).
src/Makevars is made such that the libraries are compiled individually
to static libraries in their respective sub-directory, then these static
libraries are copied to src/, and finally the static libraries are
integrated into msa.so. The Makevars file looks as follows:
PKG_LIBS=`${R_HOME}/bin${R_ARCH_BIN}/Rscript -e "if
(Sys.info()['sysname'] == 'Darwin') cat('-Wl,-all_load ./libgc.a
./libClustalW.a ./libClustalOmega.a ./libMuscle.a') else
cat('-Wl,--whole-archive ./libgc.a ./libClustalW.a
./libClustalOmega.a ./libMuscle.a -Wl,--no-whole-archive')"`
PKG_CXXFLAGS=-I"./gc-7.2/include" -I"./Muscle/" -I"./ClustalW/src"
-I"./ClustalOmega/src"
.PHONY: all mylibs
all: $(SHLIB)
$(SHLIB): mylibs
mylibs: build_gc build_muscle build_clustalw build_clustalomega
build_gc:
make --file=msaMakefile --directory=gc-7.2
@echo "----------------------------------------"
@echo "------------------ GC -----------------"
@echo "----------------------------------------"
@echo "--------- Compilation finished ---------"
@echo "----------------------------------------"
build_muscle:
make --file=msaMakefile --directory=Muscle
@echo "----------------------------------------"
@echo "---------------- MUSCLE ----------------"
@echo "----------------------------------------"
@echo "--------- Compilation finished ---------"
@echo "----------------------------------------"
build_clustalw:
make --file=msaMakefile --directory=ClustalW
@echo "----------------------------------------"
@echo "--------------- ClustalW ---------------"
@echo "----------------------------------------"
@echo "--------- Compilation finished ---------"
@echo "----------------------------------------"
build_clustalomega:
make --file=msaMakefile --directory=ClustalOmega
@echo "----------------------------------------"
@echo "------------- ClustalOmega -------------"
@echo "----------------------------------------"
@echo "--------- Compilation finished ---------"
@echo "----------------------------------------"
This has always worked on Linux and Mac OS so far. Now I have received
an error report from a user who cannot install the package on a 64-bit
openSUSE 13.1 system using R 3.3.1. It turned out that R CMD SHLIB as
called in the make child processes (make target 'build_muscle' above)
uses the value of PKG_LIBS defined in the first line of the top-level
Makevars file shown above (which of course does not work and makes no
sense), while this does not happen on any other Unix-like system I have
tried so far (Ubuntu, CentOS, Mac OS). Maybe somebody can shed some
light on how variables defined inside the Makevars file propagate to
child processes. Thanks so much in advance!
Best regards,
Ulrich
More information about the R-devel
mailing list