Add exports file and abi checker for tevent
authorSimo Sorce <ssorce@redhat.com>
Sun, 7 Jun 2009 18:10:15 +0000 (14:10 -0400)
committerSimo Sorce <idra@samba.org>
Mon, 15 Jun 2009 20:31:13 +0000 (16:31 -0400)
This is a first attempt at exporting symbols only for public functions
We also provide a rudimentary ABI checker that tries to check that
function signatures are not changed by mistake.
Given our use of macros this is not an API checker.
It's all based on tevent.h contents and the gcc -aux-info option

lib/tevent/Makefile.in
lib/tevent/abi_checks.sh [new file with mode: 0755]
lib/tevent/configure.ac
lib/tevent/libtevent.m4
lib/tevent/rules.mk
lib/tevent/tevent.exports [new file with mode: 0644]
lib/tevent/tevent.signatures [new file with mode: 0644]

index 253b1e1d1241267c5eee06384fede164ddb579c2..f3deb9df454c7f06deef1643a56f58f88d159275 100644 (file)
@@ -39,6 +39,10 @@ LIBS = $(TALLOC_LIBS) $(TEVENT_LIBS) @LIBS@
 
 TEVENT_OBJ = @TEVENT_OBJ@ @LIBREPLACEOBJ@
 
+SONAMEFLAG = @SONAMEFLAG@
+VERSIONSCRIPT = @VERSIONSCRIPT@
+EXPORTSFILE = @EXPORTSFILE@
+
 default: all
 
 include $(teventdir)/tevent.mk
@@ -48,7 +52,7 @@ all:: showflags dirs $(PROGS) $(TEVENT_SOLIB) libtevent.a
 
 install:: all
 $(TEVENT_SOLIB): $(TEVENT_OBJ)
-       $(SHLD) $(SHLD_FLAGS) $(LDFLAGS) $(LIBS) -o $@ $(TEVENT_OBJ) @SONAMEFLAG@$(TEVENT_SONAME)
+       $(SHLD) $(SHLD_FLAGS) $(LDFLAGS) $(LIBS) -o $@ $(TEVENT_OBJ) $(VERSIONSCRIPT) $(EXPORTSFILE) $(SONAMEFLAG)$(TEVENT_SONAME)
 
 shared-build: all
        ${INSTALLCMD} -d $(sharedbuilddir)/lib
@@ -65,6 +69,7 @@ installcheck:: test install
 
 clean::
        rm -f *.o *.a */*.o
+       rm -fr abi
 
 distclean:: clean
        rm -f config.log config.status config.h config.cache
diff --git a/lib/tevent/abi_checks.sh b/lib/tevent/abi_checks.sh
new file mode 100755 (executable)
index 0000000..83082ad
--- /dev/null
@@ -0,0 +1,31 @@
+#!/bin/bash
+make clean
+
+mkdir abi
+ABI_CHECKS="-aux-info abi/\$@.X"
+make ABI_CHECK="$ABI_CHECKS"
+
+for i in abi/*.X; do cat $i | grep 'tevent\.h'; done | sort | uniq | awk -F "extern " '{ print $2 }' > abi/signatures
+
+cat > abi/exports << EOF
+{
+    global:
+EOF
+cat abi/signatures | awk -F '(' '{ print $1 }' | awk -F ' ' '{ print "           "$NF";" }' | tr -d '*' | sort >> abi/exports
+cat >> abi/exports << EOF
+
+    local: *;
+};
+EOF
+
+rm -fr abi/*.X
+
+diff -u tevent.signatures abi/signatures
+if [ "$?" != "0" ]; then
+    echo "WARNING: Possible ABI Change!!"
+fi
+
+diff -u tevent.exports abi/exports
+if [ "$?" != "0" ]; then
+    echo "WARNING: Export file may be outdated!!"
+fi
index 0d3f21d7d7a8ca62075149a769659387127f405f..d40e02e15a2c169174e7c3c385223bf0aa6d4796 100644 (file)
@@ -7,6 +7,7 @@ AC_LIBREPLACE_ALL_CHECKS
 
 AC_LD_EXPORT_DYNAMIC
 AC_LD_SONAMEFLAG
+AC_LD_VERSIONSCRIPT
 AC_LD_PICFLAG
 AC_LD_SHLIBEXT
 AC_LIBREPLACE_SHLD
index 20730b17d646efd78fb5057ae45c14e6aed853f3..4162ba30f977b55f194b5c26a910ae3d3a36cad9 100644 (file)
@@ -38,3 +38,8 @@ if test x"$ac_cv_header_sys_epoll_h" = x"yes" -a x"$ac_cv_func_epoll_create" = x
    AC_DEFINE(HAVE_EPOLL, 1, [Whether epoll available])
 fi
 
+if test x"$VERSIONSCRIPT" != "x"; then
+    EXPORTSFILE=tevent.exports
+    AC_SUBST(EXPORTSFILE)
+fi
+
index 28a2515b01b711dac69875f5f96b0d1b82980057..c197e930a3cbd03f631bfc07b7e4953db63da7ff 100644 (file)
@@ -12,7 +12,7 @@ showflags::
 .c.o:
        @echo Compiling $*.c
        @mkdir -p `dirname $@`
-       @$(CC) $(PICFLAG) $(CFLAGS) -c $< -o $@
+       @$(CC) $(PICFLAG) $(CFLAGS) $(ABI_CHECK) -c $< -o $@
 
 distclean::
        rm -f *~ */*~
diff --git a/lib/tevent/tevent.exports b/lib/tevent/tevent.exports
new file mode 100644 (file)
index 0000000..7d55c17
--- /dev/null
@@ -0,0 +1,59 @@
+{
+    global:
+           _tevent_add_fd;
+           _tevent_add_signal;
+           _tevent_add_timer;
+           tevent_backend_list;
+           tevent_context_init;
+           tevent_context_init_byname;
+           _tevent_create_immediate;
+           tevent_fd_get_flags;
+           tevent_fd_set_auto_close;
+           tevent_fd_set_close_fn;
+           tevent_fd_set_flags;
+           tevent_loop_allow_nesting;
+           _tevent_loop_once;
+           tevent_loop_set_nesting_hook;
+           _tevent_loop_until;
+           _tevent_loop_wait;
+           tevent_queue_add;
+           _tevent_queue_create;
+           tevent_queue_length;
+           tevent_queue_start;
+           tevent_queue_stop;
+           _tevent_req_callback_data;
+           _tevent_req_create;
+           _tevent_req_data;
+           tevent_req_default_print;
+           _tevent_req_done;
+           _tevent_req_error;
+           tevent_req_is_error;
+           tevent_req_is_in_progress;
+           _tevent_req_nomem;
+           _tevent_req_notify_callback;
+           tevent_req_poll;
+           tevent_req_post;
+           tevent_req_print;
+           tevent_req_received;
+           tevent_req_set_callback;
+           tevent_req_set_endtime;
+           tevent_req_set_print_fn;
+           _tevent_schedule_immediate;
+           tevent_set_abort_fn;
+           tevent_set_debug;
+           tevent_set_debug_stderr;
+           tevent_set_default_backend;
+           tevent_signal_support;
+           tevent_timeval_add;
+           tevent_timeval_compare;
+           tevent_timeval_current;
+           tevent_timeval_current_ofs;
+           tevent_timeval_is_zero;
+           tevent_timeval_set;
+           tevent_timeval_until;
+           tevent_timeval_zero;
+           tevent_wakeup_recv;
+           tevent_wakeup_send;
+
+    local: *;
+};
diff --git a/lib/tevent/tevent.signatures b/lib/tevent/tevent.signatures
new file mode 100644 (file)
index 0000000..fab5f64
--- /dev/null
@@ -0,0 +1,54 @@
+struct tevent_signal *_tevent_add_signal (struct tevent_context *, TALLOC_CTX *, int, int, tevent_signal_handler_t, void *, const char *, const char *);
+int _tevent_loop_once (struct tevent_context *, const char *);
+int _tevent_loop_wait (struct tevent_context *, const char *);
+void tevent_fd_set_close_fn (struct tevent_fd *, tevent_fd_close_fn_t);
+void tevent_fd_set_auto_close (struct tevent_fd *);
+uint16_t tevent_fd_get_flags (struct tevent_fd *);
+void tevent_fd_set_flags (struct tevent_fd *, uint16_t);
+_Bool tevent_signal_support (struct tevent_context *);
+void tevent_set_abort_fn (void (*) (const char *));
+int tevent_set_debug (struct tevent_context *, void (*) (void *, enum tevent_debug_level, const char *, __va_list_tag *), void *);
+int tevent_set_debug_stderr (struct tevent_context *);
+void tevent_req_set_callback (struct tevent_req *, tevent_req_fn, void *);
+void *_tevent_req_callback_data (struct tevent_req *);
+void *_tevent_req_data (struct tevent_req *);
+void tevent_req_set_print_fn (struct tevent_req *, tevent_req_print_fn);
+char *tevent_req_default_print (struct tevent_req *, TALLOC_CTX *);
+char *tevent_req_print (TALLOC_CTX *, struct tevent_req *);
+struct tevent_req *_tevent_req_create (TALLOC_CTX *, void *, size_t, const char *, const char *);
+_Bool tevent_req_set_endtime (struct tevent_req *, struct tevent_context *, struct timeval);
+void _tevent_req_notify_callback (struct tevent_req *, const char *);
+void _tevent_req_done (struct tevent_req *, const char *);
+_Bool _tevent_req_error (struct tevent_req *, uint64_t, const char *);
+_Bool _tevent_req_nomem (const void *, struct tevent_req *, const char *);
+struct tevent_req *tevent_req_post (struct tevent_req *, struct tevent_context *);
+_Bool tevent_req_is_in_progress (struct tevent_req *);
+_Bool tevent_req_poll (struct tevent_req *, struct tevent_context *);
+_Bool tevent_req_is_error (struct tevent_req *, enum tevent_req_state *, uint64_t *);
+void tevent_req_received (struct tevent_req *);
+struct tevent_req *tevent_wakeup_send (TALLOC_CTX *, struct tevent_context *, struct timeval);
+_Bool tevent_wakeup_recv (struct tevent_req *);
+int tevent_timeval_compare (const struct timeval *, const struct timeval *);
+struct timeval tevent_timeval_zero (void);
+struct timeval tevent_timeval_current (void);
+struct timeval tevent_timeval_set (uint32_t, uint32_t);
+struct timeval tevent_timeval_until (const struct timeval *, const struct timeval *);
+_Bool tevent_timeval_is_zero (const struct timeval *);
+struct timeval tevent_timeval_add (const struct timeval *, uint32_t, uint32_t);
+struct timeval tevent_timeval_current_ofs (uint32_t, uint32_t);
+struct tevent_queue *_tevent_queue_create (TALLOC_CTX *, const char *, const char *);
+_Bool tevent_queue_add (struct tevent_queue *, struct tevent_context *, struct tevent_req *, tevent_queue_trigger_fn_t, void *);
+void tevent_queue_start (struct tevent_queue *);
+void tevent_queue_stop (struct tevent_queue *);
+size_t tevent_queue_length (struct tevent_queue *);
+void tevent_loop_allow_nesting (struct tevent_context *);
+void tevent_loop_set_nesting_hook (struct tevent_context *, tevent_nesting_hook, void *);
+int _tevent_loop_until (struct tevent_context *, _Bool (*) (void *), void *, const char *);
+struct tevent_context *tevent_context_init (TALLOC_CTX *);
+struct tevent_context *tevent_context_init_byname (TALLOC_CTX *, const char *);
+const char **tevent_backend_list (TALLOC_CTX *);
+void tevent_set_default_backend (const char *);
+struct tevent_fd *_tevent_add_fd (struct tevent_context *, TALLOC_CTX *, int, uint16_t, tevent_fd_handler_t, void *, const char *, const char *);
+struct tevent_timer *_tevent_add_timer (struct tevent_context *, TALLOC_CTX *, struct timeval, tevent_timer_handler_t, void *, const char *, const char *);
+struct tevent_immediate *_tevent_create_immediate (TALLOC_CTX *, const char *);
+void _tevent_schedule_immediate (struct tevent_immediate *, struct tevent_context *, tevent_immediate_handler_t, void *, const char *, const char *);