Skip to content

Commit

Permalink
Build: Add support for shared libraries and versioning.
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Ben Pfaff <[email protected]>
  • Loading branch information
Scott Mann authored and blp committed Nov 12, 2014
1 parent 86f35fb commit 7f2f24e
Show file tree
Hide file tree
Showing 12 changed files with 81 additions and 6 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*.pyc
*.so
*.suo
**/*.sym
*~
*,cover
.#*
Expand Down
2 changes: 2 additions & 0 deletions .travis/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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)"
Expand Down
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ Samuel Ghinet [email protected]
Sanjay Sane [email protected]
Saurabh Shah [email protected]
Scott Lowe [email protected]
Scott Mann [email protected]
Selvamuthukumar [email protected]
Shan Wei [email protected]
Shih-Hao Li [email protected]
Expand Down
43 changes: 42 additions & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -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])
Expand Down Expand Up @@ -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])
Expand Down
8 changes: 6 additions & 2 deletions lib/automake.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down Expand Up @@ -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 \
Expand Down
4 changes: 4 additions & 0 deletions lib/libopenvswitch.sym.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
libopenvswitch_@LT_CURRENT@ {
global:
*;
};
4 changes: 4 additions & 0 deletions lib/libsflow.sym.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
libsflow_@LT_CURRENT@ {
global:
*;
};
8 changes: 7 additions & 1 deletion lib/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
4 changes: 3 additions & 1 deletion ofproto/automake.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
4 changes: 4 additions & 0 deletions ofproto/libofproto.sym.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
libofproto_@LT_CURRENT@ {
global:
*;
};
4 changes: 3 additions & 1 deletion ovsdb/automake.mk
Original file line number Diff line number Diff line change
@@ -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 \
Expand Down
4 changes: 4 additions & 0 deletions ovsdb/libovsdb.sym.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
libovsdb_@LT_CURRENT@ {
global:
*;
};

0 comments on commit 7f2f24e

Please sign in to comment.