[e-lang] E-on-Java works with recent gcj

Eric Northup digitale at digitaleric.net
Sun Jun 4 14:56:12 EDT 2006


On May 31, 2006, at 1:14 PM, Mark S. Miller wrote:
> Eric Northup wrote:
> > Perhaps people already knew this, but I was just pleasantly
> > surprised by
> > the degree to which E-on-Java runs on a recent version of GNU gcj.
> > 
> > It successfully built, installed, and even ran!
> 
> 
> This is great news!
> 
> How did you build it? Please send enough detail that I should be able
> to 
> reproduce. Thanks!


I had to make a few changes to E's java source to get things to build.

diff -ru src/jsrc/org/erights/e/ui/swt/SWTRunner.java
/home/eric/n/e/src/jsrc/org/erights/e/ui/swt/SWTRunner.java
--- src/jsrc/org/erights/e/ui/swt/SWTRunner.java        2006-05-31
19:36:03.000000000 -0400
+++ /home/eric/n/e/src/jsrc/org/erights/e/ui/swt/SWTRunner.java
2006-05-31 20:31:37.000000000 -0400
@@ -109,7 +109,9 @@

                 // XXX Happens too late to effect rune(["--version"])
                 System.setProperty("e.swtVersion",
""+SWT.getVersion());
-//                System.setProperty("e.swtRevision",
""+Library.getRevision());
+// XXX doesn't work on gcj
+//            System.setProperty("e.swtRevision",
""+Library.getRevision());
+//
                 System.setProperty("e.swtPlatform", SWT.getPlatform());
             }
             return THE_DEFAULT;
Running on a Fedora Core 5 Linux box, which ships with /usr/bin/java as
a symlink to gij, building E the normal way seems to work for everything
except SWT.

On a non-FC5 system, run "make JAVACMD=gij".

Trying to build a distributable rune binary was a bit trickier.  Almost
all of src/jsrc/net/vattp/security/Native.java had to be commented out
to make it work, otherwise the linker complained about undefined symbols
for the missing native methods.  I ended up using the following script,
which should probably be a makefile, but I'm not clear how to get make
to understand java dependencies.

<<<< begin build-e-gcj.sh >>>>

#!/bin/sh
                                                                                                                                                                                                     
SWT_JARPATH=/usr/share/java/swt-gtk-3.1.1.jar
SWT_LIBDIR=/usr/lib
SWT_LIB=swt-gtk-3139
MAIN_CLASS=org.erights.e.elang.interp.MetaRune
                                                                                                                                                                                                     
rm -rf BUILD
mkdir -p BUILD/class BUILD/obj BUILD/lib
javafiles=`find . -name '*.java'`
                                                                                                                                                                                                     
# Compile + check .java files into .class files
gcj -C -I. -I$SWT_JARPATH -d BUILD/class $javafiles
                                                                                                                                                                                                     
# We're going to compile BUILD/class/module/.../name.class ->
# BUILD/obj/module/.../name.o.  We just go straight to BUILD/obj/name.o
if we
# knew that no classes existed with conflicting names.  (This almost
seems
# true of the E build, but Antlr has a bunch of exceptions).
                                                                                                                                                                                                     
dir_list=""
for javafile in $javafiles; do
    dir_list="$dir_list
`dirname $javafile`"
done
                                                                                                                                                                                                     
dir_list=`echo -n "$dir_list" | sort -u`
                                                                                                                                                                                                     
for a_dir in $dir_list; do
    mkdir -p BUILD/obj/$a_dir
done
                                                                                                                                                                                                     
all_dotos=""
                                                                                                                                                                                                     
# Compile .class files into .o files
for javafile in $javafiles; do
    path=`dirname $javafile`
    name=`basename $javafile .java`
    this_doto=BUILD/obj/$path/$name.o
    all_dotos="$all_dotos $this_doto"
    echo $javafile '.class -> .o'
    echo gcj -IBUILD/obj -IBUILD/class -I$SWT_JARPATH \
        -c $javafile -o $this_doto
    gcj -IBUILD/obj -IBUILD/class -I$SWT_JARPATH \
        -c $javafile -o $this_doto || exit 1
done
                                                                                                                                                                                                     
ar -crs BUILD/lib/lib$MAIN_CLASS.a $all_dotos
                                                                                                                                                                                                     
echo gcj --main=$MAIN_CLASS -I. -I$SWT_JARPATH -o $MAIN_CLASS
BUILD/lib/*.a -L$SWT_LIBDIR -l$SWT_LIB
gcj --main=$MAIN_CLASS -I. -I$SWT_JARPATH -o $MAIN_CLASS BUILD/lib/*.a
-L$SWT_LIBDIR -l$SWT_LIB


<<<< end build-e-gcj.sh >>>>

This produces an executable binary org.erights.e.elang.interp.MetaRune.

Running the binary should be equivalent to running "java -jar e.jar".

There are some problems with the standalone binary (paths not getting
set correctly?  Java properties not getting set?):

[eric at olddell1 classes]$ ../dist/org.erights.e.elang.interp.MetaRune
# problem: Can't find /home/eric/e-old/classes/eVersion.txt
 
# problem: Can't find /home/eric/e-old/classes/eVersion.txt
#
#   - static E#require(boolean, Object)
#   . <makeE>.require(false, <...__main$1>)
#   @ require/2:
<file:/home/eric/e-old/classes/org/erights/e/elang/interp/require.emaker#:span::15:11::15:17>
#   - org.erights.e.elang.interp.require$require0__C#run/2:
<file:/home/eric/e-old/classes/org/erights/e/elang/interp/require.emaker#:span::14:7::14:9>
#   . <require0>(false, <...__main$1>)
#   @ run/2:
</home/eric/e-old/classes/scripts/setup.e-awt#:span::19:7::19:7>
#   - EExpr#evalToPair(Scope)
#   . e`require.run(eVersionFile.e...File.getPath()))\n   
}\n})`.evalToPair(<a Scope>)
#   @ evalToPair/1:
<file:/home/eric/e-old/classes/org/erights/e/elang/cmd/cmdMakerMaker.emaker#:span::119:57::119:66>
#   - static Ref#fulfillment(Object)
#   . <makeRef>.fulfillment(<ref broken by problem: Can't find
/home/eric/e-old/classes/eVersion.txt>)
#   @ fulfillment/1
 
 
Hit Enter to dismiss.

-Eric



More information about the e-lang mailing list