From 7d6209d99c890205e77df1c33c3eb84b1e06d360 Mon Sep 17 00:00:00 2001 From: c9s Date: Sun, 1 Jun 2014 18:06:12 +0800 Subject: [PATCH] build with 3rdparty objects use -static linking when linking libr3 AM_CFLAGS and AM_LDFLAGS are Makefile.am scope options disable valgrind tracing check-tree Makefile.am fix Add json support remove useless c files --- .travis.yml | 7 +++-- 3rdparty/Makefile.am | 16 ++++++++++ {src => 3rdparty}/zmalloc.c | 0 {include => 3rdparty}/zmalloc.h | 0 Makefile.am | 19 ++++++++++-- configure.ac | 20 ++++++++++-- include/r3.h | 14 ++++++++- src/Makefile.am | 31 ++++++++++--------- tests/Makefile.am | 54 ++++++++++++++++----------------- 9 files changed, 111 insertions(+), 50 deletions(-) create mode 100644 3rdparty/Makefile.am rename {src => 3rdparty}/zmalloc.c (100%) rename {include => 3rdparty}/zmalloc.h (100%) diff --git a/.travis.yml b/.travis.yml index 754863e..b926b5b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,9 +6,9 @@ compiler: matrix: include: - compiler: gcc - env: CONFIGURE_OPTION='--enable-debug --with-malloc=jemalloc' COVERALLS=yes VALGRIND=no + env: CONFIGURE_OPTION='--enable-debug --with-malloc=jemalloc' COVERALLS=yes VALGRIND=no DEBUG=yes - compiler: gcc - env: CONFIGURE_OPTION='--enable-debug' COVERALLS=yes VALGRIND=yes LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/ + env: CONFIGURE_OPTION='--enable-debug' COVERALLS=yes VALGRIND=yes DEBUG=yes LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/ - compiler: clang env: ASAN_OPTIONS=symbolize=1 ASAN_SYMBOLIZER_PATH=/usr/local/clang-3.4/bin/llvm-symbolizer CFLAGS='-fsanitize=address -g -O1' @@ -28,7 +28,8 @@ script: - make V=1 - sudo make install - if [ "x$VALGRIND" == xyes ]; then make check > /dev/null 2>&1; else make check V=1; fi - - if [ "x$VALGRIND" == xyes ]; then valgrind ./tests/.libs/check_* -v --trace-children=yes --show-leak-kinds=full --leak-check=full; fi + # XXX: tracing memory leak, disabled for some mystery reason for automake... + # - if [ "x$VALGRIND" == xyes && "x$DEBUG" == xyes ]; then valgrind ./tests/check_* -v --trace-children=yes --show-leak-kinds=full --leak-check=full; fi after_success: - if [ x$COVERALLS == xyes ]; then coveralls ; fi diff --git a/3rdparty/Makefile.am b/3rdparty/Makefile.am new file mode 100644 index 0000000..86a805c --- /dev/null +++ b/3rdparty/Makefile.am @@ -0,0 +1,16 @@ +AM_CFLAGS=$(DEPS_CFLAGS) $(GVC_DEPS_CFLAGS) -I$(top_builddir) -I$(top_builddir)/include -I$(top_builddir)/3rdparty -Wall -std=c99 +AM_LDFLAGS=$(DEPS_LIBS) $(GVC_DEPS_LIBS) + +noinst_LTLIBRARIES = libr3ext.la +libr3ext_la_SOURCES = zmalloc.c +libr3ext_la_LIBADD=$(DEPS_LIBS) +# noinst_LIBRARIES = libr3ext.la +libr3ext_la_CFLAGS=$(DEPS_CFLAGS) -I$(top_builddir) -I$(top_builddir)/3rdparty -Wall -std=c99 + +noinst_HEADERS = \ + ujdecode.h \ + zmalloc.h \ + ultrajson.h \ + $(NULL) + + diff --git a/src/zmalloc.c b/3rdparty/zmalloc.c similarity index 100% rename from src/zmalloc.c rename to 3rdparty/zmalloc.c diff --git a/include/zmalloc.h b/3rdparty/zmalloc.h similarity index 100% rename from include/zmalloc.h rename to 3rdparty/zmalloc.h diff --git a/Makefile.am b/Makefile.am index 6adcee5..be1f03c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,23 @@ -SUBDIRS=src tests +SUBDIRS=3rdparty src tests + +lib_LTLIBRARIES = libr3.la +libr3_la_SOURCES = +libr3_la_LIBADD = 3rdparty/libr3ext.la src/libr3core.la +libr3_la_LDFLAGS = -static + +AM_CFLAGS=$(DEPS_CFLAGS) $(GVC_DEPS_CFLAGS) -I$(top_builddir) -I$(top_builddir)/include -I$(top_builddir)/3rdparty -Wall -std=c99 +AM_LDFLAGS=$(DEPS_LIBS) $(GVC_DEPS_LIBS) ACLOCAL_AMFLAGS=-I m4 +if ENABLE_DEBUG +AM_CFLAGS += -ggdb -fprofile-arcs -ftest-coverage +endif + +if USE_JEMALLOC +AM_LDFLAGS += -ljemalloc +endif + r3_includedir = $(includedir)/r3 r3_include_HEADERS = \ include/r3.h \ @@ -10,7 +26,6 @@ r3_include_HEADERS = \ include/r3_str.h \ include/r3_gvc.h \ include/str_array.h \ - include/zmalloc.h \ $(NULL) pkgconfigdir = $(libdir)/pkgconfig diff --git a/configure.ac b/configure.ac index 95e533f..4d8ca0b 100644 --- a/configure.ac +++ b/configure.ac @@ -2,12 +2,11 @@ AC_INIT([r3], 1.0.0) AC_PREREQ([2.64]) AC_CONFIG_HEADERS(config.h) AC_CONFIG_MACRO_DIR([m4]) -AM_INIT_AUTOMAKE([foreign]) +AM_INIT_AUTOMAKE([foreign subdir-objects]) LT_INIT AC_PROG_CC AC_PROG_CC_STDC - AC_CHECK_HEADERS([stdlib.h string.h sys/time.h]) # Checks for typedefs, structures, and compiler characteristics. @@ -74,14 +73,30 @@ AM_CONDITIONAL(USE_JEMALLOC, test "x$have_jemalloc" = "xyes") # AC_DEFINE(USE_JEMALLOC, test "x$found_jemalloc" = "xyes" , "use jemalloc") AM_CONDITIONAL(ENABLE_DEBUG, test "x$enable_debug" = "xyes") +AM_CONDITIONAL(ENABLE_JSON, test "x$enable_json" = "xyes") AM_CONDITIONAL(ENABLE_GRAPHVIZ, test "x$enable_graphviz" = "xyes") + AC_DEFINE(ENABLE_GRAPHVIZ, test "x$enable_graphviz" = "xyes", "whether graphviz is enable") +AC_DEFINE(ENABLE_JSON, test "x$enable_json" = "xyes", "whether json is enable") PKG_CHECK_MODULES(DEPS, [libpcre]) AC_SUBST(DEPS_CFLAGS) AC_SUBST(DEPS_LIBS) +AC_ARG_ENABLE(json, + AS_HELP_STRING([--enable-json], + [enable json encoder]), + , enable_json=unset) + + +if test "x$enable_json" != "xunset" ; then +PKG_CHECK_MODULES(JSONC, [json-c]) +AC_SUBST(JSONC_CFLAGS) +AC_SUBST(JSONC_LIBS) +fi + + # This does not work because configure does not look into /opt/local/include... # AC_CHECK_HEADERS([check.h],[ enable_check=yes ],[ enable_check=unset ]) AC_ARG_ENABLE(check, @@ -104,6 +119,7 @@ AM_CONDITIONAL(HAVE_CHECK, test x"$have_check" = "xyes") AC_CONFIG_FILES([ r3.pc Makefile + 3rdparty/Makefile src/Makefile tests/Makefile ]) diff --git a/include/r3.h b/include/r3.h index 9b5be9b..c4a820c 100644 --- a/include/r3.h +++ b/include/r3.h @@ -16,6 +16,11 @@ #include "str_array.h" #include "match_entry.h" +#ifdef ENABLE_JSON +#include +#endif + + struct _edge; struct _node; struct _route; @@ -170,7 +175,14 @@ enum { NODE_COMPARE_STR, NODE_COMPARE_PCRE, NODE_COMPARE_OPCODE }; enum { OP_EXPECT_MORE_DIGITS = 1, OP_EXPECT_MORE_WORDS, OP_EXPECT_NOSLASH, OP_EXPECT_NODASH, OP_EXPECT_MORE_ALPHA }; +#ifdef ENABLE_JSON +json_object * r3_edge_to_json_object(const edge * e); +json_object * r3_node_to_json_object(const node * n); +json_object * r3_route_to_json_object(const route * r); - +const char * r3_node_to_json_string_ext(const node * n, int options); +const char * r3_node_to_json_pretty_string(const node * n); +const char * r3_node_to_json_string(const node * n); +#endif #endif /* !R3_NODE_H */ diff --git a/src/Makefile.am b/src/Makefile.am index 7cd6ae2..e154d2a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,23 +1,24 @@ -lib_LTLIBRARIES = libr3.la +AM_CFLAGS=$(DEPS_CFLAGS) $(GVC_DEPS_CFLAGS) $(JSONC_CFLAGS) -I$(top_builddir) -I$(top_builddir)/include -I$(top_builddir)/3rdparty -Wall -std=c99 +AM_LDFLAGS=$(DEPS_LIBS) $(GVC_DEPS_LIBS) $(JSONC_LIBS) + +noinst_LTLIBRARIES = libr3core.la # lib_LIBRARIES = libr3.a -libr3_la_SOURCES = node.c edge.c str.c token.c zmalloc.c match_entry.c +libr3core_la_SOURCES = node.c edge.c str.c token.c match_entry.c + +if ENABLE_JSON +libr3core_la_SOURCES += json.c +endif + + + # libr3_la_LDFLAGS = -export-symbols-regex '^r3_|^match_' -libr3_la_LIBADD=$(DEPS_LIBS) -AM_CFLAGS=$(DEPS_CFLAGS) -I$(top_builddir) -I$(top_builddir)/include -Wall -std=c99 - -if USE_JEMALLOC -AM_CFLAGS += -ljemalloc -endif - -if ENABLE_DEBUG -AM_CFLAGS += -ggdb -fprofile-arcs -ftest-coverage -endif +# libr3_la_LIBADD=$(DEPS_LIBS) $(LIBOBJS) $(ALLOCA) +# libr3core_la_LIBADD=$(DEPS_LIBS) +# libr3core_la_CFLAGS=$(DEPS_CFLAGS) -I$(top_builddir) -I$(top_builddir)/include -I$(top_builddir)/3rdparty -Wall -std=c99 if ENABLE_GRAPHVIZ -libr3_la_SOURCES += gvc.c -libr3_la_LIBADD += $(GVC_DEPS_LIBS) -AM_CFLAGS += $(GVC_DEPS_CFLAGS) +libr3core_la_SOURCES += gvc.c endif # AM_CFLAGS=$(DEPS_CFLAGS) diff --git a/tests/Makefile.am b/tests/Makefile.am index 9a1f272..2cf24db 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -4,9 +4,14 @@ # else # TESTS = # endif -TESTS = check_tree -AM_CFLAGS = -ggdb -Wall $(DEPS_CFLAGS) -I$(top_builddir) -I$(top_builddir)/include @CHECK_CFLAGS@ -AM_LDFLAGS = $(DEPS_LIBS) -L$(top_builddir)/src -lr3 -lcheck @CHECK_LIBS@ +TESTS = + +AM_CFLAGS=$(DEPS_CFLAGS) $(GVC_DEPS_CFLAGS) -I$(top_builddir) -I$(top_builddir)/include -I$(top_builddir)/3rdparty -Wall -std=c99 -ggdb -Wall +AM_LDFLAGS=$(DEPS_LIBS) $(GVC_DEPS_LIBS) -L$(top_builddir) -lr3 -lcheck @CHECK_LIBS@ + +if USE_JEMALLOC +AM_CFLAGS += -ljemalloc +endif noinst_HEADERS = \ @@ -16,37 +21,32 @@ noinst_HEADERS = \ dist_noinst_DATA = \ $(NULL) -if USE_JEMALLOC -AM_CFLAGS += -ljemalloc -endif - -if ENABLE_GRAPHVIZ -TESTS += check_gvc -check_gvc_SOURCES = check_gvc.c -# check_gvc_LDADD = $(GVC_DEPS_LIBS) $(DEPS_LIBS) -L$(top_builddir)/src -lr3 @CHECK_LIBS@ -# check_gvc_CFLAGS = $(GVC_DEPS_CFLAGS) $(DEPS_CFLAGS) -I$(top_builddir) -I$(top_builddir)/include @CHECK_CFLAGS@ -AM_CFLAGS += $(GVC_DEPS_CFLAGS) -AM_LDFLAGS += $(GVC_DEPS_LIBS) -endif - - -TESTS += benchmark -benchmark_SOURCES = bench.c - - - -# noinst_PROGRAMS = $(TESTS) -check_tree_SOURCES = check_tree.c -# check_tree_LDADD=$(DEPS_LIBS) -L$(top_builddir)/src -lr3 @CHECK_LIBS@ -# check_tree_CFLAGS=$(DEPS_CFLAGS) -I$(top_builddir) -I$(top_builddir)/include @CHECK_CFLAGS@ TESTS += check_slug check_slug_SOURCES = check_slug.c -check_PROGRAMS = $(TESTS) +TESTS += check_tree +check_tree_SOURCES = check_tree.c +if ENABLE_JSON +TESTS += check_json +check_json_SOURCES = check_json.c +endif + + +if ENABLE_GRAPHVIZ +TESTS += check_gvc +check_gvc_SOURCES = check_gvc.c +endif + +TESTS += benchmark +benchmark_SOURCES = bench.c + +check_PROGRAMS = $(TESTS) + # AM_CFLAGS=$(DEPS_CFLAGS) -I$(top_builddir)/include # AM_CFLAGS=$(DEPS_CFLAGS) -I$(top_builddir) -I$(top_builddir)/include CLEANFILES = check_tree.log +# noinst_PROGRAMS = $(TESTS)