git » larquil.git » master » tree

[master] / Makefile

JAVA ?= java

BUILD_DIR := build
GEN_DIR := $(BUILD_DIR)/generated
STAGE1_DIR := $(BUILD_DIR)/stage1
STAGE2_DIR := $(BUILD_DIR)/stage2
STAGE3_DIR := $(BUILD_DIR)/stage3
BOOTSTRAP_TEST_DIR := $(BUILD_DIR)/bootstrap-test
BOOTSTRAP_DIR := bootstrap
BOOTSTRAP_JAR := $(BOOTSTRAP_DIR)/stage1-compiler.jar
MAIN_CLASS := com.tailrecursion.larquil.stage0.Stage1Main

.PHONY: all build test clean compile-example run-example stage1-build stage1-test stage1-self-host bootstrap-artifact bootstrap-test

all: test stage1-self-host bootstrap-test

build:
	test -f $(BOOTSTRAP_JAR)

test: build
	sh test/run.sh

stage1-build: build
	rm -rf $(STAGE1_DIR)
	mkdir -p $(STAGE1_DIR)
	for f in stage1/core.lql stage1/munge.lql; do \
		$(JAVA) -cp $(BOOTSTRAP_JAR) $(MAIN_CLASS) $$f $(STAGE1_DIR); \
	done
	cat stage1/core.lql stage1/munge.lql stage1/forms.lql stage1/reader.lql stage1/classfile.lql stage1/emit.lql stage1/instructions.lql stage1/backend.lql stage1/runtime.lql stage1/compiler.lql > $(STAGE1_DIR)/compiler.lql
	$(JAVA) -cp $(BOOTSTRAP_JAR) $(MAIN_CLASS) $(STAGE1_DIR)/compiler.lql $(STAGE1_DIR)

stage1-test: stage1-build
	sh test/run-stage1.sh

stage1-self-host: stage1-build
	rm -rf $(STAGE2_DIR) $(STAGE3_DIR)
	mkdir -p $(STAGE2_DIR) $(STAGE3_DIR)
	$(JAVA) -cp $(STAGE1_DIR):$(BOOTSTRAP_JAR) $(MAIN_CLASS) $(STAGE1_DIR)/compiler.lql $(STAGE2_DIR)
	$(JAVA) -cp $(STAGE2_DIR):$(BOOTSTRAP_JAR) $(MAIN_CLASS) $(STAGE1_DIR)/compiler.lql $(STAGE3_DIR)
	sh test/run-stage1.sh $(STAGE2_DIR)
	sh test/run-stage1.sh $(STAGE3_DIR)

bootstrap-artifact: stage1-self-host
	mkdir -p $(BOOTSTRAP_DIR)
	rm -f $(BOOTSTRAP_JAR); \
	jar --create --file $(BOOTSTRAP_JAR) -C $(STAGE3_DIR) .

bootstrap-test: build
	rm -rf $(BOOTSTRAP_TEST_DIR)
	mkdir -p $(BOOTSTRAP_TEST_DIR)
	cat stage1/core.lql stage1/munge.lql stage1/forms.lql stage1/reader.lql stage1/classfile.lql stage1/emit.lql stage1/instructions.lql stage1/backend.lql stage1/runtime.lql stage1/compiler.lql > $(BOOTSTRAP_TEST_DIR)/compiler.lql
	$(JAVA) -cp $(BOOTSTRAP_JAR) $(MAIN_CLASS) $(BOOTSTRAP_TEST_DIR)/compiler.lql $(BOOTSTRAP_TEST_DIR)
	sh test/run-stage1.sh $(BOOTSTRAP_TEST_DIR)
	for c in com/tailrecursion/larquil/stage0/IFunction.class com/tailrecursion/larquil/stage0/Symbol.class com/tailrecursion/larquil/stage0/Stage1Main.class; do \
		jar tf $(BOOTSTRAP_JAR) | grep -qx $$c; \
	done
	if javap -classpath $(BOOTSTRAP_JAR) -v com.tailrecursion.larquil.stage0.IFunction com.tailrecursion.larquil.stage0.Symbol com.tailrecursion.larquil.stage0.Stage1Main | grep -E 'SourceFile|Compiled from'; then \
		exit 1; \
	fi

compile-example: build
	rm -rf $(GEN_DIR)
	mkdir -p $(GEN_DIR)
	$(JAVA) -cp $(BOOTSTRAP_JAR) $(MAIN_CLASS) examples/fact_recursive.lql $(GEN_DIR)

run-example: compile-example
	$(JAVA) -cp $(GEN_DIR):$(BOOTSTRAP_JAR) com.tailrecursion.larquil.stage0.fact_recursive

clean:
	rm -rf $(BUILD_DIR)