-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
152 lines (112 loc) · 4.34 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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
###############################################################################
# Customizable values
###############################################################################
CC?=clang
CFLAGS?=
LDFLAGS?=
PREFIX?=/usr/local/bin
CFLAGS+=-I./include -std=c99
ifdef DEBUG
CFLAGS+=-g -DDEBUG
endif
###############################################################################
# Outputs
###############################################################################
MAINLIBNAME=libvoyeur
LIBNAMES=libvoyeur-exec libvoyeur-exit libvoyeur-open libvoyeur-close
TESTNAMES=test-exec test-exec-recursive test-open test-exec-and-open test-open-and-close test-exec-variants
TESTHARNESSNAME=voyeur-test
LIBNULLNAME=libnull
EXAMPLENAMES=voyeur-watch-exec voyeur-watch-open
###############################################################################
# Computed values
###############################################################################
UNAME := $(shell uname -s)
ifeq ($(UNAME), Darwin)
LIBSUFFIX=dylib
else
LIBSUFFIX=so
CFLAGS+=-fPIC -pthread
LDFLAGS+=-lbsd -ldl
endif
HEADERS=$(wildcard src/*.h) $(wildcard include/*.h)
LIBSOURCES=$(wildcard src/*.c)
LIBOBJECTS=$(patsubst src/%.c, build/%.o, $(LIBSOURCES))
TESTSOURCES=$(wildcard test/*.c)
TESTOBJECTS=$(patsubst test/%.c, build/%.o, $(TESTSOURCES))
OBJECTS=$(LIBOBJECTS)
LIBS=$(addprefix build/, $(addsuffix .$(LIBSUFFIX), $(LIBNAMES)))
MAINLIB=$(addprefix build/, $(addsuffix .$(LIBSUFFIX), $(MAINLIBNAME)))
MAINSTATICLIB=$(addprefix build/, $(addsuffix .a, $(MAINLIBNAME)))
TESTS=$(addprefix build/, $(TESTNAMES))
TESTHARNESS=$(addprefix build/, $(TESTHARNESSNAME))
LIBNULL=$(addprefix build/, $(addsuffix .$(LIBSUFFIX), $(LIBNULLNAME)))
EXAMPLES=$(addprefix build/, $(EXAMPLENAMES))
BUILDDIR=$(realpath build/)
ifeq ($(UNAME), Darwin)
define make-dynamic-lib
$(CC) $(CFLAGS) $^ -dynamiclib -install_name lib$*.$(LIBSUFFIX) -o $@ $(LDFLAGS)
endef
define make-exec
$(CC) $(CFLAGS) $< -o $@ -Lbuild -lvoyeur $(LDFLAGS)
endef
define make-test
$(CC) $(CFLAGS) $< -o $@ $(LDFLAGS)
endef
else
define make-dynamic-lib
$(CC) $(CFLAGS) $^ -shared -Wl,-soname,lib$*.$(LIBSUFFIX) -o $@ $(LDFLAGS)
endef
define make-exec
$(CC) $(CFLAGS) -Wl,-rpath '-Wl,$$ORIGIN' $< -o $@ -Lbuild -lvoyeur $(LDFLAGS)
endef
define make-test
$(CC) $(CFLAGS) $< -o $@ $(LDFLAGS)
endef
endif
.PHONY: default check examples install clean
###############################################################################
# Library targets
###############################################################################
default: build $(LIBS) $(MAINLIB) $(MAINSTATICLIB)
build:
mkdir -p $@
$(OBJECTS): build/%.o : src/%.c $(HEADERS)
$(CC) $(CFLAGS) -c $< -o $@
$(LIBS): build/lib%.$(LIBSUFFIX) : build/%.o build/net.o build/env.o build/event.o build/util.o
$(make-dynamic-lib)
$(MAINLIB): build/lib%.$(LIBSUFFIX) : build/%.o build/net.o build/env.o build/event.o build/util.o
$(make-dynamic-lib)
$(MAINSTATICLIB): build/lib%.a : build/%.o build/net.o build/env.o build/event.o build/util.o
$(AR) rcs $@ $^
###############################################################################
# Test targets
###############################################################################
check: default $(TESTHARNESS) $(TESTS) $(LIBNULL)
cd build && ./$(TESTHARNESSNAME)
$(TESTHARNESS): build/% : test/%.c $(LIBS)
$(make-exec)
$(TESTS): build/% : test/%.c $(LIBS)
$(make-test)
$(LIBNULL): build/lib%.$(LIBSUFFIX) : test/%.c
$(make-dynamic-lib)
###############################################################################
# Example targets
###############################################################################
examples: default $(EXAMPLES)
$(EXAMPLES): build/% : examples/%.c $(HEADERS)
$(make-exec)
###############################################################################
# Install targets
###############################################################################
install: default
install -c $(MAINLIB) $(MAINSTATICLIB) $(LIBS) $(PREFIX)
uninstall:
rm $(addprefix $(PREFIX)/, $(notdir $(MAINLIB)))
rm $(addprefix $(PREFIX)/, $(notdir $(MAINSTATICLIB)))
rm $(addprefix $(PREFIX)/, $(notdir $(LIBS)))
###############################################################################
# Utility targets
###############################################################################
clean:
rm -rf build