An error occurred while loading the file. Please try again.
-
Sinsoledad authoredb57de2e6
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