From bbfa90a51b53570b98ee3782254e86d5f1673c2e Mon Sep 17 00:00:00 2001
From: "Meredith L. Patterson" <mlp@thesmartpolitenerd.com>
Date: Fri, 6 Dec 2013 11:30:53 +0100
Subject: [PATCH] scons can find jni

---
 ConfigureJNI.py                               | 86 +++++++++++++++++++
 .../com_upstandinghackers_hammer_Hammer.c     |  0
 ...com_upstandinghackers_hammer_ParseResult.c |  0
 ...com_upstandinghackers_hammer_ParsedToken.c |  0
 .../com_upstandinghackers_hammer_Parser.c     |  0
 .../hammer => jsrc}/Action.java               |  0
 .../hammer => jsrc}/Hammer.java               |  0
 .../hammer => jsrc}/ParseResult.java          |  0
 .../hammer => jsrc}/ParsedToken.java          |  0
 .../hammer => jsrc}/Parser.java               |  0
 .../hammer => jsrc}/Predicate.java            |  0
 11 files changed, 86 insertions(+)
 create mode 100644 ConfigureJNI.py
 rename src/bindings/java/{ => csrc}/com_upstandinghackers_hammer_Hammer.c (100%)
 rename src/bindings/java/{ => csrc}/com_upstandinghackers_hammer_ParseResult.c (100%)
 rename src/bindings/java/{ => csrc}/com_upstandinghackers_hammer_ParsedToken.c (100%)
 rename src/bindings/java/{ => csrc}/com_upstandinghackers_hammer_Parser.c (100%)
 rename src/bindings/java/{com/upstandinghackers/hammer => jsrc}/Action.java (100%)
 rename src/bindings/java/{com/upstandinghackers/hammer => jsrc}/Hammer.java (100%)
 rename src/bindings/java/{com/upstandinghackers/hammer => jsrc}/ParseResult.java (100%)
 rename src/bindings/java/{com/upstandinghackers/hammer => jsrc}/ParsedToken.java (100%)
 rename src/bindings/java/{com/upstandinghackers/hammer => jsrc}/Parser.java (100%)
 rename src/bindings/java/{com/upstandinghackers/hammer => jsrc}/Predicate.java (100%)

diff --git a/ConfigureJNI.py b/ConfigureJNI.py
new file mode 100644
index 00000000..f345b63f
--- /dev/null
+++ b/ConfigureJNI.py
@@ -0,0 +1,86 @@
+# from http://www.scons.org/wiki/JavaNativeInterface
+import os
+import sys
+
+def walkDirs(path):
+    """helper function to get a list of all subdirectories"""
+    def addDirs(pathlist, dirname, names):
+        """internal function to pass to os.path.walk"""
+        for n in names:
+            f = os.path.join(dirname, n)
+            if os.path.isdir(f):
+                pathlist.append(f)
+    pathlist = [path]
+    os.path.walk(path, addDirs, pathlist)
+    return pathlist
+
+def ConfigureJNI(env):
+    """Configure the given environment for compiling Java Native Interface
+       c or c++ language files."""
+
+    if not env.get('JAVAC'):
+        print "The Java compiler must be installed and in the current path."
+        return 0
+
+    # first look for a shell variable called JAVA_HOME
+    java_base = os.environ.get('JAVA_HOME')
+    if not java_base:
+        if sys.platform == 'darwin':
+            # Apple's OS X has its own special java base directory
+            java_base = '/System/Library/Frameworks/JavaVM.framework'
+        else:
+            # Search for the java compiler
+            print "JAVA_HOME environment variable is not set. Searching for java... ",
+            jcdir = os.path.dirname(env.WhereIs('javac'))
+            if not jcdir:
+                print "not found."
+                return 0
+            # assuming the compiler found is in some directory like
+            # /usr/jdkX.X/bin/javac, java's home directory is /usr/jdkX.X
+            java_base = os.path.join(jcdir, "..")
+            print "found."
+
+    if sys.platform == 'cygwin':
+        # Cygwin and Sun Java have different ideas of how path names
+        # are defined. Use cygpath to convert the windows path to
+        # a cygwin path. i.e. C:\jdkX.X to /cygdrive/c/jdkX.X
+        java_base = os.popen("cygpath -up '"+java_base+"'").read().replace( \
+                 '\n', '')
+
+    if sys.platform == 'darwin':
+        # Apple does not use Sun's naming convention
+        java_headers = [os.path.join(java_base, 'Headers')]
+        java_libs = [os.path.join(java_base, 'Libraries')]
+    else:
+        # windows and linux
+        java_headers = [os.path.join(java_base, 'include')]
+        java_libs = [os.path.join(java_base, 'lib')]
+        # Sun's windows and linux JDKs keep system-specific header
+        # files in a sub-directory of include
+        if java_base == '/usr' or java_base == '/usr/local':
+            # too many possible subdirectories. Just use defaults
+            java_headers.append(os.path.join(java_headers[0], 'win32'))
+            java_headers.append(os.path.join(java_headers[0], 'linux'))
+            java_headers.append(os.path.join(java_headers[0], 'solaris'))
+        else:
+            # add all subdirs of 'include'. The system specific headers
+            # should be in there somewhere
+            java_headers = walkDirs(java_headers[0])
+
+    # add Java's include and lib directory to the environment
+    env.Append(CPPPATH = java_headers)
+    env.Append(LIBPATH = java_libs)
+
+    # add any special platform-specific compilation or linking flags
+    if sys.platform == 'darwin':
+        env.Append(SHLINKFLAGS = '-dynamiclib -framework JavaVM')
+        env['SHLIBSUFFIX'] = '.jnilib'
+    elif sys.platform == 'cygwin':
+        env.Append(CCFLAGS = '-mno-cygwin')
+        env.Append(SHLINKFLAGS = '-mno-cygwin -Wl,--kill-at')
+
+    # Add extra potentially useful environment variables
+    env['JAVA_HOME'] = java_base
+    env['JNI_CPPPATH'] = java_headers
+    env['JNI_LIBPATH'] = java_libs
+    return 1
diff --git a/src/bindings/java/com_upstandinghackers_hammer_Hammer.c b/src/bindings/java/csrc/com_upstandinghackers_hammer_Hammer.c
similarity index 100%
rename from src/bindings/java/com_upstandinghackers_hammer_Hammer.c
rename to src/bindings/java/csrc/com_upstandinghackers_hammer_Hammer.c
diff --git a/src/bindings/java/com_upstandinghackers_hammer_ParseResult.c b/src/bindings/java/csrc/com_upstandinghackers_hammer_ParseResult.c
similarity index 100%
rename from src/bindings/java/com_upstandinghackers_hammer_ParseResult.c
rename to src/bindings/java/csrc/com_upstandinghackers_hammer_ParseResult.c
diff --git a/src/bindings/java/com_upstandinghackers_hammer_ParsedToken.c b/src/bindings/java/csrc/com_upstandinghackers_hammer_ParsedToken.c
similarity index 100%
rename from src/bindings/java/com_upstandinghackers_hammer_ParsedToken.c
rename to src/bindings/java/csrc/com_upstandinghackers_hammer_ParsedToken.c
diff --git a/src/bindings/java/com_upstandinghackers_hammer_Parser.c b/src/bindings/java/csrc/com_upstandinghackers_hammer_Parser.c
similarity index 100%
rename from src/bindings/java/com_upstandinghackers_hammer_Parser.c
rename to src/bindings/java/csrc/com_upstandinghackers_hammer_Parser.c
diff --git a/src/bindings/java/com/upstandinghackers/hammer/Action.java b/src/bindings/java/jsrc/Action.java
similarity index 100%
rename from src/bindings/java/com/upstandinghackers/hammer/Action.java
rename to src/bindings/java/jsrc/Action.java
diff --git a/src/bindings/java/com/upstandinghackers/hammer/Hammer.java b/src/bindings/java/jsrc/Hammer.java
similarity index 100%
rename from src/bindings/java/com/upstandinghackers/hammer/Hammer.java
rename to src/bindings/java/jsrc/Hammer.java
diff --git a/src/bindings/java/com/upstandinghackers/hammer/ParseResult.java b/src/bindings/java/jsrc/ParseResult.java
similarity index 100%
rename from src/bindings/java/com/upstandinghackers/hammer/ParseResult.java
rename to src/bindings/java/jsrc/ParseResult.java
diff --git a/src/bindings/java/com/upstandinghackers/hammer/ParsedToken.java b/src/bindings/java/jsrc/ParsedToken.java
similarity index 100%
rename from src/bindings/java/com/upstandinghackers/hammer/ParsedToken.java
rename to src/bindings/java/jsrc/ParsedToken.java
diff --git a/src/bindings/java/com/upstandinghackers/hammer/Parser.java b/src/bindings/java/jsrc/Parser.java
similarity index 100%
rename from src/bindings/java/com/upstandinghackers/hammer/Parser.java
rename to src/bindings/java/jsrc/Parser.java
diff --git a/src/bindings/java/com/upstandinghackers/hammer/Predicate.java b/src/bindings/java/jsrc/Predicate.java
similarity index 100%
rename from src/bindings/java/com/upstandinghackers/hammer/Predicate.java
rename to src/bindings/java/jsrc/Predicate.java
-- 
GitLab