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)