summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sci-libs/gdal/files/gdal-2.0.3-add-dlopen-support-for-jvm.patch')
-rw-r--r--sci-libs/gdal/files/gdal-2.0.3-add-dlopen-support-for-jvm.patch232
1 files changed, 232 insertions, 0 deletions
diff --git a/sci-libs/gdal/files/gdal-2.0.3-add-dlopen-support-for-jvm.patch b/sci-libs/gdal/files/gdal-2.0.3-add-dlopen-support-for-jvm.patch
new file mode 100644
index 000000000000..7c35d1cb1242
--- /dev/null
+++ b/sci-libs/gdal/files/gdal-2.0.3-add-dlopen-support-for-jvm.patch
@@ -0,0 +1,232 @@
+From baba2c213770972e79be6be4902716278f351fb4 Mon Sep 17 00:00:00 2001
+From: James Le Cuirot <chewi@gentoo.org>
+Date: Wed, 24 Aug 2016 23:32:13 +0100
+Subject: [PATCH 1/2] Allow libjvm.so to be dlopen'd with --with-jvm-lib=dlopen
+
+Having to set LD_LIBRARY_PATH is a pain and relying on the rpath can
+be problematic when libjvm.so lives in a versioned directory. Some
+distributions even allow per-user JVM selection so checking the value
+of JAVA_HOME at runtime allows this choice to be respected.
+
+libjvm.so's location is hard to predict (amd64 vs i386, jre or not?)
+so ${JAVA_HOME}/bin/java -XshowSettings is executed to find its
+location. If JAVA_HOME is not set then java is executed from the PATH
+instead.
+---
+ gdal/configure | 11 +++++-
+ gdal/configure.in | 7 +++-
+ gdal/ogr/ogrsf_frmts/mdb/ogrmdbjackcess.cpp | 57 +++++++++++++++++++++++++++--
+ gdal/port/cpl_config.h.in | 3 ++
+ 4 files changed, 71 insertions(+), 7 deletions(-)
+
+diff --git a/configure b/configure
+index 75e4e279de..acdfa439de 100755
+--- a/configure
++++ b/configure
+@@ -1753,7 +1753,7 @@ Optional Packages:
+ --with-python=ARG Enable python bindings (ARG=yes, no, or path to python binary)
+ --with-java Include Java support (ARG=yes, no or JDK home path) [default=no]
+ --with-mdb Include MDB driver
+- --with-jvm-lib=ARG ARG points to Java libjvm path
++ --with-jvm-lib=ARG ARG is dlopen or points to Java libjvm path
+ --with-jvm-lib-add-rpath Add the libjvm path to the RPATH (no by default)
+ --with-rasdaman=DIR Include rasdaman support (DIR is rasdaman's install dir).
+ --with-armadillo=ARG Include Armadillo support for faster TPS transform computation (ARG=yes/no/path to armadillo install root) [default=no]
+@@ -29491,7 +29491,14 @@ if test "${with_jvm_lib_add_rpath+set}" = set; then :
+ fi
+
+
+- if test "x$with_jvm_lib" != "x"; then
++ if test "x$with_jvm_lib" = "xdlopen"; then
++
++cat >>confdefs.h <<_ACEOF
++#define JVM_LIB_DLOPEN 1
++_ACEOF
++
++ JVM_LIB="-ldl"
++ elif test "x$with_jvm_lib" != "x"; then
+ if test -d "$with_jvm_lib"; then
+ saved_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -L$with_jvm_lib"
+diff --git a/configure.in b/configure.in
+index 91efa5a32a..546ff04049 100644
+--- a/configure.in
++++ b/configure.in
+@@ -4213,11 +4213,14 @@ if test "$with_mdb" = "yes" ; then
+ AC_MSG_ERROR("--with-java must be specified.")
+ fi
+
+- AC_ARG_WITH(jvm-lib, [ --with-jvm-lib=[ARG] ARG points to Java libjvm path],,)
++ AC_ARG_WITH(jvm-lib, [ --with-jvm-lib=[ARG] ARG is dlopen or points to Java libjvm path],,)
+
+ AC_ARG_WITH(jvm-lib-add-rpath,[ --with-jvm-lib-add-rpath Add the libjvm path to the RPATH (no by default)],,)
+
+- if test "x$with_jvm_lib" != "x"; then
++ if test "x$with_jvm_lib" = "xdlopen"; then
++ AC_DEFINE_UNQUOTED(JVM_LIB_DLOPEN, 1, [Define to 1 if libjvm.so should be dlopen'd])
++ JVM_LIB="-ldl"
++ elif test "x$with_jvm_lib" != "x"; then
+ if test -d "$with_jvm_lib"; then
+ saved_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -L$with_jvm_lib"
+diff --git a/ogr/ogrsf_frmts/mdb/ogrmdbjackcess.cpp b/ogr/ogrsf_frmts/mdb/ogrmdbjackcess.cpp
+index b068adf777..bc54a115df 100644
+--- a/ogr/ogrsf_frmts/mdb/ogrmdbjackcess.cpp
++++ b/ogr/ogrsf_frmts/mdb/ogrmdbjackcess.cpp
+@@ -29,6 +29,11 @@
+
+ #include "ogr_mdb.h"
+
++#if JVM_LIB_DLOPEN
++#include <limits.h>
++#include <stdio.h>
++#endif
++
+ CPL_CVSID("$Id: ogrmdbjackcess.cpp 27044 2014-03-16 23:41:27Z rouault $");
+
+ static JavaVM *jvm_static = NULL;
+@@ -161,9 +166,41 @@ int OGRMDBJavaEnv::Init()
+ {
+ JavaVM* vmBuf[1];
+ jsize nVMs;
++ int ret = 0;
++
++#if JVM_LIB_DLOPEN
++ const char *jvmLibPtr = "libjvm.so";
++ char jvmLib[PATH_MAX];
++
++ FILE *javaCmd = popen("\"${JAVA_HOME}${JAVA_HOME:+/bin/}java\" -XshowSettings 2>&1 | sed -n '/\\bsun\\.boot\\.library\\.path =/s:.* = \\(.*\\):\\1/server/libjvm.so:p'", "r");
++
++ if (javaCmd != NULL)
++ {
++ size_t javaCmdRead = fread(jvmLib, 1, PATH_MAX, javaCmd);
++ ret = pclose(javaCmd);
++
++ if (ret == 0 && javaCmdRead >= 2)
++ {
++ /* Chomp the new line */
++ jvmLib[javaCmdRead - 1] = '\0';
++ jvmLibPtr = jvmLib;
++ }
++ }
++
++ jint (*pfnJNI_GetCreatedJavaVMs)(JavaVM **, jsize, jsize *);
++ pfnJNI_GetCreatedJavaVMs = (jint (*)(JavaVM **, jsize, jsize *))
++ CPLGetSymbol(jvmLibPtr, "JNI_GetCreatedJavaVMs");
++
++ if (pfnJNI_GetCreatedJavaVMs == NULL)
++ return FALSE;
++ else
++ ret = pfnJNI_GetCreatedJavaVMs(vmBuf, 1, &nVMs);
++#else
++ ret = JNI_GetCreatedJavaVMs(vmBuf, 1, &nVMs);
++#endif
+
+ /* Are we already called from Java ? */
+- if (JNI_GetCreatedJavaVMs(vmBuf, 1, &nVMs) == JNI_OK && nVMs == 1)
++ if (ret == JNI_OK && nVMs == 1)
+ {
+ jvm = vmBuf[0];
+ if (jvm->GetEnv((void **)&env, JNI_VERSION_1_2) == JNI_OK)
+@@ -194,8 +231,22 @@ int OGRMDBJavaEnv::Init()
+ args.nOptions = 0;
+ args.ignoreUnrecognized = JNI_FALSE;
+
+- int ret = JNI_CreateJavaVM(&jvm, (void **)&env, &args);
+- if (ret != 0 || jvm == NULL || env == NULL)
++#if JVM_LIB_DLOPEN
++ jint (*pfnJNI_CreateJavaVM)(JavaVM **, void **, void *);
++ pfnJNI_CreateJavaVM = (jint (*)(JavaVM **, void **, void *))
++ CPLGetSymbol(jvmLibPtr, "JNI_CreateJavaVM");
++
++ if (pfnJNI_CreateJavaVM == NULL)
++ return FALSE;
++ else
++ ret = pfnJNI_CreateJavaVM(&jvm, (void **)&env, &args);
++#else
++ ret = JNI_CreateJavaVM(&jvm, (void **)&env, &args);
++#endif
++
++ CPLFree(pszClassPathOption);
++
++ if (ret != JNI_OK || jvm == NULL || env == NULL)
+ {
+ CPLError(CE_Failure, CPLE_AppDefined, "JNI_CreateJavaVM failed (%d)", ret);
+ return FALSE;
+diff --git a/port/cpl_config.h.in b/port/cpl_config.h.in
+index 313729fd3e..e8fa21140a 100644
+--- a/port/cpl_config.h.in
++++ b/port/cpl_config.h.in
+@@ -161,6 +161,9 @@
+ /* For .cpp files, define as const if the declaration of iconv() needs const. */
+ #undef ICONV_CPP_CONST
+
++/* Define to 1 if libjvm.so should be dlopen'd */
++#undef JVM_LIB_DLOPEN
++
+ /* Define to the sub-directory in which libtool stores uninstalled libraries.
+ */
+ #undef LT_OBJDIR
+--
+2.11.0
+
+
+From cd6bbb60ced62b6176482e86c54ab618e2592ac8 Mon Sep 17 00:00:00 2001
+From: James Le Cuirot <chewi@gentoo.org>
+Date: Thu, 25 Aug 2016 21:26:20 +0100
+Subject: [PATCH 2/2] Fetch jackcess classpath using java-config instead of
+ using CLASSPATH
+
+---
+ gdal/ogr/ogrsf_frmts/mdb/ogrmdbjackcess.cpp | 26 ++++++++++++++++++++++----
+ 1 file changed, 22 insertions(+), 4 deletions(-)
+
+diff --git a/ogr/ogrsf_frmts/mdb/ogrmdbjackcess.cpp b/ogr/ogrsf_frmts/mdb/ogrmdbjackcess.cpp
+index bc54a115df..5b0972677e 100644
+--- a/ogr/ogrsf_frmts/mdb/ogrmdbjackcess.cpp
++++ b/ogr/ogrsf_frmts/mdb/ogrmdbjackcess.cpp
+@@ -218,19 +218,37 @@ int OGRMDBJavaEnv::Init()
+ JavaVMInitArgs args;
+ JavaVMOption options[1];
+ args.version = JNI_VERSION_1_2;
+- const char* pszClassPath = CPLGetConfigOption("CLASSPATH", NULL);
+- CPLString osClassPathOption;
++
++ FILE *javaCmd = popen("java-config --with-dependencies --classpath=jackcess-1", "r");
++
++ const char* pszClassPath = NULL;
++ if (javaCmd != NULL)
++ {
++ pszClassPath = CPLReadLine(javaCmd);
++ ret = pclose(javaCmd);
++
++ if (ret != 0)
++ pszClassPath = NULL;
++ }
++
++ if (pszClassPath == NULL)
++ pszClassPath = CPLGetConfigOption("CLASSPATH", NULL);
++
++ char* pszClassPathOption = NULL;
+ if (pszClassPath)
+ {
+ args.nOptions = 1;
+- osClassPathOption.Printf("-Djava.class.path=%s", pszClassPath);
+- options[0].optionString = (char*) osClassPathOption.c_str();
++ pszClassPathOption = CPLStrdup(CPLSPrintf("-Djava.class.path=%s", pszClassPath));
++ options[0].optionString = pszClassPathOption;
+ args.options = options;
+ }
+ else
+ args.nOptions = 0;
+ args.ignoreUnrecognized = JNI_FALSE;
+
++ if (javaCmd != NULL)
++ CPLReadLine(NULL);
++
+ #if JVM_LIB_DLOPEN
+ jint (*pfnJNI_CreateJavaVM)(JavaVM **, void **, void *);
+ pfnJNI_CreateJavaVM = (jint (*)(JavaVM **, void **, void *))
+--
+2.11.0
+