8214332: Add a flag for overriding default JNI library search path
authordholmes
Wed, 28 Nov 2018 22:29:35 -0500
changeset 52734 d537553ed639
parent 52733 1d520c376105
child 52735 7b9f61b7fd94
8214332: Add a flag for overriding default JNI library search path Reviewed-by: erikj, dholmes Contributed-by: Jakub Vanek <linuxtardis@gmail.com>
doc/building.html
doc/building.md
make/autoconf/jdk-options.m4
make/autoconf/spec.gmk.in
make/hotspot/lib/JvmFlags.gmk
src/hotspot/os/aix/os_aix.cpp
src/hotspot/os/bsd/os_bsd.cpp
src/hotspot/os/linux/os_linux.cpp
--- a/doc/building.html	Wed Nov 28 18:16:39 2018 -0800
+++ b/doc/building.html	Wed Nov 28 22:29:35 2018 -0500
@@ -464,6 +464,10 @@
 <li><code>--with-jvm-features=&lt;feature&gt;[,&lt;feature&gt;...]</code> - Use the specified JVM features when building Hotspot. The list of features will be enabled on top of the default list. For the <code>custom</code> JVM variant, this default list is empty. A complete list of available JVM features can be found using <code>bash configure --help</code>.</li>
 <li><code>--with-target-bits=&lt;bits&gt;</code> - Create a target binary suitable for running on a <code>&lt;bits&gt;</code> platform. Use this to create 32-bit output on a 64-bit build platform, instead of doing a full cross-compile. (This is known as a <em>reduced</em> build.)</li>
 </ul>
+<p>On Linux, BSD and AIX, it is possible to override where Java by default searches for runtime/JNI libraries. This can be useful in situations where there is a special shared directory for system JNI libraries. This setting can in turn be overriden at runtime by setting the <code>java.library.path</code> property.</p>
+<ul>
+<li><code>--with-jni-libpath=&lt;path&gt;</code> - Use the specified path as a default when searching for runtime libraries.</li>
+</ul>
 <h4 id="configure-arguments-for-native-compilation">Configure Arguments for Native Compilation</h4>
 <ul>
 <li><code>--with-devkit=&lt;path&gt;</code> - Use this devkit for compilers, tools and resources</li>
--- a/doc/building.md	Wed Nov 28 18:16:39 2018 -0800
+++ b/doc/building.md	Wed Nov 28 22:29:35 2018 -0500
@@ -662,6 +662,14 @@
     platform, instead of doing a full cross-compile. (This is known as a
     *reduced* build.)
 
+On Linux, BSD and AIX, it is possible to override where Java by default
+searches for runtime/JNI libraries. This can be useful in situations where
+there is a special shared directory for system JNI libraries. This setting
+can in turn be overriden at runtime by setting the `java.library.path` property.
+
+  * `--with-jni-libpath=<path>` - Use the specified path as a default
+  when searching for runtime libraries.
+
 #### Configure Arguments for Native Compilation
 
   * `--with-devkit=<path>` - Use this devkit for compilers, tools and resources
--- a/make/autoconf/jdk-options.m4	Wed Nov 28 18:16:39 2018 -0800
+++ b/make/autoconf/jdk-options.m4	Wed Nov 28 22:29:35 2018 -0500
@@ -244,6 +244,28 @@
     COPYRIGHT_YEAR=`$DATE +'%Y'`
   fi
   AC_SUBST(COPYRIGHT_YEAR)
+
+  # Override default library path
+  AC_ARG_WITH([jni-libpath], [AS_HELP_STRING([--with-jni-libpath],
+      [override default JNI library search path])])
+  AC_MSG_CHECKING([for jni library path])
+  if test "x${with_jni_libpath}" = "x" || test "x${with_jni_libpath}" = "xno"; then
+    AC_MSG_RESULT([default])
+  elif test "x${with_jni_libpath}" = "xyes"; then
+    AC_MSG_RESULT([invalid])
+    AC_MSG_ERROR([The --with-jni-libpath option requires an argument.])
+  else
+    HOTSPOT_OVERRIDE_LIBPATH=${with_jni_libpath}
+    if test "x$OPENJDK_TARGET_OS" != "xlinux" &&
+         test "x$OPENJDK_TARGET_OS" != "xbsd" &&
+         test "x$OPENJDK_TARGET_OS" != "xaix"; then
+      AC_MSG_RESULT([fail])
+      AC_MSG_ERROR([Overriding JNI library path is supported only on Linux, BSD and AIX.])
+    fi
+    AC_MSG_RESULT(${HOTSPOT_OVERRIDE_LIBPATH})
+  fi
+  AC_SUBST(HOTSPOT_OVERRIDE_LIBPATH)
+
 ])
 
 ###############################################################################
--- a/make/autoconf/spec.gmk.in	Wed Nov 28 18:16:39 2018 -0800
+++ b/make/autoconf/spec.gmk.in	Wed Nov 28 22:29:35 2018 -0500
@@ -275,6 +275,9 @@
 # Control wether Hotspot builds gtest tests
 BUILD_GTEST := @BUILD_GTEST@
 
+# Allow overriding the default hotspot library path
+HOTSPOT_OVERRIDE_LIBPATH := @HOTSPOT_OVERRIDE_LIBPATH@
+
 # Control use of precompiled header in hotspot libjvm build
 USE_PRECOMPILED_HEADER := @USE_PRECOMPILED_HEADER@
 
--- a/make/hotspot/lib/JvmFlags.gmk	Wed Nov 28 18:16:39 2018 -0800
+++ b/make/hotspot/lib/JvmFlags.gmk	Wed Nov 28 22:29:35 2018 -0500
@@ -95,3 +95,7 @@
 ifeq ($(USE_PRECOMPILED_HEADER), false)
   JVM_CFLAGS += -DDONT_USE_PRECOMPILED_HEADER
 endif
+
+ifneq ($(HOTSPOT_OVERRIDE_LIBPATH), )
+  JVM_CFLAGS += -DOVERRIDE_LIBPATH='"$(HOTSPOT_OVERRIDE_LIBPATH)"'
+endif
--- a/src/hotspot/os/aix/os_aix.cpp	Wed Nov 28 18:16:39 2018 -0800
+++ b/src/hotspot/os/aix/os_aix.cpp	Wed Nov 28 22:29:35 2018 -0500
@@ -541,7 +541,11 @@
 
 void os::init_system_properties_values() {
 
-#define DEFAULT_LIBPATH "/lib:/usr/lib"
+#ifndef OVERRIDE_LIBPATH
+  #define DEFAULT_LIBPATH "/lib:/usr/lib"
+#else
+  #define DEFAULT_LIBPATH OVERRIDE_LIBPATH
+#endif
 #define EXTENSIONS_DIR  "/lib/ext"
 
   // Buffer that fits several sprintfs.
--- a/src/hotspot/os/bsd/os_bsd.cpp	Wed Nov 28 18:16:39 2018 -0800
+++ b/src/hotspot/os/bsd/os_bsd.cpp	Wed Nov 28 22:29:35 2018 -0500
@@ -316,7 +316,11 @@
   //        ...
   //        7: The default directories, normally /lib and /usr/lib.
 #ifndef DEFAULT_LIBPATH
-  #define DEFAULT_LIBPATH "/lib:/usr/lib"
+  #ifndef OVERRIDE_LIBPATH
+    #define DEFAULT_LIBPATH "/lib:/usr/lib"
+  #else
+    #define DEFAULT_LIBPATH OVERRIDE_LIBPATH
+  #endif
 #endif
 
 // Base path of extensions installed on the system.
--- a/src/hotspot/os/linux/os_linux.cpp	Wed Nov 28 18:16:39 2018 -0800
+++ b/src/hotspot/os/linux/os_linux.cpp	Wed Nov 28 22:29:35 2018 -0500
@@ -323,10 +323,14 @@
   //        1: ...
   //        ...
   //        7: The default directories, normally /lib and /usr/lib.
-#if defined(AMD64) || (defined(_LP64) && defined(SPARC)) || defined(PPC64) || defined(S390)
-  #define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib"
+#ifndef OVERRIDE_LIBPATH
+  #if defined(AMD64) || (defined(_LP64) && defined(SPARC)) || defined(PPC64) || defined(S390)
+    #define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib"
+  #else
+    #define DEFAULT_LIBPATH "/lib:/usr/lib"
+  #endif
 #else
-  #define DEFAULT_LIBPATH "/lib:/usr/lib"
+  #define DEFAULT_LIBPATH OVERRIDE_LIBPATH
 #endif
 
 // Base path of extensions installed on the system.