- @echo "extracting .class -> .h: $<"
- @mkdir -p `dirname $@`
- @ls `echo $< | sed s/.class\$$//`*.class |\
- sed s_build/class/__ | sed s/.class\$$//g | sed s_/_._g | (cd build/class; xargs ../../$(gcc_path)/bin/gcjh -d ../h --classpath .)
-
-# PHASE 4: object files
-build/$(platform)/%.java.o: build/java/%.java
- @echo "compiling .java -> .o: $<"
- @mkdir -p `dirname $@`
- @$(gcj) -c $< -o $@
-
-build/$(platform)/org/xwt/plat/$(platform).cc.o: src/org/xwt/plat/*.cc $(java_headers)
- @echo "compiling .cc -> .o: $<"
- @mkdir -p `dirname $@`
- @$(g++) -I/usr/X11R6/include/ -I$(gcc_path)/include -Ibuild/h -Iupstream/$(platform)/include -Wno-multichar -c $< -o $@
-
-build/$(platform)/jpeg-6b/%.c.o: upstream/jpeg-6b/src/%.c
- @echo "compiling .c -> .o: $<"
- @mkdir -p `dirname $@`
- @$(gcc) -Ibuild/h -c $< -o $@
-
-# PHASE 5: linking
-$(target_bin).ar: $(java_object_files) build/$(platform)/org/xwt/plat/$(platform).cc.o $(jpeg_object_files)
- @echo "archiving .o -> $(target_bin).ar"
- @rm -f $(target_bin).ar
- @$(ar) -c $(target_bin).ar $^
-
-$(target_bin): $(target_bin).ar
- @echo "linking .o -> $(target_bin)"
- @mkdir -p build/$(platform)
- @$(gcj) --main=org.xwt.Main -o build/$(platform)/$(target_bin) $(target_bin).ar -L$(gcc_path)/lib $(platform_link)
-
-
-##############################################################################
-# Special treatment:
-#
-
-build/java/org/xwt/Builtin.java:: $(shell ls src/org/xwt/builtin/*.png src/org/xwt/builtin/*.xwt src/org/xwt/builtin/*.xwf)
- @mkdir -p `dirname $@` build build/java build/class build/h build
- @echo "zipping/uuencoding .xwt -> .java: build/java/org/xwt/Builtin.java"
- @echo "package org.xwt;" > build/java/org/xwt/Builtin.java
- @echo "class Builtin {" >> build/java/org/xwt/Builtin.java
- @echo "public static String encoded = " >> build/java/org/xwt/Builtin.java
- @cd src; $(jar) cf - $(<:src/%=%) | \
- uuencode foo | tail -n +2 | grep -v '^end$$' | grep -v '^`$$' | \
- sed 's_\(.+\)_"\1" +_' >> ../build/java/org/xwt/Builtin.java
- @echo "\"\"; }" >> build/java/org/xwt/Builtin.java
-
-build/java/org/xwt/imp/Freetype.java:: build/mips/freetype.mips build/class/org/xwt/imp/MIPS.class
- @echo "translating .mips -> .java: $@"
- @mkdir -p build/java/org/xwt/imp/
- @rm -f $@
- @java -cp build/class org.xwt.imp.MIPS org.xwt.imp.Freetype build/mips/freetype.mips > build/java/org/xwt/imp/Freetype.java
-
-build/mips/%.o: src/org/xwt/imp/%.c $(gcc_path)/bin/mips-gcc upstream/.freetype
- @mkdir -p build/mips
- @echo "compiling $< -> $@ (mips)"
- @$(gcc_path)/bin/mips-gcc \
- -march=mips1 \
- -I upstream/freetype-2.1.4/include \
+ @echo -e "\n\033[1mextracting .class -> .h: $<\033[0m"
+ mkdir -p `dirname $@`
+ ls `echo $< | sed s/.class\$$//`*.class |\
+ sed s_build/class/__ | sed s/.class\$$//g | sed s_/_._g | (cd build/class; xargs $(gcjh) -d ../h --classpath .)
+
+
+### Native Code ##############################################################################
+
+# a hack since we've disabled gcj's awt implementation
+build/$(platform)/org/ibex/plat/Linux.cc.o: .install_WindowMaker-0.80.2_$(target)
+build/$(platform)/org/ibex/plat/Solaris.cc.o: .install_WindowMaker-0.80.2_$(target)
+
+libjava_dir := $(shell pwd)/upstream/gcc-3.3/build-$(target)/$(target)/libjava
+nat_libjava_files_ := boehm.o exception.o posix-threads.o posix.o prims.o resolve.o java/net/natInetAddress.o
+nat_libjava_files_ += java/net/natPlainSocketImpl.o java/util/zip/nat*.o gnu/gcj/runtime/natFirstThread.o
+nat_libjava_files_ += gnu/gcj/runtime/natNameFinder.o gnu/gcj/runtime/natStackTrace.o gnu/gcj/runtime/natSharedLibLoader.o
+nat_libjava_files_ += gnu/gcj/runtime/natStringBuffer.o gnu/gcj/runtime/natVMClassLoader.o gnu/gcj/runtime/natFinalizerThread.o
+nat_libjava_files_ += $(shell cd $(libjava_dir) 2>/dev/null; find java/lang -name \*.o -not -name '*[A-Z]*' 2>/dev/null)
+nat_libjava_files_ += $(shell cd $(libjava_dir) 2>/dev/null; find java/lang -name nat\*.o 2>/dev/null)
+nat_libjava_files := $(nat_libjava_files_:%=$(libjava_dir)/%)
+nat_libjava_files += $(libjava_dir)/java/io/natFile.o $(libjava_dir)/java/io/natFileDescriptor.o
+
+build/$(platform)/org/ibex/plat/$(platform).cc.o: src/org/ibex/plat/$(platform).cc src/org/ibex/plat/*.cc .configure_jpeg-6b_$(target)
+ @make $(java_headers)
+ @echo -e "\n\033[1mcompiling .cc -> .o: $<\033[0m"
+ mkdir -p `dirname $@`
+ $(g++) -Iupstream/gcc-3.3/build-$(target)/$(target)/libjava -c $< -o $@
+
+
+bcel_jar := upstream/bcel-5.1/src/bcel-5.1.jar
+build/$(platform)/ibex.pruned.jar: .compile $(java_classes) .install_jpeg-6b_$(target) build/$(platform)/builtin.o build/$(platform)/org/ibex/plat/$(platform).cc.o
+ @echo -e "\n\033[1mpruning .jar -> .jar\033[0m"
+ cp upstream/install/share/java/libgcj-3.3.jar build/$(platform)/ibex.jar
+ cd build/class; jar uf ../$(platform)/ibex.jar $(java_classes:build/class/%.class=%*.class)
+ (nm $(nat_libjava_files) build/$(platform)/org/ibex/plat/$(platform).cc.o; echo org.ibex.plat.$(platform).main) |\
+ grep _ZN | c++filt --format java | grep " U " | sed 's_ * U __' | sed 's_(.*__' \
+ | java -cp $(bcel_jar):build/class org.ibex.util.NanoGoat build/$(platform)/ibex.jar | tee nanogoat.log
+ mkdir tmp; cd tmp; fastjar xvf ../build/$(platform)/ibex.jar.pruned; rm gnu/gcj/runtime/FirstThread*; cp ../build/class/org/ibex/plat/GCJ* org/ibex/plat/; cp -r ../build/class/org/xwt/mips/* org/xwt/mips/; mkdir -p $(shell pwd)/build/$(platform)/java/lang; mv java/lang/Class.class $(shell pwd)/build/$(platform)/java/lang; fastjar cvf ../build/$(platform)/ibex.jar.pruned .; cd ..; rm -rf tmp
+ mv build/$(platform)/ibex.jar.pruned $@
+
+ifeq ($(platform),Win32)
+filedes := $(shell pwd)/upstream/gcc-3.3/src/libjava/java/io/natFileWin32.cc
+filedes += $(shell pwd)/upstream/gcc-3.3/src/libjava/java/io/natFileDescriptorWin32.cc
+else
+filedes := $(shell pwd)/upstream/gcc-3.3/src/libjava/java/io/natFilePosix.cc
+filedes += $(shell pwd)/upstream/gcc-3.3/src/libjava/java/io/natFileDescriptorPosix.cc
+endif
+
+ifneq ($(target_bin_extension),jar)
+build/$(platform)/$(target_bin): build/$(platform)/ibex.pruned.jar src/org/ibex/plat/*.cc build/$(platform)/builtin.o $(java_headers)
+
+ @echo -e "\n\033[1mlinking .jar -> $(target_bin).phat\033[0m"
+# -Os
+ cd build/$(platform); $(shell pwd)/upstream/install/bin/$(target)-gcj \
+ -fCLASSPATH=$(shell pwd)/upstream/install/share/java/libgcj-3.3.jar \
+ -finhibit-reflection \
+ -fno-store-check \
+ -c java/lang/Class.class
+ cd upstream/gcc-3.3/src/libjava/java/lang;\
+ ln -sf ../../../../build-$(target)/$(target)/libjava/java/lang/natConcreteProcess.cc
+# we need -fno-store-check since we can't dynamically resolve references to array classes
+ PATH=upstream/install/bin:$$PATH upstream/install/bin/$(target)-gcj \
+ -Wl,-O2,--relax,--gc-sections,--noinhibit-exec,--no-whole-archive \
+ --main=org.ibex.plat.$(platform) \
+ -Dfile.encoding=UTF8 \
+ -DPREFIX=\"\" \
+ -Lupstream/install/$(target)/lib -Lupstream/install/lib \
+ -finhibit-reflection \
+ -fno-store-check \
+ -w -g \
+ -Iupstream/jpeg-6b/build-$(target)/ \
+ -Iupstream/jpeg-6b/src \
+ -Ibuild/h \
+ -Iupstream/gcc-3.3/src/gcc \
+ -Iupstream/gcc-3.3/build-i686-pc-linux-gnu/i686-pc-linux-gnu/boehm-gc/ \
+ -Iupstream/gcc-3.3/build-i686-pc-linux-gnu/i686-pc-linux-gnu/boehm-gc/include \
+ -Iupstream/gcc-3.3/src/boehm-gc \
+ -Iupstream/gcc-3.3/src/boehm-gc/include \
+ -Iupstream/gcc-3.3/build-i686-pc-linux-gnu/i686-pc-linux-gnu/libjava/ \
+ -Iupstream/gcc-3.3/build-i686-pc-linux-gnu/i686-pc-linux-gnu/libjava/include \
+ -Iupstream/gcc-3.3/src/libjava \
+ -Iupstream/gcc-3.3/src/libjava/include \
+ -Ufile \
+ build/$(platform)/ibex.pruned.jar \
+ src/org/ibex/plat/$(platform).cc \
+ $(nat_libjava_files_:%.o=$(shell pwd)/upstream/gcc-3.3/src/libjava/%.c*) \
+ $(filedes) \
+ build/$(platform)/builtin.o \
+ upstream/jpeg-6b/build-$(target)/libjpeg.a \
+ $(link_flags) \
+ $(libjava_dir)/../boehm-gc/.libs/libgcjgc.a \
+ build/$(platform)/Class.o \
+ $(libjava_dir)/gnu/gcj/runtime/FirstThread.o \
+ -lz -o $@.phat
+ @echo; ls -l $@.phat
+
+ @echo -e "\n\033[1mstripping $(target_bin).phat -> $(target_bin)\033[0m"
+ strip $@.phat -o $@
+ @echo; ls -l $@.phat
+
+ @echo -e "\n\033[1mcompressing $(target_bin) -> $(target_bin)\033[0m"
+ upx-ucl-beta $@
+ @echo; ls -l $@.phat
+endif
+
+### Builtin Resources ##############################################################################
+
+builtin_src := $(shell find src/org/ibex/builtin -name '*.*' \! -name '*.xcf')
+build/res/fonts/vera: .download_vera-1.10
+ mkdir -p build/res/fonts/vera
+ cd build/res/fonts/vera; ln -fs ../../../../upstream/vera-1.10/ttf-bitstream-vera-1.10/Vera.ttf
+ cd build/res/fonts/vera; ln -fs ../../../../upstream/vera-1.10/ttf-bitstream-vera-1.10/VeraMono.ttf
+ cd build/res/fonts/vera; ln -fs ../../../../upstream/vera-1.10/ttf-bitstream-vera-1.10/VeraSe.ttf
+build/res/builtin.jar: $(builtin_src:src/%=build/res/%) build/res/fonts/vera
+ @echo -e "\n\033[1mzipping res/* -> .jar: builtin.jar\033[0m"
+ cd build/res; $(jar) cf builtin.jar org/ibex/builtin/scar.png fonts
+build/$(platform)/builtin.o: build/res/builtin.jar
+ @echo -e "\n\033[1mwrapping .jar -> .o: resources.o\033[0m"
+ @mkdir -p $(@D)
+ @(echo "unsigned int builtin_length = "; \
+ (wc -c build/res/builtin.jar | sed "s_build.*__"); \
+ echo \;; \
+ echo "unsigned char builtin_bytes[] = {"; \
+ hexdump -ve '"0x" 1/1 "%x,\n"' build/res/builtin.jar; \
+ echo "};") > .builtin.c
+ $(gcc) -c .builtin.c -o build/$(platform)/builtin.o
+
+build/mips/%.c.o: src/%.c .download_libmspack-20030726
+ make .install_freetype-2.1.4_mips-unknown-elf target=mips-unknown-elf
+ make .install_libmspack-20030726_mips-unknown-elf target=mips-unknown-elf
+ mkdir -p $(@D)
+ echo -e "\n\033[1mcompiling $< -> $@ (mips)\033[0m"
+ upstream/install/bin/mips-unknown-elf-gcc -march=r3000 \
+ -Iupstream/freetype-2.1.4/src/include \
+ -Iupstream/libmspack-20030726/src/mspack \