HenrikBengtsson / CBI-software

A Scientific Software Stack for HPC (CentOS oriented)
https://wynton.ucsf.edu/hpc/software/software-repositories.html
5 stars 2 forks source link

R: Configure JAVA_HOME before 'build' #62

Closed HenrikBengtsson closed 1 year ago

HenrikBengtsson commented 2 years ago

I just noticed that R configures Java settings (R CMD javareconf) during the make build step. The current Makefile then re-configures this with JAVA_HOME set during make post_install.

HenrikBengtsson commented 1 year ago

To see the current settings, do:

$ R CMD javareconf --dry-run
Java interpreter : /usr/bin/java
Java version     : 1.8.0_352
Java home path   : /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64/jre
Java compiler    : /usr/bin/javac
Java headers gen.: /usr/bin/javah
Java archive tool: /usr/bin/jar

trying to compile and link a JNI program 
detected JNI cpp flags    : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/linux
detected JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm
gcc -I"/software/c4/cbi/software/R-4.2.2-gcc10/lib64/R/include" -DNDEBUG -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64/jre/../include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64/jre/../include/linux  -I/usr/local/include   -fpic  -g -O2  -c conftest.c -o conftest.o
gcc -shared -L/software/c4/cbi/software/R-4.2.2-gcc10/lib64/R/lib -L/usr/local/lib64 -o conftest.so conftest.o -L/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64/jre/lib/amd64/server -ljvm -L/software/c4/cbi/software/R-4.2.2-gcc10/lib64/R/lib -lR

JAVA_HOME        : /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64/jre
Java library path: $(JAVA_HOME)/lib/amd64/server
JNI cpp flags    : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/linux
JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm
HenrikBengtsson commented 1 year ago

It would be great if we could use the shorter, more version-stable JAVA_HOME path;

$ ls -l /usr/lib/jvm/java-1.8.0-openjdk
lrwxrwxrwx 1 root root 40 Oct 26 06:16 /usr/lib/jvm/java-1.8.0-openjdk -> /etc/alternatives/java_sdk_1.8.0_openjdk

which in turn points to (the long version-format):

$ ls -l /etc/alternatives/java_sdk_1.8.0_openjdk
lrwxrwxrwx 1 root root 60 Oct 26 06:16 /etc/alternatives/java_sdk_1.8.0_openjdk -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64
HenrikBengtsson commented 1 year ago

We could rely on the openjdk module (available on Wynton and C4), which, if they exist, define the short version of JAVA_HOME, e.g.

$ module try-load openjdk/1.8.0
$ echo "$JAVA_HOME"
/usr/lib/jvm/java-1.8.0
HenrikBengtsson commented 1 year ago

Oh, this is already implemented;

https://github.com/HenrikBengtsson/CBI-software/blob/7d023c55a29efa4fd2cc1d8d9ffb194262951ac7/CBI/r/Makefile#L101-L137

Deployed on C4:

$ R CMD javareconf --dry-run
Java interpreter : /usr/lib/jvm/java-1.8.0/jre/bin/java
Java version     : 1.8.0_352
Java home path   : /usr/lib/jvm/java-1.8.0
Java compiler    : /usr/lib/jvm/java-1.8.0/bin/javac
Java headers gen.: /usr/lib/jvm/java-1.8.0/bin/javah
Java archive tool: /usr/lib/jvm/java-1.8.0/bin/jar

trying to compile and link a JNI program 
detected JNI cpp flags    : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
detected JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
gcc -I"/software/c4/cbi/software/R-4.2.2-gcc10/lib64/R/include" -DNDEBUG -I/usr/lib/jvm/java-1.8.0/include -I/usr/lib/jvm/java-1.8.0
/include/linux  -I/usr/local/include   -fpic  -g -O2  -c conftest.c -o conftest.o
gcc -shared -L/software/c4/cbi/software/R-4.2.2-gcc10/lib64/R/lib -L/usr/local/lib64 -o conftest.so conftest.o -L/usr/lib/jvm/java-1
.8.0/jre/lib/amd64/server -ljvm -L/software/c4/cbi/software/R-4.2.2-gcc10/lib64/R/lib -lR

JAVA_HOME        : /usr/lib/jvm/java-1.8.0
Java library path: $(JAVA_HOME)/jre/lib/amd64/server
JNI cpp flags    : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm

and just now, also on Wynton;

R CMD javareconf --dry-run
Java interpreter : /usr/lib/jvm/java-1.8.0/jre/bin/java
Java version     : 1.8.0_345
Java home path   : /usr/lib/jvm/java-1.8.0
Java compiler    : /usr/lib/jvm/java-1.8.0/bin/javac
Java headers gen.: /usr/lib/jvm/java-1.8.0/bin/javah
Java archive tool: /usr/lib/jvm/java-1.8.0/bin/jar

trying to compile and link a JNI program 
detected JNI cpp flags    : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
detected JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
gcc -I"/wynton/home/cbi/shared/software/CBI/R-4.2.2-gcc10/lib64/R/include" -DNDEBUG -I/usr/lib/jvm/java-1.8.0/include -I/usr/lib/jvm/java-1.8.0/include/linux  -I/usr/local/include   -fpic  -g -O2  -c conftest.c -o conftest.o
gcc -shared -L/wynton/home/cbi/shared/software/CBI/R-4.2.2-gcc10/lib64/R/lib -L/usr/local/lib64 -o conftest.so conftest.o -L/usr/lib/jvm/java-1.8.0/jre/lib/amd64/server -ljvm -L/wynton/home/cbi/shared/software/CBI/R-4.2.2-gcc10/lib64/R/lib -lR

JAVA_HOME        : /usr/lib/jvm/java-1.8.0
Java library path: $(JAVA_HOME)/jre/lib/amd64/server
JNI cpp flags    : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm