summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2014-03-21 15:19:28 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2014-03-25 12:22:05 +0000
commitaf931584f6706a0ba14410a2050faa0c557da3d6 (patch)
treefe6c7395f8b2cec6d6a043ca656dca5fd107064a
parentebf2e98432b20403517cf78d5983258b03a08326 (diff)
downloadtelepathy-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.abi70
-rw-r--r--telepathy-logger/Makefile.am17
-rw-r--r--telepathy-logger/abi.am72
-rw-r--r--tools/make-version-script.py75
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}