-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmakefile
88 lines (66 loc) · 3.41 KB
/
makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# Paths
SRC = ./src
BIN = ./bin
OBJ = ./obj
GRAMMAR_PATH = ./grammar
AST_PATH = ./src/ast
PARSER_PATH = ./src/parser
SYMTABLE_PATH = ./src/symtable
UTILS_PATH = ./src/utils
CG_PATH = ./src/code-generator
# Commands
FLAGS = -Wno-write-strings -g -std=c++11
LEX := flex
YACC := bison
INC := -I $(PARSER_PATH) -I $(SYMTABLE_PATH) -I $(SYMTABLE_PATH) -I $(SYMTABLE_PATH) -I $(AST_PATH) -I $(UTILS_PATH) -I $(CG_PATH)
OBJS = $(OBJ)/activation-record.o $(OBJ)/ast.o $(OBJ)/code-generator.o $(OBJ)/code-visitor.o $(OBJ)/error.o $(OBJ)/expression.o $(OBJ)/global.o $(OBJ)/operator.o $(OBJ)/statement.o $(OBJ)/symtable.o $(OBJ)/type.o $(OBJ)/value.o $(OBJ)/static-visitor.o
all: $(BIN)/mjv
$(BIN)/mjv: $(OBJ)/lex.yy.c $(PARSER_PATH)/yaccer.cpp $(OBJS) $(SRC)/main.cpp
g++ $(SRC)/main.cpp $(PARSER_PATH)/yaccer.cpp $(OBJ)/lex.yy.c $(OBJS) -ly -ll -o $(BIN)/mjv $(INC) $(FLAGS)
$(OBJ)/lex.yy.c: $(PARSER_PATH)/lexer.l
$(LEX) -o $(OBJ)/lex.yy.c $(PARSER_PATH)/lexer.l
$(PARSER_PATH)/yaccer.cpp: $(PARSER_PATH)/yaccer.y
$(YACC) --defines=$(PARSER_PATH)/yaccer.hpp $(PARSER_PATH)/yaccer.y -o $(PARSER_PATH)/yaccer.cpp
$(OBJ)/activation-record.o: $(CG_PATH)/activation-record.cpp $(CG_PATH)/activation-record.hpp
g++ -c -o $(OBJ)/activation-record.o $(CG_PATH)/activation-record.cpp $(INC) $(FLAGS)
$(OBJ)/ast.o: $(AST_PATH)/ast.cpp $(AST_PATH)/ast.hpp
g++ -c -o $(OBJ)/ast.o $(AST_PATH)/ast.cpp $(INC) $(FLAGS)
$(OBJ)/code-generator.o: $(CG_PATH)/code-generator.cpp $(CG_PATH)/code-generator.hpp
g++ -c -o $(OBJ)/code-generator.o $(CG_PATH)/code-generator.cpp $(INC) $(FLAGS)
$(OBJ)/code-visitor.o: $(CG_PATH)/code-visitor.cpp $(CG_PATH)/code-visitor.hpp
g++ -c -o $(OBJ)/code-visitor.o $(CG_PATH)/code-visitor.cpp $(INC) $(FLAGS)
$(OBJ)/error.o: $(UTILS_PATH)/error.cpp $(UTILS_PATH)/error.hpp
g++ -c -o $(OBJ)/error.o $(UTILS_PATH)/error.cpp $(INC) $(FLAGS)
$(OBJ)/expression.o: $(AST_PATH)/expression.cpp $(AST_PATH)/expression.hpp
g++ -c -o $(OBJ)/expression.o $(AST_PATH)/expression.cpp $(INC) $(FLAGS)
$(OBJ)/global.o: $(UTILS_PATH)/global.cpp $(UTILS_PATH)/global.hpp
g++ -c -o $(OBJ)/global.o $(UTILS_PATH)/global.cpp $(INC) $(FLAGS)
$(OBJ)/operator.o: $(AST_PATH)/operator.cpp $(AST_PATH)/operator.hpp
g++ -c -o $(OBJ)/operator.o $(AST_PATH)/operator.cpp $(INC) $(FLAGS)
$(OBJ)/statement.o: $(AST_PATH)/statement.cpp $(AST_PATH)/statement.hpp
g++ -c -o $(OBJ)/statement.o $(AST_PATH)/statement.cpp $(INC) $(FLAGS)
$(OBJ)/static-visitor.o: $(CG_PATH)/static-visitor.cpp $(CG_PATH)/static-visitor.hpp
g++ -c -o $(OBJ)/static-visitor.o $(CG_PATH)/static-visitor.cpp $(INC) $(FLAGS)
$(OBJ)/symtable.o: $(SYMTABLE_PATH)/symtable.cpp $(SYMTABLE_PATH)/symtable.hpp
g++ -c -o $(OBJ)/symtable.o $(SYMTABLE_PATH)/symtable.cpp $(INC) $(FLAGS)
$(OBJ)/type.o: $(AST_PATH)/type.cpp $(AST_PATH)/type.hpp
g++ -c -o $(OBJ)/type.o $(AST_PATH)/type.cpp $(INC) $(FLAGS)
$(OBJ)/value.o: $(CG_PATH)/value.cpp $(CG_PATH)/value.hpp
g++ -c -o $(OBJ)/value.o $(CG_PATH)/value.cpp $(INC) $(FLAGS)
# Clean project
clean:
@# @ symbol at beginning indicates that it will not be printed
@if [ "$$(ls -A $(OBJ))" ]; then \
rm $(OBJ)/*; \
fi
@if [ "$$(ls -A $(BIN))" ]; then \
rm $(BIN)/*; \
fi
@rm $(PARSER_PATH)/*.cpp $(PARSER_PATH)/*.hpp
# Run all code examples
test: $(BIN)/mjv
@for filename in ./code-examples/*; do \
echo "------ TEST --------------------------\nFile: $$filename\n"; \
./bin/mjv < "$$filename"; \
echo "--------------------------------------\n\n"; \
done