-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathMakefile
114 lines (90 loc) · 2.19 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
# tool macros
CC := clang++
CCFLAG := `llvm-config --cxxflags --ldflags --system-libs --libs all`
INCLUDE_PATH := include
INCLUDES = -I include/ -I /usr/local/include
DBGFLAG := -g
CCOBJFLAG := $(CCFLAG)
# path macros
BUILD_PATH := build
OBJ_PATH := $(BUILD_PATH)/obj
BIN_PATH := $(BUILD_PATH)/bin
SRC_PATH := src
# flex
SCANNER := $(SRC_PATH)/scanner.cpp
# bison
PARSER := $(SRC_PATH)/parser.cpp
PARSER_HEADER := $(INCLUDE_PATH)/parser.hpp
# compile macros
TARGET_NAME := coo
ifeq ($(OS),Windows_NT)
TARGET_NAME := $(addsuffix .exe,$(TARGET_NAME))
endif
TARGET := $(BIN_PATH)/$(TARGET_NAME)
BUILTIN := $(OBJ_PATH)/builtin.o
MAIN_SRC := coo.cpp
# src files & obj files
SCANNER_SRC := $(SRC_PATH)/scanner.l
PARSER_SRC := $(SRC_PATH)/parser.y
BUILTIN_SRC := $(SRC_PATH)/builtin.c
SRC = $(foreach x, $(SRC_PATH), $(wildcard $(addprefix $(x)/*,.cpp)))
OBJ = $(addprefix $(OBJ_PATH)/, $(addsuffix .o, $(notdir $(basename $(SRC)))))
# test file
TEST_OUTPUT := test/output/*
# clean files list
DISTCLEAN_LIST := $(OBJ) \
$(PARSER_HEADER)\
$(PARSER)\
$(SCANNER)\
*.o
CLEAN_LIST := $(TARGET) \
$(DISTCLEAN_LIST) \
$(TARGET_NAME) \
$(TEST_OUTPUT)
# default rule
default: dirs
@$(MAKE) parser
@$(MAKE) all
parser: $(SCANNER)
all: $(TARGET) $(BUILTIN)
@echo "Making symlink: $(TARGET_NAME) -> $<"
@$(RM) $(TARGET_NAME)
@ln -s `readlink -f $(TARGET)` $(TARGET_NAME)
$(BUILTIN) : $(BUILTIN_SRC)
cc -o $@ -c $^
# non-phony targets
$(TARGET): $(OBJ)
$(CC) $(CCFLAG) $(INCLUDES) -o $@ $^
$(OBJ): $(SCANNER)
$(SCANNER): $(SCANNER_SRC) $(PARSER_HEADER)
flex -o $@ $^
$(PARSER_HEADER): $(PARSER)
mv $(SRC_PATH)/parser.hpp $@
$(PARSER): $(PARSER_SRC)
bison -d -o $@ $^
$(OBJ_PATH)/%.o: $(SRC_PATH)/%.c*
$(CC) $(CCOBJFLAG) $(INCLUDES) -o $@ -c $<
# phony rules
.PHONY: all
.PHONY: dirs
dirs:
@echo "Creating directories"
@mkdir -p $(dir $(BUILD_PATH))
@mkdir -p $(OBJ_PATH)
@mkdir -p $(BIN_PATH)
# test #
.PHONY: test
test: default
bash script/testall.sh
.PHONY: clean
clean:
@echo CLEAN $(CLEAN_LIST)
@rm -f $(CLEAN_LIST)
.PHONY: distclean
distclean:
@echo CLEAN $(CLEAN_LIST)
@rm -f $(DISTCLEAN_LIST)
.PHONY: testclean
testclean:
@echo CLEAN $(TEST_OUTPUT)
@rm -f $(TEST_OUTPUT)