This repository was archived by the owner on Jun 3, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
166 lines (127 loc) · 4.26 KB
/
Copy pathMakefile
File metadata and controls
166 lines (127 loc) · 4.26 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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
-include config.mk
LIBNDM_MAJOR := 0
LIBNDM_MINOR := 0.0
-include version.mk
UNAME =$(shell uname)
VERSION=$(LIBNDM_MAJOR).$(LIBNDM_MINOR)
ifeq ($(CC),)
CC=cc
endif
ifeq ($(STRIP),)
STRIP=strip
endif
.PHONY: all static sanitize memory_debug tests install clean valgrind distclean
STRIPFLAGS = -s -R.comment -R.note -R.eh_frame -R.eh_frame_hdr
CPPFLAGS ?= -D_LARGEFILE_SOURCE \
-D_LARGEFILE64_SOURCE \
-D_FILE_OFFSET_BITS=64 \
-D_POSIX_C_SOURCE=200809L \
-D_DEFAULT_SOURCE \
-D_BSD_SOURCE \
-DLIBNDM_SBCS_SUPPORT
ifeq ($(UNAME),Darwin)
CPPFLAGS += -D_DARWIN_C_SOURCE
endif
CFLAGS ?= -g3 -pipe -fPIC -std=c99 \
-ffunction-sections -fdata-sections -fstack-protector-all \
-Wall -Winit-self -Wswitch-enum -Wundef \
-Wmissing-field-initializers -Wconversion \
-Wredundant-decls -Wstack-protector -ftabstop=4 -Wshadow \
-Wpointer-arith -I$(PWD)/include/ \
-Wempty-body -Waddress -Wvla -Wtype-limits
ifeq ($(UNAME),Darwin)
SONAME := -install_name
else
SONAME := -soname
LDFLAGS += -lrt
endif
CFLAGS += -pthread
LDFLAGS += -pthread
ifeq ($(filter sanitize,$(MAKECMDGOALS)),sanitize)
CFLAGS += -fsanitize=address -fsanitize=undefined
LDFLAGS += -fsanitize=address -fsanitize=undefined
ifneq ($(UNAME),Darwin)
CFLAGS += -fsanitize=leak
LDFLAGS += -fsanitize=leak
endif
endif
ifeq ($(filter valgrind,$(MAKECMDGOALS)),valgrind)
VG_TOOL := $(shell which valgrind)
VG := $(if $(VG_TOOL),,$(error "No valgrind executable found"))
endif
LIB_BASE := libndm
LIB_STATIC := $(LIB_BASE).a
LIB_SHARED := $(LIB_BASE).so
ifeq ($(filter static,$(MAKECMDGOALS)),static)
LIB := $(LIB_STATIC)
else
CFLAGS += -fPIC
LIB := $(LIB_SHARED)
endif
PREFIX = /usr/local
EXEC_PREFIX = $(PREFIX)
LIB_DIR = $(EXEC_PREFIX)/lib
INCLUDE_DIR = $(PREFIX)/include
OBJS = $(patsubst %.c,%.o,$(sort $(wildcard src/*.c)))
HEADERS = $(wildcard include/ndm/*.h)
TEST_DIR = tests
TEST_PREFIX = test_
TESTS = $(patsubst %.c,%,$(wildcard $(TEST_DIR)/$(TEST_PREFIX)*.c))
TEST_OBJ = $(TEST_DIR)/test.o
TEST_NO_AUTOEXEC=core core_event
EXAMPLE_DIR = examples
EXAMPLES = $(patsubst %.c,%,$(wildcard $(EXAMPLE_DIR)/*.c))
ifeq ($(filter memory_debug,$(MAKECMDGOALS)),memory_debug)
MEMDBG_OBJ := $(TEST_DIR)/memchk.o
CPPFLAGS += -D_MEMORY_LEAK_DEBUG -D_MEMORY_OVERFLOW_DEBUG
CFLAGS += -include tests/memchk.h
OBJS += $(MEMDBG_OBJ)
$(MEMDBG_OBJ): $(TEST_DIR)/memchk.c
@echo "CC $<"
@$(CC) $< $(CPPFLAGS) $(CFLAGS) -c -o $@ >/dev/null
endif
static all: $(LIB)
$(LIB_SHARED): Makefile $(HEADERS) $(OBJS)
@echo LD $@
@$(CC) -shared -Wl,$(SONAME),$(LIB_SHARED) -o $@ $(OBJS) $(LDFLAGS)
-@ls -k -1s $@
$(LIB_STATIC): Makefile $(HEADERS) $(OBJS)
@echo AR $@
@$(AR) rcs $@ $(OBJS)
-@ls -k -1s $@
EXEC_TESTS_ALL = \
$(shell find $(TEST_DIR) -name "$(TEST_PREFIX)*" -perm -u=x -type f)
EXEC_TESTS = $(filter-out $(addprefix \
$(TEST_DIR)/$(TEST_PREFIX),$(TEST_NO_AUTOEXEC)),$(EXEC_TESTS_ALL))
EXEC_EXAMPLES_ALL = $(shell find $(EXAMPLE_DIR) -perm -u=x -type f)
sanitize valgrind check: tests
-@for t in $(EXEC_TESTS); do echo; echo "Running $$t..."; $(VG) $$t; done
tests: $(LIB) $(TESTS)
examples: $(LIB) $(EXAMPLES)
memory_debug: check
install: $(LIB)
@if [ ! -d $(EXEC_PREFIX) ]; then mkdir -p $(EXEC_PREFIX); fi
@if [ ! -d $(INCLUDE_DIR) ]; then mkdir -p $(INCLUDE_DIR); fi
@if [ ! -d $(LIB_DIR) ]; then mkdir -p $(LIB_DIR); fi
cp -r include/* $(INCLUDE_DIR)
chmod 755 $(INCLUDE_DIR)/ndm
chmod 644 $(INCLUDE_DIR)/ndm/*.h
cp $(LIB) $(LIB_DIR)
cd $(LIB_DIR); chmod 755 $(LIB); (ldconfig || true) >/dev/null 2>&1;
$(TEST_OBJ): $(TEST_DIR)/test.c $(LIB)
@echo "CC $<"
@$(CC) $< $(CPPFLAGS) $(CFLAGS) -c -o $@ >/dev/null
$(TEST_DIR)/$(TEST_PREFIX)%: $(TEST_DIR)/$(TEST_PREFIX)%.c $(TEST_OBJ) $(LIB)
@echo "CC $<"
@$(CC) $< $(CPPFLAGS) $(CFLAGS) $(TEST_OBJ) $(OBJS) $(LDFLAGS) -o $@ >/dev/null
$(EXAMPLE_DIR)/%: $(EXAMPLE_DIR)/%.c $(LIB)
@echo "CC $<"
@$(CC) $< $(CPPFLAGS) $(CFLAGS) $(OBJS) $(LDFLAGS) -o $@ >/dev/null
%.o: %.c ../include/ndm/%.h
@echo "CC $<"
@$(CC) $< $(CPPFLAGS) $(CFLAGS) -c -o $@ >/dev/null
clean:
rm -f src/*.o *~ *.so *.o $(LIB_STATIC) $(LIB_SHARED) $(TEST_DIR)/*.o $(EXAMPLE_DIR)/*.o
rm -f $(EXEC_TESTS_ALL)
rm -f $(EXEC_EXAMPLES_ALL)
distclean: clean