-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMakefile
80 lines (61 loc) · 2.43 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
include Makefile.config
.PHONY: all obj install uninstall clean unit_test unit_test_dev valgrind fmt
.DELETE_ON_ERROR:
PREFIX := /usr/local
INCDIR := $(PREFIX)/include
LIBDIR := $(PREFIX)/lib
SRCDIR := src
DEPSDIR := deps
TESTDIR := t
EXAMPLEDIR := examples
INCDIR := include
DYNAMIC_TARGET := $(LIBNAME).so
STATIC_TARGET := $(LIBNAME).a
EXAMPLE_TARGET := example
TEST_TARGET := test
SRC := $(wildcard $(SRCDIR)/*.c)
TESTS := $(wildcard $(TESTDIR)/*.c)
DEPS := $(filter-out $(wildcard $(DEPSDIR)/libtap/*), $(wildcard $(DEPSDIR)/*/*.c))
TEST_DEPS := $(wildcard $(DEPSDIR)/libtap/*.c)
OBJ := $(addprefix obj/, $(notdir $(SRC:.c=.o)) $(notdir $(DEPS:.c=.o)))
INCLUDES := -I$(INCDIR) -I$(DEPSDIR) -I$(SRCDIR)
LIBS := -lm
STRICT := -Wall -Werror -Wextra -Wno-missing-field-initializers \
-Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition \
-Wno-unused-parameter -Wno-unused-function -Wno-unused-value \
-pedantic
CFLAGS := -Wall -Wextra -pedantic -std=c17 $(INCLUDES)
$(DYNAMIC_TARGET): CFLAGS += -shared
$(DYNAMIC_TARGET): $(OBJ)
$(CC) $(CFLAGS) $(STRICT) $^ $(LIBS) -o $@
$(STATIC_TARGET): $(OBJ)
$(AR) rcs $@ $^
obj/%.o: $(SRCDIR)/%.c $(INCDIR)/$(LIBNAME).h | obj
$(CC) $< -c $(CFLAGS) $(STRICT) -o $@
obj/%.o: $(DEPSDIR)/*/%.c | obj
$(CC) $< -c $(CFLAGS) $(STRICT) -o $@
$(EXAMPLE_TARGET): $(STATIC_TARGET)
$(CC) $(CFLAGS) $(EXAMPLEDIR)/main.c $< $(LIBS) -o $@
all: $(DYNAMIC_TARGET) $(STATIC_TARGET)
obj:
@mkdir -p obj
install: $(STATIC_TARGET)
@mkdir -p ${LIBDIR} && cp -f ${STATIC_TARGET} ${LIBDIR}/$@
@mkdir -p ${INCDIR} && cp -r $(INCDIR)/$(LIBNAME).h ${INCDIR}
uninstall:
@rm -f ${LIBDIR}/$(STATIC_TARGET)
@rm -f ${INCDIR}/libys.h
clean:
@rm -f $(OBJ) $(STATIC_TARGET) $(DYNAMIC_TARGET) $(EXAMPLE_TARGET) $(TEST_TARGET)
unit_test: $(STATIC_TARGET)
$(CC) $(CFLAGS) $(TESTS) $(TEST_DEPS) $(STATIC_TARGET) -I$(SRCDIR) $(LIBS) -o $(TEST_TARGET)
./$(TEST_TARGET)
$(MAKE) clean
unit_test_dev:
ls $(INCDIR)/*.h $(SRCDIR)/*.{h,c} $(TESTDIR)/*.{h,c} | entr -s 'make -s unit_test'
valgrind: $(STATIC_TARGET)
$(CC) $(CFLAGS) $(TESTS) $(TEST_DEPS) $< $(LIBS) -o $(TEST_TARGET)
$(VALGRIND) --leak-check=full --track-origins=yes -s ./$(TEST_TARGET)
@$(MAKE) clean
fmt:
@$(FMT) -i $(wildcard $(SRCDIR)/*) $(wildcard $(TESTDIR)/*) $(wildcard $(INCDIR)/*) $(wildcard $(EXAMPLEDIR)/*)