diff --git a/Makefile b/Makefile index b305c0e..b73fd1b 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,6 @@ +# Some parts of this Makefile were taken or adapted from libunibilium: +# https://github.com/mauke/unibilium + config ?= debug SYSTEM ?= $(shell uname -s) @@ -20,11 +23,6 @@ endif SYMBOLIZER ?= /usr/bin/llvm-symbolizer -.PHONY: all gdb lib-bin test-bin tools amalgamation test coverage profile clean \ - compile_commands.json - -all: lib-bin test-bin - XCFLAGS += -Wall -Wextra -Wconversion -Wstrict-prototypes -pedantic ifeq ($(ANSI),1) @@ -36,11 +34,15 @@ else endif NAME := mpack -MAJOR := 0 +MAJOR := 1 MINOR := 0 -PATCH := 0 +PATCH := 3 VERSION := $(MAJOR).$(MINOR).$(PATCH) +LT_REVISION=0 +LT_CURRENT=0 +LT_AGE=0 + PREFIX ?= /usr/local LIBDIR ?= $(PREFIX)/lib INCDIR ?= $(PREFIX)/include @@ -53,7 +55,8 @@ SRC := core.c conv.c object.c rpc.c SRC := $(addprefix $(SRCDIR)/,$(SRC)) HDRS := $(SRC:.c=.h) OBJ := $(addprefix $(OUTDIR)/,$(SRC:.c=.lo)) -LIB := $(OUTDIR)/lib$(NAME).la +LIBRARY := lib$(NAME).la +LIB := $(OUTDIR)/$(LIBRARY) TSRC := $(wildcard $(TESTDIR)/*.c) $(TESTDIR)/deps/tap/tap.c TOBJ := $(addprefix $(OUTDIR)/,$(TSRC:.c=.lo)) TEXE := $(OUTDIR)/run-tests @@ -64,37 +67,69 @@ PROFOUT := $(OUTDIR)/gprof.txt TEST_FILTER_OUT := --coverage -ansi -std=c99 -include .config/$(config).mk +.PHONY: all +all: lib-bin test-bin -$(TOBJ): XCFLAGS := $(filter-out $(TEST_FILTER_OUT),$(XCFLAGS)) \ - -std=gnu99 -Wno-conversion -Wno-unused-parameter +include .config/$(config).mk +.PHONY: tools tools: $(COMPILER) $(RUNNER) +.PHONY: amalgamation amalgamation: $(AMALG) +.PHONY: lib-bin lib-bin: tools $(LIB) +.PHONY: test-bin test-bin: lib-bin $(TEXE) +.PHONY: test test: test-bin @$(RUNNER) $(TEXE) +.PHONY: gdb gdb: test-bin gdb -x .gdb $(TEXE) +.PHONY: coverage coverage: tools $(COVOUT) cat $(COVOUT) +.PHONY: profile profile: tools $(PROFOUT) cat $(PROFOUT) +.PHONY: compile_commands.json compile_commands.json: rm -f $(BINDIR)/compile_commands.json $(MAKE) config=$(config) clean bear $(MAKE) config=$(config) mv compile_commands.json $(BINDIR) +.PHONY: install +install: install-inc install-lib + $(LIBTOOL) --mode=finish '$(DESTDIR)$(LIBDIR)' + +.PHONY: install-inc +install-inc: $(AMALG_H) mpack.pc.in + mkdir -p '$(DESTDIR)$(INCDIR)' + install -m644 $(AMALG_H) '$(DESTDIR)$(INCDIR)' + mkdir -p '$(DESTDIR)$(LIBDIR)/pkgconfig' + sed 's,@VERSION@,$(VERSION),;s,@LIBDIR@,$(LIBDIR),;s,@INCDIR@,$(INCDIR),' '$(DESTDIR)$(LIBDIR)/pkgconfig/mpack.pc' + +.PHONY: install-lib +install-lib: $(LIB) + mkdir -p '$(DESTDIR)$(LIBDIR)' + $(LIBTOOL) --mode=install cp $(LIB) '$(DESTDIR)$(LIBDIR)/$(LIBRARY)' + +.PHONY: clean +clean: + rm -rf $(BINDIR)/$(config) + +$(TOBJ): XCFLAGS := $(filter-out $(TEST_FILTER_OUT),$(XCFLAGS)) \ + -std=gnu99 -Wno-conversion -Wno-unused-parameter + $(COVOUT): $(SRC) $(TSRC) find $(OUTDIR) -type f -name '*.gcda' -print0 | xargs -0 rm -f $(MAKE) CFLAGS='-DNDEBUG -g --coverage' LDFLAGS=--coverage config=$(config) test @@ -107,16 +142,15 @@ $(PROFOUT): $(SRC) $(TSRC) gprof $(OUTDIR)/run-tests gmon.out > $@ rm gmon.out -clean: - rm -rf $(BINDIR)/$(config) - $(OUTDIR)/%.lo: %.c $(AMALG) @echo compile $< =\> $@ @$(LIBTOOL) --mode=compile --tag=CC $(CC) $(XCFLAGS) $(CFLAGS) -o $@ -c $< $(LIB): $(OBJ) @echo link $^ =\> $@ - @$(LIBTOOL) --mode=link --tag=CC $(CC) $(XLDFLAGS) $(LDFLAGS) -o $@ $^ + @$(LIBTOOL) --mode=link --tag=CC $(CC) $(XLDFLAGS) $(LDFLAGS) \ + -rpath '$(LIBDIR)' \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) -o $@ $^ $(TEXE): $(LIB) $(TOBJ) @echo link $^ =\> $@ diff --git a/binding/lua/Makefile b/binding/lua/Makefile index c499d7a..5a1312d 100644 --- a/binding/lua/Makefile +++ b/binding/lua/Makefile @@ -46,18 +46,27 @@ test: $(BUSTED) $(MPACK) valgrind: $(BUSTED) $(MPACK) eval $$($(LUAROCKS) path); \ valgrind $(VALGRIND_OPTS) $(LUA) \ - $(DEPS_PREFIX)/lib/luarocks/rocks/busted/2.0.rc11-0/bin/busted test.lua + $(DEPS_PREFIX)/lib/luarocks/rocks/busted/2.0.rc12-1/bin/busted test.lua gdb: $(BUSTED) $(MPACK) eval $$($(LUAROCKS) path); \ gdb -x .gdb --args $(LUA) \ - $(DEPS_PREFIX)/lib/luarocks/rocks/busted/2.0.rc11-0/bin/busted test.lua + $(DEPS_PREFIX)/lib/luarocks/rocks/busted/2.0.rc12-1/bin/busted test.lua $(MPACK): $(LUAROCKS) lmpack.c $(LUAROCKS) make CFLAGS='$(CFLAGS)' $(BUSTED): $(LUAROCKS) - $(LUAROCKS) install busted + $(LUAROCKS) install penlight 1.3.2-2 + $(LUAROCKS) install lua-term 0.7-1 + $(LUAROCKS) install dkjson 2.5-2 + $(LUAROCKS) install lua_cliargs 3.0-1 + $(LUAROCKS) install say 1.3-1 + $(LUAROCKS) install luafilesystem 1.6.3-2 + $(LUAROCKS) install luassert 1.7.10-0 + $(LUAROCKS) install mediator_lua 1.1.2-0 + $(LUAROCKS) install luasystem 0.2.0-0 + $(LUAROCKS) install busted 2.0.rc12-1 $(LUAROCKS) install inspect # helpful for debugging $(LUAROCKS): $(LUA) diff --git a/mpack.pc.in b/mpack.pc.in new file mode 100644 index 0000000..56d4485 --- /dev/null +++ b/mpack.pc.in @@ -0,0 +1,9 @@ +libdir=@LIBDIR@ +includedir=@INCDIR@ +version=@VERSION@ + +Name: mpack +Description: small binary serialization library implementing msgpack and msgpack-rpc formats +Version: ${version} +Libs: -L${libdir} -lmpack +Cflags: -I${includedir} diff --git a/src/object.c b/src/object.c index 7a0f583..e37d9bf 100644 --- a/src/object.c +++ b/src/object.c @@ -102,7 +102,7 @@ MPACK_API void mpack_parser_copy(mpack_parser_t *dst, mpack_parser_t *src) mpack_uint32_t dst_capacity = dst->capacity; assert(src->capacity <= dst_capacity); /* copy all fields except the stack */ - memcpy(dst, src, sizeof(MPACK_PARSER_STRUCT(0)) - sizeof(mpack_node_t)); + memcpy(dst, src, sizeof(mpack_one_parser_t) - sizeof(mpack_node_t)); /* reset capacity */ dst->capacity = dst_capacity; /* copy the stack */ diff --git a/src/object.h b/src/object.h index 9ba98b3..3dea49e 100644 --- a/src/object.h +++ b/src/object.h @@ -44,9 +44,13 @@ typedef struct mpack_node_s { mpack_node_t items[c + 1]; \ } +/* Some compilers warn against anonymous structs: + * https://github.com/tarruda/libmpack/issues/6 */ +typedef MPACK_PARSER_STRUCT(0) mpack_one_parser_t; + #define MPACK_PARSER_STRUCT_SIZE(c) \ (sizeof(mpack_node_t) * c + \ - sizeof(MPACK_PARSER_STRUCT(0))) + sizeof(mpack_one_parser_t)) typedef MPACK_PARSER_STRUCT(MPACK_MAX_OBJECT_DEPTH) mpack_parser_t; typedef void(*mpack_walk_cb)(mpack_parser_t *w, mpack_node_t *n); diff --git a/src/rpc.c b/src/rpc.c index 4178289..3b2b328 100644 --- a/src/rpc.c +++ b/src/rpc.c @@ -242,7 +242,7 @@ MPACK_API void mpack_rpc_session_copy(mpack_rpc_session_t *dst, mpack_uint32_t dst_capacity = dst->capacity; assert(src->capacity <= dst_capacity); /* copy all fields except slots */ - memcpy(dst, src, sizeof(MPACK_RPC_SESSION_STRUCT(1)) - + memcpy(dst, src, sizeof(mpack_rpc_one_session_t) - sizeof(struct mpack_rpc_slot_s)); /* reset capacity */ dst->capacity = dst_capacity; diff --git a/src/rpc.h b/src/rpc.h index 5fd6f3f..9f0a3e3 100644 --- a/src/rpc.h +++ b/src/rpc.h @@ -46,9 +46,13 @@ struct mpack_rpc_slot_s { struct mpack_rpc_slot_s slots[c]; \ } +/* Some compilers warn against anonymous structs: + * https://github.com/tarruda/libmpack/issues/6 */ +typedef MPACK_RPC_SESSION_STRUCT(1) mpack_rpc_one_session_t; + #define MPACK_RPC_SESSION_STRUCT_SIZE(c) \ (sizeof(struct mpack_rpc_slot_s) * (c - 1) + \ - sizeof(MPACK_RPC_SESSION_STRUCT(1))) + sizeof(mpack_rpc_one_session_t)) typedef MPACK_RPC_SESSION_STRUCT(MPACK_RPC_MAX_REQUESTS) mpack_rpc_session_t;