JAVA = java JAVAC = javac -source 1.3 -target 1.3 JAY = $(JAVA) -jar lib/jay.jar JLEX = $(JAVA) -cp build edu.princeton.cs.appel.jlex.Main FUSELEX = $(JAVA) -cp build edu.rit.bja8464.fuselex.Main CLASSGEN = $(firstword $(patsubst %,%/build,$(wildcard upstream/classgen $(HOME)/Work/classgen))) ENABLE_JVM = $(CLASSGEN)) .PRECIOUS: build/%.class jar = fuse.jar jlex_inputs = $(shell find src -name '*.l') jay_inputs = $(shell find src -name '*.y') fuselex_inputs = $(shell find src -name '*.fl') gen_sources = $(jlex_inputs:src/%.l=build/%.java) $(jay_inputs:src/%.y=build/%.java) sources = $(shell find src -name '*.java' ! -path 'src/edu/princeton/cs/appel/jlex/*' ! -path 'src/edu/rit/bja8464/fuselex/*' ! -name JVMCompiler.java) \ $(if $(ENABLE_JVM), src/edu/rit/bja8464/fuse/JVMCompiler.java) fuse_sources = $(shell find src -name '*.fuse') fuse_gen_sources = $(fuselex_inputs:src/%.fl=build/%.fuse) classes = $(sources:src/%.java=build/%.class) $(gen_sources:%.java=%.class) all = $(classes) $(fuse_sources:src/%=build/%) $(fuse_gen_sources) all: $(all) build/%.class: src/%.java $(JAVAC) -d build $^ $(classes): $(sources) $(gen_sources) $(JAVAC) -classpath "$(CLASSGEN)" -d build $(sources) $(gen_sources) build/%.java: src/%.l build/edu/princeton/cs/appel/jlex/Main.class @mkdir -p `dirname $@` $(JLEX) $< > $@ build/%.fuse: src/%.fl build/edu/rit/bja8464/fuselex/Main.class $(FUSELEX) $< > $@ build/%.java: src/%.y src/%.skel @mkdir -p `dirname $@` $(JAY) src/$*.y src/$*.skel > $@ build/%.fuse: src/%.fuse @mkdir -p `dirname $@` cp $< $@ $(jar): $(classes) $(fuse_sources:src/%=build/%) $(fuse_gen_sources) printf "Manifest-Version: 1.0\nMain-Class: edu.rit.bja8464.fuse.Main\n" > .manifest cd build && jar cfm ../$@ ../.manifest `find edu/rit/bja8464/fuse org/xwt/util -type f ! -name '*.java'` test: test_test test_%: tests/%.fuse $(all) $(JAVA) -cp build edu.rit.bja8464.fuse.Main tests.$* testjvm: testjvm_test testjvm_%: tests/%.fuse $(all) @mkdir -p tmp java -cp build:$(CLASSGEN) edu.rit.bja8464.fuse.JVMCompiler $< tmp java -cp tmp:build Main debug_%: $(classes) $(JAVA) -cp build edu.rit.bja8464.fuse.Debug $* tests/test.fuse define check_body tests/.status/%.$(1): tests/% $(all); @printf "\033[1;30mCHECKING: %s: %s\033[0m\n" $(1) $$* $(2) $$< @printf "\033[1;34mPASSED: %s: %s\033[0m\n" $(1) $$* @mkdir -p "`dirname $$@`" @touch "$$@" endef tests/.status/%.jvm: tests/% $(all) @printf "\033[1;30mCHECKING: jvm: %s\033[0m\n" $* @mkdir -p tmp java -cp build:$(CLASSGEN) edu.rit.bja8464.fuse.JVMCompiler $< tmp java -cp tmp:build Main @mkdir -p "`dirname $@`" @touch "$@" $(call check_body,eval,$(JAVA) -cp build edu.rit.bja8464.fuse.Main) check: $(patsubst tests/%,tests/.status/%.eval, $(shell find tests -name '*.fuse')) #$(call check_body,reparse,$(JAVA) -cp build edu.rit.bja8464.fuse.Debug reparse) #check: $(patsubst tests/%,tests/.status/%.reparse, $(shell find tests -name '*.fuse')) $(call check_body,error,true && ! $(JAVA) -cp build edu.rit.bja8464.fuse.Main) check: $(patsubst tests/%,tests/.status/%.error, $(shell find tests -name '*.fail')) check: $(if $(ENABLE_JVM),$(patsubst tests/%,tests/.status/%.jvm, $(shell find tests -name '*.fuse'))) check: ; @printf "\033[1;34mAll tests passed successfully!\033[0m\n" website_stuff: build/javadoc/index.html build/website.zip build/fuse-snapshot.tar.gz build/javadoc/index.html: $(sources) $(gen_sources) doc/manual.html @mkdir -p build/javadoc javadoc -d build/javadoc -overview doc/manual.html -link http://java.sun.com/j2se/1.3/docs/api/ $(filter-out src/edu/rit/bja8464/fuse/JVMCompiler.java, $(sources)) $(gen_sources) build/website.zip: $(shell find doc -type f -a ! -name '*~') zip $@ $^ build/fuse-snapshot.tar.gz: _darcs/inventory darcs dist -d fuse-snapshot && mv fuse-snapshot.tar.gz $@ clean: rm -rf build/* tests/.status fetch_classgen: @mkdir -p upstream if [ ! -d upstream/classgen ]; then \ cd upstream && darcs get http://darcs.brianweb.net/classgen; \ else \ cd upstream/classgen && darcs pull; \ fi $(MAKE) -C upstream/classgen push: @if [ "$${HOSTNAME#*.}" = "brianweb.net" ]; then \ for repo in "holly.cs.rit.edu public_html/cc" "charger.brianweb.net /home/darcs/fuse"; do \ set $$repo; \ darcs push $$1:$$2; \ ssh $$1 "gmake -C $$2 website_stuff"; \ done; \ else \ echo "You need to customize the push target in the makefile" 1>&2; \ exit 1; \ fi