From 7f2f24e379d9ca65c20d072a6c0adb1c6c8a9cce Mon Sep 17 00:00:00 2001 From: Scott Mann Date: Fri, 7 Nov 2014 19:02:09 -0800 Subject: [PATCH] Build: Add support for shared libraries and versioning. --- AUTHORS | 1 + configure.ac | 43 ++++++++++++++++++++++++++++++++++++++++++- lib/automake.mk | 8 ++++++-- lib/libopenvswitch.sym.in | 4 ++++ lib/libsflow.sym.in | 4 ++++ lib/util.c | 8 +++++++- ofproto/automake.mk | 4 +++- ofproto/libofproto.sym.in | 4 ++++ ovsdb/automake.mk | 4 +++- ovsdb/libovsdb.sym.in | 4 ++++ 12 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 lib/libopenvswitch.sym.in create mode 100644 lib/libsflow.sym.in create mode 100644 ofproto/libofproto.sym.in create mode 100644 ovsdb/libovsdb.sym.in diff --git a/configure.ac b/configure.ac index 62224b9..c3b26ec 100644 --- a/configure.ac +++ b/configure.ac @@ -43,6 +43,41 @@ AC_SYS_LARGEFILE LT_INIT([disable-shared]) m4_pattern_forbid([LT_INIT]) dnl Make autoconf fail if libtool is missing. +# The following explanation may help to understand the use of the +# version number fields: current, revision, and age. +# +# Consider that there are three possible kinds of reactions from +# users of your library to changes in a shared library: +# +# 1. Programs using the previous version may use the new version as drop-in +# replacement, and programs using the new version can also work with the +# previous one. In other words, no recompiling nor relinking is needed. +# In short, there are no changes to any symbols, no symbols removed, +# and no symbols added. In this case, bump revision only, don't touch +# current nor age. +# +# 2. Programs using the previous version may use the new version as drop-in +# replacement, but programs using the new version may use APIs not +# present in the previous one. In other words, new symbols have been +# added and a program linking against the new version may fail with +# “unresolved symbols.” If linking against the old version at runtime: +# set revision to 0, bump current and age. +# +# 3. Programs may need to be changed, recompiled, relinked in order to use +# the new version. This is the case when symbols have been modified or +# deleted. Bump current, set revision and age to 0. + +m4_define([libopenvswitch_lt_current], [1]) +m4_define([libopenvswitch_lt_revision], [0]) +m4_define([libopenvswitch_lt_age], [0]) + +LT_CURRENT=libopenvswitch_lt_current +AC_SUBST([LT_CURRENT]) +LT_REVISION=libopenvswitch_lt_revision +AC_SUBST([LT_REVISION]) +LT_AGE=libopenvswitch_lt_age +AC_SUBST([LT_AGE]) + AC_SEARCH_LIBS([pow], [m]) AC_SEARCH_LIBS([clock_gettime], [rt]) AC_SEARCH_LIBS([timer_create], [rt]) @@ -94,7 +129,13 @@ OVS_CHECK_LINUX_HOST AX_FUNC_POSIX_MEMALIGN OVS_CHECK_INCLUDE_NEXT([stdio.h string.h]) -AC_CONFIG_FILES([lib/stdio.h lib/string.h]) +AC_CONFIG_FILES([ + lib/stdio.h + lib/string.h + ovsdb/libovsdb.sym + ofproto/libofproto.sym + lib/libsflow.sym + lib/libopenvswitch.sym]) OVS_ENABLE_OPTION([-Wall]) OVS_ENABLE_OPTION([-Wextra]) diff --git a/lib/automake.mk b/lib/automake.mk index 783e657..f30459c 100644 --- a/lib/automake.mk +++ b/lib/automake.mk @@ -13,7 +13,9 @@ if WIN32 lib_libopenvswitch_la_LIBADD += ${PTHREAD_LIBS} endif -lib_libopenvswitch_la_LDFLAGS = -release $(VERSION) +lib_libopenvswitch_la_LDFLAGS = \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -Wl,--version-script=$(top_builddir)/lib/libopenvswitch.sym lib_libopenvswitch_la_SOURCES = \ lib/aes128.c \ @@ -291,7 +293,9 @@ nodist_lib_libopenvswitch_la_SOURCES = \ CLEANFILES += $(nodist_lib_libopenvswitch_la_SOURCES) lib_LTLIBRARIES += lib/libsflow.la -lib_libsflow_la_LDFLAGS = -release $(VERSION) +lib_libsflow_la_LDFLAGS = \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -Wl,--version-script=$(top_builddir)/lib/libsflow.sym lib_libsflow_la_SOURCES = \ lib/sflow_api.h \ lib/sflow.h \ diff --git a/lib/libopenvswitch.sym.in b/lib/libopenvswitch.sym.in new file mode 100644 index 0000000..fdfc5bb --- /dev/null +++ b/lib/libopenvswitch.sym.in @@ -0,0 +1,4 @@ +libopenvswitch_@LT_CURRENT@ { +global: + *; +}; diff --git a/lib/libsflow.sym.in b/lib/libsflow.sym.in new file mode 100644 index 0000000..88b9cc1 --- /dev/null +++ b/lib/libsflow.sym.in @@ -0,0 +1,4 @@ +libsflow_@LT_CURRENT@ { +global: + *; +}; diff --git a/lib/util.c b/lib/util.c index fb2ff51..1b9eea6 100644 --- a/lib/util.c +++ b/lib/util.c @@ -471,9 +471,15 @@ set_program_name__(const char *argv0, const char *version, const char *date, assert_single_threaded(); free(program_name); + /* Remove libtool prefix, if it is there */ + if (strncmp(basename, "lt-", 3) == 0) { + char *tmp_name = basename; + basename = xstrdup(basename + 3); + free(tmp_name); + } program_name = basename; - free(program_version); + free(program_version); if (!strcmp(version, VERSION)) { program_version = xasprintf("%s (Open vSwitch) "VERSION"\n" "Compiled %s %s\n", diff --git a/ofproto/automake.mk b/ofproto/automake.mk index 399f2b6..bb4bc7e 100644 --- a/ofproto/automake.mk +++ b/ofproto/automake.mk @@ -6,7 +6,9 @@ # without warranty of any kind. lib_LTLIBRARIES += ofproto/libofproto.la -ofproto_libofproto_la_LDFLAGS = -release $(VERSION) +ofproto_libofproto_la_LDFLAGS = \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -Wl,--version-script=$(top_builddir)/ofproto/libofproto.sym ofproto_libofproto_la_SOURCES = \ ofproto/bond.c \ ofproto/bond.h \ diff --git a/ofproto/libofproto.sym.in b/ofproto/libofproto.sym.in new file mode 100644 index 0000000..cdd4327 --- /dev/null +++ b/ofproto/libofproto.sym.in @@ -0,0 +1,4 @@ +libofproto_@LT_CURRENT@ { +global: + *; +}; diff --git a/ovsdb/automake.mk b/ovsdb/automake.mk index 00a0b01..7a8d7d2 100644 --- a/ovsdb/automake.mk +++ b/ovsdb/automake.mk @@ -1,6 +1,8 @@ # libovsdb lib_LTLIBRARIES += ovsdb/libovsdb.la -ovsdb_libovsdb_la_LDFLAGS = -release $(VERSION) +ovsdb_libovsdb_la_LDFLAGS = \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -Wl,--version-script=$(top_builddir)/ovsdb/libovsdb.sym ovsdb_libovsdb_la_SOURCES = \ ovsdb/column.c \ ovsdb/column.h \ diff --git a/ovsdb/libovsdb.sym.in b/ovsdb/libovsdb.sym.in new file mode 100644 index 0000000..71ae4e8 --- /dev/null +++ b/ovsdb/libovsdb.sym.in @@ -0,0 +1,4 @@ +libovsdb_@LT_CURRENT@ { +global: + *; +}; -- libgit2 0.21.4