forked from lavabit/magma
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
232 lines (187 loc) · 7.41 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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
#!/usr/bin/make
#
# The Magma Makefile
#
#########################################################################
TOPDIR = $(realpath .)
MFLAGS =
MAKEFLAGS = --output-sync=target --jobs=6
# Identity of this package.
PACKAGE_NAME = Magma Daemon
PACKAGE_TARNAME = magma
PACKAGE_VERSION = 6.2
PACKAGE_STRING = $(PACKAGE_NAME) $(PACKAGE_VERSION)
PACKAGE_BUGREPORT = [email protected]
PACKAGE_URL = https://lavabit.com
ifeq ($(OS),Windows_NT)
HOSTTYPE := "Windows"
LIBPREFIX :=
DYNLIBEXT := ".dll"
STATLIBEXT := ".lib"
EXEEXT := ".exe"
else
HOSTTYPE := $(shell uname -s)
LIBPREFIX := "lib"
DYNLIBEXT := ".so"
STATLIBEXT := ".a"
EXEEXT :=
endif
MAGMA_PROGRAM = $(addsuffix $(EXEEXT), magmad)
CHECK_PROGRAM = $(addsuffix $(EXEEXT), magmad.check)
MAGMA_VERSION = $(PACKAGE_VERSION).$(shell git log --format='%H' | wc -l)
MAGMA_COMMIT = $(shell git log --format="%H" -n 1 | cut -c33-40)
MAGMA_TIMESTAMP = $(shell date +'%Y%m%d.%H%M')
# Source Files
BUILD_SRCFILES = src/engine/status/build.c
MAGMA_SRCDIRS = $(shell find src -type d -print)
MAGMA_SRCFILES = $(filter-out src/engine/status/build.c, $(foreach dir,$(MAGMA_SRCDIRS), $(wildcard $(dir)/*.c)))
CHECK_SRCDIRS = $(shell find check -type d -print)
CHECK_SRCFILES = $(foreach dir,$(CHECK_SRCDIRS), $(wildcard $(dir)/*.c))
# Bundled Dependency Include Paths
INCDIR = $(TOPDIR)/lib/sources
INCDIRS = spf2/src/include clamav/libclamav mysql/include openssl/include lzo/include xml2/include \
zlib bzip2 tokyocabinet memcached dkim/libopendkim dspam/src jansson/src gd png jpeg freetype/include utf8proc
# Compiler Parameters
CC = gcc
CFLAGS = -std=gnu99 -O0 -fPIC -fmessage-length=0 -ggdb3 -rdynamic -c $(CFLAGS_WARNINGS) -MMD
CFLAGS_WARNINGS = -Wall -Werror -Winline -Wformat-security -Warray-bounds
CFLAGS_PEDANTIC = -Wextra -Wpacked -Wunreachable-code -Wformat=2
CINCLUDES = $(addprefix -I,$(INCLUDE_DIR_ABSPATHS))
MAGMA_CINCLUDES = -Isrc $(CINCLUDES)
CHECK_CINCLUDES = -Icheck $(MAGMA_CINCLUDES)
CDEFINES = -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -DHAVE_NS_TYPE -DFORTIFY_SOURCE=2 -DMAGMA_PEDANTIC
CDEFINES.build.c = \
-DMAGMA_VERSION=\"$(MAGMA_VERSION)\" \
-DMAGMA_COMMIT=\"$(MAGMA_COMMIT)\" \
-DMAGMA_TIMESTAMP=\"$(MAGMA_TIMESTAMP)\"
# Linker Parameters
LD = gcc
LDFLAGS = -rdynamic
MAGMA_DYNAMIC = -lrt -ldl -lpthread
CHECK_DYNAMIC = $(MAGMA_DYNAMIC) -lcheck
MAGMA_STATIC =
CHECK_STATIC =
# Archiver Parameters
AR = ar
ARFLAGS = rcs
# Hidden Directory for Dependency Files
DEPDIR = .deps
BUILD_DEPFILES = $(patsubst %.c,$(OBJDIR)/%.d,$(BUILD_SRCFILES))
MAGMA_DEPFILES = $(patsubst %.c,$(DEPDIR)/%.d,$(MAGMA_SRCFILES))
CHECK_DEPFILES = $(patsubst %.c,$(DEPDIR)/%.d,$(CHECK_SRCFILES))
# Hidden Directory for Object Files
OBJDIR = .objs
BUILD_OBJFILES = $(patsubst %.c,$(OBJDIR)/%.o,$(BUILD_SRCFILES))
MAGMA_OBJFILES = $(patsubst %.c,$(OBJDIR)/%.o,$(MAGMA_SRCFILES))
CHECK_OBJFILES = $(patsubst %.c,$(OBJDIR)/%.o,$(CHECK_SRCFILES))
# Modified Object Files
#MODIFIED_SRCFILES = $(shell git ls-files --modified --others src)
#MODIFIED_SRCFILES = $(shell find src -mmin -1)
#MODIFIED_OBJFILES = $(patsubst %.c,$(OBJDIR)/%.o,$(MODIFIED_SRCFILES))
# Resolve the External Include Directory Paths
INCLUDE_DIR_VPATH = $(INCDIR) /usr/include /usr/local/include
INCLUDE_DIR_SEARCH = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, ,$(INCLUDE_DIR_VPATH)))))
INCLUDE_DIR_ABSPATHS += $(foreach target,$(INCDIRS), $(call INCLUDE_DIR_SEARCH,$(target)))
# Other External programs
MV = mv --force
RM = rm --force
RMDIR = rmdir --parents --ignore-fail-on-non-empty
MKDIR = mkdir --parents
RANLIB = ranlib
# Text Coloring
RED = $$(tput setaf 1)
BLUE = $$(tput setaf 4)
GREEN = $$(tput setaf 2)
WHITE = $$(tput setaf 7)
YELLOW = $$(tput setaf 3)
# Text Weighting
BOLD = $$(tput bold)
NORMAL = $$(tput sgr0)
ifeq ($(VERBOSE),yes)
RUN =
else
RUN = @
VERBOSE = no
endif
# So we can tell the user what happened
ifdef MAKECMDGOALS
TARGETGOAL += $(MAKECMDGOALS)
else
TARGETGOAL = $(.DEFAULT_GOAL)
endif
# Special Make Directives
#.NOTPARALLEL: warning conifg
.PHONY: warning config finished all check incremental
all: config warning $(MAGMA_PROGRAM) $(CHECK_PROGRAM) finished
check: config warning $(CHECK_PROGRAM)
warning:
ifeq ($(VERBOSE),no)
@echo
@echo 'For a more verbose output'
@echo ' make '$(GREEN)'VERBOSE=yes' $(NORMAL)$(TARGETGOAL)
@echo
endif
config:
@echo
@echo 'TARGET' $(TARGETGOAL)
@echo 'VERBOSE' $(VERBOSE)
@echo
@echo 'VERSION ' $(MAGMA_VERSION)
@echo 'COMMIT '$(MAGMA_COMMIT)
@echo 'DATE ' $(MAGMA_TIMESTAMP)
@echo 'HOST ' $(HOSTTYPE)
finished:
ifeq ($(VERBOSE),no)
@echo 'Finished' $(BOLD)$(GREEN)$(TARGETGOAL)$(NORMAL)
endif
# Alias the target names on Windows to the equivalent without the exe extension.
ifeq ($(HOSTTYPE),Windows)
.PHONY: $(basename $(MAGMA_PROGRAM(OBJDIR)/src/%.o: src/%.cM))
$(basename $(MAGMA_PROGRAM)): $(MAGMA_PROGRAM)
.PHONY: $(basename $(CHECK_PROGRAM))
$(basename $(CHECK_PROGRAM)): $(CHECK_PROGRAM)
endif
# Delete the compiled program along with the generated object and dependency files
clean:
@$(RM) $(MAGMA_PROGRAM) $(CHECK_PROGRAM) $(MAGMA_OBJFILES) $(CHECK_OBJFILES) $(MAGMA_DEPFILES) $(CHECK_DEPFILES)
@for d in $(sort $(dir $(MAGMA_OBJFILES)) $(dir $(CHECK_OBJFILES))); do if test -d "$$d"; then $(RMDIR) "$$d"; fi; done
@for d in $(sort $(dir $(MAGMA_DEPFILES)) $(dir $(CHECK_DEPFILES))); do if test -d "$$d"; then $(RMDIR) "$$d"; fi; done
@echo 'Finished' $(BOLD)$(GREEN)$(TARGETGOAL)$(NORMAL)
incremental: $(MODIFIED_OBJFILES)
# The Build Information
$(BUILD_OBJFILES): $(BUILD_SRCFILES) $(MAGMA_SRCFILES) $(CHECK_SRCFILES)
# Construct the magma daemon executable file
$(MAGMA_PROGRAM): $(MAGMA_OBJFILES) $(BUILD_OBJFILES)
ifeq ($(VERBOSE),no)
@echo 'Constructing' $(RED)$@$(NORMAL)
else
@echo
endif
$(RUN)$(LD) $(LDFLAGS) --output='$@' $(MAGMA_OBJFILES) $(BUILD_OBJFILES) -Wl,--start-group $(MAGMA_STATIC) -Wl,--end-group $(MAGMA_DYNAMIC)
# Construct the magma unit test executable
$(CHECK_PROGRAM): $(CHECK_OBJFILES) $(filter-out .objs/src/magma.o, $(MAGMA_OBJFILES)) $(BUILD_OBJFILES)
ifeq ($(VERBOSE),no)
@echo 'Constructing' $(RED)$@$(NORMAL)
else
@echo
endif
$(RUN)$(LD) $(LDFLAGS) --output='$@' $(CHECK_OBJFILES) $(filter-out .objs/src/magma.o, $(MAGMA_OBJFILES)) $(BUILD_OBJFILES) -Wl,--start-group $(CHECK_STATIC) -Wl,--end-group $(CHECK_DYNAMIC)
# The Magma Daemon Object files
$(OBJDIR)/src/%.o: src/%.c
ifeq ($(VERBOSE),no)
@echo 'Building' $(YELLOW)$<$(NORMAL)
endif
@test -d $(DEPDIR)/$(dir $<) || $(MKDIR) $(DEPDIR)/$(dir $<)
@test -d $(OBJDIR)/$(dir $<) || $(MKDIR) $(OBJDIR)/$(dir $<)
$(RUN)$(CC) $(CFLAGS) $(CFLAGS.$(<F)) $(CDEFINES) $(CDEFINES.$(<F)) $(MAGMA_CINCLUDES) -MF"$(<:%.c=$(DEPDIR)/%.d)" -MT"$@" -o"$@" "$<"
# The Magma Unit Test Object files
$(OBJDIR)/check/%.o: check/%.c
ifeq ($(VERBOSE),no)
@echo 'Building' $(YELLOW)$<$(NORMAL)
endif
@test -d $(DEPDIR)/$(dir $<) || $(MKDIR) $(DEPDIR)/$(dir $<)
@test -d $(OBJDIR)/$(dir $<) || $(MKDIR) $(OBJDIR)/$(dir $<)
$(RUN)$(CC) $(CFLAGS) $(CFLAGS.$(<F)) $(CDEFINES) $(CDEFINES.$(<F)) $(CHECK_CINCLUDES) -MF"$(<:%.c=$(DEPDIR)/%.d)" -MT"$@" -o"$@" "$<"
# If we've already generated dependency files, use them to see if a rebuild is required
-include $(MAGMA_DEPFILES) $(CHECK_DEPFILES) $(BUILD_DEPFILES)
# vim:set softtabstop=4 shiftwidth=4 tabstop=4: