diff --git a/Makefile b/Makefile deleted file mode 100644 index 15b077f..0000000 --- a/Makefile +++ /dev/null @@ -1,95 +0,0 @@ -ifdef DEBUG - DBGCFLAGS=-fsanitize=address -fsanitize=undefined -fsanitize=leak - DBGLDFLAGS=-lasan -lubsan -llsan -endif -RM=rm -f -FIND=find -INCLUDES=-Ilibstrophe $(shell xml2-config --cflags) $(shell pkg-config --cflags librnp-0) $(shell pkg-config --cflags libomemo-c) -CFLAGS+=$(DBGCFLAGS) -fno-omit-frame-pointer -fPIC -std=gnu99 -gdwarf-4 -Wall -Wextra -Werror-implicit-function-declaration -Wno-missing-field-initializers -D_XOPEN_SOURCE=700 $(INCLUDES) -LDFLAGS+=$(DBGLDFLAGS) -shared -g $(DBGCFLAGS) -LDLIBS=-lstrophe -lpthread $(shell xml2-config --libs) $(shell pkg-config --libs librnp-0) $(shell pkg-config --libs libomemo-c) -lgcrypt -llmdb - -PREFIX ?= /usr/local -LIBDIR ?= $(PREFIX)/lib - -SRCS=plugin.c \ - account.c \ - buffer.c \ - channel.c \ - command.c \ - completion.c \ - config.c \ - connection.c \ - input.c \ - message.c \ - omemo.c \ - pgp.c \ - user.c \ - util.c \ - xmpp/presence.c \ - xmpp/iq.c \ - -DEPS=diff/libdiff.a -OBJS=$(subst .c,.o,$(SRCS)) - -all: weechat-xmpp -weechat-xmpp: $(DEPS) xmpp.so - -xmpp.so: $(OBJS) $(DEPS) - $(CC) $(LDFLAGS) -o xmpp.so $(OBJS) $(DEPS) $(LDLIBS) - which patchelf >/dev/null && \ - patchelf --set-rpath $(LIBRARY_PATH):$(shell realpath $(shell dirname $(shell gcc --print-libgcc-file-name))/../../../) xmpp.so && \ - patchelf --shrink-rpath xmpp.so || true - -diff/libdiff.a: - git submodule update --init --recursive - cd diff && ./configure - $(MAKE) -C diff CFLAGS=-fPIC -diff: diff/libdiff.a - -test: xmpp.so - env LD_PRELOAD=$(DEBUG) \ - weechat -a -P 'alias,buflist,irc' -r '/plugin load ./xmpp.so' - -debug: xmpp.so - gdb -ex "handle SIGPIPE nostop noprint pass" --args \ - weechat -a -r '/plugin load ./xmpp.so' - -depend: .depend - -.depend: $(SRCS) - $(RM) ./.depend - $(CC) $(CFLAGS) -MM $^>>./.depend - -tidy: - $(FIND) . -name "*.o" -delete - -clean: - $(RM) -f $(OBJS) - $(MAKE) -C diff 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: tags cs - -tags: - $(CC) $(CFLAGS) -M $(SRCS) | sed -e "s/[\\ ]/\n/g" | sed -e "/^$$/d" -e "/\.o:[ \t]*$$/d" | sort | uniq | ctags -e -L - -f .git/tags -R --c-kinds=+px --c++-kinds=+px --fields=+iaS --extras=+fq - -cs: - cscope -RUbq - -include .depend diff --git a/account.c b/account.c index 4c10c27..5a0ba68 100644 --- a/account.c +++ b/account.c @@ -11,7 +11,7 @@ #include #include -#include "plugin.h" +#include "plugin.hh" #include "xmpp/stanza.h" #include "config.h" #include "input.h" diff --git a/axc b/axc deleted file mode 160000 index 1d4454e..0000000 --- a/axc +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1d4454ea42d39a2064955f2a8de5f89787743f2a diff --git a/buffer.c b/buffer.c index 6bda7b8..d9db4e3 100644 --- a/buffer.c +++ b/buffer.c @@ -7,7 +7,7 @@ #include #include -#include "plugin.h" +#include "plugin.hh" #include "account.h" #include "channel.h" #include "buffer.h" diff --git a/channel.c b/channel.c index f943547..8a7ed86 100644 --- a/channel.c +++ b/channel.c @@ -10,7 +10,7 @@ #include #include -#include "plugin.h" +#include "plugin.hh" #include "account.h" #include "omemo.h" #include "user.h" diff --git a/command.c b/command.c index 2073a83..147239c 100644 --- a/command.c +++ b/command.c @@ -10,7 +10,7 @@ #include #include -#include "plugin.h" +#include "plugin.hh" #include "account.h" #include "user.h" #include "channel.h" diff --git a/completion.c b/completion.c index 721a06c..af9c283 100644 --- a/completion.c +++ b/completion.c @@ -9,7 +9,7 @@ #include #include -#include "plugin.h" +#include "plugin.hh" #include "config.h" #include "account.h" #include "channel.h" diff --git a/config.c b/config.c index df4171d..ae60dac 100644 --- a/config.c +++ b/config.c @@ -8,7 +8,7 @@ #include #include -#include "plugin.h" +#include "plugin.hh" #include "account.h" #include "config.h" diff --git a/connection.c b/connection.c index 7bbd51f..12bac6e 100644 --- a/connection.c +++ b/connection.c @@ -11,7 +11,7 @@ #include #include -#include "plugin.h" +#include "plugin.hh" #include "diff/diff.h" #include "xmpp/stanza.h" #include "config.h" diff --git a/input.c b/input.c index d51b3e4..816ec84 100644 --- a/input.c +++ b/input.c @@ -7,7 +7,7 @@ #include #include -#include "plugin.h" +#include "plugin.hh" #include "account.h" #include "channel.h" #include "buffer.h" diff --git a/makefile b/makefile new file mode 100644 index 0000000..68828d0 --- /dev/null +++ b/makefile @@ -0,0 +1,161 @@ +ifdef DEBUG + DBGCFLAGS=-fsanitize=address -fsanitize=undefined -fsanitize=leak + DBGLDFLAGS=-lasan -lubsan -llsan +endif + +RM=rm -f +FIND=find + +INCLUDES=-Ilibstrophe \ + $(shell xml2-config --cflags) \ + $(shell pkg-config --cflags librnp-0) \ + $(shell pkg-config --cflags libomemo-c) +CFLAGS+=$(DBGCFLAGS) \ + -fno-omit-frame-pointer -fPIC \ + -std=gnu99 -gdwarf-4 \ + -Wall -Wextra -pedantic \ + -Werror-implicit-function-declaration \ + -Wno-missing-field-initializers \ + -D_XOPEN_SOURCE=700 \ + $(INCLUDES) +CPPFLAGS+=$(DBGCFLAGS) \ + -fno-omit-frame-pointer -fPIC \ + -std=c++17 -gdwarf-4 \ + -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 librnp-0) \ + $(shell pkg-config --libs libomemo-c) \ + -lgcrypt \ + -llmdb + +PREFIX ?= /usr/local +LIBDIR ?= $(PREFIX)/lib + +HDRS=plugin.hh \ + account.h \ + buffer.h \ + channel.h \ + command.h \ + completion.h \ + config.h \ + connection.h \ + input.h \ + message.h \ + omemo.h \ + pgp.h \ + user.h \ + util.h \ + xmpp/stanza.h \ + +SRCS=plugin.cpp \ + account.c \ + buffer.c \ + channel.c \ + command.c \ + completion.c \ + config.c \ + connection.c \ + input.c \ + message.c \ + omemo.c \ + pgp.c \ + user.c \ + util.c \ + xmpp/presence.c \ + xmpp/iq.c \ + +DEPS=deps/diff/libdiff.a \ + +OBJS=$(patsubst %.cpp,.%.o,$(patsubst %.c,.%.o,$(patsubst xmpp/%.c,xmpp/.%.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) + which patchelf >/dev/null && \ + patchelf --set-rpath $(LIBRARY_PATH):$(shell realpath $(shell dirname $(shell gcc --print-libgcc-file-name))/../../../) xmpp.so && \ + patchelf --shrink-rpath xmpp.so || true + +.%.o: %.cpp + @$(CXX) $(CPPFLAGS) -c $< -o $@ + +.%.o: %.c + @$(CC) $(CFLAGS) -c $< -o $@ + +xmpp/.%.o: xmpp/%.c + @$(CC) $(CFLAGS) -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 + +tests/run: xmpp.so tests/main.cpp + $(CXX) $(CPPFLAGS) -o tests/run xmpp.so tests/main.cpp $(LDLIBS) + which patchelf >/dev/null && \ + patchelf --set-rpath $(PWD):$(LIBRARY_PATH):$(shell realpath $(shell dirname $(shell gcc --print-libgcc-file-name))/../../../) tests/run && \ + patchelf --shrink-rpath tests/run || true + +test: tests/run + tests/run + +debug: xmpp.so + env LD_PRELOAD=$(DEBUG) gdb -ex "handle SIGPIPE nostop noprint pass" --args \ + weechat -a -P 'alias,buflist,exec,irc' -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 + +clean: + $(RM) -f $(OBJS) + $(MAKE) -C deps/diff 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 diff --git a/message.c b/message.c index d896527..2d9c2ce 100644 --- a/message.c +++ b/message.c @@ -10,7 +10,7 @@ #include #include -#include "plugin.h" +#include "plugin.hh" #include "account.h" #include "channel.h" #include "user.h" diff --git a/omemo b/omemo deleted file mode 160000 index 7667e54..0000000 --- a/omemo +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7667e54d6488aba85701bb4dd6e09fd98bfb3a2c diff --git a/omemo.c b/omemo.c index aee12b3..2fe1360 100644 --- a/omemo.c +++ b/omemo.c @@ -30,7 +30,7 @@ struct t_pre_key { const char *public_key; }; -#include "plugin.h" +#include "plugin.hh" #include "xmpp/stanza.h" #include "account.h" #include "omemo.h" diff --git a/pgp.c b/pgp.c index 427bf85..114d066 100644 --- a/pgp.c +++ b/pgp.c @@ -9,7 +9,7 @@ #include #include -#include "plugin.h" +#include "plugin.hh" #include "pgp.h" #define RNP_SUCCESS 0 diff --git a/plugin.c b/plugin.cpp similarity index 95% rename from plugin.c rename to plugin.cpp index c9ae1ff..a6b9014 100644 --- a/plugin.c +++ b/plugin.cpp @@ -2,14 +2,15 @@ // License, version 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -#include -#include -#include -#include +#include +#include +#include +#include #include #include -#include "plugin.h" +extern "C" { +#include "plugin.hh" #include "config.h" #include "account.h" #include "connection.h" @@ -18,7 +19,6 @@ #include "buffer.h" #include "completion.h" - WEECHAT_PLUGIN_NAME(WEECHAT_XMPP_PLUGIN_NAME); WEECHAT_PLUGIN_DESCRIPTION(N_("XMPP client protocol")); WEECHAT_PLUGIN_AUTHOR("bqv "); @@ -92,3 +92,4 @@ int weechat_plugin_end(struct t_weechat_plugin *plugin) return WEECHAT_RC_OK; } +} diff --git a/plugin.h b/plugin.hh similarity index 81% rename from plugin.h rename to plugin.hh index 6711120..ed09dc2 100644 --- a/plugin.h +++ b/plugin.hh @@ -2,8 +2,7 @@ // License, version 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -#ifndef _WEECHAT_XMPP_PLUGIN_H_ -#define _WEECHAT_XMPP_PLUGIN_H_ +#pragma once #define weechat_plugin weechat_xmpp_plugin #define WEECHAT_XMPP_PLUGIN_NAME "xmpp" @@ -11,5 +10,3 @@ #define TIMER_INTERVAL_SEC 0.01 extern struct t_weechat_plugin *weechat_xmpp_plugin; - -#endif /*WEECHAT_XMPP_PLUGIN_H*/ diff --git a/tests/account.inl b/tests/account.inl new file mode 100644 index 0000000..e80327a --- /dev/null +++ b/tests/account.inl @@ -0,0 +1,10 @@ +#include + +#include "../account.hh" + +TEST_CASE("create account") +{ + weechat::xmpp::account acc("demo"); + + CHECK(acc.name == "demo"); +} diff --git a/tests/config.inl b/tests/config.inl new file mode 100644 index 0000000..52a7368 --- /dev/null +++ b/tests/config.inl @@ -0,0 +1,10 @@ +#include + +#include "../config.hh" + +TEST_CASE("create config") +{ + weechat::xmpp::config cfg; + + CHECK(cfg.name() == weechat::xmpp::config::default_name); +} diff --git a/tests/main.cpp b/tests/main.cpp new file mode 100644 index 0000000..af24eeb --- /dev/null +++ b/tests/main.cpp @@ -0,0 +1,3 @@ +#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN + +#include diff --git a/tests/plugin.inl b/tests/plugin.inl new file mode 100644 index 0000000..84778f2 --- /dev/null +++ b/tests/plugin.inl @@ -0,0 +1,18 @@ +#include + +#include "../plugin.hh" + +TEST_CASE("placeholder") +{ + int argc = 2; + const char *argv[2] = {"a", "b"}; + + SUBCASE("takes no arguments") + { + CHECK(argc != 1); + } + + (void) argv; + //weechat::plugin c; + //CHECK(&c.name() == NULL); +} diff --git a/tests/run b/tests/run new file mode 100755 index 0000000..f158e82 Binary files /dev/null and b/tests/run differ diff --git a/user.c b/user.c index ba1546b..78fe334 100644 --- a/user.c +++ b/user.c @@ -9,7 +9,7 @@ #include #include -#include "plugin.h" +#include "plugin.hh" #include "account.h" #include "user.h" #include "channel.h" diff --git a/util.c b/util.c index 382ee05..b5b5540 100644 --- a/util.c +++ b/util.c @@ -7,7 +7,7 @@ #include #include -#include "plugin.h" +#include "plugin.hh" #include "util.h" int char_cmp(const void *p1, const void *p2)