[ovs-dev] [PATCH ovn] Build OVN using external OVS directory

nusiddiq at redhat.com nusiddiq at redhat.com
Wed Jul 31 18:38:33 UTC 2019


From: Numan Siddique <nusiddiq at redhat.com>

With this patch we have to configure OVN to refer to external OVS source/build
directory instead of the ovs subtree.

The new configuration options added are:
 * --with-ovs-source=/path/to/ovs/source/dir
 * --with-ovs-build=/path/to/ovs/build/dir

Before configuring OVN, user should configure and compile OVS. If the user has
configured OVS on a different directory than the source dir, then 'with-ovs-build'
should be specified.

If ovs-build dir is not defined, then ovs-source is used.

An upcoming patch will delete the ovs subtree.

Example usage:
  $ # Clone OVS repo
  $cd /home/foo/ovs
  $./boot.sh
  $mkdir _gcc
  $cd _gcc && ../configure && cd ..
  $make -C _gcc

  $ # Clone OVN repo
  $cd /home/foo/ovn
  $./boot.sh
  $./configure --with-ovs-source=/home/foo/ovs/ --with-ovs-build=/home/foo/ovs/_gcc
  $make

Signed-off-by: Numan Siddique <nusiddiq at redhat.com>
---
 .travis/linux-build.sh                  | 16 +++++++++--
 Documentation/intro/install/general.rst | 32 +++++++++++++++++-----
 Makefile.am                             | 24 +++++++----------
 acinclude.m4                            | 35 +++++++++++++++++++++++++
 configure.ac                            | 29 ++++++++++----------
 controller-vtep/automake.mk             |  2 +-
 include/ovn/version.h.in                | 28 ++++++++++++++++++++
 lib/ovsdb_automake.mk                   | 12 ++++-----
 tests/automake.mk                       |  2 +-
 9 files changed, 136 insertions(+), 44 deletions(-)
 create mode 100644 include/ovn/version.h.in

diff --git a/.travis/linux-build.sh b/.travis/linux-build.sh
index a20474345..14c5413db 100755
--- a/.travis/linux-build.sh
+++ b/.travis/linux-build.sh
@@ -8,9 +8,21 @@ SPARSE_FLAGS=""
 EXTRA_OPTS=""
 TARGET="x86_64-native-linuxapp-gcc"
 
+ovs_dir=$PWD/ovs_src
+
 function configure_ovs()
 {
+    git clone https://github.com/openvswitch/ovs.git $ovs_dir
+    pushd $ovs_dir
     ./boot.sh && ./configure $* || { cat config.log; exit 1; }
+    make -j4
+    popd
+}
+
+function configure_ovn()
+{
+    configure_ovs
+    ./boot.sh && ./configure --with-ovs-source=$ovs_dir $* || { cat config.log; exit 1; }
 }
 
 OPTS="$EXTRA_OPTS $*"
@@ -28,7 +40,7 @@ fi
 if [ "$TESTSUITE" ]; then
     # 'distcheck' will reconfigure with required options.
     # Now we only need to prepare the Makefile without sparse-wrapped CC.
-    configure_ovs
+    configure_ovn
 
     export DISTCHECK_CONFIGURE_FLAGS="$OPTS"
     if ! make distcheck -j4 TESTSUITEFLAGS="-j4 -k ovn" RECHECK=yes; then
@@ -37,7 +49,7 @@ if [ "$TESTSUITE" ]; then
         exit 1
     fi
 else
-    configure_ovs $OPTS
+    configure_ovn $OPTS
     make selinux-policy
 
     make -j4
diff --git a/Documentation/intro/install/general.rst b/Documentation/intro/install/general.rst
index 99d8fec04..dc1a347de 100644
--- a/Documentation/intro/install/general.rst
+++ b/Documentation/intro/install/general.rst
@@ -42,9 +42,8 @@ out.  This is the right branch for general development.
 
 As of now there are no official OVN releases.
 
-Although building OVN, also builds OVS, it is recommended to clone
-and build OVS from its own repo. Please see the Open vSwitch
-documentation to build and install OVS.
+Before building OVN you should configure and build OVS.
+Please see the Open vSwitch documentation to build and install OVS.
 
 .. _general-build-reqs:
 
@@ -143,16 +142,24 @@ the "configure" script::
 
     $ ./boot.sh
 
+Before configuring OVN, clone, configure and build Open vSwitch.
+
 .. _general-configuring:
 
 Configuring
 -----------
 
-Configure the package by running the configure script. You can usually
-invoke configure without any arguments. For example::
+Configure the package by running the configure script. You need to
+invoke configure with atleast the argument --with-ovs-source.
+For example::
+
+    $ ./configure --with-ovs-source=/path/to/ovs/source
 
-    $ ./configure
+If you have built Open vSwitch in a separate directory, then you
+need to provide that path in the option - --with-ovs-build.
 
+As of now, OVN uses all the run time directory of Open vSwitch. This
+will be changed to ``ovn`` specific directories.
 By default all files are installed under ``/usr/local``. OVN and Open vSwitch
 also expects to find its database in ``/usr/local/etc/openvswitch`` by default.
 If you want to install all files into, e.g., ``/usr`` and ``/var`` instead of
@@ -272,6 +279,19 @@ you wish to link with jemalloc add it to LIBS::
 
     $ ./configure LIBS=-ljemalloc
 
+Example usage::
+    $ # Clone OVS repo
+    $cd /home/foo/ovs
+    $./boot.sh
+    $mkdir _gcc
+    $cd _gcc && ../configure && cd ..
+    $make -C _gcc
+
+    $ # Clone OVN repo
+    $cd /home/foo/ovn
+    $./boot.sh
+    $./configure --with-ovs-source=/home/foo/ovs/ --with-ovs-build=/home/foo/ovs/_gcc
+
 .. _general-building:
 
 Building
diff --git a/Makefile.am b/Makefile.am
index 16d4d02e4..26ff83f92 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -7,7 +7,7 @@
 
 AUTOMAKE_OPTIONS = foreign subdir-objects
 ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = ovs
+#SUBDIRS = ovs
 
 OVS_SRCDIR=@ovs_srcdir@
 OVS_BUILDDIR=@ovs_builddir@
@@ -22,9 +22,9 @@ AM_LDFLAGS += $(OVS_LDFLAGS)
 AM_CPPFLAGS += -I $(top_srcdir)/include
 
 if WIN32
-AM_CPPFLAGS += -I $(top_srcdir)/ovs/include
-AM_CPPFLAGS += -I $(top_srcdir)/ovs/lib
-AM_CPPFLAGS += -I $(top_srcdir)/ovs
+AM_CPPFLAGS += -I $(OVS_SRCDIR)/include
+AM_CPPFLAGS += -I $(OVS_SRCDIR)/lib
+AM_CPPFLAGS += -I $(OVS_SRCDIR)
 AM_CPPFLAGS += -I $(top_srcdir)/lib
 AM_CPPFLAGS += $(PTHREAD_INCLUDES)
 AM_CPPFLAGS += $(MSVC_CFLAGS)
@@ -33,6 +33,10 @@ AM_LDFLAGS += $(MSVC64_LDFLAGS)
 PLATFORM = $(MSVC_PLATFORM)
 endif
 
+AM_CPPFLAGS += -I $(top_srcdir)/include
+AM_CPPFLAGS += -I $(top_srcdir)/ovn
+AM_CPPFLAGS += -I $(top_builddir)/include
+
 AM_CPPFLAGS += -I $(OVS_SRCDIR)/include
 AM_CPPFLAGS += -I $(OVS_BUILDDIR)/include
 AM_CPPFLAGS += -I $(OVS_SRCDIR)/lib
@@ -113,8 +117,7 @@ EXTRA_DIST = \
 	ovn-nb.ovsschema \
 	ovn-nb.xml \
 	ovn-sb.ovsschema \
-	ovn-sb.xml \
-	ovs/
+	ovn-sb.xml
 bin_PROGRAMS =
 sbin_PROGRAMS =
 bin_SCRIPTS =
@@ -220,13 +223,6 @@ CLEAN_LOCAL += clean-pycov
 ALL_LOCAL += dist-hook-git
 dist-hook-git: distfiles
 	@if test -e $(srcdir)/.git && (git --version) >/dev/null 2>&1; then \
-	  (cd ovs && $(MAKE) distfiles); \
-	  (cat distfiles; sed 's|^|ovs/|' ovs/distfiles) | \
-	    LC_ALL=C sort -u > ovs-distfiles; \
-	  (cd ovs/datapath && $(MAKE) distfiles); \
-	  (cat distfiles; sed 's|^|ovs/datapath/|' ovs/datapath/distfiles) | \
-	    LC_ALL=C sort -u > datapath-distfiles; \
-		LC_ALL=C sort -u ovs-distfiles datapath-distfiles > all-distfiles; \
 	  (cd $(srcdir) && git ls-files) | grep -v '\.gitignore$$' | \
 	    grep -v '\.gitattributes$$' | \
 	    LC_ALL=C sort -u > all-gitfiles; \
@@ -242,7 +238,7 @@ dist-hook-git: distfiles
 	    exit 1; \
 	  fi \
 	fi
-CLEANFILES += ovs-distfiles datapath-distfiles all-distfiles all-gitfiles missing-distfiles
+CLEANFILES += all-distfiles all-gitfiles missing-distfiles
 # The following is based on commands for the Automake "distdir" target.
 distfiles: Makefile
 	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
diff --git a/acinclude.m4 b/acinclude.m4
index 7604c92b8..b0211ed35 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -1206,3 +1206,38 @@ AC_DEFUN([OVS_CHECK_LINUX_HOST],
         [ovs_cv_linux=true],
         [ovs_cv_linux=false])])
    AM_CONDITIONAL([LINUX], [$ovs_cv_linux])])
+
+dnl OVN_CHECK_OVS
+dnl
+dnl Check for OVS sources
+AC_DEFUN([OVN_CHECK_OVS], [
+  AC_ARG_WITH([ovs-source],
+              [AC_HELP_STRING([--ovs-source=/path/to/ovs/src/dir],
+                              [Specify the OVS src directory])])
+  AC_ARG_WITH([ovs-build],
+              [AC_HELP_STRING([--ovs-build=/path/to/ovs/build/dir],
+                              [Specify the OVS build directory])])
+
+  AC_MSG_CHECKING([for OVS source directory])
+  if test X"$with_ovs_source" != X; then
+    OVSDIR=$with_ovs_source
+  else
+    AC_ERROR([OVS source dir path needs to be specified])
+  fi
+
+  OVSDIR=`eval echo "$OVSDIR"`
+  AC_MSG_RESULT([$OVSDIR])
+  AC_SUBST(OVSDIR)
+
+  AC_MSG_CHECKING([for OVS build directory])
+  if test X"$with_ovs_build" != X; then
+    OVSBUILDDIR=$with_ovs_build
+  else
+    # If separate build dir is not specified, use src dir.
+    OVSBUILDDIR=$OVSDIR
+  fi
+
+  OVSBUILDDIR=`eval echo "$OVSBUILDDIR"`
+  AC_MSG_RESULT([$OVSBUILDDIR])
+  AC_SUBST(OVSBUILDDIR)
+])
diff --git a/configure.ac b/configure.ac
index 180bbcd7c..83aca3f02 100644
--- a/configure.ac
+++ b/configure.ac
@@ -20,7 +20,7 @@ AC_CONFIG_HEADERS([config.h])
 AC_CONFIG_TESTDIR([tests])
 AM_INIT_AUTOMAKE([tar-pax])
 
-AC_CONFIG_SUBDIRS([ovs])
+#AC_CONFIG_SUBDIRS([ovs])
 
 AC_PROG_CC_C99
 AM_PROG_CC_C_O
@@ -64,23 +64,17 @@ m4_pattern_forbid([LT_INIT]) dnl Make autoconf fail if libtool is missing.
 #    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],    [0])
-m4_define([libopenvswitch_lt_revision],   [0])
-m4_define([libopenvswitch_lt_age],        [0])
+m4_define([libovn_lt_current],    [0])
+m4_define([libovn_lt_revision],   [0])
+m4_define([libovn_lt_age],        [0])
 
-LT_CURRENT=libopenvswitch_lt_current
+LT_CURRENT=libovn_lt_current
 AC_SUBST([LT_CURRENT])
-LT_REVISION=libopenvswitch_lt_revision
+LT_REVISION=libovn_lt_revision
 AC_SUBST([LT_REVISION])
-LT_AGE=libopenvswitch_lt_age
+LT_AGE=libovn_lt_age
 AC_SUBST([LT_AGE])
 
-AC_SUBST([ovs_srcdir], ['${top_srcdir}/ovs'])
-AC_SUBST([ovs_builddir], ['${top_builddir}/ovs'])
-AC_SUBST([ovs_libdir], ['${top_builddir}/ovs/lib'])
-AC_SUBST([ovsdb_libdir], ['${top_builddir}/ovs/ovsdb'])
-AC_SUBST([ovs_mandir], ['${top_srcdir}/ovs/'])
-
 AC_SEARCH_LIBS([pow], [m])
 AC_SEARCH_LIBS([clock_gettime], [rt])
 AC_SEARCH_LIBS([timer_create], [rt])
@@ -187,12 +181,19 @@ OVS_CHECK_LINUX
 OVS_CHECK_LINUX_TC
 OVS_CHECK_DPDK
 OVS_CHECK_PRAGMA_MESSAGE
+OVN_CHECK_OVS
 AC_SUBST([OVS_CFLAGS])
 AC_SUBST([OVS_LDFLAGS])
 
+AC_SUBST([ovs_srcdir], ['${OVSDIR}'])
+AC_SUBST([ovs_builddir], ['${OVSBUILDDIR}'])
+AC_SUBST([ovs_libdir], ['${OVSBUILDDIR}/lib'])
+AC_SUBST([ovsdb_libdir], ['${OVSBUILDDIR}/ovsdb'])
+AC_SUBST([ovs_mandir], ['${OVSDIR}'])
+
 AC_CONFIG_FILES(Makefile)
 AC_CONFIG_FILES(tests/atlocal)
-AC_CONFIG_FILES(ovs/include/openvswitch/version.h)
+AC_CONFIG_FILES(include/ovn/version.h)
 
 dnl This makes sure that include/openflow gets created in the build directory.
 AC_CONFIG_COMMANDS([include/openflow/openflow.h.stamp])
diff --git a/controller-vtep/automake.mk b/controller-vtep/automake.mk
index a6810969f..a5779eba6 100644
--- a/controller-vtep/automake.mk
+++ b/controller-vtep/automake.mk
@@ -8,7 +8,7 @@ controller_vtep_ovn_controller_vtep_SOURCES = \
 	controller-vtep/ovn-controller-vtep.h \
 	controller-vtep/vtep.c \
 	controller-vtep/vtep.h
-controller_vtep_ovn_controller_vtep_LDADD = lib/libovn.la $(OVS_LIBDIR)/libopenvswitch.la ovs/vtep/libvtep.la
+controller_vtep_ovn_controller_vtep_LDADD = lib/libovn.la $(OVS_LIBDIR)/libopenvswitch.la $(OVSBUILDDIR)/vtep/libvtep.la
 man_MANS += controller-vtep/ovn-controller-vtep.8
 EXTRA_DIST += controller-vtep/ovn-controller-vtep.8.xml
 CLEANFILES += controller-vtep/ovn-controller-vtep.8
diff --git a/include/ovn/version.h.in b/include/ovn/version.h.in
new file mode 100644
index 000000000..e27415ba1
--- /dev/null
+++ b/include/ovn/version.h.in
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2014 Nicira, Inc.
+ * Copyright (c) 2014 Cisco Systems, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef OVN_VERSION_H
+#define OVN_VERSION_H 1
+
+#define OVN_PACKAGE_STRING  "@PACKAGE_STRING@"
+#define OVN_PACKAGE_VERSION "@PACKAGE_VERSION@"
+
+#define OVN_LIB_VERSION     @LT_CURRENT@
+#define OVN_LIB_REVISION    @LT_REVISION@
+#define OVN_LIB_AGE         @LT_AGE@
+
+#endif /* ovn/version.h */
diff --git a/lib/ovsdb_automake.mk b/lib/ovsdb_automake.mk
index f6fd5e8b3..73f236d1e 100644
--- a/lib/ovsdb_automake.mk
+++ b/lib/ovsdb_automake.mk
@@ -1,10 +1,10 @@
 # ovsdb-idlc
-noinst_SCRIPTS += ovs/ovsdb/ovsdb-idlc
-EXTRA_DIST += ovs/ovsdb/ovsdb-idlc.in
-MAN_ROOTS += ovs/ovsdb/ovsdb-idlc.1
-CLEANFILES += ovs/ovsdb/ovsdb-idlc
+noinst_SCRIPTS += ${OVSDIR}/ovsdb/ovsdb-idlc
+EXTRA_DIST += ${OVSDIR}/ovsdb/ovsdb-idlc.in
+MAN_ROOTS += ${OVSDIR}/ovsdb/ovsdb-idlc.1
+CLEANFILES += ${OVSDIR}/ovsdb/ovsdb-idlc
 SUFFIXES += .ovsidl .ovsschema
-OVSDB_IDLC = $(run_python) $(srcdir)/ovs/ovsdb/ovsdb-idlc.in
+OVSDB_IDLC = $(run_python) ${OVSDIR}/ovsdb/ovsdb-idlc.in
 .ovsidl.c:
 	$(AM_V_GEN)$(OVSDB_IDLC) c-idl-source $< > $@.tmp && mv $@.tmp $@
 .ovsidl.h:
@@ -21,5 +21,5 @@ CLEANFILES += $(OVSIDL_BUILT)
 # However, current versions of Automake seem to output all variable
 # assignments before any targets, so it doesn't seem to be a problem,
 # at least for now.
-$(OVSIDL_BUILT): ovs/ovsdb/ovsdb-idlc.in
+$(OVSIDL_BUILT): ${OVSDIR}/ovsdb/ovsdb-idlc.in
 
diff --git a/tests/automake.mk b/tests/automake.mk
index 5411772a4..255964fb7 100644
--- a/tests/automake.mk
+++ b/tests/automake.mk
@@ -51,7 +51,7 @@ SYSTEM_KMOD_TESTSUITE = $(srcdir)/tests/system-kmod-testsuite
 SYSTEM_USERSPACE_TESTSUITE = $(srcdir)/tests/system-userspace-testsuite
 DISTCLEANFILES += tests/atconfig tests/atlocal
 
-AUTOTEST_PATH = ovs/utilities:ovs/vswitchd:ovs/ovsdb:ovs/vtep:tests:$(PTHREAD_WIN32_DIR_DLL):$(SSL_DIR):controller-vtep:northd:utilities:controller
+AUTOTEST_PATH = $(ovs_builddir)/utilities:$(ovs_builddir)/vswitchd:$(ovs_builddir)/ovsdb:$(ovs_builddir)/vtep:tests:$(PTHREAD_WIN32_DIR_DLL):$(SSL_DIR):controller-vtep:northd:utilities:controller
 
 check-local:
 	set $(SHELL) '$(TESTSUITE)' -C tests AUTOTEST_PATH=$(AUTOTEST_PATH); \
-- 
2.21.0



More information about the dev mailing list