ifdef DEBUG DBGCFLAGS=-fno-omit-frame-pointer -fsanitize=address #-fsanitize=undefined -fsanitize=leak DBGLDFLAGS=-lasan -lrt -lasan #-lubsan -llsan endif RM=rm -f FIND=find INCLUDES=-Ilibstrophe -Ideps -Ideps/fmt/include \ $(shell xml2-config --cflags) \ $(shell pkg-config --cflags gpgme) \ $(shell pkg-config --cflags librnp) \ $(shell pkg-config --cflags libsignal-protocol-c) CFLAGS+=$(DBGCFLAGS) \ -fno-omit-frame-pointer -fPIC \ -fvisibility=hidden -fvisibility-inlines-hidden \ -fdebug-prefix-map=.=$(shell readlink -f .) \ -std=gnu99 -gdwarf-4 -fkeep-inline-functions \ -Wall -Wextra -pedantic \ -Werror-implicit-function-declaration \ -Wno-missing-field-initializers \ -D_XOPEN_SOURCE=700 \ $(INCLUDES) CPPFLAGS+=$(DBGCFLAGS) -O0 \ -fno-omit-frame-pointer -fPIC \ -fvisibility=hidden -fvisibility-inlines-hidden \ -std=c++23 -gdwarf-4 -fkeep-inline-functions \ -Wall -Wextra -pedantic \ -Wno-missing-field-initializers \ $(INCLUDES) # -DDOCTEST_CONFIG_DISABLE LDFLAGS+=$(DBGLDFLAGS) \ -shared -gdwarf-4 \ $(DBGCFLAGS) LDLIBS=-lstrophe \ -lpthread \ $(shell xml2-config --libs) \ $(shell pkg-config --libs gpgme) \ $(shell pkg-config --libs librnp) \ $(shell pkg-config --libs libsignal-protocol-c) \ -lgcrypt \ -llmdb PREFIX ?= /usr/local LIBDIR ?= $(PREFIX)/lib HDRS=plugin.hh \ account.hh \ buffer.hh \ channel.hh \ command.hh \ completion.hh \ config.hh \ connection.hh \ input.hh \ message.hh \ omemo.hh \ pgp.hh \ user.hh \ util.hh \ xmpp/stanza.hh \ xmpp/ns.hh \ xmpp/node.hh \ SRCS=plugin.cpp \ account.cpp \ buffer.cpp \ channel.cpp \ command.cpp \ completion.cpp \ config.cpp \ connection.cpp \ input.cpp \ message.cpp \ omemo.cpp \ pgp.cpp \ user.cpp \ util.cpp \ xmpp/presence.cpp \ xmpp/iq.cpp \ xmpp/node.cpp \ DEPS=deps/diff/libdiff.a \ deps/fmt/libfmt.a \ OBJS=$(patsubst %.cpp,.%.o,$(patsubst %.c,.%.o,$(patsubst xmpp/%.cpp,xmpp/.%.o,$(SRCS)))) COVS=$(patsubst %.cpp,.%.cov.o,$(patsubst xmpp/%.cpp,xmpp/.%.cov.o,$(SRCS))) all: make depend make weechat-xmpp && make test weechat-xmpp: $(DEPS) xmpp.so xmpp.so: $(OBJS) $(DEPS) $(HDRS) $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(DEPS) $(LDLIBS) git ls-files | xargs tar c | objcopy --add-section .source=/dev/stdin xmpp.so #objcopy --dump-section .source=/dev/stdout xmpp.so | tar t .%.o: %.c $(eval GIT_REF=$(shell git describe --abbrev=6 --always --dirty 2>/dev/null || true)) $(CC) -DGIT_COMMIT=$(GIT_REF) $(CFLAGS) -c $< -o $@ .%.o: %.cpp $(eval GIT_REF=$(shell git describe --abbrev=6 --always --dirty 2>/dev/null || true)) $(CXX) -DGIT_COMMIT=$(GIT_REF) $(CPPFLAGS) -c $< -o $@ .%.cov.o: %.cpp @$(CXX) --coverage $(CPPFLAGS) -O0 -c $< -o $@ xmpp/.%.o: xmpp/%.cpp $(CXX) $(CPPFLAGS) -c $< -o $@ xmpp/.%.cov.o: xmpp/%.cpp @$(CXX) --coverage $(CPPFLAGS) -O0 -c $< -o $@ deps/diff/libdiff.a: git submodule update --init --recursive cd deps/diff && env -u MAKEFLAGS ./configure $(MAKE) -C deps/diff CFLAGS=-fPIC diff: deps/diff/libdiff.a deps/fmt/libfmt.a: git submodule update --init --recursive env -u MAKEFLAGS cmake -S deps/fmt -B deps/fmt \ -DCMAKE_POSITION_INDEPENDENT_CODE=ON $(MAKE) -C deps/fmt fmt fmt: deps/fmt/libfmt.a tests/xmpp.cov.so: $(COVS) $(DEPS) $(HDRS) $(CXX) --coverage -O0 $(LDFLAGS) -o tests/xmpp.cov.so $(COVS) $(DEPS) $(LDLIBS) tests/run: $(COVS) tests/main.cc tests/xmpp.cov.so env --chdir tests $(CXX) $(CPPFLAGS) -o run ./xmpp.cov.so main.cc $(LDLIBS) test: tests/run env --chdir tests ./run -s coverage: tests/run gcov -m -abcfu -rqk -i .*.gcda xmpp/.*.gcda debug: xmpp.so env LD_PRELOAD=$(DEBUG) gdb -ex "handle SIGPIPE nostop noprint pass" --args \ weechat -a -P 'alias,buflist,exec,irc,relay' -r '/plugin load ./xmpp.so' depend: $(SRCS) $(HDRS) $(RM) -f ./.depend echo > ./.depend for src in $(SRCS) ; do \ if [[ $$src == *.cpp ]]; then \ $(CXX) $(CPPFLAGS) -MM -MMD -MP -MF - \ -MT .$${src/.cpp/.o} $$src >> ./.depend ; \ elif [[ $$src == *.c ]]; then \ $(CC) $(CFLAGS) -MM -MMD -MP -MF - \ -MT .$${src/.c/.o} $$src >> ./.depend ; \ fi \ done sed -i 's/\.\([a-z]*\/\)/\1./' .depend tidy: $(FIND) . -name "*.o" -delete $(FIND) . -name "*.gcno" -delete $(FIND) . -name "*.gcda" -delete clean: $(RM) -f $(OBJS) $(COVS) $(MAKE) -C deps/diff clean || true $(MAKE) -C deps/fmt clean || true git submodule foreach --recursive git clean -xfd || true git submodule foreach --recursive git reset --hard || true distclean: clean $(RM) *~ .depend install: xmpp.so ifeq ($(shell id -u),0) mkdir -p $(DESTDIR)$(LIBDIR)/weechat/plugins cp xmpp.so $(DESTDIR)$(LIBDIR)/weechat/plugins/xmpp.so chmod 644 $(DESTDIR)$(LIBDIR)/weechat/plugins/xmpp.so else mkdir -p ~/.weechat/plugins cp xmpp.so ~/.weechat/plugins/xmpp.so chmod 755 ~/.weechat/plugins/xmpp.so endif .PHONY: all weechat-xmpp test debug depend tidy clean distclean install check check: clang-check --analyze *.c *.cc *.cpp include .depend