-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
155 lines (114 loc) · 4.65 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
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
NPROC = $(shell grep -c 'processor' /proc/cpuinfo)
MAKEFLAGS += -j$(NPROC)
BUILD_DIR := build
COMMON_OBJ_DIR := $(BUILD_DIR)/obj/common
ASM_OBJ_DIR := $(BUILD_DIR)/obj/assembler
LNK_OBJ_DIR := $(BUILD_DIR)/obj/linker
EMU_OBJ_DIR := $(BUILD_DIR)/obj/emulator
DIR_LIBS := lib
DIR_INC := include
COMMON_INC := $(DIR_INC)
ASM_INC := $(DIR_INC)/assembler
LNK_INC := $(DIR_INC)/linker
EMU_INC := $(DIR_INC)/emulator
DEBUG_FLAG = -D DEBUG_PRINT=0
#executables
ASSEMBLER := $(BUILD_DIR)/assembler
LINKER := $(BUILD_DIR)/linker
EMULATOR := $(BUILD_DIR)/emulator
#misc dir
MISC_DIR := misc
MISC_SRC = $(filter-out parser2.yy, $(shell find ./$(MISC_DIR) -type f -printf "%P\n"))
MISC_OBJ_BASE = $(addsuffix .o, $(basename $(MISC_SRC)))
MISC_OBJ = $(addprefix $(ASM_OBJ_DIR)/, $(MISC_OBJ_BASE))
LEXER_SRC := lexer.ll
PARSER_SRC := parser.yy
LEXER_CC := $(addsuffix .cc, $(basename $(LEXER_SRC)))
PARSER_CC := $(addsuffix .cc, $(basename $(PARSER_SRC)))
#source dirs
SRC_DIR := src
COMMON_DIR ::= $(SRC_DIR)/common
ASM_DIR := $(SRC_DIR)/assembler
LNK_DIR := $(SRC_DIR)/linker
EMU_DIR := $(SRC_DIR)/emulator
#source files
COMMON_SRC = $(shell find ./$(COMMON_DIR) -name "*.cpp" -printf "%P\n")
ASM_SRC = $(shell find ./$(ASM_DIR) -name "*.cpp" -printf "%P\n")
LNK_SRC = $(shell find ./$(LNK_DIR) -name "*.cpp" -printf "%P\n")
EMU_SRC = $(shell find ./$(EMU_DIR) -name "*.cpp" -printf "%P\n")
#default flags
CXXFLAGS = -g -Wall -Werror -Wextra -Wpedantic -std=c++17 -pedantic-errors -Wno-attributes -Wno-ignored-attributes
CXXFLAGS += ${DEBUG_FLAG}
CXXFLAGS += -MMD -MP -MF"${@:%.o=%.d}"
LDLIBS := --library-path . $(patsubst %,--library=:%,${LIBS})
COMMON_OBJ = $(addprefix $(COMMON_OBJ_DIR)/, $(COMMON_SRC:.cpp=.o))
vpath $(COMMON_SRC)/%.cpp $(sort $(dir $(COMMON_SRC)))
ASM_OBJ = $(addprefix $(ASM_OBJ_DIR)/, $(ASM_SRC:.cpp=.o))
vpath $(ASM_SRC)/%.cpp $(sort $(dir $(ASM_SRC)))
LNK_OBJ = $(addprefix $(LNK_OBJ_DIR)/, $(LNK_SRC:.cpp=.o))
vpath $(LNK_SRC)/%.cpp $(sort $(dir $(LNK_SRC)))
EMU_OBJ = $(addprefix $(EMU_OBJ_DIR)/, $(EMU_SRC:.cpp=.o))
vpath $(EMU_SRC)/%.cpp $(sort $(dir $(EMU_SRC)))
all: assembler linker emulator
$(COMMON_OBJ_DIR)/%.o: $(COMMON_DIR)/%.cpp Makefile
@mkdir -p $(dir $@)
${CXX} -c ${CXXFLAGS} -I $(COMMON_INC) -o $@ $<
$(ASM_DIR)/$(PARSER_CC): $(MISC_DIR)/$(PARSER_SRC)
@mkdir -p $(dir $@)
bison -Wcounterexamples -o $@ $< # Works with bison 3.8.1
# bison -d -o $@ $< # for compatibility with bison 3.5.1
for file in $(ASM_DIR)/*.hh; do mv $$file $(ASM_INC); done
$(ASM_DIR)/$(LEXER_CC): $(MISC_DIR)/$(LEXER_SRC) | $(MISC_DIR)/$(PARSER_SRC)
@mkdir -p $(dir $@)
flex -d -o $@ $<
$(ASM_OBJ_DIR)/parser.o: $(ASM_DIR)/$(PARSER_CC) Makefile
@mkdir -p $(dir $@)
g++ -c ${CXXFLAGS} -Wno-unused-function -I $(ASM_INC) -I $(COMMON_INC) -o $@ $<
$(ASM_OBJ_DIR)/lexer.o: $(ASM_DIR)/$(LEXER_CC) Makefile | $(ASM_DIR)/$(PARSER_CC)
@mkdir -p $(dir $@)
g++ -c ${CXXFLAGS} -Wno-unused-function -I $(ASM_INC) -I $(COMMON_INC) -o $@ $<
$(ASM_OBJ_DIR)/%.o: $(ASM_DIR)/%.cpp $(COMMON_OBJ) Makefile
@mkdir -p $(dir $@)
${CXX} -c ${CXXFLAGS} -I $(ASM_INC) -I $(COMMON_INC) -o $@ $<
$(LNK_OBJ_DIR)/%.o: $(LNK_DIR)/%.cpp $(COMMON_OBJ) Makefile
@mkdir -p $(dir $@)
g++ -c $(CXXFLAGS) -I $(LNK_INC) -I $(COMMON_INC) -o $@ $<
$(EMU_OBJ_DIR)/%.o: $(EMU_DIR)/%.cpp $(COMMON_OBJ) Makefile
@mkdir -p $(dir $@)
g++ -c $(CXXFLAGS) -I $(EMU_INC) -I $(COMMON_INC) -o $@ $<
$(ASSEMBLER): $(MISC_OBJ) $(ASM_OBJ) $(COMMON_OBJ)
@mkdir -p $(dir $@)
g++ $(CXXFLAGS) -I $(ASM_INC) -o $@ $^
$(LINKER): $(LNK_OBJ) $(COMMON_OBJ)
@mkdir -p $(dir $@)
g++ $(CXXFLAGS) -I $(LNK_INC) -o $@ $^
$(EMULATOR): $(EMU_OBJ) $(COMMON_OBJ)
@mkdir -p $(dir $@)
g++ $(CXXFLAGS) -I $(EMU_INC) -o $@ $^
-include $(COMMON_OBJ:.o=.d)
-include $(ASM_OBJ:.o=.d)
-include $(LNK_OBJ:.o=.d)
-include $(EMU_OBJ:.o=.d)
assembler: $(ASSEMBLER)
linker: $(LINKER)
emulator: $(EMULATOR)
clean: clean_tests
rm -rf $(BUILD_DIR)
find . \( -name "*.cc" -o -name "*.hh" \) -type f -delete
clean_tests:
@cd ./tests/nivo-a; rm -f *.o program.hex assembler linker emulator
@cd ./tests/nivo-b; rm -f *.o program.hex assembler linker emulator
test_a:
@cd ./tests/nivo-a; rm -f *.o program.hex assembler linker emulator
@cp ./build/assembler ./tests/nivo-a/assembler
@cp ./build/linker ./tests/nivo-a/linker
@cp ./build/emulator ./tests/nivo-a/emulator;
@cd ./tests/nivo-a; chmod +x start.sh; ./start.sh
test_b:
@cd ./tests/nivo-b; rm -f *.o program.hex assembler linker emulator
@cp ./build/assembler ./tests/nivo-b/assembler
@cp ./build/linker ./tests/nivo-b/linker
@cp ./build/emulator ./tests/nivo-b/emulator;
@cd ./tests/nivo-b; chmod +x start.sh; ./start.sh
.PHONY: all assembler linker emulator clean clean_tests test_a test_b
.PRECIOUS: %.o