Makefile 4.12 KiB
SRC_PATH ?= src
INC_PATH += include
BUILD_PATH ?= build
TEST_PATH ?= test/level1-1
OBJ_PATH ?= $(BUILD_PATH)/obj
BINARY ?= $(BUILD_PATH)/compiler
SYSLIB_PATH ?= sysyruntimelibrary
INC = $(addprefix -I, $(INC_PATH))
SRC = $(shell find $(SRC_PATH)  -name "*.cpp")
CFLAGS = -O0 -g -Wall -std=c++11 $(INC)
FLEX ?= $(SRC_PATH)/lexer.l
LEXER ?= $(addsuffix .cpp, $(basename $(FLEX)))
BISON ?= $(SRC_PATH)/parser.y
PARSER ?= $(addsuffix .cpp, $(basename $(BISON)))
SRC += $(LEXER)
SRC += $(PARSER)
OBJ = $(SRC:$(SRC_PATH)/%.cpp=$(OBJ_PATH)/%.o)
PARSERH ?= $(INC_PATH)/$(addsuffix .h, $(notdir $(basename $(PARSER))))
TESTCASE = $(shell find $(TEST_PATH) -name "*.sy")
TESTCASE_NUM = $(words $(TESTCASE))
LLVM_IR = $(addsuffix _std.ll, $(basename $(TESTCASE)))
OUTPUT_LAB4 = $(addsuffix .toks, $(basename $(TESTCASE)))
OUTPUT_LAB5 = $(addsuffix .ast, $(basename $(TESTCASE)))
OUTPUT_LAB6 = $(addsuffix .ll, $(basename $(TESTCASE)))
OUTPUT_RES = $(addsuffix .res, $(basename $(TESTCASE)))
OUTPUT_BIN = $(addsuffix .bin, $(basename $(TESTCASE)))
OUTPUT_LOG = $(addsuffix .log, $(basename $(TESTCASE)))
.phony:all app run gdb testlab4 testlab5 testlab6 test clean clean-all clean-test clean-app llvmir
all:app
$(LEXER):$(FLEX)
	@flex -o $@ $<
$(PARSER):$(BISON)
	@bison -o $@ $< --warnings=error=all --defines=$(PARSERH)
$(OBJ_PATH)/%.o:$(SRC_PATH)/%.cpp
	@mkdir -p $(OBJ_PATH)
	@g++ $(CFLAGS) -c -o $@ $<
$(BINARY):$(OBJ)
	@g++ -O0 -g -o $@ $^
app:$(LEXER) $(PARSER) $(BINARY)
run:app
	@$(BINARY) -o example.ll -i example.sy
gdb:app
	@gdb $(BINARY)
$(OBJ_PATH)/lexer.o:$(SRC_PATH)/lexer.cpp
	@mkdir -p $(OBJ_PATH)
	@g++ $(CFLAGS) -c -o $@ $<
$(TEST_PATH)/%.toks:$(TEST_PATH)/%.sy
	@$(BINARY) $< -o $@ -t
$(TEST_PATH)/%.ast:$(TEST_PATH)/%.sy
	@$(BINARY) $< -o $@ -a
$(TEST_PATH)/%.ll:$(TEST_PATH)/%.sy
	@timeout 5s $(BINARY) $< -o $@ -i 2>$(addsuffix .log, $(basename $@))
	@[ $$? != 0 ] && echo "\033[1;31mFAIL:\033[0m $(notdir $<)" || echo "\033[1;32mSUCCESS:\033[0m $(notdir $<)"
$(TEST_PATH)/%_std.ll:$(TEST_PATH)/%.sy
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
@clang -x c $< -S -m32 -emit-llvm -o $@ llvmir:$(LLVM_IR) testlab4:app $(OUTPUT_LAB4) testlab5:app $(OUTPUT_LAB5) testlab6:app $(OUTPUT_LAB6) .ONESHELL: test:app @success=0 @for file in $(sort $(TESTCASE)) do IR=$${file%.*}.ll LOG=$${file%.*}.log BIN=$${file%.*}.bin RES=$${file%.*}.res IN=$${file%.*}.in OUT=$${file%.*}.out FILE=$${file##*/} FILE=$${FILE%.*} timeout 5s $(BINARY) $${file} -o $${IR} -i 2>$${LOG} RETURN_VALUE=$$? if [ $$RETURN_VALUE = 124 ]; then echo "\033[1;31mFAIL:\033[0m $${FILE}\t\033[1;31mCompile Timeout\033[0m" continue else if [ $$RETURN_VALUE != 0 ]; then echo "\033[1;31mFAIL:\033[0m $${FILE}\t\033[1;31mCompile Error\033[0m" continue fi fi clang -o $${BIN} $${IR} $(SYSLIB_PATH)/sylib.c >>$${LOG} 2>&1 if [ $$? != 0 ]; then echo "\033[1;31mFAIL:\033[0m $${FILE}\t\033[1;31mAssemble Error\033[0m" else if [ -f "$${IN}" ]; then timeout 2s $${BIN} <$${IN} >$${RES} 2>>$${LOG} else timeout 2s $${BIN} >$${RES} 2>>$${LOG} fi RETURN_VALUE=$$? FINAL=`tail -c 1 $${RES}` [ $${FINAL} ] && echo "\n$${RETURN_VALUE}" >> $${RES} || echo "$${RETURN_VALUE}" >> $${RES} if [ "$${RETURN_VALUE}" = "124" ]; then echo "\033[1;31mFAIL:\033[0m $${FILE}\t\033[1;31mExecute Timeout\033[0m" else if [ "$${RETURN_VALUE}" = "127" ]; then echo "\033[1;31mFAIL:\033[0m $${FILE}\t\033[1;31mExecute Error\033[0m" else diff -Z $${RES} $${OUT} >/dev/null 2>&1 if [ $$? != 0 ]; then echo "\033[1;31mFAIL:\033[0m $${FILE}\t\033[1;31mWrong Answer\033[0m" else success=$$((success + 1)) echo "\033[1;32mPASS:\033[0m $${FILE}" fi fi fi fi done echo "\033[1;33mTotal: $(TESTCASE_NUM)\t\033[1;32mAccept: $${success}\t\033[1;31mFail: $$(($(TESTCASE_NUM) - $${success}))\033[0m" [ $(TESTCASE_NUM) = $${success} ] && echo "\033[5;32mAll Accepted. Congratulations!\033[0m" : clean-app: @rm -rf $(BUILD_PATH) $(PARSER) $(LEXER) $(PARSERH) clean-test: @rm -rf $(OUTPUT_LAB4) $(OUTPUT_LAB5) $(OUTPUT_LAB6) $(OUTPUT_LOG) $(OUTPUT_BIN) $(OUTPUT_RES) $(LLVM_IR) ./example.ast ./example.ll ./example.s
141142143144145
clean-all:clean-test clean-app clean:clean-all