-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmakefile
More file actions
130 lines (111 loc) · 2.83 KB
/
Copy pathmakefile
File metadata and controls
130 lines (111 loc) · 2.83 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
123
124
125
126
127
128
129
130
# find OS
ifeq ($(OS), Windows_NT)
PLATFORM := Windows
EXE := .exe
DEL := rmdir /s /q
MKDIR := mkdir
SHELL := cmd.exe
else
UNAME_S := $(shell uname -s 2>/dev/null)
ifeq ($(UNAME_S), Linux)
PLATFORM := Linux
DEL := rm -rf
MKDIR := mkdir -p
else
PLATFORM := Unknown
DEL :=
MKDIR :=
endif
endif
# initial color
ifeq ($(PLATFORM), Windows)
GREEN :=
RED :=
RESET :=
else
GREEN := $(shell tput -Txterm setaf 2)
RED := $(shell tput -Txterm setaf 1)
RESET := $(shell tput -Txterm sgr0)
endif
CC = gcc
CFLAGS = -Wall -Wextra -O2 -MMD -MP
ASFLAGS = $(CFLAGS)
LDFLAGS =
SRC_DIR = src
OUT_DIR = out
# platform specific setting
ifeq ($(PLATFORM), Windows)
TARGET := $(OUT_DIR)/calculator.exe
SRC_S := $(filter-out $(SRC_DIR)/calculate_asm.S, $(wildcard $(SRC_DIR)/*.S))
else
TARGET = $(OUT_DIR)/calculator
SRC_S := $(filter-out $(SRC_DIR)/calculate_asm_win.S, $(wildcard $(SRC_DIR)/*.S))
endif
# C source code
SRCS_C := $(filter-out $(SRC_DIR)/t_%.c, $(wildcard $(SRC_DIR)/*.c))
# object files
OBJS_C := $(patsubst $(SRC_DIR)/%.c, $(OUT_DIR)/%.o, $(SRCS_C))
OBJS_S := $(patsubst $(SRC_DIR)/%.S, $(OUT_DIR)/%.o, $(SRC_S))
OBJS := $(OBJS_C) $(OBJS_S)
DEPS := $(OBJS:.o=.d)
# test file
TEST_SRCS := $(wildcard $(SRC_DIR)/t_*.c)
TEST_BINS := $(patsubst $(SRC_DIR)/t_%.c, $(OUT_DIR)/t_%$(EXE), $(TEST_SRCS))
TEST_DEPS := $(filter-out $(OUT_DIR)/main.o, $(OBJS))
.PHONY: all run test clean
all: $(TARGET)
# create out/ directory
$(OUT_DIR):
$(MKDIR) $(OUT_DIR)
# link all object file to binary file
$(TARGET): $(OBJS) | $(OUT_DIR)
$(CC) $(LDFLAGS) $^ -o $@
# compile .c -> .o
$(OUT_DIR)/%.o: $(SRC_DIR)/%.c | $(OUT_DIR)
$(CC) $(CFLAGS) -c $< -o $@
# compile .S -> .o
$(OUT_DIR)/%.o: $(SRC_DIR)/%.S | $(OUT_DIR)
$(CC) $(ASFLAGS) -c $< -o $@
# build test binary file
$(OUT_DIR)/t_%$(EXE): $(SRC_DIR)/t_%.c $(TEST_DEPS) | $(OUT_DIR)
$(CC) $(CFLAGS) $^ -o $@
ifeq ($(PLATFORM), Windows)
test: $(TEST_BINS)
@setlocal EnableDelayedExpansion & \
set pass=0& set fail=0& \
for %%t in ($(subst /,\,$(TEST_BINS))) do ( \
echo --- RUN %%t --- & \
%%t & \
(if !errorlevel! equ 0 ( set /a pass+=1 & echo PASS ) else ( set /a fail+=1 & echo FAIL )) & \
echo --- END %%t --- & \
echo. \
) & \
echo ------------------------------ & \
echo result: !pass! passed, !fail! failed & \
cmd /c exit !fail!
run: $(TARGET)
$(subst /,\,$(TARGET))
else
test: $(TEST_BINS)
@echo ""
@pass=0; fail=0; \
for t in $(TEST_BINS); do \
echo "--- RUN $$t ---"; \
if ./$$t; then \
echo "$(GREEN) PASS$(RESET)"; pass=$$((pass+1)); \
else \
echo "$(RED) FAIL$(RESET) (exit $$?)"; fail=$$((fail+1)); \
fi; \
echo "--- END $$t ---"; \
echo ""; \
done; \
echo "------------------------------"; \
echo "result: $$pass passed, $$fail failed"; \
[ $$fail -eq 0 ]
run: $(TARGET)
./$(TARGET)
endif
-include $(DEPS)
# clear all output file
clean:
$(DEL) $(OUT_DIR)