-#
+#############################################################################
+#
# The XWT Makefile
#
-## Configurables ###########################################################################
+all: JVM Darwin Linux Win32 Solaris
+
+JVM: build/JVM/xwt.jar
+Linux: ; make gcj platform=Linux target=i686-pc-linux-gnu link_flags="-lX11 -lXext --static"
+Solaris: ; make gcj platform=Solaris target=sparc-sun-solaris2.7 link_flags="-lX11 -lXext"
+Win32: ; make gcj platform=Win32 target=i686-pc-mingw32 link_flags="-Wl,--subsystem,windows -lcomdlg32" target_bin=xwt.exe
+Darwin: ; make gcj platform=Darwin target=powerpc-apple-darwin link_flags="-lSystem -lmathCommon.A"
-# inputs
-jikes_java_sources := $(shell find src -name *.java)
-gcj_java_sources := $(shell find src -name *.java -not -path src/org/xwt/plat/\*) src/org/xwt/plat/GCJ.java $(platform_java_sources)
-xwar_sources := $(ls src/org/xwt/builtin/*.png src/org/xwt/builtin/*.xwt src/org/xwt/builtin/*.xwf)
-cc_sources := src/org/xwt/plat/$(platform).cc
-# outputs
-jikes_java_objects := $(jikes_java_sources:src/%.java=bin/%.class)
-cc_objects := $(cc_sources:src/%.cc=bin-$(platform)/%-nat.o)
-gcj_java_objects := $(gcj_java_sources:src/%.java=bin-$(platform)/%.o)
+#############################################################################
+# Configurables:
+#
+target_bin := xwt.$(shell echo $(platform) | tr A-Z a-z)
+jikes_flags := -nowarn -sourcepath src/
+gcc_optimizations := -O2
+#gcc_optimizations := -O9 -ffast-math -fomit-frame-pointer -foptimize-sibling-calls
+#gcc_optimizations += -finline-functions -funroll-loops -ffunction-sections -fdata-sections
+gcc_flags := -nostdinc $(gcc_optimizations) -Ibuild/h -Iupstream/jpeg-6b/src/ -Iupstream/jpeg-6b/build-$(target)/
+gcj_flags := -fCLASSPATH=build/java
+gcj := upstream/install/bin/$(target)-gcj $(gcc_flags) $(gcj_flags)
+g++ := upstream/install/bin/$(target)-gcj $(gcc_flags)
+gcc := upstream/install/bin/$(target)-gcc $(gcc_flags)
+jar := $(shell ((type fastjar &>/dev/null) && echo fastjar) || echo jar)
+
+include Makefile.upstream
+
+# FIXME this should be done with -ljpeg
+jpeg_c_sources := jdapimin.c jdapistd.c jcomapi.c jcparam.c jdmaster.c jdinput.c jdmainct.c jdcoefct.c jdpostct.c jdmarker.c
+jpeg_c_sources += jdhuff.c jdphuff.c jddctmgr.c jidctint.c jidctfst.c jidctflt.c jidctred.c jdsample.c jdcolor.c jdmerge.c
+jpeg_c_sources += jquant1.c jquant2.c jerror.c jutils.c jmemnobs.c jmemmgr.c
+upstream/jpeg-6b/src/%.c: .download_jpeg-6b
+
+java_sources := $(patsubst src/%.java, build/java/%.java, $(shell find src -name \*.java))
+java_sources += $(patsubst src/%.java.pp, build/java/%.java, $(shell find src -name \*.java.pp))
+java_sources += build/java/org/xwt/Builtin.java
+
+build/java/%.java: src/%.java ; @echo linking $@; mkdir -p $(@D); ln -s `echo $(@D) | sed 's_[^/]*\(/\|$$\)_../_g'`/$< $@
+build/cc/%.cc: src/%.c ; @echo linking $@; mkdir -p $(@D); ln -s `echo $(@D) | sed 's_[^/]*\(/\|$$\)_../_g'`/$< $@
+build/c/jpeg/%.c: upstream/jpeg-6b/src/%.c
+ @echo linking $@; mkdir -p $(@D); ln -s `echo $(@D) | sed 's_[^/]*\(/\|$$\)_../_g'`/$< $@
+
+build/java/%.java: src/%.java.pp
+ @make -s build/class/org/xwt/util/Preprocessor.class
+ @echo -e "\n\033[1mpreprocessing .java.pp -> .java: $<\033[0m"
+ mkdir -p `dirname $@`
+ rm -f $@
+ java -cp build/class org.xwt.util.Preprocessor < $< > $@
+
+build/class/%.class: build/java/%.java .jikes
+ @echo -e "\n\033[1mcompiling .java -> .class: $<\033[0m"
+ mkdir -p build/class
+ @./.jikes $<
+
+compile: .compile
+.compile: $(java_sources:build/java/%.c=build/class/%.class)
+ @echo -e "\n\033[1mcompiling .java -> .class: src/**/*.java\033[0m"
+ mkdir -p build/class
+ @./.jikes $(java_sources)
+ touch .compile
+
+# PHASE 4: gcj-generated headers
+java_headers := $(java_sources:build/java/%.java=build/h/%.h)
+build/h/%.h: build/class/%.class .compile
+ @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 ../../upstream/install/bin/$(target)-gcjh -d ../h --classpath .)
-# tools
-gcc_path := $(shell pwd)/gcc
-gcc_flags := -O9 -ffast-math -fomit-frame-pointer -foptimize-sibling-calls -finline-functions -funroll-loops -g
-gcj_flags := -fCLASSPATH=bin
-gcj := $(gcc_path)/bin/$(target)-gcj $(gcj_flags) $(gcc_flags)
-gcc := $(gcc_path)/bin/$(target)-g++ $(gcc_flags)
-gcjh := $(gcc_path)/bin/$(target)-gcjh
-ar := $(gcc_path)/$(target)/bin/ar
-jikes := jikes -extdirs ${JAVA_HOME}/jre/lib -nowarn
+# a hack since we've disabled gcj's awt implementation
+build/$(platform)/org/xwt/plat/Java2.java.o:
+ touch .empty.c; mkdir -p $(@D); $(gcc) -c .empty.c -o $@;
+build/$(platform)/org/xwt/plat/AWT.java.o:
+ touch .empty.c; mkdir -p $(@D); $(gcc) -c .empty.c -o $@;
-# platforms
-all_platforms := Win32 Linux Java2
+build/$(platform)/%.java.o: build/java/%.java
+ @echo -e "\n\033[1mcompiling .java -> .o: $<\033[0m"
+ mkdir -p `dirname $@`
+ $(gcj) -c $< -o $@
+build/$(platform)/org/xwt/plat/$(platform).cc.o: src/org/xwt/plat/$(platform).cc src/org/xwt/plat/*.cc $(java_headers) .configure_jpeg-6b_$(target)
+ @echo -e "\n\033[1mcompiling .cc -> .o: $<\033[0m"
+ mkdir -p `dirname $@`
+ $(g++) -Iupstream/install/lib/gcc-lib/$(target)/3.3/include/ -Iupstream/install/$(target)/include -I/usr/X11R6/include/ -Ibuild/h -Wno-multichar -Iupstream/install/include -c $< -o $@
-## Platform-Neutral ###########################################################################
+build/$(platform)/jpeg-6b/%.c.o: upstream/jpeg-6b/src/%.c
+ @echo -e "\n\033[1mcompiling .c -> .o: $<\033[0m"
+ mkdir -p `dirname $@`
+ $(gcc) -Ibuild/h -c $< -o $@
-ifneq ($(verbose),true)
-.SILENT: dist update-build $(jikes_java_objects) .headers $(gcj_java_objects) $(all_platforms) PalmOS bin/org/xwt/builtin.xwar nohup-dist
-silent := --silent
-endif
+# PHASE 5: linking
+build/$(target)/$(target_bin).ar: $(java_sources:build/java/%.java=build/$(platform)/%.java.o) build/$(platform)/org/xwt/plat/$(platform).cc.o $(jpeg_object_files)
+ @echo -e "\n\033[1marchiving .o -> $(target_bin).ar\033[0m"
+ rm -f build/$(target)/$(target_bin).ar
+ upstream/install/$(target)/bin/ar -cq build/$(target)/$(target_bin).ar $^
+ upstream/install/$(target)/bin/ranlib build/$(target)/$(target_bin).ar
-compile: $(jikes_java_objects) bin/org/xwt/builtin.xwar
+$(target_bin): build/$(target)/$(target_bin).ar
+ @echo -e "\n\033[1mlinking .o -> $(target_bin)\033[0m"
+ mkdir -p build/$(platform)
+ PATH=upstream/install/bin:$$PATH $(gcj) --main=org.xwt.Main -o build/$(platform)/$(target_bin) build/$(target)/$(target_bin).ar -Lupstream/install/$(target)/lib $(link_flags)
-all: $(all_platforms)
-$(jikes_java_objects): $(jikes_java_sources)
- echo -ne "compiling .java -> .class:\\r"
- mkdir -p bin
- $(jikes) -sourcepath src/ -classpath lib/libgcj-minimal.jar $(jikes_java_sources) -d bin/
- echo "compiling .java -> .class: done"
+##############################################################################
+# Special treatment:
+#
-bin/org/xwt/builtin.xwar: $(xwar_sources)
- mkdir -p bin/org/xwt
- cd src; fastjar cf ../bin/org/xwt/builtin.xwar $(xwar_sources:src/%=%)
+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 -e "\n\033[1mzipping/uuencoding .xwt -> .java: build/java/org/xwt/Builtin.java\033[0m"
+ 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
-clean:
- rm -rf bin-* bin
- find . -name \*~ | xargs rm -f
- find . -name \#\*\# | xargs rm -f
+
+# compile is here to force compilation of the .class files (they get used via -Ibuild) without
+# having the individual .o's depend on the .java's (otherwise every .o gets recompiled when one .java changes)
+gcj: .vendor .install_gcc-3.3_$(target) .compile $(target_bin)
+build/JVM/xwt.jar: .compile
+ @echo -e "\n\033[1marchiving .class -> .jar: build/JVM/xwt.jar\033[0m"
+ mkdir -p build/JVM
+ echo -e "Manifest-Version: 1.0\nMain-Class: org.xwt.Main\n" > build/JVM/.manifest
+ cd build/class; $(jar) cfm ../JVM/xwt.jar ../JVM/.manifest `find . -name \*.class`;
+
+
+
+##############################################################################
+# Freetype
+#
+
+build/mips/%.c.o: src/%.c
+ make .install_freetype-2.1.4_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 -I upstream/freetype-2.1.4/src/include -c -o $@ $<
+
+build/mips/freetype.mips: build/mips/org/xwt/imp/Freetype.c.o build/mips/org/xwt/imp/crt0.c.o build/mips/org/xwt/imp/syscalls.c.o
+ make .install_freetype-2.1.4_mips-unknown-elf target=mips-unknown-elf
+ @echo -e "\n\033[1mlinking .o -> .mips: $@\033[0m"
+ mkdir -p build/mips
+ upstream/install/bin/mips-unknown-elf-gcc \
+ -nostdlib \
+ --static \
+ -march=mips1 \
+ -T src/org/xwt/imp/linker.ld \
+ -Lbuild/mips \
+ -Lupstream/freetype-2.1.4/src/objs \
+ -o $@ \
+ build/mips/org/xwt/imp/Freetype.c.o \
+ --strip \
+ -lfreetype
+
+build/java/org/xwt/imp/Freetype.java: build/mips/freetype.mips build/class/org/xwt/imp/MIPS.class
+ @echo -e "\n\033[1mtranslating .mips -> .java: $@\033[0m"
+ 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
+
+
+
+##############################################################################
+# Maintainer stuff: generating numbered builds, proposing patches
+#
update-build:
+ cvs tag -F xwt-$(current_build)
(echo -n 0000; (echo "10k16o16i"; cat next.build | tr a-z A-Z; echo "1+f") | dc) | tail --bytes=5 > next.build-
mv next.build- next.build
echo -n "Next build will be "
cat next.build
cvs update CHANGES
- echo `date +%d-%b`" =========== build $(current_build) ================================================" >> CHANGES
echo "" >> CHANGES
+ echo `date +%d-%b`" =========== build $(current_build) ================================================" >> CHANGES
echo committing...
cvs commit -m 'this comment should not appear in CHANGES' next.build CHANGES
echo committed.
-
-## GCJ-Derived Platforms #######################################################################
-
-# if the user doesn't change gcc_path, and it's not built, then we'll try to build it
-$(shell pwd)/gcc/bin/$(target)-gcj:
- cd gcc; make
-
-gcj: compile $(gcc_path)/bin/$(target)-gcj .headers link
-
-link: $(gcj_java_objects) $(cc_objects)
- echo "linking .o -> $(target_bin)"
- $(ar) r bin-$(platform)/org/xwt/plat/platform.ar bin-$(platform)/org/xwt/plat/*.o
- $(gcj) --main=org.xwt.Main -o bin-$(platform)/$(target_bin) $^ $(platform_link) bin-$(platform)/org/xwt/plat/platform.ar
-
-.headers: $(jikes_java_objects)
- cd bin; for A in `find * -name \*.class`; do \
- echo -ne "\033[K\\rextracting .class -> .h: $$A\\r"; \
- $(gcjh) --classpath . `echo $$A | sed s_/_._g | sed s/.class$$//`; \
- done
- echo -e "\033[K\\rextracting .class -> .h: done"
- touch .headers
-
-# turn off optimization of Trap.java due to a compiler bug
-bin-$(platform)/org/xwt/Trap.o: gcj_flags := -O0 -g
-
-$(gcj_java_objects): bin-$(platform)/%.o: src/%.java $(jikes_java_objects)
- echo -ne "\033[K\\rcompiling .java -> .o: $<\\r"
- mkdir -p `dirname $@`
- $(gcj) -c $< -o $@
-
-$(cc_objects): bin-$(platform)/%-nat.o: src/%.cc
- echo -ne "\033[K\\rcompiling .cc -> .o: $$A\\r"
- $(gcc) -Ibin -c $< -o $@
-
-bin-$(platform)/org/xwt/builtin.xwar: $(xwar_sources)
- echo "archiving .xwt -> .xwar"
- $(gcj) --resource org/xwt/builtin.xwar -c $< -o $@
-
-
-
-## Platforms ##############################################################################
-
-Linux:
- echo -e "\\n=== Linux ========================================="
- make gcj \
- platform=Linux \
- target=i686-pc-linux-gnu \
- target_bin=xwt.linux \
- platform_link="-L$(gcc-path)/lib -L/usr/X11R6/lib -lX11 -lXext --static" \
- platform_java_sources="src/org/xwt/plat/POSIX.java src/org/xwt/plat/X11.java"
-
-Win32:
- echo -e "\\n=== Win32 ========================================="
- make gcj \
- platform=Win32 \
- target=i686-pc-mingw32 \
- target_bin=xwt.exe \
- platform_link="-Wl,--subsystem,windows -lcomdlg32" \
- platform_java_sources=src/org/xwt/plat/Win32.java
-
-Java2: $(jikes_java_objects) bin/org/xwt/builtin.xwar
- echo -e "\\n=== Java2 ========================================="
- echo "archiving .class -> .jar"
- mkdir -p bin-Java2
- echo -e "Manifest-Version: 1.0\nMain-Class: org.xwt.Main\n" > bin/.manifest
- cd bin; fastjar cvf ../bin-Java2/xwt.jar -m .manifest \
- org/xwt/builtin.xwar \
- `find . -name \*.class | grep -v org/xwt/plat/` \
- org/xwt/plat/AWT*.class org/xwt/plat/Java2*.class | tr \\012 \\015
- echo
-
-$(java2_objects:bin/%=%)
-
-PalmOS:
- echo "PalmOS is not yet supported"
- false
-
-
-## dist.xwt.org ############################################################################
+propose-patch:
+ @echo -n "Please type a one-line description of this bug: "; \
+ read A; \
+ echo; \
+ echo "Please type any additional comments that explain this patch."; \
+ echo "If this patch fixes a bug, include a link to bugs.xwt.org."; \
+ echo "When you are done, press control-d on a new line."; \
+ echo; \
+ ( echo -e "HELO patcher"; \
+ echo -e "MAIL FROM:$(USER)@xwt.org"; \
+ echo -e "RCPT TO: patches@xwt.org"; \
+ echo -e "DATA"; \
+ echo -e "From: $(USER)@xwt.org"; \
+ echo -e "To: patches@xwt.org"; \
+ echo -e "Subject: proposed patch to $(this_branch): $$A"; \
+ echo -e ""; \
+ cat; \
+ echo; \
+ cvs diff -Bud; \
+ echo .; \
+ ) > .message
+ bash -c "cat .message > /dev/tcp/mail.xwt.org/25" # /dev/tcp is faked by bash; not part of the os
current_build := $(shell cat next.build)
+this_branch := $(shell tail -c +2 CVS/Tag 2>/dev/null || echo HEAD)
+this_branch_flag := $(shell test $(this_branch) = HEAD && echo || echo -r $(this_branch))
-nohup-dist:
- rm .make-dist.out
- touch .make-dist.out
- nice -n 19 nohup make dist & \
- tail -f .make-dist.out | grep -v "make...:.\(Entering\|Leaving\).directory"
+# pre-depend on compile as a sanity check
+dist: compile
+ # this will fail if we haven't checked-in since the comment is null; we want this.
+ cvs commit -m '' > /dev/null
+ cvs tag -F xwt-$(current_build)
-dist:
- test `uname -n` = gosset.megacz.com || \
- (echo -e "um, dist is only intended for use on xwt.org...\nedit the Makefile if you really know what you're doing."; false)
echo "***********************************************************"
echo "* This build is $(current_build)"
echo "***********************************************************"
- make $(silent) update-build
- (make $(silent) dist-private &> .make-dist.out) || \
- (cat .make-dist.out | mail -s "Build $(current_build) FAILED" cvs@xwt.org; false)
- cat .make-dist.out | \
- mail -s "Unsigned binaries of build $(current_build) are now available" cvs@xwt.org < /dev/null
+ ifeq ($(shell uname -n),serverbeach.megacz.com)
+ (make $(silent) dist-private 2>&1) >> .make-dist.out || \
+ (tail -n 200 .make-dist.out | mail -s "Build $(current_build) FAILED" cvs@xwt.org; false)
+ tail -n 200 .make-dist.out | \
+ mail -s "Unsigned binaries of $(current_build) are now available" cvs@xwt.org
+ else
+ echo -e 'export JAVA_HOME=/usr/lib/j2sdk1.4\n cd /home/xwt\n date=`date +%d-%b-%H%M`\n mkdir xwt-$$date\n cd xwt-$$date\n /usr/bin/cvs -d /cvs co $(this_branch_flag) xwt\n mv xwt/* .\n mv xwt/.* .\n rmdir xwt\n touch .make-dist.out\n nohup make dist &> /dev/null &\n echo\n cat .make-dist.out' | ssh xwt@xwt.org | grep -v "make...:.\(Entering\|Leaving\).directory"
+ endif
dist-private:
+ make $(silent) update-build
+
# preserve gcc across builds so we don't have to remake it
- mv gcc/Makefile Makefile.gcc
mkdir -p $(HOME)/dist.xwt.org-gcc
- rm -rf gcc
+ mv gcc gcc-
ln -s $(HOME)/dist.xwt.org-gcc gcc
- mv Makefile.gcc gcc/Makefile
+ mv -f gcc-/Makefile gcc/
+ mv -f gcc-/*.patch gcc/
# build it
nice -n 19 make all
echo
- echo === dist.xwt.org ==================================
+ echo === master.dist.xwt.org ==================================
echo "copying xwt.jar to distribution area..."
- cp bin-Java2/xwt.jar /var/www/dist.xwt.org/xwt-$(current_build).jar.unsigned
+ cp xwt.jar /var/www/master.dist.xwt.org/xwt-$(current_build).jar.unsigned
- echo "copying xwt.exe to distribution area..."
- cp bin-Win32/xwt.exe /var/www/dist.xwt.org/xwt-$(current_build).exe.unsigned
+ echo "stripping xwt.exe and copying it to the distribution area..."
+ $(strip) build/Win32/xwt.exe -o /var/www/master.dist.xwt.org/xwt-$(current_build).exe.unsigned
echo "copying xwt.linux to distribution area..."
- cp bin-Linux/xwt.linux /var/www/dist.xwt.org/xwt-$(current_build).linux.unsigned
+ $(strip) build/Linux/xwt.linux -o /var/www/master.dist.xwt.org/xwt-$(current_build).linux.unsigned
+
+ echo "creating source tarball in distribution area..."
+ CVSROOT=/cvs cvs export -r xwt-$(current_build) xwt
+ mv xwt xwt-$(current_build)
+ tar cvzf /var/www/master.dist.xwt.org/xwt-$(current_build).tgz xwt-$(current_build)
echo
echo "*** DONE ******************************************"