diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GNUmakefile	Tue Apr 27 09:22:16 2021 +0200
@@ -0,0 +1,332 @@
+#
+# GNUmakefile -- GNU make for irccd
+#
+# Copyright (c) 2013-2021 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+CC=             cc
+CFLAGS=         -O0 -DNDEBUG -Wall -Wextra -Wno-cpp -g -fPIC
+
+PREFIX=         /usr/local
+BINDIR=         ${PREFIX}/bin
+ETCDIR=         ${PREFIX}/etc
+INCDIR=         ${PREFIX}/include
+LIBDIR=         ${PREFIX}/lib
+MANDIR=         ${PREFIX}/share/man
+SHAREDIR=       ${PREFIX}/share
+VARDIR=         ${PREFIX}/var
+
+SSL=            1
+JS=             1
+
+MAJOR=          4
+MINOR=          0
+PATCH=          0
+
+LIB_SRCS=       lib/irccd/channel.c \
+                lib/irccd/conn.c \
+                lib/irccd/event.c \
+                lib/irccd/hook.c \
+                lib/irccd/irccd.c \
+                lib/irccd/log.c \
+                lib/irccd/plugin.c \
+                lib/irccd/rule.c \
+                lib/irccd/server.c \
+                lib/irccd/subst.c \
+                lib/irccd/util.c
+LIB_OBJS=       ${LIB_SRCS:.c=.o}
+LIB_DEPS=       ${LIB_SRCS:.c=.d}
+
+IRCCD_SRCS=     irccd/conf.c \
+                irccd/dl-plugin.c \
+                irccd/lex.c \
+                irccd/peer.c \
+                irccd/transport.c \
+                irccd/unicode.c
+
+ifeq (${JS},1)
+IRCCD_SRCS+=    extern/libduktape/duktape.c \
+                irccd/js-plugin.c \
+                irccd/jsapi-chrono.c \
+                irccd/jsapi-directory.c \
+                irccd/jsapi-file.c \
+                irccd/jsapi-hook.c \
+                irccd/jsapi-irccd.c \
+                irccd/jsapi-logger.c \
+                irccd/jsapi-plugin.c \
+                irccd/jsapi-rule.c \
+                irccd/jsapi-server.c \
+                irccd/jsapi-system.c \
+                irccd/jsapi-timer.c \
+                irccd/jsapi-unicode.c \
+                irccd/jsapi-util.c
+endif
+
+IRCCD_OBJS=     ${IRCCD_SRCS:.c=.o}
+IRCCD_DEPS=     ${IRCCD_SRCS:.c=.d}
+
+MAN1=           man/irccd.1 \
+                man/irccdctl.1
+
+MAN3=           man/irccd-api-chrono.3 \
+                man/irccd-api-directory.3 \
+                man/irccd-api-file.3 \
+                man/irccd-api-hook.3 \
+                man/irccd-api-logger.3 \
+                man/irccd-api-plugin.3 \
+                man/irccd-api-rule.3 \
+                man/irccd-api-server.3 \
+                man/irccd-api-system.3 \
+                man/irccd-api-timer.3 \
+                man/irccd-api-unicode.3 \
+                man/irccd-api-util.3 \
+                man/irccd-api.3 \
+                man/libirccd-channel.3 \
+                man/libirccd-compat.3 \
+                man/libirccd-event.3 \
+                man/libirccd-hook.3 \
+                man/libirccd-log.3 \
+                man/libirccd-rule.3 \
+                man/libirccd-subst.3 \
+                man/libirccd-util.3 \
+                man/libirccd.3
+
+MAN5=           man/irccd.conf.5
+
+MAN7=           man/irccd-ipc.7 \
+                man/irccd-templates.7
+
+PLUGINS.js=     ask auth hangman history joke logger plugin roulette tictactoe
+PLUGINS.c=      links
+
+TESTS=          tests/test-bot.c                \
+                tests/test-channel.c            \
+                tests/test-dl-plugin.c          \
+                tests/test-event.c              \
+                tests/test-log.c                \
+                tests/test-rule.c               \
+                tests/test-subst.c              \
+                tests/test-util.c
+
+ifeq (${JS},1)
+TESTS+=         tests/test-jsapi-chrono.c       \
+                tests/test-jsapi-directory.c    \
+                tests/test-jsapi-file.c         \
+                tests/test-jsapi-irccd.c        \
+                tests/test-jsapi-timer.c        \
+                tests/test-jsapi-system.c       \
+                tests/test-jsapi-unicode.c      \
+                tests/test-jsapi-util.c         \
+                tests/test-plugin-ask.c         \
+                tests/test-plugin-auth.c        \
+                tests/test-plugin-hangman.c     \
+                tests/test-plugin-history.c     \
+                tests/test-plugin-joke.c        \
+                tests/test-plugin-logger.c      \
+                tests/test-plugin-plugin.c      \
+                tests/test-plugin-tictactoe.c
+endif
+
+TESTS_OBJS=     ${TESTS:.c=}
+
+# Compile flags.
+DEFS=           -D_BSD_SOURCE -DLIBBSD_OVERLAY -DTOP=\"`pwd`\"
+
+# Include directories.
+INCS=           -I lib/
+INCS+=          -I ./
+INCS+=          -I extern/libgreatest/
+INCS+=          -I extern/libketopt/
+INCS+=          $(shell pkg-config --cflags libbsd-overlay)
+
+ifeq (${SSL},1)
+INCS+=          $(shell pkg-config --cflags openssl)
+endif
+ifeq (${JS},1)
+INCS+=          -I extern/libduktape
+endif
+
+# Whole libraries for every binaries.
+LIBS+=          $(shell pkg-config --libs libbsd-overlay)
+
+ifeq (${SSL},1)
+LIBS+=          $(shell pkg-config --libs openssl)
+endif
+
+# For config.h file.
+ifeq (${SSL},1)
+SED.ssl=        s/@define WITH_SSL@/\#define IRCCD_WITH_SSL/
+else
+SED.ssl=        /@define WITH_SSL@/d
+
+endif
+ifeq (${JS},1)
+SED.js=         s/@define WITH_JS@/\#define IRCCD_WITH_JS/
+else
+SED.js=         /@define WITH_JS@/d
+endif
+
+# Per system commands.
+OS:=            $(shell uname -s)
+
+ifeq (${OS},Darwin)
+SHFLAGS=        -undefined dynamic_lookup
+else
+SHFLAGS=        -shared
+endif
+
+CMD.cc=         ${CC} ${DEFS} ${INCS} ${CFLAGS} -MMD -c $< -o $@
+CMD.ccld=       ${CC} ${DEFS} ${INCS} ${CFLAGS} -o $@ $^ ${LIBS} ${LDFLAGS}
+CMD.cchost=     ${CC} -Wl,-E -o $@ ${DEFS} ${INCS} ${CFLAGS} \
+	-Wl,--whole-archive $^ -Wl,--no-whole-archive ${LIBS} ${LDFLAGS}
+CMD.ccplg=      ${CC} ${DEFS} ${INCS} ${CFLAGS} ${SHFLAGS} -o $@ $^ ${LIBS} ${LDFLAGS}
+
+.SUFFIXES:
+.SUFFIXES: .c .o .js
+
+# Template for Javascript plugins.
+define js-plugin =
+PLUGINS.all+=   plugin-${1}
+PLUGINS.inst+=  install-plugin-${1}
+
+.PHONY: plugin-${1}
+plugin-${1}:
+
+.PHONY: install-plugin-${1}
+install-plugin-${1}:
+	mkdir -p ${DESTDIR}${LIBDIR}/irccd
+	mkdir -p ${DESTDIR}${MANDIR}/man7
+	cp plugins/${1}/${1}.js ${DESTDIR}${LIBDIR}/irccd
+	cp plugins/${1}/${1}.7 ${DESTDIR}${MANDIR}/man7/irccd-plugin-${1}.7
+endef
+
+# Template for C native plugins.
+define c-plugin =
+PLUGINS.all+=   plugin-${1}
+PLUGINS.objs+=  plugins/${1}/${1}.so
+PLUGINS.inst+=  install-plugin-${1}
+
+.PHONY: plugin-${1}
+plugin-${1}: plugins/${1}/${1}.so
+
+.PHONY: install-plugin-${1}
+install-plugin-${1}:
+	mkdir -p ${DESTDIR}${LIBDIR}/irccd
+	mkdir -p ${DESTDIR}${MANDIR}/man7
+	cp plugins/${1}/${1}.so ${DESTDIR}${LIBDIR}/irccd
+	cp plugins/${1}/${1}.7 ${DESTDIR}${MANDIR}/man7/irccd-plugin-${1}.7
+endef
+
+.c.o:
+	${CMD.cc}
+
+.c:
+	${CMD.ccld}
+
+all: irccd/irccd irccdctl/irccdctl
+
+-include ${LIB_DEPS} ${IRCCD_DEPS}
+
+lib/irccd/config.h: lib/irccd/config.h.in
+	sed -e "s,@ETCDIR@,${ETCDIR},g" \
+		-e "s,@LIBDIR@,${LIBDIR},g" \
+		-e "s,@SHAREDIR@,${SHAREDIR},g" \
+		-e "s,@VARDIR@,${VARDIR},g" \
+		-e "s,@MAJOR@,${MAJOR},g" \
+		-e "s,@MINOR@,${MINOR},g" \
+		-e "s,@PATCH@,${PATCH},g" \
+		-e "${SED.ssl}" \
+		-e "${SED.js}" \
+		< $< > $@
+
+${LIB_OBJS} ${IRCCD_OBJS} irccd/main.o: lib/irccd/config.h
+
+irccd/conf.c: irccd/conf.y
+	bison -d -o $@ $<
+
+irccd/lex.c: irccd/lex.l
+	flex -o $@ $<
+
+irccd/irccd: irccd/main.o ${IRCCD_OBJS} ${LIB_OBJS}
+	${CMD.cchost}
+
+irccdctl/irccdctl: ${LIB_OBJS}
+
+$(foreach p,${PLUGINS.js},$(eval $(call js-plugin,${p})))
+$(foreach p,${PLUGINS.c},$(eval $(call c-plugin,${p})))
+
+install:
+	mkdir -p ${DESTDIR}${BINDIR}
+	cp irccd/irccd ${DESTDIR}${BINDIR}
+	chmod 755 ${DESTDIR}${BINDIR}/irccd
+	cp irccdctl/irccdctl ${DESTDIR}${BINDIR}
+	chmod 755 ${DESTDIR}${BINDIR}/irccdctl
+	mkdir -p ${DESTDIR}${MANDIR}/man1
+	cp ${MAN1} ${DESTDIR}${MANDIR}/man1
+	mkdir -p ${DESTDIR}${MANDIR}/man3
+	cp ${MAN3} ${DESTDIR}${MANDIR}/man3
+	mkdir -p ${DESTDIR}${MANDIR}/man5
+	cp ${MAN5} ${DESTDIR}${MANDIR}/man5
+	mkdir -p ${DESTDIR}${MANDIR}/man7
+	cp ${MAN7} ${DESTDIR}${MANDIR}/man7
+	mkdir -p ${DESTDIR}${ETCDIR}
+	cp irccd/irccd.conf ${DESTDIR}${ETCDIR}/irccd.conf.sample
+	mkdir -p ${DESTDIR}${LIBDIR}/pkgconfig
+	sed -e "s,@MAJOR@,${MAJOR}," \
+		-e "s,@MINOR@,${MINOR}," \
+		-e "s,@PATCH@,${PATCH}," \
+		-e "s,@INCDIR@,${INCDIR}," \
+		-e "s,@SHFLAGS@,${SHFLAGS}," \
+		< lib/irccd.pc.in > ${DESTDIR}${LIBDIR}/pkgconfig/irccd.pc
+
+install-plugins: ${PLUGINS.inst}
+
+install-systemd:
+	mkdir -p ${DESTDIR}${LIBDIR}/systemd/system
+	sed -e "s,@PATH@,${BINDIR}/irccd," \
+		< systemd/irccd.service \
+		> ${DESTDIR}${LIBDIR}/systemd/system/irccd.service
+
+tests/data/example-dl-plugin.so: tests/data/example-dl-plugin.c
+	${CMD.ccplg}
+
+${TESTS_OBJS}: ${IRCCD_OBJS} ${LIB_OBJS} | irccd/irccd tests/data/example-dl-plugin.so
+
+# Generic plugin build command.
+plugins/%.so: plugins/%.c | ${IRCCD_OBJS}
+	${CMD.ccplg}
+
+# Plugin `links` require libcurl.
+plugins/links/links.so: plugins/links/links.c ${LIB_OBJS}
+	${CMD.ccplg} $(shell pkg-config --libs --cflags libcurl)
+
+plugins: ${PLUGINS.all}
+
+tests/%: tests/%.c
+	${CMD.cchost}
+
+tests: ${TESTS_OBJS}
+	for t in ${TESTS_OBJS}; do ./$$t -v; done
+
+clean:
+	rm -f lib/irccd/config.h ${LIB_OBJS} ${LIB_DEPS}
+	rm -f irccd/irccd irccd/main.o irccd/main.d \
+		irccd/conf.c irccd/conf.h irccd/lex.c \
+		${IRCCD_OBJS} ${IRCCD_DEPS}
+	rm -f irccdctl/irccdctl
+	rm -f ${TESTS_OBJS} tests/data/example-dl-plugin.so
+	rm -f ${PLUGINS.objs}
+
+.PHONY: all clean install install-plugins install-systemd plugins tests