[ovs-dev] [PATCH v2] Build: Add shared libraries and versioning

Scott Mann smann at noironetworks.com
Thu Oct 30 02:25:23 UTC 2014


These changes allow for the building of shared libraries by providing
the --enable-shared option to configure. In particular, lib/libopenvwitch.so,
lib/libsflow.so, ofproto/libofproto.so, and ovsdb/libovsdb.so will be built.
Original behavior of building static remains the same.

Additionally, versioning is introduced to each of the libraries objects
paving the way for APIs to be built around them. A detailed comment
outlining the rules for changing a version number is provided in
configure.ac. Note that at this time, the version number is set to
1.0.0, no API is specified yet, and there are no requirements to
maintain any sort of compatibility in any of the libraries.

Signed-off-by: Scott Mann <smann at noironetworks.com>
---
This is v2 of the shared library build patch. Changes include:
make static build default (attribute to Ben Pfaff)
remove changes to vlog.h and await a better fix
(attribute to Ben Pfaff and Thomas Graf)
fix C-style issues (attribute to Ben Pfaff)
fix --with-dpdk build issues (attribute to Thomas Graf)
---
 .gitignore                |  1 +
 .travis/build.sh          |  2 ++
 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 ++++
 11 files changed, 80 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/.gitignore b/.gitignore
index 800352c..8201d50 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@
 *.pyc
 *.so
 *.suo
+**/*.sym
 *~
 *,cover
 .#*
diff --git a/.travis/build.sh b/.travis/build.sh
index 5dba4fe..d56350f 100755
--- a/.travis/build.sh
+++ b/.travis/build.sh
@@ -24,6 +24,8 @@ function install_dpdk()
     cd dpdk-1.7.1
     find ./ -type f | xargs sed -i 's/max-inline-insns-single=100/max-inline-insns-single=400/'
     sed -ri 's,(CONFIG_RTE_BUILD_COMBINE_LIBS=).*,\1y,' config/common_linuxapp
+    sed -ri '/CONFIG_RTE_LIBNAME/a CONFIG_RTE_BUILD_FPIC=y' config/common_linuxapp
+    sed -ri '/EXECENV_CFLAGS  = -pthread -fPIC/{s/$/\nelse ifeq ($(CONFIG_RTE_BUILD_FPIC),y)/;s/$/\nEXECENV_CFLAGS  = -pthread -fPIC/}' mk/exec-env/linuxapp/rte.vars.mk
     make config CC=gcc T=x86_64-native-linuxapp-gcc
     make CC=gcc RTE_KERNELDIR=$KERNELSRC
     echo "Installed DPDK source in $(pwd)"
diff --git a/configure.ac b/configure.ac
index 62224b9..9fa94f3 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 7572e95..d79bb2c 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 \
@@ -289,7 +291,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_ at 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_ at 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_ at 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_ at LT_CURRENT@ {
+global:
+        *;
+};
-- 
1.9.3




More information about the dev mailing list