2 # Copyright (c) 2013 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 PATH = "%(ovs)s/utilities:%(ovs)s/ovsdb:%(ovs)s/vswitchd" % {"ovs": OVS_SRC}
29 ENV["CFLAGS"] = "-g -O0"
30 ENV["PATH"] = PATH + ":" + ENV["PATH"]
37 def _sh(*args, **kwargs):
38 print "------> " + " ".join(args)
39 shell = len(args) == 1
40 if kwargs.get("capture", False):
41 proc = subprocess.Popen(args, stdout=subprocess.PIPE, shell=shell)
42 return proc.stdout.readlines()
43 elif kwargs.get("check", True):
44 subprocess.check_call(args, shell=shell)
46 subprocess.call(args, shell=shell)
50 return _sh("uname", "-r", capture=True)[0].strip()
58 configure = ["./configure", "--prefix=" + ROOT, "--localstatedir=" + ROOT,
59 "--with-logdir=%s/log" % ROOT, "--with-rundir=%s/run" % ROOT,
60 "--with-linux=/lib/modules/%s/build" % uname(),
61 "--with-dbdir=" + ROOT]
64 configure.append("--enable-Werror")
66 if options.cache_time:
67 configure.append("--enable-cache-time")
70 configure.append("--mandir=" + options.mandir)
78 make = "make -s -j 8 " + args
80 _sh("cgcc", "--version", capture=True)
81 # XXX: For some reason the clang build doesn't place nicely with
82 # sparse. At some point this needs to be figured out and this check
94 commands.append(check)
98 ctags = ['ctags', '-R', '-f', '.tags']
101 _sh(*(ctags + ['--exclude="datapath/"']))
104 _sh(*ctags) # Some versions of ctags don't have --exclude
109 _sh('cscope', '-R', '-b')
116 for proc in ["ovs-vswitchd", "ovsdb-server"]:
117 if os.path.exists("%s/run/openvswitch/%s.pid" % (ROOT, proc)):
118 _sh("ovs-appctl", "-t", proc, "exit", check=False)
120 _sh("sudo", "killall", "-q", "-2", proc, check=False)
121 commands.append(kill)
126 if os.path.exists(ROOT):
128 for dp in _sh("ovs-dpctl dump-dps", capture=True):
129 _sh("ovs-dpctl", "del-dp", dp.strip())
130 commands.append(reset)
135 for d in ["log", "run"]:
136 d = "%s/%s" % (ROOT, d)
137 shutil.rmtree(d, ignore_errors=True)
140 pki_dir = ROOT + "/pki"
141 if not os.path.exists(pki_dir):
145 _sh("ovs-pki req+sign ovsclient")
148 if not os.path.exists(ROOT + "/conf.db"):
149 _sh("ovsdb-tool", "create", ROOT + "/conf.db",
150 OVS_SRC + "/vswitchd/vswitch.ovsschema")
152 opts = ["--pidfile", "--log-file", "--enable-dummy"]
154 _sh(*(["ovsdb-server",
155 "--remote=punix:%s/run/db.sock" % ROOT,
156 "--remote=db:Open_vSwitch,Open_vSwitch,manager_options",
157 "--private-key=db:Open_vSwitch,SSL,private_key",
158 "--certificate=db:Open_vSwitch,SSL,certificate",
159 "--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert",
160 "--detach", "-vconsole:off"] + opts))
162 _sh("ovs-vsctl --no-wait --bootstrap set-ssl %s/ovsclient-privkey.pem" \
163 " %s/ovsclient-cert.pem %s/vswitchd.cacert"
164 % (pki_dir, pki_dir, pki_dir))
165 version = _sh("ovs-vsctl --no-wait --version", capture=True)
166 version = version[0].strip().split()[3]
167 root_uuid = _sh("ovs-vsctl --no-wait --bare list Open_vSwitch",
168 capture=True)[0].strip()
169 _sh("ovs-vsctl --no-wait set Open_vSwitch %s ovs_version=%s"
170 % (root_uuid, version))
172 cmd = [OVS_SRC + "/vswitchd/ovs-vswitchd"]
174 cmd = ["gdb", "--args"] + cmd
175 elif options.valgrind:
176 cmd = ["valgrind", "--track-origins=yes",
177 "--suppressions=%s/tests/glibc.supp" % OVS_SRC,
178 "--suppressions=%s/tests/openssl.supp" % OVS_SRC] + cmd
181 opts = opts + ["-vconsole:off", "--detach"]
187 if not os.path.exists("/lib/modules"):
188 print "Missing modules directory. Is this a Linux system?"
192 _sh("rmmod", "openvswitch")
193 except subprocess.CalledProcessError, e:
194 pass # Module isn't loaded
197 _sh("rm /lib/modules/%s/extra/openvswitch.ko" % uname())
198 except subprocess.CalledProcessError, e:
199 pass # Module isn't installed
203 make("modules_install")
205 _sh("modprobe", "openvswitch")
206 _sh("dmesg | grep openvswitch | tail -1")
207 commands.append(modinst)
211 print "export PATH=" + ENV["PATH"]
219 This program is designed to help developers build and run Open vSwitch without
220 necessarily needing to know the gory details. Given some basic requirements
221 (described below), it can be used to build and run Open vSwitch, keeping
222 runtime files in the user's home directory.
225 # This section can be run as a script on ubuntu systems.
227 # First install the basic requirements needed to build Open vSwitch.
228 sudo apt-get install git build-essential libtool autoconf pkg-config \\
229 libssl-dev pkg-config gdb linux-headers-`uname -r`
231 # Next clone the Open vSwitch source.
232 git clone git://git.openvswitch.org/openvswitch %(ovs)s
234 # Setup environment variables.
240 # Install the kernel module
241 sudo insmod %(ovs)s/datapath/linux/openvswitch.ko
247 conf - Configure the ovs source.
248 make - Build the source (must have been configured).
249 check - Run the unit tests.
250 tag - Run ctags and cscope over the source.
251 kill - Kill all running instances of ovs.
252 reset - Reset any runtime configuration in %(run)s.
254 modinst - Build ovs and install the kernel module.
255 env - Print the required path environment variable.
256 doc - Print this message.
257 """ % {"ovs": OVS_SRC, "v": sys.argv[0], "run": ROOT}
266 description = "Open vSwitch developer configuration. Try `%prog doc`."
267 cmd_names = [c.__name__ for c in commands]
268 parser = optparse.OptionParser(usage="usage: %prog"
269 + " [options] [%s] ..."
270 % "|".join(cmd_names),
271 description=description)
273 group = optparse.OptionGroup(parser, "conf")
274 group.add_option("--disable-Werror", dest="werror", action="store_false",
275 default=True, help="compile without the Werror flag")
276 group.add_option("--cache-time", dest="cache_time",
277 action="store_true", help="configure with cached timing")
278 group.add_option("--mandir", dest="mandir", metavar="MANDIR",
279 help="configure the man documentation install directory")
280 parser.add_option_group(group)
282 group = optparse.OptionGroup(parser, "run")
283 group.add_option("-g", "--gdb", dest="gdb", action="store_true",
284 help="run ovs-vswitchd under gdb")
285 group.add_option("--valgrind", dest="valgrind", action="store_true",
286 help="run ovs-vswitchd under valgrind")
287 group.add_option("--clang", dest="clang", action="store_true",
288 help="build ovs-vswitchd with clang")
289 parser.add_option_group(group)
291 options, args = parser.parse_args()
294 if arg not in cmd_names:
295 print "Unknown argument " + arg
301 print "Missing %s." % OVS_SRC
306 if arg == cmd.__name__:
310 if __name__ == '__main__':