diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2014-03-21 15:19:28 +0000 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2014-03-25 12:22:05 +0000 |
commit | af931584f6706a0ba14410a2050faa0c557da3d6 (patch) | |
tree | fe6c7395f8b2cec6d6a043ca656dca5fd107064a | |
parent | ebf2e98432b20403517cf78d5983258b03a08326 (diff) | |
download | telepathy-glib-af931584f6706a0ba14410a2050faa0c557da3d6.tar.gz |
Add ABI management for telepathy-logger
This requires some enhancements to make-version-script.py
so it can support a separate ABI-version for private symbols,
like those used by the telepathy-logger daemon.
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=76462
Reviewed-by: Xavier Claessens
-rw-r--r-- | telepathy-logger/1.0.abi | 70 | ||||
-rw-r--r-- | telepathy-logger/Makefile.am | 17 | ||||
-rw-r--r-- | telepathy-logger/abi.am | 72 | ||||
-rw-r--r-- | tools/make-version-script.py | 75 |
4 files changed, 217 insertions, 17 deletions
diff --git a/telepathy-logger/1.0.abi b/telepathy-logger/1.0.abi new file mode 100644 index 000000000..2a64d2a26 --- /dev/null +++ b/telepathy-logger/1.0.abi @@ -0,0 +1,70 @@ +Version: TELEPATHY_LOGGER_1.0 +Extends: - +Release: 1.0 + +tpl_call_event_get_detailed_end_reason +tpl_call_event_get_duration +tpl_call_event_get_end_actor +tpl_call_event_get_end_reason +tpl_call_event_get_type +tpl_debug_set_flags +tpl_entity_get_alias +tpl_entity_get_avatar_token +tpl_entity_get_entity_type +tpl_entity_get_identifier +tpl_entity_get_type +tpl_entity_new +tpl_entity_new_from_room_id +tpl_entity_new_from_tp_contact +tpl_event_equal +tpl_event_get_account +tpl_event_get_account_path +tpl_event_get_receiver +tpl_event_get_sender +tpl_event_get_timestamp +tpl_event_get_type +tpl_log_iter_get_events +tpl_log_iter_get_type +tpl_log_iter_pidgin_get_type +tpl_log_iter_pidgin_new +tpl_log_iter_rewind +tpl_log_iter_xml_get_type +tpl_log_iter_xml_new +tpl_log_manager_disable_for_entity +tpl_log_manager_dup_singleton +tpl_log_manager_enable_for_entity +tpl_log_manager_errors_quark +tpl_log_manager_exists +tpl_log_manager_get_dates_async +tpl_log_manager_get_dates_finish +tpl_log_manager_get_entities_async +tpl_log_manager_get_entities_finish +tpl_log_manager_get_events_for_date_async +tpl_log_manager_get_events_for_date_finish +tpl_log_manager_get_filtered_events_async +tpl_log_manager_get_filtered_events_finish +tpl_log_manager_get_type +tpl_log_manager_is_disabled_for_entity +tpl_log_manager_search_async +tpl_log_manager_search_finish +tpl_log_manager_search_free +tpl_log_manager_walk_filtered_events +tpl_log_store_pidgin_get_type +tpl_log_walker_add_iter +tpl_log_walker_get_events_async +tpl_log_walker_get_events_finish +tpl_log_walker_get_type +tpl_log_walker_is_end +tpl_log_walker_is_start +tpl_log_walker_new +tpl_log_walker_rewind_async +tpl_log_walker_rewind_finish +tpl_marshal_VOID__BOXED_BOXED +tpl_marshal_VOID__UINT_UINT_BOXED_BOXED +tpl_text_event_get_edit_timestamp +tpl_text_event_get_message +tpl_text_event_get_message_token +tpl_text_event_get_message_type +tpl_text_event_get_supersedes +tpl_text_event_get_supersedes_token +tpl_text_event_get_type diff --git a/telepathy-logger/Makefile.am b/telepathy-logger/Makefile.am index 27187d0c7..7d55e72d1 100644 --- a/telepathy-logger/Makefile.am +++ b/telepathy-logger/Makefile.am @@ -42,6 +42,7 @@ pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = telepathy-logger-1.pc lib_LTLIBRARIES = libtelepathy-logger-1.la +noinst_LTLIBRARIES = libtelepathy-logger-internal.la EXTRA_DIST = \ tpl-marshal.list \ @@ -70,7 +71,7 @@ BUILT_SOURCES = \ tpl-marshal.c tpl-marshal.h \ $(NULL) -libtelepathy_logger_1_la_SOURCES = \ +libtelepathy_logger_internal_la_SOURCES = \ action-chain.c \ action-chain-internal.h \ call-event.c \ @@ -119,18 +120,21 @@ libtelepathy_logger_1_la_SOURCES = \ call-channel-internal.h \ $(NULL) -nodist_libtelepathy_logger_1_la_SOURCES = \ +nodist_libtelepathy_logger_internal_la_SOURCES = \ $(BUILT_SOURCES) -libtelepathy_logger_1_la_LIBADD = \ +libtelepathy_logger_internal_la_LIBADD = \ $(top_builddir)/telepathy-glib/libtelepathy-glib-1.la \ $(top_builddir)/telepathy-glib/libtelepathy-glib-1-dbus.la \ $(top_builddir)/telepathy-glib/libtelepathy-glib-1-core.la \ $(TPL_LIBS) \ $(NULL) +libtelepathy_logger_1_la_SOURCES= +libtelepathy_logger_1_la_LIBADD = libtelepathy-logger-internal.la + check_c_sources = \ - $(libtelepathy_logger_1_la_SOURCES) \ + $(libtelepathy_logger_internal_la_SOURCES) \ $(telepathy_logger_SOURCES) \ $(LIBTPL_HEADERS) include $(top_srcdir)/tools/check-coding-style.mk @@ -139,7 +143,10 @@ check-local: check-coding-style CLEANFILES = $(BUILT_SOURCES) if HAVE_INTROSPECTION -introspection_sources = $(libtelepathy_logger_1_la_SOURCES) $(LIBTPL_HEADERS) +introspection_sources = \ + $(libtelepathy_logger_internal_la_SOURCES) \ + $(LIBTPL_HEADERS) \ + $(NULL) TelepathyLogger-1.gir: libtelepathy-logger-1.la TelepathyLogger_1_gir_SCANNERFLAGS = --identifier-prefix=Tpl --warn-all diff --git a/telepathy-logger/abi.am b/telepathy-logger/abi.am index d63e84765..7a6554389 100644 --- a/telepathy-logger/abi.am +++ b/telepathy-logger/abi.am @@ -6,11 +6,77 @@ libtelepathy_logger_1_la_LDFLAGS = \ -version-info "$(TPL_LT_CURRENT)":"$(TPL_LT_REVISION)":"$(TPL_LT_AGE)" -_gen/abi.txt: libtelepathy-logger-1.la abi.am - $(NM) .libs/libtelepathy-logger.a > _gen/abi.nm +nodist_libtelepathy_logger_1_la_SOURCES = + +libtelepathy_logger_1_la_DEPENDENCIES = \ + libtelepathy-logger-internal.la \ + abi.am \ + $(NULL) + +if HAVE_LD_VERSION_SCRIPT + +libtelepathy_logger_1_la_LDFLAGS += \ + $(VERSION_SCRIPT_ARG)=_gen/version-script.txt \ + $(NULL) + +libtelepathy_logger_1_la_DEPENDENCIES += \ + _gen/version-script.txt \ + $(NULL) + +else + +# we have to export _* for the regression tests +libtelepathy_logger_1_la_LDFLAGS += \ + -export-symbols-regex '^_?tpl' \ + $(NULL) + +endif + +# Must put oldest versions first +ABI_LISTS = \ + 1.0.abi \ + $(NULL) + +_gen/abi.txt: libtelepathy-logger-internal.la abi.am + $(MKDIR_P) _gen + $(NM) .libs/libtelepathy-logger-internal.a > _gen/abi.nm grep " [DT] " < _gen/abi.nm > _gen/abi.funcs cut -d" " -f3 < _gen/abi.funcs > _gen/abi.funcnames - grep "^tpl" < _gen/abi.funcnames > _gen/abi.tpfuncnames + grep "^_\\?tpl" < _gen/abi.funcnames > _gen/abi.tpfuncnames $(AM_V_GEN)sort -u < _gen/abi.tpfuncnames > $@ +MAKE_VERSION_SCRIPT_FLAGS = \ + --private-version TELEPATHY_LOGGER_PRIVATE \ + $(NULL) + +if !OFFICIAL_RELEASE +# allow new ABI, and silently put it in a dummy version (which can be used to +# check whether binaries have been linked against unguaranteed ABI) +MAKE_VERSION_SCRIPT_FLAGS += \ + --unreleased-version=TELEPATHY_LOGGER_@VERSION@_UNRELEASED \ + $(NULL) +endif + +_gen/version-script.txt: \ + $(ABI_LISTS) \ + _gen/abi.txt \ + abi.am \ + $(top_srcdir)/tools/make-version-script.py \ + $(NULL) + $(AM_V_GEN)set -e; \ + $(PYTHON) $(top_srcdir)/tools/make-version-script.py \ + --symbols=_gen/abi.txt $(MAKE_VERSION_SCRIPT_FLAGS) \ + $(patsubst %,$(srcdir)/%,$(ABI_LISTS)) > $@ + $(AM_V_GEN)set -e; \ + $(PYTHON) $(top_srcdir)/tools/make-version-script.py \ + --symbols=_gen/abi.txt $(MAKE_VERSION_SCRIPT_FLAGS) \ + --dpkg "libtelepathy-logger-1.so.0 #PACKAGE# #MINVER#" \ + --dpkg-build-depends-package "libtelepathy-logger-1-dev" \ + $(patsubst %,$(srcdir)/%,$(ABI_LISTS)) \ + > _gen/libtelepathy-logger-1-0.symbols + sed -n -e "s/^[ ]*\\(_\\?tpl_.*\\);/\\1/p" < $@ > _gen/versioned-abi.tmp + sort -u < _gen/versioned-abi.tmp > _gen/versioned-abi.txt + : # the versioned API should always match the ^tp API + diff -c _gen/versioned-abi.txt _gen/abi.txt + # vim:ft=automake: diff --git a/tools/make-version-script.py b/tools/make-version-script.py index 4ced849fe..1fe6b90d3 100644 --- a/tools/make-version-script.py +++ b/tools/make-version-script.py @@ -5,6 +5,7 @@ RFC822-style symbol lists. Usage: make-version-script.py [--symbols SYMBOLS] [--unreleased-version VER] + [--private-version VER] [--dpkg "LIBRARY.so.0 LIBRARY0 #MINVER#"] [--dpkg-build-depends-package LIBRARY-dev] [FILES...] @@ -30,7 +31,7 @@ This script originates in telepathy-glib <http://telepathy.freedesktop.org/> - please send us any changes that are needed. """ -# Copyright (C) 2008-2010 Collabora Ltd. <http://www.collabora.co.uk/> +# Copyright (C) 2008-2014 Collabora Ltd. <http://www.collabora.co.uk/> # Copyright (C) 2008 Nokia Corporation # # Copying and distribution of this file, with or without modification, @@ -45,8 +46,25 @@ def e(format, *args): sys.stderr.write((format + '\n') % args) +def verscmp(a, b): + """verscmp(a, b) OP 0 == a OP b, for OP in (==, <=, etc.)""" + a = a.split('.') + b = b.split('.') + i = 0 + la = len(a) + lb = len(b) + while True: + if la == i and lb == i: + return 0 # a == b + if la == i: + return -1 # a < b, e.g. 1.2 < 1.2.3 + if lb == i: + return 1 # a > b, e.g. 1.2.3 > 1.2 + return cmp(int(a[i]), int(b[i])) + def main(abifiles, symbols=None, unreleased_version=None, - dpkg=False, dpkg_first_line=None, dpkg_build_depends_package=None): + dpkg=False, dpkg_first_line=None, dpkg_build_depends_package=None, + private_version=None): gnuld = not dpkg symbol_set = None @@ -60,12 +78,9 @@ def main(abifiles, symbols=None, unreleased_version=None, dpkg_symbols = [] dpkg_versions = [] + private_symbols = [] - if dpkg: - assert dpkg_first_line is not None - print(dpkg_first_line) - if dpkg_build_depends_package is not None: - print("* Build-Depends-Package: %s" % dpkg_build_depends_package) + version = None for filename in abifiles: lines = open(filename, 'r').readlines() @@ -92,7 +107,12 @@ def main(abifiles, symbols=None, unreleased_version=None, extends = line continue elif line.lower().startswith('release:'): - release = line[8:].strip() + line = line[8:].strip() + if release is not None and verscmp(release, line) >= 0: + e('Versions not in ascending order: %s >= %s', + release, line) + raise SystemExit(1) + release = line continue else: e('Could not understand line in %s header: %s', filename, line) @@ -150,6 +170,20 @@ def main(abifiles, symbols=None, unreleased_version=None, print("") if dpkg: + assert dpkg_first_line is not None + print(dpkg_first_line) + if private_version is not None: + # "1.2.3" < "1.2.3." < "1.2.3.1" < "1.2.4" in Debian packaging. + # Also, in practice the version will be 1.2.3-1 or something, + # or possibly 1.2.3+dfsg1-1, which satisfy + # "1.2.3" < "1.2.3-1" < "1.2.3+" < "1.2.3.", so 1.2.3-1 and + # 1.2.3+dfsg1-1 both satisfy this restrictive dependency. + print('| #PACKAGE# (>= %s), #PACKAGE# (<< %s.)' + % (release, release)) + + if dpkg_build_depends_package is not None: + print("* Build-Depends-Package: %s" % dpkg_build_depends_package) + dpkg_symbols.sort() dpkg_versions.sort() @@ -172,6 +206,28 @@ def main(abifiles, symbols=None, unreleased_version=None, unreleased = symbol_set - versioned_symbols + if private_version is not None: + private = set([symbol + for symbol in unreleased + if symbol.startswith('_')]) + + if private: + if gnuld: + print('%s {' % private_version) + print(' global:') + + for symbol in private: + print(' %s;' % symbol) + + print('};') + elif dpkg: + for symbol in private: + print(' %s@%s 0 1' % (symbol, private_version)) + + unreleased = set([symbol + for symbol in unreleased + if symbol not in private]) + if unreleased: if unreleased_version is None: e('Unversioned symbols are not allowed in releases:') @@ -194,7 +250,8 @@ def main(abifiles, symbols=None, unreleased_version=None, if __name__ == '__main__': options, argv = gnu_getopt (sys.argv[1:], '', ['symbols=', 'unreleased-version=', - 'dpkg=', 'dpkg-build-depends-package=']) + 'dpkg=', 'dpkg-build-depends-package=', + 'private-version=']) opts = {'dpkg': False} |