-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
122 lines (102 loc) · 4.8 KB
/
Makefile
File metadata and controls
122 lines (102 loc) · 4.8 KB
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# ==============================================================================
# Compiler and Tool Configuration
# ==============================================================================
CXX = g++
FLEX = flex
BISON = bison
# ==============================================================================
# Directory Configuration
# ==============================================================================
SRCDIR = ./src
INCLUDEDIR = ./src/include
BUILDDIR = ./build
# ==============================================================================
# Compilation Flags
# ==============================================================================
CXXINCLUDE = -I./src/include -I./src -I./build
CXXFLAGS = -Wno-write-strings -g -Wall -Wextra -std=c++17 ${CXXINCLUDE}
BISONFLAGS = -d -y
# ==============================================================================
# Targets and Objects
# ==============================================================================
TARGET = saytringc
OBJS = $(BUILDDIR)/main.o $(BUILDDIR)/lexer.o $(BUILDDIR)/parser.o $(BUILDDIR)/symtab.o $(BUILDDIR)/util.o $(BUILDDIR)/semant.o $(BUILDDIR)/cgen.o $(BUILDDIR)/core_func.o $(BUILDDIR)/flag_handler.o
# ==============================================================================
# Build Targets
# ==============================================================================
.PHONY: all build clean help dotest
# Default target - build everything
all: $(BUILDDIR) $(TARGET)
# Build target alias
build: $(TARGET)
# Create build directory
$(BUILDDIR):
@mkdir -p $(BUILDDIR)
@echo "Created build directory: $(BUILDDIR)"
# Link the final executable
$(TARGET): $(OBJS)
@echo "Linking $(TARGET)..."
$(CXX) $(CXXFLAGS) -o $(BUILDDIR)/$(TARGET) $(OBJS)
@echo "Build complete: $(BUILDDIR)/$(TARGET)"
# Compile main.o
$(BUILDDIR)/main.o: $(SRCDIR)/main.cc ${INCLUDEDIR}/AST.h ${INCLUDEDIR}/flag_handler.h $(BUILDDIR)/parser.tab.h
$(CXX) $(CXXFLAGS) -c $(SRCDIR)/main.cc -o $(BUILDDIR)/main.o
# Compile flag_handler.o
$(BUILDDIR)/flag_handler.o: $(SRCDIR)/flag_handler.cc ${INCLUDEDIR}/flag_handler.h
$(CXX) $(CXXFLAGS) -c $(SRCDIR)/flag_handler.cc -o $(BUILDDIR)/flag_handler.o
# Compile cgen.o
$(BUILDDIR)/cgen.o: $(SRCDIR)/cgen.cc ${INCLUDEDIR}/cgen.h ${INCLUDEDIR}/core_func.h ${INCLUDEDIR}/AST.h ${INCLUDEDIR}/symtab.h ${INCLUDEDIR}/template.h
$(CXX) $(CXXFLAGS) -c $(SRCDIR)/cgen.cc -o $(BUILDDIR)/cgen.o
# Compile semant.o
$(BUILDDIR)/semant.o: $(SRCDIR)/semant.cc $(BUILDDIR)/parser.tab.h ${INCLUDEDIR}/core_func.h ${INCLUDEDIR}/semant.h ${INCLUDEDIR}/AST.h ${INCLUDEDIR}/symtab.h
$(CXX) $(CXXFLAGS) -c $(SRCDIR)/semant.cc -o $(BUILDDIR)/semant.o
# Compile core_func.o
$(BUILDDIR)/core_func.o: $(SRCDIR)/core_func.cc ${INCLUDEDIR}/core_func.h ${INCLUDEDIR}/semant.h ${INCLUDEDIR}/symtab.h
$(CXX) $(CXXFLAGS) -c $(SRCDIR)/core_func.cc -o $(BUILDDIR)/core_func.o
# Compile symtab.o
$(BUILDDIR)/symtab.o: $(SRCDIR)/symtab.cc ${INCLUDEDIR}/symtab.h
$(CXX) $(CXXFLAGS) -c $(SRCDIR)/symtab.cc -o $(BUILDDIR)/symtab.o
# Compile util.o
$(BUILDDIR)/util.o: $(SRCDIR)/util.cc $(BUILDDIR)/parser.tab.h ${INCLUDEDIR}/AST.h ${INCLUDEDIR}/symtab.h
$(CXX) $(CXXFLAGS) -c $(SRCDIR)/util.cc -o $(BUILDDIR)/util.o
# Generate and compile lexer
$(BUILDDIR)/lexer.o: $(SRCDIR)/lexer.l $(BUILDDIR)/parser.tab.h
$(FLEX) -o $(BUILDDIR)/lexer.yy.cc $(SRCDIR)/lexer.l
$(CXX) $(CXXFLAGS) -c $(BUILDDIR)/lexer.yy.cc -o $(BUILDDIR)/lexer.o
# Compile parser
$(BUILDDIR)/parser.o: $(BUILDDIR)/parser.tab.h $(BUILDDIR)/parser.tab.cc ${INCLUDEDIR}/AST.h ${INCLUDEDIR}/symtab.h ${INCLUDEDIR}/util.h
$(CXX) $(CXXFLAGS) -c $(BUILDDIR)/parser.tab.cc -o $(BUILDDIR)/parser.o
# Generate parser from Bison grammar
$(BUILDDIR)/parser.tab.h $(BUILDDIR)/parser.tab.cc: $(SRCDIR)/parser.y
@mkdir -p $(BUILDDIR)
@echo "Generating parser from parser.y..."
$(BISON) $(BISONFLAGS) $(SRCDIR)/parser.y
mv y.tab.c $(BUILDDIR)/parser.tab.cc
mv y.tab.h $(BUILDDIR)/parser.tab.h
@echo "Parser generated: $(BUILDDIR)/parser.tab.{h,cc}"
# Clean build artifacts
clean:
@echo "Cleaning build artifacts..."
rm -rf $(BUILDDIR)
rm -f *.py
@echo "Clean complete"
# ==============================================================================
# Help Target
# ==============================================================================
help:
@echo "\nSaytring Compiler Makefile Help"
@echo "================================"
@echo ""
@echo "Available targets:"
@echo " all/build - Build the compiler (default)"
@echo " clean - Remove all build artifacts"
@echo " help - Show this help message"
@echo ""
@echo "Build directory: $(BUILDDIR)"
@echo "Source directory: $(SRCDIR)"
@echo "Target executable: $(BUILDDIR)/$(TARGET)"
@echo ""
@echo "Usage examples:"
@echo " make # Build everything"
@echo " make clean # Clean build artifacts"
@echo " make help # Show this help"