2 # Copyright (c) 2013, 2014 Nicira, Inc.
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at:
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
25 OVS_SRC = HOME + "/ovs"
27 BUILD_GCC = OVS_SRC + "/_build-gcc"
28 BUILD_CLANG = OVS_SRC + "/_build-clang"
29 PATH = "%(ovs)s/utilities:%(ovs)s/ovsdb:%(ovs)s/vswitchd" % {"ovs": BUILD_GCC}
31 ENV["PATH"] = PATH + ":" + ENV["PATH"]
38 def _sh(*args, **kwargs):
39 print "------> " + " ".join(args)
40 shell = len(args) == 1
41 if kwargs.get("capture", False):
42 proc = subprocess.Popen(args, stdout=subprocess.PIPE, shell=shell)
43 return proc.stdout.readlines()
44 elif kwargs.get("check", True):
45 subprocess.check_call(args, shell=shell)
47 subprocess.call(args, shell=shell)
51 return _sh("uname", "-r", capture=True)[0].strip()
58 os.remove(OVS_SRC + "/Makefile")
62 configure = ["../configure", "--prefix=" + ROOT, "--localstatedir=" + ROOT,
63 "--with-logdir=%s/log" % ROOT, "--with-rundir=%s/run" % ROOT,
64 "--enable-silent-rules", "--with-dbdir=" + ROOT, "--silent"]
66 cflags = "-g -fno-omit-frame-pointer"
69 configure.append("--enable-Werror")
71 if options.cache_time:
72 configure.append("--enable-cache-time")
75 configure.append("--mandir=" + options.mandir)
78 configure.append("--with-dpdk=" + options.with_dpdk)
79 cflags += " -Wno-cast-align -Wno-bad-function-cast" # DPDK warnings.
81 if options.optimize is None:
84 cflags += " -O%d" % options.optimize
86 ENV["CFLAGS"] = cflags
93 pass # Directory exists.
96 _sh(*(configure + ["--with-linux=/lib/modules/%s/build" % uname()]))
99 _sh("clang --version", check=True)
101 except subprocess.CalledProcessError:
105 _sh("sparse --version", check=True)
107 except subprocess.CalledProcessError:
112 os.mkdir(BUILD_CLANG)
114 pass # Directory exists.
117 os.chdir(BUILD_CLANG)
127 make_str = "\t$(MAKE) -C %s $@\n"
129 mf = open(OVS_SRC + "/Makefile", "w")
130 mf.write("all:\n%:\n")
132 mf.write(make_str % BUILD_CLANG)
133 mf.write("\t$(MAKE) -C %s %s $@\n" % (BUILD_GCC, c1))
134 mf.write("\ncheck-valgrind:\n")
135 mf.write("\ncheck:\n")
136 mf.write(make_str % BUILD_GCC)
138 commands.append(conf)
142 make = "make -s -j 8 " + args
144 commands.append(make)
150 flags += "-j%d " % options.jobs
154 for arg in str.split(options.tests):
158 flags += "-k %s " % arg
159 ENV["TESTSUITEFLAGS"] = flags
161 commands.append(check)
165 ctags = ['ctags', '-R', '-f', '.tags']
168 _sh(*(ctags + ['--exclude="datapath/"']))
171 _sh(*ctags) # Some versions of ctags don't have --exclude
176 _sh('cscope', '-R', '-b')
183 for proc in ["ovs-vswitchd", "ovsdb-server"]:
184 if os.path.exists("%s/run/openvswitch/%s.pid" % (ROOT, proc)):
185 _sh("ovs-appctl", "-t", proc, "exit", check=False)
187 _sh("sudo", "killall", "-q", "-2", proc, check=False)
188 commands.append(kill)
193 if os.path.exists(ROOT):
195 for dp in _sh("ovs-dpctl dump-dps", capture=True):
196 _sh("ovs-dpctl", "del-dp", dp.strip())
197 commands.append(reset)
202 for d in ["log", "run"]:
203 d = "%s/%s" % (ROOT, d)
204 shutil.rmtree(d, ignore_errors=True)
207 pki_dir = ROOT + "/pki"
208 if not os.path.exists(pki_dir):
212 _sh("ovs-pki req+sign ovsclient")
215 if not os.path.exists(ROOT + "/conf.db"):
216 _sh("ovsdb-tool", "create", ROOT + "/conf.db",
217 OVS_SRC + "/vswitchd/vswitch.ovsschema")
219 opts = ["--pidfile", "--log-file"]
221 _sh(*(["ovsdb-server",
222 "--remote=punix:%s/run/db.sock" % ROOT,
223 "--remote=db:Open_vSwitch,Open_vSwitch,manager_options",
224 "--private-key=db:Open_vSwitch,SSL,private_key",
225 "--certificate=db:Open_vSwitch,SSL,certificate",
226 "--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert",
227 "--detach", "-vconsole:off"] + opts))
229 _sh("ovs-vsctl --no-wait --bootstrap set-ssl %s/ovsclient-privkey.pem" \
230 " %s/ovsclient-cert.pem %s/vswitchd.cacert"
231 % (pki_dir, pki_dir, pki_dir))
232 version = _sh("ovs-vsctl --no-wait --version", capture=True)
233 version = version[0].strip().split()[3]
234 root_uuid = _sh("ovs-vsctl --no-wait --bare list Open_vSwitch",
235 capture=True)[0].strip()
236 _sh("ovs-vsctl --no-wait set Open_vSwitch %s ovs_version=%s"
237 % (root_uuid, version))
239 cmd = [BUILD_GCC + "/vswitchd/ovs-vswitchd"]
243 cmd.extend(options.dpdk)
247 cmd = ["gdb", "--args"] + cmd
248 elif options.valgrind:
249 cmd = ["valgrind", "--track-origins=yes", "--leak-check=full",
250 "--suppressions=%s/tests/glibc.supp" % OVS_SRC,
251 "--suppressions=%s/tests/openssl.supp" % OVS_SRC] + cmd
254 opts = opts + ["-vconsole:off", "--detach", "--enable-dummy"]
260 if not os.path.exists("/lib/modules"):
261 print "Missing modules directory. Is this a Linux system?"
265 _sh("rmmod", "openvswitch")
266 except subprocess.CalledProcessError, e:
267 pass # Module isn't loaded
270 _sh("rm /lib/modules/%s/extra/openvswitch.ko" % uname())
271 except subprocess.CalledProcessError, e:
272 pass # Module isn't installed
276 make("modules_install")
278 _sh("modprobe", "openvswitch")
279 _sh("dmesg | grep openvswitch | tail -1")
280 commands.append(modinst)
284 print "export PATH=" + ENV["PATH"]
292 This program is designed to help developers build and run Open vSwitch without
293 necessarily needing to know the gory details. Given some basic requirements
294 (described below), it can be used to build and run Open vSwitch, keeping
295 runtime files in the user's home directory.
298 # This section can be run as a script on ubuntu systems.
300 # First install the basic requirements needed to build Open vSwitch.
301 sudo apt-get install git build-essential libtool autoconf pkg-config \\
302 libssl-dev gdb linux-headers-`uname -r`
304 # Next clone the Open vSwitch source.
305 git clone https://github.com/openvswitch/ovs.git %(ovs)s
307 # Setup environment variables.
313 # Install the kernel module
314 sudo insmod %(ovs)s/datapath/linux/openvswitch.ko
320 conf - Configure the ovs source.
321 make - Build the source (must have been configured).
322 check - Run the unit tests.
323 tag - Run ctags and cscope over the source.
324 kill - Kill all running instances of ovs.
325 reset - Reset any runtime configuration in %(run)s.
327 modinst - Build ovs and install the kernel module.
328 env - Print the required path environment variable.
329 doc - Print this message.
330 """ % {"ovs": OVS_SRC, "v": sys.argv[0], "run": ROOT}
334 def parse_subargs(option, opt_str, value, parser):
338 dpdkarg = parser.rargs.pop(0)
341 subopts.append(dpdkarg)
343 setattr(parser.values, option.dest, subopts)
349 description = "Open vSwitch developer configuration. Try `%prog doc`."
350 cmd_names = [c.__name__ for c in commands]
351 parser = optparse.OptionParser(usage="usage: %prog"
352 + " [options] [%s] ..."
353 % "|".join(cmd_names),
354 description=description)
356 group = optparse.OptionGroup(parser, "conf")
357 group.add_option("--disable-Werror", dest="werror", action="store_false",
358 default=True, help="compile without the Werror flag")
359 group.add_option("--cache-time", dest="cache_time",
360 action="store_true", help="configure with cached timing")
361 group.add_option("--mandir", dest="mandir", metavar="MANDIR",
362 help="configure the man documentation install directory")
363 group.add_option("--with-dpdk", dest="with_dpdk", metavar="DPDK_BUILD",
364 help="built with dpdk libraries located at DPDK_BUILD");
367 group.add_option("--O%d" % i, dest="optimize", action="store_const",
368 const=i, help="compile with -O%d" % i)
369 parser.add_option_group(group)
371 group = optparse.OptionGroup(parser, "check")
372 group.add_option("-j", "--jobs", dest="jobs", metavar="N", type="int",
373 help="Run N tests in parallel")
374 group.add_option("--tests", dest="tests", metavar="FILTER",
375 help="""run specific tests and/or a test category
376 eg, --tests=\"1-10 megaflow\"""")
377 parser.add_option_group(group)
379 group = optparse.OptionGroup(parser, "run")
380 group.add_option("-g", "--gdb", dest="gdb", action="store_true",
381 help="run ovs-vswitchd under gdb")
382 group.add_option("--valgrind", dest="valgrind", action="store_true",
383 help="run ovs-vswitchd under valgrind")
384 group.add_option("--dpdk", dest="dpdk", action="callback",
385 callback=parse_subargs,
386 help="run ovs-vswitchd with dpdk subopts (ended by --)")
387 parser.add_option_group(group)
389 options, args = parser.parse_args()
392 if arg not in cmd_names:
393 print "Unknown argument " + arg
399 print "Missing %s." % OVS_SRC
404 if arg == cmd.__name__:
408 if __name__ == '__main__':