[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