-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMakefile
64 lines (50 loc) · 1.36 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
CC := gcc
AR := ar
ARFLAGS := rcs
OBJ_DIR := obj
SRC_DIR := src
INC_DIR := includes
# Compiler flags
CFLAGS := -Wall -g
# List of source files
SRCS := $(wildcard $(SRC_DIR)/*.c)
# List of object files
OBJS := $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRCS))
# List of library files
LIB_DIR := lib
LIBS := $(patsubst $(OBJ_DIR)/%.o, $(LIB_DIR)/%.a, $(OBJS))
LIBS += $(patsubst $(OBJ_DIR)/%.o, $(LIB_DIR)/%.lib, $(OBJS))
TEST_DIR=tests
TESTS=$(wildcard $(TEST_DIR)/*.c)
TEST_BINS=$(patsubst $(TEST_DIR)/%.c, $(TEST_DIR)/bin/%.out, $(TESTS))
# Compile all the object files
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
@mkdir -p $(@D)
$(CC) $(CFLAGS) -I $(INC_DIR) -c $< -o $@
#Create a lib folder to store the .lib and .a files
$(LIB_DIR)/%.a: $(OBJ_DIR)/%.o
@mkdir -p $(@D)
$(AR) $(ARFLAGS) $@ $<
$(LIB_DIR)/%.lib: $(OBJ_DIR)/%.o
@mkdir -p $(@D)
$(AR) $(ARFLAGS) $@ $<
# Create Tests
$(TEST_DIR)/bin/%.out: $(TEST_DIR)/%.c $(OBJS)
@mkdir -p $(@D)
$(CC) $(CFLAGS) $< $(OBJS) -o $@ -lcriterion -lm
run_tests: $(TEST_BINS)
for test in $(TEST_BINS); do \
./$$test; \
done
# Run tests with Valgrind
valgrind_tests: $(TEST_BINS)
for test in $(TEST_BINS); do \
valgrind --leak-check=full --show-leak-kinds=all ./$$test; \
done
# Clean up the directory
.PHONY: clean
clean:
rm -f $(OBJ_DIR)/*.o $(TEST_DIR)/bin/* $(LIB_DIR)/*
# Build targets
lib: $(LIBS)
all: $(LIBS) $(TEST_BINS)