-
Notifications
You must be signed in to change notification settings - Fork 0
/
makefile
executable file
·88 lines (69 loc) · 1.67 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
# which platform to garget
TARGET ?= linux
# release type, debug builds one binary, release creates a dynamic library (or an optimized exec)
TYPE ?= debug
# name of the executable/library
FILENAME := datstruc
# test file which is not included when building a library
MAINFILE := test.c
# is the release build a library or an optimized executable
BUILDLIB := TRUE
LIBNAME := $(FILENAME)
CFLAGS := -c -Wall -Wpedantic -Wextra
LFLAGS := -g
ifeq ($(BUILDLIB), TRUE)
LIBCFLAGS := -fPIC
LIBLFLAGS := -shared
else
LIBCFLAGS :=
LIBLFLAGS :=
endif
ifeq ($(BUILDLIB), TRUE)
ifeq ($(TARGET), linux)
LIBNAME := lib$(FILENAME).so
endif
ifeq ($(TARGET), macOS)
LIBNAME := lib$(FILENAME).dylib
endif
ifeq ($(TARGET), Windows)
LIBNAME := $(FILENAME).dll
endif
endif
SRC := src/
DBG := build/debug/
REL := build/release/
SRCS := $(shell find . -name '*.c')
FILENAME := $(DBG)$(FILENAME)
LIBNAME := $(REL)$(LIBNAME)
DBGOBJS := $(SRCS)
DBGOBJS := $(subst $(SRC),$(DBG),$(DBGOBJS))
DBGOBJS := $(DBGOBJS:.c=.o)
RELOBJS := $(SRCS)
ifeq ($(BUILDLIB), TRUE)
RELOBJS := $(filter-out $(SRC)$(MAINFILE), $(RELOBJS))
endif
RELOBJS := $(subst $(SRC),$(REL),$(RELOBJS))
RELOBJS := $(RELOBJS:.c=.o)
RELOBJS := $(filter-out %/test.%,$(RELOBJS))
lib: $(LIBNAME)
test: $(FILENAME)
$(REL)%.o: CFLAGS += $(LIBCFLAGS)
$(LIBNAME): LFLAGS += $(LIBLFLAGS)
$(DBG):
@mkdir -p $@
$(REL):
@mkdir -p $@
$(SRC)%.h:
$(shell touch $@)
$(DBG)%.o: $(SRC)%.c $(SRC)%.h | $(DBG)
$(CC) $(CFLAGS) -o $@ $<
$(REL)%.o: $(SRC)%.c $(SRC)%.h | $(REL)
$(CC) $(CFLAGS) -o $@ $<
$(FILENAME): $(DBGOBJS)
$(CC) $(LFLAGS) -o $@ $^
$(LIBNAME): $(RELOBJS)
$(CC) $(LFLAGS) -o $@ $^
clean:
$(RM) $(REL)*
$(RM) $(DBG)*
.PHONY: clean