classifier: Use array for subtables instead of a list.
[sliver-openvswitch.git] / utilities / ovs-dev.py
index d33b2ba..f73899b 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/python
-# Copyright (c) 2013 Nicira, Inc.
+# Copyright (c) 2013, 2014 Nicira, Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -24,9 +24,11 @@ ENV = os.environ
 HOME = ENV["HOME"]
 OVS_SRC = HOME + "/ovs"
 ROOT = HOME + "/root"
-PATH = "%(ovs)s/utilities:%(ovs)s/ovsdb:%(ovs)s/vswitchd" % {"ovs": OVS_SRC}
+BUILD_GCC = OVS_SRC + "/_build-gcc"
+BUILD_CLANG = OVS_SRC + "/_build-clang"
+PATH = "%(ovs)s/utilities:%(ovs)s/ovsdb:%(ovs)s/vswitchd" % {"ovs": BUILD_GCC}
 
-ENV["CFLAGS"] = "-g -O0"
+ENV["CFLAGS"] = "-g -fno-omit-frame-pointer"
 ENV["PATH"] = PATH + ":" + ENV["PATH"]
 
 options = None
@@ -52,13 +54,15 @@ def uname():
 
 def conf():
     tag()
-    if options.clang:
-        ENV["CC"] = "clang"
 
-    configure = ["./configure", "--prefix=" + ROOT, "--localstatedir=" + ROOT,
+    try:
+        os.remove(OVS_SRC + "/Makefile")
+    except OSError:
+        pass
+
+    configure = ["../configure", "--prefix=" + ROOT, "--localstatedir=" + ROOT,
                  "--with-logdir=%s/log" % ROOT, "--with-rundir=%s/run" % ROOT,
-                 "--with-linux=/lib/modules/%s/build" % uname(),
-                 "--with-dbdir=" + ROOT]
+                 "--enable-silent-rules", "--with-dbdir=" + ROOT, "--silent"]
 
     if options.werror:
         configure.append("--enable-Werror")
@@ -69,22 +73,64 @@ def conf():
     if options.mandir:
         configure.append("--mandir=" + options.mandir)
 
+    if options.optimize is None:
+        options.optimize = 0
+    ENV["CFLAGS"] = "%s -O%d" % (ENV["CFLAGS"], options.optimize)
+
     _sh("./boot.sh")
-    _sh(*configure)
+
+    try:
+        os.mkdir(BUILD_GCC)
+    except OSError:
+        pass # Directory exists.
+
+    os.chdir(BUILD_GCC)
+    _sh(*(configure + ["--with-linux=/lib/modules/%s/build" % uname()]))
+
+    try:
+        _sh("clang --version", check=True)
+        clang = True
+    except subprocess.CalledProcessError:
+        clang = False
+
+    try:
+        _sh("sparse --version", check=True)
+        sparse = True
+    except subprocess.CalledProcessError:
+        sparse = False
+
+    if clang:
+        try:
+            os.mkdir(BUILD_CLANG)
+        except OSError:
+            pass # Directory exists.
+
+        ENV["CC"] = "clang"
+        os.chdir(BUILD_CLANG)
+        _sh(*configure)
+
+    if sparse:
+        c1 = "C=1"
+    else:
+        c1 = ""
+
+    os.chdir(OVS_SRC)
+
+    make_str = "\t$(MAKE) -C %s $@\n"
+
+    mf = open(OVS_SRC + "/Makefile", "w")
+    mf.write("all:\n%:\n")
+    if clang:
+        mf.write(make_str % BUILD_CLANG)
+    mf.write("\t$(MAKE) -C %s %s $@\n" % (BUILD_GCC, c1))
+    mf.write("\ncheck:\n")
+    mf.write(make_str % BUILD_GCC)
+    mf.close()
 commands.append(conf)
 
 
 def make(args=""):
     make = "make -s -j 8 " + args
-    try:
-        _sh("cgcc", "--version", capture=True)
-        # XXX: For some reason the clang build doesn't place nicely with
-        # sparse.  At some point this needs to be figured out and this check
-        # removed.
-        if not options.clang:
-            make += " C=1"
-    except OSError:
-        pass
     _sh(make)
 commands.append(make)
 
@@ -169,11 +215,11 @@ def run():
     _sh("ovs-vsctl --no-wait set Open_vSwitch %s ovs_version=%s"
         % (root_uuid, version))
 
-    cmd = [OVS_SRC + "/vswitchd/ovs-vswitchd"]
+    cmd = [BUILD_GCC + "/vswitchd/ovs-vswitchd"]
     if options.gdb:
         cmd = ["gdb", "--args"] + cmd
     elif options.valgrind:
-        cmd = ["valgrind", "--track-origins=yes",
+        cmd = ["valgrind", "--track-origins=yes", "--leak-check=full",
                "--suppressions=%s/tests/glibc.supp" % OVS_SRC,
                "--suppressions=%s/tests/openssl.supp" % OVS_SRC] + cmd
     else:
@@ -229,7 +275,7 @@ Basic Configuration:
             libssl-dev gdb linux-headers-`uname -r`
 
     # Next clone the Open vSwitch source.
-    git clone git://git.openvswitch.org/openvswitch %(ovs)s
+    git clone https://github.com/openvswitch/ovs.git %(ovs)s
 
     # Setup environment variables.
     `%(v)s env`
@@ -277,6 +323,10 @@ def main():
                      action="store_true", help="configure with cached timing")
     group.add_option("--mandir", dest="mandir", metavar="MANDIR",
                      help="configure the man documentation install directory")
+
+    for i in range(4):
+        group.add_option("--O%d" % i, dest="optimize", action="store_const",
+                         const=i, help="compile with -O%d" % i)
     parser.add_option_group(group)
 
     group = optparse.OptionGroup(parser, "run")
@@ -284,8 +334,6 @@ def main():
                      help="run ovs-vswitchd under gdb")
     group.add_option("--valgrind", dest="valgrind", action="store_true",
                      help="run ovs-vswitchd under valgrind")
-    group.add_option("--clang", dest="clang", action="store_true",
-                     help="build ovs-vswitchd with clang")
     parser.add_option_group(group)
 
     options, args = parser.parse_args()