comparison GNUmakefile @ 1037:8f8ce47aba8a

make: switch to GNU make
author David Demelier <markand@malikania.fr>
date Tue, 27 Apr 2021 09:22:16 +0200
parents
children b7585f0c3934
comparison
equal deleted inserted replaced
1036:bafb5943cd35 1037:8f8ce47aba8a
1 #
2 # GNUmakefile -- GNU make for irccd
3 #
4 # Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
5 #
6 # Permission to use, copy, modify, and/or distribute this software for any
7 # purpose with or without fee is hereby granted, provided that the above
8 # copyright notice and this permission notice appear in all copies.
9 #
10 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 #
18
19 CC= cc
20 CFLAGS= -O0 -DNDEBUG -Wall -Wextra -Wno-cpp -g -fPIC
21
22 PREFIX= /usr/local
23 BINDIR= ${PREFIX}/bin
24 ETCDIR= ${PREFIX}/etc
25 INCDIR= ${PREFIX}/include
26 LIBDIR= ${PREFIX}/lib
27 MANDIR= ${PREFIX}/share/man
28 SHAREDIR= ${PREFIX}/share
29 VARDIR= ${PREFIX}/var
30
31 SSL= 1
32 JS= 1
33
34 MAJOR= 4
35 MINOR= 0
36 PATCH= 0
37
38 LIB_SRCS= lib/irccd/channel.c \
39 lib/irccd/conn.c \
40 lib/irccd/event.c \
41 lib/irccd/hook.c \
42 lib/irccd/irccd.c \
43 lib/irccd/log.c \
44 lib/irccd/plugin.c \
45 lib/irccd/rule.c \
46 lib/irccd/server.c \
47 lib/irccd/subst.c \
48 lib/irccd/util.c
49 LIB_OBJS= ${LIB_SRCS:.c=.o}
50 LIB_DEPS= ${LIB_SRCS:.c=.d}
51
52 IRCCD_SRCS= irccd/conf.c \
53 irccd/dl-plugin.c \
54 irccd/lex.c \
55 irccd/peer.c \
56 irccd/transport.c \
57 irccd/unicode.c
58
59 ifeq (${JS},1)
60 IRCCD_SRCS+= extern/libduktape/duktape.c \
61 irccd/js-plugin.c \
62 irccd/jsapi-chrono.c \
63 irccd/jsapi-directory.c \
64 irccd/jsapi-file.c \
65 irccd/jsapi-hook.c \
66 irccd/jsapi-irccd.c \
67 irccd/jsapi-logger.c \
68 irccd/jsapi-plugin.c \
69 irccd/jsapi-rule.c \
70 irccd/jsapi-server.c \
71 irccd/jsapi-system.c \
72 irccd/jsapi-timer.c \
73 irccd/jsapi-unicode.c \
74 irccd/jsapi-util.c
75 endif
76
77 IRCCD_OBJS= ${IRCCD_SRCS:.c=.o}
78 IRCCD_DEPS= ${IRCCD_SRCS:.c=.d}
79
80 MAN1= man/irccd.1 \
81 man/irccdctl.1
82
83 MAN3= man/irccd-api-chrono.3 \
84 man/irccd-api-directory.3 \
85 man/irccd-api-file.3 \
86 man/irccd-api-hook.3 \
87 man/irccd-api-logger.3 \
88 man/irccd-api-plugin.3 \
89 man/irccd-api-rule.3 \
90 man/irccd-api-server.3 \
91 man/irccd-api-system.3 \
92 man/irccd-api-timer.3 \
93 man/irccd-api-unicode.3 \
94 man/irccd-api-util.3 \
95 man/irccd-api.3 \
96 man/libirccd-channel.3 \
97 man/libirccd-compat.3 \
98 man/libirccd-event.3 \
99 man/libirccd-hook.3 \
100 man/libirccd-log.3 \
101 man/libirccd-rule.3 \
102 man/libirccd-subst.3 \
103 man/libirccd-util.3 \
104 man/libirccd.3
105
106 MAN5= man/irccd.conf.5
107
108 MAN7= man/irccd-ipc.7 \
109 man/irccd-templates.7
110
111 PLUGINS.js= ask auth hangman history joke logger plugin roulette tictactoe
112 PLUGINS.c= links
113
114 TESTS= tests/test-bot.c \
115 tests/test-channel.c \
116 tests/test-dl-plugin.c \
117 tests/test-event.c \
118 tests/test-log.c \
119 tests/test-rule.c \
120 tests/test-subst.c \
121 tests/test-util.c
122
123 ifeq (${JS},1)
124 TESTS+= tests/test-jsapi-chrono.c \
125 tests/test-jsapi-directory.c \
126 tests/test-jsapi-file.c \
127 tests/test-jsapi-irccd.c \
128 tests/test-jsapi-timer.c \
129 tests/test-jsapi-system.c \
130 tests/test-jsapi-unicode.c \
131 tests/test-jsapi-util.c \
132 tests/test-plugin-ask.c \
133 tests/test-plugin-auth.c \
134 tests/test-plugin-hangman.c \
135 tests/test-plugin-history.c \
136 tests/test-plugin-joke.c \
137 tests/test-plugin-logger.c \
138 tests/test-plugin-plugin.c \
139 tests/test-plugin-tictactoe.c
140 endif
141
142 TESTS_OBJS= ${TESTS:.c=}
143
144 # Compile flags.
145 DEFS= -D_BSD_SOURCE -DLIBBSD_OVERLAY -DTOP=\"`pwd`\"
146
147 # Include directories.
148 INCS= -I lib/
149 INCS+= -I ./
150 INCS+= -I extern/libgreatest/
151 INCS+= -I extern/libketopt/
152 INCS+= $(shell pkg-config --cflags libbsd-overlay)
153
154 ifeq (${SSL},1)
155 INCS+= $(shell pkg-config --cflags openssl)
156 endif
157 ifeq (${JS},1)
158 INCS+= -I extern/libduktape
159 endif
160
161 # Whole libraries for every binaries.
162 LIBS+= $(shell pkg-config --libs libbsd-overlay)
163
164 ifeq (${SSL},1)
165 LIBS+= $(shell pkg-config --libs openssl)
166 endif
167
168 # For config.h file.
169 ifeq (${SSL},1)
170 SED.ssl= s/@define WITH_SSL@/\#define IRCCD_WITH_SSL/
171 else
172 SED.ssl= /@define WITH_SSL@/d
173
174 endif
175 ifeq (${JS},1)
176 SED.js= s/@define WITH_JS@/\#define IRCCD_WITH_JS/
177 else
178 SED.js= /@define WITH_JS@/d
179 endif
180
181 # Per system commands.
182 OS:= $(shell uname -s)
183
184 ifeq (${OS},Darwin)
185 SHFLAGS= -undefined dynamic_lookup
186 else
187 SHFLAGS= -shared
188 endif
189
190 CMD.cc= ${CC} ${DEFS} ${INCS} ${CFLAGS} -MMD -c $< -o $@
191 CMD.ccld= ${CC} ${DEFS} ${INCS} ${CFLAGS} -o $@ $^ ${LIBS} ${LDFLAGS}
192 CMD.cchost= ${CC} -Wl,-E -o $@ ${DEFS} ${INCS} ${CFLAGS} \
193 -Wl,--whole-archive $^ -Wl,--no-whole-archive ${LIBS} ${LDFLAGS}
194 CMD.ccplg= ${CC} ${DEFS} ${INCS} ${CFLAGS} ${SHFLAGS} -o $@ $^ ${LIBS} ${LDFLAGS}
195
196 .SUFFIXES:
197 .SUFFIXES: .c .o .js
198
199 # Template for Javascript plugins.
200 define js-plugin =
201 PLUGINS.all+= plugin-${1}
202 PLUGINS.inst+= install-plugin-${1}
203
204 .PHONY: plugin-${1}
205 plugin-${1}:
206
207 .PHONY: install-plugin-${1}
208 install-plugin-${1}:
209 mkdir -p ${DESTDIR}${LIBDIR}/irccd
210 mkdir -p ${DESTDIR}${MANDIR}/man7
211 cp plugins/${1}/${1}.js ${DESTDIR}${LIBDIR}/irccd
212 cp plugins/${1}/${1}.7 ${DESTDIR}${MANDIR}/man7/irccd-plugin-${1}.7
213 endef
214
215 # Template for C native plugins.
216 define c-plugin =
217 PLUGINS.all+= plugin-${1}
218 PLUGINS.objs+= plugins/${1}/${1}.so
219 PLUGINS.inst+= install-plugin-${1}
220
221 .PHONY: plugin-${1}
222 plugin-${1}: plugins/${1}/${1}.so
223
224 .PHONY: install-plugin-${1}
225 install-plugin-${1}:
226 mkdir -p ${DESTDIR}${LIBDIR}/irccd
227 mkdir -p ${DESTDIR}${MANDIR}/man7
228 cp plugins/${1}/${1}.so ${DESTDIR}${LIBDIR}/irccd
229 cp plugins/${1}/${1}.7 ${DESTDIR}${MANDIR}/man7/irccd-plugin-${1}.7
230 endef
231
232 .c.o:
233 ${CMD.cc}
234
235 .c:
236 ${CMD.ccld}
237
238 all: irccd/irccd irccdctl/irccdctl
239
240 -include ${LIB_DEPS} ${IRCCD_DEPS}
241
242 lib/irccd/config.h: lib/irccd/config.h.in
243 sed -e "s,@ETCDIR@,${ETCDIR},g" \
244 -e "s,@LIBDIR@,${LIBDIR},g" \
245 -e "s,@SHAREDIR@,${SHAREDIR},g" \
246 -e "s,@VARDIR@,${VARDIR},g" \
247 -e "s,@MAJOR@,${MAJOR},g" \
248 -e "s,@MINOR@,${MINOR},g" \
249 -e "s,@PATCH@,${PATCH},g" \
250 -e "${SED.ssl}" \
251 -e "${SED.js}" \
252 < $< > $@
253
254 ${LIB_OBJS} ${IRCCD_OBJS} irccd/main.o: lib/irccd/config.h
255
256 irccd/conf.c: irccd/conf.y
257 bison -d -o $@ $<
258
259 irccd/lex.c: irccd/lex.l
260 flex -o $@ $<
261
262 irccd/irccd: irccd/main.o ${IRCCD_OBJS} ${LIB_OBJS}
263 ${CMD.cchost}
264
265 irccdctl/irccdctl: ${LIB_OBJS}
266
267 $(foreach p,${PLUGINS.js},$(eval $(call js-plugin,${p})))
268 $(foreach p,${PLUGINS.c},$(eval $(call c-plugin,${p})))
269
270 install:
271 mkdir -p ${DESTDIR}${BINDIR}
272 cp irccd/irccd ${DESTDIR}${BINDIR}
273 chmod 755 ${DESTDIR}${BINDIR}/irccd
274 cp irccdctl/irccdctl ${DESTDIR}${BINDIR}
275 chmod 755 ${DESTDIR}${BINDIR}/irccdctl
276 mkdir -p ${DESTDIR}${MANDIR}/man1
277 cp ${MAN1} ${DESTDIR}${MANDIR}/man1
278 mkdir -p ${DESTDIR}${MANDIR}/man3
279 cp ${MAN3} ${DESTDIR}${MANDIR}/man3
280 mkdir -p ${DESTDIR}${MANDIR}/man5
281 cp ${MAN5} ${DESTDIR}${MANDIR}/man5
282 mkdir -p ${DESTDIR}${MANDIR}/man7
283 cp ${MAN7} ${DESTDIR}${MANDIR}/man7
284 mkdir -p ${DESTDIR}${ETCDIR}
285 cp irccd/irccd.conf ${DESTDIR}${ETCDIR}/irccd.conf.sample
286 mkdir -p ${DESTDIR}${LIBDIR}/pkgconfig
287 sed -e "s,@MAJOR@,${MAJOR}," \
288 -e "s,@MINOR@,${MINOR}," \
289 -e "s,@PATCH@,${PATCH}," \
290 -e "s,@INCDIR@,${INCDIR}," \
291 -e "s,@SHFLAGS@,${SHFLAGS}," \
292 < lib/irccd.pc.in > ${DESTDIR}${LIBDIR}/pkgconfig/irccd.pc
293
294 install-plugins: ${PLUGINS.inst}
295
296 install-systemd:
297 mkdir -p ${DESTDIR}${LIBDIR}/systemd/system
298 sed -e "s,@PATH@,${BINDIR}/irccd," \
299 < systemd/irccd.service \
300 > ${DESTDIR}${LIBDIR}/systemd/system/irccd.service
301
302 tests/data/example-dl-plugin.so: tests/data/example-dl-plugin.c
303 ${CMD.ccplg}
304
305 ${TESTS_OBJS}: ${IRCCD_OBJS} ${LIB_OBJS} | irccd/irccd tests/data/example-dl-plugin.so
306
307 # Generic plugin build command.
308 plugins/%.so: plugins/%.c | ${IRCCD_OBJS}
309 ${CMD.ccplg}
310
311 # Plugin `links` require libcurl.
312 plugins/links/links.so: plugins/links/links.c ${LIB_OBJS}
313 ${CMD.ccplg} $(shell pkg-config --libs --cflags libcurl)
314
315 plugins: ${PLUGINS.all}
316
317 tests/%: tests/%.c
318 ${CMD.cchost}
319
320 tests: ${TESTS_OBJS}
321 for t in ${TESTS_OBJS}; do ./$$t -v; done
322
323 clean:
324 rm -f lib/irccd/config.h ${LIB_OBJS} ${LIB_DEPS}
325 rm -f irccd/irccd irccd/main.o irccd/main.d \
326 irccd/conf.c irccd/conf.h irccd/lex.c \
327 ${IRCCD_OBJS} ${IRCCD_DEPS}
328 rm -f irccdctl/irccdctl
329 rm -f ${TESTS_OBJS} tests/data/example-dl-plugin.so
330 rm -f ${PLUGINS.objs}
331
332 .PHONY: all clean install install-plugins install-systemd plugins tests