Patch to make JPL work with Kaffe

[email protected] ("Bradley M. Kuhn") Wed, 6 Dec 2000 03:53:05 -0500
Newsgroups perl.jpl
Message-ID <[email protected]>
Brian Jepson <[email protected]> wrote:

> I put the note in there, but I don't have a strong recollection of what I
> did or where it was all going.  I think most of it had to do with the
> instantiation of the JVM. Look around for #ifdef KAFFE and also at
> JNI/JNIConfig.kaffe.


I got JPL working with Kaffe, at least the JNI-ONLY (calling Java from
Perl).  This is what I need to move forward with perljvm, so I am going to
do that instead.  (See archives of the perljvm list,
http://lists.ebb.org/listinfo/perljvm/, to see what my plans are.)

It should be pretty easy now to add support for calling Java from Perl.
Kaffe's current (i.e., in CVS) JNI implementation seems to be complete.

Note that I think we'll have to move away from this dependence on
$ENV{JAVA_HOME} eventually.  I couldn't make that work with Kaffe, because a
Kaffe installation just doesn't work that way.  I created the idea of
JNI::Config, which can be extended to do what $ENV{JAVA_HOME} was doing and
more.

Attached is my patch, and I hope that Brian will accept it into the JPL
source tree.  Please let me know if there is anything not acceptable.


I, Bradley M. Kuhn, hereby place the attached patched, called
"jpl-kaffe.patch" into the public domain, and disclaim all copyright on it.
I am willing to sign a document that says so, upon request.

-- 
Bradley M. Kuhn  -  http://www.ebb.org/bkuhn
jpl-kaffe.patch (text/plain, 18.7 KB)
# Added support Kaffe in CVS
# 
# To apply this patch:
# STEP 1: Chdir to the source directory.
# STEP 2: Run the 'applypatch' program with this patch file as input.
#
# If you do not have 'applypatch', it is part of the 'makepatch' package
# that you can fetch from the Comprehensive Perl Archive Network:
# http://www.perl.com/CPAN/authors/Johan_Vromans/makepatch-x.y.tar.gz
# In the above URL, 'x' should be 2 or higher.
#
# To apply this patch without the use of 'applypatch':
# STEP 1: Chdir to the source directory.
# If you have a decent Bourne-type shell:
# STEP 2: Run the shell with this file as input.
# If you don't have such a shell, you may need to manually create
# the files as shown below.
# STEP 3: Run the 'patch' program with this file as input.
#
# These are the commands needed to create/delete files/directories:
#
touch 'ChangeLog'
chmod 0600 'ChangeLog'
#
# This command terminates the shell and need not be executed manually.
exit
#
#### End of Preamble ####

#### Patch data follows ####
diff -u /dev/null 'jpl/ChangeLog'
Index: ./ChangeLog
*** ./ChangeLog	Wed Dec 31 19:00:00 1969
--- ./ChangeLog	Wed Dec  6 03:40:53 2000
***************
*** 0 ****
--- 1,16 ----
+ 2000-12-06  Bradley M. Kuhn  <[email protected]>
+ 
+ 	* JNI/JNI.pm: removed some stray C-m's floating in the file
+ 
+ 	* README.JUST-JNI: Added instructions concerning Kaffe.
+ 
+ 	* JNI/JNI.xs (GetJavaVM): Added support for Kaffe's options, and
+ 	made sure version number gets set.  Also did error checking on
+ 	creating the JVM.
+ 	Fixed bug on option processing.
+ 
+ 	* JNI/Makefile.PL: Added support to configure Kaffe, including
+ 	automatic creation of JNI/Config.pm (a new file).
+ 
+ 	* JNI/JNI.pm (AUTOLOAD): Added support for Kaffe.
+ 
diff -u 'Pristine/jpl/JNI/JNI.pm' 'jpl/JNI/JNI.pm'
Index: ./JNI/JNI.pm
--- ./JNI/JNI.pm	Sun Oct 22 12:55:41 2000
+++ ./JNI/JNI.pm	Wed Dec  6 03:35:32 2000
@@ -213,35 +213,69 @@
 bootstrap JNI $VERSION;
 
 if (not $JPL::_env_) {
+    # Note that only Kaffe support only cares about what JNI::Config says
+    use JNI::Config qw($KAFFE $LD_LIBRARY_PATH $CLASS_HOME $LIB_HOME $JAVA_LIB);
+
+    # Win32 and Sun JDK pay attention to $ENV{JAVA_HOME}; Kaffe doesn't
     $ENV{JAVA_HOME} ||= "/usr/local/java";
 
     my ($arch, @CLASSPATH);
-    if ($^O eq 'MSWin32') {
+    if ($^O eq 'MSWin32' and (! $JNI::Config::KAFFE) ) {
 
         $arch = 'MSWin32' unless -d "$ENV{JAVA_HOME}/lib/$arch";
         @CLASSPATH = split(/;/, $ENV{CLASSPATH});
         @CLASSPATH = "." unless @CLASSPATH;
         push @CLASSPATH,
 	    "$ENV{JAVA_HOME}\\classes",
-	    "$ENV{JAVA_HOME}\\lib\\classes.zip",
-	    # MSR - added for JDK 1.3
-	    "$ENV{JAVA_HOME}\\jre\\lib\\rt.jar",
-	    # MSR - added to find Closer.class
-	    '.';
+	    "$ENV{JAVA_HOME}\\lib\\classes.zip",
+	    # MSR - added for JDK 1.3
+	    "$ENV{JAVA_HOME}\\jre\\lib\\rt.jar",
+	    # MSR - added to find Closer.class
+	    '.';
 
         $ENV{CLASSPATH} = join(';', @CLASSPATH);
         $ENV{THREADS_TYPE} ||= "green_threads";
 
-        #$JAVALIB = "$ENV{JAVA_HOME}/lib/$arch/$ENV{THREADS_TYPE}";
-        # MSR  - changed above for JDK 1.3
-        $JAVALIB = "$ENV{JAVA_HOME}/lib/";
-        
+        #$JAVALIB = "$ENV{JAVA_HOME}/lib/$arch/$ENV{THREADS_TYPE}";
+        # MSR  - changed above for JDK 1.3
+        $JAVALIB = "$ENV{JAVA_HOME}/lib/";
+
         $ENV{LD_LIBRARY_PATH} .= ":$JAVALIB";
 
         push @JVM_ARGS, "classpath", $ENV{CLASSPATH};
-        print "JVM_ARGS=@JVM_ARGS!\n" if $JPL::DEBUG;
+        print "JVM_ARGS=@JVM_ARGS!\n" if $JPL::DEBUG;
         $JVM = GetJavaVM("$JAVALIB/javai.dll",@JVM_ARGS);
+    } elsif ($^O eq 'MSWin32' and $JNI::Config::KAFFE) {
+        croak "Kaffe is not yet supported on MSWin32 platform!";
+    } elsif ($JNI::Config::KAFFE) {
+        # The following code has to build a classpath for us.  It would be
+        # better if we could have *both* a classpath and a classhome, and
+        # not have to "guess" at the classpath like this.  We should be able
+        # to send in, say, a classpath of ".", and classhome of
+        # ".../share/kaffe", and have it build the right classpath.  That
+        # doesn't work.  The function initClasspath() in findInJar.c in the
+        # Kaffe source says: "Oh, you have a classpath, well forget
+        # classhome!"  This seems brain-dead to me.  But, anyway, that's why
+        # I don't use the classhome option on GetJavaVM.  I have to build
+        # the classpath by hand.  *sigh*
+        #                                            --  bkuhn
+
+        my $classpath = $ENV{CLASSPATH} || ".";
+        foreach my $jarFile qw(Klasses.jar comm.jar pjava.jar tools.jar
+                               microsoft.jar rmi.jar) {
+          $classpath .= ":$JNI::Config::CLASS_HOME/$jarFile";
+        }
+        $ENV{CLASSPATH} = $classpath;  # Not needed for GetJavaVM(), since
+                                       # we pass it in as a JVM option, but
+                                       # something else might expect it.
+
+        unshift(@JVM_ARGS, "classpath", $classpath,
+                "libraryhome", $JNI::Config::LIB_HOME);
+
+                #   The following line is useless; see comment above.
+                #  "classhome", $JNI::Config::CLASS_HOME);
 
+        $JVM = GetJavaVM($JNI::Config::JAVA_LIB, @JVM_ARGS);
     } else {
         chop($arch = `uname -p`);
         chop($arch = `uname -m`) unless -d "$ENV{JAVA_HOME}/lib/$arch";
@@ -258,7 +292,7 @@
         $JAVALIB = "$ENV{JAVA_HOME}/lib/$arch/$ENV{THREADS_TYPE}";
         $ENV{LD_LIBRARY_PATH} .= ":$JAVALIB";
         push @JVM_ARGS, "classpath", $ENV{CLASSPATH};
-        print "JVM_ARGS=@JVM_ARGS!\n" if $JPL::DEBUG;
+        print "JVM_ARGS=@JVM_ARGS!\n" if $JPL::DEBUG;
         $JVM = GetJavaVM("$JAVALIB/libjava.so",@JVM_ARGS);
     }
 }
diff -u 'Pristine/jpl/JNI/JNI.xs' 'jpl/JNI/JNI.xs'
Index: ./JNI/JNI.xs
--- ./JNI/JNI.xs	Sun Oct 22 12:55:41 2000
+++ ./JNI/JNI.xs	Wed Dec  6 02:15:26 2000
@@ -3136,7 +3136,7 @@
 		}
 
 		if (items--) {
-		    ++mark;
+  		    ++mark;
 		    lib = SvPV(*mark, PL_na);
 		}
 		else
@@ -3166,16 +3166,20 @@
 			croak("Can't load Java shared library.");
 		}
 #endif
-
+               /* Kaffe seems to get very upset if vm_args.version isn't set */
+#ifdef KAFFE
+		vm_args.version = JNI_VERSION_1_1;
+#endif
 		JNI_GetDefaultJavaVMInitArgs(&vm_args);
 		vm_args.exit = &call_my_exit;
 		if (jpldebug) {
             fprintf(stderr, "items = %d\n", items);
             fprintf(stderr, "mark = %s\n", SvPV(*mark, PL_na));
         }
-		++mark;
 		while (items > 1) {
-		    char *s = SvPV(*mark,PL_na);
+		  char *s;
+		    ++mark;
+		    s = SvPV(*mark,PL_na);
 		    ++mark;
 		    if (jpldebug) {
                 fprintf(stderr, "*s = %s\n", s);
@@ -3202,7 +3206,20 @@
 			vm_args.enableVerboseGC = (jint)SvIV(*mark);
 		    else if (strEQ(s, "disableAsyncGC"))
 			vm_args.disableAsyncGC = (jint)SvIV(*mark);
-#ifndef KAFFE
+#ifdef KAFFE
+		    else if (strEQ(s, "libraryhome"))
+			vm_args.libraryhome = savepv(SvPV(*mark,PL_na));
+		    else if (strEQ(s, "classhome"))
+			vm_args.classhome = savepv(SvPV(*mark,PL_na));
+		    else if (strEQ(s, "enableVerboseJIT"))
+			vm_args.enableVerboseJIT = (jint)SvIV(*mark); 
+		    else if (strEQ(s, "enableVerboseClassloading"))
+			vm_args.enableVerboseClassloading = (jint)SvIV(*mark); 
+		    else if (strEQ(s, "enableVerboseCall"))
+			vm_args.enableVerboseCall = (jint)SvIV(*mark); 
+		    else if (strEQ(s, "allocHeapSize"))
+			vm_args.allocHeapSize = (jint)SvIV(*mark); 
+#else
 		    else if (strEQ(s, "verbose"))
 			vm_args.verbose = (jint)SvIV(*mark); 
 		    else if (strEQ(s, "debugging"))
@@ -3219,10 +3236,13 @@
 		    fprintf(stderr, "Working CLASSPATH: %s\n", 
 			vm_args.classpath);
 		}
-		JNI_CreateJavaVM(&RETVAL, &jplcurenv, &vm_args);
+		if (JNI_CreateJavaVM(&RETVAL, &jplcurenv, &vm_args) < 0) {
+                  croak("Unable to create instance of JVM");
+                }
 		if (jpldebug) {
 		    fprintf(stderr, "Created Java VM.\n");
 		}
+
 	    }
 	}
 
diff -u 'Pristine/jpl/JNI/Makefile.PL' 'jpl/JNI/Makefile.PL'
Index: ./JNI/Makefile.PL
--- ./JNI/Makefile.PL	Sun Oct 22 12:55:41 2000
+++ ./JNI/Makefile.PL	Wed Dec  6 03:30:56 2000
@@ -7,6 +7,15 @@
 
 getopts('e'); # embedding?
 
+
+# $USE_KAFFE is a boolean that tells us whether or not we should use Kaffe.
+# Set by find_includes (it seemed as good a place as any).
+
+# Note that we don't check to see the version of Kaffe is one we support.
+#  Currently, the only one we support is the one from CVS.
+
+my $USE_KAFFE = 0;
+
 #require "JNIConfig";
 
 if ($^O eq 'solaris') {
@@ -27,9 +36,13 @@
 # Figure out where Java might live
 #
 # MSR - added JDK 1.3
+#
+
 my @JAVA_HOME_GUESSES = qw(/usr/local/java /usr/java /usr/local/jdk117_v3
-                           /usr/local/lib/kaffe C:\\JDK1.1.8 
-                           C:\\JDK1.2.1 C:\\JDK1.2.2 C:\\JDK1.3 );
+                         C:\\JDK1.1.8 C:\\JDK1.2.1 C:\\JDK1.2.2 C:\\JDK1.3 );
+
+my @KAFFE_PREFIX_GUESSES = qw(/usr/local /usr);
+
 if (! defined $ENV{JAVA_HOME}) {
         print "You didn't define JAVA_HOME, so I'm trying a few guesses.\n";
         print "If this fails, you might want to try setting JAVA_HOME and\n";
@@ -38,6 +51,25 @@
         @JAVA_HOME_GUESSES = ( $ENV{JAVA_HOME} );
 }
 
+if (! defined $ENV{KAFFE_PREFIX}) {
+        print "\nYou didn't define KAFFE_PREFIX, so I'm trying a few guesses.",
+          "\nIf this fails, and you are using Kaffe, you might want to try\n",
+          "setting KAFFE_PREFIX and running me again.\n",
+          "If you want to ignore any possible Kaffe installation, set the\n",
+          "KAFFE_PREFIX to and empty string.\n\n";
+} else {
+        @KAFFE_PREFIX_GUESSES = ($ENV{KAFFE_PREFIX} eq "") ? () :
+                                                       ( $ENV{KAFFE_PREFIX} );
+}
+
+my(@KAFFE_INCLUDE_GUESSES, @KAFFE_LIB_GUESSES);
+foreach my $kaffePrefix (@KAFFE_PREFIX_GUESSES) {
+     push(@KAFFE_INCLUDE_GUESSES, "$kaffePrefix/include/kaffe");
+     push(@KAFFE_LIB_GUESSES, "$kaffePrefix/lib");
+     push(@KAFFE_LIB_GUESSES, "$kaffePrefix/lib/kaffe");
+}
+    $guess .= "/include/kaffe";
+
 # Let's find out where jni.h lives
 #
 my @INCLUDE = find_includes();
@@ -66,11 +98,11 @@
 	  print $INC, "\n";
         $CCFLAGS .= "-DWIN32 -Z7 -D_DEBUG";
         $MYEXTLIB = "$libjava";
-    } elsif (/libkaffevm.so$/) {
-        $CCFLAGS .= "-DKAFFE";
-    }
+      }
 }
 
+$CCFLAGS .= "-DKAFFE" if ($USE_KAFFE);
+
 # Let's find out the path of the library we need to link against.
 #
 foreach (@JAVALIBS) {
@@ -110,6 +142,34 @@
 # MSR - clean up LIBS
 $LIBS =~ s/-l$//;
 
+#
+# Next, build JNI/Config.pm.  This is a superfluous thing for the SUN and
+# Microsoft JDKs, but absolutely necessary for Kaffe.  I think at some
+# point, the Microsoft and SUN implementations should use JNI::Config, too.
+#
+
+if (! -d "JNI") {
+    mkdir("JNI", 0755) || die "Unable to make JNI directory: $!";
+}
+open(JNICONFIG, ">JNI/Config.pm") || die "Unable to open JNI/Config.pm: $!";
+
+print JNICONFIG "# DO NOT EDIT!   Autogenerated by JNI/Makefile.PL\n\n",
+                "package JNI::Config;\nuse strict;\nuse Carp;\n",
+                "\nuse vars qw(\$KAFFE \$LIB_JAVA \$CLASS_HOME ",
+                "\$LIB_HOME);\n\n",
+                "\$KAFFE = $USE_KAFFE;\n\$LIB_JAVA = \"$JAVALIBS[0]\";\n";
+if ($USE_KAFFE) {
+  my $path = $JAVALIBS[0];
+  $path =~ s%/(kaffe/)?libkaffevm.so$%%;
+
+  print JNICONFIG "\$LIB_HOME = \"$path/kaffe\";\n";
+  $path =~ s%/lib%%;
+  print JNICONFIG "\$CLASS_HOME = \"$path/share/kaffe\";\n";
+}
+print JNICONFIG "\n\n1;\n";
+close JNICONFIG;
+
+
 my %Makefile = (
     NAME        => 'JNI',
     VERSION_FROM => 'JNI.pm',
@@ -118,6 +178,8 @@
     INC        => $INC,
     CCFLAGS => "$Config{ccflags} $CCFLAGS", 
     ($Config{archname} =~ /mswin32.*-object/i ? ('CAPI' => 'TRUE') : ()),
+
+    clean => {FILES => "JNI/* JNI"}
 );
 
 $Makefile{LIBS} = ["$LIBPATH $LIBS"];
@@ -130,12 +192,20 @@
 #
 WriteMakefile(%Makefile);
 
+if ($USE_KAFFE) {
+  my $path = $JAVALIBS[0];
+  $path =~ s%/libkaffevm.so$%%;
+  print "\n\n***NOTE: When you run this, be sure to have:\n",
+            "              LD_LIBRARY_PATH=$path\n",
+            "         in your enviornment (or installed as a system dynamic\n",
+            "         library location) when you compile and run this.\n";
+}
+
 # subroutine to find a library
 #
 sub find_stuff {
 
     my ($candidates, $locations) = @_;
-
     my $lib;
     $wanted = sub {
         foreach my $name (@$candidates) {
@@ -160,23 +230,33 @@
 
 # Extra lib for Java 1.2
 #
+#  if we want KAFFE, check for it, otherwise search for Java
+
 sub find_libs {
-  
-  my $libjava = find_stuff(['libjava.so', 'libkaffevm.so', 'javai.lib', 'jvm.lib'],
-			   \@JAVA_HOME_GUESSES);
-  my $libjvm  = find_stuff(['libjvm.so'],  \@JAVA_HOME_GUESSES);
-  my $libawt  = find_stuff(['libawt.so'], \@JAVA_HOME_GUESSES);
-  if ($libjvm) { # JDK 1.2
-    my $libhpi  = find_stuff(['libhpi.so'], \@JAVA_HOME_GUESSES);
-    return($libjava, $libjvm, $libhpi, $libawt);
+  my($libjava, $libawt, $libjvm);
+
+  if ($USE_KAFFE) {
+    $libjava = find_stuff(['libkaffevm.so'], \@KAFFE_LIB_GUESSES);
+    $libawt = find_stuff(['libawt.so'], \@KAFFE_LIB_GUESSES);
   } else {
-    return($libjava, $libawt);
+    $libjava = find_stuff(['libjava.so', 'javai.lib', 'jvm.lib'],
+                             \@JAVA_HOME_GUESSES);
+    $libjvm  = find_stuff(['libjvm.so'],  \@JAVA_HOME_GUESSES);
+    $libawt  = find_stuff(['libawt.so'], \@JAVA_HOME_GUESSES);
+    if (defined $libjvm) { # JDK 1.2
+      my $libhpi  = find_stuff(['libhpi.so'], \@JAVA_HOME_GUESSES);
+      return($libjava, $libjvm, $libhpi, $libawt);
+    }
   }
-  
+  return($libjava, $libawt);
 }
 
 # We need to find jni.h and jni_md.h
 #
+
+# Always do find_includes as the first operation, as it has the side effect
+# of deciding whether or not we are looking for Kaffe.  --bkuhn
+
 sub find_includes {
 
   my @CANDIDATES = qw(jni.h jni_md.h);
@@ -196,15 +276,21 @@
   }
     
   use File::Find;
-  foreach my $guess (@JAVA_HOME_GUESSES) {
+  foreach my $guess (@KAFFE_INCLUDE_GUESSES) {
     next unless -d $guess;
     find (\&find_inc, $guess);
   }
-  if (! @includes) {
-    die "Could not find Java includes!";
+  # If we have found includes, then we are using Kaffe.
+  if (@includes > 0) {
+    $USE_KAFFE = 1;
   } else {
-    print join("\n", @includes), "\n";
+    foreach my $guess (@JAVA_HOME_GUESSES) {
+      next unless -d $guess;
+      find (\&find_inc, $guess);
+    }
   }
+  die "Could not find Java includes!" unless (@includes);
+
   return @includes;
 }
 
diff -u 'Pristine/jpl/README' 'jpl/README'
Index: ./README
--- ./README	Mon May 29 12:58:38 2000
+++ ./README	Wed Dec  6 03:50:28 2000
@@ -9,18 +9,20 @@
 
 Requirements
 ------------
-Under Solaris and Linux (and other Unix-like systems), Perl 5.005 (or later)
-must be compiled and installed as a shared library (libperl.so).  I had to use
-the system's malloc.  JPL was originally built and tested with 5.004_04 and
-early Java 1.1 development kits.  This version has not been well tested under
-other versions, so you can expect some rough edges.
+Under Solaris and GNU/Linux (and other Unix-like systems), Perl 5.005 (or
+later) must be compiled and installed as a shared library (libperl.so).  I
+had to use the system's malloc.  JPL was originally built and tested with
+5.004_04 and early Java 1.1 development kits.  This version has not been
+well tested under other versions, so you can expect some rough edges.
 
-You need JDK 1.1.  On Solaris, 1.1.5 has been verified to work.  Linux
+You need JDK 1.1.  On Solaris, 1.1.5 has been verified to work.  GNU/Linux
 users can try the latest version (1.1.3 or later) available from (for
 example):
 
   ftp://ftp.blackdown.org/pub/Linux/JDK/1.1.3/updates/libjava-1.1.3v2-1.tar.gz
 
+(GNU/Linux users can also try Kaffe (see below).)
+
 The get_jdk directory contains a script that will download JDK (but not
 the patch file above) off of the net for you.  (This presumes you've
 already installed the modules mentioned in ../README.)
@@ -40,9 +42,20 @@
 
 Kaffe
 -----
-You might notice some mention of Kaffe (www.kaffe.org) in the source files. 
-This is because some preliminary work is being done in this area, but JPL
-doesn't yet work with Kaffe.
+You might notice some mention of Kaffe (www.kaffe.org) in the source files.
+This is because support has been added for Kaffe for JNI:: and JPL::.  In
+other words, you can now call to Java from Perl using Kaffe.
+
+You'll likely need the a checkout circa 2000-12-03 or later from Kaffe's
+CVS.  It has been verified that Kaffe 1.0.5 definitely *will not work*.
+Kaffe 1.0.6 might work, but the CVS tree definitely works (as of
+2000-12-06).
+
+You can get the CVS tree from:
+
+cvs -z3 -d ':pserver:[email protected]:/cvs/kaffe' checkout kaffe
+
+(password is 'readonly')
 
 What the heck is JPL?
 ---------------------
diff -u 'Pristine/jpl/README.JUST-JNI' 'jpl/README.JUST-JNI'
Index: ./README.JUST-JNI
--- ./README.JUST-JNI	Wed May 31 15:42:49 2000
+++ ./README.JUST-JNI	Tue Dec  5 23:40:10 2000
@@ -3,6 +3,7 @@
 
 This has been tested with:
 
+    Debian GNU/Linux 2.2 i386, perl 5.6.0, Kaffe-from-CVS-2000-12-05
     RedHat 6.1, perl-5.00503-6 (RedHat RPM), IBM JDK 1.1.8
     Debian 2.1 SPARC, Perl 5.005_60, JDK 1.2 beta (crashes with AWT, though)
     Windows NT 4.0 SP4, ActivePerl 519, JDK 1.1.8, Visual C++
@@ -48,11 +49,27 @@
 
        javac Closer.java
 
+     or perhaps
+
+       jikes Closer.java
+
 5) Make the demo:
 
     a) type the following:
 
-        perl Makefile.PL
+      for SUN's proprietary software Java:
+
+	env JAVA_HOME=/path/to/java perl Makefile.PL
+	# setting the JAVA_HOME enviornment variable might not be needed
+	# if Java is in installed in a canonical location
+        make
+        make test
+
+      for Kaffe:
+
+	env KAFFE_PREFIX=/kaffe/installation/prefix perl Makefile.PL
+	# setting the KAFFE_PREFIX enviornment variable might not be needed
+	# if Kaffe is in a canonical location
         make
         make test
 
#### End of Patch data ####

#### ApplyPatch data follows ####
# Data version        : 1.0
# Date generated      : Wed Dec  6 03:50:39 2000
# Generated by        : makepatch 2.00
# Recurse directories : Yes
# Excluded files      : (\A|.*/)CVS(/.*|\Z)
#                       (\A|.*/)RCS(/.*|\Z)
#                       ,v\Z
#                       (\A|.*/)SCCS(/.*|\Z)
#                       (\A|.*/)[sp]\..+\Z
#                       (\A|/)\#.*\#\Z
#                       (\A|/).*\~\Z
#                       (\A|/)\.gdb.*\Z
# c 'ChangeLog' 0 976092053 0100600
# p 'JNI/JNI.pm' 6210 976091732 0100660
# p 'JNI/JNI.xs' 68351 976086926 0100660
# p 'JNI/Makefile.PL' 5571 976091456 0100660
# p 'README' 6304 976092628 0100660
# p 'README.JUST-JNI' 1812 976077610 0100660
#### End of ApplyPatch data ####

#### End of Patch kit [created: Wed Dec  6 03:50:39 2000] ####
#### Checksum: 554 19344 17234 ####
signature.asc (application/pgp-signature, 232 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.4 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE6Lf5x53XjJNtBs4cRArKKAKCD8YFqqWHGf5cMyxwQKFWXCJYrkgCeOsLs
fWx1v+QWb2PQDt36OgnCs+E=
=m5CY
-----END PGP SIGNATURE-----